From 32e0e0c2effa14c4a4be9ebe82e28e61f8519e55 Mon Sep 17 00:00:00 2001 From: Kelson Hartle Date: Sun, 19 Jul 2020 19:34:04 -0600 Subject: [PATCH 1/2] Transfering Project to forked repo --- .../MyExperiences.xcodeproj/project.pbxproj | 523 + .../xcschemes/MyExperiences.xcscheme | 82 + .../MyExperiences/FirebaseConvertible.swift | 13 + .../MyExperiences/GoogleService-Info.plist | 36 + .../Helpers/UIImage+Scaling.swift | 39 + MyExperiences copy/MyExperiences/Info.plist | 81 + .../MyExperiences/LocationHelper.swift | 65 + .../MyExperiences/Models/Author.swift | 36 + .../MyExperiences/Models/Comment.swift | 64 + .../MyExperiences/Models/Post.swift | 105 + .../MyExperiences/PostController.swift | 176 + .../MyExperiences/Resources/AppDelegate.swift | 64 + .../Assets.xcassets/00000.imageset/00000.jpeg | Bin 0 -> 95661 bytes .../00000.imageset/Contents.json | 21 + .../AppIcon.appiconset/Contents.json | 98 + .../Resources/Assets.xcassets/Contents.json | 6 + .../Resources/SceneDelegate.swift | 53 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../StoryBoards/Base.lproj/Main.storyboard | 389 + .../MyExperiences/UIImage+Ratio.swift | 16 + .../User+DictionaryRepresentation.swift | 21 + .../CreateANewExperienceViewController.swift | 471 + .../ViewControllers/MapViewController.swift | 77 + .../RecordAudioViewController.swift | 219 + .../SignInViewController.swift | 76 + MyExperiences copy/Podfile | 16 + MyExperiences copy/Podfile.lock | 165 + MyExperiences copy/Pods/AppAuth/LICENSE | 202 + MyExperiences copy/Pods/AppAuth/README.md | 574 + .../Pods/AppAuth/Source/AppAuth.h | 92 + .../Source/AppAuth/iOS/OIDAuthState+IOS.h | 63 + .../Source/AppAuth/iOS/OIDAuthState+IOS.m | 58 + .../AppAuth/iOS/OIDAuthorizationService+IOS.h | 50 + .../AppAuth/iOS/OIDAuthorizationService+IOS.m | 48 + .../iOS/OIDExternalUserAgentCatalyst.h | 52 + .../iOS/OIDExternalUserAgentCatalyst.m | 145 + .../AppAuth/iOS/OIDExternalUserAgentIOS.h | 53 + .../AppAuth/iOS/OIDExternalUserAgentIOS.m | 256 + .../OIDExternalUserAgentIOSCustomBrowser.h | 113 + .../OIDExternalUserAgentIOSCustomBrowser.m | 171 + .../Pods/AppAuth/Source/AppAuthCore.h | 44 + .../AppAuth/Source/AppAuthCore/OIDAuthState.h | 272 + .../AppAuth/Source/AppAuthCore/OIDAuthState.m | 570 + .../AppAuthCore/OIDAuthStateChangeDelegate.h | 39 + .../AppAuthCore/OIDAuthStateErrorDelegate.h | 62 + .../AppAuthCore/OIDAuthorizationRequest.h | 250 + .../AppAuthCore/OIDAuthorizationRequest.m | 351 + .../AppAuthCore/OIDAuthorizationResponse.h | 128 + .../AppAuthCore/OIDAuthorizationResponse.m | 210 + .../AppAuthCore/OIDAuthorizationService.h | 170 + .../AppAuthCore/OIDAuthorizationService.m | 790 ++ .../AppAuthCore/OIDClientMetadataParameters.h | 51 + .../AppAuthCore/OIDClientMetadataParameters.m | 33 + .../AppAuth/Source/AppAuthCore/OIDDefines.h | 51 + .../Source/AppAuthCore/OIDEndSessionRequest.h | 107 + .../Source/AppAuthCore/OIDEndSessionRequest.m | 190 + .../AppAuthCore/OIDEndSessionResponse.h | 64 + .../AppAuthCore/OIDEndSessionResponse.m | 118 + .../AppAuth/Source/AppAuthCore/OIDError.h | 393 + .../AppAuth/Source/AppAuthCore/OIDError.m | 45 + .../Source/AppAuthCore/OIDErrorUtilities.h | 107 + .../Source/AppAuthCore/OIDErrorUtilities.m | 172 + .../Source/AppAuthCore/OIDExternalUserAgent.h | 53 + .../AppAuthCore/OIDExternalUserAgentRequest.h | 37 + .../AppAuthCore/OIDExternalUserAgentSession.h | 65 + .../Source/AppAuthCore/OIDFieldMapping.h | 126 + .../Source/AppAuthCore/OIDFieldMapping.m | 132 + .../Source/AppAuthCore/OIDGrantTypes.h | 40 + .../Source/AppAuthCore/OIDGrantTypes.m | 27 + .../AppAuth/Source/AppAuthCore/OIDIDToken.h | 91 + .../AppAuth/Source/AppAuthCore/OIDIDToken.m | 149 + .../AppAuthCore/OIDRegistrationRequest.h | 141 + .../AppAuthCore/OIDRegistrationRequest.m | 248 + .../AppAuthCore/OIDRegistrationResponse.h | 126 + .../AppAuthCore/OIDRegistrationResponse.m | 164 + .../Source/AppAuthCore/OIDResponseTypes.h | 31 + .../Source/AppAuthCore/OIDResponseTypes.m | 25 + .../Source/AppAuthCore/OIDScopeUtilities.h | 48 + .../Source/AppAuthCore/OIDScopeUtilities.m | 58 + .../AppAuth/Source/AppAuthCore/OIDScopes.h | 46 + .../AppAuth/Source/AppAuthCore/OIDScopes.m | 29 + .../AppAuthCore/OIDServiceConfiguration.h | 118 + .../AppAuthCore/OIDServiceConfiguration.m | 223 + .../Source/AppAuthCore/OIDServiceDiscovery.h | 358 + .../Source/AppAuthCore/OIDServiceDiscovery.m | 362 + .../Source/AppAuthCore/OIDTokenRequest.h | 162 + .../Source/AppAuthCore/OIDTokenRequest.m | 307 + .../Source/AppAuthCore/OIDTokenResponse.h | 110 + .../Source/AppAuthCore/OIDTokenResponse.m | 163 + .../Source/AppAuthCore/OIDTokenUtilities.h | 67 + .../Source/AppAuthCore/OIDTokenUtilities.m | 89 + .../Source/AppAuthCore/OIDURLQueryComponent.h | 93 + .../Source/AppAuthCore/OIDURLQueryComponent.m | 219 + .../AppAuthCore/OIDURLSessionProvider.h | 40 + .../AppAuthCore/OIDURLSessionProvider.m | 39 + .../Pods/Firebase/CoreOnly/Sources/Firebase.h | 172 + .../CoreOnly/Sources/module.modulemap | 4 + MyExperiences copy/Pods/Firebase/LICENSE | 202 + MyExperiences copy/Pods/Firebase/README.md | 311 + .../FIRAnalyticsConnector | Bin 0 -> 882528 bytes .../Modules/module.modulemap | 11 + .../FirebaseAnalytics | Bin 0 -> 808072 bytes .../Headers/FIRAnalytics+AppDelegate.h | 62 + .../Headers/FIRAnalytics.h | 136 + .../Headers/FIREventNames.h | 471 + .../Headers/FIRParameterNames.h | 670 ++ .../Headers/FIRUserPropertyNames.h | 29 + .../Headers/FirebaseAnalytics.h | 5 + .../Modules/module.modulemap | 12 + .../FirebaseAuth/FirebaseAuth/CHANGELOG.md | 253 + .../Pods/FirebaseAuth/FirebaseAuth/README.md | 17 + .../Sources/Auth/FIRActionCodeSettings.m | 45 + .../FirebaseAuth/Sources/Auth/FIRAuth.m | 2247 ++++ .../Sources/Auth/FIRAuthDataResult.m | 83 + .../Sources/Auth/FIRAuthDataResult_Internal.h | 46 + .../Sources/Auth/FIRAuthDispatcher.h | 63 + .../Sources/Auth/FIRAuthDispatcher.m | 46 + .../Sources/Auth/FIRAuthGlobalWorkQueue.h | 31 + .../Sources/Auth/FIRAuthGlobalWorkQueue.m | 30 + .../Sources/Auth/FIRAuthOperationType.h | 47 + .../Sources/Auth/FIRAuthSerialTaskQueue.h | 50 + .../Sources/Auth/FIRAuthSerialTaskQueue.m | 56 + .../Sources/Auth/FIRAuthSettings.m | 33 + .../Sources/Auth/FIRAuthTokenResult.m | 166 + .../Auth/FIRAuthTokenResult_Internal.h | 36 + .../Sources/Auth/FIRAuth_Internal.h | 147 + .../AuthProvider/Email/FIREmailAuthProvider.m | 41 + .../Email/FIREmailPasswordAuthCredential.h | 61 + .../Email/FIREmailPasswordAuthCredential.m | 92 + .../Sources/AuthProvider/FIRAuthCredential.m | 46 + .../AuthProvider/FIRAuthCredential_Internal.h | 41 + .../Sources/AuthProvider/FIRAuthProvider.m | 66 + .../Facebook/FIRFacebookAuthCredential.h | 36 + .../Facebook/FIRFacebookAuthCredential.m | 72 + .../Facebook/FIRFacebookAuthProvider.m | 40 + .../GameCenter/FIRGameCenterAuthCredential.h | 79 + .../GameCenter/FIRGameCenterAuthCredential.m | 92 + .../GameCenter/FIRGameCenterAuthProvider.m | 92 + .../GitHub/FIRGitHubAuthCredential.h | 41 + .../GitHub/FIRGitHubAuthCredential.m | 70 + .../GitHub/FIRGitHubAuthProvider.m | 40 + .../Google/FIRGoogleAuthCredential.h | 38 + .../Google/FIRGoogleAuthCredential.m | 77 + .../Google/FIRGoogleAuthProvider.m | 41 + .../AuthProvider/OAuth/FIROAuthCredential.m | 130 + .../OAuth/FIROAuthCredential_Internal.h | 78 + .../AuthProvider/OAuth/FIROAuthProvider.m | 400 + .../Phone/FIRPhoneAuthCredential.m | 107 + .../Phone/FIRPhoneAuthCredential_Internal.h | 73 + .../AuthProvider/Phone/FIRPhoneAuthProvider.m | 716 ++ .../Twitter/FIRTwitterAuthCredential.h | 48 + .../Twitter/FIRTwitterAuthCredential.m | 74 + .../Twitter/FIRTwitterAuthProvider.m | 40 + .../Backend/FIRAuthBackend+MultiFactor.h | 125 + .../Backend/FIRAuthBackend+MultiFactor.m | 96 + .../Sources/Backend/FIRAuthBackend.h | 620 ++ .../Sources/Backend/FIRAuthBackend.m | 1404 +++ .../Sources/Backend/FIRAuthRPCRequest.h | 57 + .../Sources/Backend/FIRAuthRPCResponse.h | 48 + .../Backend/FIRAuthRequestConfiguration.h | 52 + .../Backend/FIRAuthRequestConfiguration.m | 35 + .../Backend/FIRIdentityToolkitRequest.h | 71 + .../Backend/FIRIdentityToolkitRequest.m | 110 + .../Backend/RPC/FIRCreateAuthURIRequest.h | 88 + .../Backend/RPC/FIRCreateAuthURIRequest.m | 97 + .../Backend/RPC/FIRCreateAuthURIResponse.h | 61 + .../Backend/RPC/FIRCreateAuthURIResponse.m | 35 + .../Backend/RPC/FIRDeleteAccountRequest.h | 50 + .../Backend/RPC/FIRDeleteAccountRequest.m | 69 + .../Backend/RPC/FIRDeleteAccountResponse.h | 30 + .../Backend/RPC/FIRDeleteAccountResponse.m | 29 + .../Backend/RPC/FIREmailLinkSignInRequest.h | 66 + .../Backend/RPC/FIREmailLinkSignInRequest.m | 74 + .../Backend/RPC/FIREmailLinkSignInResponse.h | 54 + .../Backend/RPC/FIREmailLinkSignInResponse.m | 37 + .../Backend/RPC/FIRGetAccountInfoRequest.h | 53 + .../Backend/RPC/FIRGetAccountInfoRequest.m | 49 + .../Backend/RPC/FIRGetAccountInfoResponse.h | 158 + .../Backend/RPC/FIRGetAccountInfoResponse.m | 117 + .../RPC/FIRGetOOBConfirmationCodeRequest.h | 178 + .../RPC/FIRGetOOBConfirmationCodeRequest.m | 288 + .../RPC/FIRGetOOBConfirmationCodeResponse.h | 35 + .../RPC/FIRGetOOBConfirmationCodeResponse.m | 35 + .../Backend/RPC/FIRGetProjectConfigRequest.h | 40 + .../Backend/RPC/FIRGetProjectConfigRequest.m | 40 + .../Backend/RPC/FIRGetProjectConfigResponse.h | 40 + .../Backend/RPC/FIRGetProjectConfigResponse.m | 40 + .../Backend/RPC/FIRResetPasswordRequest.h | 55 + .../Backend/RPC/FIRResetPasswordRequest.m | 60 + .../Backend/RPC/FIRResetPasswordResponse.h | 52 + .../Backend/RPC/FIRResetPasswordResponse.m | 32 + .../Backend/RPC/FIRSecureTokenRequest.h | 113 + .../Backend/RPC/FIRSecureTokenRequest.m | 163 + .../Backend/RPC/FIRSecureTokenResponse.h | 50 + .../Backend/RPC/FIRSecureTokenResponse.m | 73 + .../RPC/FIRSendVerificationCodeRequest.h | 64 + .../RPC/FIRSendVerificationCodeRequest.m | 84 + .../RPC/FIRSendVerificationCodeResponse.h | 32 + .../RPC/FIRSendVerificationCodeResponse.m | 35 + .../Backend/RPC/FIRSetAccountInfoRequest.h | 151 + .../Backend/RPC/FIRSetAccountInfoRequest.m | 179 + .../Backend/RPC/FIRSetAccountInfoResponse.h | 98 + .../Backend/RPC/FIRSetAccountInfoResponse.m | 64 + .../RPC/FIRSignInWithGameCenterRequest.h | 91 + .../RPC/FIRSignInWithGameCenterRequest.m | 80 + .../RPC/FIRSignInWithGameCenterResponse.h | 64 + .../RPC/FIRSignInWithGameCenterResponse.m | 40 + .../Backend/RPC/FIRSignUpNewUserRequest.h | 72 + .../Backend/RPC/FIRSignUpNewUserRequest.m | 90 + .../Backend/RPC/FIRSignUpNewUserResponse.h | 44 + .../Backend/RPC/FIRSignUpNewUserResponse.m | 35 + .../Backend/RPC/FIRVerifyAssertionRequest.h | 118 + .../Backend/RPC/FIRVerifyAssertionRequest.m | 177 + .../Backend/RPC/FIRVerifyAssertionResponse.h | 214 + .../Backend/RPC/FIRVerifyAssertionResponse.m | 100 + .../Backend/RPC/FIRVerifyClientRequest.h | 55 + .../Backend/RPC/FIRVerifyClientRequest.m | 62 + .../Backend/RPC/FIRVerifyClientResponse.h | 38 + .../Backend/RPC/FIRVerifyClientResponse.m | 34 + .../Backend/RPC/FIRVerifyCustomTokenRequest.h | 58 + .../Backend/RPC/FIRVerifyCustomTokenRequest.m | 59 + .../RPC/FIRVerifyCustomTokenResponse.h | 52 + .../RPC/FIRVerifyCustomTokenResponse.m | 36 + .../Backend/RPC/FIRVerifyPasswordRequest.h | 81 + .../Backend/RPC/FIRVerifyPasswordRequest.m | 95 + .../Backend/RPC/FIRVerifyPasswordResponse.h | 75 + .../Backend/RPC/FIRVerifyPasswordResponse.m | 52 + .../Backend/RPC/FIRVerifyPhoneNumberRequest.h | 90 + .../Backend/RPC/FIRVerifyPhoneNumberRequest.m | 133 + .../RPC/FIRVerifyPhoneNumberResponse.h | 64 + .../RPC/FIRVerifyPhoneNumberResponse.m | 43 + .../Enroll/FIRFinalizeMFAEnrollmentRequest.h | 39 + .../Enroll/FIRFinalizeMFAEnrollmentRequest.m | 55 + .../Enroll/FIRFinalizeMFAEnrollmentResponse.h | 30 + .../Enroll/FIRFinalizeMFAEnrollmentResponse.m | 30 + .../Enroll/FIRStartMFAEnrollmentRequest.h | 35 + .../Enroll/FIRStartMFAEnrollmentRequest.m | 52 + .../Enroll/FIRStartMFAEnrollmentResponse.h | 29 + .../Enroll/FIRStartMFAEnrollmentResponse.m | 34 + .../SignIn/FIRFinalizeMFASignInRequest.h | 37 + .../SignIn/FIRFinalizeMFASignInRequest.m | 51 + .../SignIn/FIRFinalizeMFASignInResponse.h | 30 + .../SignIn/FIRFinalizeMFASignInResponse.m | 28 + .../SignIn/FIRStartMFASignInRequest.h | 39 + .../SignIn/FIRStartMFASignInRequest.m | 56 + .../SignIn/FIRStartMFASignInResponse.h | 28 + .../SignIn/FIRStartMFASignInResponse.m | 32 + .../Unenroll/FIRWithdrawMFARequest.h | 34 + .../Unenroll/FIRWithdrawMFARequest.m | 52 + .../Unenroll/FIRWithdrawMFAResponse.h | 29 + .../Unenroll/FIRWithdrawMFAResponse.m | 32 + .../Sources/Backend/RPC/Proto/FIRAuthProto.h | 30 + .../RPC/Proto/FIRAuthProtoMFAEnrollment.h | 33 + .../RPC/Proto/FIRAuthProtoMFAEnrollment.m | 43 + .../FIRAuthProtoFinalizeMFAPhoneRequestInfo.h | 31 + .../FIRAuthProtoFinalizeMFAPhoneRequestInfo.m | 46 + ...FIRAuthProtoFinalizeMFAPhoneResponseInfo.h | 27 + ...FIRAuthProtoFinalizeMFAPhoneResponseInfo.m | 33 + .../FIRAuthProtoStartMFAPhoneRequestInfo.h | 36 + .../FIRAuthProtoStartMFAPhoneRequestInfo.m | 74 + .../FIRAuthProtoStartMFAPhoneResponseInfo.h | 27 + .../FIRAuthProtoStartMFAPhoneResponseInfo.m | 33 + .../Sources/FirebaseAuthVersion.m | 25 + .../MultiFactor/FIRMultiFactor+Internal.h | 39 + .../Sources/MultiFactor/FIRMultiFactor.m | 195 + .../FIRMultiFactorAssertion+Internal.h | 33 + .../MultiFactor/FIRMultiFactorAssertion.m | 29 + .../MultiFactor/FIRMultiFactorConstants.m | 26 + .../MultiFactor/FIRMultiFactorInfo+Internal.h | 37 + .../Sources/MultiFactor/FIRMultiFactorInfo.m | 74 + .../FIRMultiFactorResolver+Internal.h | 34 + .../MultiFactor/FIRMultiFactorResolver.m | 101 + .../FIRMultiFactorSession+Internal.h | 39 + .../MultiFactor/FIRMultiFactorSession.m | 52 + .../FIRPhoneMultiFactorAssertion+Internal.h | 33 + .../Phone/FIRPhoneMultiFactorAssertion.m | 43 + .../Phone/FIRPhoneMultiFactorGenerator.m | 36 + .../Phone/FIRPhoneMultiFactorInfo+Internal.h | 30 + .../Phone/FIRPhoneMultiFactorInfo.m | 41 + .../Sources/Public/FIRActionCodeSettings.h | 89 + .../Sources/Public/FIRAdditionalUserInfo.h | 57 + .../FirebaseAuth/Sources/Public/FIRAuth.h | 882 ++ .../Sources/Public/FIRAuthAPNSTokenType.h | 45 + .../Sources/Public/FIRAuthCredential.h | 41 + .../Sources/Public/FIRAuthDataResult.h | 57 + .../Sources/Public/FIRAuthErrors.h | 421 + .../Sources/Public/FIRAuthSettings.h | 35 + .../Sources/Public/FIRAuthTokenResult.h | 69 + .../Sources/Public/FIRAuthUIDelegate.h | 59 + .../Sources/Public/FIREmailAuthProvider.h | 70 + .../Sources/Public/FIRFacebookAuthProvider.h | 54 + .../Sources/Public/FIRFederatedAuthProvider.h | 55 + .../Public/FIRGameCenterAuthProvider.h | 62 + .../Sources/Public/FIRGitHubAuthProvider.h | 54 + .../Sources/Public/FIRGoogleAuthProvider.h | 56 + .../Sources/Public/FIRMultiFactor.h | 89 + .../Sources/Public/FIRMultiFactorAssertion.h | 40 + .../Sources/Public/FIRMultiFactorInfo.h | 54 + .../Sources/Public/FIRMultiFactorResolver.h | 60 + .../Sources/Public/FIRMultiFactorSession.h | 35 + .../Sources/Public/FIROAuthCredential.h | 53 + .../Sources/Public/FIROAuthProvider.h | 124 + .../Sources/Public/FIRPhoneAuthCredential.h | 41 + .../Sources/Public/FIRPhoneAuthProvider.h | 141 + .../Public/FIRPhoneMultiFactorAssertion.h | 37 + .../Public/FIRPhoneMultiFactorGenerator.h | 47 + .../Sources/Public/FIRPhoneMultiFactorInfo.h | 42 + .../Sources/Public/FIRTwitterAuthProvider.h | 54 + .../FirebaseAuth/Sources/Public/FIRUser.h | 557 + .../FirebaseAuth/Sources/Public/FIRUserInfo.h | 60 + .../Sources/Public/FIRUserMetadata.h | 45 + .../Sources/Public/FirebaseAuth.h | 54 + .../Sources/Public/FirebaseAuthVersion.h | 27 + .../Sources/Storage/FIRAuthKeychainServices.h | 99 + .../Sources/Storage/FIRAuthKeychainServices.m | 323 + .../Sources/Storage/FIRAuthUserDefaults.h | 36 + .../Sources/Storage/FIRAuthUserDefaults.m | 74 + .../Sources/SystemService/FIRAuthAPNSToken.h | 63 + .../Sources/SystemService/FIRAuthAPNSToken.m | 57 + .../SystemService/FIRAuthAPNSTokenManager.h | 83 + .../SystemService/FIRAuthAPNSTokenManager.m | 250 + .../SystemService/FIRAuthAppCredential.h | 52 + .../SystemService/FIRAuthAppCredential.m | 64 + .../FIRAuthAppCredentialManager.h | 90 + .../FIRAuthAppCredentialManager.m | 175 + .../FIRAuthNotificationManager.h | 76 + .../FIRAuthNotificationManager.m | 188 + .../SystemService/FIRAuthStoredUserManager.h | 99 + .../SystemService/FIRAuthStoredUserManager.m | 133 + .../SystemService/FIRSecureTokenService.h | 99 + .../SystemService/FIRSecureTokenService.m | 208 + .../Sources/User/FIRAdditionalUserInfo.m | 97 + .../User/FIRAdditionalUserInfo_Internal.h | 46 + .../FirebaseAuth/Sources/User/FIRUser.m | 1604 +++ .../Sources/User/FIRUserInfoImpl.h | 60 + .../Sources/User/FIRUserInfoImpl.m | 131 + .../Sources/User/FIRUserMetadata.m | 64 + .../Sources/User/FIRUserMetadata_Internal.h | 37 + .../Sources/User/FIRUser_Internal.h | 107 + .../Utilities/FIRAuthDefaultUIDelegate.h | 47 + .../Utilities/FIRAuthDefaultUIDelegate.m | 126 + .../Sources/Utilities/FIRAuthErrorUtils.h | 585 + .../Sources/Utilities/FIRAuthErrorUtils.m | 1368 +++ .../Sources/Utilities/FIRAuthExceptionUtils.h | 41 + .../Sources/Utilities/FIRAuthExceptionUtils.m | 41 + .../Sources/Utilities/FIRAuthInternalErrors.h | 530 + .../Sources/Utilities/FIRAuthURLPresenter.h | 69 + .../Sources/Utilities/FIRAuthURLPresenter.m | 193 + .../Sources/Utilities/FIRAuthWebUtils.h | 102 + .../Sources/Utilities/FIRAuthWebUtils.m | 205 + .../Sources/Utilities/FIRAuthWebView.h | 44 + .../Sources/Utilities/FIRAuthWebView.m | 104 + .../Utilities/FIRAuthWebViewController.h | 78 + .../Utilities/FIRAuthWebViewController.m | 118 + .../Sources/Utilities/NSData+FIRBase64.h | 31 + .../Sources/Utilities/NSData+FIRBase64.m | 33 + .../Sources/Private/FIRAppInternal.h | 173 + .../Sources/Private/FIRComponent.h | 91 + .../Sources/Private/FIRComponentContainer.h | 50 + .../Sources/Private/FIRComponentType.h | 34 + .../Private/FIRCoreDiagnosticsConnector.h | 35 + .../Sources/Private/FIRDependency.h | 45 + .../Sources/Private/FIRErrorCode.h | 39 + .../FirebaseCore/Sources/Private/FIRErrors.h | 24 + .../Sources/Private/FIRHeartbeatInfo.h | 39 + .../FirebaseCore/Sources/Private/FIRLibrary.h | 50 + .../FirebaseCore/Sources/Private/FIRLogger.h | 156 + .../Sources/Private/FIROptionsInternal.h | 119 + .../Sources/Private/FirebaseCoreInternal.h | 31 + .../Interop/Auth/Public/FIRAuthInterop.h | 44 + MyExperiences copy/Pods/FirebaseAuth/LICENSE | 202 + .../Pods/FirebaseAuth/README.md | 311 + .../Sources/FIRAnalyticsConfiguration.h | 56 + .../Sources/FIRAnalyticsConfiguration.m | 62 + .../FirebaseCore/Sources/FIRApp.m | 938 ++ .../Sources/FIRAppAssociationRegistration.h | 49 + .../Sources/FIRAppAssociationRegistration.m | 47 + .../FirebaseCore/Sources/FIRBundleUtil.h | 53 + .../FirebaseCore/Sources/FIRBundleUtil.m | 79 + .../FirebaseCore/Sources/FIRComponent.m | 65 + .../Sources/FIRComponentContainer.m | 214 + .../Sources/FIRComponentContainerInternal.h | 49 + .../FirebaseCore/Sources/FIRComponentType.m | 28 + .../FirebaseCore/Sources/FIRConfiguration.m | 46 + .../Sources/FIRConfigurationInternal.h | 29 + .../Sources/FIRCoreDiagnosticsConnector.m | 61 + .../FirebaseCore/Sources/FIRDependency.m | 44 + .../FirebaseCore/Sources/FIRDiagnosticsData.h | 35 + .../FirebaseCore/Sources/FIRDiagnosticsData.m | 66 + .../FirebaseCore/Sources/FIRErrors.m | 21 + .../FirebaseCore/Sources/FIRHeartbeatInfo.m | 61 + .../FirebaseCore/Sources/FIRLogger.m | 179 + .../FirebaseCore/Sources/FIROptions.m | 490 + .../FirebaseCore/Sources/FIRVersion.h | 23 + .../FirebaseCore/Sources/FIRVersion.m | 33 + .../Sources/Private/FIRAppInternal.h | 173 + .../Sources/Private/FIRComponent.h | 91 + .../Sources/Private/FIRComponentContainer.h | 50 + .../Sources/Private/FIRComponentType.h | 34 + .../Private/FIRCoreDiagnosticsConnector.h | 35 + .../Sources/Private/FIRDependency.h | 45 + .../Sources/Private/FIRErrorCode.h | 39 + .../FirebaseCore/Sources/Private/FIRErrors.h | 24 + .../Sources/Private/FIRHeartbeatInfo.h | 39 + .../FirebaseCore/Sources/Private/FIRLibrary.h | 50 + .../FirebaseCore/Sources/Private/FIRLogger.h | 156 + .../Sources/Private/FIROptionsInternal.h | 119 + .../Sources/Private/FirebaseCoreInternal.h | 31 + .../FirebaseCore/Sources/Public/FIRApp.h | 127 + .../Sources/Public/FIRConfiguration.h | 45 + .../Sources/Public/FIRLoggerLevel.h | 38 + .../FirebaseCore/Sources/Public/FIROptions.h | 123 + .../Sources/Public/FirebaseCore.h | 20 + .../Public/FIRCoreDiagnosticsData.h | 61 + .../Public/FIRCoreDiagnosticsInterop.h | 34 + MyExperiences copy/Pods/FirebaseCore/LICENSE | 202 + .../Pods/FirebaseCore/README.md | 311 + .../FIRCDLibrary/FIRCoreDiagnostics.m | 647 ++ .../Protogen/nanopb/firebasecore.nanopb.c | 60 + .../Protogen/nanopb/firebasecore.nanopb.h | 193 + .../Public/FIRCoreDiagnosticsData.h | 61 + .../Public/FIRCoreDiagnosticsInterop.h | 34 + .../Pods/FirebaseCoreDiagnostics/LICENSE | 202 + .../Pods/FirebaseCoreDiagnostics/README.md | 311 + .../Firebase/Database/Api/FIRDataSnapshot.m | 105 + .../Firebase/Database/Api/FIRDatabase.m | 229 + .../Database/Api/FIRDatabaseComponent.h | 46 + .../Database/Api/FIRDatabaseComponent.m | 169 + .../Firebase/Database/Api/FIRDatabaseConfig.h | 71 + .../Firebase/Database/Api/FIRDatabaseConfig.m | 95 + .../Firebase/Database/Api/FIRDatabaseQuery.m | 677 ++ .../Firebase/Database/Api/FIRMutableData.m | 149 + .../Firebase/Database/Api/FIRServerValue.m | 33 + .../Database/Api/FIRTransactionResult.m | 39 + .../Api/Private/FIRDataSnapshot_Private.h | 28 + .../Api/Private/FIRDatabaseQuery_Private.h | 43 + .../Private/FIRDatabaseReference_Private.h | 27 + .../Api/Private/FIRDatabase_Private.h | 37 + .../Api/Private/FIRMutableData_Private.h | 26 + .../Private/FIRTransactionResult_Private.h | 25 + .../Database/Api/Private/FTypedefs_Private.h | 60 + .../Firebase/Database/Constants/FConstants.h | 195 + .../Firebase/Database/Constants/FConstants.m | 185 + .../Firebase/Database/Core/FCompoundHash.h | 38 + .../Firebase/Database/Core/FCompoundHash.m | 259 + .../Firebase/Database/Core/FListenProvider.h | 32 + .../Firebase/Database/Core/FListenProvider.m | 25 + .../Database/Core/FPersistentConnection.h | 99 + .../Database/Core/FPersistentConnection.m | 1142 ++ .../Firebase/Database/Core/FQueryParams.h | 60 + .../Firebase/Database/Core/FQueryParams.m | 393 + .../Firebase/Database/Core/FQuerySpec.h | 36 + .../Firebase/Database/Core/FQuerySpec.m | 86 + .../Firebase/Database/Core/FRangeMerge.h | 39 + .../Firebase/Database/Core/FRangeMerge.m | 134 + .../Firebase/Database/Core/FRepo.h | 93 + .../Firebase/Database/Core/FRepo.m | 1467 +++ .../Firebase/Database/Core/FRepoInfo.h | 40 + .../Firebase/Database/Core/FRepoInfo.m | 144 + .../Firebase/Database/Core/FRepoManager.h | 34 + .../Firebase/Database/Core/FRepoManager.m | 148 + .../Firebase/Database/Core/FRepo_Private.h | 42 + .../Firebase/Database/Core/FServerValues.h | 40 + .../Firebase/Database/Core/FServerValues.m | 269 + .../Firebase/Database/Core/FSnapshotHolder.h | 27 + .../Firebase/Database/Core/FSnapshotHolder.m | 46 + .../Database/Core/FSparseSnapshotTree.h | 34 + .../Database/Core/FSparseSnapshotTree.m | 144 + .../Firebase/Database/Core/FSyncPoint.h | 69 + .../Firebase/Database/Core/FSyncPoint.m | 302 + .../Firebase/Database/Core/FSyncTree.h | 82 + .../Firebase/Database/Core/FSyncTree.m | 1042 ++ .../Firebase/Database/Core/FWriteRecord.h | 45 + .../Firebase/Database/Core/FWriteRecord.m | 139 + .../Firebase/Database/Core/FWriteTree.h | 70 + .../Firebase/Database/Core/FWriteTree.m | 577 + .../Firebase/Database/Core/FWriteTreeRef.h | 57 + .../Firebase/Database/Core/FWriteTreeRef.m | 159 + .../Database/Core/Operation/FAckUserWrite.h | 37 + .../Database/Core/Operation/FAckUserWrite.m | 66 + .../Firebase/Database/Core/Operation/FMerge.h | 32 + .../Firebase/Database/Core/Operation/FMerge.m | 85 + .../Database/Core/Operation/FOperation.h | 34 + .../Core/Operation/FOperationSource.h | 37 + .../Core/Operation/FOperationSource.m | 86 + .../Database/Core/Operation/FOverwrite.h | 32 + .../Database/Core/Operation/FOverwrite.m | 67 + .../Database/Core/Utilities/FIRRetryHelper.h | 33 + .../Database/Core/Utilities/FIRRetryHelper.m | 140 + .../Database/Core/Utilities/FImmutableTree.h | 59 + .../Database/Core/Utilities/FImmutableTree.m | 486 + .../Firebase/Database/Core/Utilities/FPath.h | 46 + .../Firebase/Database/Core/Utilities/FPath.m | 304 + .../Firebase/Database/Core/Utilities/FTree.h | 52 + .../Firebase/Database/Core/Utilities/FTree.m | 193 + .../Database/Core/Utilities/FTreeNode.h | 25 + .../Database/Core/Utilities/FTreeNode.m | 35 + .../Firebase/Database/Core/View/FCacheNode.h | 46 + .../Firebase/Database/Core/View/FCacheNode.m | 60 + .../Database/Core/View/FCancelEvent.h | 31 + .../Database/Core/View/FCancelEvent.m | 57 + .../Firebase/Database/Core/View/FChange.h | 41 + .../Firebase/Database/Core/View/FChange.m | 72 + .../Core/View/FChildEventRegistration.h | 37 + .../Core/View/FChildEventRegistration.m | 112 + .../Firebase/Database/Core/View/FDataEvent.h | 41 + .../Firebase/Database/Core/View/FDataEvent.m | 83 + .../Firebase/Database/Core/View/FEvent.h | 27 + .../Database/Core/View/FEventRaiser.h | 36 + .../Database/Core/View/FEventRaiser.m | 74 + .../Database/Core/View/FEventRegistration.h | 38 + .../Core/View/FKeepSyncedEventRegistration.h | 28 + .../Core/View/FKeepSyncedEventRegistration.m | 70 + .../Core/View/FValueEventRegistration.h | 34 + .../Core/View/FValueEventRegistration.m | 102 + .../Firebase/Database/Core/View/FView.h | 56 + .../Firebase/Database/Core/View/FView.m | 266 + .../Firebase/Database/Core/View/FViewCache.h | 40 + .../Firebase/Database/Core/View/FViewCache.m | 72 + .../View/Filter/FChildChangeAccumulator.h | 27 + .../View/Filter/FChildChangeAccumulator.m | 99 + .../Core/View/Filter/FCompleteChildSource.h | 30 + .../Core/View/Filter/FIndexedFilter.h | 26 + .../Core/View/Filter/FIndexedFilter.m | 164 + .../Core/View/Filter/FLimitedFilter.h | 25 + .../Core/View/Filter/FLimitedFilter.m | 285 + .../Database/Core/View/Filter/FNodeFilter.h | 77 + .../Firebase/Database/FClock.h | 35 + .../Firebase/Database/FClock.m | 58 + .../Firebase/Database/FEventGenerator.h | 28 + .../Firebase/Database/FEventGenerator.m | 169 + .../Database/FIRDatabaseConfig_Private.h | 32 + .../Firebase/Database/FIRDatabaseReference.m | 527 + .../Firebase/Database/FIndex.h | 51 + .../Firebase/Database/FIndex.m | 39 + .../Firebase/Database/FKeyIndex.h | 22 + .../Firebase/Database/FKeyIndex.m | 123 + .../Firebase/Database/FListenComplete.h | 28 + .../Firebase/Database/FListenComplete.m | 55 + .../Firebase/Database/FMaxNode.h | 22 + .../Firebase/Database/FMaxNode.m | 58 + .../Firebase/Database/FNamedNode.h | 31 + .../Firebase/Database/FNamedNode.m | 102 + .../Firebase/Database/FPathIndex.h | 23 + .../Firebase/Database/FPathIndex.m | 135 + .../Firebase/Database/FPriorityIndex.h | 23 + .../Firebase/Database/FPriorityIndex.m | 126 + .../Firebase/Database/FRangedFilter.h | 31 + .../Firebase/Database/FRangedFilter.m | 129 + .../Database/FTransformedEnumerator.h | 24 + .../Database/FTransformedEnumerator.m | 44 + .../Firebase/Database/FValueIndex.h | 22 + .../Firebase/Database/FValueIndex.m | 112 + .../Firebase/Database/FViewProcessor.h | 42 + .../Firebase/Database/FViewProcessor.m | 831 ++ .../Firebase/Database/FViewProcessorResult.h | 29 + .../Firebase/Database/FViewProcessorResult.m | 35 + .../Database/Login/FAuthTokenProvider.h | 39 + .../Database/Login/FAuthTokenProvider.m | 121 + .../Database/Login/FIRNoopAuthTokenProvider.h | 22 + .../Database/Login/FIRNoopAuthTokenProvider.m | 34 + .../Database/Persistence/FCachePolicy.h | 41 + .../Database/Persistence/FCachePolicy.m | 82 + .../Persistence/FLevelDBStorageEngine.h | 39 + .../Persistence/FLevelDBStorageEngine.m | 993 ++ .../Database/Persistence/FPendingPut.h | 53 + .../Database/Persistence/FPendingPut.m | 113 + .../Persistence/FPersistenceManager.h | 60 + .../Persistence/FPersistenceManager.m | 231 + .../Database/Persistence/FPruneForest.h | 38 + .../Database/Persistence/FPruneForest.m | 194 + .../Database/Persistence/FStorageEngine.h | 60 + .../Database/Persistence/FTrackedQuery.h | 43 + .../Database/Persistence/FTrackedQuery.m | 113 + .../Persistence/FTrackedQueryManager.h | 52 + .../Persistence/FTrackedQueryManager.m | 375 + .../Database/Public/FIRDataEventType.h | 39 + .../Database/Public/FIRDataSnapshot.h | 142 + .../Firebase/Database/Public/FIRDatabase.h | 182 + .../Database/Public/FIRDatabaseQuery.h | 395 + .../Database/Public/FIRDatabaseReference.h | 861 ++ .../Firebase/Database/Public/FIRMutableData.h | 128 + .../Firebase/Database/Public/FIRServerValue.h | 53 + .../Database/Public/FIRTransactionResult.h | 50 + .../Database/Public/FirebaseDatabase.h | 29 + .../Firebase/Database/Realtime/FConnection.h | 60 + .../Firebase/Database/Realtime/FConnection.m | 236 + .../Database/Realtime/FWebSocketConnection.h | 54 + .../Database/Realtime/FWebSocketConnection.m | 348 + .../Database/Snapshot/FChildrenNode.h | 42 + .../Database/Snapshot/FChildrenNode.m | 418 + .../Database/Snapshot/FCompoundWrite.h | 64 + .../Database/Snapshot/FCompoundWrite.m | 304 + .../Firebase/Database/Snapshot/FEmptyNode.h | 24 + .../Firebase/Database/Snapshot/FEmptyNode.m | 30 + .../Firebase/Database/Snapshot/FIndexedNode.h | 55 + .../Firebase/Database/Snapshot/FIndexedNode.m | 218 + .../Firebase/Database/Snapshot/FLeafNode.h | 27 + .../Firebase/Database/Snapshot/FLeafNode.m | 266 + .../Firebase/Database/Snapshot/FNode.h | 50 + .../Database/Snapshot/FSnapshotUtilities.h | 49 + .../Database/Snapshot/FSnapshotUtilities.m | 394 + .../Database/Utilities/FAtomicNumber.h | 23 + .../Database/Utilities/FAtomicNumber.m | 55 + .../Database/Utilities/FEventEmitter.h | 36 + .../Database/Utilities/FEventEmitter.m | 161 + .../Firebase/Database/Utilities/FNextPushId.h | 23 + .../Firebase/Database/Utilities/FNextPushId.m | 62 + .../Firebase/Database/Utilities/FParsedUrl.h | 25 + .../Firebase/Database/Utilities/FParsedUrl.m | 24 + .../Database/Utilities/FStringUtilities.h | 26 + .../Database/Utilities/FStringUtilities.m | 72 + .../Firebase/Database/Utilities/FTypedefs.h | 46 + .../Firebase/Database/Utilities/FUtilities.h | 82 + .../Firebase/Database/Utilities/FUtilities.m | 433 + .../Firebase/Database/Utilities/FValidation.h | 55 + .../Firebase/Database/Utilities/FValidation.m | 461 + .../Utilities/Tuples/FTupleBoolBlock.h | 25 + .../Utilities/Tuples/FTupleBoolBlock.m | 24 + .../Utilities/Tuples/FTupleCallbackStatus.h | 24 + .../Utilities/Tuples/FTupleCallbackStatus.m | 22 + .../Utilities/Tuples/FTupleFirebase.h | 26 + .../Utilities/Tuples/FTupleFirebase.m | 25 + .../Utilities/Tuples/FTupleNodePath.h | 28 + .../Utilities/Tuples/FTupleNodePath.m | 33 + .../Utilities/Tuples/FTupleObjectNode.h | 27 + .../Utilities/Tuples/FTupleObjectNode.m | 32 + .../Database/Utilities/Tuples/FTupleObjects.h | 24 + .../Database/Utilities/Tuples/FTupleObjects.m | 24 + .../Utilities/Tuples/FTupleOnDisconnect.h | 27 + .../Utilities/Tuples/FTupleOnDisconnect.m | 26 + .../Utilities/Tuples/FTuplePathValue.h | 25 + .../Utilities/Tuples/FTuplePathValue.m | 38 + .../Tuples/FTupleRemovedQueriesEvents.h | 30 + .../Tuples/FTupleRemovedQueriesEvents.m | 37 + .../Utilities/Tuples/FTupleSetIdPath.h | 27 + .../Utilities/Tuples/FTupleSetIdPath.m | 33 + .../Utilities/Tuples/FTupleStringNode.h | 27 + .../Utilities/Tuples/FTupleStringNode.m | 33 + .../Database/Utilities/Tuples/FTupleTSN.h | 25 + .../Database/Utilities/Tuples/FTupleTSN.m | 24 + .../Utilities/Tuples/FTupleTransaction.h | 75 + .../Utilities/Tuples/FTupleTransaction.m | 41 + .../Utilities/Tuples/FTupleUserCallback.h | 32 + .../Utilities/Tuples/FTupleUserCallback.m | 35 + .../FArraySortedDictionary.h | 21 + .../FArraySortedDictionary.m | 266 + .../FImmutableSortedDictionary.h | 54 + .../FImmutableSortedDictionary.m | 142 + .../FImmutableSortedSet.h | 22 + .../FImmutableSortedSet.m | 115 + .../FLLRBEmptyNode.h | 27 + .../FLLRBEmptyNode.m | 72 + .../FImmutableSortedDictionary/FLLRBNode.h | 29 + .../FLLRBValueNode.h | 29 + .../FLLRBValueNode.m | 230 + .../FTreeSortedDictionary.h | 30 + .../FTreeSortedDictionary.m | 326 + .../FTreeSortedDictionaryEnumerator.h | 9 + .../FTreeSortedDictionaryEnumerator.m | 83 + .../third_party/SocketRocket/FSRWebSocket.h | 107 + .../third_party/SocketRocket/FSRWebSocket.m | 1867 ++++ .../SocketRocket/NSData+SRB64Additions.h | 23 + .../SocketRocket/NSData+SRB64Additions.m | 37 + .../third_party/SocketRocket/fbase64.c | 318 + .../third_party/SocketRocket/fbase64.h | 33 + .../third_party/Wrap-leveldb/APLevelDB.h | 105 + .../third_party/Wrap-leveldb/APLevelDB.mm | 500 + .../Sources/Private/FIRAppInternal.h | 173 + .../Sources/Private/FIRComponent.h | 91 + .../Sources/Private/FIRComponentContainer.h | 50 + .../Sources/Private/FIRComponentType.h | 34 + .../Private/FIRCoreDiagnosticsConnector.h | 35 + .../Sources/Private/FIRDependency.h | 45 + .../Sources/Private/FIRErrorCode.h | 39 + .../FirebaseCore/Sources/Private/FIRErrors.h | 24 + .../Sources/Private/FIRHeartbeatInfo.h | 39 + .../FirebaseCore/Sources/Private/FIRLibrary.h | 50 + .../FirebaseCore/Sources/Private/FIRLogger.h | 156 + .../Sources/Private/FIROptionsInternal.h | 119 + .../Sources/Private/FirebaseCoreInternal.h | 31 + .../Interop/Auth/Public/FIRAuthInterop.h | 44 + .../Pods/FirebaseDatabase/LICENSE | 202 + .../Pods/FirebaseDatabase/README.md | 311 + .../Sources/Private/FIRAppInternal.h | 173 + .../Sources/Private/FIRComponent.h | 91 + .../Sources/Private/FIRComponentContainer.h | 50 + .../Sources/Private/FIRComponentType.h | 34 + .../Private/FIRCoreDiagnosticsConnector.h | 35 + .../Sources/Private/FIRDependency.h | 45 + .../Sources/Private/FIRErrorCode.h | 39 + .../FirebaseCore/Sources/Private/FIRErrors.h | 24 + .../Sources/Private/FIRHeartbeatInfo.h | 39 + .../FirebaseCore/Sources/Private/FIRLibrary.h | 50 + .../FirebaseCore/Sources/Private/FIRLogger.h | 156 + .../Sources/Private/FIROptionsInternal.h | 119 + .../Sources/Private/FirebaseCoreInternal.h | 31 + .../Errors/FIRInstallationsErrorUtil.h | 56 + .../Errors/FIRInstallationsErrorUtil.m | 124 + .../Errors/FIRInstallationsHTTPError.h | 54 + .../Errors/FIRInstallationsHTTPError.m | 79 + .../Source/Library/FIRInstallations.m | 245 + .../Library/FIRInstallationsAuthTokenResult.m | 30 + .../FIRInstallationsAuthTokenResultInternal.h | 27 + .../Source/Library/FIRInstallationsItem.h | 86 + .../Source/Library/FIRInstallationsItem.m | 104 + .../Source/Library/FIRInstallationsLogger.h | 51 + .../Source/Library/FIRInstallationsLogger.m | 49 + .../Source/Library/FIRInstallationsVersion.m | 23 + .../IIDMigration/FIRInstallationsIIDStore.h | 48 + .../IIDMigration/FIRInstallationsIIDStore.m | 236 + .../FIRInstallationsIIDTokenStore.h | 36 + .../FIRInstallationsIIDTokenStore.m | 158 + .../FIRInstallationsAPIService.h | 62 + .../FIRInstallationsAPIService.m | 361 + ...nstallationsItem+RegisterInstallationAPI.h | 53 + ...nstallationsItem+RegisterInstallationAPI.m | 142 + .../FIRInstallationsIDController.h | 44 + .../FIRInstallationsIDController.m | 480 + ...InstallationsSingleOperationPromiseCache.h | 58 + ...InstallationsSingleOperationPromiseCache.m | 75 + .../FIRInstallationsStatus.h | 35 + .../FIRInstallationsStore.h | 71 + .../FIRInstallationsStore.m | 126 + .../FIRInstallationsStoredAuthToken.h | 58 + .../FIRInstallationsStoredAuthToken.m | 77 + .../FIRInstallationsStoredItem.h | 51 + .../FIRInstallationsStoredItem.m | 80 + .../Source/Library/Public/FIRInstallations.h | 120 + .../Public/FIRInstallationsAuthTokenResult.h | 33 + .../Library/Public/FIRInstallationsErrors.h | 34 + .../Library/Public/FIRInstallationsVersion.h | 19 + .../Library/Public/FirebaseInstallations.h | 20 + .../Pods/FirebaseInstallations/LICENSE | 202 + .../Pods/FirebaseInstallations/README.md | 311 + .../Sources/Private/FIRAppInternal.h | 173 + .../Sources/Private/FIRComponent.h | 91 + .../Sources/Private/FIRComponentContainer.h | 50 + .../Sources/Private/FIRComponentType.h | 34 + .../Private/FIRCoreDiagnosticsConnector.h | 35 + .../Sources/Private/FIRDependency.h | 45 + .../Sources/Private/FIRErrorCode.h | 39 + .../FirebaseCore/Sources/Private/FIRErrors.h | 24 + .../Sources/Private/FIRHeartbeatInfo.h | 39 + .../FirebaseCore/Sources/Private/FIRLibrary.h | 50 + .../FirebaseCore/Sources/Private/FIRLogger.h | 156 + .../Sources/Private/FIROptionsInternal.h | 119 + .../Sources/Private/FirebaseCoreInternal.h | 31 + .../FirebaseStorage/Sources/FIRStorage.m | 260 + .../Sources/FIRStorageComponent.h | 45 + .../Sources/FIRStorageComponent.m | 84 + .../Sources/FIRStorageConstants.m | 92 + .../Sources/FIRStorageConstants_Private.h | 150 + .../Sources/FIRStorageDeleteTask.h | 35 + .../Sources/FIRStorageDeleteTask.m | 83 + .../Sources/FIRStorageDownloadTask.m | 189 + .../Sources/FIRStorageDownloadTask_Private.h | 59 + .../Sources/FIRStorageErrors.h | 70 + .../Sources/FIRStorageErrors.m | 189 + .../Sources/FIRStorageGetDownloadURLTask.h | 35 + .../Sources/FIRStorageGetDownloadURLTask.m | 126 + .../FIRStorageGetDownloadURLTask_Private.h | 31 + .../Sources/FIRStorageGetMetadataTask.h | 35 + .../Sources/FIRStorageGetMetadataTask.m | 97 + .../Sources/FIRStorageListResult.m | 69 + .../Sources/FIRStorageListResult_Private.h | 40 + .../Sources/FIRStorageListTask.h | 57 + .../Sources/FIRStorageListTask.m | 127 + .../Sources/FIRStorageMetadata.m | 224 + .../Sources/FIRStorageMetadata_Private.h | 72 + .../Sources/FIRStorageObservableTask.m | 215 + .../FIRStorageObservableTask_Private.h | 51 + .../FirebaseStorage/Sources/FIRStoragePath.h | 106 + .../FirebaseStorage/Sources/FIRStoragePath.m | 199 + .../Sources/FIRStorageReference.m | 487 + .../Sources/FIRStorageReference_Private.h | 39 + .../FirebaseStorage/Sources/FIRStorageTask.m | 68 + .../Sources/FIRStorageTaskSnapshot.m | 87 + .../Sources/FIRStorageTaskSnapshot_Private.h | 60 + .../Sources/FIRStorageTask_Private.h | 91 + .../Sources/FIRStorageTokenAuthorizer.h | 47 + .../Sources/FIRStorageTokenAuthorizer.m | 132 + .../Sources/FIRStorageUpdateMetadataTask.h | 36 + .../Sources/FIRStorageUpdateMetadataTask.m | 107 + .../Sources/FIRStorageUploadTask.m | 271 + .../Sources/FIRStorageUploadTask_Private.h | 73 + .../FirebaseStorage/Sources/FIRStorageUtils.h | 111 + .../FirebaseStorage/Sources/FIRStorageUtils.m | 151 + .../Sources/FIRStorage_Private.h | 40 + .../Sources/Public/FIRStorage.h | 130 + .../Sources/Public/FIRStorageConstants.h | 174 + .../Sources/Public/FIRStorageDownloadTask.h | 38 + .../Sources/Public/FIRStorageListResult.h | 53 + .../Sources/Public/FIRStorageMetadata.h | 140 + .../Sources/Public/FIRStorageObservableTask.h | 62 + .../Sources/Public/FIRStorageReference.h | 313 + .../Sources/Public/FIRStorageTask.h | 75 + .../Sources/Public/FIRStorageTaskSnapshot.h | 67 + .../Sources/Public/FIRStorageUploadTask.h | 38 + .../Sources/Public/FirebaseStorage.h | 26 + .../Interop/Auth/Public/FIRAuthInterop.h | 44 + .../Pods/FirebaseStorage/LICENSE | 202 + .../Pods/FirebaseStorage/README.md | 311 + .../FUIAccountSettingsOperation.h | 103 + .../FUIAccountSettingsOperation.m | 274 + ...FUIAccountSettingsOperationDeleteAccount.h | 36 + ...FUIAccountSettingsOperationDeleteAccount.m | 135 + ...UIAccountSettingsOperationForgotPassword.h | 37 + ...UIAccountSettingsOperationForgotPassword.m | 93 + .../FUIAccountSettingsOperationSignOut.h | 37 + .../FUIAccountSettingsOperationSignOut.m | 45 + .../FUIAccountSettingsOperationType.h | 29 + ...FUIAccountSettingsOperationUnlinkAccount.h | 61 + ...FUIAccountSettingsOperationUnlinkAccount.m | 106 + .../FUIAccountSettingsOperationUpdateEmail.h | 38 + .../FUIAccountSettingsOperationUpdateEmail.m | 92 + .../FUIAccountSettingsOperationUpdateName.h | 36 + .../FUIAccountSettingsOperationUpdateName.m | 65 + ...UIAccountSettingsOperationUpdatePassword.h | 59 + ...UIAccountSettingsOperationUpdatePassword.m | 126 + .../FUIAccountSettingsOperation_Internal.h | 109 + .../FUIAccountSettingsViewController.h | 35 + .../FUIAccountSettingsViewController.m | 431 + .../FUIAccountSettingsViewController.xib | 37 + .../FUIInputTableViewCell.xib | 59 + .../FUIPasswordTableViewCell.xib | 75 + .../FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.h | 268 + .../FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.m | 417 + .../FUIAuthBaseViewController.h | 124 + .../FUIAuthBaseViewController.m | 448 + .../FUIAuthBaseViewController_Internal.h | 150 + .../Auth/FirebaseAuthUI/FUIAuthErrorUtils.h | 62 + .../Auth/FirebaseAuthUI/FUIAuthErrorUtils.m | 49 + .../Auth/FirebaseAuthUI/FUIAuthErrors.h | 68 + .../Auth/FirebaseAuthUI/FUIAuthErrors.m | 23 + .../FUIAuthPickerViewController.h | 30 + .../FUIAuthPickerViewController.m | 208 + .../FUIAuthPickerViewController.xib | 51 + .../Auth/FirebaseAuthUI/FUIAuthProvider.h | 178 + .../Auth/FirebaseAuthUI/FUIAuthSignInButton.h | 68 + .../Auth/FirebaseAuthUI/FUIAuthSignInButton.m | 116 + .../Auth/FirebaseAuthUI/FUIAuthStrings.h | 147 + .../Auth/FirebaseAuthUI/FUIAuthStrings.m | 160 + .../FirebaseAuthUI/FUIAuthTableHeaderView.h | 34 + .../FirebaseAuthUI/FUIAuthTableHeaderView.m | 83 + .../FirebaseAuthUI/FUIAuthTableViewCell.h | 38 + .../FirebaseAuthUI/FUIAuthTableViewCell.m | 35 + .../FirebaseAuthUI/FUIAuthTableViewCell.xib | 49 + .../Auth/FirebaseAuthUI/FUIAuthUtils.h | 56 + .../Auth/FirebaseAuthUI/FUIAuthUtils.m | 59 + .../Auth/FirebaseAuthUI/FUIAuth_Internal.h | 100 + .../FUIPrivacyAndTermsOfServiceView.h | 56 + .../FUIPrivacyAndTermsOfServiceView.m | 98 + .../FUIStaticContentTableViewController.h | 98 + .../FUIStaticContentTableViewController.m | 137 + .../FUIStaticContentTableViewController.xib | 79 + .../FUIStaticContentTableViewManager.h | 311 + .../FUIStaticContentTableViewManager.m | 319 + .../Auth/FirebaseAuthUI/FirebaseAuthUI.h | 38 + .../Resources/ic_account_circle.png | Bin 0 -> 767 bytes .../Resources/ic_account_circle2x.png | Bin 0 -> 1471 bytes .../Resources/ic_account_circle3x.png | Bin 0 -> 2297 bytes .../Resources/ic_visibility.png | Bin 0 -> 309 bytes .../Resources/ic_visibility@2x.png | Bin 0 -> 593 bytes .../Resources/ic_visibility@3x.png | Bin 0 -> 868 bytes .../Resources/ic_visibility_off.png | Bin 0 -> 351 bytes .../Resources/ic_visibility_off@2x.png | Bin 0 -> 629 bytes .../Resources/ic_visibility_off@3x.png | Bin 0 -> 884 bytes .../Strings/ar.lproj/FirebaseAuthUI.strings | 269 + .../Strings/bg.lproj/FirebaseAuthUI.strings | 269 + .../Strings/bn.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ca.lproj/FirebaseAuthUI.strings | 269 + .../Strings/cs.lproj/FirebaseAuthUI.strings | 269 + .../Strings/da.lproj/FirebaseAuthUI.strings | 269 + .../de-AT.lproj/FirebaseAuthUI.strings | 269 + .../de-CH.lproj/FirebaseAuthUI.strings | 269 + .../Strings/de.lproj/FirebaseAuthUI.strings | 269 + .../Strings/el.lproj/FirebaseAuthUI.strings | 269 + .../en-AU.lproj/FirebaseAuthUI.strings | 269 + .../en-CA.lproj/FirebaseAuthUI.strings | 269 + .../en-GB.lproj/FirebaseAuthUI.strings | 269 + .../en-IE.lproj/FirebaseAuthUI.strings | 269 + .../en-IN.lproj/FirebaseAuthUI.strings | 269 + .../en-SG.lproj/FirebaseAuthUI.strings | 269 + .../en-ZA.lproj/FirebaseAuthUI.strings | 269 + .../Strings/en.lproj/FirebaseAuthUI.strings | 269 + .../es-419.lproj/FirebaseAuthUI.strings | 269 + .../es-AR.lproj/FirebaseAuthUI.strings | 269 + .../es-BO.lproj/FirebaseAuthUI.strings | 269 + .../es-CL.lproj/FirebaseAuthUI.strings | 269 + .../es-CO.lproj/FirebaseAuthUI.strings | 269 + .../es-CR.lproj/FirebaseAuthUI.strings | 269 + .../es-DO.lproj/FirebaseAuthUI.strings | 269 + .../es-EC.lproj/FirebaseAuthUI.strings | 269 + .../es-GT.lproj/FirebaseAuthUI.strings | 269 + .../es-HN.lproj/FirebaseAuthUI.strings | 269 + .../es-MX.lproj/FirebaseAuthUI.strings | 269 + .../es-NI.lproj/FirebaseAuthUI.strings | 269 + .../es-PA.lproj/FirebaseAuthUI.strings | 269 + .../es-PE.lproj/FirebaseAuthUI.strings | 269 + .../es-PR.lproj/FirebaseAuthUI.strings | 269 + .../es-PY.lproj/FirebaseAuthUI.strings | 269 + .../es-SV.lproj/FirebaseAuthUI.strings | 269 + .../es-US.lproj/FirebaseAuthUI.strings | 269 + .../es-UY.lproj/FirebaseAuthUI.strings | 269 + .../es-VE.lproj/FirebaseAuthUI.strings | 269 + .../Strings/es.lproj/FirebaseAuthUI.strings | 269 + .../Strings/fa.lproj/FirebaseAuthUI.strings | 269 + .../Strings/fi.lproj/FirebaseAuthUI.strings | 270 + .../Strings/fil.lproj/FirebaseAuthUI.strings | 269 + .../fr-CH.lproj/FirebaseAuthUI.strings | 269 + .../Strings/fr.lproj/FirebaseAuthUI.strings | 269 + .../Strings/gsw.lproj/FirebaseAuthUI.strings | 269 + .../Strings/gu.lproj/FirebaseAuthUI.strings | 269 + .../Strings/he.lproj/FirebaseAuthUI.strings | 269 + .../Strings/hi.lproj/FirebaseAuthUI.strings | 269 + .../Strings/hr.lproj/FirebaseAuthUI.strings | 269 + .../Strings/hu.lproj/FirebaseAuthUI.strings | 269 + .../Strings/id.lproj/FirebaseAuthUI.strings | 269 + .../Strings/it.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ja.lproj/FirebaseAuthUI.strings | 269 + .../Strings/kn.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ko.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ln.lproj/FirebaseAuthUI.strings | 269 + .../Strings/lt.lproj/FirebaseAuthUI.strings | 269 + .../Strings/lv.lproj/FirebaseAuthUI.strings | 269 + .../Strings/mr.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ms.lproj/FirebaseAuthUI.strings | 269 + .../Strings/nb.lproj/FirebaseAuthUI.strings | 269 + .../Strings/nl.lproj/FirebaseAuthUI.strings | 269 + .../nn-NO.lproj/FirebaseAuthUI.strings | 269 + .../Strings/pl.lproj/FirebaseAuthUI.strings | 269 + .../pt-BR.lproj/FirebaseAuthUI.strings | 269 + .../pt-PT.lproj/FirebaseAuthUI.strings | 269 + .../Strings/pt.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ro.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ru.lproj/FirebaseAuthUI.strings | 269 + .../Strings/sk.lproj/FirebaseAuthUI.strings | 269 + .../Strings/sl.lproj/FirebaseAuthUI.strings | 269 + .../sr-Latn.lproj/FirebaseAuthUI.strings | 269 + .../Strings/sr.lproj/FirebaseAuthUI.strings | 269 + .../Strings/sv.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ta.lproj/FirebaseAuthUI.strings | 269 + .../Strings/th.lproj/FirebaseAuthUI.strings | 269 + .../Strings/tr.lproj/FirebaseAuthUI.strings | 269 + .../Strings/uk.lproj/FirebaseAuthUI.strings | 269 + .../Strings/ur.lproj/FirebaseAuthUI.strings | 269 + .../Strings/vi.lproj/FirebaseAuthUI.strings | 269 + .../zh-Hans.lproj/FirebaseAuthUI.strings | 269 + .../zh-Hant-TW.lproj/FirebaseAuthUI.strings | 269 + .../zh-Hant.lproj/FirebaseAuthUI.strings | 269 + .../Strings/zh.lproj/FirebaseAuthUI.strings | 269 + .../FirebaseGoogleAuthUI/FUIGoogleAuth.h | 73 + .../FirebaseGoogleAuthUI/FUIGoogleAuth.m | 222 + .../FirebaseGoogleAuthUI.h | 25 + .../Resources/ic_google.png | Bin 0 -> 549 bytes .../Resources/ic_google@2x.png | Bin 0 -> 999 bytes .../Resources/ic_google@3x.png | Bin 0 -> 1449 bytes .../ar.lproj/FirebaseGoogleAuthUI.strings | 2 + .../bg.lproj/FirebaseGoogleAuthUI.strings | 2 + .../bn.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ca.lproj/FirebaseGoogleAuthUI.strings | 2 + .../cs.lproj/FirebaseGoogleAuthUI.strings | 2 + .../da.lproj/FirebaseGoogleAuthUI.strings | 2 + .../de-AT.lproj/FirebaseGoogleAuthUI.strings | 2 + .../de-CH.lproj/FirebaseGoogleAuthUI.strings | 2 + .../de.lproj/FirebaseGoogleAuthUI.strings | 2 + .../el.lproj/FirebaseGoogleAuthUI.strings | 2 + .../en-AU.lproj/FirebaseGoogleAuthUI.strings | 2 + .../en-CA.lproj/FirebaseGoogleAuthUI.strings | 2 + .../en-GB.lproj/FirebaseGoogleAuthUI.strings | 2 + .../en-IE.lproj/FirebaseGoogleAuthUI.strings | 2 + .../en-IN.lproj/FirebaseGoogleAuthUI.strings | 2 + .../en-SG.lproj/FirebaseGoogleAuthUI.strings | 2 + .../en-ZA.lproj/FirebaseGoogleAuthUI.strings | 2 + .../en.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-419.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-AR.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-BO.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-CL.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-CO.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-CR.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-DO.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-EC.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-GT.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-HN.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-MX.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-NI.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-PA.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-PE.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-PR.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-PY.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-SV.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-US.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-UY.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es-VE.lproj/FirebaseGoogleAuthUI.strings | 2 + .../es.lproj/FirebaseGoogleAuthUI.strings | 2 + .../fa.lproj/FirebaseGoogleAuthUI.strings | 2 + .../fi.lproj/FirebaseGoogleAuthUI.strings | 2 + .../fil.lproj/FirebaseGoogleAuthUI.strings | 2 + .../fr-CH.lproj/FirebaseGoogleAuthUI.strings | 2 + .../fr.lproj/FirebaseGoogleAuthUI.strings | 2 + .../gsw.lproj/FirebaseGoogleAuthUI.strings | 2 + .../gu.lproj/FirebaseGoogleAuthUI.strings | 2 + .../he.lproj/FirebaseGoogleAuthUI.strings | 2 + .../hi.lproj/FirebaseGoogleAuthUI.strings | 2 + .../hr.lproj/FirebaseGoogleAuthUI.strings | 2 + .../hu.lproj/FirebaseGoogleAuthUI.strings | 2 + .../id.lproj/FirebaseGoogleAuthUI.strings | 2 + .../it.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ja.lproj/FirebaseGoogleAuthUI.strings | 2 + .../kn.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ko.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ln.lproj/FirebaseGoogleAuthUI.strings | 2 + .../lt.lproj/FirebaseGoogleAuthUI.strings | 2 + .../lv.lproj/FirebaseGoogleAuthUI.strings | 2 + .../mr.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ms.lproj/FirebaseGoogleAuthUI.strings | 2 + .../nb.lproj/FirebaseGoogleAuthUI.strings | 2 + .../nl.lproj/FirebaseGoogleAuthUI.strings | 2 + .../nn-NO.lproj/FirebaseGoogleAuthUI.strings | 2 + .../pl.lproj/FirebaseGoogleAuthUI.strings | 2 + .../pt-BR.lproj/FirebaseGoogleAuthUI.strings | 2 + .../pt-PT.lproj/FirebaseGoogleAuthUI.strings | 2 + .../pt.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ro.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ru.lproj/FirebaseGoogleAuthUI.strings | 2 + .../sk.lproj/FirebaseGoogleAuthUI.strings | 2 + .../sl.lproj/FirebaseGoogleAuthUI.strings | 2 + .../FirebaseGoogleAuthUI.strings | 2 + .../sr.lproj/FirebaseGoogleAuthUI.strings | 2 + .../sv.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ta.lproj/FirebaseGoogleAuthUI.strings | 2 + .../th.lproj/FirebaseGoogleAuthUI.strings | 2 + .../tr.lproj/FirebaseGoogleAuthUI.strings | 2 + .../uk.lproj/FirebaseGoogleAuthUI.strings | 2 + .../ur.lproj/FirebaseGoogleAuthUI.strings | 2 + .../vi.lproj/FirebaseGoogleAuthUI.strings | 2 + .../FirebaseGoogleAuthUI.strings | 2 + .../FirebaseGoogleAuthUI.strings | 2 + .../FirebaseGoogleAuthUI.strings | 2 + .../zh.lproj/FirebaseGoogleAuthUI.strings | 2 + MyExperiences copy/Pods/FirebaseUI/LICENSE | 202 + MyExperiences copy/Pods/FirebaseUI/README.md | 154 + MyExperiences copy/Pods/GTMAppAuth/LICENSE | 202 + MyExperiences copy/Pods/GTMAppAuth/README.md | 385 + .../Pods/GTMAppAuth/Source/GTMAppAuth.h | 30 + .../GTMAppAuthFetcherAuthorization+Keychain.h | 52 + .../GTMAppAuthFetcherAuthorization+Keychain.m | 46 + .../Source/GTMAppAuthFetcherAuthorization.h | 153 + .../Source/GTMAppAuthFetcherAuthorization.m | 492 + .../Pods/GTMAppAuth/Source/GTMKeychain.h | 62 + .../GTMOAuth2KeychainCompatibility.h | 131 + .../GTMOAuth2KeychainCompatibility.m | 325 + .../GTMAppAuth/Source/iOS/GTMKeychain_iOS.m | 287 + .../Pods/GTMSessionFetcher/LICENSE | 202 + .../Pods/GTMSessionFetcher/README.md | 23 + .../Source/GTMGatherInputStream.h | 52 + .../Source/GTMGatherInputStream.m | 185 + .../Source/GTMMIMEDocument.h | 148 + .../Source/GTMMIMEDocument.m | 631 ++ .../Source/GTMReadMonitorInputStream.h | 49 + .../Source/GTMReadMonitorInputStream.m | 190 + .../Source/GTMSessionFetcher.h | 1332 +++ .../Source/GTMSessionFetcher.m | 4670 ++++++++ .../Source/GTMSessionFetcherLogging.h | 112 + .../Source/GTMSessionFetcherLogging.m | 982 ++ .../Source/GTMSessionFetcherService.h | 196 + .../Source/GTMSessionFetcherService.m | 1381 +++ .../Source/GTMSessionUploadFetcher.h | 175 + .../Source/GTMSessionUploadFetcher.m | 1989 ++++ .../GoogleAppMeasurement | Bin 0 -> 41669680 bytes .../Modules/module.modulemap | 11 + .../GDTCORLibrary/GDTCORAssert.m | 36 + .../GDTCORLibrary/GDTCORClock.m | 164 + .../GDTCORLibrary/GDTCORConsoleLogger.m | 55 + .../GDTCORLibrary/GDTCORDataFuture.m | 59 + .../GDTCORLibrary/GDTCOREvent.m | 258 + .../GDTCORLibrary/GDTCORFlatFileStorage.m | 411 + .../GDTCORLibrary/GDTCORLifecycle.m | 119 + .../GDTCORLibrary/GDTCORPlatform.m | 555 + .../GDTCORLibrary/GDTCORReachability.m | 125 + .../GDTCORLibrary/GDTCORRegistrar.m | 191 + .../GDTCORLibrary/GDTCORTransformer.m | 104 + .../GDTCORLibrary/GDTCORTransport.m | 92 + .../GDTCORLibrary/GDTCORUploadCoordinator.m | 275 + .../GDTCORLibrary/GDTCORUploadPackage.m | 193 + .../GDTCORLibrary/Private/GDTCORDataFuture.h | 36 + .../Private/GDTCOREvent_Private.h | 48 + .../Private/GDTCORFlatFileStorage.h | 59 + .../Private/GDTCORReachability_Private.h | 30 + .../Private/GDTCORRegistrar_Private.h | 39 + .../GDTCORLibrary/Private/GDTCORTransformer.h | 56 + .../Private/GDTCORTransformer_Private.h | 28 + .../Private/GDTCORTransport_Private.h | 39 + .../Private/GDTCORUploadCoordinator.h | 75 + .../Private/GDTCORUploadPackage_Private.h | 30 + .../GDTCORLibrary/Public/GDTCORAssert.h | 95 + .../GDTCORLibrary/Public/GDTCORClock.h | 57 + .../Public/GDTCORConsoleLogger.h | 143 + .../GDTCORLibrary/Public/GDTCOREvent.h | 89 + .../Public/GDTCOREventDataObject.h | 36 + .../Public/GDTCOREventTransformer.h | 38 + .../GDTCORLibrary/Public/GDTCORLifecycle.h | 63 + .../GDTCORLibrary/Public/GDTCORPlatform.h | 204 + .../GDTCORLibrary/Public/GDTCORPrioritizer.h | 79 + .../GDTCORLibrary/Public/GDTCORReachability.h | 31 + .../GDTCORLibrary/Public/GDTCORRegistrar.h | 58 + .../Public/GDTCORStorageProtocol.h | 78 + .../GDTCORLibrary/Public/GDTCORTargets.h | 37 + .../GDTCORLibrary/Public/GDTCORTransport.h | 91 + .../Public/GDTCORUploadPackage.h | 76 + .../GDTCORLibrary/Public/GDTCORUploader.h | 48 + .../Public/GoogleDataTransport.h | 28 + .../Pods/GoogleDataTransport/LICENSE | 202 + .../Pods/GoogleDataTransport/README.md | 307 + .../GDTCCTLibrary/GDTCCTCompressionHelper.m | 95 + .../GDTCCTLibrary/GDTCCTNanopbHelpers.m | 275 + .../GDTCCTLibrary/GDTCCTPrioritizer.m | 426 + .../GDTCCTLibrary/GDTCCTUploader.m | 441 + .../GDTCCTLibrary/GDTCOREvent+GDTCCTSupport.m | 236 + .../Private/GDTCCTCompressionHelper.h | 40 + .../Private/GDTCCTNanopbHelpers.h | 128 + .../GDTCCTLibrary/Private/GDTCCTPrioritizer.h | 53 + .../GDTCCTLibrary/Private/GDTCCTUploader.h | 63 + .../Protogen/nanopb/cct.nanopb.c | 128 + .../Protogen/nanopb/cct.nanopb.h | 281 + .../Public/GDTCOREvent+GDTCCTSupport.h | 51 + .../GoogleDataTransportCCTSupport/LICENSE | 202 + .../GoogleDataTransportCCTSupport/README.md | 311 + .../Pods/GoogleSignIn/.cocoapods.yml | 5 + .../Pods/GoogleSignIn/CHANGELOG.md | 132 + .../GoogleSignIn.framework/GoogleSignIn | Bin 0 -> 3532688 bytes .../Headers/GIDAuthentication.h | 65 + .../Headers/GIDGoogleUser.h | 39 + .../Headers/GIDProfileData.h | 37 + .../Headers/GIDSignIn.h | 170 + .../Headers/GIDSignInButton.h | 53 + .../Headers/GoogleSignIn.h | 5 + .../Modules/module.modulemap | 13 + .../Pods/GoogleSignIn/README.md | 18 + .../Resources/GoogleSignIn.bundle/Info.plist | 24 + .../GoogleSignIn.bundle/Roboto-Bold.ttf | Bin 0 -> 127744 bytes .../ar.lproj/GoogleSignIn.strings | 44 + .../ca.lproj/GoogleSignIn.strings | 44 + .../cs.lproj/GoogleSignIn.strings | 44 + .../da.lproj/GoogleSignIn.strings | 44 + .../de.lproj/GoogleSignIn.strings | 44 + .../el.lproj/GoogleSignIn.strings | 44 + .../en.lproj/GoogleSignIn.strings | 32 + .../en_GB.lproj/GoogleSignIn.strings | 44 + .../es.lproj/GoogleSignIn.strings | 44 + .../es_MX.lproj/GoogleSignIn.strings | 44 + .../fi.lproj/GoogleSignIn.strings | 44 + .../fr.lproj/GoogleSignIn.strings | 44 + .../fr_CA.lproj/GoogleSignIn.strings | 44 + .../Resources/GoogleSignIn.bundle/google.png | Bin 0 -> 572 bytes .../GoogleSignIn.bundle/google@2x.png | Bin 0 -> 987 bytes .../GoogleSignIn.bundle/google@3x.png | Bin 0 -> 1622 bytes .../he.lproj/GoogleSignIn.strings | 44 + .../hi.lproj/GoogleSignIn.strings | 44 + .../hr.lproj/GoogleSignIn.strings | 44 + .../hu.lproj/GoogleSignIn.strings | 44 + .../id.lproj/GoogleSignIn.strings | 44 + .../it.lproj/GoogleSignIn.strings | 44 + .../ja.lproj/GoogleSignIn.strings | 44 + .../ko.lproj/GoogleSignIn.strings | 44 + .../ms.lproj/GoogleSignIn.strings | 44 + .../nb.lproj/GoogleSignIn.strings | 44 + .../nl.lproj/GoogleSignIn.strings | 44 + .../pl.lproj/GoogleSignIn.strings | 44 + .../pt.lproj/GoogleSignIn.strings | 44 + .../pt_BR.lproj/GoogleSignIn.strings | 44 + .../pt_PT.lproj/GoogleSignIn.strings | 44 + .../ro.lproj/GoogleSignIn.strings | 44 + .../ru.lproj/GoogleSignIn.strings | 44 + .../sk.lproj/GoogleSignIn.strings | 44 + .../sv.lproj/GoogleSignIn.strings | 44 + .../th.lproj/GoogleSignIn.strings | 44 + .../tr.lproj/GoogleSignIn.strings | 44 + .../uk.lproj/GoogleSignIn.strings | 44 + .../vi.lproj/GoogleSignIn.strings | 44 + .../zh_CN.lproj/GoogleSignIn.strings | 44 + .../zh_TW.lproj/GoogleSignIn.strings | 44 + .../GULAppDelegateSwizzler.m | 1038 ++ .../Internal/GULAppDelegateSwizzler_Private.h | 55 + .../Private/GULAppDelegateSwizzler.h | 107 + .../Private/GULApplication.h | 50 + .../GoogleUtilities/Common/GULLoggerCodes.h | 56 + .../Environment/GULHeartbeatDateStorage.m | 140 + .../Environment/GULSecureCoding.m | 103 + .../Public/GULHeartbeatDateStorage.h | 49 + .../Environment/Public/GULKeychainStorage.h | 79 + .../Environment/Public/GULKeychainUtils.h | 61 + .../Environment/Public/GULSecureCoding.h | 36 + .../SecureStorage/GULKeychainStorage.m | 192 + .../SecureStorage/GULKeychainUtils.m | 113 + .../third_party/GULAppEnvironmentUtil.h | 46 + .../third_party/GULAppEnvironmentUtil.m | 267 + .../GoogleUtilities/GoogleUtilities/LICENSE | 247 + .../GoogleUtilities/Logger/GULLogger.m | 214 + .../Logger/Private/GULLogger.h | 159 + .../Logger/Public/GULLoggerLevel.h | 37 + .../MethodSwizzler/GULSwizzler.m | 153 + .../Private/GULOriginalIMPConvenienceMacros.h | 207 + .../MethodSwizzler/Private/GULSwizzler.h | 71 + .../NSData+zlib/GULNSData+zlib.h | 49 + .../NSData+zlib/GULNSData+zlib.m | 207 + .../Network/GULMutableDictionary.m | 101 + .../GoogleUtilities/Network/GULNetwork.m | 389 + .../Network/GULNetworkConstants.m | 40 + .../Network/GULNetworkURLSession.m | 762 ++ .../Network/Private/GULMutableDictionary.h | 46 + .../Network/Private/GULNetwork.h | 87 + .../Network/Private/GULNetworkConstants.h | 79 + .../Private/GULNetworkLoggerProtocol.h | 51 + .../Network/Private/GULNetworkMessageCode.h | 47 + .../Network/Private/GULNetworkURLSession.h | 62 + .../GULReachabilityChecker+Internal.h | 47 + .../Reachability/GULReachabilityChecker.m | 263 + .../Private/GULReachabilityChecker.h | 79 + .../Private/GULReachabilityMessageCode.h | 29 + .../GULSceneDelegateSwizzler.m | 438 + .../GULSceneDelegateSwizzler_Private.h | 48 + .../Private/GULSceneDelegateSwizzler.h | 73 + .../UserDefaults/GULUserDefaults.m | 213 + .../UserDefaults/Private/GULUserDefaults.h | 110 + .../Pods/GoogleUtilities/README.md | 282 + .../Pods/Headers/Private/Firebase/Firebase.h | 1 + .../Pods/Headers/Public/Firebase/Firebase.h | 1 + MyExperiences copy/Pods/Manifest.lock | 165 + .../Pods/Pods.xcodeproj/project.pbxproj | 9663 +++++++++++++++++ MyExperiences copy/Pods/PromisesObjC/LICENSE | 202 + .../Pods/PromisesObjC/README.md | 60 + .../Sources/FBLPromises/FBLPromise+All.m | 86 + .../Sources/FBLPromises/FBLPromise+Always.m | 58 + .../Sources/FBLPromises/FBLPromise+Any.m | 112 + .../Sources/FBLPromises/FBLPromise+Async.m | 70 + .../Sources/FBLPromises/FBLPromise+Await.m | 48 + .../Sources/FBLPromises/FBLPromise+Catch.m | 55 + .../Sources/FBLPromises/FBLPromise+Delay.m | 59 + .../Sources/FBLPromises/FBLPromise+Do.m | 59 + .../Sources/FBLPromises/FBLPromise+Race.m | 65 + .../Sources/FBLPromises/FBLPromise+Recover.m | 54 + .../Sources/FBLPromises/FBLPromise+Reduce.m | 61 + .../Sources/FBLPromises/FBLPromise+Retry.m | 128 + .../Sources/FBLPromises/FBLPromise+Testing.m | 55 + .../Sources/FBLPromises/FBLPromise+Then.m | 50 + .../Sources/FBLPromises/FBLPromise+Timeout.m | 64 + .../Sources/FBLPromises/FBLPromise+Validate.m | 56 + .../Sources/FBLPromises/FBLPromise+Wrap.m | 420 + .../Sources/FBLPromises/FBLPromise.m | 299 + .../Sources/FBLPromises/FBLPromiseError.m | 19 + .../FBLPromises/include/FBLPromise+All.h | 63 + .../FBLPromises/include/FBLPromise+Always.h | 54 + .../FBLPromises/include/FBLPromise+Any.h | 69 + .../FBLPromises/include/FBLPromise+Async.h | 60 + .../FBLPromises/include/FBLPromise+Await.h | 32 + .../FBLPromises/include/FBLPromise+Catch.h | 59 + .../FBLPromises/include/FBLPromise+Delay.h | 59 + .../FBLPromises/include/FBLPromise+Do.h | 55 + .../FBLPromises/include/FBLPromise+Race.h | 62 + .../FBLPromises/include/FBLPromise+Recover.h | 60 + .../FBLPromises/include/FBLPromise+Reduce.h | 71 + .../FBLPromises/include/FBLPromise+Retry.h | 165 + .../FBLPromises/include/FBLPromise+Testing.h | 57 + .../FBLPromises/include/FBLPromise+Then.h | 63 + .../FBLPromises/include/FBLPromise+Timeout.h | 57 + .../FBLPromises/include/FBLPromise+Validate.h | 60 + .../FBLPromises/include/FBLPromise+Wrap.h | 316 + .../Sources/FBLPromises/include/FBLPromise.h | 93 + .../FBLPromises/include/FBLPromiseError.h | 43 + .../FBLPromises/include/FBLPromisePrivate.h | 66 + .../Sources/FBLPromises/include/FBLPromises.h | 32 + .../AppAuth/AppAuth-Info.plist | 26 + .../AppAuth/AppAuth-dummy.m | 5 + .../AppAuth/AppAuth-prefix.pch | 12 + .../AppAuth/AppAuth-umbrella.h | 84 + .../AppAuth/AppAuth.debug.xcconfig | 10 + .../AppAuth/AppAuth.modulemap | 6 + .../AppAuth/AppAuth.release.xcconfig | 10 + .../Firebase/Firebase.debug.xcconfig | 12 + .../Firebase/Firebase.release.xcconfig | 12 + .../FirebaseAnalytics.debug.xcconfig | 11 + .../FirebaseAnalytics.release.xcconfig | 11 + .../FirebaseAuth/FirebaseAuth-Info.plist | 26 + .../FirebaseAuth/FirebaseAuth-dummy.m | 5 + .../FirebaseAuth/FirebaseAuth-umbrella.h | 50 + .../FirebaseAuth/FirebaseAuth.debug.xcconfig | 12 + .../FirebaseAuth/FirebaseAuth.modulemap | 6 + .../FirebaseAuth.release.xcconfig | 12 + .../FirebaseCore/FirebaseCore-Info.plist | 26 + .../FirebaseCore/FirebaseCore-dummy.m | 5 + .../FirebaseCore/FirebaseCore-umbrella.h | 21 + .../FirebaseCore/FirebaseCore.debug.xcconfig | 13 + .../FirebaseCore/FirebaseCore.modulemap | 6 + .../FirebaseCore.release.xcconfig | 13 + .../FirebaseCoreDiagnostics-Info.plist | 26 + .../FirebaseCoreDiagnostics-dummy.m | 5 + .../FirebaseCoreDiagnostics-umbrella.h | 19 + .../FirebaseCoreDiagnostics.debug.xcconfig | 14 + .../FirebaseCoreDiagnostics.modulemap | 6 + .../FirebaseCoreDiagnostics.release.xcconfig | 14 + .../FirebaseDatabase-Info.plist | 26 + .../FirebaseDatabase/FirebaseDatabase-dummy.m | 5 + .../FirebaseDatabase-umbrella.h | 25 + .../FirebaseDatabase.debug.xcconfig | 12 + .../FirebaseDatabase.modulemap | 6 + .../FirebaseDatabase.release.xcconfig | 12 + .../FirebaseInstallations-Info.plist | 26 + .../FirebaseInstallations-dummy.m | 5 + .../FirebaseInstallations-umbrella.h | 21 + .../FirebaseInstallations.debug.xcconfig | 12 + .../FirebaseInstallations.modulemap | 6 + .../FirebaseInstallations.release.xcconfig | 12 + .../FirebaseStorage-Info.plist | 26 + .../FirebaseStorage/FirebaseStorage-dummy.m | 5 + .../FirebaseStorage-umbrella.h | 27 + .../FirebaseStorage.debug.xcconfig | 12 + .../FirebaseStorage/FirebaseStorage.modulemap | 6 + .../FirebaseStorage.release.xcconfig | 12 + .../FirebaseUI/FirebaseUI-Info.plist | 26 + .../FirebaseUI/FirebaseUI-dummy.m | 5 + .../FirebaseUI/FirebaseUI-prefix.pch | 12 + .../FirebaseUI/FirebaseUI-umbrella.h | 34 + .../FirebaseUI/FirebaseUI.debug.xcconfig | 11 + .../FirebaseUI/FirebaseUI.modulemap | 6 + .../FirebaseUI/FirebaseUI.release.xcconfig | 11 + ...undle-FirebaseAuthUI-FirebaseUI-Info.plist | 24 + ...FirebaseGoogleAuthUI-FirebaseUI-Info.plist | 24 + .../GTMAppAuth/GTMAppAuth-Info.plist | 26 + .../GTMAppAuth/GTMAppAuth-dummy.m | 5 + .../GTMAppAuth/GTMAppAuth-prefix.pch | 12 + .../GTMAppAuth/GTMAppAuth-umbrella.h | 21 + .../GTMAppAuth/GTMAppAuth.debug.xcconfig | 11 + .../GTMAppAuth/GTMAppAuth.modulemap | 6 + .../GTMAppAuth/GTMAppAuth.release.xcconfig | 11 + .../GTMSessionFetcher-Info.plist | 26 + .../GTMSessionFetcher-dummy.m | 5 + .../GTMSessionFetcher-prefix.pch | 12 + .../GTMSessionFetcher-umbrella.h | 23 + .../GTMSessionFetcher.debug.xcconfig | 10 + .../GTMSessionFetcher.modulemap | 6 + .../GTMSessionFetcher.release.xcconfig | 10 + .../GoogleAppMeasurement.debug.xcconfig | 11 + .../GoogleAppMeasurement.release.xcconfig | 11 + .../GoogleDataTransport-Info.plist | 26 + .../GoogleDataTransport-dummy.m | 5 + .../GoogleDataTransport-umbrella.h | 33 + .../GoogleDataTransport.debug.xcconfig | 13 + .../GoogleDataTransport.modulemap | 6 + .../GoogleDataTransport.release.xcconfig | 13 + .../GoogleDataTransportCCTSupport-Info.plist | 26 + .../GoogleDataTransportCCTSupport-dummy.m | 5 + .../GoogleDataTransportCCTSupport-umbrella.h | 17 + ...ogleDataTransportCCTSupport.debug.xcconfig | 14 + .../GoogleDataTransportCCTSupport.modulemap | 6 + ...leDataTransportCCTSupport.release.xcconfig | 14 + .../GoogleSignIn/GoogleSignIn.debug.xcconfig | 11 + .../GoogleSignIn.release.xcconfig | 11 + .../GoogleUtilities-Info.plist | 26 + .../GoogleUtilities/GoogleUtilities-dummy.m | 5 + .../GoogleUtilities-prefix.pch | 12 + .../GoogleUtilities-umbrella.h | 19 + .../GoogleUtilities.debug.xcconfig | 13 + .../GoogleUtilities/GoogleUtilities.modulemap | 6 + .../GoogleUtilities.release.xcconfig | 13 + .../Pods-MyExperiences-Info.plist | 26 + ...ds-MyExperiences-acknowledgements.markdown | 3205 ++++++ .../Pods-MyExperiences-acknowledgements.plist | 3351 ++++++ .../Pods-MyExperiences-dummy.m | 5 + ...es-frameworks-Debug-input-files.xcfilelist | 8 + ...s-frameworks-Debug-output-files.xcfilelist | 7 + ...-frameworks-Release-input-files.xcfilelist | 8 + ...frameworks-Release-output-files.xcfilelist | 7 + .../Pods-MyExperiences-frameworks.sh | 219 + ...ces-resources-Debug-input-files.xcfilelist | 4 + ...es-resources-Debug-output-files.xcfilelist | 3 + ...s-resources-Release-input-files.xcfilelist | 4 + ...-resources-Release-output-files.xcfilelist | 3 + .../Pods-MyExperiences-resources.sh | 133 + .../Pods-MyExperiences-umbrella.h | 16 + .../Pods-MyExperiences.debug.xcconfig | 10 + .../Pods-MyExperiences.modulemap | 6 + .../Pods-MyExperiences.release.xcconfig | 10 + .../PromisesObjC/PromisesObjC-Info.plist | 26 + .../PromisesObjC/PromisesObjC-dummy.m | 5 + .../PromisesObjC/PromisesObjC-umbrella.h | 36 + .../PromisesObjC/PromisesObjC.debug.xcconfig | 10 + .../PromisesObjC/PromisesObjC.modulemap | 6 + .../PromisesObjC.release.xcconfig | 10 + .../leveldb-library-Info.plist | 26 + .../leveldb-library/leveldb-library-dummy.m | 5 + .../leveldb-library-prefix.pch | 12 + .../leveldb-library-umbrella.h | 31 + .../leveldb-library.debug.xcconfig | 13 + .../leveldb-library/leveldb-library.modulemap | 6 + .../leveldb-library.release.xcconfig | 13 + .../nanopb/nanopb-Info.plist | 26 + .../nanopb/nanopb-dummy.m | 5 + .../nanopb/nanopb-prefix.pch | 12 + .../nanopb/nanopb-umbrella.h | 26 + .../nanopb/nanopb.debug.xcconfig | 9 + .../nanopb/nanopb.modulemap | 6 + .../nanopb/nanopb.release.xcconfig | 9 + .../Pods/leveldb-library/LICENSE | 27 + .../Pods/leveldb-library/README.md | 225 + .../Pods/leveldb-library/db/builder.cc | 79 + .../Pods/leveldb-library/db/builder.h | 30 + .../Pods/leveldb-library/db/c.cc | 566 + .../Pods/leveldb-library/db/db_impl.cc | 1550 +++ .../Pods/leveldb-library/db/db_impl.h | 216 + .../Pods/leveldb-library/db/db_iter.cc | 309 + .../Pods/leveldb-library/db/db_iter.h | 26 + .../Pods/leveldb-library/db/dbformat.cc | 140 + .../Pods/leveldb-library/db/dbformat.h | 218 + .../Pods/leveldb-library/db/dumpfile.cc | 232 + .../Pods/leveldb-library/db/filename.cc | 141 + .../Pods/leveldb-library/db/filename.h | 84 + .../Pods/leveldb-library/db/log_format.h | 35 + .../Pods/leveldb-library/db/log_reader.cc | 274 + .../Pods/leveldb-library/db/log_reader.h | 112 + .../Pods/leveldb-library/db/log_writer.cc | 111 + .../Pods/leveldb-library/db/log_writer.h | 54 + .../Pods/leveldb-library/db/memtable.cc | 136 + .../Pods/leveldb-library/db/memtable.h | 87 + .../Pods/leveldb-library/db/repair.cc | 450 + .../Pods/leveldb-library/db/skiplist.h | 382 + .../Pods/leveldb-library/db/snapshot.h | 95 + .../Pods/leveldb-library/db/table_cache.cc | 120 + .../Pods/leveldb-library/db/table_cache.h | 58 + .../Pods/leveldb-library/db/version_edit.cc | 260 + .../Pods/leveldb-library/db/version_edit.h | 106 + .../Pods/leveldb-library/db/version_set.cc | 1585 +++ .../Pods/leveldb-library/db/version_set.h | 393 + .../Pods/leveldb-library/db/write_batch.cc | 150 + .../leveldb-library/db/write_batch_internal.h | 45 + .../Pods/leveldb-library/include/leveldb/c.h | 270 + .../leveldb-library/include/leveldb/cache.h | 111 + .../include/leveldb/comparator.h | 64 + .../Pods/leveldb-library/include/leveldb/db.h | 167 + .../include/leveldb/dumpfile.h | 28 + .../leveldb-library/include/leveldb/env.h | 387 + .../leveldb-library/include/leveldb/export.h | 33 + .../include/leveldb/filter_policy.h | 72 + .../include/leveldb/iterator.h | 112 + .../leveldb-library/include/leveldb/options.h | 187 + .../leveldb-library/include/leveldb/slice.h | 115 + .../leveldb-library/include/leveldb/status.h | 122 + .../leveldb-library/include/leveldb/table.h | 84 + .../include/leveldb/table_builder.h | 93 + .../include/leveldb/write_batch.h | 83 + .../Pods/leveldb-library/port/port.h | 19 + .../Pods/leveldb-library/port/port_example.h | 104 + .../Pods/leveldb-library/port/port_stdcxx.h | 153 + .../leveldb-library/port/thread_annotations.h | 108 + .../Pods/leveldb-library/table/block.cc | 266 + .../Pods/leveldb-library/table/block.h | 44 + .../leveldb-library/table/block_builder.cc | 108 + .../leveldb-library/table/block_builder.h | 55 + .../leveldb-library/table/filter_block.cc | 106 + .../Pods/leveldb-library/table/filter_block.h | 69 + .../Pods/leveldb-library/table/format.cc | 141 + .../Pods/leveldb-library/table/format.h | 100 + .../Pods/leveldb-library/table/iterator.cc | 76 + .../leveldb-library/table/iterator_wrapper.h | 92 + .../Pods/leveldb-library/table/merger.cc | 191 + .../Pods/leveldb-library/table/merger.h | 26 + .../Pods/leveldb-library/table/table.cc | 273 + .../leveldb-library/table/table_builder.cc | 265 + .../table/two_level_iterator.cc | 171 + .../table/two_level_iterator.h | 31 + .../Pods/leveldb-library/util/arena.cc | 66 + .../Pods/leveldb-library/util/arena.h | 71 + .../Pods/leveldb-library/util/bloom.cc | 92 + .../Pods/leveldb-library/util/cache.cc | 400 + .../Pods/leveldb-library/util/coding.cc | 192 + .../Pods/leveldb-library/util/coding.h | 104 + .../Pods/leveldb-library/util/comparator.cc | 73 + .../Pods/leveldb-library/util/crc32c.cc | 380 + .../Pods/leveldb-library/util/crc32c.h | 43 + .../Pods/leveldb-library/util/env.cc | 92 + .../Pods/leveldb-library/util/env_posix.cc | 876 ++ .../util/env_posix_test_helper.h | 28 + .../util/env_windows_test_helper.h | 25 + .../leveldb-library/util/filter_policy.cc | 11 + .../Pods/leveldb-library/util/hash.cc | 55 + .../Pods/leveldb-library/util/hash.h | 19 + .../Pods/leveldb-library/util/histogram.cc | 272 + .../Pods/leveldb-library/util/histogram.h | 44 + .../Pods/leveldb-library/util/logging.cc | 85 + .../Pods/leveldb-library/util/logging.h | 45 + .../Pods/leveldb-library/util/mutexlock.h | 39 + .../Pods/leveldb-library/util/no_destructor.h | 46 + .../Pods/leveldb-library/util/options.cc | 14 + .../Pods/leveldb-library/util/posix_logger.h | 130 + .../Pods/leveldb-library/util/random.h | 63 + .../Pods/leveldb-library/util/status.cc | 77 + .../Pods/leveldb-library/util/testharness.cc | 81 + .../Pods/leveldb-library/util/testharness.h | 141 + .../Pods/leveldb-library/util/testutil.h | 66 + .../leveldb-library/util/windows_logger.h | 124 + MyExperiences copy/Pods/nanopb/LICENSE.txt | 20 + MyExperiences copy/Pods/nanopb/README.md | 71 + MyExperiences copy/Pods/nanopb/pb.h | 599 + MyExperiences copy/Pods/nanopb/pb_common.c | 97 + MyExperiences copy/Pods/nanopb/pb_common.h | 42 + MyExperiences copy/Pods/nanopb/pb_decode.c | 1548 +++ MyExperiences copy/Pods/nanopb/pb_decode.h | 178 + MyExperiences copy/Pods/nanopb/pb_encode.c | 902 ++ MyExperiences copy/Pods/nanopb/pb_encode.h | 170 + 1511 files changed, 197601 insertions(+) create mode 100644 MyExperiences copy/MyExperiences.xcodeproj/project.pbxproj create mode 100644 MyExperiences copy/MyExperiences.xcodeproj/xcshareddata/xcschemes/MyExperiences.xcscheme create mode 100644 MyExperiences copy/MyExperiences/FirebaseConvertible.swift create mode 100644 MyExperiences copy/MyExperiences/GoogleService-Info.plist create mode 100644 MyExperiences copy/MyExperiences/Helpers/UIImage+Scaling.swift create mode 100644 MyExperiences copy/MyExperiences/Info.plist create mode 100644 MyExperiences copy/MyExperiences/LocationHelper.swift create mode 100644 MyExperiences copy/MyExperiences/Models/Author.swift create mode 100644 MyExperiences copy/MyExperiences/Models/Comment.swift create mode 100644 MyExperiences copy/MyExperiences/Models/Post.swift create mode 100644 MyExperiences copy/MyExperiences/PostController.swift create mode 100644 MyExperiences copy/MyExperiences/Resources/AppDelegate.swift create mode 100644 MyExperiences copy/MyExperiences/Resources/Assets.xcassets/00000.imageset/00000.jpeg create mode 100644 MyExperiences copy/MyExperiences/Resources/Assets.xcassets/00000.imageset/Contents.json create mode 100644 MyExperiences copy/MyExperiences/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 MyExperiences copy/MyExperiences/Resources/Assets.xcassets/Contents.json create mode 100644 MyExperiences copy/MyExperiences/Resources/SceneDelegate.swift create mode 100644 MyExperiences copy/MyExperiences/StoryBoards/Base.lproj/LaunchScreen.storyboard create mode 100644 MyExperiences copy/MyExperiences/StoryBoards/Base.lproj/Main.storyboard create mode 100644 MyExperiences copy/MyExperiences/UIImage+Ratio.swift create mode 100644 MyExperiences copy/MyExperiences/User+DictionaryRepresentation.swift create mode 100644 MyExperiences copy/MyExperiences/ViewControllers/CreateANewExperienceViewController.swift create mode 100644 MyExperiences copy/MyExperiences/ViewControllers/MapViewController.swift create mode 100644 MyExperiences copy/MyExperiences/ViewControllers/RecordAudioViewController.swift create mode 100644 MyExperiences copy/MyExperiences/ViewControllers/SignInViewController.swift create mode 100644 MyExperiences copy/Podfile create mode 100644 MyExperiences copy/Podfile.lock create mode 100644 MyExperiences copy/Pods/AppAuth/LICENSE create mode 100644 MyExperiences copy/Pods/AppAuth/README.md create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateChangeDelegate.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateErrorDelegate.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDDefines.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDError.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDError.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgent.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentRequest.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentSession.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopes.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopes.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.m create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.h create mode 100644 MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.m create mode 100755 MyExperiences copy/Pods/Firebase/CoreOnly/Sources/Firebase.h create mode 100755 MyExperiences copy/Pods/Firebase/CoreOnly/Sources/module.modulemap create mode 100644 MyExperiences copy/Pods/Firebase/LICENSE create mode 100644 MyExperiences copy/Pods/Firebase/README.md create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/Modules/module.modulemap create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h create mode 100755 MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/CHANGELOG.md create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/README.md create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRActionCodeSettings.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuth.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDataResult.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDispatcher.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDispatcher.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthOperationType.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSettings.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthTokenResult.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthTokenResult_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuth_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/FirebaseAuthVersion.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactor+Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactor.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion+Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorConstants.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo+Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver+Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession+Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion+Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorGenerator.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo+Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRActionCodeSettings.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAdditionalUserInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuth.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthAPNSTokenType.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthDataResult.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthSettings.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthTokenResult.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthUIDelegate.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIREmailAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRFacebookAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRFederatedAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGameCenterAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGitHubAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGoogleAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactor.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorAssertion.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorResolver.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorSession.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIROAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIROAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneAuthCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorAssertion.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorGenerator.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRTwitterAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUser.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUserInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUserMetadata.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FirebaseAuth.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FirebaseAuthVersion.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRSecureTokenService.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRSecureTokenService.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRAdditionalUserInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRAdditionalUserInfo_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUser.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserInfoImpl.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserInfoImpl.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserMetadata.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserMetadata_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUser_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthInternalErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebView.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebView.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/NSData+FIRBase64.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/NSData+FIRBase64.m create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRAppInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponent.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponentContainer.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponentType.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRDependency.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRErrorCode.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRLibrary.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRLogger.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIROptionsInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FirebaseCoreInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/Interop/Auth/Public/FIRAuthInterop.h create mode 100644 MyExperiences copy/Pods/FirebaseAuth/LICENSE create mode 100644 MyExperiences copy/Pods/FirebaseAuth/README.md create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainerInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfigurationInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRCoreDiagnosticsConnector.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDependency.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRErrors.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponent.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainer.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentType.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDependency.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrorCode.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLibrary.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLogger.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIROptionsInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FirebaseCoreInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRApp.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRConfiguration.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRLoggerLevel.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIROptions.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h create mode 100644 MyExperiences copy/Pods/FirebaseCore/LICENSE create mode 100644 MyExperiences copy/Pods/FirebaseCore/README.md create mode 100644 MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/FIRCoreDiagnostics.m create mode 100644 MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.c create mode 100644 MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h create mode 100644 MyExperiences copy/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h create mode 100644 MyExperiences copy/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h create mode 100644 MyExperiences copy/Pods/FirebaseCoreDiagnostics/LICENSE create mode 100644 MyExperiences copy/Pods/FirebaseCoreDiagnostics/README.md create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDataSnapshot.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabase.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseComponent.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseComponent.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseConfig.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseConfig.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseQuery.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRMutableData.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRServerValue.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRTransactionResult.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDataSnapshot_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabaseQuery_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabaseReference_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabase_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRMutableData_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRTransactionResult_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FTypedefs_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Constants/FConstants.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Constants/FConstants.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FCompoundHash.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FCompoundHash.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FListenProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FListenProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FPersistentConnection.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FPersistentConnection.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQueryParams.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQueryParams.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQuerySpec.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQuerySpec.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRangeMerge.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRangeMerge.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoInfo.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoManager.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoManager.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FServerValues.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FServerValues.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSnapshotHolder.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSnapshotHolder.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSparseSnapshotTree.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSparseSnapshotTree.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncPoint.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncPoint.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncTree.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncTree.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteRecord.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteRecord.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTree.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTree.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTreeRef.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTreeRef.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FAckUserWrite.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FAckUserWrite.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FMerge.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FMerge.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperation.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperationSource.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperationSource.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOverwrite.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOverwrite.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FIRRetryHelper.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FIRRetryHelper.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FImmutableTree.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FImmutableTree.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FPath.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FPath.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTree.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTree.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTreeNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTreeNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCacheNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCacheNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCancelEvent.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCancelEvent.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChange.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChange.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChildEventRegistration.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChildEventRegistration.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FDataEvent.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FDataEvent.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEvent.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRaiser.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRaiser.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRegistration.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FKeepSyncedEventRegistration.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FKeepSyncedEventRegistration.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FValueEventRegistration.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FValueEventRegistration.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FView.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FView.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FViewCache.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FViewCache.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FChildChangeAccumulator.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FChildChangeAccumulator.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FCompleteChildSource.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FIndexedFilter.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FIndexedFilter.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FLimitedFilter.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FLimitedFilter.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FNodeFilter.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FClock.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FClock.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FEventGenerator.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FEventGenerator.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIRDatabaseConfig_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIRDatabaseReference.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIndex.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIndex.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FKeyIndex.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FKeyIndex.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FListenComplete.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FListenComplete.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FMaxNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FMaxNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FNamedNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FNamedNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPathIndex.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPathIndex.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPriorityIndex.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPriorityIndex.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FRangedFilter.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FRangedFilter.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FTransformedEnumerator.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FTransformedEnumerator.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FValueIndex.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FValueIndex.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessor.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessor.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessorResult.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessorResult.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FAuthTokenProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FAuthTokenProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FIRNoopAuthTokenProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FIRNoopAuthTokenProvider.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FCachePolicy.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FCachePolicy.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FLevelDBStorageEngine.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FLevelDBStorageEngine.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPendingPut.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPendingPut.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPersistenceManager.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPersistenceManager.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPruneForest.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPruneForest.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FStorageEngine.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQuery.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQuery.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQueryManager.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQueryManager.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDataEventType.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDataSnapshot.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabase.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabaseQuery.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabaseReference.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRMutableData.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRServerValue.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRTransactionResult.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FirebaseDatabase.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FConnection.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FConnection.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FWebSocketConnection.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FWebSocketConnection.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FChildrenNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FChildrenNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FCompoundWrite.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FCompoundWrite.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FEmptyNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FEmptyNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FIndexedNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FIndexedNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FLeafNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FLeafNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FSnapshotUtilities.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FSnapshotUtilities.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FAtomicNumber.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FAtomicNumber.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FEventEmitter.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FEventEmitter.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FNextPushId.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FNextPushId.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FParsedUrl.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FParsedUrl.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FStringUtilities.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FStringUtilities.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FTypedefs.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FUtilities.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FUtilities.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FValidation.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FValidation.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleBoolBlock.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleBoolBlock.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleCallbackStatus.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleCallbackStatus.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleFirebase.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleFirebase.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleNodePath.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleNodePath.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjectNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjectNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjects.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjects.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleOnDisconnect.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleOnDisconnect.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTuplePathValue.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTuplePathValue.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleRemovedQueriesEvents.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleRemovedQueriesEvents.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleSetIdPath.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleSetIdPath.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleStringNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleStringNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTSN.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTSN.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTransaction.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTransaction.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleUserCallback.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleUserCallback.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FArraySortedDictionary.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FArraySortedDictionary.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedDictionary.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedDictionary.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedSet.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedSet.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBEmptyNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBEmptyNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBValueNode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBValueNode.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionary.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionary.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionaryEnumerator.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionaryEnumerator.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/FSRWebSocket.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/FSRWebSocket.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/NSData+SRB64Additions.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/NSData+SRB64Additions.m create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/fbase64.c create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/fbase64.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/Wrap-leveldb/APLevelDB.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/Wrap-leveldb/APLevelDB.mm create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRAppInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponent.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponentContainer.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponentType.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRDependency.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRErrorCode.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRLibrary.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRLogger.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIROptionsInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FirebaseCoreInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/Interop/Auth/Public/FIRAuthInterop.h create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/LICENSE create mode 100644 MyExperiences copy/Pods/FirebaseDatabase/README.md create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRAppInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponent.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentContainer.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentType.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRDependency.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRErrorCode.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRLibrary.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRLogger.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIROptionsInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FirebaseCoreInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsVersion.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallations.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsAuthTokenResult.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsVersion.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations.h create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/LICENSE create mode 100644 MyExperiences copy/Pods/FirebaseInstallations/README.md create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRAppInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponent.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponentContainer.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponentType.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRDependency.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRErrorCode.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRLibrary.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRLogger.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIROptionsInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FirebaseCoreInternal.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorage.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageComponent.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageComponent.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageConstants.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageConstants_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDeleteTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDeleteTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDownloadTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDownloadTask_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageErrors.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetMetadataTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetMetadataTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListResult.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListResult_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageMetadata.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageMetadata_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageObservableTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageObservableTask_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStoragePath.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStoragePath.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageReference.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageReference_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTaskSnapshot.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTaskSnapshot_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTask_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTokenAuthorizer.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTokenAuthorizer.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUploadTask.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUploadTask_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUtils.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUtils.m create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorage_Private.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorage.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageConstants.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageDownloadTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageListResult.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageMetadata.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageObservableTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageReference.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageTaskSnapshot.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageUploadTask.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FirebaseStorage.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/Interop/Auth/Public/FIRAuthInterop.h create mode 100644 MyExperiences copy/Pods/FirebaseStorage/LICENSE create mode 100644 MyExperiences copy/Pods/FirebaseStorage/README.md create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationDeleteAccount.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationDeleteAccount.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationForgotPassword.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationForgotPassword.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationSignOut.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationSignOut.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationType.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUnlinkAccount.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUnlinkAccount.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateEmail.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateEmail.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateName.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateName.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdatePassword.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdatePassword.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.xib create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIInputTableViewCell.xib create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIPasswordTableViewCell.xib create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrorUtils.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrorUtils.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrors.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrors.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.xib create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthProvider.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthSignInButton.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthSignInButton.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthStrings.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthStrings.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableHeaderView.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableHeaderView.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.xib create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthUtils.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthUtils.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth_Internal.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIPrivacyAndTermsOfServiceView.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIPrivacyAndTermsOfServiceView.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.xib create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewManager.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewManager.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FirebaseAuthUI.h create mode 100755 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle.png create mode 100755 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle2x.png create mode 100755 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle3x.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility@2x.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility@3x.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility_off.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility_off@2x.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility_off@3x.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ar.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/bg.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/bn.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ca.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/cs.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/da.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/de-AT.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/de-CH.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/de.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/el.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/en-AU.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/en-CA.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/en-GB.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/en-IE.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/en-IN.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/en-SG.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/en-ZA.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/en.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-419.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-AR.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-BO.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-CL.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-CO.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-CR.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-DO.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-EC.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-GT.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-HN.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-MX.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-NI.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-PA.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-PE.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-PR.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-PY.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-SV.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-US.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-UY.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es-VE.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/es.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/fa.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/fi.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/fil.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/fr-CH.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/fr.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/gsw.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/gu.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/he.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/hi.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/hr.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/hu.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/id.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/it.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ja.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/kn.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ko.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ln.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/lt.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/lv.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/mr.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ms.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/nb.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/nl.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/nn-NO.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/pl.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/pt-BR.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/pt-PT.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/pt.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ro.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ru.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/sk.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/sl.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/sr-Latn.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/sr.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/sv.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ta.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/th.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/tr.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/uk.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/ur.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/vi.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/zh-Hans.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/zh-Hant-TW.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/zh-Hant.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Strings/zh.lproj/FirebaseAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FUIGoogleAuth.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FUIGoogleAuth.m create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FirebaseGoogleAuthUI.h create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google@2x.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google@3x.png create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ar.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/bg.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/bn.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ca.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/cs.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/da.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/de-AT.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/de-CH.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/de.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/el.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/en-AU.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/en-CA.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/en-GB.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/en-IE.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/en-IN.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/en-SG.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/en-ZA.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/en.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-419.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-AR.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-BO.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-CL.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-CO.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-CR.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-DO.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-EC.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-GT.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-HN.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-MX.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-NI.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-PA.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-PE.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-PR.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-PY.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-SV.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-US.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-UY.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es-VE.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/es.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/fa.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/fi.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/fil.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/fr-CH.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/fr.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/gsw.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/gu.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/he.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/hi.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/hr.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/hu.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/id.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/it.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ja.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/kn.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ko.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ln.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/lt.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/lv.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/mr.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ms.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/nb.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/nl.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/nn-NO.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/pl.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/pt-BR.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/pt-PT.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/pt.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ro.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ru.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/sk.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/sl.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/sr-Latn.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/sr.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/sv.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ta.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/th.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/tr.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/uk.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/ur.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/vi.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/zh-Hans.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/zh-Hant-TW.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/zh-Hant.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Strings/zh.lproj/FirebaseGoogleAuthUI.strings create mode 100644 MyExperiences copy/Pods/FirebaseUI/LICENSE create mode 100644 MyExperiences copy/Pods/FirebaseUI/README.md create mode 100644 MyExperiences copy/Pods/GTMAppAuth/LICENSE create mode 100644 MyExperiences copy/Pods/GTMAppAuth/README.md create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuth.h create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/GTMKeychain.h create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m create mode 100644 MyExperiences copy/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/LICENSE create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/README.md create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h create mode 100644 MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m create mode 100755 MyExperiences copy/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.framework/GoogleAppMeasurement create mode 100755 MyExperiences copy/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.framework/Modules/module.modulemap create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORAssert.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORClock.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORConsoleLogger.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORDataFuture.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORLifecycle.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORPlatform.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORReachability.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORRegistrar.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransformer.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransport.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadCoordinator.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadPackage.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORDataFuture.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCOREvent_Private.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORFlatFileStorage.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORReachability_Private.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORRegistrar_Private.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransformer_Private.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransport_Private.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadCoordinator.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Private/GDTCORUploadPackage_Private.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORAssert.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORClock.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORConsoleLogger.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCOREvent.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCOREventDataObject.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCOREventTransformer.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORLifecycle.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORPlatform.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORPrioritizer.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORReachability.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORRegistrar.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORStorageProtocol.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORTargets.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORTransport.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORUploadPackage.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GDTCORUploader.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Public/GoogleDataTransport.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/LICENSE create mode 100644 MyExperiences copy/Pods/GoogleDataTransport/README.md create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTCompressionHelper.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTNanopbHelpers.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTPrioritizer.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTUploader.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCOREvent+GDTCCTSupport.m create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/Private/GDTCCTCompressionHelper.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/Private/GDTCCTPrioritizer.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/Private/GDTCCTUploader.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.c create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/LICENSE create mode 100644 MyExperiences copy/Pods/GoogleDataTransportCCTSupport/README.md create mode 100755 MyExperiences copy/Pods/GoogleSignIn/.cocoapods.yml create mode 100755 MyExperiences copy/Pods/GoogleSignIn/CHANGELOG.md create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDAuthentication.h create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDGoogleUser.h create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDProfileData.h create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignIn.h create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignInButton.h create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GoogleSignIn.h create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Modules/module.modulemap create mode 100755 MyExperiences copy/Pods/GoogleSignIn/README.md create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Info.plist create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Roboto-Bold.ttf create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/google.png create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/google@2x.png create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/google@3x.png create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings create mode 100755 MyExperiences copy/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/GULAppDelegateSwizzler.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Internal/GULAppDelegateSwizzler_Private.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Private/GULAppDelegateSwizzler.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/AppDelegateSwizzler/Private/GULApplication.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Common/GULLoggerCodes.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/GULHeartbeatDateStorage.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/GULSecureCoding.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GULHeartbeatDateStorage.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GULKeychainStorage.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GULKeychainUtils.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/Public/GULSecureCoding.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/SecureStorage/GULKeychainStorage.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/SecureStorage/GULKeychainUtils.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/third_party/GULAppEnvironmentUtil.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Environment/third_party/GULAppEnvironmentUtil.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/LICENSE create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Logger/GULLogger.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Logger/Private/GULLogger.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Logger/Public/GULLoggerLevel.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/GULSwizzler.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/Private/GULOriginalIMPConvenienceMacros.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/MethodSwizzler/Private/GULSwizzler.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/NSData+zlib/GULNSData+zlib.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/NSData+zlib/GULNSData+zlib.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/GULMutableDictionary.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetwork.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkConstants.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkURLSession.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/Private/GULMutableDictionary.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/Private/GULNetwork.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/Private/GULNetworkConstants.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/Private/GULNetworkLoggerProtocol.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/Private/GULNetworkMessageCode.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Network/Private/GULNetworkURLSession.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker+Internal.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Reachability/Private/GULReachabilityChecker.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/Reachability/Private/GULReachabilityMessageCode.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/SceneDelegateSwizzler/GULSceneDelegateSwizzler.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/SceneDelegateSwizzler/Internal/GULSceneDelegateSwizzler_Private.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/SceneDelegateSwizzler/Private/GULSceneDelegateSwizzler.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/UserDefaults/GULUserDefaults.m create mode 100644 MyExperiences copy/Pods/GoogleUtilities/GoogleUtilities/UserDefaults/Private/GULUserDefaults.h create mode 100644 MyExperiences copy/Pods/GoogleUtilities/README.md create mode 120000 MyExperiences copy/Pods/Headers/Private/Firebase/Firebase.h create mode 120000 MyExperiences copy/Pods/Headers/Public/Firebase/Firebase.h create mode 100644 MyExperiences copy/Pods/Manifest.lock create mode 100644 MyExperiences copy/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 MyExperiences copy/Pods/PromisesObjC/LICENSE create mode 100644 MyExperiences copy/Pods/PromisesObjC/README.md create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+All.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Always.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Any.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Async.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Await.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Catch.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Delay.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Do.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Race.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Recover.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Reduce.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Retry.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Testing.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Then.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Timeout.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Validate.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise+Wrap.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromise.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/FBLPromiseError.m create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+All.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Always.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Any.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Async.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Await.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Catch.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Delay.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Do.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Race.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Recover.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Reduce.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Retry.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Testing.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Then.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Timeout.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Validate.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Wrap.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromiseError.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromisePrivate.h create mode 100644 MyExperiences copy/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromises.h create mode 100644 MyExperiences copy/Pods/Target Support Files/AppAuth/AppAuth-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/AppAuth/AppAuth-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/AppAuth/AppAuth-prefix.pch create mode 100644 MyExperiences copy/Pods/Target Support Files/AppAuth/AppAuth-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/AppAuth/AppAuth.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/AppAuth/AppAuth.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/AppAuth/AppAuth.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/Firebase/Firebase.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/Firebase/Firebase.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseAnalytics/FirebaseAnalytics.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseAuth/FirebaseAuth-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseAuth/FirebaseAuth-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseAuth/FirebaseAuth-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseAuth/FirebaseAuth.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseAuth/FirebaseAuth.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseAuth/FirebaseAuth.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCore/FirebaseCore-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCore/FirebaseCore-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCore/FirebaseCore-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCore/FirebaseCore.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCore/FirebaseCore.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCore/FirebaseCore.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseDatabase/FirebaseDatabase-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseDatabase/FirebaseDatabase-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseDatabase/FirebaseDatabase-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseDatabase/FirebaseDatabase.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseDatabase/FirebaseDatabase.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseDatabase/FirebaseDatabase.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseInstallations/FirebaseInstallations.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseStorage/FirebaseStorage-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseStorage/FirebaseStorage-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseStorage/FirebaseStorage-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseStorage/FirebaseStorage.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseStorage/FirebaseStorage.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseStorage/FirebaseStorage.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/FirebaseUI-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/FirebaseUI-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/FirebaseUI-prefix.pch create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/FirebaseUI-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/FirebaseUI.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/FirebaseUI.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/FirebaseUI.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/ResourceBundle-FirebaseAuthUI-FirebaseUI-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/FirebaseUI/ResourceBundle-FirebaseGoogleAuthUI-FirebaseUI-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleAppMeasurement/GoogleAppMeasurement.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransport/GoogleDataTransport.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleSignIn/GoogleSignIn.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleSignIn/GoogleSignIn.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-prefix.pch create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleUtilities/GoogleUtilities-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/GoogleUtilities/GoogleUtilities.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-acknowledgements.markdown create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-acknowledgements.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-frameworks-Debug-input-files.xcfilelist create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-frameworks-Debug-output-files.xcfilelist create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-frameworks-Release-input-files.xcfilelist create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-frameworks-Release-output-files.xcfilelist create mode 100755 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-frameworks.sh create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-resources-Debug-input-files.xcfilelist create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-resources-Debug-output-files.xcfilelist create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-resources-Release-input-files.xcfilelist create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-resources-Release-output-files.xcfilelist create mode 100755 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-resources.sh create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/Pods-MyExperiences/Pods-MyExperiences.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/PromisesObjC/PromisesObjC-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/PromisesObjC/PromisesObjC-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/PromisesObjC/PromisesObjC-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/PromisesObjC/PromisesObjC.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/PromisesObjC/PromisesObjC.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/PromisesObjC/PromisesObjC.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/leveldb-library/leveldb-library-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/leveldb-library/leveldb-library-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/leveldb-library/leveldb-library-prefix.pch create mode 100644 MyExperiences copy/Pods/Target Support Files/leveldb-library/leveldb-library-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/leveldb-library/leveldb-library.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/leveldb-library/leveldb-library.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/leveldb-library/leveldb-library.release.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/nanopb/nanopb-Info.plist create mode 100644 MyExperiences copy/Pods/Target Support Files/nanopb/nanopb-dummy.m create mode 100644 MyExperiences copy/Pods/Target Support Files/nanopb/nanopb-prefix.pch create mode 100644 MyExperiences copy/Pods/Target Support Files/nanopb/nanopb-umbrella.h create mode 100644 MyExperiences copy/Pods/Target Support Files/nanopb/nanopb.debug.xcconfig create mode 100644 MyExperiences copy/Pods/Target Support Files/nanopb/nanopb.modulemap create mode 100644 MyExperiences copy/Pods/Target Support Files/nanopb/nanopb.release.xcconfig create mode 100644 MyExperiences copy/Pods/leveldb-library/LICENSE create mode 100644 MyExperiences copy/Pods/leveldb-library/README.md create mode 100644 MyExperiences copy/Pods/leveldb-library/db/builder.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/builder.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/c.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/db_impl.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/db_impl.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/db_iter.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/db_iter.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/dbformat.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/dbformat.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/dumpfile.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/filename.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/filename.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/log_format.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/log_reader.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/log_reader.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/log_writer.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/log_writer.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/memtable.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/memtable.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/repair.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/skiplist.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/snapshot.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/table_cache.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/table_cache.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/version_edit.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/version_edit.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/version_set.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/version_set.h create mode 100644 MyExperiences copy/Pods/leveldb-library/db/write_batch.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/db/write_batch_internal.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/c.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/cache.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/comparator.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/db.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/dumpfile.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/env.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/export.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/filter_policy.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/iterator.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/options.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/slice.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/status.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/table.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/table_builder.h create mode 100644 MyExperiences copy/Pods/leveldb-library/include/leveldb/write_batch.h create mode 100644 MyExperiences copy/Pods/leveldb-library/port/port.h create mode 100644 MyExperiences copy/Pods/leveldb-library/port/port_example.h create mode 100644 MyExperiences copy/Pods/leveldb-library/port/port_stdcxx.h create mode 100644 MyExperiences copy/Pods/leveldb-library/port/thread_annotations.h create mode 100644 MyExperiences copy/Pods/leveldb-library/table/block.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/block.h create mode 100644 MyExperiences copy/Pods/leveldb-library/table/block_builder.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/block_builder.h create mode 100644 MyExperiences copy/Pods/leveldb-library/table/filter_block.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/filter_block.h create mode 100644 MyExperiences copy/Pods/leveldb-library/table/format.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/format.h create mode 100644 MyExperiences copy/Pods/leveldb-library/table/iterator.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/iterator_wrapper.h create mode 100644 MyExperiences copy/Pods/leveldb-library/table/merger.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/merger.h create mode 100644 MyExperiences copy/Pods/leveldb-library/table/table.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/table_builder.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/two_level_iterator.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/table/two_level_iterator.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/arena.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/arena.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/bloom.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/cache.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/coding.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/coding.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/comparator.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/crc32c.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/crc32c.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/env.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/env_posix.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/env_posix_test_helper.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/env_windows_test_helper.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/filter_policy.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/hash.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/hash.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/histogram.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/histogram.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/logging.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/logging.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/mutexlock.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/no_destructor.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/options.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/posix_logger.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/random.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/status.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/testharness.cc create mode 100644 MyExperiences copy/Pods/leveldb-library/util/testharness.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/testutil.h create mode 100644 MyExperiences copy/Pods/leveldb-library/util/windows_logger.h create mode 100644 MyExperiences copy/Pods/nanopb/LICENSE.txt create mode 100644 MyExperiences copy/Pods/nanopb/README.md create mode 100644 MyExperiences copy/Pods/nanopb/pb.h create mode 100644 MyExperiences copy/Pods/nanopb/pb_common.c create mode 100644 MyExperiences copy/Pods/nanopb/pb_common.h create mode 100644 MyExperiences copy/Pods/nanopb/pb_decode.c create mode 100644 MyExperiences copy/Pods/nanopb/pb_decode.h create mode 100644 MyExperiences copy/Pods/nanopb/pb_encode.c create mode 100644 MyExperiences copy/Pods/nanopb/pb_encode.h diff --git a/MyExperiences copy/MyExperiences.xcodeproj/project.pbxproj b/MyExperiences copy/MyExperiences.xcodeproj/project.pbxproj new file mode 100644 index 00000000..6a0365a7 --- /dev/null +++ b/MyExperiences copy/MyExperiences.xcodeproj/project.pbxproj @@ -0,0 +1,523 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 5020E59724B2F63900E70522 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5020E59624B2F63900E70522 /* AppDelegate.swift */; }; + 5020E59924B2F63900E70522 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5020E59824B2F63900E70522 /* SceneDelegate.swift */; }; + 5020E59E24B2F63900E70522 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5020E59C24B2F63900E70522 /* Main.storyboard */; }; + 5020E5A024B2F63A00E70522 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5020E59F24B2F63A00E70522 /* Assets.xcassets */; }; + 5020E5A324B2F63A00E70522 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5020E5A124B2F63A00E70522 /* LaunchScreen.storyboard */; }; + 5020E5AB24B2F8B000E70522 /* CreateANewExperienceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5020E5AA24B2F8B000E70522 /* CreateANewExperienceViewController.swift */; }; + 5020E5AD24B2FBC300E70522 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5020E5AC24B2FBC300E70522 /* GoogleService-Info.plist */; }; + 5053D08424B8D40700EA1276 /* Post.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D08324B8D40700EA1276 /* Post.swift */; }; + 5053D08624B8D4A200EA1276 /* Author.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D08524B8D4A200EA1276 /* Author.swift */; }; + 5053D08824B8D4D300EA1276 /* FirebaseConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D08724B8D4D300EA1276 /* FirebaseConvertible.swift */; }; + 5053D08A24B8D54000EA1276 /* User+DictionaryRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D08924B8D54000EA1276 /* User+DictionaryRepresentation.swift */; }; + 5053D08C24B8D73200EA1276 /* Comment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D08B24B8D73200EA1276 /* Comment.swift */; }; + 5053D08E24B8D91500EA1276 /* PostController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D08D24B8D91500EA1276 /* PostController.swift */; }; + 5053D09024B8DA4300EA1276 /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D08F24B8DA4300EA1276 /* SignInViewController.swift */; }; + 5053D09424B8E72F00EA1276 /* LocationHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D09324B8E72F00EA1276 /* LocationHelper.swift */; }; + 5053D09824B906C600EA1276 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D09724B906C600EA1276 /* MapViewController.swift */; }; + 5053D09C24B9134000EA1276 /* UIImage+Ratio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053D09B24B9134000EA1276 /* UIImage+Ratio.swift */; }; + 50C45FB824B3988B000D1786 /* UIImage+Scaling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C45FB724B3988B000D1786 /* UIImage+Scaling.swift */; }; + 50C45FBA24B39E9F000D1786 /* RecordAudioViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C45FB924B39E9F000D1786 /* RecordAudioViewController.swift */; }; + 949D7232739C303905BB3022 /* Pods_MyExperiences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E15FE4B1E43972FFA5255DE9 /* Pods_MyExperiences.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 085D4A00CE77781589B6193A /* Pods-MyExperiences.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MyExperiences.debug.xcconfig"; path = "Target Support Files/Pods-MyExperiences/Pods-MyExperiences.debug.xcconfig"; sourceTree = ""; }; + 5020E59324B2F63900E70522 /* MyExperiences.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MyExperiences.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5020E59624B2F63900E70522 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5020E59824B2F63900E70522 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 5020E59D24B2F63900E70522 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5020E59F24B2F63A00E70522 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5020E5A224B2F63A00E70522 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5020E5A424B2F63A00E70522 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5020E5AA24B2F8B000E70522 /* CreateANewExperienceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateANewExperienceViewController.swift; sourceTree = ""; }; + 5020E5AC24B2FBC300E70522 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 5053D08324B8D40700EA1276 /* Post.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Post.swift; sourceTree = ""; }; + 5053D08524B8D4A200EA1276 /* Author.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Author.swift; sourceTree = ""; }; + 5053D08724B8D4D300EA1276 /* FirebaseConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseConvertible.swift; sourceTree = ""; }; + 5053D08924B8D54000EA1276 /* User+DictionaryRepresentation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "User+DictionaryRepresentation.swift"; sourceTree = ""; }; + 5053D08B24B8D73200EA1276 /* Comment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Comment.swift; sourceTree = ""; }; + 5053D08D24B8D91500EA1276 /* PostController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostController.swift; sourceTree = ""; }; + 5053D08F24B8DA4300EA1276 /* SignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = ""; }; + 5053D09324B8E72F00EA1276 /* LocationHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationHelper.swift; sourceTree = ""; }; + 5053D09724B906C600EA1276 /* MapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = ""; }; + 5053D09B24B9134000EA1276 /* UIImage+Ratio.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Ratio.swift"; sourceTree = ""; }; + 50C45FB724B3988B000D1786 /* UIImage+Scaling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Scaling.swift"; sourceTree = ""; }; + 50C45FB924B39E9F000D1786 /* RecordAudioViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordAudioViewController.swift; sourceTree = ""; }; + DE289047616DBA6AEE95B93A /* Pods-MyExperiences.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MyExperiences.release.xcconfig"; path = "Target Support Files/Pods-MyExperiences/Pods-MyExperiences.release.xcconfig"; sourceTree = ""; }; + E15FE4B1E43972FFA5255DE9 /* Pods_MyExperiences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MyExperiences.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5020E59024B2F63900E70522 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 949D7232739C303905BB3022 /* Pods_MyExperiences.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4624F59BE86BDDB0CD2E2D98 /* Pods */ = { + isa = PBXGroup; + children = ( + 085D4A00CE77781589B6193A /* Pods-MyExperiences.debug.xcconfig */, + DE289047616DBA6AEE95B93A /* Pods-MyExperiences.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 5020E58A24B2F63900E70522 = { + isa = PBXGroup; + children = ( + 5020E59524B2F63900E70522 /* MyExperiences */, + 5020E59424B2F63900E70522 /* Products */, + 4624F59BE86BDDB0CD2E2D98 /* Pods */, + D9172F0D3BE83362293E53B6 /* Frameworks */, + ); + sourceTree = ""; + }; + 5020E59424B2F63900E70522 /* Products */ = { + isa = PBXGroup; + children = ( + 5020E59324B2F63900E70522 /* MyExperiences.app */, + ); + name = Products; + sourceTree = ""; + }; + 5020E59524B2F63900E70522 /* MyExperiences */ = { + isa = PBXGroup; + children = ( + 5053D08224B8D3EC00EA1276 /* Models */, + 5053D07F24B8439600EA1276 /* Resources */, + 5020E5AC24B2FBC300E70522 /* GoogleService-Info.plist */, + 5053D08024B843A500EA1276 /* StoryBoards */, + 5020E5A424B2F63A00E70522 /* Info.plist */, + 5053D08124B843BC00EA1276 /* Helpers */, + 5053D07E24B8437800EA1276 /* ViewControllers */, + 5053D08724B8D4D300EA1276 /* FirebaseConvertible.swift */, + 5053D08924B8D54000EA1276 /* User+DictionaryRepresentation.swift */, + 5053D08D24B8D91500EA1276 /* PostController.swift */, + 5053D09324B8E72F00EA1276 /* LocationHelper.swift */, + 5053D09B24B9134000EA1276 /* UIImage+Ratio.swift */, + ); + path = MyExperiences; + sourceTree = ""; + }; + 5053D07E24B8437800EA1276 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 5053D09724B906C600EA1276 /* MapViewController.swift */, + 5020E5AA24B2F8B000E70522 /* CreateANewExperienceViewController.swift */, + 50C45FB924B39E9F000D1786 /* RecordAudioViewController.swift */, + 5053D08F24B8DA4300EA1276 /* SignInViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; + 5053D07F24B8439600EA1276 /* Resources */ = { + isa = PBXGroup; + children = ( + 5020E59624B2F63900E70522 /* AppDelegate.swift */, + 5020E59824B2F63900E70522 /* SceneDelegate.swift */, + 5020E59F24B2F63A00E70522 /* Assets.xcassets */, + ); + path = Resources; + sourceTree = ""; + }; + 5053D08024B843A500EA1276 /* StoryBoards */ = { + isa = PBXGroup; + children = ( + 5020E59C24B2F63900E70522 /* Main.storyboard */, + 5020E5A124B2F63A00E70522 /* LaunchScreen.storyboard */, + ); + path = StoryBoards; + sourceTree = ""; + }; + 5053D08124B843BC00EA1276 /* Helpers */ = { + isa = PBXGroup; + children = ( + 50C45FB724B3988B000D1786 /* UIImage+Scaling.swift */, + ); + path = Helpers; + sourceTree = ""; + }; + 5053D08224B8D3EC00EA1276 /* Models */ = { + isa = PBXGroup; + children = ( + 5053D08324B8D40700EA1276 /* Post.swift */, + 5053D08524B8D4A200EA1276 /* Author.swift */, + 5053D08B24B8D73200EA1276 /* Comment.swift */, + ); + path = Models; + sourceTree = ""; + }; + D9172F0D3BE83362293E53B6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E15FE4B1E43972FFA5255DE9 /* Pods_MyExperiences.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5020E59224B2F63900E70522 /* MyExperiences */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5020E5A724B2F63A00E70522 /* Build configuration list for PBXNativeTarget "MyExperiences" */; + buildPhases = ( + B1E992E6FE78715E95B58CCB /* [CP] Check Pods Manifest.lock */, + 5020E58F24B2F63900E70522 /* Sources */, + 5020E59024B2F63900E70522 /* Frameworks */, + 5020E59124B2F63900E70522 /* Resources */, + 7EEB14AE1E6E0C97B73A9E13 /* [CP] Embed Pods Frameworks */, + 1C4E2F75DC024E3F3CCD23D2 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MyExperiences; + productName = MyExperiences; + productReference = 5020E59324B2F63900E70522 /* MyExperiences.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5020E58B24B2F63900E70522 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1150; + LastUpgradeCheck = 1150; + ORGANIZATIONNAME = "Kelson Hartle"; + TargetAttributes = { + 5020E59224B2F63900E70522 = { + CreatedOnToolsVersion = 11.5; + }; + }; + }; + buildConfigurationList = 5020E58E24B2F63900E70522 /* Build configuration list for PBXProject "MyExperiences" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5020E58A24B2F63900E70522; + productRefGroup = 5020E59424B2F63900E70522 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5020E59224B2F63900E70522 /* MyExperiences */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5020E59124B2F63900E70522 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5020E5A324B2F63A00E70522 /* LaunchScreen.storyboard in Resources */, + 5020E5AD24B2FBC300E70522 /* GoogleService-Info.plist in Resources */, + 5020E5A024B2F63A00E70522 /* Assets.xcassets in Resources */, + 5020E59E24B2F63900E70522 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 1C4E2F75DC024E3F3CCD23D2 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7EEB14AE1E6E0C97B73A9E13 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MyExperiences/Pods-MyExperiences-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + B1E992E6FE78715E95B58CCB /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-MyExperiences-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 5020E58F24B2F63900E70522 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5020E59724B2F63900E70522 /* AppDelegate.swift in Sources */, + 50C45FBA24B39E9F000D1786 /* RecordAudioViewController.swift in Sources */, + 5053D08824B8D4D300EA1276 /* FirebaseConvertible.swift in Sources */, + 50C45FB824B3988B000D1786 /* UIImage+Scaling.swift in Sources */, + 5053D08E24B8D91500EA1276 /* PostController.swift in Sources */, + 5053D08424B8D40700EA1276 /* Post.swift in Sources */, + 5053D08C24B8D73200EA1276 /* Comment.swift in Sources */, + 5053D09424B8E72F00EA1276 /* LocationHelper.swift in Sources */, + 5053D09C24B9134000EA1276 /* UIImage+Ratio.swift in Sources */, + 5020E5AB24B2F8B000E70522 /* CreateANewExperienceViewController.swift in Sources */, + 5053D09024B8DA4300EA1276 /* SignInViewController.swift in Sources */, + 5053D08624B8D4A200EA1276 /* Author.swift in Sources */, + 5020E59924B2F63900E70522 /* SceneDelegate.swift in Sources */, + 5053D09824B906C600EA1276 /* MapViewController.swift in Sources */, + 5053D08A24B8D54000EA1276 /* User+DictionaryRepresentation.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 5020E59C24B2F63900E70522 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5020E59D24B2F63900E70522 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5020E5A124B2F63A00E70522 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5020E5A224B2F63A00E70522 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5020E5A524B2F63A00E70522 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 5020E5A624B2F63A00E70522 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5020E5A824B2F63A00E70522 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 085D4A00CE77781589B6193A /* Pods-MyExperiences.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 6WA5TYMFND; + INFOPLIST_FILE = MyExperiences/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.KelsonHartle.MyExperiences; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5020E5A924B2F63A00E70522 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DE289047616DBA6AEE95B93A /* Pods-MyExperiences.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 6WA5TYMFND; + INFOPLIST_FILE = MyExperiences/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.KelsonHartle.MyExperiences; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5020E58E24B2F63900E70522 /* Build configuration list for PBXProject "MyExperiences" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5020E5A524B2F63A00E70522 /* Debug */, + 5020E5A624B2F63A00E70522 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5020E5A724B2F63A00E70522 /* Build configuration list for PBXNativeTarget "MyExperiences" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5020E5A824B2F63A00E70522 /* Debug */, + 5020E5A924B2F63A00E70522 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5020E58B24B2F63900E70522 /* Project object */; +} diff --git a/MyExperiences copy/MyExperiences.xcodeproj/xcshareddata/xcschemes/MyExperiences.xcscheme b/MyExperiences copy/MyExperiences.xcodeproj/xcshareddata/xcschemes/MyExperiences.xcscheme new file mode 100644 index 00000000..df9b4f6d --- /dev/null +++ b/MyExperiences copy/MyExperiences.xcodeproj/xcshareddata/xcschemes/MyExperiences.xcscheme @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/MyExperiences/FirebaseConvertible.swift b/MyExperiences copy/MyExperiences/FirebaseConvertible.swift new file mode 100644 index 00000000..552d61d6 --- /dev/null +++ b/MyExperiences copy/MyExperiences/FirebaseConvertible.swift @@ -0,0 +1,13 @@ +// +// FirebaseConvertible.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import Foundation + +protocol FirebaseConvertible { + var dictionaryRepresentation: [String: Any] { get } +} diff --git a/MyExperiences copy/MyExperiences/GoogleService-Info.plist b/MyExperiences copy/MyExperiences/GoogleService-Info.plist new file mode 100644 index 00000000..ea4b5745 --- /dev/null +++ b/MyExperiences copy/MyExperiences/GoogleService-Info.plist @@ -0,0 +1,36 @@ + + + + + CLIENT_ID + 148592290546-9n183to7ns2k73hb6pm403364enie3el.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.148592290546-9n183to7ns2k73hb6pm403364enie3el + API_KEY + AIzaSyAggmXqJCYTeVRwpnDZR13AVzxgDdnOc1s + GCM_SENDER_ID + 148592290546 + PLIST_VERSION + 1 + BUNDLE_ID + com.KelsonHartle.MyExperiences + PROJECT_ID + myexperiences-3d6b3 + STORAGE_BUCKET + myexperiences-3d6b3.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:148592290546:ios:3c782c7e0d88c6d5387e6b + DATABASE_URL + https://myexperiences-3d6b3.firebaseio.com + + \ No newline at end of file diff --git a/MyExperiences copy/MyExperiences/Helpers/UIImage+Scaling.swift b/MyExperiences copy/MyExperiences/Helpers/UIImage+Scaling.swift new file mode 100644 index 00000000..44ff560b --- /dev/null +++ b/MyExperiences copy/MyExperiences/Helpers/UIImage+Scaling.swift @@ -0,0 +1,39 @@ +// +// UIImage+Scaling.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/6/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import Foundation +import UIKit + +extension UIImage { + + /// Resize the image to a max dimension from size parameter + func imageByScaling(toSize size: CGSize) -> UIImage? { + guard size.width > 0 && size.height > 0 else { return nil } + + let originalAspectRatio = self.size.width/self.size.height + var correctedSize = size + + if correctedSize.width > correctedSize.width*originalAspectRatio { + correctedSize.width = correctedSize.width*originalAspectRatio + } else { + correctedSize.height = correctedSize.height/originalAspectRatio + } + + return UIGraphicsImageRenderer(size: correctedSize, format: imageRendererFormat).image { context in + draw(in: CGRect(origin: .zero, size: correctedSize)) + } + } + + /// Renders the image if the pixel data was rotated due to orientation of camera + var flattened: UIImage { + if imageOrientation == .up { return self } + return UIGraphicsImageRenderer(size: size, format: imageRendererFormat).image { context in + draw(at: .zero) + } + } +} diff --git a/MyExperiences copy/MyExperiences/Info.plist b/MyExperiences copy/MyExperiences/Info.plist new file mode 100644 index 00000000..4b978d71 --- /dev/null +++ b/MyExperiences copy/MyExperiences/Info.plist @@ -0,0 +1,81 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.148592290546-9n183to7ns2k73hb6pm403364enie3el + + + + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSLocationWhenInUseUsageDescription + $(PRODUCT_NAME) We need to access your location in order to add geotags. + NSMicrophoneUsageDescription + ok? + NSPhotoLibraryUsageDescription + $(PRODUCT_NAME) We need acess to photos in order for you to post photos. + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/MyExperiences copy/MyExperiences/LocationHelper.swift b/MyExperiences copy/MyExperiences/LocationHelper.swift new file mode 100644 index 00000000..4a0003b3 --- /dev/null +++ b/MyExperiences copy/MyExperiences/LocationHelper.swift @@ -0,0 +1,65 @@ +// +// LocationHelper.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import UIKit +import MapKit +import CoreLocation + +class LocationHelper: NSObject, CLLocationManagerDelegate { + + static let shared = LocationHelper() + + private let locationManager = CLLocationManager() + var group: DispatchGroup? + + override init() { + super.init() + locationManager.delegate = self + + requestLocationAuthorization() + } + + func requestLocationAuthorization() { + + switch CLLocationManager.authorizationStatus() { + case .authorizedWhenInUse: + return + case .notDetermined: + locationManager.requestWhenInUseAuthorization() + default: + break + } + } + + func getCurrentLocation(completion: @escaping (CLLocationCoordinate2D?) -> Void) { + requestLocationAuthorization() + + group = DispatchGroup() + + group?.enter() + + locationManager.requestLocation() + + group?.notify(queue: .main) { + let coordinate = self.locationManager.location?.coordinate + + self.group = nil + completion(coordinate) + } + } + + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + group?.leave() + } + + func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + print("Failed getting location \(error)") + } + +} diff --git a/MyExperiences copy/MyExperiences/Models/Author.swift b/MyExperiences copy/MyExperiences/Models/Author.swift new file mode 100644 index 00000000..1ae976aa --- /dev/null +++ b/MyExperiences copy/MyExperiences/Models/Author.swift @@ -0,0 +1,36 @@ +// +// Author.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import Foundation +import FirebaseAuth + +struct Author: FirebaseConvertible, Equatable { + + init?(user: User) { + self.init(dictionary: user.dictionaryRepresentation) + } + + init?(dictionary: [String: Any]) { + guard let uid = dictionary[Author.uidKey] as? String, + let displayName = dictionary[Author.displayNameKey] as? String else { return nil } + + self.uid = uid + self.displayName = displayName + } + + let uid: String + let displayName: String? + + private static let uidKey = "uid" + private static let displayNameKey = "displayName" + + var dictionaryRepresentation: [String: Any] { + return [Author.uidKey: uid, + Author.displayNameKey: displayName ?? "No display name"] + } +} diff --git a/MyExperiences copy/MyExperiences/Models/Comment.swift b/MyExperiences copy/MyExperiences/Models/Comment.swift new file mode 100644 index 00000000..6bef671c --- /dev/null +++ b/MyExperiences copy/MyExperiences/Models/Comment.swift @@ -0,0 +1,64 @@ +// +// Comment.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import Foundation + +import Foundation +import FirebaseAuth + +class Comment: FirebaseConvertible, Equatable { + + static private let textKey = "text" + static private let author = "author" + static private let timestampKey = "timestamp" + static private let audioKey = "audio" + + let text: String? + let author: Author + let timestamp: Date + let audioURL: URL? + + // Why The F are there two init methods + init(text: String?, author: Author, timestamp: Date = Date(), audioURL: URL? = nil) { + self.text = text + self.author = author + self.timestamp = timestamp + self.audioURL = audioURL + } + + init?(dictionary: [String : Any]) { + guard let text = dictionary[Comment.textKey] as? String, + let authorDictionary = dictionary[Comment.author] as? [String: Any], + let author = Author(dictionary: authorDictionary), + let timestampTimeInterval = dictionary[Comment.timestampKey] as? TimeInterval else { return nil } + + self.text = text + self.author = author + self.timestamp = Date(timeIntervalSince1970: timestampTimeInterval) + + if let audioText = dictionary[Comment.audioKey] as? String { + self.audioURL = URL(string: audioText) + } else { + self.audioURL = nil + } + } + + // And also a dictionary representation method. + var dictionaryRepresentation: [String: Any] { + return [Comment.textKey: text ?? "", + Comment.author: author.dictionaryRepresentation, + Comment.timestampKey: timestamp.timeIntervalSince1970, + Comment.audioKey : audioURL?.absoluteString ?? ""] + } + + static func ==(lhs: Comment, rhs: Comment) -> Bool { + return lhs.author == rhs.author && + lhs.timestamp == rhs.timestamp + } +} + diff --git a/MyExperiences copy/MyExperiences/Models/Post.swift b/MyExperiences copy/MyExperiences/Models/Post.swift new file mode 100644 index 00000000..bfab070a --- /dev/null +++ b/MyExperiences copy/MyExperiences/Models/Post.swift @@ -0,0 +1,105 @@ +// +// Post.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import Foundation +import FirebaseAuth +import MapKit + +enum MediaType: String { + case image + case video +} + +class Post: NSObject { + + var mediaURL: URL + let mediaType: MediaType + let author: Author + let timestamp: Date + var comments: [Comment] + var id: String? + var ratio: CGFloat? + var geotag: CLLocationCoordinate2D? + var longitude: Double? + var latitude: Double? + + var title: String? { + return comments.first?.text + } + + static private let mediaKey = "media" + static private let ratioKey = "ratio" + static private let mediaTypeKey = "mediaType" + static private let authorKey = "author" + static private let commentsKey = "comments" + static private let timestampKey = "timestamp" + static private let idKey = "id" + + + init(title: String, mediaURL: URL, ratio: CGFloat? = nil, author: Author, mediaType: MediaType, timestamp: Date = Date()) { + self.mediaURL = mediaURL + self.ratio = ratio + self.mediaType = mediaType + self.author = author + self.comments = [Comment(text: title, author: author)] + self.timestamp = timestamp + } + + init?(dictionary: [String : Any], id: String) { + guard let mediaURLString = dictionary[Post.mediaKey] as? String, + let mediaURL = URL(string: mediaURLString), + let mediaTypeString = dictionary[Post.mediaTypeKey] as? String, + let mediaType = MediaType(rawValue: mediaTypeString), + let authorDictionary = dictionary[Post.authorKey] as? [String: Any], + let author = Author(dictionary: authorDictionary), + let timestampTimeInterval = dictionary[Post.timestampKey] as? TimeInterval, + let captionDictionaries = dictionary[Post.commentsKey] as? [[String: Any]] else { return nil } + + self.mediaURL = mediaURL + self.mediaType = mediaType + self.ratio = dictionary[Post.ratioKey] as? CGFloat + self.author = author + self.timestamp = Date(timeIntervalSince1970: timestampTimeInterval) + self.comments = captionDictionaries.compactMap({ Comment(dictionary: $0) }) + self.id = id + + if let lat = dictionary["lat"] as? Double, let lng = dictionary["lng"] as? Double { + self.geotag = CLLocationCoordinate2D(latitude: lat, longitude: lng) + } + } + + var dictionaryRepresentation: [String : Any] { + var dict: [String: Any] = [Post.mediaKey: mediaURL.absoluteString, + Post.mediaTypeKey: mediaType.rawValue, + Post.commentsKey: comments.map({ $0.dictionaryRepresentation }), + Post.authorKey: author.dictionaryRepresentation, + Post.timestampKey: timestamp.timeIntervalSince1970] + + + guard let ratio = self.ratio else { return dict } + + if let coordinate = self.geotag { + dict["lat"] = coordinate.latitude + dict["lng"] = coordinate.longitude + } + + dict[Post.ratioKey] = ratio + + return dict + } +} + +extension Post: MKAnnotation { + var coordinate: CLLocationCoordinate2D { + return geotag ?? CLLocationCoordinate2D() + } + + var subtitle: String? { + return author.displayName + } +} diff --git a/MyExperiences copy/MyExperiences/PostController.swift b/MyExperiences copy/MyExperiences/PostController.swift new file mode 100644 index 00000000..0d8540e7 --- /dev/null +++ b/MyExperiences copy/MyExperiences/PostController.swift @@ -0,0 +1,176 @@ +// +// PostController.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import Foundation +import FirebaseAuth +import FirebaseDatabase +import FirebaseStorage +import MapKit +import CoreLocation + +class PostController { + + func createPost(with title: String, ofType mediaType: MediaType, mediaData: Data, ratio: CGFloat? = nil, geotag: CLLocationCoordinate2D? = nil, completion: @escaping (Bool) -> Void = { _ in }) { + + guard let currentUser = Auth.auth().currentUser, + let author = Author(user: currentUser) else { return } + let ref = storageRef.child(mediaType.rawValue) + + store(mediaData: mediaData, storage: ref) { (mediaURL) in + + guard let mediaURL = mediaURL else { completion(false); return } + + switch mediaType { + case .image: + let imagePost = Post(title: title, mediaURL: mediaURL, ratio: ratio, author: author, mediaType: mediaType) + imagePost.geotag = geotag + + self.postsRef.childByAutoId().setValue(imagePost.dictionaryRepresentation) { (error, ref) in + if let error = error { + NSLog("Error posting image post: \(error)") + completion(false) + } + completion(true) + } + case .video: + let videoPost = Post(title: title, mediaURL: mediaURL, ratio: ratio, author: author, mediaType: mediaType) + videoPost.geotag = geotag + + self.postsRef.childByAutoId().setValue(videoPost.dictionaryRepresentation) { (error, ref) in + if let error = error { + NSLog("Error posting image post: \(error)") + completion(false) + } + completion(true) + } + } + } + } + + func addComment(with text: String, to post: inout Post) { + + guard let currentUser = Auth.auth().currentUser, + let author = Author(user: currentUser) else { return } + + let comment = Comment(text: text, author: author) + post.comments.append(comment) + + savePostToFirebase(post) + } + + func addAudioComment(with comment: Comment, to post: inout Post) { + post.comments.append(comment) + savePostToFirebase(post) + + + + } + + func createAudioComment(with mediaData: Data, completion: @escaping (Comment?) -> Void = {_ in}) { + + guard let currentUser = Auth.auth().currentUser, + let author = Author(user: currentUser) else { return } + + let ref = storageRef.child("audio") + store(mediaData: mediaData, storage: ref) { (mediaURL) in + + guard let mediaURL = mediaURL else { completion(nil); return } + + let audioComment = Comment(text: nil, author: author, audioURL: mediaURL) + completion(audioComment) + + } + } + + func observePosts(completion: @escaping (Error?) -> Void) { + + postsRef.observe(.value, with: { (snapshot) in + + guard let postDictionaries = snapshot.value as? [String: [String: Any]] else { return } + + var posts: [Post] = [] + + + // Here is where the posts pulled down from the server are being sorted. + for (key, value) in postDictionaries { + + guard let post = Post(dictionary: value, id: key) else { continue } + + posts.append(post) + } + // Then they are sorted by timestamp with the newest timestamps being the first on the list being displayed first. + self.posts = posts.sorted(by: { $0.timestamp > $1.timestamp }) + + completion(nil) + + }) { (error) in + NSLog("Error fetching posts: \(error)") + } + } + + func savePostToFirebase(_ post: Post, completion: (Error?) -> Void = { _ in }) { + + guard let postID = post.id else { return } + + let ref = postsRef.child(postID) + + ref.setValue(post.dictionaryRepresentation) + } + + + //Here you can also change mediaType to Storage refrence. I guess that is what they are reffering to with this instruction + + /* + You can very easily change the store method to instead take in data and a StorageReference to accomodate for storing both Post media data and now the audio data as well. + */ + private func store(mediaData: Data, storage: StorageReference, completion: @escaping (URL?) -> Void) { + + let mediaID = UUID().uuidString + + let mediaRef = storage.child(mediaID) + + let uploadTask = mediaRef.putData(mediaData, metadata: nil) { (metadata, error) in + if let error = error { + NSLog("Error storing media data: \(error)") + completion(nil) + return + } + + //? ( DO NOT understand this code snippet below.) + if metadata == nil { + NSLog("No metadata returned from upload task.") + completion(nil) + return + } + + mediaRef.downloadURL(completion: { (url, error) in + + if let error = error { + NSLog("Error getting download url of media: \(error)") + } + + guard let url = url else { + NSLog("Download url is nil. Unable to create a Media object") + + completion(nil) + return + } + completion(url) + }) + } + + uploadTask.resume() + } + + var posts: [Post] = [] + let currentUser = Auth.auth().currentUser + let postsRef = Database.database().reference().child("posts") + let storageRef = Storage.storage().reference() + + +} diff --git a/MyExperiences copy/MyExperiences/Resources/AppDelegate.swift b/MyExperiences copy/MyExperiences/Resources/AppDelegate.swift new file mode 100644 index 00000000..61f70167 --- /dev/null +++ b/MyExperiences copy/MyExperiences/Resources/AppDelegate.swift @@ -0,0 +1,64 @@ +// +// AppDelegate.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/6/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import UIKit +import Firebase +import GoogleSignIn + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + + FirebaseApp.configure() + + let signIn = GIDSignIn.sharedInstance() + signIn?.clientID = FirebaseApp.app()?.options.clientID + + if Auth.auth().currentUser != nil { + let storyboard = UIStoryboard(name: "Main", bundle: nil) + let postsNavigationController = storyboard.instantiateViewController(withIdentifier: "InitialVC") + window?.rootViewController = postsNavigationController + window?.makeKeyAndVisible() + } + + return true + } + + func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, + withError error: Error!) { + if let error = error { + if (error as NSError).code == GIDSignInErrorCode.hasNoAuthInKeychain.rawValue { + print("Error: The user has not signed in before or they have since signed out.") + } else { + print("\(error.localizedDescription)") + } + return + } + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/MyExperiences copy/MyExperiences/Resources/Assets.xcassets/00000.imageset/00000.jpeg b/MyExperiences copy/MyExperiences/Resources/Assets.xcassets/00000.imageset/00000.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..076f53611c15821a9bdaaac14b140400b72b4d42 GIT binary patch literal 95661 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

9L;*2a|RCjlw;-E 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 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/MyExperiences/StoryBoards/Base.lproj/Main.storyboard b/MyExperiences copy/MyExperiences/StoryBoards/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3334ec4 --- /dev/null +++ b/MyExperiences copy/MyExperiences/StoryBoards/Base.lproj/Main.storyboard @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/MyExperiences/UIImage+Ratio.swift b/MyExperiences copy/MyExperiences/UIImage+Ratio.swift new file mode 100644 index 00000000..605e9ba6 --- /dev/null +++ b/MyExperiences copy/MyExperiences/UIImage+Ratio.swift @@ -0,0 +1,16 @@ +// +// UIImage+Ratio.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import Foundation +import UIKit + +extension UIImage { + var ratio: CGFloat { + return size.height / size.width + } +} diff --git a/MyExperiences copy/MyExperiences/User+DictionaryRepresentation.swift b/MyExperiences copy/MyExperiences/User+DictionaryRepresentation.swift new file mode 100644 index 00000000..53b6f5cd --- /dev/null +++ b/MyExperiences copy/MyExperiences/User+DictionaryRepresentation.swift @@ -0,0 +1,21 @@ +// +// User+DictionaryRepresentation.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import Foundation +import FirebaseAuth + +extension User { + + private static let uidKey = "uid" + private static let displayNameKey = "displayName" + + var dictionaryRepresentation: [String: String] { + return [User.uidKey: uid, + User.displayNameKey: displayName ?? "No display name"] + } +} diff --git a/MyExperiences copy/MyExperiences/ViewControllers/CreateANewExperienceViewController.swift b/MyExperiences copy/MyExperiences/ViewControllers/CreateANewExperienceViewController.swift new file mode 100644 index 00000000..86ff85cb --- /dev/null +++ b/MyExperiences copy/MyExperiences/ViewControllers/CreateANewExperienceViewController.swift @@ -0,0 +1,471 @@ +// +// CreateNewExperienceViewController.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/6/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import UIKit +import Photos +import CoreImage +import CoreImage.CIFilterBuiltins + +enum FilterType { + case ciFalseColor + case ciEffectTonal + case ciEffectInstant + case ciSepiaTone + case ciZoomBlur + +} + + +class CreateANewExperienceViewController: UIViewController { + + @IBOutlet weak var recordButton: UIButton! + @IBOutlet weak var addPhotoButton: UIButton! + @IBOutlet weak var imageView: UIImageView! + @IBOutlet weak var titleTextField: UITextField! + + @IBOutlet weak var ciZoomBlurSegmentedControl: UISegmentedControl! + @IBOutlet weak var ciZoomBlurSlider: UISlider! + @IBOutlet weak var falseColorOneSegmentedControl: UISegmentedControl! + @IBOutlet weak var falseColorTwoSegmentedControl: UISegmentedControl! + @IBOutlet weak var sepiaIntensitySlider: UISlider! + @IBOutlet weak var isGeoTaggedSwitch: UISwitch! + + var postController = PostController() + var imageData: Data? + var context = CIContext(options: nil) + var filterSelected: FilterType! + var colorOne: CIColor = .clear + var colorTwo: CIColor = .clear + + var ciZoomBlurCGPoint: CGPoint = CGPoint(x: 50, y: 150) + + + private var originalImage: UIImage? { + didSet { + // 414*3 = 1.242 pixels (portrait on iPhone 11 Pro Max) + guard let originalImage = originalImage else { + scaledImage = nil // clear out the image if it is nil + return + } + var scaledSize = imageView.bounds.size + let scale = UIScreen.main.scale //will let us know if it is a 1x 2x 3x + scaledSize = CGSize(width: scaledSize.width * scale, height: scaledSize.height * scale) + scaledImage = originalImage.imageByScaling(toSize: scaledSize) + } + } + + private var scaledImage: UIImage? { + didSet { + updateImage() + //saveButton.isHidden = false + } + } + + private func updateImage() { + if let scaledImage = scaledImage { + switch self.filterSelected { + case .ciZoomBlur: + imageView.image = filterPhoto(scaledImage, filterSelected: .ciZoomBlur) + case .ciFalseColor: + imageView.image = filterPhoto(scaledImage, filterSelected: .ciFalseColor) + case .ciEffectTonal: + imageView.image = filterPhoto(scaledImage, filterSelected: .ciEffectTonal) + case .ciEffectInstant: + imageView.image = filterPhoto(scaledImage, filterSelected: .ciEffectInstant) + case .ciSepiaTone: + imageView.image = filterPhoto(scaledImage, filterSelected: .ciSepiaTone) + case .none: + break + } + + } else { + imageView.image = nil + } + } + + + //MARK: - LIFE CYCLE + override func viewDidLoad() { + super.viewDidLoad() + + falseColorOneSegmentedControl.addTarget(self, action: #selector(didChangeColorIndexOne(_:)), for: .valueChanged) + falseColorTwoSegmentedControl.addTarget(self, action: #selector(didChangeColorIndexTwo(_:)), for: .valueChanged) + + ciZoomBlurSegmentedControl.addTarget(self, action: #selector(didChangeInputCenterPoint(_:)), for: .valueChanged) + + } + + override func viewWillAppear(_ animated: Bool) { + //Hide all buttons until needed + + //saveButton.isHidden = false + + falseColorOneSegmentedControl.isHidden = true + falseColorTwoSegmentedControl.isHidden = true + ciZoomBlurSlider.isHidden = true + ciZoomBlurSegmentedControl.isHidden = true + sepiaIntensitySlider.isHidden = true + + } + // MARK: - FILTERING + + func filterPhoto(_ image: UIImage, filterSelected: FilterType) -> UIImage? { + switch filterSelected { + case .ciFalseColor: + guard let cgImage = image.cgImage else { return nil } + + let ciImage = CIImage(cgImage: cgImage) + + let ciFalseColor = CIFilter.falseColor() + + ciFalseColor.inputImage = ciImage + ciFalseColor.color0 = colorOne + ciFalseColor.color1 = colorTwo + + guard let outputFalseColorFilterCIImage = ciFalseColor.outputImage else { return nil } + guard let falseColorFilterOutputImage = context.createCGImage(outputFalseColorFilterCIImage, from: CGRect(origin: .zero, size: image.size)) else { return nil } + + + return UIImage(cgImage: falseColorFilterOutputImage) + + case .ciEffectTonal: + guard let cgImage = image.cgImage else { return nil } + + let ciImage = CIImage(cgImage: cgImage) + + let ciEffectTonal = CIFilter.photoEffectTonal() + ciEffectTonal.inputImage = ciImage + guard let outputPhotoEffectTonal = ciEffectTonal.outputImage else { return nil } + + guard let outPutTonalCGImage = context.createCGImage(outputPhotoEffectTonal, from: CGRect(origin: .zero, size: image.size)) else { return image } + + return UIImage(cgImage: outPutTonalCGImage) + + case .ciEffectInstant: + guard let cgImage = image.cgImage else { return nil } + let ciImage = CIImage(cgImage: cgImage) + + let photoEffectInstant = CIFilter.photoEffectInstant() + photoEffectInstant.inputImage = ciImage + guard let photoEffectIntantOutputImage = photoEffectInstant.outputImage else { return image } + guard let outputPhotoEffectInstantCGImage = context.createCGImage(photoEffectIntantOutputImage, from: CGRect(origin: .zero, size: image.size)) else {return image} + + return UIImage(cgImage: outputPhotoEffectInstantCGImage) + + case .ciSepiaTone: + guard let cgImage = image.cgImage else { return nil } + let ciImage = CIImage(cgImage: cgImage) + + let sepiaTone = CIFilter.sepiaTone() + sepiaTone.inputImage = ciImage + sepiaTone.intensity = sepiaIntensitySlider.value + guard let sepiaToneOutPutCIImage = sepiaTone.outputImage else { return image } + guard let outPutCGCiSepiaToneImage = context.createCGImage(sepiaToneOutPutCIImage, from: CGRect(origin: .zero, size: image.size)) else {return image} + + + return UIImage(cgImage: outPutCGCiSepiaToneImage) + + case .ciZoomBlur: + guard let cgImage = image.cgImage else { return nil } + + let ciImage = CIImage(cgImage: cgImage) + + let zoomBlur = CIFilter.zoomBlur() + zoomBlur.inputImage = ciImage + zoomBlur.center = ciZoomBlurCGPoint + zoomBlur.amount = ciZoomBlurSlider.value + + guard let outputZoomBlur = zoomBlur.outputImage else { return nil } + guard let outPutCGZoomBlurImage = context.createCGImage(outputZoomBlur, from: CGRect(origin: .zero, size: image.size)) else {return image} + + + return UIImage(cgImage: outPutCGZoomBlurImage) + + } + } + + + //MARK: - OBJC functions for (CI FALSE COLOR) + @objc private func didChangeColorIndexOne(_ sender: UISegmentedControl) { + colorOne = determineColorOne() + updateImage() + } + + @objc private func didChangeColorIndexTwo(_ sender: UISegmentedControl) { + colorTwo = determineColorTwo() + updateImage() + } + + //HELPER FUNCTIONS + private func determineColorOne() -> CIColor { + // could use a guard let here later if necessary + + switch falseColorOneSegmentedControl.selectedSegmentIndex { + case 0: + colorOne = .green + case 1: + colorOne = .blue + case 2: + colorOne = .red + case 3: + colorOne = .magenta + default: + fatalError() + } + + return colorOne + } + + private func determineColorTwo() -> CIColor { + switch falseColorTwoSegmentedControl.selectedSegmentIndex { + case 0: + colorTwo = .cyan + case 1: + colorTwo = .gray + case 2: + colorTwo = .black + case 3: + colorTwo = .yellow + default: + fatalError() + } + return colorTwo + } + + //MARK: - END (CI FALSE COLOR) + + //MARK: - OBJC functions for (CI ZOOM BLUR) + @objc private func didChangeInputCenterPoint(_ sender: UISegmentedControl) { + ciZoomBlurCGPoint = determineZoomBlur() + updateImage() + } + @IBAction func didChangeZoomBlur(_ sender: Any) { + updateImage() + } + + private func determineZoomBlur() -> CGPoint { + switch ciZoomBlurSegmentedControl.selectedSegmentIndex { + case 0: + ciZoomBlurCGPoint = CGPoint(x: 10, y: 20) + case 1: + ciZoomBlurCGPoint = CGPoint(x: 50, y: 30) + case 2: + ciZoomBlurCGPoint = CGPoint(x: 120, y: 50) + case 3: + ciZoomBlurCGPoint = CGPoint(x: 60, y: 80) + case 4: + ciZoomBlurCGPoint = CGPoint(x: 200, y: 300) + default: + fatalError() + } + return ciZoomBlurCGPoint + } + + //MARK: - END (CI ZOOM BLUR) + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "CreateAudioCommentSegue" { + if let audioVC = segue.destination as? RecordAudioViewController { + audioVC.delegate = self + } + } + } + + + //MARK: - Sepia Tone + + + @IBAction func sepiaIntensitySlider(_ sender: Any) { + updateImage() + } + //MARK: - END (Sepia Tone) + + @IBAction func falseColorTapped(_ sender: Any) { + originalImage = imageView.image + filterSelected = .ciFalseColor + + falseColorOneSegmentedControl.isHidden = false + falseColorTwoSegmentedControl.isHidden = false + } + + @IBAction func tonalTapped(_ sender: Any) { + originalImage = imageView.image + filterSelected = .ciEffectTonal + } + + @IBAction func instantTapped(_ sender: Any) { + originalImage = imageView.image + filterSelected = .ciEffectInstant + } + + @IBAction func sepiaTapped(_ sender: Any) { + originalImage = imageView.image + filterSelected = .ciSepiaTone + sepiaIntensitySlider.isHidden = false + sepiaIntensitySlider.minimumTrackTintColor = .lightGray + sepiaIntensitySlider.maximumTrackTintColor = .brown + } + + @IBAction func zoomBlurTapped(_ sender: Any) { + originalImage = imageView.image + filterSelected = .ciZoomBlur + + ciZoomBlurSlider.isHidden = false + ciZoomBlurSegmentedControl.isHidden = false + + } + + + @IBAction func addPhotoTapped(_ sender: Any) { + let authorizationStatus = PHPhotoLibrary.authorizationStatus() + + switch authorizationStatus { + case .authorized: + presentImagePickerController() + case .notDetermined: + + PHPhotoLibrary.requestAuthorization { (status) in + + guard status == .authorized else { + NSLog("User did not authorize access to the photo library") + + return + } + + self.presentImagePickerController() + } + + case .denied: + return + case .restricted: + return + + @unknown default: + print("FatalError") + } + presentImagePickerController() + } + + @IBAction func createExperienceButtonTapped(_ sender: Any) { + + view.endEditing(true) + guard let imageData = imageView.image?.jpegData(compressionQuality: 0.1), + let title = titleTextField.text, title != "" else { + print("ERROR") + return + } + + if isGeoTaggedSwitch.isOn { + LocationHelper.shared.getCurrentLocation { (coordinate) in + self.postController.createPost(with: title, ofType: .image, mediaData: imageData, ratio: self.imageView.image?.ratio, geotag: coordinate) { (success) in + guard success else { + + return + } + } + DispatchQueue.main.async { + self.navigationController?.popViewController(animated: true) + } + } + } else { + postController.createPost(with: title, ofType: .image, mediaData: imageData, ratio: imageView.image?.ratio, geotag: nil) { (success) in + guard success else { + + return + } + } + } + } + + + + // MARK: - AUDIO + + var audioPlayer: AVAudioPlayer? + private var audioData: Data? + + func setAudioData(data: Data?) { + audioData = data + } + + func playRecording(with audioData: Data) { + do { + audioPlayer = try AVAudioPlayer(data: audioData) + audioPlayer?.delegate = self + audioPlayer?.prepareToPlay() + audioPlayer?.play() + } catch { + print("Error Playing Audio Data") + } + } + + @IBAction func playRecording(_ sender: Any) { + guard let audioData = audioData else { return } + playRecording(with: audioData) + + } + + //MARK: - Image picker helper functions + private func presentImagePickerController() { + + guard UIImagePickerController.isSourceTypeAvailable(.photoLibrary) else { + return + } + + DispatchQueue.main.async { + let imagePicker = UIImagePickerController() + + imagePicker.delegate = self + + imagePicker.sourceType = .photoLibrary + + self.present(imagePicker, animated: true, completion: nil) + } + } +} + +//MARK: - UI image / navigation controller delegates + +extension CreateANewExperienceViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { + + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { + + addPhotoButton.setTitle("", for: []) + + picker.dismiss(animated: true, completion: nil) + + guard let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else { return } + + imageView.image = image + + //setImageViewHeight(with: image.ratio) + } + + func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + picker.dismiss(animated: true, completion: nil) + } +} + +extension CreateANewExperienceViewController: AudioCommentViewControllerDelegate { + func saveAudioCommentButtonWasTapped(_ audioData: Data, _ viewController: UIViewController) { + setAudioData(data: audioData) + + viewController.dismiss(animated: true, completion: nil) + } +} + +extension CreateANewExperienceViewController: AVAudioPlayerDelegate { + + func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { + } + + func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) { + if let error = error { + print("Audio Player error: \(error)") + } + } +} diff --git a/MyExperiences copy/MyExperiences/ViewControllers/MapViewController.swift b/MyExperiences copy/MyExperiences/ViewControllers/MapViewController.swift new file mode 100644 index 00000000..61ed3c5c --- /dev/null +++ b/MyExperiences copy/MyExperiences/ViewControllers/MapViewController.swift @@ -0,0 +1,77 @@ + // +// MapViewController.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import UIKit +import CoreLocation +import MapKit + +class MapViewController: UIViewController { + + var postController = PostController() + + @IBOutlet weak var mapView: MKMapView! + + private let annotationReuseIdentifier = "PostAnnotationView" + private var posts: [Post] = [] { + didSet { + let oldPosts = Set(oldValue) + let newPosts = Set(self.posts) + let addedPosts = Array(newPosts.subtracting(oldPosts)) + let removedPosts = Array(oldPosts.subtracting(newPosts)) + mapView.removeAnnotations(removedPosts) + mapView.addAnnotations(addedPosts) + mapView.showAnnotations(self.posts, animated: true) + } + } + + override func viewDidLoad() { + + super.viewDidLoad() + self.mapView.showsUserLocation = true + self.mapView.delegate = self + self.mapView.register(MKMarkerAnnotationView.self, forAnnotationViewWithReuseIdentifier: annotationReuseIdentifier) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + postController.observePosts { (_) in + print("TEST WORKED") + for post in self.postController.posts where post.geotag != nil { + self.posts.append(post) + } + } + + } +} + + extension MapViewController: MKMapViewDelegate { + func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) { + + } + + func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { + guard let post = annotation as? Post else { return nil } + + guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationReuseIdentifier, for: post) as? MKMarkerAnnotationView else { + fatalError("Missing registered map annotation view") + } + + annotationView.canShowCallout = true + annotationView.animatesWhenAdded = true + annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) + + return annotationView + } + +// func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { +// guard let post = view.annotation as? Post else { return } +// +// // self.performSegue(withIdentifier: "DetailSegue", sender: post) +// } + } diff --git a/MyExperiences copy/MyExperiences/ViewControllers/RecordAudioViewController.swift b/MyExperiences copy/MyExperiences/ViewControllers/RecordAudioViewController.swift new file mode 100644 index 00000000..342cadd7 --- /dev/null +++ b/MyExperiences copy/MyExperiences/ViewControllers/RecordAudioViewController.swift @@ -0,0 +1,219 @@ +// +// RecordAudioViewController.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/6/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import UIKit +import AVFoundation + +protocol AudioCommentViewControllerDelegate { + func saveAudioCommentButtonWasTapped(_ audioData: Data, _ viewController: UIViewController) +} + +class RecordAudioViewController: UIViewController { + + var delegate: AudioCommentViewControllerDelegate? + + @IBOutlet weak var recordButton: UIButton! + @IBOutlet weak var playButton: UIButton! + @IBOutlet weak var timeAllotedLabel: UILabel! + @IBOutlet weak var timeRemainingLabel: UILabel! + @IBOutlet weak var timeSlider: UISlider! + + private lazy var timeFormatter: DateComponentsFormatter = { + let formatting = DateComponentsFormatter() + formatting.unitsStyle = .positional // 00:00 mm:ss + // NOTE: DateComponentFormatter is good for minutes/hours/seconds + // DateComponentsFormatter not good for milliseconds, use DateFormatter instead) + formatting.zeroFormattingBehavior = .pad + formatting.allowedUnits = [.minute, .second] + return formatting + }() + + override func viewDidLoad() { + super.viewDidLoad() + + timeAllotedLabel.font = UIFont.monospacedDigitSystemFont(ofSize: timeAllotedLabel.font.pointSize, + weight: .regular) + timeRemainingLabel.font = UIFont.monospacedDigitSystemFont(ofSize: timeRemainingLabel.font.pointSize, + weight: .regular) + updateViews() + } + + @IBAction func saveAudioCommentButtonTapped(_ sender: UIButton) { + guard let recordURL = recordURL else { return } + do { + let audioData = try Data(contentsOf: recordURL) + delegate?.saveAudioCommentButtonWasTapped(audioData, self) + } catch { + print("Error creating audio data from url") + } + } + + // Playback APIs + var audioPlayer: AVAudioPlayer? + + var timer: Timer? + + private func loadAudio() { + let songURL = Bundle.main.url(forResource: "piano", withExtension: "mp3")! + + audioPlayer = try! AVAudioPlayer(contentsOf: songURL) // FIXME: catch error and print + audioPlayer?.delegate = self + } + + var isPlaying: Bool { + audioPlayer?.isPlaying ?? false + } + + func play() { + audioPlayer?.play() + updateViews() + startTimer() + } + + func pause() { + audioPlayer?.pause() + updateViews() + cancelTimer() + } + + func playPause() { + if isPlaying { + pause() + } else { + play() + } + } + + private func startTimer() { + cancelTimer() + timer = Timer.scheduledTimer(timeInterval: 0.03, + target: self, + selector: #selector(updateTimer(timer:)), + userInfo: nil, + repeats: true) + } + + @objc private func updateTimer(timer: Timer) { + updateViews() + } + + private func cancelTimer() { + timer?.invalidate() + timer = nil + } + + + @IBAction func playButtonPressed(_ sender: Any) { + playPause() + } + + // Record APIs + + var audioRecorder: AVAudioRecorder? + var recordURL: URL? + + var isRecording: Bool { + return audioRecorder?.isRecording ?? false + } + + func record() { + let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! + + let name = ISO8601DateFormatter.string(from: Date(), timeZone: .current, formatOptions: [.withInternetDateTime]) + + let file = documents.appendingPathComponent(name).appendingPathExtension("caf") + recordURL = file + + print("record: \(file)") + + // 44.1 KHz 44,100 samples per second + let format = AVAudioFormat(standardFormatWithSampleRate: 44_100, channels: 1)! // FIXME: error handling + + audioRecorder = try! AVAudioRecorder(url: file, format: format) // FIXME: try! + audioRecorder?.delegate = self + audioRecorder?.record() + updateViews() + } + + func stop() { + audioRecorder?.stop() + audioRecorder = nil + updateViews() + } + + func recordToggle() { + if isRecording { + stop() + } else { + record() + } + } + + @IBAction func recordButtonPressed(_ sender: Any) { + recordToggle() + } + + + private func updateViews() { + let playButtonTitle = isPlaying ? "Pause" : "Play" + playButton.setTitle(playButtonTitle, for: .normal) + + let elapsedTime = audioPlayer?.currentTime ?? 0 + let duration = audioPlayer?.duration ?? 0 + timeAllotedLabel.text = timeFormatter.string(from: elapsedTime) + + timeSlider.minimumValue = 0 + timeSlider.maximumValue = Float(duration) + timeSlider.value = Float(elapsedTime) + + let recordButtonTitle = isRecording ? "Stop" : "Record" + recordButton.setTitle(recordButtonTitle, for: .normal) + + let timeRemaining = duration - elapsedTime + timeRemainingLabel.text = timeFormatter.string(from: timeRemaining) + } + +} + +extension RecordAudioViewController: AVAudioPlayerDelegate { + + func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { + updateViews() + } + + func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) { + if let error = error { + print("Audio Player error: \(error)") + } + } +} + +// TODO: Store the fileURL +// TODO: Get permission to record audio + +extension RecordAudioViewController: AVAudioRecorderDelegate { + + func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) { + if let error = error { + print("Audio recorder error: \(error)") + } + } + + func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) { + + // TODO: Update player to load our audio file + print("Finished Recording") + if let recordURL = recordURL { + audioPlayer = try! AVAudioPlayer(contentsOf: recordURL) // FIXME: try! + audioPlayer?.delegate = self + updateViews() + } + + } + +} diff --git a/MyExperiences copy/MyExperiences/ViewControllers/SignInViewController.swift b/MyExperiences copy/MyExperiences/ViewControllers/SignInViewController.swift new file mode 100644 index 00000000..be0c06a3 --- /dev/null +++ b/MyExperiences copy/MyExperiences/ViewControllers/SignInViewController.swift @@ -0,0 +1,76 @@ +// +// SignInViewController.swift +// MyExperiences +// +// Created by Kelson Hartle on 7/10/20. +// Copyright © 2020 Kelson Hartle. All rights reserved. +// + +import UIKit +import Firebase +import GoogleSignIn + +class SignInViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + GIDSignIn.sharedInstance()?.presentingViewController = self + GIDSignIn.sharedInstance()?.delegate = self + + setUpSignInButton() + } + + @IBAction func googleSignIn(_ sender: Any) { + GIDSignIn.sharedInstance()?.signIn() + } +} + +extension SignInViewController: GIDSignInDelegate { + func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { + + if let error = error { + print("Error signing in with Google: \(error)") + return + } + + guard let authentication = user.authentication else { return } + + let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken) + + Auth.auth().signIn(with: credential) { (authResult, error) in + if let error = error { + print("Error signing in with Google: \(error)") + return + } + + DispatchQueue.main.async { + let storyboard = UIStoryboard(name: "Main", bundle: nil) + let postsNavigationController = storyboard.instantiateViewController(withIdentifier: "InitialVC") + postsNavigationController.modalPresentationStyle = .fullScreen + self.present(postsNavigationController, animated: false, completion: nil) + } + } + } + + func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) { + print("User disconnected") + } + + func setUpSignInButton() { + + let button = GIDSignInButton() + + button.translatesAutoresizingMaskIntoConstraints = false + + view.addSubview(button) + + + let buttonCenterXConstraint = button.centerXAnchor.constraint(equalTo: view.centerXAnchor) + let buttonCenterYConstraint = button.centerYAnchor.constraint(equalTo: view.centerYAnchor) + let buttonWidthConstraint = button.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.5) + + view.addConstraints([buttonCenterXConstraint, + buttonCenterYConstraint, + buttonWidthConstraint]) + } +} diff --git a/MyExperiences copy/Podfile b/MyExperiences copy/Podfile new file mode 100644 index 00000000..09a88b0f --- /dev/null +++ b/MyExperiences copy/Podfile @@ -0,0 +1,16 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'MyExperiences' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for MyExperiences + pod 'Firebase/Core' + pod 'Firebase/Database' + pod 'Firebase/Storage' + pod 'Firebase/Auth' + pod 'FirebaseUI/Google' + pod 'GoogleSignIn' + +end diff --git a/MyExperiences copy/Podfile.lock b/MyExperiences copy/Podfile.lock new file mode 100644 index 00000000..28c8297b --- /dev/null +++ b/MyExperiences copy/Podfile.lock @@ -0,0 +1,165 @@ +PODS: + - AppAuth (1.4.0): + - AppAuth/Core (= 1.4.0) + - AppAuth/ExternalUserAgent (= 1.4.0) + - AppAuth/Core (1.4.0) + - AppAuth/ExternalUserAgent (1.4.0) + - Firebase/Auth (6.27.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 6.6.0) + - Firebase/Core (6.27.0): + - Firebase/CoreOnly + - FirebaseAnalytics (= 6.6.1) + - Firebase/CoreOnly (6.27.0): + - FirebaseCore (= 6.8.0) + - Firebase/Database (6.27.0): + - Firebase/CoreOnly + - FirebaseDatabase (~> 6.3.0) + - Firebase/Storage (6.27.0): + - Firebase/CoreOnly + - FirebaseStorage (~> 3.7.0) + - FirebaseAnalytics (6.6.1): + - FirebaseCore (~> 6.8) + - FirebaseInstallations (~> 1.4) + - GoogleAppMeasurement (= 6.6.1) + - GoogleUtilities/AppDelegateSwizzler (~> 6.0) + - GoogleUtilities/MethodSwizzler (~> 6.0) + - GoogleUtilities/Network (~> 6.0) + - "GoogleUtilities/NSData+zlib (~> 6.0)" + - nanopb (~> 1.30905.0) + - FirebaseAuth (6.6.0): + - FirebaseCore (~> 6.8) + - GoogleUtilities/AppDelegateSwizzler (~> 6.5) + - GoogleUtilities/Environment (~> 6.5) + - GTMSessionFetcher/Core (~> 1.1) + - FirebaseCore (6.8.0): + - FirebaseCoreDiagnostics (~> 1.3) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Logger (~> 6.5) + - FirebaseCoreDiagnostics (1.4.0): + - GoogleDataTransportCCTSupport (~> 3.1) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Logger (~> 6.5) + - nanopb (~> 1.30905.0) + - FirebaseDatabase (6.3.0): + - FirebaseCore (~> 6.8) + - leveldb-library (~> 1.22) + - FirebaseInstallations (1.4.0): + - FirebaseCore (~> 6.8) + - GoogleUtilities/Environment (~> 6.6) + - GoogleUtilities/UserDefaults (~> 6.6) + - PromisesObjC (~> 1.2) + - FirebaseStorage (3.7.0): + - FirebaseCore (~> 6.8) + - GTMSessionFetcher/Core (~> 1.1) + - FirebaseUI/Auth (8.4.2): + - Firebase/Auth (~> 6.0) + - GoogleUtilities/UserDefaults + - FirebaseUI/Google (8.4.2): + - FirebaseUI/Auth + - GoogleSignIn (~> 5.0) + - GoogleAppMeasurement (6.6.1): + - GoogleUtilities/AppDelegateSwizzler (~> 6.0) + - GoogleUtilities/MethodSwizzler (~> 6.0) + - GoogleUtilities/Network (~> 6.0) + - "GoogleUtilities/NSData+zlib (~> 6.0)" + - nanopb (~> 1.30905.0) + - GoogleDataTransport (6.2.1) + - GoogleDataTransportCCTSupport (3.2.0): + - GoogleDataTransport (~> 6.1) + - nanopb (~> 1.30905.0) + - GoogleSignIn (5.0.2): + - AppAuth (~> 1.2) + - GTMAppAuth (~> 1.0) + - GTMSessionFetcher/Core (~> 1.1) + - GoogleUtilities/AppDelegateSwizzler (6.6.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (6.6.0): + - PromisesObjC (~> 1.2) + - GoogleUtilities/Logger (6.6.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (6.6.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (6.6.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (6.6.0)" + - GoogleUtilities/Reachability (6.6.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (6.6.0): + - GoogleUtilities/Logger + - GTMAppAuth (1.0.0): + - AppAuth/Core (~> 1.0) + - GTMSessionFetcher (~> 1.1) + - GTMSessionFetcher (1.4.0): + - GTMSessionFetcher/Full (= 1.4.0) + - GTMSessionFetcher/Core (1.4.0) + - GTMSessionFetcher/Full (1.4.0): + - GTMSessionFetcher/Core (= 1.4.0) + - leveldb-library (1.22) + - nanopb (1.30905.0): + - nanopb/decode (= 1.30905.0) + - nanopb/encode (= 1.30905.0) + - nanopb/decode (1.30905.0) + - nanopb/encode (1.30905.0) + - PromisesObjC (1.2.9) + +DEPENDENCIES: + - Firebase/Auth + - Firebase/Core + - Firebase/Database + - Firebase/Storage + - FirebaseUI/Google + - GoogleSignIn + +SPEC REPOS: + trunk: + - AppAuth + - Firebase + - FirebaseAnalytics + - FirebaseAuth + - FirebaseCore + - FirebaseCoreDiagnostics + - FirebaseDatabase + - FirebaseInstallations + - FirebaseStorage + - FirebaseUI + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleDataTransportCCTSupport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - leveldb-library + - nanopb + - PromisesObjC + +SPEC CHECKSUMS: + AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 + Firebase: fc4cbf6f1592636431821ef9a3c557e4dfd9f268 + FirebaseAnalytics: 0ea640473474f036cabbc2576e20c2d63671c92f + FirebaseAuth: b85c064e0ac60f82486728d50a4803f235687302 + FirebaseCore: feda061cb1ee6d8ad4824f4a4a8ffbcfe284f595 + FirebaseCoreDiagnostics: 4505e4d4009b1d93f605088ee7d7764d5f0d1c84 + FirebaseDatabase: 3d02ffa794ec174853c086cf87cf2dc79bd6da49 + FirebaseInstallations: 293f567159b6d66d1c990f13bb868066096c94ec + FirebaseStorage: af7bdbd12177cf567df00904e3e3a93704f25b15 + FirebaseUI: e57e9b9c4340631151fbe67a14206d23d0974f37 + GoogleAppMeasurement: 2fd5c5a56c069db635c8e7b92d4809a9591d0a69 + GoogleDataTransport: 9a8a16f79feffc7f42096743de2a7c4815e84020 + GoogleDataTransportCCTSupport: 489c1265d2c85b68187a83a911913d190012158d + GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 + GoogleUtilities: 39530bc0ad980530298e9c4af8549e991fd033b1 + GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e + GTMSessionFetcher: 6f5c8abbab8a9bce4bb3f057e317728ec6182b10 + leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 + nanopb: c43f40fadfe79e8b8db116583945847910cbabc9 + PromisesObjC: b48e0338dbbac2207e611750777895f7a5811b75 + +PODFILE CHECKSUM: 4195f04b27b7f552f1bacbf30465a5eb43adf594 + +COCOAPODS: 1.9.3 diff --git a/MyExperiences copy/Pods/AppAuth/LICENSE b/MyExperiences copy/Pods/AppAuth/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/AppAuth/README.md b/MyExperiences copy/Pods/AppAuth/README.md new file mode 100644 index 00000000..5f54c2c3 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/README.md @@ -0,0 +1,574 @@ +![AppAuth for iOS and macOS](https://rawgit.com/openid/AppAuth-iOS/master/appauth_lockup.svg) +[![Build Status](https://travis-ci.org/openid/AppAuth-iOS.svg?branch=master)](https://travis-ci.org/openid/AppAuth-iOS) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) + +AppAuth for iOS and macOS is a client SDK for communicating with +[OAuth 2.0](https://tools.ietf.org/html/rfc6749) and +[OpenID Connect](http://openid.net/specs/openid-connect-core-1_0.html) providers. +It strives to +directly map the requests and responses of those specifications, while following +the idiomatic style of the implementation language. In addition to mapping the +raw protocol flows, convenience methods are available to assist with common +tasks like performing an action with fresh tokens. + +It follows the best practices set out in +[RFC 8252 - OAuth 2.0 for Native Apps](https://tools.ietf.org/html/rfc8252) +including using `SFAuthenticationSession` and `SFSafariViewController` on iOS +for the auth request. `UIWebView` and `WKWebView` are explicitly *not* +supported due to the security and usability reasons explained in +[Section 8.12 of RFC 8252](https://tools.ietf.org/html/rfc8252#section-8.12). + +It also supports the [PKCE](https://tools.ietf.org/html/rfc7636) extension to +OAuth, which was created to secure authorization codes in public clients when +custom URI scheme redirects are used. The library is friendly to other +extensions (standard or otherwise), with the ability to handle additional params +in all protocol requests and responses. + +## Specification + +### iOS + +#### Supported Versions + +AppAuth supports iOS 7 and above. + +iOS 9+ uses the in-app browser tab pattern +(via `SFSafariViewController`), and falls back to the system browser (mobile +Safari) on earlier versions. + +#### Authorization Server Requirements + +Both Custom URI Schemes (all supported versions of iOS) and Universal Links +(iOS 9+) can be used with the library. + +In general, AppAuth can work with any authorization server that supports +native apps, as documented in [RFC 8252](https://tools.ietf.org/html/rfc8252), +either through custom URI scheme redirects, or universal links. +Authorization servers that assume all clients are web-based, or require clients to maintain +confidentiality of the client secrets may not work well. + +### macOS + +#### Supported Versions + +AppAuth supports macOS (OS X) 10.9 and above. + +#### Authorization Server Requirements + +AppAuth for macOS supports both custom schemes; a loopback HTTP redirects +via a small embedded server. + +In general, AppAuth can work with any authorization server that supports +native apps, as documented in [RFC 8252](https://tools.ietf.org/html/rfc8252); +either through custom URI schemes, or loopback HTTP redirects. +Authorization servers that assume all clients are web-based, or require clients to maintain +confidentiality of the client secrets may not work well. + +## Try + +Want to try out AppAuth? Just run: + + pod try AppAuth + +Follow the instructions in [Examples/README.md](Examples/README.md) to configure +with your own OAuth client (you need to update three configuration points with your +client info to try the demo). + +## Setup + +AppAuth supports four options for dependency management. + +### Swift Package Manager + +With [Swift Package Manager](https://swift.org/package-manager), +add the following `dependency` to your `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/openid/AppAuth-iOS.git", .upToNextMajor(from: "1.3.0")) +] +``` + +### CocoaPods + +With [CocoaPods](https://guides.cocoapods.org/using/getting-started.html), +add the following line to your `Podfile`: + + pod 'AppAuth' + +Then, run `pod install`. + +### Carthage + +With [Carthage](https://github.com/Carthage/Carthage), add the following +line to your `Cartfile`: + + github "openid/AppAuth-iOS" "master" + +Then, run `carthage bootstrap`. + +### Static Library + +You can also use AppAuth as a static library. This requires linking the library +and your project, and including the headers. Here is a suggested configuration: + +1. Create an Xcode Workspace. +2. Add `AppAuth.xcodeproj` to your Workspace. +3. Include libAppAuth as a linked library for your target (in the "General -> +Linked Framework and Libraries" section of your target). +4. Add `AppAuth-iOS/Source` to your search paths of your target ("Build Settings -> +"Header Search Paths"). + +## Auth Flow + +AppAuth supports both manual interaction with the authorization server +where you need to perform your own token exchanges, as well as convenience +methods that perform some of this logic for you. This example uses the +convenience method, which returns either an `OIDAuthState` object, or an error. + +`OIDAuthState` is a class that keeps track of the authorization and token +requests and responses, and provides a convenience method to call an API with +fresh tokens. This is the only object that you need to serialize to retain the +authorization state of the session. + +### Configuration + +You can configure AppAuth by specifying the endpoints directly: + +Objective-C +```objc +NSURL *authorizationEndpoint = + [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/v2/auth"]; +NSURL *tokenEndpoint = + [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v4/token"]; + +OIDServiceConfiguration *configuration = + [[OIDServiceConfiguration alloc] + initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint]; + +// perform the auth request... +``` + +Swift +```swift +let authorizationEndpoint = URL(string: "https://accounts.google.com/o/oauth2/v2/auth")! +let tokenEndpoint = URL(string: "https://www.googleapis.com/oauth2/v4/token")! +let configuration = OIDServiceConfiguration(authorizationEndpoint: authorizationEndpoint, + tokenEndpoint: tokenEndpoint) + +// perform the auth request... +``` + +Or through discovery: + +Objective-C +```objc +NSURL *issuer = [NSURL URLWithString:@"https://accounts.google.com"]; + +[OIDAuthorizationService discoverServiceConfigurationForIssuer:issuer + completion:^(OIDServiceConfiguration *_Nullable configuration, + NSError *_Nullable error) { + + if (!configuration) { + NSLog(@"Error retrieving discovery document: %@", + [error localizedDescription]); + return; + } + + // perform the auth request... +}]; +``` + +Swift +```swift +let issuer = URL(string: "https://accounts.google.com")! + +// discovers endpoints +OIDAuthorizationService.discoverConfiguration(forIssuer: issuer) { configuration, error in + guard let config = configuration else { + print("Error retrieving discovery document: \(error?.localizedDescription ?? "Unknown error")") + return + } + + // perform the auth request... +} +``` + +### Authorizing – iOS + +First, you need to have a property in your `UIApplicationDelegate` +implementation to hold the session, in order to continue the authorization flow +from the redirect. In this example, the implementation of this delegate is +a class named `AppDelegate`, if your app's application delegate has a different +name, please update the class name in samples below accordingly. + +Objective-C +```objc +@interface AppDelegate : UIResponder +// property of the app's AppDelegate +@property(nonatomic, strong, nullable) id currentAuthorizationFlow; +@end +``` + +Swift +```swift +class AppDelegate: UIResponder, UIApplicationDelegate { + // property of the app's AppDelegate + var currentAuthorizationFlow: OIDExternalUserAgentSession? +} +``` + + +And your main class, a property to store the auth state: + +Objective-C +```objc +// property of the containing class +@property(nonatomic, strong, nullable) OIDAuthState *authState; +``` +Swift +```swift +// property of the containing class +private var authState: OIDAuthState? +``` + + +Then, initiate the authorization request. By using the +`authStateByPresentingAuthorizationRequest` convenience method, the token +exchange will be performed automatically, and everything will be protected with +PKCE (if the server supports it). AppAuth also lets you perform these +requests manually. See the `authNoCodeExchange` method in the included Example +app for a demonstration: + +Objective-C +```objc +// builds authentication request +OIDAuthorizationRequest *request = + [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration + clientId:kClientID + scopes:@[OIDScopeOpenID, + OIDScopeProfile] + redirectURL:kRedirectURI + responseType:OIDResponseTypeCode + additionalParameters:nil]; + +// performs authentication request +AppDelegate *appDelegate = + (AppDelegate *)[UIApplication sharedApplication].delegate; +appDelegate.currentAuthorizationFlow = + [OIDAuthState authStateByPresentingAuthorizationRequest:request + presentingViewController:self + callback:^(OIDAuthState *_Nullable authState, + NSError *_Nullable error) { + if (authState) { + NSLog(@"Got authorization tokens. Access token: %@", + authState.lastTokenResponse.accessToken); + [self setAuthState:authState]; + } else { + NSLog(@"Authorization error: %@", [error localizedDescription]); + [self setAuthState:nil]; + } +}]; +``` + +Swift +```swift +// builds authentication request +let request = OIDAuthorizationRequest(configuration: configuration, + clientId: clientID, + clientSecret: clientSecret, + scopes: [OIDScopeOpenID, OIDScopeProfile], + redirectURL: redirectURI, + responseType: OIDResponseTypeCode, + additionalParameters: nil) + +// performs authentication request +print("Initiating authorization request with scope: \(request.scope ?? "nil")") + +let appDelegate = UIApplication.shared.delegate as! AppDelegate + +appDelegate.currentAuthorizationFlow = + OIDAuthState.authState(byPresenting: request, presenting: self) { authState, error in + if let authState = authState { + self.setAuthState(authState) + print("Got authorization tokens. Access token: " + + "\(authState.lastTokenResponse?.accessToken ?? "nil")") + } else { + print("Authorization error: \(error?.localizedDescription ?? "Unknown error")") + self.setAuthState(nil) + } +} +``` + +*Handling the Redirect* + +The authorization response URL is returned to the app via the iOS openURL +app delegate method, so you need to pipe this through to the current +authorization session (created in the previous session): + +Objective-C +```objc +- (BOOL)application:(UIApplication *)app + openURL:(NSURL *)url + options:(NSDictionary *)options { + // Sends the URL to the current authorization flow (if any) which will + // process it if it relates to an authorization response. + if ([_currentAuthorizationFlow resumeExternalUserAgentFlowWithURL:url]) { + _currentAuthorizationFlow = nil; + return YES; + } + + // Your additional URL handling (if any) goes here. + + return NO; +} +``` + +Swift +```swift +func application(_ app: UIApplication, + open url: URL, + options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { + // Sends the URL to the current authorization flow (if any) which will + // process it if it relates to an authorization response. + if let authorizationFlow = self.currentAuthorizationFlow, + authorizationFlow.resumeExternalUserAgentFlow(with: url) { + self.currentAuthorizationFlow = nil + return true + } + + // Your additional URL handling (if any) + + return false +} +``` + +### Authorizing – MacOS + +On macOS, the most popular way to get the authorization response redirect is to +start a local HTTP server on the loopback interface (limited to incoming +requests from the user's machine only). When the authorization is complete, the +user is redirected to that local server, and the authorization response can be +processed by the app. AppAuth takes care of managing the local HTTP server +lifecycle for you. + +> #### :bulb: Alternative: Custom URI Schemes +> Custom URI schemes are also supported on macOS, but some browsers display +> an interstitial, which reduces the usability. For an example on using custom +> URI schemes with macOS, See `Example-Mac`. + +To receive the authorization response using a local HTTP server, first you need +to have an instance variable in your main class to retain the HTTP redirect +handler: + +Objective-C +```objc +OIDRedirectHTTPHandler *_redirectHTTPHandler; +``` + +Then, as the port used by the local HTTP server varies, you need to start it +before building the authorization request, in order to get the exact redirect +URI to use: + +Objective-C +```objc +static NSString *const kSuccessURLString = + @"http://openid.github.io/AppAuth-iOS/redirect/"; +NSURL *successURL = [NSURL URLWithString:kSuccessURLString]; + +// Starts a loopback HTTP redirect listener to receive the code. This needs to be started first, +// as the exact redirect URI (including port) must be passed in the authorization request. +_redirectHTTPHandler = [[OIDRedirectHTTPHandler alloc] initWithSuccessURL:successURL]; +NSURL *redirectURI = [_redirectHTTPHandler startHTTPListener:nil]; +``` + +Then, initiate the authorization request. By using the +`authStateByPresentingAuthorizationRequest` convenience method, the token +exchange will be performed automatically, and everything will be protected with +PKCE (if the server supports it). By assigning the return value to the +`OIDRedirectHTTPHandler`'s `currentAuthorizationFlow`, the authorization will +continue automatically once the user makes their choice: + +```objc +// builds authentication request +OIDAuthorizationRequest *request = + [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration + clientId:kClientID + clientSecret:kClientSecret + scopes:@[ OIDScopeOpenID ] + redirectURL:redirectURI + responseType:OIDResponseTypeCode + additionalParameters:nil]; +// performs authentication request +__weak __typeof(self) weakSelf = self; +_redirectHTTPHandler.currentAuthorizationFlow = + [OIDAuthState authStateByPresentingAuthorizationRequest:request + callback:^(OIDAuthState *_Nullable authState, + NSError *_Nullable error) { + // Brings this app to the foreground. + [[NSRunningApplication currentApplication] + activateWithOptions:(NSApplicationActivateAllWindows | + NSApplicationActivateIgnoringOtherApps)]; + + // Processes the authorization response. + if (authState) { + NSLog(@"Got authorization tokens. Access token: %@", + authState.lastTokenResponse.accessToken); + } else { + NSLog(@"Authorization error: %@", error.localizedDescription); + } + [weakSelf setAuthState:authState]; +}]; +``` + +### Making API Calls + +AppAuth gives you the raw token information, if you need it. However, we +recommend that users of the `OIDAuthState` convenience wrapper use the provided +`performActionWithFreshTokens:` method to perform their API calls to avoid +needing to worry about token freshness: + +Objective-C +```objc +[_authState performActionWithFreshTokens:^(NSString *_Nonnull accessToken, + NSString *_Nonnull idToken, + NSError *_Nullable error) { + if (error) { + NSLog(@"Error fetching fresh tokens: %@", [error localizedDescription]); + return; + } + + // perform your API request using the tokens +}]; +``` + +Swift +```swift +let userinfoEndpoint = URL(string:"https://openidconnect.googleapis.com/v1/userinfo")! +self.authState?.performAction() { (accessToken, idToken, error) in + + if error != nil { + print("Error fetching fresh tokens: \(error?.localizedDescription ?? "Unknown error")") + return + } + guard let accessToken = accessToken else { + return + } + + // Add Bearer token to request + var urlRequest = URLRequest(url: userinfoEndpoint) + urlRequest.allHTTPHeaderFields = ["Authorization": "Bearer \(accessToken)"] + + // Perform request... +} +``` + +### Custom User-Agents + +Each OAuth flow involves presenting an external user-agent to the user, that +allows them to interact with the OAuth authorization server. Typical examples +of a user-agent are the user's browser, or an in-app browser tab incarnation +like `ASWebAuthenticationSession` on iOS. + +AppAuth ships with several implementations of an external user-agent out of the +box, including defaults for iOS and macOS suitable for most cases. The default +user-agents typically share persistent cookies with the system default browser, +to improve the chance that the user doesn't need to sign-in all over again. + +It is possible to change the user-agent that AppAuth uses, and even write your +own - all without needing to fork the library. + +All implementations of the external user-agent, be they included or created by +you need to conform to the +[`OIDExternalUserAgent`](http://openid.github.io/AppAuth-iOS/docs/latest/protocol_o_i_d_external_user_agent-p.html) +protocol. + +Instances of the `OIDExternalUserAgent`are passed into +[`OIDAuthState.authStateByPresentingAuthorizationRequest:externalUserAgent:callback`](http://openid.github.io/AppAuth-iOS/docs/latest/interface_o_i_d_auth_state.html#ac762fe2bf95c116f0b437419be211fa1) +and/or +[`OIDAuthorizationService.presentAuthorizationRequest:externalUserAgent:callback:`](http://openid.github.io/AppAuth-iOS/docs/latest/interface_o_i_d_authorization_service.html#ae551f8e6887366a46e49b09b37389b8f) +rather than using the platform-specific convenience methods (which use the +default user-agents for their respective platforms), like +[`OIDAuthState.authStateByPresentingAuthorizationRequest:presentingViewController:callback:`](http://openid.github.io/AppAuth-iOS/docs/latest/category_o_i_d_auth_state_07_i_o_s_08.html#ae32fd0732cd3192cd5219f2655a4c85c). + +Popular use-cases for writing your own user-agent implementation include needing +to style the user-agent in ways not supported by AppAuth, and implementing a +fully custom flow with your own business logic. You can take one of the existing +implementations as a starting point to copy, rename, and customize to your +needs. + +#### Custom Browser User-Agent + +AppAuth for iOS includes a few extra user-agent implementations which you can +try, or use as a reference for your own implementation. One of them, +[`OIDExternalUserAgentIOSCustomBrowser`](http://openid.github.io/AppAuth-iOS/docs/latest/interface_o_i_d_external_user_agent_i_o_s_custom_browser.html) +enables you to use a different browser for authentication, like Chrome for iOS +or Firefox for iOS. + +Here's how to configure AppAuth to use a custom browser using the +`OIDExternalUserAgentIOSCustomBrowser` user agent: + +First, add the following array to your +[Info.plist](https://github.com/openid/AppAuth-iOS/blob/135f99d2cb4e9d18d310ac2588b905e612461561/Examples/Example-iOS_ObjC/Source/Info.plist#L34) +(in XCode, right click -> Open As -> Source Code) + +``` + LSApplicationQueriesSchemes + + googlechromes + opera-https + firefox + +``` + +This is required so that AppAuth can test for the browser and open the app store +if it's not installed (the default behavior of this user-agent). You only need +to include the URL scheme of the actual browser you intend to use. + +Objective-C +```objc +// performs authentication request +AppDelegate *appDelegate = + (AppDelegate *)[UIApplication sharedApplication].delegate; +id userAgent = + [OIDExternalUserAgentIOSCustomBrowser CustomBrowserChrome]; +appDelegate.currentAuthorizationFlow = + [OIDAuthState authStateByPresentingAuthorizationRequest:request + externalUserAgent:self + callback:^(OIDAuthState *_Nullable authState, + NSError *_Nullable error) { + if (authState) { + NSLog(@"Got authorization tokens. Access token: %@", + authState.lastTokenResponse.accessToken); + [self setAuthState:authState]; + } else { + NSLog(@"Authorization error: %@", [error localizedDescription]); + [self setAuthState:nil]; + } +}]; +``` + +That's it! With those two changes (which you can try on the included sample), +AppAuth will use Chrome iOS for the authorization request (and open Chrome in +the App Store if it's not installed). + +⚠️**Note: the `OIDExternalUserAgentIOSCustomBrowser` user-agent is not intended for consumer apps**. It is designed for +advanced enterprise use-cases where the app developers have greater control over +the operating environment and have special requirements that require a custom +browser like Chrome. + +You don't need to stop with the included external user agents either! Since the +[`OIDExternalUserAgent`](http://openid.github.io/AppAuth-iOS/docs/latest/protocol_o_i_d_external_user_agent-p.html) +protocol is part of AppAuth's public API, you can implement your own versions of +it. In the above example, +`userAgent = [OIDExternalUserAgentIOSCustomBrowser CustomBrowserChrome]` would +be replaced with an instantiation of your user-agent implementation. + +## API Documentation + +Browse the [API documentation](http://openid.github.io/AppAuth-iOS/docs/latest/annotated.html). + +## Included Samples + +Sample apps that explore core AppAuth features are available for iOS and macOS; follow the instructions in [Examples/README.md](Examples/README.md) to get started. diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuth.h new file mode 100644 index 00000000..4f779df3 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth.h @@ -0,0 +1,92 @@ +/*! @file AppAuth.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDAuthState.h" +#import "OIDAuthStateChangeDelegate.h" +#import "OIDAuthStateErrorDelegate.h" +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationService.h" +#import "OIDError.h" +#import "OIDErrorUtilities.h" +#import "OIDExternalUserAgent.h" +#import "OIDExternalUserAgentRequest.h" +#import "OIDExternalUserAgentSession.h" +#import "OIDGrantTypes.h" +#import "OIDIDToken.h" +#import "OIDRegistrationRequest.h" +#import "OIDRegistrationResponse.h" +#import "OIDResponseTypes.h" +#import "OIDScopes.h" +#import "OIDScopeUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDServiceDiscovery.h" +#import "OIDTokenRequest.h" +#import "OIDTokenResponse.h" +#import "OIDTokenUtilities.h" +#import "OIDURLSessionProvider.h" +#import "OIDEndSessionRequest.h" +#import "OIDEndSessionResponse.h" + +#if TARGET_OS_TV +#elif TARGET_OS_WATCH +#elif TARGET_OS_IOS || TARGET_OS_MACCATALYST +#import "OIDAuthState+IOS.h" +#import "OIDAuthorizationService+IOS.h" +#import "OIDExternalUserAgentIOS.h" +#import "OIDExternalUserAgentIOSCustomBrowser.h" +#import "OIDExternalUserAgentCatalyst.h" +#elif TARGET_OS_MAC +#import "OIDAuthState+Mac.h" +#import "OIDAuthorizationService+Mac.h" +#import "OIDExternalUserAgentMac.h" +#import "OIDRedirectHTTPHandler.h" +#else +#error "Platform Undefined" +#endif + +/*! @mainpage AppAuth for iOS and macOS + + @section introduction Introduction + + AppAuth for iOS and macOS is a client SDK for communicating with [OAuth 2.0] + (https://tools.ietf.org/html/rfc6749) and [OpenID Connect] + (http://openid.net/specs/openid-connect-core-1_0.html) providers. It strives to + directly map the requests and responses of those specifications, while following + the idiomatic style of the implementation language. In addition to mapping the + raw protocol flows, convenience methods are available to assist with common + tasks like performing an action with fresh tokens. + + It follows the best practices set out in + [RFC 8252 - OAuth 2.0 for Native Apps](https://tools.ietf.org/html/rfc8252) + including using `SFAuthenticationSession` and `SFSafariViewController` on iOS + for the auth request. Web view and `WKWebView` are explicitly *not* + supported due to the security and usability reasons explained in + [Section 8.12 of RFC 8252](https://tools.ietf.org/html/rfc8252#section-8.12). + + It also supports the [PKCE](https://tools.ietf.org/html/rfc7636) extension to + OAuth which was created to secure authorization codes in public clients when + custom URI scheme redirects are used. The library is friendly to other + extensions (standard or otherwise) with the ability to handle additional params + in all protocol requests and responses. + + Homepage: http://openid.github.io/AppAuth-iOS/
+ API Documentation: http://openid.github.io/AppAuth-iOS/docs/latest
+ Git Repository: https://github.com/openid/AppAuth-iOS
+ + */ diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.h new file mode 100644 index 00000000..99ca4573 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.h @@ -0,0 +1,63 @@ +/*! @file OIDAuthState+IOS.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import + +#import "OIDAuthState.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief iOS specific convenience methods for @c OIDAuthState. + */ +@interface OIDAuthState (IOS) + +/*! @brief Convenience method to create a @c OIDAuthState by presenting an authorization request + and performing the authorization code exchange in the case of code flow requests. For + the hybrid flow, the caller should validate the id_token and c_hash, then perform the token + request (@c OIDAuthorizationService.performTokenRequest:callback:) + and update the OIDAuthState with the results (@c + OIDAuthState.updateWithTokenResponse:error:). + @param authorizationRequest The authorization request to present. + @param presentingViewController The view controller from which to present the + @c SFSafariViewController. On iOS 13, the window of this UIViewController + is used as the ASPresentationAnchor. + @param callback The method called when the request has completed or failed. + @return A @c OIDExternalUserAgentSession instance which will terminate when it + receives a @c OIDExternalUserAgentSession.cancel message, or after processing a + @c OIDExternalUserAgentSession.resumeExternalUserAgentFlowWithURL: message. + */ ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + presentingViewController:(UIViewController *)presentingViewController + callback:(OIDAuthStateAuthorizationCallback)callback; + ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + callback:(OIDAuthStateAuthorizationCallback)callback API_AVAILABLE(ios(11)) API_UNAVAILABLE(macCatalyst) + __deprecated_msg("This method will not work on iOS 13. Use " + "authStateByPresentingAuthorizationRequest:presentingViewController:callback:"); + +@end + +NS_ASSUME_NONNULL_END + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.m new file mode 100644 index 00000000..9f3a4e8c --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.m @@ -0,0 +1,58 @@ +/*! @file OIDAuthState+IOS.m + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import "OIDAuthState+IOS.h" +#import "OIDExternalUserAgentIOS.h" +#import "OIDExternalUserAgentCatalyst.h" + +@implementation OIDAuthState (IOS) + ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + presentingViewController:(UIViewController *)presentingViewController + callback:(OIDAuthStateAuthorizationCallback)callback { + id externalUserAgent; +#if TARGET_OS_MACCATALYST + externalUserAgent = [[OIDExternalUserAgentCatalyst alloc] + initWithPresentingViewController:presentingViewController]; +#else // TARGET_OS_MACCATALYST + externalUserAgent = [[OIDExternalUserAgentIOS alloc] initWithPresentingViewController:presentingViewController]; +#endif // TARGET_OS_MACCATALYST + return [self authStateByPresentingAuthorizationRequest:authorizationRequest + externalUserAgent:externalUserAgent + callback:callback]; +} + +#if !TARGET_OS_MACCATALYST ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + callback:(OIDAuthStateAuthorizationCallback)callback { + OIDExternalUserAgentIOS *externalUserAgent = [[OIDExternalUserAgentIOS alloc] init]; + return [self authStateByPresentingAuthorizationRequest:authorizationRequest + externalUserAgent:externalUserAgent + callback:callback]; +} +#endif // !TARGET_OS_MACCATALYST + +@end + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.h new file mode 100644 index 00000000..c6e14f19 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.h @@ -0,0 +1,50 @@ +/*! @file OIDAuthorizationService+IOS.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import + +#import "OIDAuthorizationService.h" +#import "OIDExternalUserAgentSession.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Provides iOS specific authorization request handling. + */ +@interface OIDAuthorizationService (IOS) + +/*! @brief Perform an authorization flow using \SFSafariViewController. + @param request The authorization request. + @param presentingViewController The view controller from which to present the + \SFSafariViewController. + @param callback The method called when the request has completed or failed. + @return A @c OIDExternalUserAgentSession instance which will terminate when it + receives a @c OIDExternalUserAgentSession.cancel message, or after processing a + @c OIDExternalUserAgentSession.resumeExternalUserAgentFlowWithURL: message. + */ ++ (id) presentAuthorizationRequest:(OIDAuthorizationRequest *)request + presentingViewController:(UIViewController *)presentingViewController + callback:(OIDAuthorizationCallback)callback; +@end + +NS_ASSUME_NONNULL_END + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.m new file mode 100644 index 00000000..05ccff5d --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.m @@ -0,0 +1,48 @@ +/*! @file OIDAuthorizationService+IOS.m + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import "OIDAuthorizationService+IOS.h" +#import "OIDExternalUserAgentIOS.h" +#import "OIDExternalUserAgentCatalyst.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation OIDAuthorizationService (IOS) + ++ (id) presentAuthorizationRequest:(OIDAuthorizationRequest *)request + presentingViewController:(UIViewController *)presentingViewController + callback:(OIDAuthorizationCallback)callback { + id externalUserAgent; +#if TARGET_OS_MACCATALYST + externalUserAgent = [[OIDExternalUserAgentCatalyst alloc] + initWithPresentingViewController:presentingViewController]; +#else // TARGET_OS_MACCATALYST + externalUserAgent = [[OIDExternalUserAgentIOS alloc] initWithPresentingViewController:presentingViewController]; +#endif // TARGET_OS_MACCATALYST + return [self presentAuthorizationRequest:request externalUserAgent:externalUserAgent callback:callback]; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h new file mode 100644 index 00000000..d98d4413 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h @@ -0,0 +1,52 @@ +/*! @file OIDExternalUserAgentCatalyst.h + @brief AppAuth iOS SDK + @copyright + Copyright 2019 The AppAuth Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import + +#import "OIDExternalUserAgent.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief A Catalyst specific external user-agent that uses `ASWebAuthenticationSession` to + present the request. +*/ +API_AVAILABLE(macCatalyst(13)) API_UNAVAILABLE(ios) +@interface OIDExternalUserAgentCatalyst : NSObject + +/*! @internal + @brief Unavailable. Please use @c initWithPresentingViewController: + */ +- (nonnull instancetype)init NS_UNAVAILABLE; + +/*! @brief The designated initializer. + @param presentingViewController The view controller from which to present the + \SFSafariViewController. + */ +- (nullable instancetype)initWithPresentingViewController: + (UIViewController *)presentingViewController + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m new file mode 100644 index 00000000..fc9cef5c --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m @@ -0,0 +1,145 @@ +/*! @file OIDExternalUserAgentCatalyst.m + @brief AppAuth iOS SDK + @copyright + Copyright 2019 The AppAuth Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import "OIDExternalUserAgentCatalyst.h" + +#import +#import + +#import "OIDErrorUtilities.h" +#import "OIDExternalUserAgentSession.h" +#import "OIDExternalUserAgentRequest.h" + +#if TARGET_OS_MACCATALYST + +NS_ASSUME_NONNULL_BEGIN + +@interface OIDExternalUserAgentCatalyst () +@end + +@implementation OIDExternalUserAgentCatalyst { + UIViewController *_presentingViewController; + + BOOL _externalUserAgentFlowInProgress; + __weak id _session; + ASWebAuthenticationSession *_webAuthenticationVC; +} + +- (nullable instancetype)initWithPresentingViewController: + (UIViewController *)presentingViewController { + self = [super init]; + if (self) { + _presentingViewController = presentingViewController; + } + return self; +} + +- (BOOL)presentExternalUserAgentRequest:(id)request + session:(id)session { + if (_externalUserAgentFlowInProgress) { + // TODO: Handle errors as authorization is already in progress. + return NO; + } + + _externalUserAgentFlowInProgress = YES; + _session = session; + BOOL openedUserAgent = NO; + NSURL *requestURL = [request externalUserAgentRequestURL]; + + __weak OIDExternalUserAgentCatalyst *weakSelf = self; + NSString *redirectScheme = request.redirectScheme; + ASWebAuthenticationSession *authenticationVC = + [[ASWebAuthenticationSession alloc] initWithURL:requestURL + callbackURLScheme:redirectScheme + completionHandler:^(NSURL * _Nullable callbackURL, + NSError * _Nullable error) { + __strong OIDExternalUserAgentCatalyst *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + strongSelf->_webAuthenticationVC = nil; + if (callbackURL) { + [strongSelf->_session resumeExternalUserAgentFlowWithURL:callbackURL]; + } else { + NSError *safariError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeUserCanceledAuthorizationFlow + underlyingError:error + description:nil]; + [strongSelf->_session failExternalUserAgentFlowWithError:safariError]; + } + }]; + + authenticationVC.presentationContextProvider = self; + _webAuthenticationVC = authenticationVC; + openedUserAgent = [authenticationVC start]; + + if (!openedUserAgent) { + [self cleanUp]; + NSError *safariError = [OIDErrorUtilities errorWithCode:OIDErrorCodeSafariOpenError + underlyingError:nil + description:@"Unable to open ASWebAuthenticationSession view controller."]; + [session failExternalUserAgentFlowWithError:safariError]; + } + return openedUserAgent; +} + +- (void)dismissExternalUserAgentAnimated:(BOOL)animated completion:(void (^)(void))completion { + if (!_externalUserAgentFlowInProgress) { + // Ignore this call if there is no authorization flow in progress. + if (completion) completion(); + return; + } + + ASWebAuthenticationSession *webAuthenticationVC = _webAuthenticationVC; + + [self cleanUp]; + + if (webAuthenticationVC) { + // dismiss the ASWebAuthenticationSession + [webAuthenticationVC cancel]; + if (completion) completion(); + } else { + if (completion) completion(); + } +} + +- (void)cleanUp { + // The weak reference to |_session| is set to nil to avoid accidentally using + // it while not in an authorization flow. + _webAuthenticationVC = nil; + _session = nil; + _externalUserAgentFlowInProgress = NO; +} + +#pragma mark - ASWebAuthenticationPresentationContextProviding + +- (ASPresentationAnchor)presentationAnchorForWebAuthenticationSession:(ASWebAuthenticationSession *)session { + return _presentingViewController.view.window; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif // TARGET_OS_MACCATALYST + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.h new file mode 100644 index 00000000..7261c050 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.h @@ -0,0 +1,53 @@ +/*! @file OIDExternalUserAgentIOS.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import + +#import "OIDExternalUserAgent.h" + +@class SFSafariViewController; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief An iOS specific external user-agent that uses the best possible user-agent available + depending on the version of iOS to present the request. + */ +API_UNAVAILABLE(macCatalyst) +@interface OIDExternalUserAgentIOS : NSObject + +- (nullable instancetype)init API_AVAILABLE(ios(11)) + __deprecated_msg("This method will not work on iOS 13, use " + "initWithPresentingViewController:presentingViewController"); + +/*! @brief The designated initializer. + @param presentingViewController The view controller from which to present the + \SFSafariViewController. + */ +- (nullable instancetype)initWithPresentingViewController: + (UIViewController *)presentingViewController + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.m new file mode 100644 index 00000000..728f0868 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.m @@ -0,0 +1,256 @@ +/*! @file OIDExternalUserAgentIOS.m + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import "OIDExternalUserAgentIOS.h" + +#import +#import + +#import "OIDErrorUtilities.h" +#import "OIDExternalUserAgentSession.h" +#import "OIDExternalUserAgentRequest.h" + +#if !TARGET_OS_MACCATALYST + +NS_ASSUME_NONNULL_BEGIN + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 +@interface OIDExternalUserAgentIOS () +@end +#else +@interface OIDExternalUserAgentIOS () +@end +#endif + +@implementation OIDExternalUserAgentIOS { + UIViewController *_presentingViewController; + + BOOL _externalUserAgentFlowInProgress; + __weak id _session; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpartial-availability" + __weak SFSafariViewController *_safariVC; + SFAuthenticationSession *_authenticationVC; + ASWebAuthenticationSession *_webAuthenticationVC; +#pragma clang diagnostic pop +} + +- (nullable instancetype)init { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" + return [self initWithPresentingViewController:nil]; +#pragma clang diagnostic pop +} + +- (nullable instancetype)initWithPresentingViewController: + (UIViewController *)presentingViewController { + self = [super init]; + if (self) { +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + NSAssert(presentingViewController != nil, + @"presentingViewController cannot be nil on iOS 13"); +#endif // __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + + _presentingViewController = presentingViewController; + } + return self; +} + +- (BOOL)presentExternalUserAgentRequest:(id)request + session:(id)session { + if (_externalUserAgentFlowInProgress) { + // TODO: Handle errors as authorization is already in progress. + return NO; + } + + _externalUserAgentFlowInProgress = YES; + _session = session; + BOOL openedUserAgent = NO; + NSURL *requestURL = [request externalUserAgentRequestURL]; + + // iOS 12 and later, use ASWebAuthenticationSession + if (@available(iOS 12.0, *)) { + // ASWebAuthenticationSession doesn't work with guided access (rdar://40809553) + if (!UIAccessibilityIsGuidedAccessEnabled()) { + __weak OIDExternalUserAgentIOS *weakSelf = self; + NSString *redirectScheme = request.redirectScheme; + ASWebAuthenticationSession *authenticationVC = + [[ASWebAuthenticationSession alloc] initWithURL:requestURL + callbackURLScheme:redirectScheme + completionHandler:^(NSURL * _Nullable callbackURL, + NSError * _Nullable error) { + __strong OIDExternalUserAgentIOS *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + strongSelf->_webAuthenticationVC = nil; + if (callbackURL) { + [strongSelf->_session resumeExternalUserAgentFlowWithURL:callbackURL]; + } else { + NSError *safariError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeUserCanceledAuthorizationFlow + underlyingError:error + description:nil]; + [strongSelf->_session failExternalUserAgentFlowWithError:safariError]; + } + }]; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + if (@available(iOS 13.0, *)) { + authenticationVC.presentationContextProvider = self; + } +#endif + _webAuthenticationVC = authenticationVC; + openedUserAgent = [authenticationVC start]; + } + } + // iOS 11, use SFAuthenticationSession + if (@available(iOS 11.0, *)) { + // SFAuthenticationSession doesn't work with guided access (rdar://40809553) + if (!openedUserAgent && !UIAccessibilityIsGuidedAccessEnabled()) { + __weak OIDExternalUserAgentIOS *weakSelf = self; + NSString *redirectScheme = request.redirectScheme; + SFAuthenticationSession *authenticationVC = + [[SFAuthenticationSession alloc] initWithURL:requestURL + callbackURLScheme:redirectScheme + completionHandler:^(NSURL * _Nullable callbackURL, + NSError * _Nullable error) { + __strong OIDExternalUserAgentIOS *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + strongSelf->_authenticationVC = nil; + if (callbackURL) { + [strongSelf->_session resumeExternalUserAgentFlowWithURL:callbackURL]; + } else { + NSError *safariError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeUserCanceledAuthorizationFlow + underlyingError:error + description:@"User cancelled."]; + [strongSelf->_session failExternalUserAgentFlowWithError:safariError]; + } + }]; + _authenticationVC = authenticationVC; + openedUserAgent = [authenticationVC start]; + } + } + // iOS 9 and 10, use SFSafariViewController + if (@available(iOS 9.0, *)) { + if (!openedUserAgent && _presentingViewController) { + SFSafariViewController *safariVC = + [[SFSafariViewController alloc] initWithURL:requestURL]; + safariVC.delegate = self; + _safariVC = safariVC; + [_presentingViewController presentViewController:safariVC animated:YES completion:nil]; + openedUserAgent = YES; + } + } + // iOS 8 and earlier, use mobile Safari + if (!openedUserAgent){ + openedUserAgent = [[UIApplication sharedApplication] openURL:requestURL]; + } + + if (!openedUserAgent) { + [self cleanUp]; + NSError *safariError = [OIDErrorUtilities errorWithCode:OIDErrorCodeSafariOpenError + underlyingError:nil + description:@"Unable to open Safari."]; + [session failExternalUserAgentFlowWithError:safariError]; + } + return openedUserAgent; +} + +- (void)dismissExternalUserAgentAnimated:(BOOL)animated completion:(void (^)(void))completion { + if (!_externalUserAgentFlowInProgress) { + // Ignore this call if there is no authorization flow in progress. + if (completion) completion(); + return; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpartial-availability" + SFSafariViewController *safariVC = _safariVC; + SFAuthenticationSession *authenticationVC = _authenticationVC; + ASWebAuthenticationSession *webAuthenticationVC = _webAuthenticationVC; +#pragma clang diagnostic pop + + [self cleanUp]; + + if (webAuthenticationVC) { + // dismiss the ASWebAuthenticationSession + [webAuthenticationVC cancel]; + if (completion) completion(); + } else if (authenticationVC) { + // dismiss the SFAuthenticationSession + [authenticationVC cancel]; + if (completion) completion(); + } else if (safariVC) { + // dismiss the SFSafariViewController + [safariVC dismissViewControllerAnimated:YES completion:completion]; + } else { + if (completion) completion(); + } +} + +- (void)cleanUp { + // The weak references to |_safariVC| and |_session| are set to nil to avoid accidentally using + // them while not in an authorization flow. + _safariVC = nil; + _authenticationVC = nil; + _webAuthenticationVC = nil; + _session = nil; + _externalUserAgentFlowInProgress = NO; +} + +#pragma mark - SFSafariViewControllerDelegate + +- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller NS_AVAILABLE_IOS(9.0) { + if (controller != _safariVC) { + // Ignore this call if the safari view controller do not match. + return; + } + if (!_externalUserAgentFlowInProgress) { + // Ignore this call if there is no authorization flow in progress. + return; + } + id session = _session; + [self cleanUp]; + NSError *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeUserCanceledAuthorizationFlow + underlyingError:nil + description:@"No external user agent flow in progress."]; + [session failExternalUserAgentFlowWithError:error]; +} + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 +#pragma mark - ASWebAuthenticationPresentationContextProviding + +- (ASPresentationAnchor)presentationAnchorForWebAuthenticationSession:(ASWebAuthenticationSession *)session API_AVAILABLE(ios(13.0)){ + return _presentingViewController.view.window; +} +#endif // __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + +@end + +NS_ASSUME_NONNULL_END + +#endif // !TARGET_OS_MACCATALYST + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h new file mode 100644 index 00000000..2032e8c9 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h @@ -0,0 +1,113 @@ +/*! @file OIDExternalUserAgentIOSCustomBrowser.h + @brief AppAuth iOS SDK + @copyright + Copyright 2018 Google LLC + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import + +#import "OIDExternalUserAgent.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief A block that transforms a regular http/https URL into one that will open in an + alternative browser. + @param requestURL the http/https request URL to be transformed. + @return transformed URL. + */ +typedef NSURL *_Nullable (^OIDCustomBrowserURLTransformation)(NSURL *_Nullable requestURL); + +/*! @brief An implementation of the OIDExternalUserAgent protocol for iOS that uses + a custom browser (i.e. not Safari) for external requests. It is suitable for browsers that + offer a custom url scheme that simply replaces the "https" scheme. It is not designed + for browsers that require other modifications to the URL. If the browser is not installed + the user will be prompted to install it. + */ +API_UNAVAILABLE(macCatalyst) +@interface OIDExternalUserAgentIOSCustomBrowser : NSObject + +/*! @brief URL transformation block for the browser. + */ +@property(nonatomic, readonly) OIDCustomBrowserURLTransformation URLTransformation; + +/*! @brief URL Scheme used to test for whether the browser is installed. + */ +@property(nonatomic, readonly, nullable) NSString *canOpenURLScheme; + +/*! @brief URL of the browser's App Store listing. + */ +@property(nonatomic, readonly, nullable) NSURL *appStoreURL; + +/*! @brief An instance of @c OIDExternalUserAgentIOSCustomBrowser for Chrome. + */ ++ (instancetype)CustomBrowserChrome; + +/*! @brief An instance of @c OIDExternalUserAgentIOSCustomBrowser for Firefox. + */ ++ (instancetype)CustomBrowserFirefox; + +/*! @brief An instance of @c OIDExternalUserAgentIOSCustomBrowser for Opera. + */ ++ (instancetype)CustomBrowserOpera; + +/*! @brief An instance of @c OIDExternalUserAgentIOSCustomBrowser for Safari. + */ ++ (instancetype)CustomBrowserSafari; + +/*! @brief Creates a @c OIDCustomBrowserURLTransformation using the scheme substitution method used + iOS browsers like Chrome and Firefox. + */ ++ (OIDCustomBrowserURLTransformation) + URLTransformationSchemeSubstitutionHTTPS:(NSString *)browserSchemeHTTPS + HTTP:(nullable NSString *)browserSchemeHTTP; + +/*! @brief Creates a @c OIDCustomBrowserURLTransformation with the URL prefix method used by + iOS browsers like Firefox. + */ ++ (OIDCustomBrowserURLTransformation) URLTransformationSchemeConcatPrefix:(NSString*)URLprefix; + +/*! @internal + @brief Unavailable. Please use @c initWithURLTransformation:canOpenURLScheme:appStoreURL: + */ +- (nonnull instancetype)init NS_UNAVAILABLE; + +/*! @brief OIDExternalUserAgent for a custom browser. @c presentExternalUserAgentRequest:session method + will return NO if the browser isn't installed. + */ +- (nullable instancetype)initWithURLTransformation:(OIDCustomBrowserURLTransformation)URLTransformation; + +/*! @brief The designated initializer. + @param URLTransformation the transformation block to translate the URL into one that will open + in the desired custom browser. + @param canOpenURLScheme any scheme supported by the browser used to check if the browser is + installed. + @param appStoreURL URL of the browser in the app store. When this and @c canOpenURLScheme + are non-nil, @c presentExternalUserAgentRequest:session will redirect the user to the app store + if the browser is not installed. + */ +- (nullable instancetype)initWithURLTransformation:(OIDCustomBrowserURLTransformation)URLTransformation + canOpenURLScheme:(nullable NSString *)canOpenURLScheme + appStoreURL:(nullable NSURL *)appStoreURL + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m new file mode 100644 index 00000000..51d2e56c --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m @@ -0,0 +1,171 @@ +/*! @file OIDExternalUserAgentIOSCustomBrowser.m + @brief AppAuth iOS SDK + @copyright + Copyright 2018 Google LLC + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#if TARGET_OS_IOS || TARGET_OS_MACCATALYST + +#import "OIDExternalUserAgentIOSCustomBrowser.h" + +#import + +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationService.h" +#import "OIDErrorUtilities.h" +#import "OIDURLQueryComponent.h" + +#if !TARGET_OS_MACCATALYST + +NS_ASSUME_NONNULL_BEGIN + +@implementation OIDExternalUserAgentIOSCustomBrowser + ++ (instancetype)CustomBrowserChrome { + // Chrome iOS documentation: https://developer.chrome.com/multidevice/ios/links + OIDCustomBrowserURLTransformation transform = [[self class] URLTransformationSchemeSubstitutionHTTPS:@"googlechromes" HTTP:@"googlechrome"]; + NSURL *appStoreURL = + [NSURL URLWithString:@"itms-apps://itunes.apple.com/us/app/chrome/id535886823"]; + return [[[self class] alloc] initWithURLTransformation:transform + canOpenURLScheme:@"googlechromes" + appStoreURL:appStoreURL]; +} + ++ (instancetype)CustomBrowserFirefox { + // Firefox iOS documentation: https://github.com/mozilla-mobile/firefox-ios-open-in-client + OIDCustomBrowserURLTransformation transform = + [[self class] URLTransformationSchemeConcatPrefix:@"firefox://open-url?url="]; + NSURL *appStoreURL = + [NSURL URLWithString:@"itms-apps://itunes.apple.com/us/app/firefox-web-browser/id989804926"]; + return [[[self class] alloc] initWithURLTransformation:transform + canOpenURLScheme:@"firefox" + appStoreURL:appStoreURL]; +} + ++ (instancetype)CustomBrowserOpera { + OIDCustomBrowserURLTransformation transform = + [[self class] URLTransformationSchemeSubstitutionHTTPS:@"opera-https" HTTP:@"opera-http"]; + NSURL *appStoreURL = + [NSURL URLWithString:@"itms-apps://itunes.apple.com/us/app/opera-mini-web-browser/id363729560"]; + return [[[self class] alloc] initWithURLTransformation:transform + canOpenURLScheme:@"opera-https" + appStoreURL:appStoreURL]; +} + ++ (instancetype)CustomBrowserSafari { + OIDCustomBrowserURLTransformation transformNOP = ^NSURL *(NSURL *requestURL) { + return requestURL; + }; + OIDExternalUserAgentIOSCustomBrowser *transform = + [[[self class] alloc] initWithURLTransformation:transformNOP]; + return transform; +} + ++ (OIDCustomBrowserURLTransformation) + URLTransformationSchemeSubstitutionHTTPS:(NSString *)browserSchemeHTTPS + HTTP:(nullable NSString *)browserSchemeHTTP { + OIDCustomBrowserURLTransformation transform = ^NSURL *(NSURL *requestURL) { + // Replace the URL Scheme with the Chrome equivalent. + NSString *newScheme = nil; + if ([requestURL.scheme isEqualToString:@"https"]) { + newScheme = browserSchemeHTTPS; + } else if ([requestURL.scheme isEqualToString:@"http"]) { + if (!browserSchemeHTTP) { + NSAssert(false, @"No HTTP scheme registered for browser"); + return nil; + } + newScheme = browserSchemeHTTP; + } + + // Replaces the URI scheme with the custom scheme + NSURLComponents *components = [NSURLComponents componentsWithURL:requestURL + resolvingAgainstBaseURL:YES]; + components.scheme = newScheme; + return components.URL; + }; + return transform; +} + ++ (OIDCustomBrowserURLTransformation)URLTransformationSchemeConcatPrefix:(NSString *)URLprefix { + OIDCustomBrowserURLTransformation transform = ^NSURL *(NSURL *requestURL) { + NSString *requestURLString = [requestURL absoluteString]; + NSMutableCharacterSet *allowedParamCharacters = + [OIDURLQueryComponent URLParamValueAllowedCharacters]; + NSString *encodedUrl = [requestURLString stringByAddingPercentEncodingWithAllowedCharacters:allowedParamCharacters]; + NSString *newURL = [NSString stringWithFormat:@"%@%@", URLprefix, encodedUrl]; + return [NSURL URLWithString:newURL]; + }; + return transform; +} + +- (nullable instancetype)initWithURLTransformation: + (OIDCustomBrowserURLTransformation)URLTransformation { + return [self initWithURLTransformation:URLTransformation canOpenURLScheme:nil appStoreURL:nil]; +} + +- (nullable instancetype) + initWithURLTransformation:(OIDCustomBrowserURLTransformation)URLTransformation + canOpenURLScheme:(nullable NSString *)canOpenURLScheme + appStoreURL:(nullable NSURL *)appStoreURL { + self = [super init]; + if (self) { + _URLTransformation = URLTransformation; + _canOpenURLScheme = canOpenURLScheme; + _appStoreURL = appStoreURL; + } + return self; +} + +- (BOOL)presentExternalUserAgentRequest:(nonnull id)request + session:(nonnull id)session { + // If the app store URL is set, checks if the app is installed and if not opens the app store. + if (_appStoreURL && _canOpenURLScheme) { + // Verifies existence of LSApplicationQueriesSchemes Info.plist key. + NSArray __unused* canOpenURLs = + [[NSBundle mainBundle] objectForInfoDictionaryKey:@"LSApplicationQueriesSchemes"]; + NSAssert(canOpenURLs, @"plist missing LSApplicationQueriesSchemes key"); + NSAssert1([canOpenURLs containsObject:_canOpenURLScheme], + @"plist missing LSApplicationQueriesSchemes entry for '%@'", _canOpenURLScheme); + + // Opens AppStore if app isn't installed + NSString *testURLString = [NSString stringWithFormat:@"%@://example.com", _canOpenURLScheme]; + NSURL *testURL = [NSURL URLWithString:testURLString]; + if (![[UIApplication sharedApplication] canOpenURL:testURL]) { + [[UIApplication sharedApplication] openURL:_appStoreURL]; + return NO; + } + } + + // Transforms the request URL and opens it. + NSURL *requestURL = [request externalUserAgentRequestURL]; + requestURL = _URLTransformation(requestURL); + BOOL openedInBrowser = [[UIApplication sharedApplication] openURL:requestURL]; + return openedInBrowser; +} + +- (void)dismissExternalUserAgentAnimated:(BOOL)animated + completion:(nonnull void (^)(void))completion { + completion(); +} + +@end + +NS_ASSUME_NONNULL_END + +#endif // !TARGET_OS_MACCATALYST + +#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore.h new file mode 100644 index 00000000..c30af464 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore.h @@ -0,0 +1,44 @@ +/*! @file AppAuthCore.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDAuthState.h" +#import "OIDAuthStateChangeDelegate.h" +#import "OIDAuthStateErrorDelegate.h" +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationService.h" +#import "OIDError.h" +#import "OIDErrorUtilities.h" +#import "OIDExternalUserAgent.h" +#import "OIDExternalUserAgentRequest.h" +#import "OIDExternalUserAgentSession.h" +#import "OIDGrantTypes.h" +#import "OIDIDToken.h" +#import "OIDRegistrationRequest.h" +#import "OIDRegistrationResponse.h" +#import "OIDResponseTypes.h" +#import "OIDScopes.h" +#import "OIDScopeUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDServiceDiscovery.h" +#import "OIDTokenRequest.h" +#import "OIDTokenResponse.h" +#import "OIDTokenUtilities.h" +#import "OIDURLSessionProvider.h" +#import "OIDEndSessionRequest.h" +#import "OIDEndSessionResponse.h" diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.h new file mode 100644 index 00000000..68697d2c --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.h @@ -0,0 +1,272 @@ +/*! @file OIDAuthState.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ +#import + +@class OIDAuthorizationRequest; +@class OIDAuthorizationResponse; +@class OIDAuthState; +@class OIDRegistrationResponse; +@class OIDTokenResponse; +@class OIDTokenRequest; +@protocol OIDAuthStateChangeDelegate; +@protocol OIDAuthStateErrorDelegate; +@protocol OIDExternalUserAgent; +@protocol OIDExternalUserAgentSession; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents a block used to call an action with a fresh access token. + @param accessToken A valid access token if available. + @param idToken A valid ID token if available. + @param error The error if an error occurred. + */ +typedef void (^OIDAuthStateAction)(NSString *_Nullable accessToken, + NSString *_Nullable idToken, + NSError *_Nullable error); + +/*! @brief The method called when the @c + OIDAuthState.authStateByPresentingAuthorizationRequest:presentingViewController:callback: + method has completed or failed. + @param authState The auth state, if the authorization request succeeded. + @param error The error if an error occurred. + */ +typedef void (^OIDAuthStateAuthorizationCallback)(OIDAuthState *_Nullable authState, + NSError *_Nullable error); + +/*! @brief A convenience class that retains the auth state between @c OIDAuthorizationResponse%s + and @c OIDTokenResponse%s. + */ +@interface OIDAuthState : NSObject + +/*! @brief The most recent refresh token received from the server. + @discussion Rather than using this property directly, you should call + @c OIDAuthState.performActionWithFreshTokens:. + @remarks refresh_token + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *refreshToken; + +/*! @brief The scope of the current authorization grant. + @discussion This represents the latest scope returned by the server and may be a subset of the + scope that was initially granted. + @remarks scope + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief The most recent authorization response used to update the authorization state. For the + implicit flow, this will contain the latest access token. + */ +@property(nonatomic, readonly) OIDAuthorizationResponse *lastAuthorizationResponse; + +/*! @brief The most recent token response used to update this authorization state. This will + contain the latest access token. + */ +@property(nonatomic, readonly, nullable) OIDTokenResponse *lastTokenResponse; + +/*! @brief The most recent registration response used to update this authorization state. This will + contain the latest client credentials. + */ +@property(nonatomic, readonly, nullable) OIDRegistrationResponse *lastRegistrationResponse; + +/*! @brief The authorization error that invalidated this @c OIDAuthState. + @discussion The authorization error encountered by @c OIDAuthState or set by the user via + @c OIDAuthState.updateWithAuthorizationError: that invalidated this @c OIDAuthState. + Authorization errors from @c OIDAuthState will always have a domain of + @c ::OIDOAuthAuthorizationErrorDomain or @c ::OIDOAuthTokenErrorDomain. Note: that after + unarchiving the @c OIDAuthState object, the \NSError_userInfo property of this error will + be nil. + */ +@property(nonatomic, readonly, nullable) NSError *authorizationError; + +/*! @brief Returns YES if the authorization state is not known to be invalid. + @discussion Returns YES if no OAuth errors have been received, and the last call resulted in a + successful access token or id token. This does not mean that the access is fresh - just + that it was valid the last time it was used. Note that network and other transient errors + do not invalidate the authorized state. If NO, you should authenticate the user again, + using a fresh authorization request. Invalid @c OIDAuthState objects may still be useful in + that case, to hint at the previously authorized user and streamline the re-authentication + experience. + */ +@property(nonatomic, readonly) BOOL isAuthorized; + +/*! @brief The @c OIDAuthStateChangeDelegate delegate. + @discussion Use the delegate to observe state changes (and update storage) as well as error + states. + */ +@property(nonatomic, weak, nullable) id stateChangeDelegate; + +/*! @brief The @c OIDAuthStateErrorDelegate delegate. + @discussion Use the delegate to observe state changes (and update storage) as well as error + states. + */ +@property(nonatomic, weak, nullable) id errorDelegate; + +/*! @brief Convenience method to create a @c OIDAuthState by presenting an authorization request + and performing the authorization code exchange in the case of code flow requests. For + the hybrid flow, the caller should validate the id_token and c_hash, then perform the token + request (@c OIDAuthorizationService.performTokenRequest:callback:) + and update the OIDAuthState with the results (@c + OIDAuthState.updateWithTokenResponse:error:). + @param authorizationRequest The authorization request to present. + @param externalUserAgent A external user agent that can present an external user-agent request. + @param callback The method called when the request has completed or failed. + @return A @c OIDExternalUserAgentSession instance which will terminate when it + receives a @c OIDExternalUserAgentSession.cancel message, or after processing a + @c OIDExternalUserAgentSession.resumeExternalUserAgentFlowWithURL: message. + */ ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + externalUserAgent:(id)externalUserAgent + callback:(OIDAuthStateAuthorizationCallback)callback; + +/*! @internal + @brief Unavailable. Please use @c initWithAuthorizationResponse:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Creates an auth state from an authorization response. + @param authorizationResponse The authorization response. + */ +- (instancetype)initWithAuthorizationResponse:(OIDAuthorizationResponse *)authorizationResponse; + +/*! @brief Creates an auth state from an authorization and token response. + @param authorizationResponse The authorization response. + @param tokenResponse The token response. + */ +- (instancetype)initWithAuthorizationResponse:(OIDAuthorizationResponse *)authorizationResponse + tokenResponse:(nullable OIDTokenResponse *)tokenResponse; + +/*! @brief Creates an auth state from an registration response. + @param registrationResponse The registration response. + */ +- (instancetype)initWithRegistrationResponse:(OIDRegistrationResponse *)registrationResponse; + +/*! @brief Creates an auth state from an authorization, token and registration response. + @param authorizationResponse The authorization response. + @param tokenResponse The token response. + @param registrationResponse The registration response. + */ +- (instancetype)initWithAuthorizationResponse: + (nullable OIDAuthorizationResponse *)authorizationResponse + tokenResponse:(nullable OIDTokenResponse *)tokenResponse + registrationResponse:(nullable OIDRegistrationResponse *)registrationResponse + NS_DESIGNATED_INITIALIZER; + +/*! @brief Updates the authorization state based on a new authorization response. + @param authorizationResponse The new authorization response to update the state with. + @param error Any error encountered when performing the authorization request. Errors in the + domain @c ::OIDOAuthAuthorizationErrorDomain are reflected in the auth state, other errors + are assumed to be transient, and ignored. + @discussion Typically called with the response from an incremental authorization request, + or if using the implicit flow. Will clear the @c #lastTokenResponse property. + */ +- (void)updateWithAuthorizationResponse:(nullable OIDAuthorizationResponse *)authorizationResponse + error:(nullable NSError *)error; + +/*! @brief Updates the authorization state based on a new token response. + @param tokenResponse The new token response to update the state from. + @param error Any error encountered when performing the authorization request. Errors in the + domain @c ::OIDOAuthTokenErrorDomain are reflected in the auth state, other errors + are assumed to be transient, and ignored. + @discussion Typically called with the response from an authorization code exchange, or a token + refresh. + */ +- (void)updateWithTokenResponse:(nullable OIDTokenResponse *)tokenResponse + error:(nullable NSError *)error; + +/*! @brief Updates the authorization state based on a new registration response. + @param registrationResponse The new registration response to update the state with. + @discussion Typically called with the response from a successful client registration + request. Will reset the auth state. + */ +- (void)updateWithRegistrationResponse:(nullable OIDRegistrationResponse *)registrationResponse; + +/*! @brief Updates the authorization state based on an authorization error. + @param authorizationError The authorization error. + @discussion Call this method if you receive an authorization error during an API call to + invalidate the authentication state of this @c OIDAuthState. Don't call with errors + unrelated to authorization, such as transient network errors. + The OIDAuthStateErrorDelegate.authState:didEncounterAuthorizationError: method of + @c #errorDelegate will be called with the error. + You may optionally use the convenience method + OIDErrorUtilities.resourceServerAuthorizationErrorWithCode:errorResponse:underlyingError: + to create \NSError objects for use here. + The latest error received is stored in @c #authorizationError. Note: that after unarchiving + this object, the \NSError_userInfo property of this error will be nil. + */ +- (void)updateWithAuthorizationError:(NSError *)authorizationError; + +/*! @brief Calls the block with a valid access token (refreshing it first, if needed), or if a + refresh was needed and failed, with the error that caused it to fail. + @param action The block to execute with a fresh token. This block will be executed on the main + thread. + */ +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action; + +/*! @brief Calls the block with a valid access token (refreshing it first, if needed), or if a + refresh was needed and failed, with the error that caused it to fail. + @param action The block to execute with a fresh token. This block will be executed on the main + thread. + @param additionalParameters Additional parameters for the token request if token is + refreshed. + */ +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action + additionalRefreshParameters: + (nullable NSDictionary *)additionalParameters; + +/*! @brief Calls the block with a valid access token (refreshing it first, if needed), or if a + refresh was needed and failed, with the error that caused it to fail. + @param action The block to execute with a fresh token. This block will be executed on the main + thread. + @param additionalParameters Additional parameters for the token request if token is + refreshed. + @param dispatchQueue The dispatchQueue on which to dispatch the action block. + */ +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action + additionalRefreshParameters: + (nullable NSDictionary *)additionalParameters + dispatchQueue:(dispatch_queue_t)dispatchQueue; + +/*! @brief Forces a token refresh the next time @c OIDAuthState.performActionWithFreshTokens: is + called, even if the current tokens are considered valid. + */ +- (void)setNeedsTokenRefresh; + +/*! @brief Creates a token request suitable for refreshing an access token. + @return A @c OIDTokenRequest suitable for using a refresh token to obtain a new access token. + @discussion After performing the refresh, call @c OIDAuthState.updateWithTokenResponse:error: + to update the authorization state based on the response. Rather than doing the token refresh + yourself, you should use @c OIDAuthState.performActionWithFreshTokens:. + @see https://tools.ietf.org/html/rfc6749#section-1.5 + */ +- (nullable OIDTokenRequest *)tokenRefreshRequest; + +/*! @brief Creates a token request suitable for refreshing an access token. + @param additionalParameters Additional parameters for the token request. + @return A @c OIDTokenRequest suitable for using a refresh token to obtain a new access token. + @discussion After performing the refresh, call @c OIDAuthState.updateWithTokenResponse:error: + to update the authorization state based on the response. Rather than doing the token refresh + yourself, you should use @c OIDAuthState.performActionWithFreshTokens:. + @see https://tools.ietf.org/html/rfc6749#section-1.5 + */ +- (nullable OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters: + (nullable NSDictionary *)additionalParameters; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.m new file mode 100644 index 00000000..fe8a1622 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.m @@ -0,0 +1,570 @@ +/*! @file OIDAuthState.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDAuthState.h" + +#import "OIDAuthStateChangeDelegate.h" +#import "OIDAuthStateErrorDelegate.h" +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationService.h" +#import "OIDDefines.h" +#import "OIDError.h" +#import "OIDErrorUtilities.h" +#import "OIDRegistrationResponse.h" +#import "OIDTokenRequest.h" +#import "OIDTokenResponse.h" +#import "OIDTokenUtilities.h" + +/*! @brief Key used to encode the @c refreshToken property for @c NSSecureCoding. + */ +static NSString *const kRefreshTokenKey = @"refreshToken"; + +/*! @brief Key used to encode the @c needsTokenRefresh property for @c NSSecureCoding. + */ +static NSString *const kNeedsTokenRefreshKey = @"needsTokenRefresh"; + +/*! @brief Key used to encode the @c scope property for @c NSSecureCoding. + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c lastAuthorizationResponse property for @c NSSecureCoding. + */ +static NSString *const kLastAuthorizationResponseKey = @"lastAuthorizationResponse"; + +/*! @brief Key used to encode the @c lastTokenResponse property for @c NSSecureCoding. + */ +static NSString *const kLastTokenResponseKey = @"lastTokenResponse"; + +/*! @brief Key used to encode the @c lastOAuthError property for @c NSSecureCoding. + */ +static NSString *const kAuthorizationErrorKey = @"authorizationError"; + +/*! @brief The exception thrown when a developer tries to create a refresh request from an + authorization request with no authorization code. + */ +static NSString *const kRefreshTokenRequestException = + @"Attempted to create a token refresh request from a token response with no refresh token."; + +/*! @brief Number of seconds the access token is refreshed before it actually expires. + */ +static const NSUInteger kExpiryTimeTolerance = 60; + +/*! @brief Object to hold OIDAuthState pending actions. + */ +@interface OIDAuthStatePendingAction : NSObject +@property(nonatomic, readonly, nullable) OIDAuthStateAction action; +@property(nonatomic, readonly, nullable) dispatch_queue_t dispatchQueue; +@end +@implementation OIDAuthStatePendingAction +- (id)initWithAction:(OIDAuthStateAction)action andDispatchQueue:(dispatch_queue_t)dispatchQueue { + self = [super init]; + if (self) { + _action = action; + _dispatchQueue = dispatchQueue; + } + return self; +} +@end + +@interface OIDAuthState () + +/*! @brief The access token generated by the authorization server. + @discussion Rather than using this property directly, you should call + @c OIDAuthState.withFreshTokenPerformAction:. + */ +@property(nonatomic, readonly, nullable) NSString *accessToken; + +/*! @brief The approximate expiration date & time of the access token. + @discussion Rather than using this property directly, you should call + @c OIDAuthState.withFreshTokenPerformAction:. + */ +@property(nonatomic, readonly, nullable) NSDate *accessTokenExpirationDate; + +/*! @brief ID Token value associated with the authenticated session. + @discussion Rather than using this property directly, you should call + OIDAuthState.withFreshTokenPerformAction:. + */ +@property(nonatomic, readonly, nullable) NSString *idToken; + +/*! @brief Private method, called when the internal state changes. + */ +- (void)didChangeState; + +@end + + +@implementation OIDAuthState { + /*! @brief Array of pending actions (use @c _pendingActionsSyncObject to synchronize access). + */ + NSMutableArray *_pendingActions; + + /*! @brief Object for synchronizing access to @c pendingActions. + */ + id _pendingActionsSyncObject; + + /*! @brief If YES, tokens will be refreshed on the next API call regardless of expiry. + */ + BOOL _needsTokenRefresh; +} + +#pragma mark - Convenience initializers + ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + externalUserAgent:(id)externalUserAgent + callback:(OIDAuthStateAuthorizationCallback)callback { + // presents the authorization request + id authFlowSession = [OIDAuthorizationService + presentAuthorizationRequest:authorizationRequest + externalUserAgent:externalUserAgent + callback:^(OIDAuthorizationResponse *_Nullable authorizationResponse, + NSError *_Nullable authorizationError) { + // inspects response and processes further if needed (e.g. authorization + // code exchange) + if (authorizationResponse) { + if ([authorizationRequest.responseType + isEqualToString:OIDResponseTypeCode]) { + // if the request is for the code flow (NB. not hybrid), assumes the + // code is intended for this client, and performs the authorization + // code exchange + OIDTokenRequest *tokenExchangeRequest = + [authorizationResponse tokenExchangeRequest]; + [OIDAuthorizationService performTokenRequest:tokenExchangeRequest + originalAuthorizationResponse:authorizationResponse + callback:^(OIDTokenResponse *_Nullable tokenResponse, + NSError *_Nullable tokenError) { + OIDAuthState *authState; + if (tokenResponse) { + authState = [[OIDAuthState alloc] + initWithAuthorizationResponse: + authorizationResponse + tokenResponse:tokenResponse]; + } + callback(authState, tokenError); + }]; + } else { + // hybrid flow (code id_token). Two possible cases: + // 1. The code is not for this client, ie. will be sent to a + // webservice that performs the id token verification and token + // exchange + // 2. The code is for this client and, for security reasons, the + // application developer must verify the id_token signature and + // c_hash before calling the token endpoint + OIDAuthState *authState = [[OIDAuthState alloc] + initWithAuthorizationResponse:authorizationResponse]; + callback(authState, authorizationError); + } + } else { + callback(nil, authorizationError); + } + }]; + return authFlowSession; +} + +#pragma mark - Initializers + +- (nonnull instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithAuthorizationResponse:tokenResponse:)) + +/*! @brief Creates an auth state from an authorization response. + @param authorizationResponse The authorization response. + */ +- (instancetype)initWithAuthorizationResponse:(OIDAuthorizationResponse *)authorizationResponse { + return [self initWithAuthorizationResponse:authorizationResponse tokenResponse:nil]; +} + + +/*! @brief Designated initializer. + @param authorizationResponse The authorization response. + @discussion Creates an auth state from an authorization response and token response. + */ +- (instancetype)initWithAuthorizationResponse:(OIDAuthorizationResponse *)authorizationResponse + tokenResponse:(nullable OIDTokenResponse *)tokenResponse { + return [self initWithAuthorizationResponse:authorizationResponse + tokenResponse:tokenResponse + registrationResponse:nil]; +} + +/*! @brief Creates an auth state from an registration response. + @param registrationResponse The registration response. + */ +- (instancetype)initWithRegistrationResponse:(OIDRegistrationResponse *)registrationResponse { + return [self initWithAuthorizationResponse:nil + tokenResponse:nil + registrationResponse:registrationResponse]; +} + +- (instancetype)initWithAuthorizationResponse: + (nullable OIDAuthorizationResponse *)authorizationResponse + tokenResponse:(nullable OIDTokenResponse *)tokenResponse + registrationResponse:(nullable OIDRegistrationResponse *)registrationResponse { + self = [super init]; + if (self) { + _pendingActionsSyncObject = [[NSObject alloc] init]; + + if (registrationResponse) { + [self updateWithRegistrationResponse:registrationResponse]; + } + + if (authorizationResponse) { + [self updateWithAuthorizationResponse:authorizationResponse error:nil]; + } + + if (tokenResponse) { + [self updateWithTokenResponse:tokenResponse error:nil]; + } + } + return self; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, isAuthorized: %@, refreshToken: \"%@\", " + "scope: \"%@\", accessToken: \"%@\", " + "accessTokenExpirationDate: %@, idToken: \"%@\", " + "lastAuthorizationResponse: %@, lastTokenResponse: %@, " + "lastRegistrationResponse: %@, authorizationError: %@>", + NSStringFromClass([self class]), + (void *)self, + (self.isAuthorized) ? @"YES" : @"NO", + [OIDTokenUtilities redact:_refreshToken], + _scope, + [OIDTokenUtilities redact:self.accessToken], + self.accessTokenExpirationDate, + [OIDTokenUtilities redact:self.idToken], + _lastAuthorizationResponse, + _lastTokenResponse, + _lastRegistrationResponse, + _authorizationError]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + _lastAuthorizationResponse = [aDecoder decodeObjectOfClass:[OIDAuthorizationResponse class] + forKey:kLastAuthorizationResponseKey]; + _lastTokenResponse = [aDecoder decodeObjectOfClass:[OIDTokenResponse class] + forKey:kLastTokenResponseKey]; + self = [self initWithAuthorizationResponse:_lastAuthorizationResponse + tokenResponse:_lastTokenResponse]; + if (self) { + _authorizationError = + [aDecoder decodeObjectOfClass:[NSError class] forKey:kAuthorizationErrorKey]; + _scope = [aDecoder decodeObjectOfClass:[NSString class] forKey:kScopeKey]; + _refreshToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:kRefreshTokenKey]; + _needsTokenRefresh = [aDecoder decodeBoolForKey:kNeedsTokenRefreshKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_lastAuthorizationResponse forKey:kLastAuthorizationResponseKey]; + [aCoder encodeObject:_lastTokenResponse forKey:kLastTokenResponseKey]; + if (_authorizationError) { + NSError *codingSafeAuthorizationError = [NSError errorWithDomain:_authorizationError.domain + code:_authorizationError.code + userInfo:nil]; + [aCoder encodeObject:codingSafeAuthorizationError forKey:kAuthorizationErrorKey]; + } + [aCoder encodeObject:_scope forKey:kScopeKey]; + [aCoder encodeObject:_refreshToken forKey:kRefreshTokenKey]; + [aCoder encodeBool:_needsTokenRefresh forKey:kNeedsTokenRefreshKey]; +} + +#pragma mark - Private convenience getters + +- (NSString *)accessToken { + if (_authorizationError) { + return nil; + } + return _lastTokenResponse ? _lastTokenResponse.accessToken + : _lastAuthorizationResponse.accessToken; +} + +- (NSString *)tokenType { + if (_authorizationError) { + return nil; + } + return _lastTokenResponse ? _lastTokenResponse.tokenType + : _lastAuthorizationResponse.tokenType; +} + +- (NSDate *)accessTokenExpirationDate { + if (_authorizationError) { + return nil; + } + return _lastTokenResponse ? _lastTokenResponse.accessTokenExpirationDate + : _lastAuthorizationResponse.accessTokenExpirationDate; +} + +- (NSString *)idToken { + if (_authorizationError) { + return nil; + } + return _lastTokenResponse ? _lastTokenResponse.idToken + : _lastAuthorizationResponse.idToken; +} + +#pragma mark - Getters + +- (BOOL)isAuthorized { + return !self.authorizationError && (self.accessToken || self.idToken || self.refreshToken); +} + +#pragma mark - Updating the state + +- (void)updateWithRegistrationResponse:(OIDRegistrationResponse *)registrationResponse { + _lastRegistrationResponse = registrationResponse; + _refreshToken = nil; + _scope = nil; + _lastAuthorizationResponse = nil; + _lastTokenResponse = nil; + _authorizationError = nil; + [self didChangeState]; +} + +- (void)updateWithAuthorizationResponse:(nullable OIDAuthorizationResponse *)authorizationResponse + error:(nullable NSError *)error { + // If the error is an OAuth authorization error, updates the state. Other errors are ignored. + if (error.domain == OIDOAuthAuthorizationErrorDomain) { + [self updateWithAuthorizationError:error]; + return; + } + if (!authorizationResponse) { + return; + } + + _lastAuthorizationResponse = authorizationResponse; + + // clears the last token response and refresh token as these now relate to an old authorization + // that is no longer relevant + _lastTokenResponse = nil; + _refreshToken = nil; + _authorizationError = nil; + + // if the response's scope is nil, it means that it equals that of the request + // see: https://tools.ietf.org/html/rfc6749#section-5.1 + _scope = (authorizationResponse.scope) ? authorizationResponse.scope + : authorizationResponse.request.scope; + + [self didChangeState]; +} + +- (void)updateWithTokenResponse:(nullable OIDTokenResponse *)tokenResponse + error:(nullable NSError *)error { + if (_authorizationError) { + // Calling updateWithTokenResponse while in an error state probably means the developer obtained + // a new token and did the exchange without also calling updateWithAuthorizationResponse. + // Attempts to handle gracefully, but warns the developer that this is unexpected. + NSLog(@"OIDAuthState:updateWithTokenResponse should not be called in an error state [%@] call" + "updateWithAuthorizationResponse with the result of the fresh authorization response" + "first", + _authorizationError); + + _authorizationError = nil; + } + + // If the error is an OAuth authorization error, updates the state. Other errors are ignored. + if (error.domain == OIDOAuthTokenErrorDomain) { + [self updateWithAuthorizationError:error]; + return; + } + if (!tokenResponse) { + return; + } + + _lastTokenResponse = tokenResponse; + + // updates the scope and refresh token if they are present on the TokenResponse. + // according to the spec, these may be changed by the server, including when refreshing the + // access token. See: https://tools.ietf.org/html/rfc6749#section-5.1 and + // https://tools.ietf.org/html/rfc6749#section-6 + if (tokenResponse.scope) { + _scope = tokenResponse.scope; + } + if (tokenResponse.refreshToken) { + _refreshToken = tokenResponse.refreshToken; + } + + [self didChangeState]; +} + +- (void)updateWithAuthorizationError:(NSError *)oauthError { + _authorizationError = oauthError; + + [self didChangeState]; + + [_errorDelegate authState:self didEncounterAuthorizationError:oauthError]; +} + +#pragma mark - OAuth Requests + +- (OIDTokenRequest *)tokenRefreshRequest { + return [self tokenRefreshRequestWithAdditionalParameters:nil]; +} + +- (OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters: + (NSDictionary *)additionalParameters { + + // TODO: Add unit test to confirm exception is thrown when expected + + if (!_refreshToken) { + [OIDErrorUtilities raiseException:kRefreshTokenRequestException]; + } + return [[OIDTokenRequest alloc] + initWithConfiguration:_lastAuthorizationResponse.request.configuration + grantType:OIDGrantTypeRefreshToken + authorizationCode:nil + redirectURL:nil + clientID:_lastAuthorizationResponse.request.clientID + clientSecret:_lastAuthorizationResponse.request.clientSecret + scope:nil + refreshToken:_refreshToken + codeVerifier:nil + additionalParameters:additionalParameters]; +} + +#pragma mark - Stateful Actions + +- (void)didChangeState { + [_stateChangeDelegate didChangeState:self]; +} + +- (void)setNeedsTokenRefresh { + _needsTokenRefresh = YES; +} + +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action { + [self performActionWithFreshTokens:action additionalRefreshParameters:nil]; +} + +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action + additionalRefreshParameters: + (nullable NSDictionary *)additionalParameters { + [self performActionWithFreshTokens:action + additionalRefreshParameters:additionalParameters + dispatchQueue:dispatch_get_main_queue()]; +} + +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action + additionalRefreshParameters: + (nullable NSDictionary *)additionalParameters + dispatchQueue:(dispatch_queue_t)dispatchQueue { + + if ([self isTokenFresh]) { + // access token is valid within tolerance levels, perform action + dispatch_async(dispatchQueue, ^{ + action(self.accessToken, self.idToken, nil); + }); + return; + } + + if (!_refreshToken) { + // no refresh token available and token has expired + NSError *tokenRefreshError = [ + OIDErrorUtilities errorWithCode:OIDErrorCodeTokenRefreshError + underlyingError:nil + description:@"Unable to refresh expired token without a refresh token."]; + dispatch_async(dispatchQueue, ^{ + action(nil, nil, tokenRefreshError); + }); + return; + } + + // access token is expired, first refresh the token, then perform action + NSAssert(_pendingActionsSyncObject, @"_pendingActionsSyncObject cannot be nil", @""); + OIDAuthStatePendingAction* pendingAction = + [[OIDAuthStatePendingAction alloc] initWithAction:action andDispatchQueue:dispatchQueue]; + @synchronized(_pendingActionsSyncObject) { + // if a token is already in the process of being refreshed, adds to pending actions + if (_pendingActions) { + [_pendingActions addObject:pendingAction]; + return; + } + + // creates a list of pending actions, starting with this one + _pendingActions = [NSMutableArray arrayWithObject:pendingAction]; + } + + // refresh the tokens + OIDTokenRequest *tokenRefreshRequest = + [self tokenRefreshRequestWithAdditionalParameters:additionalParameters]; + [OIDAuthorizationService performTokenRequest:tokenRefreshRequest + originalAuthorizationResponse:_lastAuthorizationResponse + callback:^(OIDTokenResponse *_Nullable response, + NSError *_Nullable error) { + // update OIDAuthState based on response + if (response) { + self->_needsTokenRefresh = NO; + [self updateWithTokenResponse:response error:nil]; + } else { + if (error.domain == OIDOAuthTokenErrorDomain) { + self->_needsTokenRefresh = NO; + [self updateWithAuthorizationError:error]; + } else { + if ([self->_errorDelegate respondsToSelector: + @selector(authState:didEncounterTransientError:)]) { + [self->_errorDelegate authState:self didEncounterTransientError:error]; + } + } + } + + // nil the pending queue and process everything that was queued up + NSArray *actionsToProcess; + @synchronized(self->_pendingActionsSyncObject) { + actionsToProcess = self->_pendingActions; + self->_pendingActions = nil; + } + for (OIDAuthStatePendingAction* actionToProcess in actionsToProcess) { + dispatch_async(actionToProcess.dispatchQueue, ^{ + actionToProcess.action(self.accessToken, self.idToken, error); + }); + } + }]; +} + +#pragma mark - + +/*! @fn isTokenFresh + @brief Determines whether a token refresh request must be made to refresh the tokens. + */ +- (BOOL)isTokenFresh { + if (_needsTokenRefresh) { + // forced refresh + return NO; + } + + if (!self.accessTokenExpirationDate) { + // if there is no expiration time but we have an access token, it is assumed to never expire + return !!self.accessToken; + } + + // has the token expired? + BOOL tokenFresh = [self.accessTokenExpirationDate timeIntervalSinceNow] > kExpiryTimeTolerance; + return tokenFresh; +} + +@end + + diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateChangeDelegate.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateChangeDelegate.h new file mode 100644 index 00000000..2570df13 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateChangeDelegate.h @@ -0,0 +1,39 @@ +/*! @file OIDAuthStateChangeDelegate.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDAuthState; + +NS_ASSUME_NONNULL_BEGIN + +/*! @protocol OIDAuthStateChangeDelegate + @brief Delegate of the OIDAuthState used to monitor various changes in state. + */ +@protocol OIDAuthStateChangeDelegate + +/*! @brief Called when the authorization state changes and any backing storage needs to be updated. + @param state The @c OIDAuthState that changed. + @discussion If you are storing the authorization state, you should update the storage when the + state changes. + */ +- (void)didChangeState:(OIDAuthState *)state; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateErrorDelegate.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateErrorDelegate.h new file mode 100644 index 00000000..91a9b1cd --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateErrorDelegate.h @@ -0,0 +1,62 @@ +/*! @file OIDAuthStateErrorDelegate.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDAuthState; + +NS_ASSUME_NONNULL_BEGIN + +/*! @protocol OIDAuthStateErrorDelegate + @brief Delegate of the OIDAuthState used to monitor errors. + */ +@protocol OIDAuthStateErrorDelegate + +/*! @brief Called when an authentication occurs, which indicates the auth session is invalid. + @param state The @c OIDAuthState on which the error occurred. + @param error The authorization error. + @discussion This is a hard error (not a transient network issue) that indicates a problem with + the authorization. You should stop using the @c OIDAuthState when such an error is + encountered. If the \NSError_code is @c ::OIDErrorCodeOAuthInvalidGrant then + the session may be recoverable with user interaction (i.e. re-authentication). In all cases + you should consider the user unauthorized, and remove locally cached resources that require + that authorization. @c OIDAuthState will call this method automatically if it encounters + an OAuth error (that is, an HTTP 400 response with a valid OAuth error response) during + authorization or token refresh (such as performed automatically when using + @c OIDAuthState.performActionWithFreshTokens:). You can signal authorization errors with + @c OIDAuthState.updateWithAuthorizationError:. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +- (void)authState:(OIDAuthState *)state didEncounterAuthorizationError:(NSError *)error; + +@optional + +/*! @brief Called when a network or other transient error occurs. + @param state The @c OIDAuthState on which the error occurred. + @param error The transient error. + @discussion This is a soft error, typically network related. The @c OIDAuthState is likely + still valid, and should not be discarded. Retry the request using an incremental backoff + strategy. This is only called when using the @c OIDAuthState convenience methods such as + @c OIDAuthState.performActionWithFreshTokens:. If you are refreshing the tokens yourself + outside of @c OIDAuthState class, it will never be called. + */ +- (void)authState:(OIDAuthState *)state didEncounterTransientError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.h new file mode 100644 index 00000000..594f01d8 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.h @@ -0,0 +1,250 @@ +/*! @file OIDAuthorizationRequest.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +// These files only declare string constants useful for constructing a @c OIDAuthorizationRequest, +// so they are imported here for convenience. +#import "OIDExternalUserAgentRequest.h" +#import "OIDResponseTypes.h" +#import "OIDScopes.h" + +@class OIDServiceConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief The @c code_challenge_method value for the S256 code challenge. + @see https://tools.ietf.org/html/rfc7636#section-4.3 + */ +extern NSString *const OIDOAuthorizationRequestCodeChallengeMethodS256; + + +/*! @brief Represents an authorization request. + @see https://tools.ietf.org/html/rfc6749#section-4 + @see https://tools.ietf.org/html/rfc6749#section-4.1.1 + */ +@interface OIDAuthorizationRequest : + NSObject + +/*! @brief The service's configuration. + @remarks This configuration specifies how to connect to a particular OAuth provider. + Configurations may be created manually, or via an OpenID Connect Discovery Document. + */ +@property(nonatomic, readonly) OIDServiceConfiguration *configuration; + +/*! @brief The expected response type. + @remarks response_type + @discussion Generally 'code' if pure OAuth, otherwise a space-delimited list of of response + types including 'code', 'token', and 'id_token' for OpenID Connect. + @see https://tools.ietf.org/html/rfc6749#section-3.1.1 + @see http://openid.net/specs/openid-connect-core-1_0.html#rfc.section.3 + */ +@property(nonatomic, readonly) NSString *responseType; + +/*! @brief The client identifier. + @remarks client_id + @see https://tools.ietf.org/html/rfc6749#section-2.2 + */ +@property(nonatomic, readonly) NSString *clientID; + +/*! @brief The client secret. + @remarks client_secret + @discussion The client secret is used to prove that identity of the client when exchaning an + authorization code for an access token. + The client secret is not passed in the authorizationRequestURL. It is only used when + exchanging the authorization code for an access token. + @see https://tools.ietf.org/html/rfc6749#section-2.3.1 + */ +@property(nonatomic, readonly, nullable) NSString *clientSecret; + +/*! @brief The value of the scope parameter is expressed as a list of space-delimited, + case-sensitive strings. + @remarks scope + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief The client's redirect URI. + @remarks redirect_uri + @see https://tools.ietf.org/html/rfc6749#section-3.1.2 + */ +@property(nonatomic, readonly, nullable) NSURL *redirectURL; + +/*! @brief An opaque value used by the client to maintain state between the request and callback. + @remarks state + @discussion If this value is not explicitly set, this library will automatically add state and + perform appropriate validation of the state in the authorization response. It is recommended + that the default implementation of this parameter be used wherever possible. Typically used + to prevent CSRF attacks, as recommended in RFC6819 Section 5.3.5. + @see https://tools.ietf.org/html/rfc6749#section-4.1.1 + @see https://tools.ietf.org/html/rfc6819#section-5.3.5 + */ +@property(nonatomic, readonly, nullable) NSString *state; + +/*! @brief String value used to associate a Client session with an ID Token, and to mitigate replay + attacks. The value is passed through unmodified from the Authentication Request to the ID + Token. Sufficient entropy MUST be present in the nonce values used to prevent attackers from + guessing values. + @remarks nonce + @discussion If this value is not explicitly set, this library will automatically add nonce and + perform appropriate validation of the nonce in the ID Token. + @see https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest + */ +@property(nonatomic, readonly, nullable) NSString *nonce; + +/*! @brief The PKCE code verifier. + @remarks code_verifier + @discussion The code verifier itself is not included in the authorization request that is sent + on the wire, but needs to be in the token exchange request. + @c OIDAuthorizationResponse.tokenExchangeRequest will create a @c OIDTokenRequest that + includes this parameter automatically. + @see https://tools.ietf.org/html/rfc7636#section-4.1 + */ +@property(nonatomic, readonly, nullable) NSString *codeVerifier; + +/*! @brief The PKCE code challenge, derived from #codeVerifier. + @remarks code_challenge + @see https://tools.ietf.org/html/rfc7636#section-4.2 + */ +@property(nonatomic, readonly, nullable) NSString *codeChallenge; + +/*! @brief The method used to compute the @c #codeChallenge + @remarks code_challenge_method + @see https://tools.ietf.org/html/rfc7636#section-4.3 + */ +@property(nonatomic, readonly, nullable) NSString *codeChallengeMethod; + +/*! @brief The client's additional authorization parameters. + @see https://tools.ietf.org/html/rfc6749#section-3.1 + */ +@property(nonatomic, readonly, nullable) NSDictionary *additionalParameters; + +/*! @internal + @brief Unavailable. Please use + @c initWithConfiguration:clientId:scopes:redirectURL:responseType:additionalParameters:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Creates an authorization request with opinionated defaults (a secure @c state, and + PKCE with S256 as the @c code_challenge_method). + @param configuration The service's configuration. + @param clientID The client identifier. + @param scopes An array of scopes to combine into a single scope string per the OAuth2 spec. + @param redirectURL The client's redirect URI. + @param responseType The expected response type. + @param additionalParameters The client's additional authorization parameters. + @remarks This convenience initializer generates a state parameter and PKCE challenges + automatically. + */ +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + scopes:(nullable NSArray *)scopes + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + additionalParameters:(nullable NSDictionary *)additionalParameters; + +/*! @brief Creates an authorization request with opinionated defaults (a secure @c state, @c nonce, + and PKCE with S256 as the @c code_challenge_method). + @param configuration The service's configuration. + @param clientID The client identifier. + @param clientSecret The client secret. + @param scopes An array of scopes to combine into a single scope string per the OAuth2 spec. + @param redirectURL The client's redirect URI. + @param responseType The expected response type. + @param additionalParameters The client's additional authorization parameters. + @remarks This convenience initializer generates a state parameter and PKCE challenges + automatically. + */ +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scopes:(nullable NSArray *)scopes + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + additionalParameters:(nullable NSDictionary *)additionalParameters; + +/*! @brief Designated initializer. + @param configuration The service's configuration. + @param clientID The client identifier. + @param scope A scope string per the OAuth2 spec (a space-delimited set of scopes). + @param redirectURL The client's redirect URI. + @param responseType The expected response type. + @param state An opaque value used by the client to maintain state between the request and + callback. + @param nonce String value used to associate a Client session with an ID Token. Can be set to nil + if not using OpenID Connect, although pure OAuth servers should ignore params they don't + understand anyway. + @param codeVerifier The PKCE code verifier. See @c OIDAuthorizationRequest.generateCodeVerifier. + @param codeChallenge The PKCE code challenge, calculated from the code verifier such as with + @c OIDAuthorizationRequest.codeChallengeS256ForVerifier:. + @param codeChallengeMethod The PKCE code challenge method. + ::OIDOAuthorizationRequestCodeChallengeMethodS256 when + @c OIDAuthorizationRequest.codeChallengeS256ForVerifier: is used to create the code + challenge. + @param additionalParameters The client's additional authorization parameters. + */ +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scope:(nullable NSString *)scope + redirectURL:(nullable NSURL *)redirectURL + responseType:(NSString *)responseType + state:(nullable NSString *)state + nonce:(nullable NSString *)nonce + codeVerifier:(nullable NSString *)codeVerifier + codeChallenge:(nullable NSString *)codeChallenge + codeChallengeMethod:(nullable NSString *)codeChallengeMethod + additionalParameters:(nullable NSDictionary *)additionalParameters + NS_DESIGNATED_INITIALIZER; + +/*! @brief Constructs the request URI by adding the request parameters to the query component of the + authorization endpoint URI using the "application/x-www-form-urlencoded" format. + @return A URL representing the authorization request. + @see https://tools.ietf.org/html/rfc6749#section-4.1.1 + */ +- (NSURL *)authorizationRequestURL; + +/*! @brief Generates an OAuth state param using a random source. + @return The generated state. + @see https://tools.ietf.org/html/rfc6819#section-5.3.5 + */ ++ (nullable NSString *)generateState; + +/*! @brief Constructs a PKCE-compliant code verifier. + @return The generated code verifier. + @see https://tools.ietf.org/html/rfc7636#section-4.1 + */ ++ (nullable NSString *)generateCodeVerifier; + +/*! @brief Creates a PKCE S256 codeChallenge from the codeVerifier. + @param codeVerifier The code verifier from which the code challenge will be derived. + @return The generated code challenge. + @details Generate a secure code verifier to pass into this method with + @c OIDAuthorizationRequest.generateCodeVerifier. The matching @c #codeChallengeMethod for + @c #codeChallenge%s created by this method is + ::OIDOAuthorizationRequestCodeChallengeMethodS256. + @see https://tools.ietf.org/html/rfc7636#section-4.1 + */ ++ (nullable NSString *)codeChallengeS256ForVerifier:(nullable NSString *)codeVerifier; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.m new file mode 100644 index 00000000..ccfacda0 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.m @@ -0,0 +1,351 @@ +/*! @file OIDAuthorizationRequest.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDAuthorizationRequest.h" + +#import "OIDDefines.h" +#import "OIDScopeUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDTokenUtilities.h" +#import "OIDURLQueryComponent.h" + +/*! @brief The key for the @c configuration property for @c NSSecureCoding + */ +static NSString *const kConfigurationKey = @"configuration"; + +/*! @brief Key used to encode the @c responseType property for @c NSSecureCoding, and on the URL + request. + */ +static NSString *const kResponseTypeKey = @"response_type"; + +/*! @brief Key used to encode the @c clientID property for @c NSSecureCoding, and on the URL + request. + */ +static NSString *const kClientIDKey = @"client_id"; + +/*! @brief Key used to encode the @c clientSecret property for @c NSSecureCoding. + */ +static NSString *const kClientSecretKey = @"client_secret"; + +/*! @brief Key used to encode the @c scope property for @c NSSecureCoding, and on the URL request. + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c redirectURL property for @c NSSecureCoding, and on the URL + request. + */ +static NSString *const kRedirectURLKey = @"redirect_uri"; + +/*! @brief Key used to encode the @c state property for @c NSSecureCoding, and on the URL request. + */ +static NSString *const kStateKey = @"state"; + +/*! @brief Key used to encode the @c nonce property for @c NSSecureCoding, and on the URL request. + */ +static NSString *const kNonceKey = @"nonce"; + +/*! @brief Key used to encode the @c codeVerifier property for @c NSSecureCoding. + */ +static NSString *const kCodeVerifierKey = @"code_verifier"; + +/*! @brief Key used to send the @c codeChallenge on the URL request. + */ +static NSString *const kCodeChallengeKey = @"code_challenge"; + +/*! @brief Key used to send the @c codeChallengeMethod on the URL request. + */ +static NSString *const kCodeChallengeMethodKey = @"code_challenge_method"; + +/*! @brief Key used to encode the @c additionalParameters property for + @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +/*! @brief Number of random bytes generated for the @ state. + */ +static NSUInteger const kStateSizeBytes = 32; + +/*! @brief Number of random bytes generated for the @ codeVerifier. + */ +static NSUInteger const kCodeVerifierBytes = 32; + +/*! @brief Assertion text for unsupported response types. + */ +static NSString *const OIDOAuthUnsupportedResponseTypeMessage = + @"The response_type \"%@\" isn't supported. AppAuth only supports the \"code\" or \"code id_token\" response_type."; + +/*! @brief Code challenge request method. + */ +NSString *const OIDOAuthorizationRequestCodeChallengeMethodS256 = @"S256"; + +@implementation OIDAuthorizationRequest + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER( + @selector(initWithConfiguration: + clientId: + scopes: + redirectURL: + responseType: + additionalParameters:) + ) + +/*! @brief Check if the response type is one AppAuth supports + @remarks AppAuth only supports the `code` and `code id_token` response types. + @see https://github.com/openid/AppAuth-iOS/issues/98 + @see https://github.com/openid/AppAuth-iOS/issues/292 + */ ++ (BOOL)isSupportedResponseType:(NSString *)responseType +{ + NSString *codeIdToken = [@[OIDResponseTypeCode, OIDResponseTypeIDToken] + componentsJoinedByString:@" "]; + NSString *idTokenCode = [@[OIDResponseTypeIDToken, OIDResponseTypeCode] + componentsJoinedByString:@" "]; + + return [responseType isEqualToString:OIDResponseTypeCode] + || [responseType isEqualToString:codeIdToken] + || [responseType isEqualToString:idTokenCode]; +} + +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scope:(nullable NSString *)scope + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + state:(nullable NSString *)state + nonce:(nullable NSString *)nonce + codeVerifier:(nullable NSString *)codeVerifier + codeChallenge:(nullable NSString *)codeChallenge + codeChallengeMethod:(nullable NSString *)codeChallengeMethod + additionalParameters:(nullable NSDictionary *)additionalParameters +{ + self = [super init]; + if (self) { + _configuration = [configuration copy]; + _clientID = [clientID copy]; + _clientSecret = [clientSecret copy]; + _scope = [scope copy]; + _redirectURL = [redirectURL copy]; + _responseType = [responseType copy]; + if (![[self class] isSupportedResponseType:_responseType]) { + NSAssert(NO, OIDOAuthUnsupportedResponseTypeMessage, _responseType); + return nil; + } + _state = [state copy]; + _nonce = [nonce copy]; + _codeVerifier = [codeVerifier copy]; + _codeChallenge = [codeChallenge copy]; + _codeChallengeMethod = [codeChallengeMethod copy]; + + _additionalParameters = + [[NSDictionary alloc] initWithDictionary:additionalParameters copyItems:YES]; + } + return self; +} + +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + clientSecret:(NSString *)clientSecret + scopes:(nullable NSArray *)scopes + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + additionalParameters:(nullable NSDictionary *)additionalParameters { + + // generates PKCE code verifier and challenge + NSString *codeVerifier = [[self class] generateCodeVerifier]; + NSString *codeChallenge = [[self class] codeChallengeS256ForVerifier:codeVerifier]; + + return [self initWithConfiguration:configuration + clientId:clientID + clientSecret:clientSecret + scope:[OIDScopeUtilities scopesWithArray:scopes] + redirectURL:redirectURL + responseType:responseType + state:[[self class] generateState] + nonce:[[self class] generateState] + codeVerifier:codeVerifier + codeChallenge:codeChallenge + codeChallengeMethod:OIDOAuthorizationRequestCodeChallengeMethodS256 + additionalParameters:additionalParameters]; +} + +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + scopes:(nullable NSArray *)scopes + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + additionalParameters:(nullable NSDictionary *)additionalParameters { + return [self initWithConfiguration:configuration + clientId:clientID + clientSecret:nil + scopes:scopes + redirectURL:redirectURL + responseType:responseType + additionalParameters:additionalParameters]; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDServiceConfiguration *configuration = + [aDecoder decodeObjectOfClass:[OIDServiceConfiguration class] + forKey:kConfigurationKey]; + NSString *responseType = [aDecoder decodeObjectOfClass:[NSString class] forKey:kResponseTypeKey]; + NSString *clientID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kClientIDKey]; + NSString *clientSecret = [aDecoder decodeObjectOfClass:[NSString class] forKey:kClientSecretKey]; + NSString *scope = [aDecoder decodeObjectOfClass:[NSString class] forKey:kScopeKey]; + NSURL *redirectURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:kRedirectURLKey]; + NSString *state = [aDecoder decodeObjectOfClass:[NSString class] forKey:kStateKey]; + NSString *nonce = [aDecoder decodeObjectOfClass:[NSString class] forKey:kNonceKey]; + NSString *codeVerifier = [aDecoder decodeObjectOfClass:[NSString class] forKey:kCodeVerifierKey]; + NSString *codeChallenge = + [aDecoder decodeObjectOfClass:[NSString class] forKey:kCodeChallengeKey]; + NSString *codeChallengeMethod = + [aDecoder decodeObjectOfClass:[NSString class] forKey:kCodeChallengeMethodKey]; + NSSet *additionalParameterCodingClasses = [NSSet setWithArray:@[ + [NSDictionary class], + [NSString class] + ]]; + NSDictionary *additionalParameters = + [aDecoder decodeObjectOfClasses:additionalParameterCodingClasses + forKey:kAdditionalParametersKey]; + + self = [self initWithConfiguration:configuration + clientId:clientID + clientSecret:clientSecret + scope:scope + redirectURL:redirectURL + responseType:responseType + state:state + nonce:nonce + codeVerifier:codeVerifier + codeChallenge:codeChallenge + codeChallengeMethod:codeChallengeMethod + additionalParameters:additionalParameters]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_configuration forKey:kConfigurationKey]; + [aCoder encodeObject:_responseType forKey:kResponseTypeKey]; + [aCoder encodeObject:_clientID forKey:kClientIDKey]; + [aCoder encodeObject:_clientSecret forKey:kClientSecretKey]; + [aCoder encodeObject:_scope forKey:kScopeKey]; + [aCoder encodeObject:_redirectURL forKey:kRedirectURLKey]; + [aCoder encodeObject:_state forKey:kStateKey]; + [aCoder encodeObject:_nonce forKey:kNonceKey]; + [aCoder encodeObject:_codeVerifier forKey:kCodeVerifierKey]; + [aCoder encodeObject:_codeChallenge forKey:kCodeChallengeKey]; + [aCoder encodeObject:_codeChallengeMethod forKey:kCodeChallengeMethodKey]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, request: %@>", + NSStringFromClass([self class]), + (void *)self, + self.authorizationRequestURL]; +} + +#pragma mark - State and PKCE verifier/challenge generation Methods + ++ (nullable NSString *)generateCodeVerifier { + return [OIDTokenUtilities randomURLSafeStringWithSize:kCodeVerifierBytes]; +} + ++ (nullable NSString *)generateState { + return [OIDTokenUtilities randomURLSafeStringWithSize:kStateSizeBytes]; +} + ++ (nullable NSString *)codeChallengeS256ForVerifier:(NSString *)codeVerifier { + if (!codeVerifier) { + return nil; + } + // generates the code_challenge per spec https://tools.ietf.org/html/rfc7636#section-4.2 + // code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) + // NB. the ASCII conversion on the code_verifier entropy was done at time of generation. + NSData *sha256Verifier = [OIDTokenUtilities sha256:codeVerifier]; + return [OIDTokenUtilities encodeBase64urlNoPadding:sha256Verifier]; +} + +#pragma mark - + +- (NSURL *)authorizationRequestURL { + OIDURLQueryComponent *query = [[OIDURLQueryComponent alloc] init]; + + // Required parameters. + [query addParameter:kResponseTypeKey value:_responseType]; + [query addParameter:kClientIDKey value:_clientID]; + + // Add any additional parameters the client has specified. + [query addParameters:_additionalParameters]; + + // Add optional parameters, as applicable. + if (_redirectURL) { + [query addParameter:kRedirectURLKey value:_redirectURL.absoluteString]; + } + if (_scope) { + [query addParameter:kScopeKey value:_scope]; + } + if (_state) { + [query addParameter:kStateKey value:_state]; + } + if (_nonce) { + [query addParameter:kNonceKey value:_nonce]; + } + if (_codeChallenge) { + [query addParameter:kCodeChallengeKey value:_codeChallenge]; + } + if (_codeChallengeMethod) { + [query addParameter:kCodeChallengeMethodKey value:_codeChallengeMethod]; + } + + // Construct the URL: + return [query URLByReplacingQueryInURL:_configuration.authorizationEndpoint]; +} + +#pragma mark - OIDExternalUserAgentRequest + +- (NSURL *)externalUserAgentRequestURL { + return [self authorizationRequestURL]; +} + +- (NSString *)redirectScheme { + return [[self redirectURL] scheme]; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.h new file mode 100644 index 00000000..e7552fe5 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.h @@ -0,0 +1,128 @@ +/*! @file OIDAuthorizationResponse.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDAuthorizationRequest; +@class OIDTokenRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents the response to an authorization request. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2 + @see https://tools.ietf.org/html/rfc6749#section-5.1 + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@interface OIDAuthorizationResponse : NSObject + +/*! @brief The request which was serviced. + */ +@property(nonatomic, readonly) OIDAuthorizationRequest *request; + +/*! @brief The authorization code generated by the authorization server. + @discussion Set when the response_type requested includes 'code'. + @remarks code + */ +@property(nonatomic, readonly, nullable) NSString *authorizationCode; + +/*! @brief REQUIRED if the "state" parameter was present in the client authorization request. The + exact value received from the client. + @remarks state + */ +@property(nonatomic, readonly, nullable) NSString *state; + +/*! @brief The access token generated by the authorization server. + @discussion Set when the response_type requested includes 'token'. + @remarks access_token + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *accessToken; + +/*! @brief The approximate expiration date & time of the access token. + @discussion Set when the response_type requested includes 'token'. + @remarks expires_in + @seealso OIDAuthorizationResponse.accessToken + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSDate *accessTokenExpirationDate; + +/*! @brief Typically "Bearer" when present. Otherwise, another token_type value that the Client has + negotiated with the Authorization Server. + @discussion Set when the response_type requested includes 'token'. + @remarks token_type + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *tokenType; + +/*! @brief ID Token value associated with the authenticated session. + @discussion Set when the response_type requested includes 'id_token'. + @remarks id_token + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *idToken; + +/*! @brief The scope of the access token. OPTIONAL, if identical to the scopes requested, otherwise, + REQUIRED. + @remarks scope + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief Additional parameters returned from the authorization server. + */ +@property(nonatomic, readonly, nullable) + NSDictionary *> *additionalParameters; + +/*! @internal + @brief Unavailable. Please use initWithRequest:parameters:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Designated initializer. + @param request The serviced request. + @param parameters The decoded parameters returned from the Authorization Server. + @remarks Known parameters are extracted from the @c parameters parameter and the normative + properties are populated. Non-normative parameters are placed in the + @c #additionalParameters dictionary. + */ +- (instancetype)initWithRequest:(OIDAuthorizationRequest *)request + parameters:(NSDictionary *> *)parameters + NS_DESIGNATED_INITIALIZER; + +/*! @brief Creates a token request suitable for exchanging an authorization code for an access + token. + @return A @c OIDTokenRequest suitable for exchanging an authorization code for an access + token. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +- (nullable OIDTokenRequest *)tokenExchangeRequest; + +/*! @brief Creates a token request suitable for exchanging an authorization code for an access + token. + @param additionalParameters Additional parameters for the token request. + @return A @c OIDTokenRequest suitable for exchanging an authorization code for an access + token. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +- (nullable OIDTokenRequest *)tokenExchangeRequestWithAdditionalParameters: + (nullable NSDictionary *)additionalParameters; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.m new file mode 100644 index 00000000..a8f92c75 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.m @@ -0,0 +1,210 @@ +/*! @file OIDAuthorizationResponse.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDAuthorizationResponse.h" + +#import "OIDAuthorizationRequest.h" +#import "OIDDefines.h" +#import "OIDError.h" +#import "OIDFieldMapping.h" +#import "OIDTokenRequest.h" +#import "OIDTokenUtilities.h" + +/*! @brief The key for the @c authorizationCode property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kAuthorizationCodeKey = @"code"; + +/*! @brief The key for the @c state property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kStateKey = @"state"; + +/*! @brief The key for the @c accessToken property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kAccessTokenKey = @"access_token"; + +/*! @brief The key for the @c accessTokenExpirationDate property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kExpiresInKey = @"expires_in"; + +/*! @brief The key for the @c tokenType property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kTokenTypeKey = @"token_type"; + +/*! @brief The key for the @c idToken property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kIDTokenKey = @"id_token"; + +/*! @brief The key for the @c scope property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c additionalParameters property for @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +/*! @brief Key used to encode the @c request property for @c NSSecureCoding + */ +static NSString *const kRequestKey = @"request"; + +/*! @brief The exception thrown when a developer tries to create a token exchange request from an + authorization request with no authorization code. + */ +static NSString *const kTokenExchangeRequestException = + @"Attempted to create a token exchange request from an authorization response with no " + "authorization code."; + +@implementation OIDAuthorizationResponse + +/*! @brief Returns a mapping of incoming parameters to instance variables. + @return A mapping of incoming parameters to instance variables. + */ ++ (NSDictionary *)fieldMap { + static NSMutableDictionary *fieldMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + fieldMap = [NSMutableDictionary dictionary]; + fieldMap[kStateKey] = + [[OIDFieldMapping alloc] initWithName:@"_state" type:[NSString class]]; + fieldMap[kAuthorizationCodeKey] = + [[OIDFieldMapping alloc] initWithName:@"_authorizationCode" type:[NSString class]]; + fieldMap[kAccessTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_accessToken" type:[NSString class]]; + fieldMap[kExpiresInKey] = + [[OIDFieldMapping alloc] initWithName:@"_accessTokenExpirationDate" + type:[NSDate class] + conversion:^id _Nullable(NSObject *_Nullable value) { + if (![value isKindOfClass:[NSNumber class]]) { + return value; + } + NSNumber *valueAsNumber = (NSNumber *)value; + return [NSDate dateWithTimeIntervalSinceNow:[valueAsNumber longLongValue]]; + }]; + fieldMap[kTokenTypeKey] = + [[OIDFieldMapping alloc] initWithName:@"_tokenType" type:[NSString class]]; + fieldMap[kIDTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_idToken" type:[NSString class]]; + fieldMap[kScopeKey] = + [[OIDFieldMapping alloc] initWithName:@"_scope" type:[NSString class]]; + }); + return fieldMap; +} + +#pragma mark - Initializers + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithRequest:parameters:)) + +- (instancetype)initWithRequest:(OIDAuthorizationRequest *)request + parameters:(NSDictionary *> *)parameters { + self = [super init]; + if (self) { + _request = [request copy]; + NSDictionary *> *additionalParameters = + [OIDFieldMapping remainingParametersWithMap:[[self class] fieldMap] + parameters:parameters + instance:self]; + _additionalParameters = additionalParameters; + } + return self; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDAuthorizationRequest *request = + [aDecoder decodeObjectOfClass:[OIDAuthorizationRequest class] forKey:kRequestKey]; + self = [self initWithRequest:request parameters:@{ }]; + if (self) { + [OIDFieldMapping decodeWithCoder:aDecoder map:[[self class] fieldMap] instance:self]; + _additionalParameters = [aDecoder decodeObjectOfClasses:[OIDFieldMapping JSONTypes] + forKey:kAdditionalParametersKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_request forKey:kRequestKey]; + [OIDFieldMapping encodeWithCoder:aCoder map:[[self class] fieldMap] instance:self]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, authorizationCode: %@, state: \"%@\", accessToken: " + "\"%@\", accessTokenExpirationDate: %@, tokenType: %@, " + "idToken: \"%@\", scope: \"%@\", additionalParameters: %@, " + "request: %@>", + NSStringFromClass([self class]), + (void *)self, + _authorizationCode, + _state, + [OIDTokenUtilities redact:_accessToken], + _accessTokenExpirationDate, + _tokenType, + [OIDTokenUtilities redact:_idToken], + _scope, + _additionalParameters, + _request]; +} + +#pragma mark - + +- (OIDTokenRequest *)tokenExchangeRequest { + return [self tokenExchangeRequestWithAdditionalParameters:nil]; +} + +- (OIDTokenRequest *)tokenExchangeRequestWithAdditionalParameters: + (NSDictionary *)additionalParameters { + // TODO: add a unit test to confirm exception is thrown when expected and the request is created + // with the correct parameters. + if (!_authorizationCode) { + [NSException raise:kTokenExchangeRequestException + format:kTokenExchangeRequestException]; + } + return [[OIDTokenRequest alloc] initWithConfiguration:_request.configuration + grantType:OIDGrantTypeAuthorizationCode + authorizationCode:_authorizationCode + redirectURL:_request.redirectURL + clientID:_request.clientID + clientSecret:_request.clientSecret + scope:nil + refreshToken:nil + codeVerifier:_request.codeVerifier + additionalParameters:additionalParameters]; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.h new file mode 100644 index 00000000..c8fee535 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.h @@ -0,0 +1,170 @@ +/*! @file OIDAuthorizationService.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDAuthorization; +@class OIDAuthorizationRequest; +@class OIDAuthorizationResponse; +@class OIDEndSessionRequest; +@class OIDEndSessionResponse; +@class OIDRegistrationRequest; +@class OIDRegistrationResponse; +@class OIDServiceConfiguration; +@class OIDTokenRequest; +@class OIDTokenResponse; +@protocol OIDExternalUserAgent; +@protocol OIDExternalUserAgentSession; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents the type of block used as a callback for creating a service configuration from + a remote OpenID Connect Discovery document. + @param configuration The service configuration, if available. + @param error The error if an error occurred. + */ +typedef void (^OIDDiscoveryCallback)(OIDServiceConfiguration *_Nullable configuration, + NSError *_Nullable error); + +/*! @brief Represents the type of block used as a callback for various methods of + @c OIDAuthorizationService. + @param authorizationResponse The authorization response, if available. + @param error The error if an error occurred. + */ +typedef void (^OIDAuthorizationCallback)(OIDAuthorizationResponse *_Nullable authorizationResponse, + NSError *_Nullable error); + +/*! @brief Block used as a callback for the end-session request of @c OIDAuthorizationService. + @param endSessionResponse The end-session response, if available. + @param error The error if an error occurred. + */ +typedef void (^OIDEndSessionCallback)(OIDEndSessionResponse *_Nullable endSessionResponse, + NSError *_Nullable error); + +/*! @brief Represents the type of block used as a callback for various methods of + @c OIDAuthorizationService. + @param tokenResponse The token response, if available. + @param error The error if an error occurred. + */ +typedef void (^OIDTokenCallback)(OIDTokenResponse *_Nullable tokenResponse, + NSError *_Nullable error); + +/*! @brief Represents the type of dictionary used to specify additional querystring parameters + when making authorization or token endpoint requests. + */ +typedef NSDictionary *_Nullable OIDTokenEndpointParameters; + +/*! @brief Represents the type of block used as a callback for various methods of + @c OIDAuthorizationService. + @param registrationResponse The registration response, if available. + @param error The error if an error occurred. +*/ +typedef void (^OIDRegistrationCompletion)(OIDRegistrationResponse *_Nullable registrationResponse, + NSError *_Nullable error); + +/*! @brief Performs various OAuth and OpenID Connect related calls via the user agent or + \NSURLSession. + */ +@interface OIDAuthorizationService : NSObject + +/*! @brief The service's configuration. + @remarks Each authorization service is initialized with a configuration. This configuration + specifies how to connect to a particular OAuth provider. Clients should use separate + authorization service instances for each provider they wish to integrate with. + Configurations may be created manually, or via an OpenID Connect Discovery Document. + */ +@property(nonatomic, readonly) OIDServiceConfiguration *configuration; + +/*! @internal + @brief Unavailable. This class should not be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Convenience method for creating an authorization service configuration from an OpenID + Connect compliant issuer URL. + @param issuerURL The service provider's OpenID Connect issuer. + @param completion A block which will be invoked when the authorization service configuration has + been created, or when an error has occurred. + @see https://openid.net/specs/openid-connect-discovery-1_0.html + */ ++ (void)discoverServiceConfigurationForIssuer:(NSURL *)issuerURL + completion:(OIDDiscoveryCallback)completion; + + +/*! @brief Convenience method for creating an authorization service configuration from an OpenID + Connect compliant identity provider's discovery document. + @param discoveryURL The URL of the service provider's OpenID Connect discovery document. + @param completion A block which will be invoked when the authorization service configuration has + been created, or when an error has occurred. + @see https://openid.net/specs/openid-connect-discovery-1_0.html + */ ++ (void)discoverServiceConfigurationForDiscoveryURL:(NSURL *)discoveryURL + completion:(OIDDiscoveryCallback)completion; + +/*! @brief Perform an authorization flow using a generic flow shim. + @param request The authorization request. + @param externalUserAgent Generic external user-agent that can present an authorization + request. + @param callback The method called when the request has completed or failed. + @return A @c OIDExternalUserAgentSession instance which will terminate when it + receives a @c OIDExternalUserAgentSession.cancel message, or after processing a + @c OIDExternalUserAgentSession.resumeExternalUserAgentFlowWithURL: message. + */ ++ (id) presentAuthorizationRequest:(OIDAuthorizationRequest *)request + externalUserAgent:(id)externalUserAgent + callback:(OIDAuthorizationCallback)callback; + +/*! @brief Perform a logout request. + @param request The end-session logout request. + @param externalUserAgent Generic external user-agent that can present user-agent requests. + @param callback The method called when the request has completed or failed. + @return A @c OIDExternalUserAgentSession instance which will terminate when it + receives a @c OIDExternalUserAgentSession.cancel message, or after processing a + @c OIDExternalUserAgentSession.resumeExternalUserAgentFlowWithURL: message. + @see http://openid.net/specs/openid-connect-session-1_0.html#RPLogout + */ ++ (id) + presentEndSessionRequest:(OIDEndSessionRequest *)request + externalUserAgent:(id)externalUserAgent + callback:(OIDEndSessionCallback)callback; + +/*! @brief Performs a token request. + @param request The token request. + @param callback The method called when the request has completed or failed. + */ ++ (void)performTokenRequest:(OIDTokenRequest *)request callback:(OIDTokenCallback)callback; + +/*! @brief Performs a token request. + @param request The token request. + @param authorizationResponse The original authorization response related to this token request. + @param callback The method called when the request has completed or failed. + */ ++ (void)performTokenRequest:(OIDTokenRequest *)request + originalAuthorizationResponse:(OIDAuthorizationResponse *_Nullable)authorizationResponse + callback:(OIDTokenCallback)callback; + +/*! @brief Performs a registration request. + @param request The registration request. + @param completion The method called when the request has completed or failed. + */ ++ (void)performRegistrationRequest:(OIDRegistrationRequest *)request + completion:(OIDRegistrationCompletion)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.m new file mode 100644 index 00000000..cc749a3f --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.m @@ -0,0 +1,790 @@ +/*! @file OIDAuthorizationService.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDAuthorizationService.h" + +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDDefines.h" +#import "OIDEndSessionRequest.h" +#import "OIDEndSessionResponse.h" +#import "OIDErrorUtilities.h" +#import "OIDExternalUserAgent.h" +#import "OIDExternalUserAgentSession.h" +#import "OIDIDToken.h" +#import "OIDRegistrationRequest.h" +#import "OIDRegistrationResponse.h" +#import "OIDServiceConfiguration.h" +#import "OIDServiceDiscovery.h" +#import "OIDTokenRequest.h" +#import "OIDTokenResponse.h" +#import "OIDURLQueryComponent.h" +#import "OIDURLSessionProvider.h" + +/*! @brief Path appended to an OpenID Connect issuer for discovery + @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig + */ +static NSString *const kOpenIDConfigurationWellKnownPath = @".well-known/openid-configuration"; + +/*! @brief Max allowable iat (Issued At) time skew + @see https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation + */ +static int const kOIDAuthorizationSessionIATMaxSkew = 600; + +NS_ASSUME_NONNULL_BEGIN + +@interface OIDAuthorizationSession : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithRequest:(OIDAuthorizationRequest *)request + NS_DESIGNATED_INITIALIZER; + +@end + +@implementation OIDAuthorizationSession { + OIDAuthorizationRequest *_request; + id _externalUserAgent; + OIDAuthorizationCallback _pendingauthorizationFlowCallback; +} + +- (instancetype)initWithRequest:(OIDAuthorizationRequest *)request { + self = [super init]; + if (self) { + _request = [request copy]; + } + return self; +} + +- (void)presentAuthorizationWithExternalUserAgent:(id)externalUserAgent + callback:(OIDAuthorizationCallback)authorizationFlowCallback { + _externalUserAgent = externalUserAgent; + _pendingauthorizationFlowCallback = authorizationFlowCallback; + BOOL authorizationFlowStarted = + [_externalUserAgent presentExternalUserAgentRequest:_request session:self]; + if (!authorizationFlowStarted) { + NSError *safariError = [OIDErrorUtilities errorWithCode:OIDErrorCodeSafariOpenError + underlyingError:nil + description:@"Unable to open Safari."]; + [self didFinishWithResponse:nil error:safariError]; + } +} + +- (void)cancel { + [self cancelWithCompletion:nil]; +} + +- (void)cancelWithCompletion:(nullable void (^)(void))completion { + [_externalUserAgent dismissExternalUserAgentAnimated:YES completion:^{ + NSError *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeUserCanceledAuthorizationFlow + underlyingError:nil + description:@"Authorization flow was cancelled."]; + [self didFinishWithResponse:nil error:error]; + if (completion) completion(); + }]; +} + +/*! @brief Does the redirection URL equal another URL down to the path component? + @param URL The first redirect URI to compare. + @param redirectionURL The second redirect URI to compare. + @return YES if the URLs match down to the path level (query params are ignored). + */ ++ (BOOL)URL:(NSURL *)URL matchesRedirectionURL:(NSURL *)redirectionURL { + NSURL *standardizedURL = [URL standardizedURL]; + NSURL *standardizedRedirectURL = [redirectionURL standardizedURL]; + + return [standardizedURL.scheme caseInsensitiveCompare:standardizedRedirectURL.scheme] == NSOrderedSame + && OIDIsEqualIncludingNil(standardizedURL.user, standardizedRedirectURL.user) + && OIDIsEqualIncludingNil(standardizedURL.password, standardizedRedirectURL.password) + && OIDIsEqualIncludingNil(standardizedURL.host, standardizedRedirectURL.host) + && OIDIsEqualIncludingNil(standardizedURL.port, standardizedRedirectURL.port) + && OIDIsEqualIncludingNil(standardizedURL.path, standardizedRedirectURL.path); +} + +- (BOOL)shouldHandleURL:(NSURL *)URL { + return [[self class] URL:URL matchesRedirectionURL:_request.redirectURL]; +} + +- (BOOL)resumeExternalUserAgentFlowWithURL:(NSURL *)URL { + // rejects URLs that don't match redirect (these may be completely unrelated to the authorization) + if (![self shouldHandleURL:URL]) { + return NO; + } + + AppAuthRequestTrace(@"Authorization Response: %@", URL); + + // checks for an invalid state + if (!_pendingauthorizationFlowCallback) { + [NSException raise:OIDOAuthExceptionInvalidAuthorizationFlow + format:@"%@", OIDOAuthExceptionInvalidAuthorizationFlow, nil]; + } + + OIDURLQueryComponent *query = [[OIDURLQueryComponent alloc] initWithURL:URL]; + + NSError *error; + OIDAuthorizationResponse *response = nil; + + // checks for an OAuth error response as per RFC6749 Section 4.1.2.1 + if (query.dictionaryValue[OIDOAuthErrorFieldError]) { + error = [OIDErrorUtilities OAuthErrorWithDomain:OIDOAuthAuthorizationErrorDomain + OAuthResponse:query.dictionaryValue + underlyingError:nil]; + } + + // no error, should be a valid OAuth 2.0 response + if (!error) { + response = [[OIDAuthorizationResponse alloc] initWithRequest:_request + parameters:query.dictionaryValue]; + + // verifies that the state in the response matches the state in the request, or both are nil + if (!OIDIsEqualIncludingNil(_request.state, response.state)) { + NSMutableDictionary *userInfo = [query.dictionaryValue mutableCopy]; + userInfo[NSLocalizedDescriptionKey] = + [NSString stringWithFormat:@"State mismatch, expecting %@ but got %@ in authorization " + "response %@", + _request.state, + response.state, + response]; + response = nil; + error = [NSError errorWithDomain:OIDOAuthAuthorizationErrorDomain + code:OIDErrorCodeOAuthAuthorizationClientError + userInfo:userInfo]; + } + } + + [_externalUserAgent dismissExternalUserAgentAnimated:YES completion:^{ + [self didFinishWithResponse:response error:error]; + }]; + + return YES; +} + +- (void)failExternalUserAgentFlowWithError:(NSError *)error { + [self didFinishWithResponse:nil error:error]; +} + +/*! @brief Invokes the pending callback and performs cleanup. + @param response The authorization response, if any to return to the callback. + @param error The error, if any, to return to the callback. + */ +- (void)didFinishWithResponse:(nullable OIDAuthorizationResponse *)response + error:(nullable NSError *)error { + OIDAuthorizationCallback callback = _pendingauthorizationFlowCallback; + _pendingauthorizationFlowCallback = nil; + _externalUserAgent = nil; + if (callback) { + callback(response, error); + } +} + +@end + +@interface OIDEndSessionImplementation : NSObject { + // private variables + OIDEndSessionRequest *_request; + id _externalUserAgent; + OIDEndSessionCallback _pendingEndSessionCallback; +} +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithRequest:(OIDEndSessionRequest *)request + NS_DESIGNATED_INITIALIZER; +@end + + +@implementation OIDEndSessionImplementation + +- (instancetype)initWithRequest:(OIDEndSessionRequest *)request { + self = [super init]; + if (self) { + _request = [request copy]; + } + return self; +} + +- (void)presentAuthorizationWithExternalUserAgent:(id)externalUserAgent + callback:(OIDEndSessionCallback)authorizationFlowCallback { + _externalUserAgent = externalUserAgent; + _pendingEndSessionCallback = authorizationFlowCallback; + BOOL authorizationFlowStarted = + [_externalUserAgent presentExternalUserAgentRequest:_request session:self]; + if (!authorizationFlowStarted) { + NSError *safariError = [OIDErrorUtilities errorWithCode:OIDErrorCodeSafariOpenError + underlyingError:nil + description:@"Unable to open Safari."]; + [self didFinishWithResponse:nil error:safariError]; + } +} + +- (void)cancel { + [self cancelWithCompletion:nil]; +} + +- (void)cancelWithCompletion:(nullable void (^)(void))completion { + [_externalUserAgent dismissExternalUserAgentAnimated:YES completion:^{ + NSError *error = [OIDErrorUtilities + errorWithCode:OIDErrorCodeUserCanceledAuthorizationFlow + underlyingError:nil + description:nil]; + [self didFinishWithResponse:nil error:error]; + if (completion) completion(); + }]; +} + +- (BOOL)shouldHandleURL:(NSURL *)URL { + // The logic of when to handle the URL is the same as for authorization requests: should match + // down to the path component. + return [[OIDAuthorizationSession class] URL:URL + matchesRedirectionURL:_request.postLogoutRedirectURL]; +} + +- (BOOL)resumeExternalUserAgentFlowWithURL:(NSURL *)URL { + // rejects URLs that don't match redirect (these may be completely unrelated to the authorization) + if (![self shouldHandleURL:URL]) { + return NO; + } + // checks for an invalid state + if (!_pendingEndSessionCallback) { + [NSException raise:OIDOAuthExceptionInvalidAuthorizationFlow + format:@"%@", OIDOAuthExceptionInvalidAuthorizationFlow, nil]; + } + + + NSError *error; + OIDEndSessionResponse *response = nil; + + OIDURLQueryComponent *query = [[OIDURLQueryComponent alloc] initWithURL:URL]; + response = [[OIDEndSessionResponse alloc] initWithRequest:_request + parameters:query.dictionaryValue]; + + // verifies that the state in the response matches the state in the request, or both are nil + if (!OIDIsEqualIncludingNil(_request.state, response.state)) { + NSMutableDictionary *userInfo = [query.dictionaryValue mutableCopy]; + userInfo[NSLocalizedDescriptionKey] = + [NSString stringWithFormat:@"State mismatch, expecting %@ but got %@ in authorization " + "response %@", + _request.state, + response.state, + response]; + response = nil; + error = [NSError errorWithDomain:OIDOAuthAuthorizationErrorDomain + code:OIDErrorCodeOAuthAuthorizationClientError + userInfo:userInfo]; + } + + [_externalUserAgent dismissExternalUserAgentAnimated:YES completion:^{ + [self didFinishWithResponse:response error:error]; + }]; + + return YES; +} + +- (void)failExternalUserAgentFlowWithError:(NSError *)error { + [self didFinishWithResponse:nil error:error]; +} + +/*! @brief Invokes the pending callback and performs cleanup. + @param response The authorization response, if any to return to the callback. + @param error The error, if any, to return to the callback. + */ +- (void)didFinishWithResponse:(nullable OIDEndSessionResponse *)response + error:(nullable NSError *)error { + OIDEndSessionCallback callback = _pendingEndSessionCallback; + _pendingEndSessionCallback = nil; + _externalUserAgent = nil; + if (callback) { + callback(response, error); + } +} + +@end + +@implementation OIDAuthorizationService + ++ (void)discoverServiceConfigurationForIssuer:(NSURL *)issuerURL + completion:(OIDDiscoveryCallback)completion { + NSURL *fullDiscoveryURL = + [issuerURL URLByAppendingPathComponent:kOpenIDConfigurationWellKnownPath]; + + [[self class] discoverServiceConfigurationForDiscoveryURL:fullDiscoveryURL + completion:completion]; +} + ++ (void)discoverServiceConfigurationForDiscoveryURL:(NSURL *)discoveryURL + completion:(OIDDiscoveryCallback)completion { + + NSURLSession *session = [OIDURLSessionProvider session]; + NSURLSessionDataTask *task = + [session dataTaskWithURL:discoveryURL + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + // If we got any sort of error, just report it. + if (error || !data) { + NSString *errorDescription = + [NSString stringWithFormat:@"Connection error fetching discovery document '%@': %@.", + discoveryURL, + error.localizedDescription]; + error = [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:error + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, error); + }); + return; + } + + NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response; + + // Check for non-200 status codes. + // https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationResponse + if (urlResponse.statusCode != 200) { + NSError *URLResponseError = [OIDErrorUtilities HTTPErrorWithHTTPResponse:urlResponse + data:data]; + NSString *errorDescription = + [NSString stringWithFormat:@"Non-200 HTTP response (%d) fetching discovery document " + "'%@'.", + (int)urlResponse.statusCode, + discoveryURL]; + error = [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:URLResponseError + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, error); + }); + return; + } + + // Construct an OIDServiceDiscovery with the received JSON. + OIDServiceDiscovery *discovery = + [[OIDServiceDiscovery alloc] initWithJSONData:data error:&error]; + if (error || !discovery) { + NSString *errorDescription = + [NSString stringWithFormat:@"JSON error parsing document at '%@': %@", + discoveryURL, + error.localizedDescription]; + error = [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:error + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, error); + }); + return; + } + + // Create our service configuration with the discovery document and return it. + OIDServiceConfiguration *configuration = + [[OIDServiceConfiguration alloc] initWithDiscoveryDocument:discovery]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(configuration, nil); + }); + }]; + [task resume]; +} + +#pragma mark - Authorization Endpoint + ++ (id) presentAuthorizationRequest:(OIDAuthorizationRequest *)request + externalUserAgent:(id)externalUserAgent + callback:(OIDAuthorizationCallback)callback { + + AppAuthRequestTrace(@"Authorization Request: %@", request); + + OIDAuthorizationSession *flowSession = [[OIDAuthorizationSession alloc] initWithRequest:request]; + [flowSession presentAuthorizationWithExternalUserAgent:externalUserAgent callback:callback]; + return flowSession; +} + ++ (id) + presentEndSessionRequest:(OIDEndSessionRequest *)request + externalUserAgent:(id)externalUserAgent + callback:(OIDEndSessionCallback)callback { + OIDEndSessionImplementation *flowSession = + [[OIDEndSessionImplementation alloc] initWithRequest:request]; + [flowSession presentAuthorizationWithExternalUserAgent:externalUserAgent callback:callback]; + return flowSession; +} + +#pragma mark - Token Endpoint + ++ (void)performTokenRequest:(OIDTokenRequest *)request callback:(OIDTokenCallback)callback { + [[self class] performTokenRequest:request + originalAuthorizationResponse:nil + callback:callback]; +} + ++ (void)performTokenRequest:(OIDTokenRequest *)request + originalAuthorizationResponse:(OIDAuthorizationResponse *_Nullable)authorizationResponse + callback:(OIDTokenCallback)callback { + + NSURLRequest *URLRequest = [request URLRequest]; + + AppAuthRequestTrace(@"Token Request: %@\nHeaders:%@\nHTTPBody: %@", + URLRequest.URL, + URLRequest.allHTTPHeaderFields, + [[NSString alloc] initWithData:URLRequest.HTTPBody + encoding:NSUTF8StringEncoding]); + + NSURLSession *session = [OIDURLSessionProvider session]; + [[session dataTaskWithRequest:URLRequest + completionHandler:^(NSData *_Nullable data, + NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + // A network error or server error occurred. + NSString *errorDescription = + [NSString stringWithFormat:@"Connection error making token request to '%@': %@.", + URLRequest.URL, + error.localizedDescription]; + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:error + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, returnedError); + }); + return; + } + + NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response; + NSInteger statusCode = HTTPURLResponse.statusCode; + AppAuthRequestTrace(@"Token Response: HTTP Status %d\nHTTPBody: %@", + (int)statusCode, + [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); + if (statusCode != 200) { + // A server error occurred. + NSError *serverError = + [OIDErrorUtilities HTTPErrorWithHTTPResponse:HTTPURLResponse data:data]; + + // HTTP 4xx may indicate an RFC6749 Section 5.2 error response, attempts to parse as such. + if (statusCode >= 400 && statusCode < 500) { + NSError *jsonDeserializationError; + NSDictionary *> *json = + [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonDeserializationError]; + + // If the HTTP 4xx response parses as JSON and has an 'error' key, it's an OAuth error. + // These errors are special as they indicate a problem with the authorization grant. + if (json[OIDOAuthErrorFieldError]) { + NSError *oauthError = + [OIDErrorUtilities OAuthErrorWithDomain:OIDOAuthTokenErrorDomain + OAuthResponse:json + underlyingError:serverError]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, oauthError); + }); + return; + } + } + + // Status code indicates this is an error, but not an RFC6749 Section 5.2 error. + NSString *errorDescription = + [NSString stringWithFormat:@"Non-200 HTTP response (%d) making token request to '%@'.", + (int)statusCode, + URLRequest.URL]; + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeServerError + underlyingError:serverError + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, returnedError); + }); + return; + } + + NSError *jsonDeserializationError; + NSDictionary *> *json = + [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonDeserializationError]; + if (jsonDeserializationError) { + // A problem occurred deserializing the response/JSON. + NSString *errorDescription = + [NSString stringWithFormat:@"JSON error parsing token response: %@", + jsonDeserializationError.localizedDescription]; + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeJSONDeserializationError + underlyingError:jsonDeserializationError + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, returnedError); + }); + return; + } + + OIDTokenResponse *tokenResponse = + [[OIDTokenResponse alloc] initWithRequest:request parameters:json]; + if (!tokenResponse) { + // A problem occurred constructing the token response from the JSON. + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeTokenResponseConstructionError + underlyingError:jsonDeserializationError + description:@"Token response invalid."]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, returnedError); + }); + return; + } + + // If an ID Token is included in the response, validates the ID Token following the rules + // in OpenID Connect Core Section 3.1.3.7 for features that AppAuth directly supports + // (which excludes rules #1, #4, #5, #7, #8, #12, and #13). Regarding rule #6, ID Tokens + // received by this class are received via direct communication between the Client and the Token + // Endpoint, thus we are exercising the option to rely only on the TLS validation. AppAuth + // has a zero dependencies policy, and verifying the JWT signature would add a dependency. + // Users of the library are welcome to perform the JWT signature verification themselves should + // they wish. + if (tokenResponse.idToken) { + OIDIDToken *idToken = [[OIDIDToken alloc] initWithIDTokenString:tokenResponse.idToken]; + if (!idToken) { + NSError *invalidIDToken = + [OIDErrorUtilities errorWithCode:OIDErrorCodeIDTokenParsingError + underlyingError:nil + description:@"ID Token parsing failed"]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, invalidIDToken); + }); + return; + } + + // OpenID Connect Core Section 3.1.3.7. rule #1 + // Not supported: AppAuth does not support JWT encryption. + + // OpenID Connect Core Section 3.1.3.7. rule #2 + // Validates that the issuer in the ID Token matches that of the discovery document. + NSURL *issuer = tokenResponse.request.configuration.issuer; + if (issuer && ![idToken.issuer isEqual:issuer]) { + NSError *invalidIDToken = + [OIDErrorUtilities errorWithCode:OIDErrorCodeIDTokenFailedValidationError + underlyingError:nil + description:@"Issuer mismatch"]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, invalidIDToken); + }); + return; + } + + // OpenID Connect Core Section 3.1.3.7. rule #3 & Section 2 azp Claim + // Validates that the aud (audience) Claim contains the client ID, or that the azp + // (authorized party) Claim matches the client ID. + NSString *clientID = tokenResponse.request.clientID; + if (![idToken.audience containsObject:clientID] && + ![idToken.claims[@"azp"] isEqualToString:clientID]) { + NSError *invalidIDToken = + [OIDErrorUtilities errorWithCode:OIDErrorCodeIDTokenFailedValidationError + underlyingError:nil + description:@"Audience mismatch"]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, invalidIDToken); + }); + return; + } + + // OpenID Connect Core Section 3.1.3.7. rules #4 & #5 + // Not supported. + + // OpenID Connect Core Section 3.1.3.7. rule #6 + // As noted above, AppAuth only supports the code flow which results in direct communication + // of the ID Token from the Token Endpoint to the Client, and we are exercising the option to + // use TSL server validation instead of checking the token signature. Users may additionally + // check the token signature should they wish. + + // OpenID Connect Core Section 3.1.3.7. rules #7 & #8 + // Not applicable. See rule #6. + + // OpenID Connect Core Section 3.1.3.7. rule #9 + // Validates that the current time is before the expiry time. + NSTimeInterval expiresAtDifference = [idToken.expiresAt timeIntervalSinceNow]; + if (expiresAtDifference < 0) { + NSError *invalidIDToken = + [OIDErrorUtilities errorWithCode:OIDErrorCodeIDTokenFailedValidationError + underlyingError:nil + description:@"ID Token expired"]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, invalidIDToken); + }); + return; + } + + // OpenID Connect Core Section 3.1.3.7. rule #10 + // Validates that the issued at time is not more than +/- 10 minutes on the current time. + NSTimeInterval issuedAtDifference = [idToken.issuedAt timeIntervalSinceNow]; + if (fabs(issuedAtDifference) > kOIDAuthorizationSessionIATMaxSkew) { + NSString *message = + [NSString stringWithFormat:@"Issued at time is more than %d seconds before or after " + "the current time", + kOIDAuthorizationSessionIATMaxSkew]; + NSError *invalidIDToken = + [OIDErrorUtilities errorWithCode:OIDErrorCodeIDTokenFailedValidationError + underlyingError:nil + description:message]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, invalidIDToken); + }); + return; + } + + // Only relevant for the authorization_code response type + if ([tokenResponse.request.grantType isEqual:OIDGrantTypeAuthorizationCode]) { + // OpenID Connect Core Section 3.1.3.7. rule #11 + // Validates the nonce. + NSString *nonce = authorizationResponse.request.nonce; + if (nonce && ![idToken.nonce isEqual:nonce]) { + NSError *invalidIDToken = + [OIDErrorUtilities errorWithCode:OIDErrorCodeIDTokenFailedValidationError + underlyingError:nil + description:@"Nonce mismatch"]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, invalidIDToken); + }); + return; + } + } + + // OpenID Connect Core Section 3.1.3.7. rules #12 + // ACR is not directly supported by AppAuth. + + // OpenID Connect Core Section 3.1.3.7. rules #12 + // max_age is not directly supported by AppAuth. + } + + // Success + dispatch_async(dispatch_get_main_queue(), ^{ + callback(tokenResponse, nil); + }); + }] resume]; +} + + +#pragma mark - Registration Endpoint + ++ (void)performRegistrationRequest:(OIDRegistrationRequest *)request + completion:(OIDRegistrationCompletion)completion { + NSURLRequest *URLRequest = [request URLRequest]; + if (!URLRequest) { + // A problem occurred deserializing the response/JSON. + NSError *returnedError = [OIDErrorUtilities errorWithCode:OIDErrorCodeJSONSerializationError + underlyingError:nil + description:@"The registration request could not " + "be serialized as JSON."]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, returnedError); + }); + return; + } + + NSURLSession *session = [OIDURLSessionProvider session]; + [[session dataTaskWithRequest:URLRequest + completionHandler:^(NSData *_Nullable data, + NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + // A network error or server error occurred. + NSString *errorDescription = + [NSString stringWithFormat:@"Connection error making registration request to '%@': %@.", + URLRequest.URL, + error.localizedDescription]; + NSError *returnedError = [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:error + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, returnedError); + }); + return; + } + + NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *) response; + + if (HTTPURLResponse.statusCode != 201 && HTTPURLResponse.statusCode != 200) { + // A server error occurred. + NSError *serverError = [OIDErrorUtilities HTTPErrorWithHTTPResponse:HTTPURLResponse + data:data]; + + // HTTP 400 may indicate an OpenID Connect Dynamic Client Registration 1.0 Section 3.3 error + // response, checks for that + if (HTTPURLResponse.statusCode == 400) { + NSError *jsonDeserializationError; + NSDictionary *> *json = + [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonDeserializationError]; + + // if the HTTP 400 response parses as JSON and has an 'error' key, it's an OAuth error + // these errors are special as they indicate a problem with the authorization grant + if (json[OIDOAuthErrorFieldError]) { + NSError *oauthError = + [OIDErrorUtilities OAuthErrorWithDomain:OIDOAuthRegistrationErrorDomain + OAuthResponse:json + underlyingError:serverError]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, oauthError); + }); + return; + } + } + + // not an OAuth error, just a generic server error + NSString *errorDescription = + [NSString stringWithFormat:@"Non-200/201 HTTP response (%d) making registration request " + "to '%@'.", + (int)HTTPURLResponse.statusCode, + URLRequest.URL]; + NSError *returnedError = [OIDErrorUtilities errorWithCode:OIDErrorCodeServerError + underlyingError:serverError + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, returnedError); + }); + return; + } + + NSError *jsonDeserializationError; + NSDictionary *> *json = + [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonDeserializationError]; + if (jsonDeserializationError) { + // A problem occurred deserializing the response/JSON. + NSString *errorDescription = + [NSString stringWithFormat:@"JSON error parsing registration response: %@", + jsonDeserializationError.localizedDescription]; + NSError *returnedError = [OIDErrorUtilities errorWithCode:OIDErrorCodeJSONDeserializationError + underlyingError:jsonDeserializationError + description:errorDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, returnedError); + }); + return; + } + + OIDRegistrationResponse *registrationResponse = + [[OIDRegistrationResponse alloc] initWithRequest:request + parameters:json]; + if (!registrationResponse) { + // A problem occurred constructing the registration response from the JSON. + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeRegistrationResponseConstructionError + underlyingError:nil + description:@"Registration response invalid."]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, returnedError); + }); + return; + } + + // Success + dispatch_async(dispatch_get_main_queue(), ^{ + completion(registrationResponse, nil); + }); + }] resume]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.h new file mode 100644 index 00000000..39ea2d62 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.h @@ -0,0 +1,51 @@ +/*! @file OIDClientMetadataParameters.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 The AppAuth for iOS Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Parameter name for the token endpoint authentication method. + */ +extern NSString *const OIDTokenEndpointAuthenticationMethodParam; + +/*! @brief Parameter name for the application type. + */ +extern NSString *const OIDApplicationTypeParam; + +/*! @brief Parameter name for the redirect URI values. + */ +extern NSString *const OIDRedirectURIsParam; + +/*! @brief Parameter name for the response type values. + */ +extern NSString *const OIDResponseTypesParam; + +/*! @brief Parameter name for the grant type values. + */ +extern NSString *const OIDGrantTypesParam; + +/*! @brief Parameter name for the subject type. + */ +extern NSString *const OIDSubjectTypeParam; + +/*! @brief Application type that indicates this client is a native (not a web) application. + */ +extern NSString *const OIDApplicationTypeNative; + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.m new file mode 100644 index 00000000..79ad4676 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.m @@ -0,0 +1,33 @@ +/*! @file OIDClientMetadataParameters.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 The AppAuth for iOS Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDClientMetadataParameters.h" + +NSString *const OIDTokenEndpointAuthenticationMethodParam = @"token_endpoint_auth_method"; + +NSString *const OIDApplicationTypeParam = @"application_type"; + +NSString *const OIDRedirectURIsParam = @"redirect_uris"; + +NSString *const OIDResponseTypesParam = @"response_types"; + +NSString *const OIDGrantTypesParam = @"grant_types"; + +NSString *const OIDSubjectTypeParam = @"subject_type"; + +NSString *const OIDApplicationTypeNative = @"native"; diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDDefines.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDDefines.h new file mode 100644 index 00000000..8ff4f19b --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDDefines.h @@ -0,0 +1,51 @@ +/*! @file OIDDefines.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +/*! @def OIDIsEqualIncludingNil(x, y) + @brief Returns YES if x and y are equal by reference or value. + @discussion NOTE: parameters may be evaluated multiple times. Be careful if using this check + with expressions - especially if the expressions have side effects. + @param x An object. + @param y An object. + */ +#define OIDIsEqualIncludingNil(x, y) (((x) == (y)) || [(x) isEqual:(y)]) + +/*! @def OID_UNAVAILABLE_USE_INITIALIZER(designatedInitializer) + @brief Provides a template implementation for init-family methods which have been marked as + NS_UNAVILABLE. Stops the compiler from giving a warning when it's the super class' + designated initializer, and gives callers useful feedback telling them what the + new designated initializer is. + @remarks Takes a SEL as a parameter instead of a string so that we get compiler warnings if the + designated intializer's signature changes. + @param designatedInitializer A SEL referencing the designated initializer. + */ +#define OID_UNAVAILABLE_USE_INITIALIZER(designatedInitializer) { \ + NSString *reason = [NSString stringWithFormat:@"Called: %@\nDesignated Initializer:%@", \ + NSStringFromSelector(_cmd), \ + NSStringFromSelector(designatedInitializer)]; \ + @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." \ + reason:reason \ + userInfo:nil]; \ +} + +#ifdef _APPAUTHTRACE +# define AppAuthRequestTrace(fmt, ...) NSLog(fmt, ##__VA_ARGS__); +#else // _APPAUTHTRACE +# define AppAuthRequestTrace(...) +#endif // _APPAUTHTRACE + diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.h new file mode 100644 index 00000000..4087e9fa --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.h @@ -0,0 +1,107 @@ +/*! @file OIDEndSessionRequest.h + @brief AppAuth iOS SDK + @copyright + Copyright 2017 The AppAuth Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#import "OIDExternalUserAgentRequest.h" + +@class OIDServiceConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +@interface OIDEndSessionRequest : NSObject + + +/*! @brief The service's configuration. + @remarks This configuration specifies how to connect to a particular OAuth provider. + Configurations may be created manually, or via an OpenID Connect Discovery Document. + */ +@property(nonatomic, readonly) OIDServiceConfiguration *configuration; + +/*! @brief The client's redirect URI. + @remarks post_logout_redirect_uri + @see http://openid.net/specs/openid-connect-session-1_0.html#RPLogout + */ +@property(nonatomic, readonly, nullable) NSURL *postLogoutRedirectURL; + +/*! @brief Previously issued ID Token passed to the end session endpoint as a hint about the End-User's current authenticated + session with the Client + @remarks id_token_hint + @see http://openid.net/specs/openid-connect-session-1_0.html#RPLogout + */ +@property(nonatomic, readonly, nullable) NSString *idTokenHint; + +/*! @brief An opaque value used by the client to maintain state between the request and callback. + @remarks state + @discussion If this value is not explicitly set, this library will automatically add state and + perform appropriate validation of the state in the authorization response. It is recommended + that the default implementation of this parameter be used wherever possible. Typically used + to prevent CSRF attacks, as recommended in RFC6819 Section 5.3.5. + @see http://openid.net/specs/openid-connect-session-1_0.html#RPLogout + */ +@property(nonatomic, readonly, nullable) NSString *state; + +/*! @brief The client's additional authorization parameters. + @see https://tools.ietf.org/html/rfc6749#section-3.1 + */ +@property(nonatomic, readonly, nullable) NSDictionary *additionalParameters; + +/*! @internal + @brief Unavailable. Please use @c initWithConfiguration:clientId:scopes:redirectURL:additionalParameters:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Creates an authorization request with opinionated defaults (a secure @c state). + @param configuration The service's configuration. + @param idTokenHint The previously issued ID Token + @param postLogoutRedirectURL The client's post-logout redirect URI. + callback. + @param additionalParameters The client's additional authorization parameters. +*/ +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + idTokenHint:(NSString *)idTokenHint + postLogoutRedirectURL:(NSURL *)postLogoutRedirectURL + additionalParameters:(nullable NSDictionary *)additionalParameters; + +/*! @brief Designated initializer. + @param configuration The service's configuration. + @param idTokenHint The previously issued ID Token + @param postLogoutRedirectURL The client's post-logout redirect URI. + @param state An opaque value used by the client to maintain state between the request and + callback. + @param additionalParameters The client's additional authorization parameters. + */ +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + idTokenHint:(NSString *)idTokenHint + postLogoutRedirectURL:(NSURL *)postLogoutRedirectURL + state:(NSString *)state + additionalParameters:(nullable NSDictionary *)additionalParameters + NS_DESIGNATED_INITIALIZER; + +/*! @brief Constructs the request URI by adding the request parameters to the query component of the + authorization endpoint URI using the "application/x-www-form-urlencoded" format. + @return A URL representing the authorization request. + @see http://openid.net/specs/openid-connect-session-1_0.html#RPLogout + */ +- (NSURL *)endSessionRequestURL; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.m new file mode 100644 index 00000000..1e9eb0e2 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.m @@ -0,0 +1,190 @@ +/*! @file OIDEndSessionRequest.m + @brief AppAuth iOS SDK + @copyright + Copyright 2017 The AppAuth Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDEndSessionRequest.h" + +#import "OIDDefines.h" +#import "OIDTokenUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDServiceDiscovery.h" +#import "OIDURLQueryComponent.h" + +/*! @brief The key for the @c configuration property for @c NSSecureCoding + */ +static NSString *const kConfigurationKey = @"configuration"; + +/*! @brief Key used to encode the @c state property for @c NSSecureCoding, and on the URL request. + */ +static NSString *const kStateKey = @"state"; + +/*! @brief Key used to encode the @c postLogoutRedirectURL property for @c NSSecureCoding, and on the URL request. + */ +static NSString *const kPostLogoutRedirectURLKey = @"post_logout_redirect_uri"; + +/*! @brief Key used to encode the @c idTokenHint property for @c NSSecureCoding, and on the URL request. + */ +static NSString *const kIdTokenHintKey = @"id_token_hint"; + +/*! @brief Key used to encode the @c additionalParameters property for @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +/*! @brief Number of random bytes generated for the @state. + */ +static NSUInteger const kStateSizeBytes = 32; + +/*! @brief Assertion text for missing end_session_endpoint. + */ +static NSString *const OIDMissingEndSessionEndpointMessage = +@"The service configuration is missing an end_session_endpoint."; + +@implementation OIDEndSessionRequest + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER( + @selector(initWithConfiguration: + idTokenHint: + postLogoutRedirectURL: + additionalParameters:) + ) + +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + idTokenHint:(NSString *)idTokenHint + postLogoutRedirectURL:(NSURL *)postLogoutRedirectURL + state:(NSString *)state + additionalParameters:(NSDictionary *)additionalParameters +{ + self = [super init]; + if (self) { + _configuration = [configuration copy]; + _idTokenHint = [idTokenHint copy]; + _postLogoutRedirectURL = [postLogoutRedirectURL copy]; + _state = [state copy]; + _additionalParameters = + [[NSDictionary alloc] initWithDictionary:additionalParameters copyItems:YES]; + } + return self; +} + +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + idTokenHint:(NSString *)idTokenHint + postLogoutRedirectURL:(NSURL *)postLogoutRedirectURL + additionalParameters:(NSDictionary *)additionalParameters +{ + return [self initWithConfiguration:configuration + idTokenHint:idTokenHint + postLogoutRedirectURL:postLogoutRedirectURL + state:[[self class] generateState] + additionalParameters:additionalParameters]; +} +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDServiceConfiguration *configuration = [aDecoder decodeObjectOfClass:[OIDServiceConfiguration class] forKey:kConfigurationKey]; + + NSString *idTokenHint = [aDecoder decodeObjectOfClass:[NSString class] forKey:kIdTokenHintKey]; + NSURL *postLogoutRedirectURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:kPostLogoutRedirectURLKey]; + NSString *state = [aDecoder decodeObjectOfClass:[NSString class] forKey:kStateKey]; + NSSet *additionalParameterCodingClasses = [NSSet setWithArray:@[ + [NSDictionary class], + [NSString class] + ]]; + NSDictionary *additionalParameters = [aDecoder decodeObjectOfClasses:additionalParameterCodingClasses + forKey:kAdditionalParametersKey]; + + self = [self initWithConfiguration:configuration + idTokenHint:idTokenHint + postLogoutRedirectURL:postLogoutRedirectURL + state:state + additionalParameters:additionalParameters]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_configuration forKey:kConfigurationKey]; + [aCoder encodeObject:_idTokenHint forKey:kIdTokenHintKey]; + [aCoder encodeObject:_postLogoutRedirectURL forKey:kPostLogoutRedirectURLKey]; + [aCoder encodeObject:_state forKey:kStateKey]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, request: %@>", + NSStringFromClass([self class]), + (void *)self, + self.endSessionRequestURL]; +} + ++ (nullable NSString *)generateState { + return [OIDTokenUtilities randomURLSafeStringWithSize:kStateSizeBytes]; +} + +#pragma mark - OIDExternalUserAgentRequest + +- (NSURL*)externalUserAgentRequestURL { + return [self endSessionRequestURL]; +} + +- (NSString *)redirectScheme { + return [_postLogoutRedirectURL scheme]; +} + +#pragma mark - + +- (NSURL *)endSessionRequestURL { + OIDURLQueryComponent *query = [[OIDURLQueryComponent alloc] init]; + + // Add any additional parameters the client has specified. + [query addParameters:_additionalParameters]; + + // Add optional parameters, as applicable. + if (_idTokenHint) { + [query addParameter:kIdTokenHintKey value:_idTokenHint]; + } + + if (_postLogoutRedirectURL) { + [query addParameter:kPostLogoutRedirectURLKey value:_postLogoutRedirectURL.absoluteString]; + } + + if (_state) { + [query addParameter:kStateKey value:_state]; + } + + NSAssert(_configuration.endSessionEndpoint, OIDMissingEndSessionEndpointMessage); + + // Construct the URL + return [query URLByReplacingQueryInURL:_configuration.endSessionEndpoint]; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.h new file mode 100644 index 00000000..ab69b930 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.h @@ -0,0 +1,64 @@ +/*! @file OIDEndSessionResponse.h + @brief AppAuth iOS SDK + @copyright + Copyright 2017 The AppAuth Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDEndSessionRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents the response to an End Session request. + @see http://openid.net/specs/openid-connect-session-1_0.html#RPLogout + */ + +@interface OIDEndSessionResponse : NSObject + +/*! @brief The request which was serviced. + */ +@property(nonatomic, readonly) OIDEndSessionRequest *request; + +/*! @brief REQUIRED if the "state" parameter was present in the client end-session request. The + exact value received from the client. + @remarks state + */ +@property(nonatomic, readonly, nullable) NSString *state; + +/*! @brief Additional parameters returned from the end session endpoint. + */ +@property(nonatomic, readonly, nullable) + NSDictionary *> *additionalParameters; + +/*! @internal + @brief Unavailable. Please use initWithParameters:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Designated initializer. + @param request The serviced request. + @param parameters The decoded parameters returned from the End Session Endpoint. + @remarks Known parameters are extracted from the @c parameters parameter and the normative + properties are populated. Non-normative parameters are placed in the + @c #additionalParameters dictionary. + */ +- (instancetype)initWithRequest:(OIDEndSessionRequest *)request + parameters:(NSDictionary *> *)parameters + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.m new file mode 100644 index 00000000..bedf0cd9 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.m @@ -0,0 +1,118 @@ +/*! @file OIDEndSessionResponse.m + @brief AppAuth iOS SDK + @copyright + Copyright 2017 The AppAuth Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDEndSessionResponse.h" + +#import "OIDDefines.h" +#import "OIDEndSessionRequest.h" +#import "OIDFieldMapping.h" + +/*! @brief The key for the @c state property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kStateKey = @"state"; + +/*! @brief Key used to encode the @c request property for @c NSSecureCoding + */ +static NSString *const kRequestKey = @"request"; + +/*! @brief Key used to encode the @c additionalParameters property for + @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +@implementation OIDEndSessionResponse + +#pragma mark - Initializers + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithRequest:parameters:)) + +- (instancetype)initWithRequest:(OIDEndSessionRequest *)request + parameters:(NSDictionary *> *)parameters { + self = [super init]; + if (self) { + _request = [request copy]; + NSDictionary *> *additionalParameters = + [OIDFieldMapping remainingParametersWithMap:[[self class] fieldMap] + parameters:parameters + instance:self]; + _additionalParameters = additionalParameters; + } + return self; +} + +/*! @brief Returns a mapping of incoming parameters to instance variables. + @return A mapping of incoming parameters to instance variables. + */ ++ (NSDictionary *)fieldMap { + static NSMutableDictionary *fieldMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + fieldMap = [NSMutableDictionary dictionary]; + fieldMap[kStateKey] = + [[OIDFieldMapping alloc] initWithName:@"_state" type:[NSString class]]; + }); + return fieldMap; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDEndSessionRequest *request = + [aDecoder decodeObjectOfClass:[OIDEndSessionRequest class] forKey:kRequestKey]; + self = [self initWithRequest:request parameters:@{ }]; + if (self) { + [OIDFieldMapping decodeWithCoder:aDecoder map:[[self class] fieldMap] instance:self]; + _additionalParameters = [aDecoder decodeObjectOfClasses:[OIDFieldMapping JSONTypes] + forKey:kAdditionalParametersKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_request forKey:kRequestKey]; + [OIDFieldMapping encodeWithCoder:aCoder map:[[self class] fieldMap] instance:self]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, state: \"%@\", " + "additionalParameters: %@, request: %@>", + NSStringFromClass([self class]), + (void *)self, + _state, + _additionalParameters, + _request]; +} +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDError.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDError.h new file mode 100644 index 00000000..5131f0ad --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDError.h @@ -0,0 +1,393 @@ +/*! @file OIDError.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief The error domain for all NSErrors returned from the AppAuth library. + */ +extern NSString *const OIDGeneralErrorDomain; + +/*! @brief The error domain for OAuth specific errors on the authorization endpoint. + @discussion This error domain is used when the server responds to an authorization request + with an explicit OAuth error, as defined by RFC6749 Section 4.1.2.1. If the authorization + response is invalid and not explicitly an error response, another error domain will be used. + The error response parameter dictionary is available in the + \NSError_userInfo dictionary using the @c ::OIDOAuthErrorResponseErrorKey key. + The \NSError_code will be one of the @c ::OIDErrorCodeOAuthAuthorization enum values. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ +extern NSString *const OIDOAuthAuthorizationErrorDomain; + +/*! @brief The error domain for OAuth specific errors on the token endpoint. + @discussion This error domain is used when the server responds with HTTP 400 and an OAuth error, + as defined RFC6749 Section 5.2. If an HTTP 400 response does not parse as an OAuth error + (i.e. no 'error' field is present or the JSON is invalid), another error domain will be + used. The entire OAuth error response dictionary is available in the \NSError_userInfo + dictionary using the @c ::OIDOAuthErrorResponseErrorKey key. Unlike transient network + errors, errors in this domain invalidate the authentication state, and either indicate a + client error or require user interaction (i.e. reauthentication) to resolve. + The \NSError_code will be one of the @c ::OIDErrorCodeOAuthToken enum values. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +extern NSString *const OIDOAuthTokenErrorDomain; + +/*! @brief The error domain for dynamic client registration errors. + @discussion This error domain is used when the server responds with HTTP 400 and an OAuth error, + as defined in OpenID Connect Dynamic Client Registration 1.0 Section 3.3. If an HTTP 400 + response does not parse as an OAuth error (i.e. no 'error' field is present or the JSON is + invalid), another error domain will be used. The entire OAuth error response dictionary is + available in the \NSError_userInfo dictionary using the @c ::OIDOAuthErrorResponseErrorKey + key. Unlike transient network errors, errors in this domain invalidate the authentication + state, and indicates a client error. + The \NSError_code will be one of the @c ::OIDErrorCodeOAuthToken enum values. + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationError + */ +extern NSString *const OIDOAuthRegistrationErrorDomain; + +/*! @brief The error domain for authorization errors encountered out of band on the resource server. + */ +extern NSString *const OIDResourceServerAuthorizationErrorDomain; + +/*! @brief An error domain representing received HTTP errors. + */ +extern NSString *const OIDHTTPErrorDomain; + +/*! @brief An error key for the original OAuth error response (if any). + */ +extern NSString *const OIDOAuthErrorResponseErrorKey; + +/*! @brief The key of the 'error' response field in a RFC6749 Section 5.2 response. + @remark error + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +extern NSString *const OIDOAuthErrorFieldError; + +/*! @brief The key of the 'error_description' response field in a RFC6749 Section 5.2 response. + @remark error_description + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +extern NSString *const OIDOAuthErrorFieldErrorDescription; + +/*! @brief The key of the 'error_uri' response field in a RFC6749 Section 5.2 response. + @remark error_uri + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +extern NSString *const OIDOAuthErrorFieldErrorURI; + +/*! @brief The various error codes returned from the AppAuth library. + */ +typedef NS_ENUM(NSInteger, OIDErrorCode) { + /*! @brief Indicates a problem parsing an OpenID Connect Service Discovery document. + */ + OIDErrorCodeInvalidDiscoveryDocument = -2, + + /*! @brief Indicates the user manually canceled the OAuth authorization code flow. + */ + OIDErrorCodeUserCanceledAuthorizationFlow = -3, + + /*! @brief Indicates an OAuth authorization flow was programmatically cancelled. + */ + OIDErrorCodeProgramCanceledAuthorizationFlow = -4, + + /*! @brief Indicates a network error or server error occurred. + */ + OIDErrorCodeNetworkError = -5, + + /*! @brief Indicates a server error occurred. + */ + OIDErrorCodeServerError = -6, + + /*! @brief Indicates a problem occurred deserializing the response/JSON. + */ + OIDErrorCodeJSONDeserializationError = -7, + + /*! @brief Indicates a problem occurred constructing the token response from the JSON. + */ + OIDErrorCodeTokenResponseConstructionError = -8, + + /*! @brief @c UIApplication.openURL: returned NO when attempting to open the authorization + request in mobile Safari. + */ + OIDErrorCodeSafariOpenError = -9, + + /*! @brief @c NSWorkspace.openURL returned NO when attempting to open the authorization + request in the default browser. + */ + OIDErrorCodeBrowserOpenError = -10, + + /*! @brief Indicates a problem when trying to refresh the tokens. + */ + OIDErrorCodeTokenRefreshError = -11, + + /*! @brief Indicates a problem occurred constructing the registration response from the JSON. + */ + OIDErrorCodeRegistrationResponseConstructionError = -12, + + /*! @brief Indicates a problem occurred deserializing the response/JSON. + */ + OIDErrorCodeJSONSerializationError = -13, + + /*! @brief The ID Token did not parse. + */ + OIDErrorCodeIDTokenParsingError = -14, + + /*! @brief The ID Token did not pass validation (e.g. issuer, audience checks). + */ + OIDErrorCodeIDTokenFailedValidationError = -15, +}; + +/*! @brief Enum of all possible OAuth error codes as defined by RFC6749 + @discussion Used by @c ::OIDErrorCodeOAuthAuthorization and @c ::OIDErrorCodeOAuthToken + which define endpoint-specific subsets of OAuth codes. Those enum types are down-castable + to this one. + @see https://tools.ietf.org/html/rfc6749#section-11.4 + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +typedef NS_ENUM(NSInteger, OIDErrorCodeOAuth) { + + /*! @remarks invalid_request + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthInvalidRequest = -2, + + /*! @remarks unauthorized_client + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthUnauthorizedClient = -3, + + /*! @remarks access_denied + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAccessDenied = -4, + + /*! @remarks unsupported_response_type + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthUnsupportedResponseType = -5, + + /*! @remarks invalid_scope + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthInvalidScope = -6, + + /*! @remarks server_error + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthServerError = -7, + + /*! @remarks temporarily_unavailable + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthTemporarilyUnavailable = -8, + + /*! @remarks invalid_client + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthInvalidClient = -9, + + /*! @remarks invalid_grant + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthInvalidGrant = -10, + + /*! @remarks unsupported_grant_type + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthUnsupportedGrantType = -11, + + /*! @remarks invalid_redirect_uri + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationError + */ + OIDErrorCodeOAuthInvalidRedirectURI = -12, + + /*! @remarks invalid_client_metadata + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationError + */ + OIDErrorCodeOAuthInvalidClientMetadata = -13, + + /*! @brief An authorization error occurring on the client rather than the server. For example, + due to a state mismatch or misconfiguration. Should be treated as an unrecoverable + authorization error. + */ + OIDErrorCodeOAuthClientError = -0xEFFF, + + /*! @brief An OAuth error not known to this library + @discussion Indicates an OAuth error as per RFC6749, but the error code was not in our + list. It could be a custom error code, or one from an OAuth extension. See the "error" key + of the \NSError_userInfo property. Such errors are assumed to invalidate the + authentication state + */ + OIDErrorCodeOAuthOther = -0xF000, +}; + +/*! @brief The error codes for the @c ::OIDOAuthAuthorizationErrorDomain error domain + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ +typedef NS_ENUM(NSInteger, OIDErrorCodeOAuthAuthorization) { + /*! @remarks invalid_request + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationInvalidRequest = OIDErrorCodeOAuthInvalidRequest, + + /*! @remarks unauthorized_client + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationUnauthorizedClient = OIDErrorCodeOAuthUnauthorizedClient, + + /*! @remarks access_denied + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationAccessDenied = + OIDErrorCodeOAuthAccessDenied, + + /*! @remarks unsupported_response_type + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationUnsupportedResponseType = + OIDErrorCodeOAuthUnsupportedResponseType, + + /*! @brief Indicates a network error or server error occurred. + @remarks invalid_scope + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationAuthorizationInvalidScope = OIDErrorCodeOAuthInvalidScope, + + /*! @brief Indicates a server error occurred. + @remarks server_error + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationServerError = OIDErrorCodeOAuthServerError, + + /*! @remarks temporarily_unavailable + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationTemporarilyUnavailable = OIDErrorCodeOAuthTemporarilyUnavailable, + + /*! @brief An authorization error occurring on the client rather than the server. For example, + due to a state mismatch or client misconfiguration. Should be treated as an unrecoverable + authorization error. + */ + OIDErrorCodeOAuthAuthorizationClientError = OIDErrorCodeOAuthClientError, + + /*! @brief An authorization OAuth error not known to this library + @discussion this indicates an OAuth error as per RFC6749, but the error code was not in our + list. It could be a custom error code, or one from an OAuth extension. See the "error" key + of the \NSError_userInfo property. We assume such errors are not transient. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationOther = OIDErrorCodeOAuthOther, +}; + + +/*! @brief The error codes for the @c ::OIDOAuthTokenErrorDomain error domain + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +typedef NS_ENUM(NSInteger, OIDErrorCodeOAuthToken) { + /*! @remarks invalid_request + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenInvalidRequest = OIDErrorCodeOAuthInvalidRequest, + + /*! @remarks invalid_client + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenInvalidClient = OIDErrorCodeOAuthInvalidClient, + + /*! @remarks invalid_grant + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenInvalidGrant = OIDErrorCodeOAuthInvalidGrant, + + /*! @remarks unauthorized_client + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenUnauthorizedClient = OIDErrorCodeOAuthUnauthorizedClient, + + /*! @remarks unsupported_grant_type + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenUnsupportedGrantType = OIDErrorCodeOAuthUnsupportedGrantType, + + /*! @remarks invalid_scope + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenInvalidScope = OIDErrorCodeOAuthInvalidScope, + + /*! @brief An unrecoverable token error occurring on the client rather than the server. + */ + OIDErrorCodeOAuthTokenClientError = OIDErrorCodeOAuthClientError, + + /*! @brief A token endpoint OAuth error not known to this library + @discussion this indicates an OAuth error as per RFC6749, but the error code was not in our + list. It could be a custom error code, or one from an OAuth extension. See the "error" key + of the \NSError_userInfo property. We assume such errors are not transient. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenOther = OIDErrorCodeOAuthOther, +}; + +/*! @brief The error codes for the @c ::OIDOAuthRegistrationErrorDomain error domain + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationError + */ +typedef NS_ENUM(NSInteger, OIDErrorCodeOAuthRegistration) { + /*! @remarks invalid_request + @see http://tools.ietf.org/html/rfc6750#section-3.1 + */ + OIDErrorCodeOAuthRegistrationInvalidRequest = OIDErrorCodeOAuthInvalidRequest, + + /*! @remarks invalid_redirect_uri + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationError + */ + OIDErrorCodeOAuthRegistrationInvalidRedirectURI = OIDErrorCodeOAuthInvalidRedirectURI, + + /*! @remarks invalid_client_metadata + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationError + */ + OIDErrorCodeOAuthRegistrationInvalidClientMetadata = OIDErrorCodeOAuthInvalidClientMetadata, + + /*! @brief An unrecoverable token error occurring on the client rather than the server. + */ + OIDErrorCodeOAuthRegistrationClientError = OIDErrorCodeOAuthClientError, + + /*! @brief A registration endpoint OAuth error not known to this library + @discussion this indicates an OAuth error, but the error code was not in our + list. It could be a custom error code, or one from an OAuth extension. See the "error" key + of the \NSError_userInfo property. We assume such errors are not transient. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthRegistrationOther = OIDErrorCodeOAuthOther, +}; + + +/*! @brief The exception text for the exception which occurs when a + @c OIDExternalUserAgentSession receives a message after it has already completed. + */ +extern NSString *const OIDOAuthExceptionInvalidAuthorizationFlow; + +/*! @brief The text for the exception which occurs when a Token Request is constructed + with a null redirectURL for a grant_type that requires a nonnull Redirect + */ +extern NSString *const OIDOAuthExceptionInvalidTokenRequestNullRedirectURL; + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDError.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDError.m new file mode 100644 index 00000000..87c8623e --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDError.m @@ -0,0 +1,45 @@ +/*! @file OIDError.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDError.h" + +NSString *const OIDGeneralErrorDomain = @"org.openid.appauth.general"; + +NSString *const OIDOAuthTokenErrorDomain = @"org.openid.appauth.oauth_token"; + +NSString *const OIDOAuthAuthorizationErrorDomain = @"org.openid.appauth.oauth_authorization"; + +NSString *const OIDOAuthRegistrationErrorDomain = @"org.openid.appauth.oauth_registration"; + +NSString *const OIDResourceServerAuthorizationErrorDomain = @"org.openid.appauth.resourceserver"; + +NSString *const OIDHTTPErrorDomain = @"org.openid.appauth.remote-http"; + +NSString *const OIDOAuthExceptionInvalidAuthorizationFlow = @"An OAuth redirect was sent to a " + "OIDExternalUserAgentSession after it already completed."; + +NSString *const OIDOAuthExceptionInvalidTokenRequestNullRedirectURL = @"A OIDTokenRequest was " + "created with a grant_type that requires a redirectURL, but a null redirectURL was given"; + +NSString *const OIDOAuthErrorResponseErrorKey = @"OIDOAuthErrorResponseErrorKey"; + +NSString *const OIDOAuthErrorFieldError = @"error"; + +NSString *const OIDOAuthErrorFieldErrorDescription = @"error_description"; + +NSString *const OIDOAuthErrorFieldErrorURI = @"error_uri"; diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.h new file mode 100644 index 00000000..3380f6fe --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.h @@ -0,0 +1,107 @@ +/*! @file OIDErrorUtilities.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +#import "OIDError.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Convenience methods for creating standardized \NSError instances. + */ +@interface OIDErrorUtilities : NSObject + +/*! @brief Creates a standard \NSError from an @c ::OIDErrorCode and custom user info. + Automatically populates the localized error description. + @param code The error code. + @param underlyingError The underlying error which occurred, if applicable. + @param description A custom description, if applicable. + @return An \NSError representing the error code. + */ ++ (NSError *)errorWithCode:(OIDErrorCode)code + underlyingError:(nullable NSError *)underlyingError + description:(nullable NSString *)description; + +/*! @brief Creates a standard \NSError from an @c ::OIDErrorCode and custom user info. + Automatically populates the localized error description. + @param OAuthErrorDomain The OAuth error domain. Must be @c ::OIDOAuthAuthorizationErrorDomain or + @c ::OIDOAuthTokenErrorDomain. + @param errorResponse The dictionary from an OAuth error response (as per RFC6749 Section 5.2). + @param underlyingError The underlying error which occurred, if applicable. + @return An \NSError representing the OAuth error. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ ++ (NSError *)OAuthErrorWithDomain:(NSString *)OAuthErrorDomain + OAuthResponse:(NSDictionary *)errorResponse + underlyingError:(nullable NSError *)underlyingError; + +/*! @brief Creates a \NSError indicating that the resource server responded with an authorization + error. + @param code Your error code. + @param errorResponse The resource server error response, if any. + @param underlyingError The underlying error which occurred, if applicable. + @return An \NSError representing the authorization error from the resource server. + */ ++ (NSError *)resourceServerAuthorizationErrorWithCode:(NSInteger)code + errorResponse:(nullable NSDictionary *)errorResponse + underlyingError:(nullable NSError *)underlyingError; + + +/*! @brief Creates a standard \NSError from an \NSHTTPURLResponse. Automatically + populates the localized error description with the response data associated with the + \NSHTTPURLResponse, if available. + @param HTTPURLResponse The response which indicates an error occurred. + @param data The response data associated with the response which should be converted to an + @c NSString assuming a UTF-8 encoding, if available. + @return An \NSError representing the error. + */ ++ (NSError *)HTTPErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPURLResponse + data:(nullable NSData *)data; + +/*! @brief Raises an exception with the given name as both the name, and the message. + @param name The name of the exception. + */ ++ (void)raiseException:(NSString *)name; + +/*! @brief Raises an exception with the given name and message. + @param name The name of the exception. + @param message The message of the exception. + */ ++ (void)raiseException:(NSString *)name message:(NSString *)message; + +/*! @brief Converts an OAuth error code into an @c ::OIDErrorCodeOAuth error code. + @param errorCode The OAuth error code. + @discussion Returns @c ::OIDErrorCodeOAuthOther if the string is not in AppAuth's list. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ ++ (OIDErrorCodeOAuth)OAuthErrorCodeFromString:(NSString *)errorCode; + +/*! @brief Returns true if the given error domain is an OAuth error domain. + @param errorDomain The error domain to test. + @discussion An OAuth error domain is used for errors returned per RFC6749 sections 4.1.2.1 and + 5.2. Other errors, such as network errors can also occur but they will not have an OAuth + error domain. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ ++ (BOOL)isOAuthErrorDomain:(NSString*)errorDomain; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.m new file mode 100644 index 00000000..3b3c0607 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.m @@ -0,0 +1,172 @@ +/*! @file OIDErrorUtilities.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDErrorUtilities.h" + +@implementation OIDErrorUtilities + ++ (NSError *)errorWithCode:(OIDErrorCode)code + underlyingError:(NSError *)underlyingError + description:(NSString *)description { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + if (description) { + userInfo[NSLocalizedDescriptionKey] = description; + } + // TODO: Populate localized description based on code. + NSError *error = [NSError errorWithDomain:OIDGeneralErrorDomain + code:code + userInfo:userInfo]; + return error; +} + ++ (BOOL)isOAuthErrorDomain:(NSString *)errorDomain { + return errorDomain == OIDOAuthRegistrationErrorDomain + || errorDomain == OIDOAuthAuthorizationErrorDomain + || errorDomain == OIDOAuthTokenErrorDomain; +} + ++ (NSError *)resourceServerAuthorizationErrorWithCode:(NSInteger)code + errorResponse:(nullable NSDictionary *)errorResponse + underlyingError:(nullable NSError *)underlyingError { + // builds the userInfo dictionary with the full OAuth response and other information + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (errorResponse) { + userInfo[OIDOAuthErrorResponseErrorKey] = errorResponse; + } + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + NSError *error = [NSError errorWithDomain:OIDResourceServerAuthorizationErrorDomain + code:code + userInfo:userInfo]; + return error; +} + ++ (NSError *)OAuthErrorWithDomain:(NSString *)oAuthErrorDomain + OAuthResponse:(NSDictionary *)errorResponse + underlyingError:(NSError *)underlyingError { + // not a valid OAuth error + if (![self isOAuthErrorDomain:oAuthErrorDomain] + || !errorResponse + || !errorResponse[OIDOAuthErrorFieldError] + || ![errorResponse[OIDOAuthErrorFieldError] isKindOfClass:[NSString class]]) { + return [[self class] errorWithCode:OIDErrorCodeNetworkError + underlyingError:underlyingError + description:underlyingError.localizedDescription]; + } + + // builds the userInfo dictionary with the full OAuth response and other information + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[OIDOAuthErrorResponseErrorKey] = errorResponse; + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + + NSString *oauthErrorCodeString = errorResponse[OIDOAuthErrorFieldError]; + NSString *oauthErrorMessage = nil; + if ([errorResponse[OIDOAuthErrorFieldErrorDescription] isKindOfClass:[NSString class]]) { + oauthErrorMessage = errorResponse[OIDOAuthErrorFieldErrorDescription]; + } else { + oauthErrorMessage = [errorResponse[OIDOAuthErrorFieldErrorDescription] description]; + } + NSString *oauthErrorURI = nil; + if ([errorResponse[OIDOAuthErrorFieldErrorURI] isKindOfClass:[NSString class]]) { + oauthErrorURI = errorResponse[OIDOAuthErrorFieldErrorURI]; + } else { + oauthErrorURI = [errorResponse[OIDOAuthErrorFieldErrorURI] description]; + } + + // builds the error description, using the information supplied by the server if possible + NSMutableString *description = [NSMutableString string]; + [description appendString:oauthErrorCodeString]; + if (oauthErrorMessage) { + [description appendString:@": "]; + [description appendString:oauthErrorMessage]; + } + if (oauthErrorURI) { + if ([description length] > 0) { + [description appendString:@" - "]; + } + [description appendString:oauthErrorURI]; + } + if ([description length] == 0) { + // backup description + [description appendFormat:@"OAuth error: %@ - https://tools.ietf.org/html/rfc6749#section-5.2", + oauthErrorCodeString]; + } + userInfo[NSLocalizedDescriptionKey] = description; + + // looks up the error code based on the "error" response param + OIDErrorCodeOAuth code = [[self class] OAuthErrorCodeFromString:oauthErrorCodeString]; + + NSError *error = [NSError errorWithDomain:oAuthErrorDomain + code:code + userInfo:userInfo]; + return error; +} + ++ (NSError *)HTTPErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPURLResponse + data:(nullable NSData *)data { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (data) { + NSString *serverResponse = + [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + if (serverResponse) { + userInfo[NSLocalizedDescriptionKey] = serverResponse; + } + } + NSError *serverError = + [NSError errorWithDomain:OIDHTTPErrorDomain + code:HTTPURLResponse.statusCode + userInfo:userInfo]; + return serverError; +} + ++ (OIDErrorCodeOAuth)OAuthErrorCodeFromString:(NSString *)errorCode { + NSDictionary *errorCodes = @{ + @"invalid_request": @(OIDErrorCodeOAuthInvalidRequest), + @"unauthorized_client": @(OIDErrorCodeOAuthUnauthorizedClient), + @"access_denied": @(OIDErrorCodeOAuthAccessDenied), + @"unsupported_response_type": @(OIDErrorCodeOAuthUnsupportedResponseType), + @"invalid_scope": @(OIDErrorCodeOAuthInvalidScope), + @"server_error": @(OIDErrorCodeOAuthServerError), + @"temporarily_unavailable": @(OIDErrorCodeOAuthTemporarilyUnavailable), + @"invalid_client": @(OIDErrorCodeOAuthInvalidClient), + @"invalid_grant": @(OIDErrorCodeOAuthInvalidGrant), + @"unsupported_grant_type": @(OIDErrorCodeOAuthUnsupportedGrantType), + }; + NSNumber *code = errorCodes[errorCode]; + if (code) { + return [code integerValue]; + } else { + return OIDErrorCodeOAuthOther; + } +} + ++ (void)raiseException:(NSString *)name { + [[self class] raiseException:name message:name]; +} + ++ (void)raiseException:(NSString *)name message:(NSString *)message { + [NSException raise:name format:@"%@", message]; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgent.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgent.h new file mode 100644 index 00000000..c4eb0a90 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgent.h @@ -0,0 +1,53 @@ +/*! @file OIDExternalUserAgent.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@protocol OIDExternalUserAgentSession; +@protocol OIDExternalUserAgentRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @protocol OIDExternalUserAgent + @brief An external user-agent UI that presents displays the request to the user. Clients may + provide custom implementations of an external user-agent to customize the way the requests + are presented to the end user. + */ +@protocol OIDExternalUserAgent + +/*! @brief Presents the request in the external user-agent. + @param request The request to be presented in the external user-agent. + @param session The @c OIDExternalUserAgentSession instance that initiates presenting the UI. + Concrete implementations of a @c OIDExternalUserAgent may call + resumeExternalUserAgentFlowWithURL or failExternalUserAgentFlowWithError on session to either + resume or fail the request. + @return YES If the request UI was successfully presented to the user. + */ +- (BOOL)presentExternalUserAgentRequest:(id )request + session:(id)session; + +/*! @brief Dimisses the external user-agent and calls completion when the dismiss operation ends. + @param animated Whether or not the dismiss operation should be animated. + @remarks Has no effect if no UI is presented. + @param completion The block to be called when the dismiss operations ends + */ +- (void)dismissExternalUserAgentAnimated:(BOOL)animated completion:(void (^)(void))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentRequest.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentRequest.h new file mode 100644 index 00000000..8ea40cb6 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentRequest.h @@ -0,0 +1,37 @@ +/*! @file OIDExternalUserAgent.h + @brief AppAuth iOS SDK + @copyright + Copyright 2017 The AppAuth Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +/*! @protocol OIDExternalUserAgent + @brief An interface that any external user-agent request may implement to use the + @c OIDExternalUserAgent flow. + */ +@protocol OIDExternalUserAgentRequest + +/*! @brief Method to create and return the complete request URL instance. + @return A @c NSURL instance which contains the URL to be opened in an external UI (i.e. browser) + */ +- (NSURL*)externalUserAgentRequestURL; + +/*! @brief If this external user-agent request has a redirect URL, this should return its scheme. + Since some external requests have optional callbacks (such as the end session endpoint), the + return value of this method is nullable. + @return A @c NSString instance that contains the scheme of a callback url, or nil if there is + no callback url for this request. + */ +- (NSString*)redirectScheme; +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentSession.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentSession.h new file mode 100644 index 00000000..3b886a6c --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentSession.h @@ -0,0 +1,65 @@ +/*! @file OIDExternalUserAgentSession.h + @brief AppAuth iOS SDK + @copyright + Copyright 2017 The AppAuth Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents an in-flight external user-agent session. + */ +@protocol OIDExternalUserAgentSession + +/*! @brief Cancels the code flow session, invoking the request's callback with a cancelled error. + @remarks Has no effect if called more than once, or after a + @c OIDExternalUserAgentSession.resumeExternalUserAgentFlowWithURL: message was received. + Will cause an error with code: @c ::OIDErrorCodeProgramCanceledAuthorizationFlow to be + passed to the @c callback block passed to + @c OIDAuthorizationService.presentAuthorizationRequest:presentingViewController:callback: + */ +- (void)cancel; + +/*! @brief Cancels the code flow session, invoking the request's callback with a cancelled error. + @remarks Has no effect if called more than once, or after a + @c OIDExternalUserAgentSession.resumeExternalUserAgentFlowWithURL: message was received. + Will cause an error with code: @c ::OIDErrorCodeProgramCanceledAuthorizationFlow to be + passed to the @c callback block passed to + @c OIDAuthorizationService.presentAuthorizationRequest:presentingViewController:callback: + @param completion The block to be called when the cancel operation ends + */ +- (void)cancelWithCompletion:(nullable void (^)(void))completion; + +/*! @brief Clients should call this method with the result of the external user-agent code flow if + it becomes available. + @param URL The redirect URL invoked by the server. + @discussion When the URL represented a valid response, implementations should clean up any + left-over UI state from the request, for example by closing the + \SFSafariViewController or loopback HTTP listener if those were used. The completion block + of the pending request should then be invoked. + @remarks Has no effect if called more than once, or after a @c cancel message was received. + @return YES if the passed URL matches the expected redirect URL and was consumed, NO otherwise. + */ +- (BOOL)resumeExternalUserAgentFlowWithURL:(NSURL *)URL; + +/*! @brief @c OIDExternalUserAgent or clients should call this method when the + external user-agent flow failed with a non-OAuth error. + @param error The error that is the reason for the failure of this external flow. + @remarks Has no effect if called more than once, or after a @c cancel message was received. + */ +- (void)failExternalUserAgentFlowWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.h new file mode 100644 index 00000000..f0a56fef --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.h @@ -0,0 +1,126 @@ +/*! @file OIDFieldMapping.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents a function which transforms incoming source values into instance variable + values. + */ +typedef _Nullable id(^OIDFieldMappingConversionFunction)(NSObject *_Nullable value); + +/*! @brief Describes the mapping of a key/value pair to an iVar with an optional conversion + function. + */ +@interface OIDFieldMapping : NSObject + +/*! @brief The name of the instance variable the field should be mapped to. + */ +@property(nonatomic, readonly) NSString *name; + +/*! @brief The type of the instance variable. + */ +@property(nonatomic, readonly) Class expectedType; + +/*! @brief An optional conversion function which specifies a transform from the incoming data to the + instance variable value. + */ +@property(nonatomic, readonly, nullable) OIDFieldMappingConversionFunction conversion; + +/*! @internal + @brief Unavailable. Please use initWithName:type:conversion:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief The designated initializer. + @param name The name of the instance variable the field should be mapped to. + @param type The type of the instance variable. + @param conversion An optional conversion function which specifies a transform from the incoming + data to the instance variable value. Used during the process performed by + @c OIDFieldMapping.remainingParametersWithMap:parameters:instance: but not during + encoding/decoding, since the encoded and decoded values should already be of the type + specified by the @c type parameter. + */ +- (instancetype)initWithName:(NSString *)name + type:(Class)type + conversion:(nullable OIDFieldMappingConversionFunction)conversion + NS_DESIGNATED_INITIALIZER; + +/*! @brief A convenience initializer. + @param name The name of the instance variable the field should be mapped to. + @param type The type of the instance variable. + */ +- (instancetype)initWithName:(NSString *)name + type:(Class)type; + +/*! @brief Performs a mapping of key/value pairs in an incoming parameters dictionary to instance + variables, returning a dictionary of parameter key/values which didn't map to instance + variables. + @param map A mapping of incoming keys to instance variables. + @param parameters Incoming key value pairs to map to an instance's variables. + @param instance The instance whose variables should be set based on the mapping. + @return A dictionary of parameter key/values which didn't map to instance variables. + */ ++ (NSDictionary *> *)remainingParametersWithMap: + (NSDictionary *)map + parameters:(NSDictionary *> *)parameters + instance:(id)instance; + +/*! @brief This helper method for @c NSCoding implementations performs a serialization of fields + defined in a field mapping. + @param aCoder An @c NSCoder instance to serialize instance variable values to. + @param map A mapping of keys to instance variables. + @param instance The instance whose variables should be serialized based on the mapping. + */ ++ (void)encodeWithCoder:(NSCoder *)aCoder + map:(NSDictionary *)map + instance:(id)instance; + +/*! @brief This helper method for @c NSCoding implementations performs a deserialization of + fields defined in a field mapping. + @param aCoder An @c NSCoder instance from which to deserialize instance variable values from. + @param map A mapping of keys to instance variables. + @param instance The instance whose variables should be deserialized based on the mapping. + */ ++ (void)decodeWithCoder:(NSCoder *)aCoder + map:(NSDictionary *)map + instance:(id)instance; + +/*! @brief Returns an @c NSSet of classes suitable for deserializing JSON content in an + @c NSSecureCoding context. + */ ++ (NSSet *)JSONTypes; + +/*! @brief Returns a function for converting an @c NSString to an @c NSURL. + */ ++ (OIDFieldMappingConversionFunction)URLConversion; + +/*! @brief Returns a function for converting an @c NSNumber number of seconds from now to an + @c NSDate. + */ ++ (OIDFieldMappingConversionFunction)dateSinceNowConversion; + +/*! @brief Returns a function for converting an @c NSNumber representing a unix time stamp to an + @c NSDate. + */ ++ (OIDFieldMappingConversionFunction)dateEpochConversion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.m new file mode 100644 index 00000000..f8436560 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.m @@ -0,0 +1,132 @@ +/*! @file OIDFieldMapping.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDFieldMapping.h" + +#import "OIDDefines.h" + +@implementation OIDFieldMapping + +- (nonnull instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithName:type:conversion:)) + +- (instancetype)initWithName:(NSString *)name + type:(Class)type { + return [self initWithName:name type:type conversion:nil]; +} + +- (instancetype)initWithName:(NSString *)name + type:(Class)type + conversion:(nullable OIDFieldMappingConversionFunction)conversion { + self = [super init]; + if (self) { + _name = [name copy]; + _expectedType = type; + _conversion = conversion; + } + return self; +} + ++ (NSDictionary *> *)remainingParametersWithMap: + (NSDictionary *)map + parameters:(NSDictionary *> *)parameters + instance:(id)instance { + NSMutableDictionary *additionalParameters = [NSMutableDictionary dictionary]; + for (NSString *key in parameters) { + NSObject *value = [parameters[key] copy]; + OIDFieldMapping *mapping = map[key]; + // If the field doesn't appear in the mapping, we add it to the additional parameters + // dictionary. + if (!mapping) { + additionalParameters[key] = value; + continue; + } + // If the field mapping specifies a conversion function, apply the conversion to the value. + if (mapping.conversion) { + value = mapping.conversion(value); + } + // Check the type of the value and make sure it matches the type we expected. If it doesn't we + // add the value to the additional parameters dictionary but don't assign the instance variable. + if (![value isKindOfClass:mapping.expectedType]) { + additionalParameters[key] = value; + continue; + } + // Assign the instance variable. + [instance setValue:value forKey:mapping.name]; + } + return additionalParameters; +} + ++ (void)encodeWithCoder:(NSCoder *)aCoder + map:(NSDictionary *)map + instance:(id)instance { + for (NSString *key in map) { + id value = [instance valueForKey:map[key].name]; + [aCoder encodeObject:value forKey:key]; + } +} + ++ (void)decodeWithCoder:(NSCoder *)aCoder + map:(NSDictionary *)map + instance:(id)instance { + for (NSString *key in map) { + OIDFieldMapping *mapping = map[key]; + id value = [aCoder decodeObjectOfClass:mapping.expectedType forKey:key]; + [instance setValue:value forKey:mapping.name]; + } +} + ++ (NSSet *)JSONTypes { + return [NSSet setWithArray:@[ + [NSDictionary class], + [NSArray class], + [NSString class], + [NSNumber class] + ]]; +} + ++ (OIDFieldMappingConversionFunction)URLConversion { + return ^id _Nullable(NSObject *_Nullable value) { + if ([value isKindOfClass:[NSString class]]) { + return [NSURL URLWithString:(NSString *)value]; + } + return value; + }; +} + ++ (OIDFieldMappingConversionFunction)dateSinceNowConversion { + return ^id _Nullable(NSObject *_Nullable value) { + if (![value isKindOfClass:[NSNumber class]]) { + return value; + } + NSNumber *valueAsNumber = (NSNumber *)value; + return [NSDate dateWithTimeIntervalSinceNow:[valueAsNumber longLongValue]]; + }; +} + ++ (OIDFieldMappingConversionFunction)dateEpochConversion { + return ^id _Nullable(NSObject *_Nullable value) { + if (![value isKindOfClass:[NSNumber class]]) { + return value; + } + NSNumber *valueAsNumber = (NSNumber *) value; + return [NSDate dateWithTimeIntervalSince1970:[valueAsNumber longLongValue]]; + }; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.h new file mode 100644 index 00000000..6e650047 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.h @@ -0,0 +1,40 @@ +/*! @file OIDGrantTypes.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +/*! @brief For exchanging an authorization code for an access token. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +extern NSString *const OIDGrantTypeAuthorizationCode; + +/*! @brief For refreshing an access token with a refresh token. + @see https://tools.ietf.org/html/rfc6749#section-6 + */ +extern NSString *const OIDGrantTypeRefreshToken; + +/*! @brief For obtaining an access token with a username and password. + @see https://tools.ietf.org/html/rfc6749#section-4.3.2 + */ +extern NSString *const OIDGrantTypePassword; + +/*! @brief For obtaining an access token from the token endpoint using client credentials. + @see https://tools.ietf.org/html/rfc6749#section-3.2.1 + @see https://tools.ietf.org/html/rfc6749#section-4.4.2 + */ +extern NSString *const OIDGrantTypeClientCredentials; diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.m new file mode 100644 index 00000000..2b193437 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.m @@ -0,0 +1,27 @@ +/*! @file OIDGrantTypes.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDGrantTypes.h" + +NSString *const OIDGrantTypeAuthorizationCode = @"authorization_code"; + +NSString *const OIDGrantTypeRefreshToken = @"refresh_token"; + +NSString *const OIDGrantTypePassword = @"password"; + +NSString *const OIDGrantTypeClientCredentials = @"client_credentials"; diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.h new file mode 100644 index 00000000..6fe84d7f --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.h @@ -0,0 +1,91 @@ +/*! @file OIDIDToken.h + @brief AppAuth iOS SDK + @copyright + Copyright 2017 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief A convenience class that parses an ID Token and extracts the claims _but does not_ + verify its signature. AppAuth only supports the OpenID Code flow, meaning ID Tokens + received by AppAuth are sent from the token endpoint on a TLS protected channel, + offering some assurances as to the origin of the token. You may wish to additionally + verify the ID Token signature using a JWT signature verification library of your + choosing. + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + @see https://tools.ietf.org/html/rfc7519 + @see https://jwt.io/ + */ +@interface OIDIDToken : NSObject + +/*! @internal + @brief Unavailable. Please use @c initWithAuthorizationResponse:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Parses the given ID Token string. + @param idToken The ID Token spring. + */ +- (nullable instancetype)initWithIDTokenString:(NSString *)idToken; + +/*! @brief The header JWT values. + */ +@property(nonatomic, readonly) NSDictionary *header; + +/*! @brief All ID Token claims. + */ +@property(nonatomic, readonly) NSDictionary *claims; + +/*! @brief Issuer Identifier for the Issuer of the response. + @remarks iss + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + */ +@property(nonatomic, readonly) NSURL *issuer; + +/*! @brief Subject Identifier. + @remarks sub + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + */ +@property(nonatomic, readonly) NSString *subject; + +/*! @brief Audience(s) that this ID Token is intended for. + @remarks aud + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + */ +@property(nonatomic, readonly) NSArray *audience; + +/*! @brief Expiration time on or after which the ID Token MUST NOT be accepted for processing. + @remarks exp + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + */ +@property(nonatomic, readonly) NSDate *expiresAt; + +/*! @brief Time at which the JWT was issued. + @remarks iat + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + */ +@property(nonatomic, readonly) NSDate *issuedAt; + +/*! @brief String value used to associate a Client session with an ID Token, and to mitigate replay + attacks. + @remarks nonce + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + */ +@property(nonatomic, readonly, nullable) NSString *nonce; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.m new file mode 100644 index 00000000..57a7324e --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.m @@ -0,0 +1,149 @@ +/*! @file OIDIDToken.m + @brief AppAuth iOS SDK + @copyright + Copyright 2017 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDIDToken.h" + +/*! Field keys associated with an ID Token. */ +static NSString *const kIssKey = @"iss"; +static NSString *const kSubKey = @"sub"; +static NSString *const kAudKey = @"aud"; +static NSString *const kExpKey = @"exp"; +static NSString *const kIatKey = @"iat"; +static NSString *const kNonceKey = @"nonce"; + +#import "OIDFieldMapping.h" + +@implementation OIDIDToken + +- (instancetype)initWithIDTokenString:(NSString *)idToken { + self = [super init]; + NSArray *sections = [idToken componentsSeparatedByString:@"."]; + + // The header and claims sections are required. + if (sections.count <= 1) { + return nil; + } + + _header = [[self class] parseJWTSection:sections[0]]; + _claims = [[self class] parseJWTSection:sections[1]]; + if (!_header || !_claims) { + return nil; + } + + [OIDFieldMapping remainingParametersWithMap:[[self class] fieldMap] + parameters:_claims + instance:self]; + + // Required fields. + if (!_issuer || !_audience || !_subject || !_expiresAt || !_issuedAt) { + return nil; + } + + return self; +} + +/*! @brief Returns a mapping of incoming parameters to instance variables. + @return A mapping of incoming parameters to instance variables. + */ ++ (NSDictionary *)fieldMap { + static NSMutableDictionary *fieldMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + fieldMap = [NSMutableDictionary dictionary]; + + fieldMap[kIssKey] = + [[OIDFieldMapping alloc] initWithName:@"_issuer" + type:[NSURL class] + conversion:[OIDFieldMapping URLConversion]]; + fieldMap[kSubKey] = + [[OIDFieldMapping alloc] initWithName:@"_subject" type:[NSString class]]; + fieldMap[kAudKey] = + [[OIDFieldMapping alloc] initWithName:@"_audience" + type:[NSArray class] + conversion:^id _Nullable(NSObject *_Nullable value) { + if ([value isKindOfClass:[NSArray class]]) { + return value; + } + if ([value isKindOfClass:[NSString class]]) { + return @[value]; + } + return nil; + }]; + fieldMap[kExpKey] = + [[OIDFieldMapping alloc] initWithName:@"_expiresAt" + type:[NSDate class] + conversion:^id _Nullable(NSObject *_Nullable value) { + if (![value isKindOfClass:[NSNumber class]]) { + return value; + } + NSNumber *valueAsNumber = (NSNumber *)value; + return [NSDate dateWithTimeIntervalSince1970:valueAsNumber.longLongValue]; + }]; + fieldMap[kIatKey] = + [[OIDFieldMapping alloc] initWithName:@"_issuedAt" + type:[NSDate class] + conversion:^id _Nullable(NSObject *_Nullable value) { + if (![value isKindOfClass:[NSNumber class]]) { + return value; + } + NSNumber *valueAsNumber = (NSNumber *)value; + return [NSDate dateWithTimeIntervalSince1970:valueAsNumber.longLongValue]; + }]; + fieldMap[kNonceKey] = + [[OIDFieldMapping alloc] initWithName:@"_nonce" type:[NSString class]]; + }); + return fieldMap; +} + ++ (NSDictionary *)parseJWTSection:(NSString *)sectionString { + NSData *decodedData = [[self class] base64urlNoPaddingDecode:sectionString]; + + // Parses JSON. + NSError *error; + id object = [NSJSONSerialization JSONObjectWithData:decodedData options:0 error:&error]; + if (error) { + NSLog(@"Error %@ parsing token payload %@", error, sectionString); + } + if ([object isKindOfClass:[NSDictionary class]]) { + return (NSDictionary *)object; + } + + return nil; +} + ++ (NSData *)base64urlNoPaddingDecode:(NSString *)base64urlNoPaddingString { + NSMutableString *body = [base64urlNoPaddingString mutableCopy]; + + // Converts base64url to base64. + NSRange range = NSMakeRange(0, base64urlNoPaddingString.length); + [body replaceOccurrencesOfString:@"-" withString:@"+" options:NSLiteralSearch range:range]; + [body replaceOccurrencesOfString:@"_" withString:@"/" options:NSLiteralSearch range:range]; + + // Converts base64 no padding to base64 with padding + while (body.length % 4 != 0) { + [body appendString:@"="]; + } + + // Decodes base64 string. + NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:body options:0]; + return decodedData; +} + +@end + + diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.h new file mode 100644 index 00000000..e509c60a --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.h @@ -0,0 +1,141 @@ +/*! @file OIDRegistrationRequest.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 The AppAuth for iOS Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDAuthorizationResponse; +@class OIDServiceConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents a registration request. + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationRequest + */ +@interface OIDRegistrationRequest : NSObject + +/*! @brief The service's configuration. + @remarks This configuration specifies how to connect to a particular OAuth provider. + Configurations may be created manually, or via an OpenID Connect Discovery Document. + */ +@property(nonatomic, readonly) OIDServiceConfiguration *configuration; + +/*! @brief The initial access token to access the Client Registration Endpoint + (if required by the OpenID Provider). + @remarks OAuth 2.0 Access Token optionally issued by an Authorization Server granting + access to its Client Registration Endpoint. This token (if required) is + provisioned out of band. + @see Section 3 of OpenID Connect Dynamic Client Registration 1.0 + https://openid.net/specs/openid-connect-registration-1_0.html#ClientRegistration + */ +@property(nonatomic, readonly) NSString *initialAccessToken; + +/*! @brief The application type to register, will always be 'native'. + @remarks application_type + @see https://openid.net/specs/openid-connect-registration-1_0.html#ClientMetadata + */ +@property(nonatomic, readonly) NSString *applicationType; + +/*! @brief The client's redirect URI's. + @remarks redirect_uris + @see https://tools.ietf.org/html/rfc6749#section-3.1.2 + */ +@property(nonatomic, readonly) NSArray *redirectURIs; + +/*! @brief The response types to register for usage by this client. + @remarks response_types + @see http://openid.net/specs/openid-connect-core-1_0.html#Authentication + */ +@property(nonatomic, readonly, nullable) NSArray *responseTypes; + +/*! @brief The grant types to register for usage by this client. + @remarks grant_types + @see https://openid.net/specs/openid-connect-registration-1_0.html#ClientMetadata + */ +@property(nonatomic, readonly, nullable) NSArray *grantTypes; + +/*! @brief The subject type to to request. + @remarks subject_type + @see http://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes + */ +@property(nonatomic, readonly, nullable) NSString *subjectType; + +/*! @brief The client authentication method to use at the token endpoint. + @remarks token_endpoint_auth_method + @see http://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication + */ +@property(nonatomic, readonly, nullable) NSString *tokenEndpointAuthenticationMethod; + +/*! @brief The client's additional token request parameters. + */ +@property(nonatomic, readonly, nullable) NSDictionary *additionalParameters; + +/*! @internal + @brief Unavailable. Please use initWithConfiguration + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Create a Client Registration Request to an OpenID Provider that supports open Dynamic + Registration. + @param configuration The service's configuration. + @param redirectURIs The redirect URIs to register for the client. + @param responseTypes The response types to register for the client. + @param grantTypes The grant types to register for the client. + @param subjectType The subject type to register for the client. + @param tokenEndpointAuthMethod The token endpoint authentication method to register for the + client. + @param additionalParameters The client's additional registration request parameters. + */ +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + redirectURIs:(NSArray *)redirectURIs + responseTypes:(nullable NSArray *)responseTypes + grantTypes:(nullable NSArray *)grantTypes + subjectType:(nullable NSString *)subjectType + tokenEndpointAuthMethod:(nullable NSString *)tokenEndpointAuthMethod + additionalParameters:(nullable NSDictionary *)additionalParameters; + +/*! @brief Designated initializer. + @param configuration The service's configuration. + @param redirectURIs The redirect URIs to register for the client. + @param responseTypes The response types to register for the client. + @param grantTypes The grant types to register for the client. + @param subjectType The subject type to register for the client. + @param tokenEndpointAuthMethod The token endpoint authentication method to register for the + client. + @param initialAccessToken The initial access token to access the Client Registration Endpoint + (if required by the OpenID Provider). + @param additionalParameters The client's additional registration request parameters. + @see https://openid.net/specs/openid-connect-registration-1_0.html#ClientRegistration + */ +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + redirectURIs:(NSArray *)redirectURIs + responseTypes:(nullable NSArray *)responseTypes + grantTypes:(nullable NSArray *)grantTypes + subjectType:(nullable NSString *)subjectType + tokenEndpointAuthMethod:(nullable NSString *)tokenEndpointAuthMethod + initialAccessToken:(nullable NSString *)initialAccessToken + additionalParameters:(nullable NSDictionary *)additionalParameters + NS_DESIGNATED_INITIALIZER; + +/*! @brief Constructs an @c NSURLRequest representing the registration request. + @return An @c NSURLRequest representing the registration request. + */ +- (NSURLRequest *)URLRequest; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.m new file mode 100644 index 00000000..9efd18fd --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.m @@ -0,0 +1,248 @@ +/*! @file OIDRegistrationRequest.m + @brief AppAuth iOS SDK + @copyright + Copyright 2016 The AppAuth for iOS Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDRegistrationRequest.h" + +#import "OIDClientMetadataParameters.h" +#import "OIDDefines.h" +#import "OIDServiceConfiguration.h" + +/*! @brief The key for the @c configuration property for @c NSSecureCoding + */ +static NSString *const kConfigurationKey = @"configuration"; + +/*! @brief The key for the @c initialAccessToken property for @c NSSecureCoding + */ +static NSString *const kInitialAccessToken = @"initial_access_token"; + +/*! @brief Key used to encode the @c redirectURIs property for @c NSSecureCoding + */ +static NSString *const kRedirectURIsKey = @"redirect_uris"; + +/*! @brief The key for the @c responseTypes property for @c NSSecureCoding. + */ +static NSString *const kResponseTypesKey = @"response_types"; + +/*! @brief Key used to encode the @c grantType property for @c NSSecureCoding + */ +static NSString *const kGrantTypesKey = @"grant_types"; + +/*! @brief Key used to encode the @c subjectType property for @c NSSecureCoding + */ +static NSString *const kSubjectTypeKey = @"subject_type"; + +/*! @brief Key used to encode the @c additionalParameters property for + @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +@implementation OIDRegistrationRequest + +#pragma mark - Initializers + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER( + @selector(initWithConfiguration: + redirectURIs: + responseTypes: + grantTypes: + subjectType: + tokenEndpointAuthMethod: + additionalParameters:) + ) + +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + redirectURIs:(NSArray *)redirectURIs + responseTypes:(nullable NSArray *)responseTypes + grantTypes:(nullable NSArray *)grantTypes + subjectType:(nullable NSString *)subjectType + tokenEndpointAuthMethod:(nullable NSString *)tokenEndpointAuthenticationMethod + additionalParameters:(nullable NSDictionary *)additionalParameters { + return [self initWithConfiguration:configuration + redirectURIs:redirectURIs + responseTypes:responseTypes + grantTypes:grantTypes + subjectType:subjectType + tokenEndpointAuthMethod:tokenEndpointAuthenticationMethod + initialAccessToken:nil + additionalParameters:additionalParameters]; +} + +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + redirectURIs:(NSArray *)redirectURIs + responseTypes:(nullable NSArray *)responseTypes + grantTypes:(nullable NSArray *)grantTypes + subjectType:(nullable NSString *)subjectType + tokenEndpointAuthMethod:(nullable NSString *)tokenEndpointAuthenticationMethod + initialAccessToken:(nullable NSString *)initialAccessToken + additionalParameters:(nullable NSDictionary *)additionalParameters { + self = [super init]; + if (self) { + _configuration = [configuration copy]; + _initialAccessToken = [initialAccessToken copy]; + _redirectURIs = [redirectURIs copy]; + _responseTypes = [responseTypes copy]; + _grantTypes = [grantTypes copy]; + _subjectType = [subjectType copy]; + _tokenEndpointAuthenticationMethod = [tokenEndpointAuthenticationMethod copy]; + _additionalParameters = + [[NSDictionary alloc] initWithDictionary:additionalParameters copyItems:YES]; + + _applicationType = OIDApplicationTypeNative; + } + return self; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDServiceConfiguration *configuration = + [aDecoder decodeObjectOfClass:[OIDServiceConfiguration class] + forKey:kConfigurationKey]; + NSString *initialAccessToken = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kInitialAccessToken]; + NSArray *redirectURIs = [aDecoder decodeObjectOfClass:[NSArray class] + forKey:kRedirectURIsKey]; + NSArray *responseTypes = [aDecoder decodeObjectOfClass:[NSArray class] + forKey:kResponseTypesKey]; + NSArray *grantTypes = [aDecoder decodeObjectOfClass:[NSArray class] + forKey:kGrantTypesKey]; + NSString *subjectType = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kSubjectTypeKey]; + NSString *tokenEndpointAuthenticationMethod = + [aDecoder decodeObjectOfClass:[NSString class] + forKey:OIDTokenEndpointAuthenticationMethodParam]; + NSSet *additionalParameterCodingClasses = [NSSet setWithArray:@[ [NSDictionary class], + [NSString class] ]]; + NSDictionary *additionalParameters = + [aDecoder decodeObjectOfClasses:additionalParameterCodingClasses + forKey:kAdditionalParametersKey]; + self = [self initWithConfiguration:configuration + redirectURIs:redirectURIs + responseTypes:responseTypes + grantTypes:grantTypes + subjectType:subjectType + tokenEndpointAuthMethod:tokenEndpointAuthenticationMethod + initialAccessToken:initialAccessToken + additionalParameters:additionalParameters]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_configuration forKey:kConfigurationKey]; + [aCoder encodeObject:_initialAccessToken forKey:kInitialAccessToken]; + [aCoder encodeObject:_redirectURIs forKey:kRedirectURIsKey]; + [aCoder encodeObject:_responseTypes forKey:kResponseTypesKey]; + [aCoder encodeObject:_grantTypes forKey:kGrantTypesKey]; + [aCoder encodeObject:_subjectType forKey:kSubjectTypeKey]; + [aCoder encodeObject:_tokenEndpointAuthenticationMethod + forKey:OIDTokenEndpointAuthenticationMethodParam]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + NSURLRequest *request = [self URLRequest]; + NSString *requestBody = [[NSString alloc] initWithData:request.HTTPBody + encoding:NSUTF8StringEncoding]; + return [NSString stringWithFormat:@"<%@: %p, request: >", + NSStringFromClass([self class]), + (void *)self, + request.URL, + requestBody]; +} + +- (NSURLRequest *)URLRequest { + static NSString *const kHTTPPost = @"POST"; + static NSString *const kBearer = @"Bearer"; + static NSString *const kHTTPContentTypeHeaderKey = @"Content-Type"; + static NSString *const kHTTPContentTypeHeaderValue = @"application/json"; + static NSString *const kHTTPAuthorizationHeaderKey = @"Authorization"; + + NSData *postBody = [self JSONString]; + if (!postBody) { + return nil; + } + + NSURL *registrationRequestURL = _configuration.registrationEndpoint; + NSMutableURLRequest *URLRequest = + [[NSURLRequest requestWithURL:registrationRequestURL] mutableCopy]; + URLRequest.HTTPMethod = kHTTPPost; + [URLRequest setValue:kHTTPContentTypeHeaderValue forHTTPHeaderField:kHTTPContentTypeHeaderKey]; + if (_initialAccessToken) { + NSString *value = [NSString stringWithFormat:@"%@ %@", kBearer, _initialAccessToken]; + [URLRequest setValue:value forHTTPHeaderField:kHTTPAuthorizationHeaderKey]; + } + URLRequest.HTTPBody = postBody; + return URLRequest; +} + +- (NSData *)JSONString { + // Dictionary with several kay/value pairs and the above array of arrays + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + NSMutableArray *redirectURIStrings = + [NSMutableArray arrayWithCapacity:[_redirectURIs count]]; + for (id obj in _redirectURIs) { + [redirectURIStrings addObject:[obj absoluteString]]; + } + dict[OIDRedirectURIsParam] = redirectURIStrings; + dict[OIDApplicationTypeParam] = _applicationType; + + if (_additionalParameters) { + // Add any additional parameters first to allow them + // to be overwritten by instance values + [dict addEntriesFromDictionary:_additionalParameters]; + } + if (_responseTypes) { + dict[OIDResponseTypesParam] = _responseTypes; + } + if (_grantTypes) { + dict[OIDGrantTypesParam] = _grantTypes; + } + if (_subjectType) { + dict[OIDSubjectTypeParam] = _subjectType; + } + if (_tokenEndpointAuthenticationMethod) { + dict[OIDTokenEndpointAuthenticationMethodParam] = _tokenEndpointAuthenticationMethod; + } + + NSError *error; + NSData *json = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error]; + if (json == nil || error != nil) { + return nil; + } + + return json; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.h new file mode 100644 index 00000000..df623906 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.h @@ -0,0 +1,126 @@ +/*! @file OIDRegistrationResponse.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 The AppAuth for iOS Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +#import + +@class OIDRegistrationRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Parameter name for the client id. + */ +extern NSString *const OIDClientIDParam; + +/*! @brief Parameter name for the client id issuance timestamp. + */ +extern NSString *const OIDClientIDIssuedAtParam; + +/*! @brief Parameter name for the client secret. + */ +extern NSString *const OIDClientSecretParam; + +/*! @brief Parameter name for the client secret expiration time. + */ +extern NSString *const OIDClientSecretExpirestAtParam; + +/*! @brief Parameter name for the registration access token. + */ +extern NSString *const OIDRegistrationAccessTokenParam; + +/*! @brief Parameter name for the client configuration URI. + */ +extern NSString *const OIDRegistrationClientURIParam; + +/*! @brief Represents a registration response. + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationResponse + */ +@interface OIDRegistrationResponse : NSObject + +/*! @brief The request which was serviced. + */ +@property(nonatomic, readonly) OIDRegistrationRequest *request; + +/*! @brief The registered client identifier. + @remarks client_id + @see https://tools.ietf.org/html/rfc6749#section-4 + @see https://tools.ietf.org/html/rfc6749#section-4.1.1 + */ +@property(nonatomic, readonly) NSString *clientID; + +/*! @brief Timestamp of when the client identifier was issued, if provided. + @remarks client_id_issued_at + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationResponse + */ +@property(nonatomic, readonly, nullable) NSDate *clientIDIssuedAt; + +/*! @brief TThe client secret, which is part of the client credentials, if provided. + @remarks client_secret + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationResponse + */ +@property(nonatomic, readonly, nullable) NSString *clientSecret; + +/*! @brief Timestamp of when the client credentials expires, if provided. + @remarks client_secret_expires_at + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationResponse + */ +@property(nonatomic, readonly, nullable) NSDate *clientSecretExpiresAt; + +/*! @brief Client registration access token that can be used for subsequent operations upon the + client registration. + @remarks registration_access_token + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationResponse + */ +@property(nonatomic, readonly, nullable) NSString *registrationAccessToken; + +/*! @brief Location of the client configuration endpoint, if provided. + @remarks registration_client_uri + @see https://openid.net/specs/openid-connect-registration-1_0.html#RegistrationResponse + */ +@property(nonatomic, readonly, nullable) NSURL *registrationClientURI; + +/*! @brief Client authentication method to use at the token endpoint, if provided. + @remarks token_endpoint_auth_method + @see http://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication + */ +@property(nonatomic, readonly, nullable) NSString *tokenEndpointAuthenticationMethod; + +/*! @brief Additional parameters returned from the token server. + */ +@property(nonatomic, readonly, nullable) NSDictionary *> + *additionalParameters; + +/*! @internal + @brief Unavailable. Please use initWithRequest + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Designated initializer. + @param request The serviced request. + @param parameters The decoded parameters returned from the Authorization Server. + @remarks Known parameters are extracted from the @c parameters parameter and the normative + properties are populated. Non-normative parameters are placed in the + @c #additionalParameters dictionary. + */ +- (instancetype)initWithRequest:(OIDRegistrationRequest *)request + parameters:(NSDictionary *> *)parameters + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.m new file mode 100644 index 00000000..ec0411b7 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.m @@ -0,0 +1,164 @@ +/*! @file OIDRegistrationResponse.m + @brief AppAuth iOS SDK + @copyright + Copyright 2016 The AppAuth for iOS Authors. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDRegistrationResponse.h" + +#import "OIDClientMetadataParameters.h" +#import "OIDDefines.h" +#import "OIDFieldMapping.h" +#import "OIDRegistrationRequest.h" +#import "OIDTokenUtilities.h" + +NSString *const OIDClientIDParam = @"client_id"; +NSString *const OIDClientIDIssuedAtParam = @"client_id_issued_at"; +NSString *const OIDClientSecretParam = @"client_secret"; +NSString *const OIDClientSecretExpirestAtParam = @"client_secret_expires_at"; +NSString *const OIDRegistrationAccessTokenParam = @"registration_access_token"; +NSString *const OIDRegistrationClientURIParam = @"registration_client_uri"; + +/*! @brief Key used to encode the @c request property for @c NSSecureCoding + */ +static NSString *const kRequestKey = @"request"; + +/*! @brief Key used to encode the @c additionalParameters property for @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +@implementation OIDRegistrationResponse + +/*! @brief Returns a mapping of incoming parameters to instance variables. + @return A mapping of incoming parameters to instance variables. + */ ++ (NSDictionary *)fieldMap { + static NSMutableDictionary *fieldMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + fieldMap = [NSMutableDictionary dictionary]; + fieldMap[OIDClientIDParam] = [[OIDFieldMapping alloc] initWithName:@"_clientID" + type:[NSString class]]; + fieldMap[OIDClientIDIssuedAtParam] = + [[OIDFieldMapping alloc] initWithName:@"_clientIDIssuedAt" + type:[NSDate class] + conversion:[OIDFieldMapping dateEpochConversion]]; + fieldMap[OIDClientSecretParam] = + [[OIDFieldMapping alloc] initWithName:@"_clientSecret" + type:[NSString class]]; + fieldMap[OIDClientSecretExpirestAtParam] = + [[OIDFieldMapping alloc] initWithName:@"_clientSecretExpiresAt" + type:[NSDate class] + conversion:[OIDFieldMapping dateEpochConversion]]; + fieldMap[OIDRegistrationAccessTokenParam] = + [[OIDFieldMapping alloc] initWithName:@"_registrationAccessToken" + type:[NSString class]]; + fieldMap[OIDRegistrationClientURIParam] = + [[OIDFieldMapping alloc] initWithName:@"_registrationClientURI" + type:[NSURL class] + conversion:[OIDFieldMapping URLConversion]]; + fieldMap[OIDTokenEndpointAuthenticationMethodParam] = + [[OIDFieldMapping alloc] initWithName:@"_tokenEndpointAuthenticationMethod" + type:[NSString class]]; + }); + return fieldMap; +} + + +#pragma mark - Initializers + +- (nonnull instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithRequest:parameters:)) + +- (instancetype)initWithRequest:(OIDRegistrationRequest *)request + parameters:(NSDictionary *> *)parameters { + self = [super init]; + if (self) { + _request = [request copy]; + NSDictionary *> *additionalParameters = + [OIDFieldMapping remainingParametersWithMap:[[self class] fieldMap] + parameters:parameters + instance:self]; + _additionalParameters = additionalParameters; + + if ((_clientSecret && !_clientSecretExpiresAt) + || (!!_registrationClientURI != !!_registrationAccessToken)) { + // If client_secret is issued, client_secret_expires_at is REQUIRED, + // and the response MUST contain "[...] both a Client Configuration Endpoint + // and a Registration Access Token or neither of them" + return nil; + } + } + return self; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDRegistrationRequest *request = [aDecoder decodeObjectOfClass:[OIDRegistrationRequest class] + forKey:kRequestKey]; + self = [self initWithRequest:request + parameters:@{}]; + if (self) { + [OIDFieldMapping decodeWithCoder:aDecoder + map:[[self class] fieldMap] + instance:self]; + _additionalParameters = [aDecoder decodeObjectOfClasses:[OIDFieldMapping JSONTypes] + forKey:kAdditionalParametersKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [OIDFieldMapping encodeWithCoder:aCoder map:[[self class] fieldMap] instance:self]; + [aCoder encodeObject:_request forKey:kRequestKey]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, clientID: \"%@\", clientIDIssuedAt: %@, " + "clientSecret: %@, clientSecretExpiresAt: \"%@\", " + "registrationAccessToken: \"%@\", " + "registrationClientURI: \"%@\", " + "additionalParameters: %@, request: %@>", + NSStringFromClass([self class]), + (void *)self, + _clientID, + _clientIDIssuedAt, + [OIDTokenUtilities redact:_clientSecret], + _clientSecretExpiresAt, + [OIDTokenUtilities redact:_registrationAccessToken], + _registrationClientURI, + _additionalParameters, + _request]; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.h new file mode 100644 index 00000000..405ef938 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.h @@ -0,0 +1,31 @@ +/*! @file OIDResponseTypes.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +/*! @brief A constant for the standard OAuth2 Response Type of 'code'. + */ +extern NSString *const OIDResponseTypeCode; + +/*! @brief A constant for the standard OAuth2 Response Type of 'token'. + */ +extern NSString *const OIDResponseTypeToken; + +/*! @brief A constant for the standard OAuth2 Response Type of 'id_token'. + */ +extern NSString *const OIDResponseTypeIDToken; diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.m new file mode 100644 index 00000000..78eaf187 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.m @@ -0,0 +1,25 @@ +/*! @file OIDResponseTypes.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDResponseTypes.h" + +NSString *const OIDResponseTypeCode = @"code"; + +NSString *const OIDResponseTypeToken = @"token"; + +NSString *const OIDResponseTypeIDToken = @"id_token"; diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.h new file mode 100644 index 00000000..c0a5190c --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.h @@ -0,0 +1,48 @@ +/*! @file OIDScopeUtilities.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Provides convenience methods for dealing with scope strings. + */ +@interface OIDScopeUtilities : NSObject + +/*! @internal + @brief Unavailable. This class should not be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Converts an array of scope strings to a single scope string per the OAuth 2 spec. + @param scopes An array of scope strings. + @return A space-delimited string of scopes. + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ ++ (NSString *)scopesWithArray:(NSArray *)scopes; + +/*! @brief Converts an OAuth 2 spec-compliant scope string to an array of scopes. + @param scopes An OAuth 2 spec-compliant scope string. + @return An array of scope strings. + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ ++ (NSArray *)scopesArrayWithString:(NSString *)scopes; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.m new file mode 100644 index 00000000..a0bcb8c8 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.m @@ -0,0 +1,58 @@ +/*! @file OIDScopeUtilities.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDScopeUtilities.h" + +@implementation OIDScopeUtilities + +/*! @brief A character set with the characters NOT allowed in a scope name. + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ ++ (NSCharacterSet *)disallowedScopeCharacters { + static NSCharacterSet *disallowedCharacters; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableCharacterSet *allowedCharacters; + allowedCharacters = + [NSMutableCharacterSet characterSetWithRange:NSMakeRange(0x23, 0x5B - 0x23 + 1)]; + [allowedCharacters addCharactersInRange:NSMakeRange(0x5D, 0x7E - 0x5D + 1)]; + [allowedCharacters addCharactersInString:@"\x21"]; + disallowedCharacters = [allowedCharacters invertedSet]; + }); + return disallowedCharacters; +} + ++ (NSString *)scopesWithArray:(NSArray *)scopes { +#if !defined(NS_BLOCK_ASSERTIONS) + NSCharacterSet *disallowedCharacters = [self disallowedScopeCharacters]; + for (NSString *scope in scopes) { + NSAssert(scope.length, @"Found illegal empty scope string."); + NSAssert([scope rangeOfCharacterFromSet:disallowedCharacters].location == NSNotFound, + @"Found illegal character in scope string."); + } +#endif // !defined(NS_BLOCK_ASSERTIONS) + + NSString *scopeString = [scopes componentsJoinedByString:@" "]; + return scopeString; +} + ++ (NSArray *)scopesArrayWithString:(NSString *)scopes { + return [scopes componentsSeparatedByString:@" "]; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopes.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopes.h new file mode 100644 index 00000000..da8bb189 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopes.h @@ -0,0 +1,46 @@ +/*! @file OIDScopes.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +/*! @brief Scope that indicates this request is an OpenID Connect request. + @see http://openid.net/specs/openid-connect-core-1_0.html#AuthRequestValidation + */ +extern NSString *const OIDScopeOpenID; + +/*! @brief This scope value requests access to the End-User's default profile Claims, which are: + name, family_name, given_name, middle_name, nickname, preferred_username, profile, picture, + website, gender, birthdate, zoneinfo, locale, and updated_at. + @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims + */ +extern NSString *const OIDScopeProfile; + +/*! @brief This scope value requests access to the email and email_verified Claims. + @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims + */ +extern NSString *const OIDScopeEmail; + +/*! @brief This scope value requests access to the address Claim. + @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims + */ +extern NSString *const OIDScopeAddress; + +/*! @brief This scope value requests access to the phone_number and phone_number_verified Claims. + @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims + */ +extern NSString *const OIDScopePhone; diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopes.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopes.m new file mode 100644 index 00000000..62dd707e --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDScopes.m @@ -0,0 +1,29 @@ +/*! @file OIDScopes.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDScopes.h" + +NSString *const OIDScopeOpenID = @"openid"; + +NSString *const OIDScopeProfile = @"profile"; + +NSString *const OIDScopeEmail = @"email"; + +NSString *const OIDScopeAddress = @"address"; + +NSString *const OIDScopePhone = @"phone"; diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.h new file mode 100644 index 00000000..a072a478 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.h @@ -0,0 +1,118 @@ +/*! @file OIDServiceConfiguration.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDServiceConfiguration; +@class OIDServiceDiscovery; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief The type of block called when a @c OIDServiceConfiguration has been created + by loading a @c OIDServiceDiscovery from an @c NSURL. + */ +typedef void (^OIDServiceConfigurationCreated) + (OIDServiceConfiguration *_Nullable serviceConfiguration, + NSError *_Nullable error); + +/*! @brief Represents the information needed to construct a @c OIDAuthorizationService. + */ +@interface OIDServiceConfiguration : NSObject + +/*! @brief The authorization endpoint URI. + */ +@property(nonatomic, readonly) NSURL *authorizationEndpoint; + +/*! @brief The token exchange and refresh endpoint URI. + */ +@property(nonatomic, readonly) NSURL *tokenEndpoint; + +/*! @brief The OpenID Connect issuer. + */ +@property(nonatomic, readonly, nullable) NSURL *issuer; + +/*! @brief The dynamic client registration endpoint URI. + */ +@property(nonatomic, readonly, nullable) NSURL *registrationEndpoint; + +/*! @brief The end session logout endpoint URI. + */ +@property(nonatomic, readonly, nullable) NSURL *endSessionEndpoint; + +/*! @brief The discovery document. + */ +@property(nonatomic, readonly, nullable) OIDServiceDiscovery *discoveryDocument; + +/*! @internal + @brief Unavailable. Please use @c initWithAuthorizationEndpoint:tokenEndpoint: or + @c initWithDiscoveryDocument:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @param authorizationEndpoint The authorization endpoint URI. + @param tokenEndpoint The token exchange and refresh endpoint URI. + */ +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint; + +/*! @param authorizationEndpoint The authorization endpoint URI. + @param tokenEndpoint The token exchange and refresh endpoint URI. + @param registrationEndpoint The dynamic client registration endpoint URI. + */ +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + registrationEndpoint:(nullable NSURL *)registrationEndpoint; + +/*! @param authorizationEndpoint The authorization endpoint URI. + @param tokenEndpoint The token exchange and refresh endpoint URI. + @param issuer The OpenID Connect issuer. + */ +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + issuer:(nullable NSURL *)issuer; + +/*! @param authorizationEndpoint The authorization endpoint URI. + @param tokenEndpoint The token exchange and refresh endpoint URI. + @param issuer The OpenID Connect issuer. + @param registrationEndpoint The dynamic client registration endpoint URI. + */ +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + issuer:(nullable NSURL *)issuer + registrationEndpoint:(nullable NSURL *)registrationEndpoint; + +/*! @param authorizationEndpoint The authorization endpoint URI. + @param tokenEndpoint The token exchange and refresh endpoint URI. + @param issuer The OpenID Connect issuer. + @param registrationEndpoint The dynamic client registration endpoint URI. + @param endSessionEndpoint The end session endpoint (logout) URI. + */ +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + issuer:(nullable NSURL *)issuer + registrationEndpoint:(nullable NSURL *)registrationEndpoint + endSessionEndpoint:(nullable NSURL *)endSessionEndpoint; + +/*! @param discoveryDocument The discovery document from which to extract the required OAuth + configuration. + */ +- (instancetype)initWithDiscoveryDocument:(OIDServiceDiscovery *)discoveryDocument; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.m new file mode 100644 index 00000000..ca48a8c3 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.m @@ -0,0 +1,223 @@ +/*! @file OIDServiceConfiguration.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDServiceConfiguration.h" + +#import "OIDDefines.h" +#import "OIDErrorUtilities.h" +#import "OIDServiceDiscovery.h" + +/*! @brief The key for the @c authorizationEndpoint property. + */ +static NSString *const kAuthorizationEndpointKey = @"authorizationEndpoint"; + +/*! @brief The key for the @c tokenEndpoint property. + */ +static NSString *const kTokenEndpointKey = @"tokenEndpoint"; + +/*! @brief The key for the @c issuer property. + */ +static NSString *const kIssuerKey = @"issuer"; + +/*! @brief The key for the @c registrationEndpoint property. + */ +static NSString *const kRegistrationEndpointKey = @"registrationEndpoint"; + +/*! @brief The key for the @c endSessionEndpoint property. + */ +static NSString *const kEndSessionEndpointKey = @"endSessionEndpoint"; + +/*! @brief The key for the @c discoveryDocument property. + */ +static NSString *const kDiscoveryDocumentKey = @"discoveryDocument"; + +NS_ASSUME_NONNULL_BEGIN + +@interface OIDServiceConfiguration () + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + issuer:(nullable NSURL *)issuer + registrationEndpoint:(nullable NSURL *)registrationEndpoint + endSessionEndpoint:(nullable NSURL *)endSessionEndpoint + discoveryDocument:(nullable OIDServiceDiscovery *)discoveryDocument + NS_DESIGNATED_INITIALIZER; + +@end + +@implementation OIDServiceConfiguration + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector( + initWithAuthorizationEndpoint: + tokenEndpoint:) + ) + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + issuer:(nullable NSURL *)issuer + registrationEndpoint:(nullable NSURL *)registrationEndpoint + endSessionEndpoint:(nullable OIDServiceDiscovery *)endSessionEndpoint + discoveryDocument:(nullable OIDServiceDiscovery *)discoveryDocument { + + self = [super init]; + if (self) { + _authorizationEndpoint = [authorizationEndpoint copy]; + _tokenEndpoint = [tokenEndpoint copy]; + _issuer = [issuer copy]; + _registrationEndpoint = [registrationEndpoint copy]; + _endSessionEndpoint = [endSessionEndpoint copy]; + _discoveryDocument = [discoveryDocument copy]; + } + return self; +} + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint { + return [self initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint + issuer:nil + registrationEndpoint:nil + endSessionEndpoint:nil + discoveryDocument:nil]; +} + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + registrationEndpoint:(nullable NSURL *)registrationEndpoint { + return [self initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint + issuer:nil + registrationEndpoint:registrationEndpoint + endSessionEndpoint:nil + discoveryDocument:nil]; +} + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + issuer:(nullable NSURL *)issuer { + return [self initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint + issuer:issuer + registrationEndpoint:nil + endSessionEndpoint:nil + discoveryDocument:nil]; +} + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + issuer:(nullable NSURL *)issuer + registrationEndpoint:(nullable NSURL *)registrationEndpoint { + return [self initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint + issuer:issuer + registrationEndpoint:registrationEndpoint + endSessionEndpoint:nil + discoveryDocument:nil]; +} + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + issuer:(nullable NSURL *)issuer + registrationEndpoint:(nullable NSURL *)registrationEndpoint + endSessionEndpoint:(nullable NSURL *)endSessionEndpoint { + return [self initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint + issuer:issuer + registrationEndpoint:registrationEndpoint + endSessionEndpoint:endSessionEndpoint + discoveryDocument:nil]; +} + +- (instancetype)initWithDiscoveryDocument:(OIDServiceDiscovery *) discoveryDocument { + return [self initWithAuthorizationEndpoint:discoveryDocument.authorizationEndpoint + tokenEndpoint:discoveryDocument.tokenEndpoint + issuer:discoveryDocument.issuer + registrationEndpoint:discoveryDocument.registrationEndpoint + endSessionEndpoint:discoveryDocument.endSessionEndpoint + discoveryDocument:discoveryDocument]; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSURL *authorizationEndpoint = [aDecoder decodeObjectOfClass:[NSURL class] + forKey:kAuthorizationEndpointKey]; + NSURL *tokenEndpoint = [aDecoder decodeObjectOfClass:[NSURL class] + forKey:kTokenEndpointKey]; + NSURL *issuer = [aDecoder decodeObjectOfClass:[NSURL class] + forKey:kIssuerKey]; + NSURL *registrationEndpoint = [aDecoder decodeObjectOfClass:[NSURL class] + forKey:kRegistrationEndpointKey]; + NSURL *endSessionEndpoint = [aDecoder decodeObjectOfClass:[NSURL class] + forKey:kEndSessionEndpointKey]; + // We don't accept nil authorizationEndpoints or tokenEndpoints. + if (!authorizationEndpoint || !tokenEndpoint) { + return nil; + } + + OIDServiceDiscovery *discoveryDocument = [aDecoder decodeObjectOfClass:[OIDServiceDiscovery class] + forKey:kDiscoveryDocumentKey]; + + return [self initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint + issuer:issuer + registrationEndpoint:registrationEndpoint + endSessionEndpoint:endSessionEndpoint + discoveryDocument:discoveryDocument]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_authorizationEndpoint forKey:kAuthorizationEndpointKey]; + [aCoder encodeObject:_tokenEndpoint forKey:kTokenEndpointKey]; + [aCoder encodeObject:_issuer forKey:kIssuerKey]; + [aCoder encodeObject:_registrationEndpoint forKey:kRegistrationEndpointKey]; + [aCoder encodeObject:_discoveryDocument forKey:kDiscoveryDocumentKey]; + [aCoder encodeObject:_endSessionEndpoint forKey:kEndSessionEndpointKey]; +} + +#pragma mark - description + +- (NSString *)description { + return [NSString stringWithFormat: + @"OIDServiceConfiguration authorizationEndpoint: %@, tokenEndpoint: %@, " + "registrationEndpoint: %@, endSessionEndpoint: %@, discoveryDocument: [%@]", + _authorizationEndpoint, + _tokenEndpoint, + _registrationEndpoint, + _endSessionEndpoint, + _discoveryDocument]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.h new file mode 100644 index 00000000..57770083 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.h @@ -0,0 +1,358 @@ +/*! @file OIDServiceDiscovery.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents an OpenID Connect 1.0 Discovery Document + @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata + */ +@interface OIDServiceDiscovery : NSObject + +/*! @brief The decoded OpenID Connect 1.0 Discovery Document as a dictionary. + */ +@property(nonatomic, readonly) NSDictionary *discoveryDictionary; + +/*! @brief REQUIRED. URL using the @c https scheme with no query or fragment component that the OP + asserts as its Issuer Identifier. If Issuer discovery is supported, this value MUST be + identical to the issuer value returned by WebFinger. This also MUST be identical to the + @c iss Claim value in ID Tokens issued from this Issuer. + @remarks issuer + @seealso https://openid.net/specs/openid-connect-discovery-1_0.html#IssuerDiscovery + */ +@property(nonatomic, readonly) NSURL *issuer; + +/*! @brief REQUIRED. URL of the OP's OAuth 2.0 Authorization Endpoint. + @remarks authorization_endpoint + @seealso http://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint + */ +@property(nonatomic, readonly) NSURL *authorizationEndpoint; + +/*! @brief URL of the OP's OAuth 2.0 Token Endpoint. This is REQUIRED unless only the Implicit Flow + is used. + @remarks token_endpoint + @seealso http://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint + */ +@property(nonatomic, readonly) NSURL *tokenEndpoint; + +/*! @brief RECOMMENDED. URL of the OP's UserInfo Endpoint. This URL MUST use the https scheme and + MAY contain port, path, and query parameter components. + @remarks userinfo_endpoint + @seealso http://openid.net/specs/openid-connect-core-1_0.html#UserInfo + */ +@property(nonatomic, readonly, nullable) NSURL *userinfoEndpoint; + +/*! @brief REQUIRED. URL of the OP's JSON Web Key Set document. This contains the signing key(s) the + RP uses to validate signatures from the OP. The JWK Set MAY also contain the Server's + encryption key(s), which are used by RPs to encrypt requests to the Server. When both + signing and encryption keys are made available, a use (Key Use) parameter value is REQUIRED + for all keys in the referenced JWK Set to indicate each key's intended usage. Although some + algorithms allow the same key to be used for both signatures and encryption, doing so is NOT + RECOMMENDED, as it is less secure. The JWK x5c parameter MAY be used to provide X.509 + representations of keys provided. When used, the bare key values MUST still be present and + MUST match those in the certificate. + @remarks jwks_uri + @seealso http://tools.ietf.org/html/rfc7517 + */ +@property(nonatomic, readonly) NSURL *jwksURL; + +/*! @brief RECOMMENDED. URL of the OP's Dynamic Client Registration Endpoint. + @remarks registration_endpoint + @seealso http://openid.net/specs/openid-connect-registration-1_0.html + */ +@property(nonatomic, readonly, nullable) NSURL *registrationEndpoint; + +/* @brief OPTIONAL. URL of the OP's RP-Initiated Logout endpoint. + @remarks end_session_endpoint + @seealso http://openid.net/specs/openid-connect-session-1_0.html#OPMetadata + */ +@property(nonatomic, readonly, nullable) NSURL *endSessionEndpoint; + +/*! @brief RECOMMENDED. JSON array containing a list of the OAuth 2.0 [RFC6749] scope values that + this server supports. The server MUST support the openid scope value. Servers MAY choose not + to advertise some supported scope values even when this parameter is used, although those + defined in [OpenID.Core] SHOULD be listed, if supported. + @remarks scopes_supported + @seealso http://tools.ietf.org/html/rfc6749#section-3.3 + */ +@property(nonatomic, readonly, nullable) NSArray *scopesSupported; + +/*! @brief REQUIRED. JSON array containing a list of the OAuth 2.0 @c response_type values that this + OP supports. Dynamic OpenID Providers MUST support the @c code, @c id_token, and the token + @c id_token Response Type values. + @remarks response_types_supported + */ +@property(nonatomic, readonly) NSArray *responseTypesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the OAuth 2.0 @c response_mode values that this + OP supports, as specified in OAuth 2.0 Multiple Response Type Encoding Practices. If + omitted, the default for Dynamic OpenID Providers is @c ["query", "fragment"]. + @remarks response_modes_supported + @seealso http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html + */ +@property(nonatomic, readonly, nullable) NSArray *responseModesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the OAuth 2.0 Grant Type values that this OP + supports. Dynamic OpenID Providers MUST support the @c authorization_code and @c implicit + Grant Type values and MAY support other Grant Types. If omitted, the default value is + @c ["authorization_code", "implicit"]. + @remarks grant_types_supported + */ +@property(nonatomic, readonly, nullable) NSArray *grantTypesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the Authentication Context Class References + that this OP supports. + @remarks acr_values_supported + */ +@property(nonatomic, readonly, nullable) NSArray *acrValuesSupported; + +/*! @brief REQUIRED. JSON array containing a list of the Subject Identifier types that this OP + supports. Valid types include @c pairwise and @c public. + @remarks subject_types_supported + */ +@property(nonatomic, readonly) NSArray *subjectTypesSupported; + +/*! @brief REQUIRED. JSON array containing a list of the JWS signing algorithms (@c alg values) + supported by the OP for the ID Token to encode the Claims in a JWT. The algorithm @c RS256 + MUST be included. The value @c none MAY be supported, but MUST NOT be used unless the + Response Type used returns no ID Token from the Authorization Endpoint (such as when using + the Authorization Code Flow). + @remarks id_token_signing_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly) NSArray *IDTokenSigningAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c alg values) + supported by the OP for the ID Token to encode the Claims in a JWT. + @remarks id_token_encryption_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *IDTokenEncryptionAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c enc values) + supported by the OP for the ID Token to encode the Claims in a JWT. + @remarks id_token_encryption_enc_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *IDTokenEncryptionEncodingValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWS signing algorithms (@c alg values) + supported by the UserInfo Endpoint to encode the Claims in a JWT. The value none MAY be + included. + @remarks userinfo_signing_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7515 + @seealso https://tools.ietf.org/html/rfc7518 + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *userinfoSigningAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (alg values) + supported by the UserInfo Endpoint to encode the Claims in a JWT. + @remarks userinfo_encryption_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7516 + @seealso https://tools.ietf.org/html/rfc7518 + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *userinfoEncryptionAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c enc values) + supported by the UserInfo Endpoint to encode the Claims in a JWT. + @remarks userinfo_encryption_enc_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *userinfoEncryptionEncodingValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWS signing algorithms (@c alg values) + supported by the OP for Request Objects, which are described in Section 6.1 of OpenID + Connect Core 1.0. These algorithms are used both when the Request Object is passed by value + (using the request parameter) and when it is passed by reference (using the @c request_uri + parameter). Servers SHOULD support @c none and @c RS256. + @remarks request_object_signing_alg_values_supported + @seealso http://openid.net/specs/openid-connect-core-1_0.html + */ +@property(nonatomic, readonly, nullable) + NSArray *requestObjectSigningAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c alg values) + supported by the OP for Request Objects. These algorithms are used both when the Request + Object is passed by value and when it is passed by reference. + @remarks request_object_encryption_alg_values_supported + */ +@property(nonatomic, readonly, nullable) + NSArray *requestObjectEncryptionAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c enc values) + supported by the OP for Request Objects. These algorithms are used both when the Request + Object is passed by value and when it is passed by reference. + @remarks request_object_encryption_enc_values_supported + */ +@property(nonatomic, readonly, nullable) + NSArray *requestObjectEncryptionEncodingValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of Client Authentication methods supported by this + Token Endpoint. The options are @c client_secret_post, @c client_secret_basic, + @c client_secret_jwt, and @c private_key_jwt, as described in Section 9 of OpenID Connect + Core 1.0. Other authentication methods MAY be defined by extensions. If omitted, the default + is @c client_secret_basic -- the HTTP Basic Authentication Scheme specified in Section 2.3.1 + of OAuth 2.0. + @remarks token_endpoint_auth_methods_supported + @seealso http://openid.net/specs/openid-connect-core-1_0.html + @seealso http://tools.ietf.org/html/rfc6749#section-2.3.1 + */ +@property(nonatomic, readonly, nullable) NSArray *tokenEndpointAuthMethodsSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWS signing algorithms (@c alg values) + supported by the Token Endpoint for the signature on the JWT used to authenticate the Client + at the Token Endpoint for the @c private_key_jwt and @c client_secret_jwt authentication + methods. Servers SHOULD support @c RS256. The value @c none MUST NOT be used. + @remarks token_endpoint_auth_signing_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *tokenEndpointAuthSigningAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the @c display parameter values that the OpenID + Provider supports. These values are described in Section 3.1.2.1 of OpenID Connect Core 1.0. + @remarks display_values_supported + @seealso http://openid.net/specs/openid-connect-core-1_0.html + */ +@property(nonatomic, readonly, nullable) NSArray *displayValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the Claim Types that the OpenID Provider + supports. These Claim Types are described in Section 5.6 of OpenID Connect Core 1.0. Values + defined by this specification are @c normal, @c aggregated, and @c distributed. If omitted, + the implementation supports only @c normal Claims. + @remarks claim_types_supported + @seealso http://openid.net/specs/openid-connect-core-1_0.html + */ +@property(nonatomic, readonly, nullable) NSArray *claimTypesSupported; + +/*! @brief RECOMMENDED. JSON array containing a list of the Claim Names of the Claims that the + OpenID Provider MAY be able to supply values for. Note that for privacy or other reasons, + this might not be an exhaustive list. + @remarks claims_supported + */ +@property(nonatomic, readonly, nullable) NSArray *claimsSupported; + +/*! @brief OPTIONAL. URL of a page containing human-readable information that developers might want + or need to know when using the OpenID Provider. In particular, if the OpenID Provider does + not support Dynamic Client Registration, then information on how to register Clients needs + to be provided in this documentation. + @remarks service_documentation + */ +@property(nonatomic, readonly, nullable) NSURL *serviceDocumentation; + +/*! @brief OPTIONAL. Languages and scripts supported for values in Claims being returned, + represented as a JSON array of BCP47 language tag values. Not all languages and scripts are + necessarily supported for all Claim values. + @remarks claims_locales_supported + @seealso http://tools.ietf.org/html/rfc5646 + */ +@property(nonatomic, readonly, nullable) NSArray *claimsLocalesSupported; + +/*! @brief OPTIONAL. Languages and scripts supported for the user interface, represented as a JSON + array of BCP47 language tag values. + @remarks ui_locales_supported + @seealso http://tools.ietf.org/html/rfc5646 + */ +@property(nonatomic, readonly, nullable) NSArray *UILocalesSupported; + +/*! @brief OPTIONAL. Boolean value specifying whether the OP supports use of the claims parameter, + with @c true indicating support. If omitted, the default value is @c false. + @remarks claims_parameter_supported + */ +@property(nonatomic, readonly) BOOL claimsParameterSupported; + +/*! @brief OPTIONAL. Boolean value specifying whether the OP supports use of the request parameter, + with @c true indicating support. If omitted, the default value is @c false. + @remarks request_parameter_supported + */ +@property(nonatomic, readonly) BOOL requestParameterSupported; + +/*! @brief OPTIONAL. Boolean value specifying whether the OP supports use of the @c request_uri + parameter, with true indicating support. If omitted, the default value is @c true. + @remarks request_uri_parameter_supported + */ +@property(nonatomic, readonly) BOOL requestURIParameterSupported; + +/*! @brief OPTIONAL. Boolean value specifying whether the OP requires any @c request_uri values used + to be pre-registered using the @c request_uris registration parameter. Pre-registration is + REQUIRED when the value is @c true. If omitted, the default value is @c false. + @remarks require_request_uri_registration + */ +@property(nonatomic, readonly) BOOL requireRequestURIRegistration; + +/*! @brief OPTIONAL. URL that the OpenID Provider provides to the person registering the Client to + read about the OP's requirements on how the Relying Party can use the data provided by the + OP. The registration process SHOULD display this URL to the person registering the Client if + it is given. + @remarks op_policy_uri + */ +@property(nonatomic, readonly, nullable) NSURL *OPPolicyURI; + +/*! @brief OPTIONAL. URL that the OpenID Provider provides to the person registering the Client to + read about OpenID Provider's terms of service. The registration process SHOULD display this + URL to the person registering the Client if it is given. + @remarks op_tos_uri + */ +@property(nonatomic, readonly, nullable) NSURL *OPTosURI; + +/*! @internal + @brief Unavailable. Please use @c initWithDictionary:error:, @c initWithJSON:error, or the + @c serviceDiscoveryWithURL:callback: factory method. + */ +- (nonnull instancetype)init NS_UNAVAILABLE; + +/*! @brief Decodes a OpenID Connect Discovery 1.0 JSON document. + @param serviceDiscoveryJSON An OpenID Connect Service Discovery document. + @param error If a required field is missing from the dictionary, an error with domain + @c ::OIDGeneralErrorDomain and code @c ::OIDErrorCodeInvalidDiscoveryDocument will be + returned. + */ +- (nullable instancetype)initWithJSON:(NSString *)serviceDiscoveryJSON + error:(NSError **_Nullable)error; + +/*! @brief Decodes a OpenID Connect Discovery 1.0 JSON document. + @param serviceDiscoveryJSONData An OpenID Connect Service Discovery document. + @param error If a required field is missing from the dictionary, an error with domain + @c ::OIDGeneralErrorDomain and code @c ::OIDErrorCodeInvalidDiscoveryDocument will be + returned. + */ +- (nullable instancetype)initWithJSONData:(NSData *)serviceDiscoveryJSONData + error:(NSError **_Nullable)error; + +/*! @brief Designated initializer. The dictionary keys should match the keys defined in the OpenID + Connect Discovery 1.0 standard for OpenID Provider Metadata. + @param serviceDiscoveryDictionary A dictionary representing an OpenID Connect Service Discovery + document. + @param error If a required field is missing from the dictionary, an error with domain + @c ::OIDGeneralErrorDomain and code @c ::OIDErrorCodeInvalidDiscoveryDocument will be + returned. + */ +- (nullable instancetype)initWithDictionary:(NSDictionary *)serviceDiscoveryDictionary + error:(NSError **_Nullable)error NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.m new file mode 100644 index 00000000..ca81108a --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.m @@ -0,0 +1,362 @@ +/*! @file OIDServiceDiscovery.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDServiceDiscovery.h" + +#import "OIDDefines.h" +#import "OIDErrorUtilities.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! Field keys associated with an OpenID Connect Discovery Document. */ +static NSString *const kIssuerKey = @"issuer"; +static NSString *const kAuthorizationEndpointKey = @"authorization_endpoint"; +static NSString *const kTokenEndpointKey = @"token_endpoint"; +static NSString *const kUserinfoEndpointKey = @"userinfo_endpoint"; +static NSString *const kJWKSURLKey = @"jwks_uri"; +static NSString *const kRegistrationEndpointKey = @"registration_endpoint"; +static NSString *const kEndSessionEndpointKey = @"end_session_endpoint"; +static NSString *const kScopesSupportedKey = @"scopes_supported"; +static NSString *const kResponseTypesSupportedKey = @"response_types_supported"; +static NSString *const kResponseModesSupportedKey = @"response_modes_supported"; +static NSString *const kGrantTypesSupportedKey = @"grant_types_supported"; +static NSString *const kACRValuesSupportedKey = @"acr_values_supported"; +static NSString *const kSubjectTypesSupportedKey = @"subject_types_supported"; +static NSString *const kIDTokenSigningAlgorithmValuesSupportedKey = + @"id_token_signing_alg_values_supported"; +static NSString *const kIDTokenEncryptionAlgorithmValuesSupportedKey = + @"id_token_encryption_alg_values_supported"; +static NSString *const kIDTokenEncryptionEncodingValuesSupportedKey = + @"id_token_encryption_enc_values_supported"; +static NSString *const kUserinfoSigningAlgorithmValuesSupportedKey = + @"userinfo_signing_alg_values_supported"; +static NSString *const kUserinfoEncryptionAlgorithmValuesSupportedKey = + @"userinfo_encryption_alg_values_supported"; +static NSString *const kUserinfoEncryptionEncodingValuesSupportedKey = + @"userinfo_encryption_enc_values_supported"; +static NSString *const kRequestObjectSigningAlgorithmValuesSupportedKey = + @"request_object_signing_alg_values_supported"; +static NSString *const kRequestObjectEncryptionAlgorithmValuesSupportedKey = + @"request_object_encryption_alg_values_supported"; +static NSString *const kRequestObjectEncryptionEncodingValuesSupported = + @"request_object_encryption_enc_values_supported"; +static NSString *const kTokenEndpointAuthMethodsSupportedKey = + @"token_endpoint_auth_methods_supported"; +static NSString *const kTokenEndpointAuthSigningAlgorithmValuesSupportedKey = + @"token_endpoint_auth_signing_alg_values_supported"; +static NSString *const kDisplayValuesSupportedKey = @"display_values_supported"; +static NSString *const kClaimTypesSupportedKey = @"claim_types_supported"; +static NSString *const kClaimsSupportedKey = @"claims_supported"; +static NSString *const kServiceDocumentationKey = @"service_documentation"; +static NSString *const kClaimsLocalesSupportedKey = @"claims_locales_supported"; +static NSString *const kUILocalesSupportedKey = @"ui_locales_supported"; +static NSString *const kClaimsParameterSupportedKey = @"claims_parameter_supported"; +static NSString *const kRequestParameterSupportedKey = @"request_parameter_supported"; +static NSString *const kRequestURIParameterSupportedKey = @"request_uri_parameter_supported"; +static NSString *const kRequireRequestURIRegistrationKey = @"require_request_uri_registration"; +static NSString *const kOPPolicyURIKey = @"op_policy_uri"; +static NSString *const kOPTosURIKey = @"op_tos_uri"; + +@implementation OIDServiceDiscovery { + NSDictionary *_discoveryDictionary; +} + +- (nonnull instancetype)init OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithDictionary:error:)) + +- (nullable instancetype)initWithJSON:(NSString *)serviceDiscoveryJSON error:(NSError **)error { + NSData *jsonData = [serviceDiscoveryJSON dataUsingEncoding:NSUTF8StringEncoding]; + return [self initWithJSONData:jsonData error:error]; +} + +- (nullable instancetype)initWithJSONData:(NSData *)serviceDiscoveryJSONData + error:(NSError **_Nullable)error { + NSError *jsonError; + NSDictionary *json = + [NSJSONSerialization JSONObjectWithData:serviceDiscoveryJSONData options:0 error:&jsonError]; + if (!json || jsonError) { + *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeJSONDeserializationError + underlyingError:jsonError + description:jsonError.localizedDescription]; + return nil; + } + if (![json isKindOfClass:[NSDictionary class]]) { + *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeInvalidDiscoveryDocument + underlyingError:nil + description:@"Discovery document isn't a dictionary"]; + return nil; + } + + return [self initWithDictionary:json error:error]; +} + +- (nullable instancetype)initWithDictionary:(NSDictionary *)serviceDiscoveryDictionary + error:(NSError **_Nullable)error { + if (![[self class] dictionaryHasRequiredFields:serviceDiscoveryDictionary error:error]) { + return nil; + } + self = [super init]; + if (self) { + _discoveryDictionary = [serviceDiscoveryDictionary copy]; + } + return self; +} + +#pragma mark - + +/*! @brief Checks to see if the specified dictionary contains the required fields. + @discussion This test is not meant to provide semantic analysis of the document (eg. fields + where the value @c none is not an allowed option would not cause this method to fail if + their value was @c none.) We are just testing to make sure we can meet the nullability + contract we promised in the header. + */ ++ (BOOL)dictionaryHasRequiredFields:(NSDictionary *)dictionary + error:(NSError **_Nullable)error { + static NSString *const kMissingFieldErrorText = @"Missing field: %@"; + static NSString *const kInvalidURLFieldErrorText = @"Invalid URL: %@"; + + NSArray *requiredFields = @[ + kIssuerKey, + kAuthorizationEndpointKey, + kTokenEndpointKey, + kJWKSURLKey, + kResponseTypesSupportedKey, + kSubjectTypesSupportedKey, + kIDTokenSigningAlgorithmValuesSupportedKey + ]; + + for (NSString *field in requiredFields) { + if (!dictionary[field]) { + if (error) { + NSString *errorText = [NSString stringWithFormat:kMissingFieldErrorText, field]; + *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeInvalidDiscoveryDocument + underlyingError:nil + description:errorText]; + } + return NO; + } + } + + // Check required URL fields are valid URLs. + NSArray *requiredURLFields = @[ + kIssuerKey, + kTokenEndpointKey, + kJWKSURLKey + ]; + + for (NSString *field in requiredURLFields) { + if (![NSURL URLWithString:dictionary[field]]) { + if (error) { + NSString *errorText = [NSString stringWithFormat:kInvalidURLFieldErrorText, field]; + *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeInvalidDiscoveryDocument + underlyingError:nil + description:errorText]; + } + return NO; + } + } + + return YES; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSError *error; + NSDictionary *dictionary = [[NSDictionary alloc] initWithCoder:aDecoder]; + self = [self initWithDictionary:dictionary error:&error]; + if (error) { + return nil; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [_discoveryDictionary encodeWithCoder:aCoder]; +} + +#pragma mark - Properties + +- (NSDictionary *)discoveryDictionary { + return _discoveryDictionary; +} + +- (NSURL *)issuer { + return [NSURL URLWithString:_discoveryDictionary[kIssuerKey]]; +} + +- (NSURL *)authorizationEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kAuthorizationEndpointKey]]; +} + +- (NSURL *)tokenEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kTokenEndpointKey]]; +} + +- (nullable NSURL *)userinfoEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kUserinfoEndpointKey]]; +} + +- (NSURL *)jwksURL { + return [NSURL URLWithString:_discoveryDictionary[kJWKSURLKey]]; +} + +- (nullable NSURL *)registrationEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kRegistrationEndpointKey]]; +} + +- (nullable NSURL *)endSessionEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kEndSessionEndpointKey]]; +} + +- (nullable NSArray *)scopesSupported { + return _discoveryDictionary[kScopesSupportedKey]; +} + +- (NSArray *)responseTypesSupported { + return _discoveryDictionary[kResponseTypesSupportedKey]; +} + +- (nullable NSArray *)responseModesSupported { + return _discoveryDictionary[kResponseModesSupportedKey]; +} + +- (nullable NSArray *)grantTypesSupported { + return _discoveryDictionary[kGrantTypesSupportedKey]; +} + +- (nullable NSArray *)acrValuesSupported { + return _discoveryDictionary[kACRValuesSupportedKey]; +} + +- (NSArray *)subjectTypesSupported { + return _discoveryDictionary[kSubjectTypesSupportedKey]; +} + +- (NSArray *) IDTokenSigningAlgorithmValuesSupported { + return _discoveryDictionary[kIDTokenSigningAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)IDTokenEncryptionAlgorithmValuesSupported { + return _discoveryDictionary[kIDTokenEncryptionAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)IDTokenEncryptionEncodingValuesSupported { + return _discoveryDictionary[kIDTokenEncryptionEncodingValuesSupportedKey]; +} + +- (nullable NSArray *)userinfoSigningAlgorithmValuesSupported { + return _discoveryDictionary[kUserinfoSigningAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)userinfoEncryptionAlgorithmValuesSupported { + return _discoveryDictionary[kUserinfoEncryptionAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)userinfoEncryptionEncodingValuesSupported { + return _discoveryDictionary[kUserinfoEncryptionEncodingValuesSupportedKey]; +} + +- (nullable NSArray *)requestObjectSigningAlgorithmValuesSupported { + return _discoveryDictionary[kRequestObjectSigningAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *) requestObjectEncryptionAlgorithmValuesSupported { + return _discoveryDictionary[kRequestObjectEncryptionAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *) requestObjectEncryptionEncodingValuesSupported { + return _discoveryDictionary[kRequestObjectEncryptionEncodingValuesSupported]; +} + +- (nullable NSArray *)tokenEndpointAuthMethodsSupported { + return _discoveryDictionary[kTokenEndpointAuthMethodsSupportedKey]; +} + +- (nullable NSArray *)tokenEndpointAuthSigningAlgorithmValuesSupported { + return _discoveryDictionary[kTokenEndpointAuthSigningAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)displayValuesSupported { + return _discoveryDictionary[kDisplayValuesSupportedKey]; +} + +- (nullable NSArray *)claimTypesSupported { + return _discoveryDictionary[kClaimTypesSupportedKey]; +} + +- (nullable NSArray *)claimsSupported { + return _discoveryDictionary[kClaimsSupportedKey]; +} + +- (nullable NSURL *)serviceDocumentation { + return [NSURL URLWithString:_discoveryDictionary[kServiceDocumentationKey]]; +} + +- (nullable NSArray *)claimsLocalesSupported { + return _discoveryDictionary[kClaimsLocalesSupportedKey]; +} + +- (nullable NSArray *)UILocalesSupported { + return _discoveryDictionary[kUILocalesSupportedKey]; +} + +- (BOOL)claimsParameterSupported { + return [_discoveryDictionary[kClaimsParameterSupportedKey] boolValue]; +} + +- (BOOL)requestParameterSupported { + return [_discoveryDictionary[kRequestParameterSupportedKey] boolValue]; +} + +- (BOOL)requestURIParameterSupported { + // Default is true/YES. + if (!_discoveryDictionary[kRequestURIParameterSupportedKey]) { + return YES; + } + return [_discoveryDictionary[kRequestURIParameterSupportedKey] boolValue]; +} + +- (BOOL)requireRequestURIRegistration { + return [_discoveryDictionary[kRequireRequestURIRegistrationKey] boolValue]; +} + +- (nullable NSURL *)OPPolicyURI { + return [NSURL URLWithString:_discoveryDictionary[kOPPolicyURIKey]]; +} + +- (nullable NSURL *)OPTosURI { + return [NSURL URLWithString:_discoveryDictionary[kOPTosURIKey]]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.h new file mode 100644 index 00000000..00e0c6e2 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.h @@ -0,0 +1,162 @@ +/*! @file OIDTokenRequest.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +// This file only declares string constants useful for constructing a @c OIDTokenRequest, so it is +// imported here for convenience. +#import "OIDGrantTypes.h" + +@class OIDAuthorizationResponse; +@class OIDServiceConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents a token request. + @see https://tools.ietf.org/html/rfc6749#section-3.2 + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@interface OIDTokenRequest : NSObject + +/*! @brief The service's configuration. + @remarks This configuration specifies how to connect to a particular OAuth provider. + Configurations may be created manually, or via an OpenID Connect Discovery Document. + */ +@property(nonatomic, readonly) OIDServiceConfiguration *configuration; + +/*! @brief The type of token being sent to the token endpoint, i.e. "authorization_code" for the + authorization code exchange, or "refresh_token" for an access token refresh request. + @remarks grant_type + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + @see https://www.google.com/url?sa=D&q=https%3A%2F%2Ftools.ietf.org%2Fhtml%2Frfc6749%23section-6 + */ +@property(nonatomic, readonly) NSString *grantType; + +/*! @brief The authorization code received from the authorization server. + @remarks code + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@property(nonatomic, readonly, nullable) NSString *authorizationCode; + +/*! @brief The client's redirect URI. + @remarks redirect_uri + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@property(nonatomic, readonly, nullable) NSURL *redirectURL; + +/*! @brief The client identifier. + @remarks client_id + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@property(nonatomic, readonly) NSString *clientID; + +/*! @brief The client secret. + @remarks client_secret + @see https://tools.ietf.org/html/rfc6749#section-2.3.1 + */ +@property(nonatomic, readonly, nullable) NSString *clientSecret; + +/*! @brief The value of the scope parameter is expressed as a list of space-delimited, + case-sensitive strings. + @remarks scope + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief The refresh token, which can be used to obtain new access tokens using the same + authorization grant. + @remarks refresh_token + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *refreshToken; + +/*! @brief The PKCE code verifier used to redeem the authorization code. + @remarks code_verifier + @see https://tools.ietf.org/html/rfc7636#section-4.3 + */ +@property(nonatomic, readonly, nullable) NSString *codeVerifier; + +/*! @brief The client's additional token request parameters. + */ +@property(nonatomic, readonly, nullable) NSDictionary *additionalParameters; + +/*! @internal + @brief Unavailable. Please use + initWithConfiguration:grantType:code:redirectURL:clientID:additionalParameters:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @param configuration The service's configuration. + @param grantType the type of token being sent to the token endpoint, i.e. "authorization_code" + for the authorization code exchange, or "refresh_token" for an access token refresh request. + @see OIDGrantTypes.h + @param code The authorization code received from the authorization server. + @param redirectURL The client's redirect URI. + @param clientID The client identifier. + @param clientSecret The client secret. + @param scopes An array of scopes to combine into a single scope string per the OAuth2 spec. + @param refreshToken The refresh token. + @param codeVerifier The PKCE code verifier. + @param additionalParameters The client's additional token request parameters. + */ +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + grantType:(NSString *)grantType + authorizationCode:(nullable NSString *)code + redirectURL:(nullable NSURL *)redirectURL + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scopes:(nullable NSArray *)scopes + refreshToken:(nullable NSString *)refreshToken + codeVerifier:(nullable NSString *)codeVerifier + additionalParameters:(nullable NSDictionary *)additionalParameters; + +/*! @brief Designated initializer. + @param configuration The service's configuration. + @param grantType the type of token being sent to the token endpoint, i.e. "authorization_code" + for the authorization code exchange, or "refresh_token" for an access token refresh request. + @see OIDGrantTypes.h + @param code The authorization code received from the authorization server. + @param redirectURL The client's redirect URI. + @param clientID The client identifier. + @param clientSecret The client secret. + @param scope The value of the scope parameter is expressed as a list of space-delimited, + case-sensitive strings. + @param refreshToken The refresh token. + @param codeVerifier The PKCE code verifier. + @param additionalParameters The client's additional token request parameters. + */ +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + grantType:(NSString *)grantType + authorizationCode:(nullable NSString *)code + redirectURL:(nullable NSURL *)redirectURL + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scope:(nullable NSString *)scope + refreshToken:(nullable NSString *)refreshToken + codeVerifier:(nullable NSString *)codeVerifier + additionalParameters:(nullable NSDictionary *)additionalParameters + NS_DESIGNATED_INITIALIZER; + +/*! @brief Constructs an @c NSURLRequest representing the token request. + @return An @c NSURLRequest representing the token request. + */ +- (NSURLRequest *)URLRequest; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.m new file mode 100644 index 00000000..bd27dd48 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.m @@ -0,0 +1,307 @@ +/*! @file OIDTokenRequest.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDTokenRequest.h" + +#import "OIDDefines.h" +#import "OIDError.h" +#import "OIDScopeUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDURLQueryComponent.h" +#import "OIDTokenUtilities.h" + +/*! @brief The key for the @c configuration property for @c NSSecureCoding + */ +static NSString *const kConfigurationKey = @"configuration"; + +/*! @brief Key used to encode the @c grantType property for @c NSSecureCoding + */ +static NSString *const kGrantTypeKey = @"grant_type"; + +/*! @brief The key for the @c authorizationCode property for @c NSSecureCoding. + */ +static NSString *const kAuthorizationCodeKey = @"code"; + +/*! @brief Key used to encode the @c clientID property for @c NSSecureCoding + */ +static NSString *const kClientIDKey = @"client_id"; + +/*! @brief Key used to encode the @c clientSecret property for @c NSSecureCoding + */ +static NSString *const kClientSecretKey = @"client_secret"; + +/*! @brief Key used to encode the @c redirectURL property for @c NSSecureCoding + */ +static NSString *const kRedirectURLKey = @"redirect_uri"; + +/*! @brief Key used to encode the @c scopes property for @c NSSecureCoding + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c refreshToken property for @c NSSecureCoding + */ +static NSString *const kRefreshTokenKey = @"refresh_token"; + +/*! @brief Key used to encode the @c codeVerifier property for @c NSSecureCoding and to build the + request URL. + */ +static NSString *const kCodeVerifierKey = @"code_verifier"; + +/*! @brief Key used to encode the @c additionalParameters property for + @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +@implementation OIDTokenRequest + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER( + @selector(initWithConfiguration: + grantType: + authorizationCode: + redirectURL: + clientID: + clientSecret: + scope: + refreshToken: + codeVerifier: + additionalParameters:) + ) + +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + grantType:(NSString *)grantType + authorizationCode:(nullable NSString *)code + redirectURL:(nullable NSURL *)redirectURL + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scopes:(nullable NSArray *)scopes + refreshToken:(nullable NSString *)refreshToken + codeVerifier:(nullable NSString *)codeVerifier + additionalParameters:(nullable NSDictionary *)additionalParameters { + return [self initWithConfiguration:configuration + grantType:grantType + authorizationCode:code + redirectURL:redirectURL + clientID:clientID + clientSecret:clientSecret + scope:[OIDScopeUtilities scopesWithArray:scopes] + refreshToken:refreshToken + codeVerifier:(NSString *)codeVerifier + additionalParameters:additionalParameters]; +} + +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + grantType:(NSString *)grantType + authorizationCode:(nullable NSString *)code + redirectURL:(nullable NSURL *)redirectURL + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scope:(nullable NSString *)scope + refreshToken:(nullable NSString *)refreshToken + codeVerifier:(nullable NSString *)codeVerifier + additionalParameters:(nullable NSDictionary *)additionalParameters { + self = [super init]; + if (self) { + _configuration = [configuration copy]; + _grantType = [grantType copy]; + _authorizationCode = [code copy]; + _redirectURL = [redirectURL copy]; + _clientID = [clientID copy]; + _clientSecret = [clientSecret copy]; + _scope = [scope copy]; + _refreshToken = [refreshToken copy]; + _codeVerifier = [codeVerifier copy]; + _additionalParameters = + [[NSDictionary alloc] initWithDictionary:additionalParameters copyItems:YES]; + + // Additional validation for the authorization_code grant type + if ([_grantType isEqual:OIDGrantTypeAuthorizationCode]) { + // redirect URI must not be nil + if (!_redirectURL) { + [NSException raise:OIDOAuthExceptionInvalidTokenRequestNullRedirectURL + format:@"%@", OIDOAuthExceptionInvalidTokenRequestNullRedirectURL, nil]; + + } + } + } + return self; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDServiceConfiguration *configuration = + [aDecoder decodeObjectOfClass:[OIDServiceConfiguration class] + forKey:kConfigurationKey]; + NSString *grantType = [aDecoder decodeObjectOfClass:[NSString class] forKey:kGrantTypeKey]; + NSString *code = [aDecoder decodeObjectOfClass:[NSString class] forKey:kAuthorizationCodeKey]; + NSString *clientID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kClientIDKey]; + NSString *clientSecret = [aDecoder decodeObjectOfClass:[NSString class] forKey:kClientSecretKey]; + NSString *scope = [aDecoder decodeObjectOfClass:[NSString class] forKey:kScopeKey]; + NSString *refreshToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:kRefreshTokenKey]; + NSString *codeVerifier = [aDecoder decodeObjectOfClass:[NSString class] forKey:kCodeVerifierKey]; + NSURL *redirectURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:kRedirectURLKey]; + NSSet *additionalParameterCodingClasses = [NSSet setWithArray:@[ + [NSDictionary class], + [NSString class] + ]]; + NSDictionary *additionalParameters = + [aDecoder decodeObjectOfClasses:additionalParameterCodingClasses + forKey:kAdditionalParametersKey]; + self = [self initWithConfiguration:configuration + grantType:grantType + authorizationCode:code + redirectURL:redirectURL + clientID:clientID + clientSecret:clientSecret + scope:scope + refreshToken:refreshToken + codeVerifier:codeVerifier + additionalParameters:additionalParameters]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_configuration forKey:kConfigurationKey]; + [aCoder encodeObject:_grantType forKey:kGrantTypeKey]; + [aCoder encodeObject:_authorizationCode forKey:kAuthorizationCodeKey]; + [aCoder encodeObject:_clientID forKey:kClientIDKey]; + [aCoder encodeObject:_clientSecret forKey:kClientSecretKey]; + [aCoder encodeObject:_redirectURL forKey:kRedirectURLKey]; + [aCoder encodeObject:_scope forKey:kScopeKey]; + [aCoder encodeObject:_refreshToken forKey:kRefreshTokenKey]; + [aCoder encodeObject:_codeVerifier forKey:kCodeVerifierKey]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + NSURLRequest *request = self.URLRequest; + NSString *requestBody = + [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding]; + return [NSString stringWithFormat:@"<%@: %p, request: >", + NSStringFromClass([self class]), + (void *)self, + request.URL, + requestBody]; +} + +#pragma mark - + +/*! @brief Constructs the request URI. + @return A URL representing the token request. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +- (NSURL *)tokenRequestURL { + return _configuration.tokenEndpoint; +} + +/*! @brief Constructs the request body data by combining the request parameters using the + "application/x-www-form-urlencoded" format. + @return The data to pass to the token request URL. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +- (OIDURLQueryComponent *)tokenRequestBody { + OIDURLQueryComponent *query = [[OIDURLQueryComponent alloc] init]; + + // Add parameters, as applicable. + if (_grantType) { + [query addParameter:kGrantTypeKey value:_grantType]; + } + if (_scope) { + [query addParameter:kScopeKey value:_scope]; + } + if (_redirectURL) { + [query addParameter:kRedirectURLKey value:_redirectURL.absoluteString]; + } + if (_refreshToken) { + [query addParameter:kRefreshTokenKey value:_refreshToken]; + } + if (_authorizationCode) { + [query addParameter:kAuthorizationCodeKey value:_authorizationCode]; + } + if (_codeVerifier) { + [query addParameter:kCodeVerifierKey value:_codeVerifier]; + } + + // Add any additional parameters the client has specified. + [query addParameters:_additionalParameters]; + + return query; +} + +- (NSURLRequest *)URLRequest { + static NSString *const kHTTPPost = @"POST"; + static NSString *const kHTTPContentTypeHeaderKey = @"Content-Type"; + static NSString *const kHTTPContentTypeHeaderValue = + @"application/x-www-form-urlencoded; charset=UTF-8"; + + NSURL *tokenRequestURL = [self tokenRequestURL]; + NSMutableURLRequest *URLRequest = [[NSURLRequest requestWithURL:tokenRequestURL] mutableCopy]; + URLRequest.HTTPMethod = kHTTPPost; + [URLRequest setValue:kHTTPContentTypeHeaderValue forHTTPHeaderField:kHTTPContentTypeHeaderKey]; + + OIDURLQueryComponent *bodyParameters = [self tokenRequestBody]; + NSMutableDictionary *httpHeaders = [[NSMutableDictionary alloc] init]; + + if (_clientSecret) { + // The client id and secret are encoded using the "application/x-www-form-urlencoded" + // encoding algorithm per RFC 6749 Section 2.3.1. + // https://tools.ietf.org/html/rfc6749#section-2.3.1 + NSString *encodedClientID = [OIDTokenUtilities formUrlEncode:_clientID]; + NSString *encodedClientSecret = [OIDTokenUtilities formUrlEncode:_clientSecret]; + + NSString *credentials = + [NSString stringWithFormat:@"%@:%@", encodedClientID, encodedClientSecret]; + NSData *plainData = [credentials dataUsingEncoding:NSUTF8StringEncoding]; + NSString *basicAuth = [plainData base64EncodedStringWithOptions:kNilOptions]; + + NSString *authValue = [NSString stringWithFormat:@"Basic %@", basicAuth]; + [httpHeaders setObject:authValue forKey:@"Authorization"]; + } else { + [bodyParameters addParameter:kClientIDKey value:_clientID]; + } + + // Constructs request with the body string and headers. + NSString *bodyString = [bodyParameters URLEncodedParameters]; + NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; + URLRequest.HTTPBody = body; + + for (id header in httpHeaders) { + [URLRequest setValue:httpHeaders[header] forHTTPHeaderField:header]; + } + + return URLRequest; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.h new file mode 100644 index 00000000..b446e944 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.h @@ -0,0 +1,110 @@ +/*! @file OIDTokenResponse.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDTokenRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents the response to an token request. + @see https://tools.ietf.org/html/rfc6749#section-3.2 + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@interface OIDTokenResponse : NSObject + +/*! @brief The request which was serviced. + */ +@property(nonatomic, readonly) OIDTokenRequest *request; + +/*! @brief The access token generated by the authorization server. + @remarks access_token + @see https://tools.ietf.org/html/rfc6749#section-4.1.4 + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *accessToken; + +/*! @brief The approximate expiration date & time of the access token. + @remarks expires_in + @seealso OIDTokenResponse.accessToken + @see https://tools.ietf.org/html/rfc6749#section-4.1.4 + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSDate *accessTokenExpirationDate; + +/*! @brief Typically "Bearer" when present. Otherwise, another token_type value that the Client has + negotiated with the Authorization Server. + @remarks token_type + @see https://tools.ietf.org/html/rfc6749#section-4.1.4 + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *tokenType; + +/*! @brief ID Token value associated with the authenticated session. Always present for the + authorization code grant exchange when OpenID Connect is used, optional for responses to + access token refresh requests. Note that AppAuth does NOT verify the JWT signature. Users + of AppAuth are encouraged to verifying the JWT signature using the validation library of + their choosing. + @remarks id_token + @see http://openid.net/specs/openid-connect-core-1_0.html#TokenResponse + @see http://openid.net/specs/openid-connect-core-1_0.html#RefreshTokenResponse + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + @see https://jwt.io + @discussion @c OIDIDToken can be used to parse the ID Token and extract the claims. As noted, + this class does not verify the JWT signature. +*/ +@property(nonatomic, readonly, nullable) NSString *idToken; + +/*! @brief The refresh token, which can be used to obtain new access tokens using the same + authorization grant + @remarks refresh_token + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *refreshToken; + +/*! @brief The scope of the access token. OPTIONAL, if identical to the scopes requested, otherwise, + REQUIRED. + @remarks scope + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief Additional parameters returned from the token server. + */ +@property(nonatomic, readonly, nullable) + NSDictionary *> *additionalParameters; + +/*! @internal + @brief Unavailable. Please use initWithParameters:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Designated initializer. + @param request The serviced request. + @param parameters The decoded parameters returned from the Authorization Server. + @remarks Known parameters are extracted from the @c parameters parameter and the normative + properties are populated. Non-normative parameters are placed in the + @c #additionalParameters dictionary. + */ +- (instancetype)initWithRequest:(OIDTokenRequest *)request + parameters:(NSDictionary *> *)parameters + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.m new file mode 100644 index 00000000..6995fb91 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.m @@ -0,0 +1,163 @@ +/*! @file OIDTokenResponse.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDTokenResponse.h" + +#import "OIDDefines.h" +#import "OIDFieldMapping.h" +#import "OIDTokenRequest.h" +#import "OIDTokenUtilities.h" + +/*! @brief Key used to encode the @c request property for @c NSSecureCoding + */ +static NSString *const kRequestKey = @"request"; + +/*! @brief The key for the @c accessToken property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kAccessTokenKey = @"access_token"; + +/*! @brief The key for the @c accessTokenExpirationDate property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kExpiresInKey = @"expires_in"; + +/*! @brief The key for the @c tokenType property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kTokenTypeKey = @"token_type"; + +/*! @brief The key for the @c idToken property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kIDTokenKey = @"id_token"; + +/*! @brief The key for the @c refreshToken property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kRefreshTokenKey = @"refresh_token"; + +/*! @brief The key for the @c scope property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c additionalParameters property for @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +@implementation OIDTokenResponse + +/*! @brief Returns a mapping of incoming parameters to instance variables. + @return A mapping of incoming parameters to instance variables. + */ ++ (NSDictionary *)fieldMap { + static NSMutableDictionary *fieldMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + fieldMap = [NSMutableDictionary dictionary]; + fieldMap[kAccessTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_accessToken" type:[NSString class]]; + fieldMap[kExpiresInKey] = + [[OIDFieldMapping alloc] initWithName:@"_accessTokenExpirationDate" + type:[NSDate class] + conversion:[OIDFieldMapping dateSinceNowConversion]]; + fieldMap[kTokenTypeKey] = + [[OIDFieldMapping alloc] initWithName:@"_tokenType" type:[NSString class]]; + fieldMap[kIDTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_idToken" type:[NSString class]]; + fieldMap[kRefreshTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_refreshToken" type:[NSString class]]; + fieldMap[kScopeKey] = + [[OIDFieldMapping alloc] initWithName:@"_scope" type:[NSString class]]; + }); + return fieldMap; +} + +#pragma mark - Initializers + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithRequest:parameters:)) + +- (instancetype)initWithRequest:(OIDTokenRequest *)request + parameters:(NSDictionary *> *)parameters { + self = [super init]; + if (self) { + _request = [request copy]; + NSDictionary *> *additionalParameters = + [OIDFieldMapping remainingParametersWithMap:[[self class] fieldMap] + parameters:parameters + instance:self]; + _additionalParameters = additionalParameters; + } + return self; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDTokenRequest *request = + [aDecoder decodeObjectOfClass:[OIDTokenRequest class] forKey:kRequestKey]; + self = [self initWithRequest:request parameters:@{ }]; + if (self) { + [OIDFieldMapping decodeWithCoder:aDecoder map:[[self class] fieldMap] instance:self]; + _additionalParameters = [aDecoder decodeObjectOfClasses:[OIDFieldMapping JSONTypes] + forKey:kAdditionalParametersKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [OIDFieldMapping encodeWithCoder:aCoder map:[[self class] fieldMap] instance:self]; + [aCoder encodeObject:_request forKey:kRequestKey]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, accessToken: \"%@\", accessTokenExpirationDate: %@, " + "tokenType: %@, idToken: \"%@\", refreshToken: \"%@\", " + "scope: \"%@\", additionalParameters: %@, request: %@>", + NSStringFromClass([self class]), + (void *)self, + [OIDTokenUtilities redact:_accessToken], + _accessTokenExpirationDate, + _tokenType, + [OIDTokenUtilities redact:_idToken], + [OIDTokenUtilities redact:_refreshToken], + _scope, + _additionalParameters, + _request]; +} + +#pragma mark - + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.h new file mode 100644 index 00000000..fda89854 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.h @@ -0,0 +1,67 @@ +/*! @file OIDTokenUtilities.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Provides data encoding/decoding methods, random string generators, etc. + */ +@interface OIDTokenUtilities : NSObject + +/*! @internal + @brief Unavailable. This class should not be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Base64url-nopadding encodes the given data. + @param data The input data. + @return The base64url encoded data as a NSString. + @discussion Base64url-nopadding is used in several identity specs such as PKCE and + OpenID Connect. + */ ++ (NSString *)encodeBase64urlNoPadding:(NSData *)data; + +/*! @brief Generates a URL-safe string of random data. + @param size The number of random bytes to encode. NB. the length of the output string will be + greater than the number of random bytes, due to the URL-safe encoding. + @return Random data encoded with base64url. + */ ++ (nullable NSString *)randomURLSafeStringWithSize:(NSUInteger)size; + +/*! @brief SHA256 hashes the input string. + @param inputString The input string. + @return The SHA256 data. + */ ++ (NSData *)sha256:(NSString *)inputString; + +/*! @brief Truncated intput string after first 6 characters followed by ellipses + @param inputString The input string. + @return Truncated string. + */ ++ (nullable NSString *)redact:(nullable NSString *)inputString; + +/*! @brief Form url encode the input string by applying application/x-www-form-urlencoded algorithm + @param inputString The input string. + @return The encoded string. + */ ++ (NSString*)formUrlEncode:(NSString*)inputString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.m new file mode 100644 index 00000000..3280c856 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.m @@ -0,0 +1,89 @@ +/*! @file OIDTokenUtilities.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDTokenUtilities.h" + +#import + +/*! @brief String representing the set of characters that are allowed as is for the + application/x-www-form-urlencoded encoding algorithm. + */ +static NSString *const kFormUrlEncodedAllowedCharacters = + @" *-._0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +@implementation OIDTokenUtilities + ++ (NSString *)encodeBase64urlNoPadding:(NSData *)data { + NSString *base64string = [data base64EncodedStringWithOptions:0]; + // converts base64 to base64url + base64string = [base64string stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; + base64string = [base64string stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; + // strips padding + base64string = [base64string stringByReplacingOccurrencesOfString:@"=" withString:@""]; + return base64string; +} + ++ (nullable NSString *)randomURLSafeStringWithSize:(NSUInteger)size { + NSMutableData *randomData = [NSMutableData dataWithLength:size]; + int result = SecRandomCopyBytes(kSecRandomDefault, randomData.length, randomData.mutableBytes); + if (result != 0) { + return nil; + } + return [[self class] encodeBase64urlNoPadding:randomData]; +} + ++ (NSData *)sha256:(NSString *)inputString { + NSData *verifierData = [inputString dataUsingEncoding:NSUTF8StringEncoding]; + NSMutableData *sha256Verifier = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(verifierData.bytes, (CC_LONG)verifierData.length, sha256Verifier.mutableBytes); + return sha256Verifier; +} + ++ (NSString *)redact:(NSString *)inputString { + if (inputString == nil) { + return nil; + } + switch(inputString.length){ + case 0: + return @""; + case 1 ... 8: + return @"[redacted]"; + case 9: + default: + return [[inputString substringToIndex:6] stringByAppendingString:@"...[redacted]"]; + } +} + ++ (NSString*)formUrlEncode:(NSString*)inputString { + // https://www.w3.org/TR/html5/sec-forms.html#application-x-www-form-urlencoded-encoding-algorithm + // Following the spec from the above link, application/x-www-form-urlencoded percent encode all + // the characters except *-._A-Za-z0-9 + // Space character is replaced by + in the resulting bytes sequence + if (inputString.length == 0) { + return inputString; + } + NSCharacterSet *allowedCharacters = + [NSCharacterSet characterSetWithCharactersInString:kFormUrlEncodedAllowedCharacters]; + // Percent encode all characters not present in the provided set. + NSString *encodedString = + [inputString stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters]; + // Replace occurences of space by '+' character + return [encodedString stringByReplacingOccurrencesOfString:@" " withString:@"+"]; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.h new file mode 100644 index 00000000..054b11ea --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.h @@ -0,0 +1,93 @@ +/*! @file OIDURLQueryComponent.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class OIDAuthorizationRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief If set to YES, will force the iOS 7-only code for @c OIDURLQueryComponent to be used, + even on non-iOS 7 devices and simulators. Useful for testing the iOS 7 code paths on the + simulator. Defaults to NO. + */ +extern BOOL gOIDURLQueryComponentForceIOS7Handling; + +/*! @brief A utility class for creating and parsing URL query components encoded with the + application/x-www-form-urlencoded format. + @description Supports application/x-www-form-urlencoded encoding and decoding, specifically + '+' is replaced with space before percent decoding. For encoding, simply percent encodes + space, as this is valid application/x-www-form-urlencoded. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2 + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + @see https://tools.ietf.org/html/rfc6749#appendix-B + @see https://url.spec.whatwg.org/#urlencoded-parsing + */ +@interface OIDURLQueryComponent : NSObject + +/*! @brief The parameter names in the query. + */ +@property(nonatomic, readonly) NSArray *parameters; + +/*! @brief The parameters represented as a dictionary. + @remarks All values are @c NSString except for parameters which contain multiple values, in + which case the value is an @c NSArray *. + */ +@property(nonatomic, readonly) NSDictionary *> *dictionaryValue; + +/*! @brief Creates an @c OIDURLQueryComponent by parsing the query string in a URL. + @param URL The URL from which to extract a query component. + */ +- (nullable instancetype)initWithURL:(NSURL *)URL; + +/*! @brief The value (or values) for a named parameter in the query. + @param parameter The parameter name. Case sensitive. + @return The value (or values) for a named parameter in the query. + */ +- (NSArray *)valuesForParameter:(NSString *)parameter; + +/*! @brief Adds a parameter value to the query. + @param parameter The name of the parameter. Case sensitive. + @param value The value to add. + */ +- (void)addParameter:(NSString *)parameter value:(NSString *)value; + +/*! @brief Adds multiple parameters with associated values to the query. + @param parameters The parameter name value pairs to add to the query. + */ +- (void)addParameters:(NSDictionary *)parameters; + +/*! @param URL The URL to add the query component to. + @return The original URL with the query component replaced by the parameters from this query. + */ +- (NSURL *)URLByReplacingQueryInURL:(NSURL *)URL; + +/*! @brief Builds an x-www-form-urlencoded string representing the parameters. + @return The x-www-form-urlencoded string representing the parameters. + */ +- (NSString *)URLEncodedParameters; + +/*! @brief A NSMutableCharacterSet containing allowed characters in URL parameter values (that is + the "value" part of "?key=value"). This has less allowed characters than + @c URLQueryAllowedCharacterSet, as the query component includes both the key & value. + */ ++ (NSMutableCharacterSet *)URLParamValueAllowedCharacters; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.m new file mode 100644 index 00000000..07050c90 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.m @@ -0,0 +1,219 @@ +/*! @file OIDURLQueryComponent.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDURLQueryComponent.h" + +BOOL gOIDURLQueryComponentForceIOS7Handling = NO; + +/*! @brief String representing the set of characters that are valid for the URL query + (per @ NSCharacterSet.URLQueryAllowedCharacterSet), but are disallowed in URL query + parameters and values. + */ +static NSString *const kQueryStringParamAdditionalDisallowedCharacters = @"=&+"; + +@implementation OIDURLQueryComponent { + /*! @brief A dictionary of parameter names and values representing the contents of the query. + */ + NSMutableDictionary *> *_parameters; +} + +- (nullable instancetype)init { + self = [super init]; + if (self) { + _parameters = [NSMutableDictionary dictionary]; + } + return self; +} + +- (nullable instancetype)initWithURL:(NSURL *)URL { + self = [self init]; + if (self) { + if (@available(iOS 8.0, macOS 10.10, *)) { + // If NSURLQueryItem is available, use it for deconstructing the new URL. (iOS 8+) + if (!gOIDURLQueryComponentForceIOS7Handling) { + NSURLComponents *components = + [NSURLComponents componentsWithURL:URL resolvingAgainstBaseURL:NO]; + // As OAuth uses application/x-www-form-urlencoded encoding, interprets '+' as a space + // in addition to regular percent decoding. https://url.spec.whatwg.org/#urlencoded-parsing + components.percentEncodedQuery = + [components.percentEncodedQuery stringByReplacingOccurrencesOfString:@"+" + withString:@"%20"]; + // NB. @c queryItems are already percent decoded + NSArray *queryItems = components.queryItems; + for (NSURLQueryItem *queryItem in queryItems) { + [self addParameter:queryItem.name value:queryItem.value]; + } + return self; + } + } + + // Fallback for iOS 7 + NSString *query = URL.query; + // As OAuth uses application/x-www-form-urlencoded encoding, interprets '+' as a space + // in addition to regular percent decoding. https://url.spec.whatwg.org/#urlencoded-parsing + query = [query stringByReplacingOccurrencesOfString:@"+" withString:@"%20"]; + + NSArray *queryParts = [query componentsSeparatedByString:@"&"]; + for (NSString *queryPart in queryParts) { + NSRange equalsRange = [queryPart rangeOfString:@"="]; + if (equalsRange.location == NSNotFound) { + continue; + } + NSString *name = [queryPart substringToIndex:equalsRange.location]; + name = name.stringByRemovingPercentEncoding; + NSString *value = [queryPart substringFromIndex:equalsRange.location + equalsRange.length]; + value = value.stringByRemovingPercentEncoding; + [self addParameter:name value:value]; + } + return self; + } + return self; +} + +- (NSArray *)parameters { + return _parameters.allKeys; +} + +- (NSDictionary *> *)dictionaryValue { + // This method will flatten arrays in our @c _parameters' values if only one value exists. + NSMutableDictionary *> *values = [NSMutableDictionary dictionary]; + for (NSString *parameter in _parameters.allKeys) { + NSArray *value = _parameters[parameter]; + if (value.count == 1) { + values[parameter] = [value.firstObject copy]; + } else { + values[parameter] = [value copy]; + } + } + return values; +} + +- (NSArray *)valuesForParameter:(NSString *)parameter { + return _parameters[parameter]; +} + +- (void)addParameter:(NSString *)parameter value:(NSString *)value { + NSMutableArray *parameterValues = _parameters[parameter]; + if (!parameterValues) { + parameterValues = [NSMutableArray array]; + _parameters[parameter] = parameterValues; + } + [parameterValues addObject:value]; +} + +- (void)addParameters:(NSDictionary *)parameters { + for (NSString *parameterName in parameters.allKeys) { + [self addParameter:parameterName value:parameters[parameterName]]; + } +} + +/*! @brief Builds a query items array that can be set to @c NSURLComponents.queryItems + @discussion The parameter names and values are NOT URL encoded. + @return An array of unencoded @c NSURLQueryItem objects. + */ +- (NSMutableArray *)queryItems NS_AVAILABLE(10.10, 8.0) { + NSMutableArray *queryParameters = [NSMutableArray array]; + for (NSString *parameterName in _parameters.allKeys) { + NSArray *values = _parameters[parameterName]; + for (NSString *value in values) { + NSURLQueryItem *item = [NSURLQueryItem queryItemWithName:parameterName value:value]; + [queryParameters addObject:item]; + } + } + return queryParameters; +} + ++ (NSMutableCharacterSet *)URLParamValueAllowedCharacters { + // Starts with the standard URL-allowed character set. + NSMutableCharacterSet *allowedParamCharacters = + [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; + // Removes additional characters we don't want to see in the query component. + [allowedParamCharacters removeCharactersInString:kQueryStringParamAdditionalDisallowedCharacters]; + return allowedParamCharacters; +} + +/*! @brief Builds a query string that can be set to @c NSURLComponents.percentEncodedQuery + @discussion This string is percent encoded, and shouldn't be used with + @c NSURLComponents.query. + @return An percentage encoded query string. + */ +- (NSString *)percentEncodedQueryString { + NSMutableArray *parameterizedValues = [NSMutableArray array]; + + // Starts with the standard URL-allowed character set. + NSMutableCharacterSet *allowedParamCharacters = [[self class] URLParamValueAllowedCharacters]; + + for (NSString *parameterName in _parameters.allKeys) { + NSString *encodedParameterName = + [parameterName stringByAddingPercentEncodingWithAllowedCharacters:allowedParamCharacters]; + + NSArray *values = _parameters[parameterName]; + for (NSString *value in values) { + NSString *encodedValue = + [value stringByAddingPercentEncodingWithAllowedCharacters:allowedParamCharacters]; + NSString *parameterizedValue = + [NSString stringWithFormat:@"%@=%@", encodedParameterName, encodedValue]; + [parameterizedValues addObject:parameterizedValue]; + } + } + + NSString *queryString = [parameterizedValues componentsJoinedByString:@"&"]; + return queryString; +} + +- (NSString *)URLEncodedParameters { + // If NSURLQueryItem is available, uses it for constructing the encoded parameters. (iOS 8+) + if (@available(iOS 8.0, macOS 10.10, *)) { + if (!gOIDURLQueryComponentForceIOS7Handling) { + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.queryItems = [self queryItems]; + NSString *encodedQuery = components.percentEncodedQuery; + // NSURLComponents.percentEncodedQuery creates a validly escaped URL query component, but + // doesn't encode the '+' leading to potential ambiguity with application/x-www-form-urlencoded + // encoding. Percent encodes '+' to avoid this ambiguity. + encodedQuery = [encodedQuery stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; + return encodedQuery; + } + } + + // else, falls back to building query string manually (iOS 7) + return [self percentEncodedQueryString]; +} + +- (NSURL *)URLByReplacingQueryInURL:(NSURL *)URL { + NSURLComponents *components = + [NSURLComponents componentsWithURL:URL resolvingAgainstBaseURL:NO]; + + // Replaces encodedQuery component + NSString *queryString = [self URLEncodedParameters]; + components.percentEncodedQuery = queryString; + + NSURL *URLWithParameters = components.URL; + return URLWithParameters; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, parameters: %@>", + NSStringFromClass([self class]), + (void *)self, + _parameters]; +} + +@end diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.h b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.h new file mode 100644 index 00000000..28e91169 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.h @@ -0,0 +1,40 @@ +/*! @file OIDURLSessionProvider.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief A NSURLSession provider that allows clients to provide custom implementation + for NSURLSession + */ +@interface OIDURLSessionProvider : NSObject + +/*! @brief Obtains the current @c NSURLSession; using the +[NSURLSession sharedSession] if + no custom implementation is provided. + @return NSURLSession object to be used for making network requests. + */ ++ (NSURLSession *)session; + +/*! @brief Allows library consumers to change the @c NSURLSession instance used to make + network requests. + @param session The @c NSURLSession instance that should be used for making network requests. + */ ++ (void)setSession:(NSURLSession *)session; +@end +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.m b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.m new file mode 100644 index 00000000..fca17fe7 --- /dev/null +++ b/MyExperiences copy/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.m @@ -0,0 +1,39 @@ +/*! @file OIDURLSessionProvider.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "OIDURLSessionProvider.h" + +NS_ASSUME_NONNULL_BEGIN + +static NSURLSession *__nullable gURLSession; + +@implementation OIDURLSessionProvider + ++ (NSURLSession *)session { + if (!gURLSession) { + gURLSession = [NSURLSession sharedSession]; + } + return gURLSession; +} + ++ (void)setSession:(NSURLSession *)session { + NSAssert(session, @"Parameter: |session| must be non-nil."); + gURLSession = session; +} +@end +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/Firebase/CoreOnly/Sources/Firebase.h b/MyExperiences copy/Pods/Firebase/CoreOnly/Sources/Firebase.h new file mode 100755 index 00000000..e5049ca4 --- /dev/null +++ b/MyExperiences copy/Pods/Firebase/CoreOnly/Sources/Firebase.h @@ -0,0 +1,172 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#if !defined(__has_include) + #error "Firebase.h won't import anything if your compiler doesn't support __has_include. Please \ + import the headers individually." +#else + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #if !__has_include() + #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #warning "FirebaseAnalytics.framework is not included in your target. Please add \ +`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \ +Firebase Dynamic Links works as intended." + #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #endif + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #if !__has_include() + #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #warning "FirebaseAnalytics.framework is not included in your target. Please add \ +`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \ +Firebase In App Messaging works as intended." + #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #endif + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #if !__has_include() + #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #warning "FirebaseAnalytics.framework is not included in your target. Please add \ +`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \ +Firebase Messaging works as intended." + #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #endif +#endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #if !__has_include() + #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #warning "FirebaseAnalytics.framework is not included in your target. Please add \ +`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \ +Firebase Performance works as intended." + #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #endif + #endif + + #if __has_include() + #import + #if !__has_include() + #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #warning "FirebaseAnalytics.framework is not included in your target. Please add \ +`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \ +Firebase Remote Config works as intended." + #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING + #endif + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + + #if __has_include() + #import + #endif + +#endif // defined(__has_include) diff --git a/MyExperiences copy/Pods/Firebase/CoreOnly/Sources/module.modulemap b/MyExperiences copy/Pods/Firebase/CoreOnly/Sources/module.modulemap new file mode 100755 index 00000000..3685b54a --- /dev/null +++ b/MyExperiences copy/Pods/Firebase/CoreOnly/Sources/module.modulemap @@ -0,0 +1,4 @@ +module Firebase { + export * + header "Firebase.h" +} \ No newline at end of file diff --git a/MyExperiences copy/Pods/Firebase/LICENSE b/MyExperiences copy/Pods/Firebase/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/Firebase/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/Firebase/README.md b/MyExperiences copy/Pods/Firebase/README.md new file mode 100644 index 00000000..d778205f --- /dev/null +++ b/MyExperiences copy/Pods/Firebase/README.md @@ -0,0 +1,311 @@ +[![Version](https://img.shields.io/cocoapods/v/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) + +[![Actions Status][gh-abtesting-badge]][gh-actions] +[![Actions Status][gh-auth-badge]][gh-actions] +[![Actions Status][gh-core-badge]][gh-actions] +[![Actions Status][gh-crashlytics-badge]][gh-actions] +[![Actions Status][gh-database-badge]][gh-actions] +[![Actions Status][gh-datatransport-badge]][gh-actions] +[![Actions Status][gh-dynamiclinks-badge]][gh-actions] +[![Actions Status][gh-firebasepod-badge]][gh-actions] +[![Actions Status][gh-firestore-badge]][gh-actions] +[![Actions Status][gh-functions-badge]][gh-actions] +[![Actions Status][gh-inappmessaging-badge]][gh-actions] +[![Actions Status][gh-interop-badge]][gh-actions] +[![Actions Status][gh-messaging-badge]][gh-actions] +[![Actions Status][gh-remoteconfig-badge]][gh-actions] +[![Actions Status][gh-storage-badge]][gh-actions] +[![Actions Status][gh-symbolcollision-badge]][gh-actions] +[![Actions Status][gh-zip-badge]][gh-actions] +[![Travis](https://travis-ci.org/firebase/firebase-ios-sdk.svg?branch=master)](https://travis-ci.org/firebase/firebase-ios-sdk) + +# Firebase Apple Open Source Development + +This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics, +FirebasePerformance, and FirebaseML. + +The repository also includes GoogleUtilities source. The +[GoogleUtilities](GoogleUtilities/README.md) pod is +a set of utilities used by Firebase and other Google products. + +Firebase is an app development platform with tools to help you build, grow and +monetize your app. More information about Firebase can be found at +[https://firebase.google.com](https://firebase.google.com). + +## Installation + +See the three subsections for details about three different installation methods. +1. [Standard pod install](README.md#standard-pod-install) +1. [Installing from the GitHub repo](README.md#installing-from-github) +1. [Experimental Carthage](README.md#carthage-ios-only) + +### Standard pod install + +Go to +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Installing from GitHub + +For releases starting with 5.0.0, the source for each release is also deployed +to CocoaPods master and available via standard +[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod). + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See +[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All of the official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +``` +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +``` + +To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do: + +``` +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution are at +[Carthage](Carthage.md). + +### Rome + +Instructions for installing binary frameworks via +[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md). + +### Using Firebase from a Framework or a library + +[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md) + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + + * Xcode 10.3 (or later) + * CocoaPods 1.7.2 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self contained Xcode project. See +[Firestore/README.md](Firestore/README.md). + +### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +### Adding a New Firebase Pod + +See [AddNewPod.md](AddNewPod.md). + +### Managing Headers and Imports + +See [HeadersImports.md](HeadersImports.md). + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh) +before creating a PR. + +Travis will verify that any code changes are done in a style compliant way. Install +`clang-format` and `swiftformat`. +These commands will get the right versions: + +``` +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb +``` + +Note: if you already have a newer version of these installed you may need to +`brew switch` to this version. + +To update this section, find the versions of clang-format and swiftformat.rb to +match the versions in the CI failure logs +[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula). + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +#### Viewing Code Coverage (Deprecated) + +First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`. + +After running the `AllUnitTests_iOS` scheme in Xcode, execute +`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output` +at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results. + +### Running Sample Apps +In order to run the sample apps and integration tests, you'll need valid +`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist +files without real values, but can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g. `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file +(e.g. in [Example/Database/App/](Example/Database/App/)); + +Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require +special Apple capabilities, and you will have to change the sample app to use a unique bundle +identifier that you can control in your own Apple Developer account. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase Auth + +If you're doing specific Firebase Auth development, see +[the Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to +`Example/Database/App/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[FIRStorageIntegrationTests.m](FirebaseStorage/Tests/Integration/FIRStorageIntegrationTests.m). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to actually test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account, and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications, and will not receive push notifications. +In order to receive push notifications, you'll have to follow the steps above and run the app on a +physical device. + +## Community Supported Efforts + +We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are +very grateful! We'd like to empower as many developers as we can to be able to use Firebase and +participate in the Firebase community. + +### tvOS, macOS, watchOS and Catalyst +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on +tvOS, macOS, watchOS and Catalyst. + +For tvOS, checkout the [Sample](Example/tvOSSample). +For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the +[Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this +repository is actively developed primarily for iOS. While we can catch basic unit test issues with +Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you +encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the app +has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +To install, add a subset of the following to the Podfile: + +``` +pod 'Firebase/ABTesting' # No watchOS support yet +pod 'Firebase/Auth' # No watchOS support yet +pod 'Firebase/Crashlytics' # No watchOS support yet +pod 'Firebase/Database' # No watchOS support yet +pod 'Firebase/Firestore' # No watchOS support yet +pod 'Firebase/Functions' # No watchOS support yet +pod 'Firebase/Messaging' +pod 'Firebase/RemoteConfig' # No watchOS support yet +pod 'Firebase/Storage' +``` + +#### Additional Catalyst Notes + +* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability` +to Build Settings. +* FirebaseFirestore requires signing the +[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +iOS SDK. + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg +[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg +[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg +[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg +[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg +[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg +[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg +[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg +[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg +[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg +[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg +[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg +[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg +[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg +[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg +[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector new file mode 100755 index 0000000000000000000000000000000000000000..dd943818e67f52723d4ae33a14bca6787d4a0fe7 GIT binary patch literal 882528 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

GwXbZl!G=ofp3 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�l?j}&1#sm9vl?rr z6!|6MPb@9g?+M^S0u}3Qn?L3mA2tPG2GH3QP+|+fvY;3PSY|+}N+JT%6@b~(I$J1&`AJ_633>g}mrKKfSO4(U>@UB2 z`_Etf>*b}5Kfe9t*Dw6)<;~yQ_NPk+UQYYxORsNut2|Aq^;4>6SyR=OZXm99mSTDM zgp%Ttw~4?B8~sVePZg6LQ34eE^o0W-Fmctd9+|ZlhFpuMS+VrBk<)Cgi?k0CP$y|u z)UZ3!!mPYUCuk*Q_fHz_HY#&b4g-q!=Q%}GXtg~2)sbmE40vP4Z`8%VG+ta8*Tty!EZ-;TlHyI4HTswu*# zP~^uop{-`bsiBY*CQx8{8 z<&3;DbbV&Pck==!ahM61K7 ziJKP~EXAq@Lqa(22pp}z*yjIc17?jWNsZ$Fq1MD5DT!FN>}b6enSQ->${+lu>}$0g z&#x(3R#RM5iNUNKLt0o(X;aOJ(~Gbo=JfPJ1J@YmZNZqA$Jxf=76TXLXE63uM7DRJ zua9`&6uByF0TvRIcUDe0l^!h%f)2MlpuBNG+LeY7dLZ&XasMTXw=M2BadbZw715dH zzj#|^;;Ggt`%-R$L%u#T^+L*&T9B>Ve=`^*t=Ry3&@EsXYphuQuIR1a!=%|hrsWK# z2&t5lJJW8yd!bb4T@z8VY|X;l)%@wRxcf<&4cU2F#Tg~}n{v}rjT67&PQU{O_L$h%nD~h?6LF7tOkicgR(rviK)*>_?WLe5wWgboSyH0H z<18l{PFbyvVU11O&z`+}Zuz;lPrQHji3?iU%SJF zD*rUSt~J%p-{MUcCFWf4KC!Dk-)MR* zcsg%ADzATr^lLZTS`%X*F+fRIG1#Zj65_;;!E$+vg6bu$>7%H!AS^)92e~Shf!| zwD{2lX|WC2@lnc*;Z>POo0mDQ7Hd-T&hynaOIzlnSy@|$Rt^}DZ11>` z*_Kr4YIET_v46g&dVCWCab(%l?_Uo$PZxfs??bmM%I|Hkc$#yEDfZN;&_c!Rvj51c zz`)@!(0{qT-sG~4wggW~A3Dx7Aje*qe%NGHj^#~Lwugl-2;6G=+d%YwSvK_=4>z~e zCVx_83#+ZTW_y?w@`@BxK_Tb8)#2t;kvDFMDxqfwD;G`=G@@jqahW`)8u6#mAc z2h0QDXyQ4dvHTUkL-`vj;sY_H8S%L(q&Gh~+L&Jv*N2`s;@2Txwns;>b##^KgFz?K z_qsyb2Ztp;;~Mtm;6&4lu4{G<$%}f)b={sJwdY@QjW{T7l`FZp?|lI2@Lj?twl`jb z8&D3m)9I2TRLhgTg;B7R)p#5NH4m!+OL;A?uwZv&stHry_Z{J%;4 z98bOa!N&|lq(^lZ-*6ZDCG4R-vK`9-{WMt zHGCHMV?cXwj+T7-p$dG?BDfcnztd@W?!%zZMuAU%X#A(ZXTCRsujM;*EbNeYrw{%O z@M*_<@HM|N-*>L6!@$kKLQ_7uRS&p5GzlBPkpqL`03!& z&KB@BJITKXe9~|E=wAmu#L8tKJwE`SdO~nL^?LS#Pk-^CpM-zF{^+~ae)#c?GcwD8V5YI8?yXWamNr_Ee@57o-mPjq0 zIqPYd_PTWyAfC}GTbo;6g!jPVAq0bR^?bZbO|}w~i?w*bi{Gda89}R;GB)LPeF?R*UEu6F|BTk(vF=;L&Qs^?qx44*uN z`+C+sqpC(9_j*#&*8rn>hDS3{1HVZXR58A_hDm!rN@~pQZI3}UMADv}mFUsbf7*K$ z`>mu`eZ8W5aiUHyqrbqJiw6bHN2$*Vk>(gYP%#M}_mi8^r``Y_4#7(U?SFoK@4nsDl^h&cHDFqhc}DfX8gr!|b>GT!a|c~8|NrY`w7ws-)VM%M_D4yzdI!=NmL z7@vcdBE+09C>kvwh2CbA@~-_M&v$!9x#9sKJ}&A5q=_oE<=KXK5fT6~f&&g-r5F*Wwa z`A#5>zXcI3&bq9{uh(H-((x(RF#7$rBXsy5>hR*3V$1-=91euxBvIw-rdDM1m>+Uj z?#1NzP3BeSO#;+=cCb7H|Tm=$YVBDH5#GcxW}pAub|%dfp@;$Ax@IpfeW@tH?~?K}F7BrhzeV)LOw#K> z4OBlrB_+PkQhyB{SI}P+K!^T7cj7&uW0hWs`pRyvSn0e$eScOap6+D2(lV10(=8S; zx!p5c`?!p+j?5d?va}%~bzE3)66d-zf1ON1VhPeqk4#1z*TeTEw*t0BR z+o}A(41GL3d2w<#elgNo;E$sTsvS8PG*TcQ*u#!&zEItp$X7=uDs(fXZ5Rxg_vVcz zaqqyJ01;Uh?@P;lb=YFXJD!vV49wIKzsaQj=A%=h_bGZGtRH&%V-|F99&w0+yY4XX zhxX?DUOugWjxk8^$<=juo#I=T-EnxY7<7bAQOi<_vV2!(52G0wURMZ-ua2p>9(j=L zy-n4TcE8%@1X%u){wOLgEG^`YEngkGp(7C3(A!lVRnS3S4C!%gMg0&u_z5Ck9ebez z(-0+G>evAts4hl2^4Dh-L(;pB?Sl@^n`}~t0QvmG{)Lhf9naSe_BkvI5B>F|E!v^4 zA4dK-EXy)p+OboX1?hd;+}eWdf)XPg%~FS5>ey|lqyN1aZP4Kyj$bXIgT6I7& zylk$o`EE3F>Uv=YI^nJtmVoPN!@{}psI~4xY>G(t9Ff#9Q1vzMU{bv#9Xk@bUYLUv zi#$IS;?O0YABl*%$wSLc-92(IQ&wLAJl#_&wYAozcDSoMp{*{}Y56RHJ!Y16w%A>1FujUw%bGtMkjXQh}}2Wko=H|hA?)_U3rAS>5wAz|NI|K z`XOV-$$J+ucjYmnHe(kLknYrQDmdu{H#2t3o!UwE0TNp}w{?Y7{RuT`+vg!wze8A$ z%Q?5RF0g)XdtI#i`^Qkv-7lY1^X9IcKxjADg+?F8CL6YN&v(4)vlu(>t~{;UV0F*E zj0D(h-Gl0201~c2!n)K(cjZ8|zPi+%?gK&N5rGYhC^^pS=}z5A=rl6K zB~28GcDUWw0P8Mm1jr&Tnk;gd7a1&&JE_l)QIzE$|6o~mP-7>fm4lG8+kFY0oaVB# z`~=kBA6#h$Pq zlp|5yVqE#u?aX<-(C6CL98$#vxqF+FPEqQ%EoYe8P+wb*xp7^65y*O1{b!!IhqzU% zI=-T4Dgjd)SvEEoxb6h_s^?!}>=@0CN9Cm(3E5Ih)RSIRBV)(i+h~xcqYAv*)J6g~ zQj9CH4xwvHqY_f}F3;R#D)h0JfGROqsI66|%Jiol|}4 zK42{M+gPy>Lpo7gL^{?Mn!rlsaWZ`>Yt6RL*xJjsQ`^l_>u7{Bqw5%z4Q?6dQ{1qcV0R?tg4uL;V$wC=d)6)C_NXs%n) zxyZeuqw7G!I1D%k3T&|O2~}Q&3c?>Nmn`i%u%lb*>Xv?j>QlGHv+eV`vJ0hw^)EL9 z^}+QR$Le2B6A5OC|3y?fyF1gsu1QNgNs`7ed0;1C9K95?t?CVQZFvco-+1;^uGj$!cn+!v z&L-;qNw>qdT?h6Eh2>QEeF4CH=m8b!F1sLV(|1)3OFhMEgx6%Xi0X$AZNu$7V&M1- z?xM>9V=AC^$2^6&*P*t?Tgbqu#s>h<>Z}+DENYwM0E4y@2=C!j7=)pcjc2D^H*F(!L7Iu-ocPPb2#QdM4||O3_<_n z3PyuwdPsGTg}s|_(}f|6J%51|rXHnZUIc^22=DT_8^!Y! zlL7k#!>Q4pM;T(%@p94S)E)DIZ=e`96(STHm(lRmZPo4tVeWKtpqQcs9L+3Hdowl&wiUH6ZWs`I$o?rmH+ zaJG?-u)f-Z-<0aMEf(=FM4a=2`szR!RwoAW`s%Z6Z(=;HuMQLZa$xFK?5Qhja#yFp z1k7yQ5AH$4UA>p&wq*dgtM>`f4tMoI5ovT+9}p2eYitnUhszskjimem4JmO&1xgMZX zlKN|1E9~Ce_53NoU>dH!keC;Fo>n7EJWXnZN`9awbF(`@%deKC|CCfQ8)G-4&c+HL z(Z(P3E#3-ckwOcNbzDr2qgRQ6<^L=u?&)VzHyYBS%1rs~2G z<~>DVc(i*(r{{4*@tO%*5n!jInW1IIYnBlSY2!e}Q~ z^eG_S?voVCGQxm|%zU*vW@Ns-jiR0%Cb^LVi164QAQt$Ss>GOm`|M?+w96mJHJnenRA%uHVTzxiP+h;e++7Z=|B;8tVlNXy zi|3q>qdv6?3Tz{gTLkx={A@ z2ciq$%HTcGV_`;t63!CBzp6rc_v?3{K4?Va6fUy3onp@LvcTZQCz>Eo3ZB#n#NukI zm`LcFvkM5dIj?7|mG_MJTfVy{1dlGbANo1^D19SM2a1NC=1g!!C*C^auK6V~oV;O4 zYo``5!yGI0vDJhlw(ZZQbKNz+l1S7B3jDm_FW+b8?wS+;+*>-ugjqHOb~WcH4v((; zho=p(OT3rtt{E;2{D89q+4>GZ=zi#99cP!+dq69OXjvljYE`G_ekSs@ET2MAj0~wk zSf+L~S`(#ZPN^l4T2LzJuUC7TvEbCN=y2DJf}OmPTGKfZGwT%3@s!J=Q%LDVpw!pQ z$NZ-*b{QYXWzBzJZvnIm!25Q@pNs9b5< zEY-ps#zN+P`B~g0aJ!FimBEXIJEaf}VRGSJ6Jy8fR$O*h-p%QpcFm_odoFq)YNa*p zh*kYLr0N}B_SC?7XBci!Q%@@)c>58OyB9LKtOvg&U+CY(7#216Qi_|B;_?d{YP^^& zjA6C*6pfVkS($CF7jX|`t?Y0YFb3IdgtA+{ovam|+x}cOpN6O1I zF^F>QzA}ni<3(&?3?{++Vn!jnkKq=~W*o5?$yYSj`5jMDNAeVPB(Isk{x1bTx@@D~ z6f2j3Vom3XVcL{XIa1pMC6>r3;qLo|XDs9)LloE~#5VT~TU|;t%)@QD%Wl{0$d$!= z_dU2H#m4Aa5f#bb5K-aSBO)ps`vRk?WA`H3({&Y>x1%PA=6RQUOQ8F)uW!X7(vNLt zL+G~8OXqXo+&=~*I+m<;bN71kg$nIwrh6pyW!>?vb>Zpm)V*E%ehcstPqL7hmwFOa zh}-Yduf@pFtK%{Lu4xffuGxyUn9fHBM8&2{#3aIbo|7;9Mkc7PkXwRC6Q z+=kdLw~NlIOWh$6a~rWZ3Wj#Bpt{}_kZ$vHo-`ay`Hr zqpk;*Lx?80B;8$Rk=1%OShBv~E~27l#)+t?uj52iG|~t}E03DhAJV72t|*F+hv9~hmTibg z;FGP;`uFq9R%m@6QLk3rU2*(ug_*I{ec=+4eWF3A(B1CR-(Y##E`wYIxqVUNuef-F$`EwFu&=l7YDYNEYrMoKkfVU2!_A3#3(+pjucQe`BhxVNb-fVKqEw7&|`SJbSV9J~gu z@3Kw3Rhl8!sXqq-mjC2NOhD>ue(EpmSKow)4C^QrCHx*^sqOVOd{PQU^g>p7A8IDtZN#pY9XlCU>R@0+H-CH_Pd98J2o$j)BaS>qAENaHg zARO;=q$*5!z;%#|i*_?ZxOub?by9Slh>EF%1ySujY_FkRyU*~qx0yjZwY7_Ahx_G6 za24GL76#+Lde`BIknsMpn9UpzWT(3lU$@4rb502Sf}7BCR`>%-#Wi;e+y%FL9uZQ! z9!z)TLU3YV1J8yt9H)BYeuW2vb2QeFnm42?Ay&Zssq?0&qX@|BU8)pV7G zx~s26gxa1ISU$s1UwsVI5&FNrnlMVMApPJBM>g*xBK6hDoGhz9BVYhjJQ)DFA3PI- zB-P?SJb#B*t%5g3j!@>|JNK530m|J4_@Jk06k_L1Phh%&1M*SIaX=I?MiqYuNS+EEkuV#|aE2 zeAXBpl{iTIMT_TZy)>T!LCx{fL7=$`;X(W`ANjRD^hh5%(uW=m+N`P*`fdb`aaE_yL0i3#6{vm0F#ws`6>|cqIOg_`6_ks z*_C;ymm;!6egDT~1z&9_%vSQ(=9elZx%^T=PQIu_1^O?yOh&`c%_{Cox~i~P{b0*v z0TWG3_hiupDJaQG zd^c;dqBR$CrCsb7CU-Z>|I6N+hc%IG4db1KBtQsZQNn6iMMVgRihyGRsHlLbsJJIA z3Wyk4T}CG%Y$`g42&kw*5pbQT4B|E>fDQuVptzu-1FpD^qv)vPc)wGf&f?tr-tYJP zp6C1T?Z?8?)u(GYTb-(O)$vDt)hlAvKT&bBrz536qqSj#Lg~k_!7@@bB>y)&y>c;8 zYN|+GQA`qSzfSXyU7nGWj>tiTi9pDa=$q)+<;nhu@Zq{BB|TANml9K!_{YVIVV6mK zN-Uy+#%2Yf&|o+pr^K&H1B;xRmOd4)0fVn-p`r=PQ{hQ`+>DGE^>Oz8Se({U;0+|& z18hV^XxarQ#-ya{bpXG|*@_bq_>cxCrNqZg!dn^}|6gSUl@p9)2p0~2s0uIXf0hOG zf}R*GPD}=S8nlYwC%gx=3tBZk1$NG$K_+DhdSOO7?49>lcU#*J#Cu{KOH5NM38vN@ zJXi)Mii=az%O6WjQZOBT|#PA z_&4PNVIa!>Cn`=+psTJMQOh+Z1!w())aA=`Lk!+WoPda#AUDWHh~QKB#Iz}J^!?Pu z!RQW13YJC9np7mhNb%HfVR6edV9-+Y0GXbDj=?zYe=#{~0ZL5M*JBOivUD^=HEQUi zkE)eHecZ&f5WH2|W~*;z}W=ib!r)g)JuW zxW|SwE>n~|BQYg5-h0ewo|Z9$6ep%df)pjj`Xep(*LtEblEh~wF3(8QdURj4KY6(* zPG@)1qLyop&qDTSapIDU)OaMbKtg}aGZs$pz(cHL#HQ={bHEm@x%USTSu;dni!|ep zrtgrW^}{f<_o*JzLrBjcMGV2P#gGm|s)MA2bPLiKNZg?q<^?Gh(oRShA+p4_g)fHb?|H-} zdb#+kJTP)ZL@dD6M7}YH-ef{BDW1PC-w(_5@l``;5(KfIe0VS&8l}y`5_OmaG!DJQ z(_#QN6sPxwrfir$=&ZVvt|rJ=n|~)iG{+!dC|vJm6uQxS8?_2@1jy5IA}Z6Ne_f8Y z$$ALd4v!1WAi@9mh8|g*0{;V}G)nxCM2Y0nmhotd2azvQ`b1ap9)Dcze9NF zLg!5({X_{}^PxR~plgMY^e1b;O zg=y$h0uxAN=S0x90yF3fL91A3kcL)v@YxKqw+Lq(d{~2Q`ci;DbHOBesp-<^1nmPD z(ZvB^dw@~jLjguM7N-}$$cCc)T!4|?MfrySM)nuwHv)`kf#&6C-{LSRXAR(x;U1Z} zI>;LZc^mce8Xzwe@;2$^F^DpP!48H)N`dqpr0tOQLCOL8q4LoDc`ek7=-y1wT`>}H z;l3aKM;F@HiY~OT^q-f8O&kqCAfyuSpxgPxGcobM1~o?m{G(9RF4TU+b2O*^=e$}! z-U}D@F#^l~E#AvEO}v*Mr~cLO>cP0-AtWCIz(es~b^{OpKgD}-QOA36G1J6*DgL*3 zFI!yn;=N2#$9q9%+}S=O;=TOu@!=4FLLFr0e~%A$X#Ib7e7KN7R$$j?F(3W~7ir}v zP6+0K{it&P0=M5`x3Qv8>^#iFwlEeOD7h`_aGdE$gU3pkyV;BS30yq-~xya0d)xmwUU$+y?9o#6_Whb*c*r! z;b_-E(u=5|L`Qq~Rid-AACsbGE0p;VuV+*=B~6*Xst83N%1oettBF2D1S2W}1UxEH zIl}x_DGR^~RzvqeNeOH4&-h(?QJ5@f*gX{ry45a42bcG017ZkeDyotkWm}ksESqBV zWn|J!;Q%ai9%+D_B;pq~1+>6v(@hYKC*WbQEd&d=CJTUr$cut)i-P^Tg8c!mQw285 z0z3Y5)EWT_G}Mb9IKB){9xr0O=%A?&{(h^CUBid-uOT)Lgd2kM%?pG5Av_Kq1qcG* zjQKhQ(0_?IgmuUQuR$mz844v-4(G532S6YlWm7;EemHweux$w?peh)m8=>Rc>qzj_ zuUsAPNZ{Wf8`J)u+mA;sdKPK=5;H~Z$2+3eay(p8Kn@(0{$E~yTf}ySeO8MVfrKz4ZqHruwq7*m)~M`2wwXV@DJqjr%5g3kZyeN!jda7C8kw zd2uDshV@*SkHG&vPN7C9M#xqdh!L{Yg@_SS3^77n!r32wu_JL@;72juM9D)H=ETPm zlo?kor!~U2Y?o3aoWuDej?KvNy*Q3Ub7I2Lh7xv_3Y%U;r4$GTGP(2vJPG%q5-ToZ zQwoA6FuBGq4_p#AxQpI=H#jtB5tbw4IAiX?)+{?ezHLEMxVqqoBF4Dju>2A7UZs>` z*wgEQzwxgB8U8sYcnwHTyC+ z)or4<^gBV7p&=Gk;T&$}8usP;D1QIcTAsKExMrxl@22iW6?re9J>Am*^%$qFDE1v+ z!uxn$ffe^pygbek%}(g79QGggC5G86zSljRTC0=@g7Y~!j)Q3IO?4dpsH^cob=-$y<`+@-yaC97bsg zjbL(JZt)}~4}ZpDij65PlZu&K_e38_)x%5J-eNHV z9s5)~isByTW+(S9i7CXmBhuYA(IR(*aQI7$Mc9v*3Q7HLQ)rPDme%~V;>FnYNfo5@ z!LwS<-qn8 zMCCELGY)u5B3)at>DwsI&=YJ}(#Q!|$FS^-GMuCor?E;GyKy0AmVZo%rDB&_C6th1 z#;l?v%`88D!vw5V{#;4AJu{y|XGQ+t1k^phLH-;wuyw`~qOA+;{rDFiGx(Lv)0^$N zaq#|-Va-xX8;gCyrq5{!+zS9P^fm_!N^9k?+tS3&>Y2_<_j3onRMsWtEZfX=&pk?^ zUln6cnCvJ8b6;SFDfedN zc4YLx>h5eBrr3PtjE`MFX5sw-L9^>9*Awos!Nq{az2Bg&mBs!kC~9M-+~z5?r(n^L zbo=rfzhfVVr_t|qdq2}`^+>g$qTwxXc z9MrcVvj>wx@u6|n6D9=kU5rt)w!|H0p5ANEEs5{QxQ`w1AbG^hp+(b$TiSg3d=y2( zfr7G8#glH+$kQ>tBWSr;k}@#(rj$aj4&PT{D3)ZF_9~B4uAQ)?!$Xo}UFic*`6U?p z?Ib}BwqZq&Qfe_6V_%7}3=|7**CoZJgP2zB2cq$>CRX_xWAizoGeQiv{_9_0GX`

S!DM@eU=8@#tN|{j&SNeBP5>Eu@IF$6Qs+}qf8OA$O_J%riIHEhjRp6YNS;@fOA0y~&p0>* zarSO^iL#R$gH*49#qJ)ZX*9jX^UCnxixj%M*Wd2ho>=oq&S{oiIqi_w$B~UB%;m%F z|7(eRCR~szp-8zh9uyNZb8yC5#EwP|evzBlWkERox7-f`b_i{}J#&sy=%ATQ3K#!6smCu#Z*3OpHAv8NgK2iNe7%o_!Ig@rI#yO^kKhKi*p(;RO@ z;ok?9^>#@qzB~5bdH}W4*M)4HP~FCRqa+0_U;u3jU9OMsm{}BUbstD~KF>kK7Ows@Ks3$`>wq3iGl_tS?#?orCjeDH4_9KI5E@tuIm`EHFc!U zXV(u+I13H>&vBpVf&UNVJ}I1->w2vcDlNs*fn7aT>qK_og+Igt(RK-S@H&X1iw9^! zQENrx`;E`@jVk%Zl}g(A*TxToEC`bIrik@Q%o=tZ3Xxg{Ne2c=O`zm^0=sJ>J1Dlx z(GCL0qBu4phc3QDYp>lisXfHT>4M0-y;cyD2g3fY6FER6+^ZyqSrsa;&*b4HWX}$= z?dL{_z~fij7vw?)6um2g8{52KwzRp5O}vJ zKV6bPpc5K1B!@gahiof>hBXEh$ovbNyo!STAb90rKB{i6yTN?< zP^3!;SoD^MeCXsJ*6**4A0p3{bzWUBW;*QNe`G5O4;PCjX*gSjb|`8SOt&DalGN@$ zb2bbFriyJ;$2LmFknj*qDq_8daG#33NM=GEEfX9qku>(&Hw)}9_F7#8QGwutAcPQBifUN-#%e8}I z3v;20;IRq_KT5HMX~t(V1O|nmKVEpmDt~3uhCKT&mBVcn1Vpxjxp523>m2P$9N11S z5H4wmQ%*t-Z%lmd+rQQ>F1yqF$1s!e=kGo$^B(TCvFYubVSTIRPj+8-!$Kt(CZtno4Da%AIJ5v9CyW}v z^;NKY>xu<%gJIk*(nr!>=1<#Tw>?^cR#9~L*rFeG zRo^mbWIoob+RGzEs8@BJl-HzJ^?eg#v$=Xzf6Hx`=vCd{6hytLtD5RuFygRY)pp0& zy?RxjG9;V4)vG$fBSfNC_2Fzk${Jm-_YN>Ni_xq4H1}%JB3-W^UI?Pz(p8<~!x-78 zS9SR@wy0j$>+L2%CV%Nwz04y-u2*%HESj=jS9OfNv00K{)gQRmlzLTP`#FeuM^m*# zLbdQAV-oug=8AGI?Gg{M0kP#Cqf%CRt(c2R;2wB>cS|ngBi&OtJ4ZL^Cb#GdZ4lP&ne)@q+EZWQ|aAG#B^#gaW&A8=Q72#uv|EL0jb>{SI zq4-A^F2;pg;PoTd?X#b`1jCt&AUgba{|z2O~c5c9++ z6FwnLE=*{^f={K-qh8zEtV&staT-k39>Z)+~bq0(nB~GC$4OKy>ya9qZREw4X=eO z^(eE}dj3IP!8~)WMkjAGJ)=0v;SiHhO_Yw+G%Me0vvmk&CZ4l6?K*_W&9t&%%%`Pr zEDNv>y32@=84t|M(s3vKplZCy-`lhZEwg1)2Ij5OAw>P4ay6!$bA>Mk)clRP)iXU; z)Lo2`Bv2%X$);uED~*xMC-F5M=^xb~o5y}N+}a!v5c48G(`I`zKj<|hSGLqDZ|xK^ zl@OBtCe?Lg%6T2Rjz8!z&lTL%)$(Ji_*kPjMMtidF%9cPeJ5S`8bSKYZoY!2)Fan+ z)=@F%^Ke5pL9WQT^fGtm8NFuI$;NQ#y}uPZ;(Ud^{E{W4C2${F`=ZX`;$vsp#Wl&9 zE1|if3}AiKGm>3}3`^}$Ad+Hi#XV`z1Xux}O#X;5c_b^C@}Ua~+rL))sIf?oF#K_S ztlrGxN_dJRyjv&U-^5PUQLYaVNLf0B3v%(1CaxYrM`Rz%Q4e9;Uh$7jk$MO#r}eP} zdI*p9iO)3^=^+TG_pwA;1mV(R=>+;+O@}@C zca3T&C|9TT?#QpyL%47N5Ps7j@Rt}`h!$IfSh}i z^1vqH6b?DlIMcMLO@}adQDp%2HyuJwV`GLXrCo>cNdzTm5hQ0VZPf;DxUo=T_@)S* zU<#Lt)wer$*r2>}ope9E8kEK8(V2sUBe`wXSBGgetSG_wu4B$rt@V=sHqbNv^%0%D zct1QnpZm?FNDu`0_d>FGe#3iF`6(Sjl4p88PY)qt0l&iWoX*IeJ1ul1r?|@S76RRe zX7wiJs~+m;{>K?0>qiY)6_nOhy{Wl^yE+8bxeogvErRl~u_;dXgufBpx9I3zm)#U^ z;#x|j61E_eng5F2KG+(5{s&8)ZQn77Rp!7vrbB2M2nd(;5CU1V1DJ!$bS1a~LWc%{ zynC^v1q@Rrzh;bt`wBA2M$KTnJtda7}iC)@Cu`q z^DT6P-TkbFFCwKLquc}2^ObsxYF*h76w{%H@GT&8Xc2fj_uc0swNHIQnv*YjSPY^I zJOs7B^;SW1_I}X~HU#-cFa#+aj(*FD)Af$M(DbfjgSK}8^4kuc@eI9D=*8Id{MXv5 zUPz{Y+fbo8r(?PFBgn*OjZ7#Pnp)y4ukEJ8Fm+7F@~AhIy+)K%IzJ)lqbew;TjL1` z>AvqlCfsx^5B(iDdSAm)kcpS3p_7=xGOgp+_b0e^={ip%@^4dyJ+rn{i%|P7K*-b~ zbTG|tPGZLC36076SL{!2I$|V8Pbu zjO01j6<1V6NjikEt$i%17NKWlK`w6MO7>7W!k`5@6W2QJ{$AR@CTl$vYE4KMctrv8~9psD#tuX-L)#Fs=*{ zTGvhC@dml$Pr63#ioasts2%TM((}vxq3a!A=n!5mhFD;SqzsFt+UFQzj4Zdyj0!rmHq=DxatrJ7H@1DKugyl)YSum zn+}1IvGI^=UcC;X{|q2h>SVs)yN!ni9$esIBk9OU1>nBSrbWsV)K_1s%(jK^@+tDaPo7!ptuu$Zb$sl1V$G6~aokm559 zvMro-DK-*~r@PS#tVq1hinO$Ee8rybuCpSw2w|}fA@n97OwhAr=d8f_JF7EwEsp>p zO0R_5R^X(5(jkQQ1Hvo~0(sr}F!kv6W)X~TJrlK~8`s*`bID3Q{YXrJkt9ebIAK>B zUI>MHj{P}6=+Hyxzrvp{;-7S3AiogN%qcOtpkv-8bO&Aqd&EVxhnYHs0v=|F&ci%a zz2aPRPo~cFwRZNgRJl6axV~0Jlkj|$N-AE`3rY7i_*JyPS}24eAFrx6NkQV4GkH7` z%Ah7!tZ#u)t0T=V7Efs9eqZuoK{z9=j0w{}xKyl! z>P^F3^Xha`S#{&0?X?`fULmP>8fr<+y7_|Y4uY&&P`JB%N_>BbRV8K;Ibv02~7%3vf6grROm+A2Nt?nq@8Tth%%G%62T? z3-;lL+~f&Z9WVmQ6Beh96GcLa$+!L`=VdcZ-NjOz_^OS|>c_hih? z03&nJtJ#iML!G16eAVXDiBu;1O0JKyzE$islz;}m0MyA2`UKcsx1FZD$wz()`Gc(?~@n;i#~Ai z(I1K9^eJvX2%RvVJGzAn=cbNCa14x_+`ZU+zw14(9xNCXp%<` z$f1T|z%NC3yU+_0P6u+J(zqO_T`9%1N)ifrjn9!V729x~#fUEBubMro!q*eV74!!B zqhu!*ZuMn+-L=CNeBM_$>&v#Ld|lV0H1a>{8d75s3G+#PcAVPPK-%;bsr~g@7y>P1NyCKMAnK%(pNRN7)P)}*#dFbcBQn{FGyx4<}X$R2(HXCKt^ zlfLSHqQka=aJEna2n4CORN>tZ#t8}8P>#p8)^G_PKNHX7I6c~bRS6>$h%kB)Opr@w z)W9($vJmeAWbk8T{NA&suy=}${R+b8<52EyZ5CEkXy`WaA~l%IBS#hu%8jIrkL2V| zcW{j~H<)f`z+ff$E?vIpH_fK;&m?5DWgigz5yM{(u?oWtx%T0*n8*n07 z2A`(=d{6elG(DLrVI1xaDUkXmb*8U+DLjSeU^AbnK_0ah9v>e1vH9e7QEr15f0 zUFhKsqe=oi`r2qO0V>$W`v~wj&v?HMtR}#N3ZohVtcx_RB|!MO>j?o4mYOG%)K%Pw zw^g^BG`@kzauu1MCcxpn<_`(5b+3aOafP|N*&t2#hZ5a~5{D6BrkL(dfRS)~GSDe@ zBWtd(wu$u$cJUXH_={^Prf>KJ7(C}83Kkca=URTxR z23t<3BtY4KxhevDV5RIOK+3=v(miSC*HAr4lgPR@PWhYUIKI;)DPcU;|NWwo{`kuEqO#_ z#SZ%5IEZ-NzPpkDn+7cG)qtlbkk#+>3r!~z;BA$C1OdL64w^-PpHzb&h$v3ZJ~=Cf z0Kbr2k_a#;$R&jU-v|b+B*2mjgEh@l5?P1aJcz8*-5M+dPjwb_n6Cj3z962;8D82> zNC^;Ft|UOj5??h!Ed0_gs!Iws zea|1I27xtF0*rNy&K|AKmAQXQyb~oFpwyMrOn^YIb^??$#u6pDMBXPrkQmW7>Rb@Y zN&;+J^@e!oMGxye0WKuF1yR+Ft{6O?c*ix03?D`ziI*LOpRaJfOb>EhOn}g(`2<*d zaH1M`C>o*veA}JjHLn3LO=sG#r{<)InPgplF znQ=Pvmq38&k@O@298zh%8VBpoo;66$T?+*&gFKWp2>jL3^~T>yF(A)V*fwl|a#q)A z$?zXCp^8^fMQxGMOQHm@;C~Y(tTag8L^AGL7(7t%OR0zO`KCF_S@TawhL2f7nz#BE zx&C9lLGqs~jJs%5E5)u4p2B%%3zhF<&PtZGeoMNu=?%Hw{)s{IxEsb@d39Eb;j6ra zYs?oZXK~I;hSNBAd}h|idl)3oh`d!@YpEC?8y|3BnsQ)Ntz_AdDAK&y3UYm^gF*7} z@kU)Sla9NNh~Kz=x-zqKzvLy;?2fft{fL<4CEZ<@mB)7p76%0Xl9^ZWlBvS(SZ^TJ zkKj_0mqgOKE^|y2yQbL+11RH^nKZd%+3@+KJ9AHw>jzIyo_e@zcloig(_+^IwY{g7 zy)^W?Vu5F z=ZGXP4V$q$7KNnx!FH77siCy4-3q2+tkhb#X732)`{pH*m+LzKp#~7<0>W89C@@is z^|lqRxj#zzJ|qPY?g7GiK*$CJCcSI7J4-Qkg`IGX(-UHdI8}gAd~=tpD7?X2-lFmfku7{jr;@%?*XA75MBcU+mcHSl@E+w zzr|5HSLil5kD4Ui<;O9vHOSj5L=QH|(1W2Y^xz2o;NpG!!NzR#z|##qIOmSupgD`s z8-@AkfsX@v@JlUvFyR6IVADqQz|ROh_#+xUxZxZRZDA`j! zlizww<6`*I_;uG*era^iXXT{q?Nv&tZ|VmDW>? zW}FUu`OWkGNoP9ym+si?_S5s2%sDltkq;|qkKTwE=AZ_wmH2Sj)%!>*pjOU_rxZ)w zcPOU{JUr_B@@AX;66JI?#5bfaQi`>I?`t6nQRet<3VQl+#_n%w?g~czwbpBEhSB~f z7gmmKul}hfebw!?H-`9nbsiCAo;y6^{G+zig*B14cU3RyOi#ZW?zN{a)joqm;+p!^ zRnJZGYj_WTlmq7_`L&FKKOM8+PuE4r>qdWiO5wH-;raP>7yGeK+H8eCa2r?)f8gD% z@b1p7@W$<}@UCqMDy0NU-cbSt+%ECMme_4WrEG&zc5L%|y|{au--}U>rGAlq^Gp4r z8g`WWMc3Xg_3N*g_Z`&%7J5oI-ZpMdlnoxZ7I$b#LOdot$!($-&j z)~>qdx0IyQ3wC!lEo(?QWGG@B+g?yh9ylO)iK|455g7@E0UPP7RsuP6{F z*tWDi>91H=I{0q?@oxLYBRXSNMen|Ow==zNM7QVjSBd_&=a&B3x%_0r9pUH9t)2b- zckCC>eiA<>>PuePqyF?&M`dlly*^&CJ1g%_eC^rfhzA)}!51*jR?>Goc}sZ->$hbe z?kvdc%wIlwY(-|-Bc~l%g)_X%_x+YJYWv4;tX{^C{(DFDzFobUbLggRO)q`UdF*)} z#cX}G`izHZXIoq9I*0VFdtx$Hh3%RBB=OHVE$hC&>3?5J73SS4w=tJk51gOW-&CK! zahd5{5;@zzxR8|Td_7vBH4owE9C<@A zQ3x%ZLJxg5b_x#(4lx&8@fM!{74`Uh_0ztZz_k%)GG2+#9G2y4`tMK6w8l-V)06bc zAl6IFSnjD2xWO8DAx>Ey{83-+|BL3r7me$aN{Wl`rl(p zgQnxAbt5p?dx**0rWdQ{r=cpp6Ath=SM+3&bBwi=YC^GjIAlV8-ME6ZVj&4fRVD(^A>(n^Q8ZHAo022<*;9$ z#%JLgJ9X8kip=LNMs9|~&hnZ}0zUJa%{m9z8BIBy(z>@yD`u|MKO+??eKOwfTx04g zzwdw%Q;(evto}9QLDt>yn@?T6PX6}Z=j~e0+ifZSL?brW*AD86_eDJ3P|=C&`*=UC z%vx?GjlcY~#B=JIU-y=q0PWU4^&b0oX8xm9TbL6T_?k$Zp7^?#<-di8XaxI@WbPmT zK&c+AU>u5g`ljwLk4C*xnfj$pYo8#hW4-XUMM5(^Fm}34dj73dt5*k3J^eKPqb)&` zR~Eh6s-}fah~DUDfivzH^NpWZ8bnEW3-w!MxVr`v3g!%Z>ea z(^hwdPt6Bq+qokJ#KHa))9cKo_&@y??0$anO)8Sj+!ueYJhE@(8mukIyu2#kp8i>N zwQekXQnH(U&8Rb$p)TPGMeN49jlSbUW6|h+hIfrhHCBx=t#9jzR0W}|{t3rUYIWRe zYfZ)<-+D}Kdg_1SYTDw}5ngB7-r%w-OMd^?LbvDcn~OtVfQiuQEHlfctlLr!RbQy2W%Fb$o}NiR?I-02plh@$vaIx~L*|1PQdHSy%;XMJ{sw;n0J{qXM=`18o{iKg)EY=YOBr~Yr} zy<(nh^FO^Wi?{B~rNq^rUb0T;1pjm(C}9HVOkQi-W8Z~KB2GMwKgIi(x{f!sHif@s zj9yUgb^7_s}*VbAZMrrrIpAgeRuAnhgZCx5TD$~U9Wdeqdk zr9GJU1uwyKq1Vl}(<{n<8JPd`Qu~*4s9U;*1la^{=|9W)A^+Ct@$3U>wL-_*?^ECU z{EgcWFp-N&-^RbG^W6RYqeQ<2HS^B|?#cf({$SwRZ^|CUt7#Lzdd@dDuMAp1dH+{M zdS_c|R`~)jfkG)jrs~ zwUSgG&!-J}7@vT>?zU>--e{x0{n!byp2mR0YlPgXy_9=dn?_a%(eIh)jY`p~ zh6UASkJ9YNPM;pC_G{JLDcc7iT>7SPZj^DP6TVDVGu_Gn}fJfE5g+iHe7NG}~=$_xZ(Teu3?h zz1ypIEIod!dgt;+>zazRt8;30W!>LivwO{(TQz&WBhOv1!hCaRj6B<^tRl7T$Hz9w z$FD5Dv#jCi;=37L@ilid&#bt)E9*C@)$WxKw#?qW>PcnU?$yta-Q2zAch%4HzJ2q{ z#6@f0-_2jN?$gVk7k&5TZ@N%&?&JHN5{h{=S4?v#kc$n6HgIJo{-ND6%UKD%xz;JQ zx0fFKWtQ#IQ{Fc#(tZ_K?Mm;QHo7~BJt3hxhm+JI%6C}Dh$(PlO-`uHbJ&oucY|kZ z!oJPl7$sH}M@&xKU%GHZV)c%c*2J3K>x`0W_imn?bf9|ohNOcBkG3WqI{K5*(!<9u zPhNVY{@#YAM^C?MUHZdMUyPC!jjSoj$3oJmlH|>@Qc^E#?{EXfj)ThrrlE%Gmam zh3R7Y8U}q;DD0A_uNG4>SE8*W*6n6!b44%DG=*pS;5F-YBx?k_8Ep;kazr~B7W3Al zP13MsrH&GK7VSt5Xn$>)DWtDSppQ<-Pldmdd~s2}SV+%=T`RC-WMzJqB!3Yje+4H$ zwH%JAkb1m&&3e_tdZ&baAe0!`KZEvQ;D5Ve_XV+)pLPSbkHbC(*g6b<8=CxJheH7+ zpri?Q)C7Lc4!A}MP&6@rPRtia=ckHg=?V0e!u)hje!4v0`tl6ZSFlkelJ&5N^+2;T zdj!|rzFXx0`*yB6+I34Ex_i)$|7RqJ#hht=unDIEb}C1@5FHWbXRV~KET0zEUu23X z;E;sx>36ihr?OuMTSuV5j`pubw5VK}Uwc!4B6uti9ossQ$%SatQ<--8C^2u879u+bi*6xd0^W2NBxScvTRgv0$(ETOOqoZ7c!is!XoJ5eNd*JlJ8<+G_=EgMBQ(saDa1`b`wH0lh+I z3md)*Ww7rkKpFfE>;h_N@+xTxEDZKj!uEQ<1~{Pv_WWdV=-4VQoP`AP72^=f4TjAk zW2{|@w(u{uv?Mr1GAw;|bF3XFwiHdvkt;}8+rw4MdPMX0yU06eQ{i{586i`+#KF1h za|{zRsfK;Os>1q?E_yzBu7 z%Vs2tQaw_Z!x4m{xJBsPQn7yB6Gf>psH))Q$;s-X^q)>jeBdBE*t{N#T%a*pDs#F5oDwfDF^#R0O zZ=NU5)0^uan=DFMGTfWT^M-rhQJ%g-mM=?56fcK!uG6`wCD0M{a@xKI18A#s~MU**YwCnDNeG&Rd7> zJG3?Jgi-9FVM~p+&KtJX)|DfR>gsxNd;Zmy*6zLuhAnvi4}je?2FTb5cF1K(=&Pf} z<-udYtSI0Zgr@Arb{F9k5dkunj~(s%a6QMaz;A}=2X%TozEuy54`r+zPP{-{t_~@{F02ina~WT@?#odx$@=~>ie%VZ_wM>IzW=hd?~Jf0I}ZG- z%cNf{PziFmobE}E)Jp{dZva0VL>LSXo0oKk65GtJ3}Q3iP{(9XG@HQOFode&`lfGC zN;nugmuntPEp69@1eT@!7|Vi41dO(7x-P{7_xhlns5#%>+e1MDb#Tk-*{of3TYj z=!l{qYhM}_K!finf z!{y8p+UF~zO6oRY9i%(dZ|e;i1u|T^M4DfWe0Gc?^T#7=RTMRE(K&M5btL}FenduW z5z3B?M%lhMP&T?om>p5ukF!R|epsxqz*-9%!?Vk-Zyf5rR1Iu;7wpMhf-BS3dK?H&Vu6DAbIAH35Bwm@N{(7&``?!Aep9} zr{@+t1lf=^L#ed`cnR6zYifG)_R(s6G^hPjt>W&kP2^IFoeqE;$;r_M2F8rXEavJ{6xsY&O8K?` zUcn0%b1tYIC{r!=hO4^5=U!6EF(oI3;leAAcP|h&%jLMit7{RK%DGRQqv<(vc@O9d z&mHt-!6ljeRF77-yJzvbc@i?G-G?(#V`ruFnmhzPpz>gJe`=%~q^q>HqU(sTS=j=` zD=(N*6B`^840xc^xEAzjwP4@LqB(g~L(taE189Jcnv*`>((-w>*36I=suZL@Oenl$ z{>q~~3^;0#E$kUq)giRPxr2`oe*kxwptk(kk%AUaoQJqFJ|4idWyin>plSrB7ezxe ztKJxq2Gf>sXK57n>3~8G*MgBPU0Pt}$vX*SizVC%5~^l<6J}@2!WOUrpyxRgRu6Zk z(V+oc&qI9rE)5yBENt`;#Mng(l;U7MEsod5b5|7zV&IKylRZ92?G%keCD+BlidjNl zn}Pw4)P=2)Hr^#2JBO1Pukvh}yJjq_om~{n2StP9H1%~}igdmM>3jjw`7orM?ngj- zOQ(Ux4nr!v7^!g^G7Z*%_5ta0AFll4S|F2egkA}AL?hEsR8F)3di}5*4fq4dzFj_N zgOK@{!{`vU@r+3}$<_%7xoJ2;?#M-B+gUW?^je_?NMy)Th>@k>vXEK1C_rt1kO@#S z9hLk_{?+(*6Z&I8osQcJI1&T57pyKfg(6%c+$m9wlIATV)9+C2>J43zEmn59NfhB& z%uc0plr(!8nR#D`hN+0I%WS4%S0x92Y4(9%n&YvVwj}v+G@A7tM)qd%QiOH`jb`$b zDBJxg%7*H&n_82x@r2Rk0Hp1>q$CdL&e9r!8$;!NN^T}n@y#Aom1Mr1qr0p(Psju< zbu=O$WHD1u!f=LNg5j*))tv0>2TyzOr{>wcdA_wso4Mpx7SrdPX4tEbU@SH)kZu?u z{3zu8&gazn6{svi{WMm@80?1dq4_y9;!hlyEtGgx3{a}X!8|(1OoyeaK(z&&0{O-o zlNG#f_B9fyq1^=jpP3-8+$a#<(-M+7oV3<%Zl`%))M1?ps67bPC6xb3hgzsI?+`e& zo4aUG<1pGKJLYKW8jN;=xzRlGJZc34{0_P2;vQ;-l752PMl_(!x{wr1Z!(b%lBhf= z%~WbC@~wiPZM9QuLZtSeRURbY7;zk!*S@{9xYyU94{Rgo12#s}2V+~gAP$O9xuYWb zslIeNZGAWBrx+RKSNCZ_9nB_D&)tKV+rRA;?hAFG?&cWf^ zPzgn-gx5jzV9fXju3D7@3H_y`r?AyNAKcuq)#lH#(}FkbgnXtK$cK7-rJ(Uur)%YC z1dT-E&D#eey%The=82S|4A2Dl_*$qQUy+JQXlNw9%0&n^ND;&o^wx5uHR|!TLyEN3 zA0dnBsMvmlEE|Ld;}7^?ycZ3|B1@#aMcGInqtM7*WQ35Ta1|Sd2IB-=d5`K;4EHge zp&uIm94+pkF&T75&Xk|R-EtQ@&TO6SECbug7)nz~!o^Q@W_QI5(#Knfq6t9JH`#X5 zAdi!pcNm*0w4-4vK66kX^*)b=e3PavsGnD$x$=a6`lBJZ-owE#7*&puNF>9dY&QF| zWb=T@q@Z<_VOL0ZEVh&CpY1h3bDUP}lW0o92uVM#$LH~;gFo<2?GJPrgFm3>n>HMP z;j9Z3vQ@S}^XUc{KZIg1_qD1S5sK%m31086DoAG6u3#@tH}y`b_f6(gTL7lKnQ{if zod5@uBhDfCj4yWPl{}}@%fyx~^)pe{2e{v-PNCX!a+cFC`Z5f%LwOI4U8s5@T8Btz zgh+T>kA$jOs``Mi=XGcjqCmw&z6e3^YXnEVEJ1Kj1V!ce#(VtnkK9aq$JR)zVH!2ACei2hVME2bv`hH5$( zGMlV-v>4tJHWg+q7zWb|m_Iq8LBg^YMBE4DgdY#094bRY%TgrwQWGTib;t>&jYdPu zYusb)!8OW`nxu$VfD>BJT!jWLfvI+KD&nfkx1g#VxQxtnRnLCz>#pqlo^289vz4*N z4%yMG_lqb_el(#en?36^_r`Q=DRgHcOdeMkMoCZuk-p5MIY+|qXb#S^;8H7Oz$N0s z;Yjd5UN*HlUA2Bca+K8bBH;lj&}i)Gp5|91a^pnMFK61%R@uT12d*o%DhFP}-#62~ zzrT*o$hKb~jv0amfI>6}ANyv=hkecw9tL1f@hN*wUYG%gO@VjFkmltD4?{4zL|hCT zkNe#-aeZ=xJi_m0(~6B!P!?Z3pt|DAv z%lE@w@tNqQI@}fChP&d4xGOF~*(F`b6(3%YJoHT{yCW85Ti$xVyB-V2v&&F6wBc)C zU3^#T3;G?BM88CCCCu(9#ff=Ba0ds23o6f+%+=(}OqhkB!Dzl1J#HxUmpQ4b3}UVTQ6#c1p{H>RrOvjSa<_Ga0n zF!~Ldi>=)pyTa*7dtR+4Q)FZ;cC@|ccgJfE$tVF+c+4p5C3g(@?{2B!Os25th&?B2 zDV=uZwp4H;Q^-DS&*@L1(~iOIp-f@BIh!&-=@Bx@hG}WdvBWq{CITvqofFJJoY2Zd zLdif*yE(^l7w5TzZ3&8H6?Vr=CIhFxVQV0lGD#yj3hM=4!|~P_K4NB|hJF#H(}@Z}M4~ zv7St@C1!XP);d#EzndEqIwzuRg|MD5=te)USa|uTQ)E|MculN{g!f1m^Y-5 zfQB}1@;SKQ0uHzEOs<@@c?VIw(x;l6BM=MDpOZh|%&`MPNZaI%_JsnCqpVs8^9AG{ zfRT83-)OE)OQSgWwK47I8|n$_74?0$p=V)`T@LcH!7KSZel5%b!DtKRJ|{3EF}FbLey=q|?-0KD z+Fa>=(mdqAN7BK8=Z9(>_*Tz~>_KONijd?E@ z?!tYQ`N*+R8Y5q2HID3ukQw<1`2mh>hmgzB+<}&kN><`?hkMAe2@XVFP!W#&4vhvX z2Za1khMcaosAPpHn!@SH)uTIYe|g~4%)G!=X;3||CKm@klz}D_~4E_ z(3yzdQxNy6k&D&|X!1n0i-yx}8kD2)8_}8}RZb?6RHl9K(Q7+)=exUP?IL0&hd(aa za6FxzfXE1_VEg?kux2E;*qSrkwgJl4|jpWEGq0$h+5(FnS9>DV}Xu_oqb}K%i@mr4I-7Ac004{=M1N9=K z)8V3kh!@~Gxl_c&PtFNnOy7hEPUlF#3KWhvXw1;8M+U_n$zFQ!r2)NkGtAD^)NMMF zO)SxDtTQiW6u|I`p>?i#d1yUchV-hJ2LzKKx;CJBastw;dL+}kkcRL&2v0#hK3{@& zEvS?6@fnT#NCy47(1g@N{k?QKeDI0JQGBIqKR)U%#fR5i5iiB~AbyHgL{Ixo;KI~y0Ej3xh~J5uSa9ig4glJyCz{36!M+M; zxSYNqWe<+9s)#mXF`xa2rnu<0f@_b=$)P)3Lu=d7Jj~fxz{9MD8|B%Od1$Q4X7mN{ zYJW$MWH3eRYUVR)FKg~3)~}2bet|m~ddAqfnUMn~(1BYg2vmDN1$Pl@4w~CpjbLXx zp*2tB4*7mKSne9izzf1_Ec3-=;5V$Kz$oQcDCzD|a&O?a6|_dUk>bep*WM*xRWh?d zfUlzojCxY}hBlrHD)%Q=X&Uq_+hU4JD)_9M5O+!0mMf6W1;SLS=3ej+1bO3fiWIrw zA;}I6Kxo1noK2-_SLpjD4{8^Pbt_)wN5Bh=l z8!bD)&3;|}1vpeXPEggyG zStOc!5E>6zO+F2+<+S3z7+51A_QQSXL}X$GxWnCm&q_xlWQ>kVxUY7&kv*2a`m);a<%L?%T8`^RH8?0@`huS2S1^? zD_Y37Gk~F4o?1o>L4t(3ZM<%7p*g5CJDBf_WS9filyp06yq+i)9gsF?CY_i^+H#^&Sg6F#~jqW6M3Zxp{sGLoaBBjEcm+*GH zo~zmT19>&RD0To@j9g|OpLJSO=Xo0z6NUp~61nJ{Kr9l+Ok@_C!isIkx}pDvy?24D zs!IFE_W=Y_1iTe0;!(-W>j4f|tw6+EUP#m|wZjomC~k34G@C#WFr=X}qq0J?(ixj9 z&8)0Jsgn*)?R1t-t~D>!1%6D?E2gpFrn)cTe=6X&08^ymbR(0ue7v2;}#zF7SiQ!D zl;^F8^M0@=Ma6BUD0|$s4^Y%tikj@bE|Q`eDlKuRTJ8%8xe9a8y7D>Ou@3A%ETH+h zq%WQxFxK|Wl;Ob>y0+wfV!eWHn9=*3uluNL?VGrn#_mrK?;a12wN<98>(%AYRXmza z0|n;k3zA>LKyeax(B(Z|Oh9LaGDs5-4#zEa9Bh4b@~G5?#aE~si1n>2XysqtL1-P^ zWkYO8;!sIVbf|0Jh+)?wQOLC;a$1_(AU!qtrSZ;3qx@H4Hx}=+!gs!J3(f1a^(fbV z&opYHTd0vgOpSabH9s2HE25}P(k=BlYI`fG%h)G3`w(jOA#$_Nq-MV{fI5pNx!K#P z**E#p%qo#ayyRgra~GO7Y?kM2y=gMJohEqIb32c9ZP2rqPm0{mXun!)XE+nxpJ=N1Uh01ZeEt=iUdY?E77>F?p@~`<{PrY<)=Z z?0{94#~O~hZVVUgT-E)qdEWQS?Pv>{*ml2|kga!f6YG9gw)X>G)Q*OsiEa0b9d_;g zh+2gv*8Q$B?+4|EiB!8!YfbF@>{Q>6Hnbv1xi%x)x3kIVz3+q;KDl!@H@0p^AFXtH zpS)tVrPbT#Cfn9-0VBIe2U2{OVyUajvU}XT-9vmQ(!_21i{tpEww>z0cy&G;4p(FL>m~x4i6?`7w=OC-~+ksz))k zIn4haSU`RAy<^a?rJTOD)w^ow`q2%qUn9>6_dO4*%Deby7WWWtX1mPmve|)!E9J41 z`lozaT&}iio7yxm%TSxf!QcF8hhO%FMLB;A8(j40)7RbAaA?iC@6S3TubF>rhu@hE zD-kigWIWCA+kDgi7`ClMp6#Eb>(Ql=gwK1{(z?Sh_wge+aGE{1u37u|QNH%BirD>h zH(@dDr136Qe7yy?=->vyZ1-d_ED(_72SwvaDI+n()~Ii?Hoe7{}m5u7)Z z57KJFe=Y2eRogiM&0*FS%b11f>DNlOuOhbtvj#N3uy@~p2-`jh>ozH6T?4%iZK_us zudx30uKAtTS2y?BuuSycX(O=pEH1!q=@Z=7wH&*(PiQ}R@=vbY{e!Nui%R{;N2`aB z$1Fm3ER`*bx|9mr4Ey?64L?}u62E5^cn|Bxzz&cPUCZ%oB%W=2D*&)Znd%%Jtk z5br*T)vej7!5QhPQaT2f02IYa8~L<%zwxG9kB+pAKfLCJK>ws9+#J0v+Z!>j4(?h} zT(@$G*hgOb<3HDA#o0lJPcxd*yxLF~q zAI1V~Nmnc$t{bfO(QTt_jaSbjPo`gY!JYsdQCV}R^^5H^{U|4wbv@VeAa#}_iH-KS zlW33o2;K9XBX?g(J>p^V=KXSCn<#s;u%EC;-cN|LAyu%v=_YT2?;lRCpDy3AJTKp| z$O~C5@;v8OniNrA3kC6UTKT;`K1v@;_a^Xt>8^6?hWEN$vwoF45+y>$gpQS-M;*O3vC^Q($>MOLe#pl%yeot8pN#5jO|+`^k{MEirrw<#OYloQBRH=a+>w}*FV5p8p%R z!hXs+*z5HZG$FZ}=KRMW45s{@_;)p^p}oSa0n3o;&pLbIiLbBG**71I?-DB-tNUYJ z-|1wmxIU>xTxm(!r)C!(7B+>Bw93Zng1qPZrqJa4DcI@+*~-d`ZloLapC0~Q}tON)AH2^%06sO=)9B9dwJ(D4(}d)DC?7XV0pWgZd{2Pm~|1lJY{rg~yI+=Ok{@ zdepZjB;%2WwY{{-{W?tUgZ(YH`1!t~P1)!B(t~>ZR7b-~c@YrLGFV67(j!2fOWz)S zeklfd7zCt9eHiNf#!k3s7Y+5CPCYp zg>(;gkfwRrbPpCoL-7V;qellSm!Jzf@rO=phAZT{aP5)PnjxNz3En=vdC6nt`(i5Y zaV=G}`L(_y^=?`*M5=n9=5Z;zUVnB};_LEK;YZp!Vclb0>6tiX^=)^r4F3&00k3x@R)wSi#@uUV6ns9J1MpAELWNdbXaRco8kc&b5}u(gdjG(03f_xnI$ZkLk+Xv)4;9&;jT29+w`TOUs3g)gU7lIF-5&3%w5asr+KNZL zD-VCc_q&y&dUC5f-|fY&?R#himg=CqZ?=E799kTJQSAKC@m^mZs=DH}v;5=%o{5`N z__5mDkEH&#?NxP(yb%vpK7CA`q;&_Khh<=&lXg-Hk0XPOJIl{HcN#^zz(Bmf_$RqdNCTOp%Gm2umhSd^d* z`@{(=r}!)LaHF)!dZlHfm_J7N%wX*3Qy%kuX-USrM-vU;_&BYS{9}E+d}N)q{M09_ zch643_GoTmz?+gfQ#?X_y7IgN$x7~lS^i%CBP30c$2vUj(xLp@S+*jNI?yw`(1G-3 z9m>Cz%d9*id)x51lQgbiIV~j;4`V8;*fD+N&eEmJe$vHqg`f*fp&(b#h3X>&^-=L? z>#V|wEw@UTp9k;76sDz__PdUTKkOAfxYf({y>tRI+(u=(!Eav_oPm% zBu$p{QuObfY99FgM!fTQz$Zyz-)tP%ieN=3PEFzAxqT-> zf2`>KlXKu7-KEsxDQi$lQYbC5wuj`5D=cWm!2( zvP+7ooQb(Z{hM2JLt3ToFLw71ZBE+d%=V6LjPWUeI@0De=|Ev}BK8w1gYn$BFS^u_ z<|!k;?j3QXZEZ*}+2r1U9X{S)_b$gxM@Txaz7`F>(eiWeZFjn6b!{NDL7*?B<$4Q z8T1=U)iYWTJb?aYi0^?b@x1NO?cw2gtOfVEGq3PgSA#8S7T*@6Q|et_|EC#rlInwZ zB9GCCj|>bRT(!sR&8z)Kw%xXBpV#X{YeyF5t$NGr>uU~AlYS6A)^y?_vUuB_e48hf_i6L$n+Wso~%U{Rn&mfPDu#4RlZx{_%(S=#zM@ z!V?Yu3PYIQD=JwfX(4c$8>RuLevNQ{$h{r-5QH7T2Mc&T^H=Ej9|b-NeD%PoE>!t% z0;e|l8gQE9$nr-@QXB9a5Plyx8A0VAhy^jyqlZ=5i;?-E&j{f39B(La8b?)p5^&o0 zj0GMn;PZgfb5xUnQ~6Z>#lXoQX9K6b8X1Q^cLUEv_;%n~jFWv%0H28PA8|cNz^@sh zlFocn>tB76_3&08c}BH}F{k zJ_Jroe%2Mbk)22m+2MNNWS?;0qJ0(sr+kxui}^kZJP>#}@a`;!%DV+Pwc~nR&t#nR zJP(}gb{x29x4<#VT;prtB#-nVIRk*pdgJ;gK~4eVskkW>@x8#W0pCX8Lz$n-)eao4 zF1-mHO;amxPn*JjPRAb)obE53d}Dx9 zzJ1V#BTAFAfbnrUd=>B>;L89m+Ver+J%JYkr+8T(*z9TGWX~$#Ru#v^0pR3sn}Lh| zb{sgB^A+G?{hk3H0Q>;(ZlEOJA8q%0mJdji@9%>)jz$v^7xH^tgyFLOOQ#$Ew;A($P{C@*Zd}n}P398z` z7n2{-hi+EY@{&Hmz~w#w_;t+R0|{pUCpjs=RXLPA3pn+s^MMZrmF)>TJO-S?cLTSo zI5K)2IO+d5aFQqUBi|2!lm0t_i~9ea`QO#?2gWJp8`(lX8;%V+yk8ID+{<-U+0;>Ovm3NUXk-_9X_1#XLNWn z&L{65CLx^(7$mhrwiyqR&E4*wJ5lXUnujNhiiyJ67p3;UGn z@NmZ0>hS9re@chX1rFDhUIh*p(CVv+`M=ijzrwh`Z|Cy9$M`@U{srSPI@|}771DpY z4j;gHrVfu`{4O0nlko?1csAo(b$A7E4CPWYa12>md3ON68sTq&4`uv*)O9Oxx=-or z=ekdM2zVrJHZY}>Qh;OnADRAl+)qdb<;M6YG0Jkzu{l=TX$qrkAi~ipR zoZ4wKaIu|sF#n%*{2}N>i2pkse=Km4-vfDx@>7|A7;sU30rRKm_-mPefsX%K=3lPk zZ)W}m9sj4m`$3=QfRkRTeSQE=_BjCD$~f7lKRQX`JB@2me>-q0@6W&o2>fZx-|vdf z{JG2@0bJy-15SQ0133AGs?Qt1Nguq)p_4vsEWb%7{|A=;vQB=;4T}Cpb^H;)N&hc& z{He_Ek3mB$Zw~Vh1TN}d3p^BZ#sTjy=)V~_>3=hDE8}F(11x`;PX4DX|301k3(Wsp z9sgB{ivIg_{4v0(zCP9Q&t(4Zb^Q6v-wTs%vAi|RKODGN-e-VAgfs~_iX+z-jU(HE zgGe)htK%k>_aJc6Crc;)1n_~tSL)=`O*HX8qT}xiocOov_~RIV8+aJvRsXpeINART z;8w;-pXIX4}w0= z0$25*(*I2XC;c;llm36z$-f&o+2?{z{s!jnkDDy9ye~0-Byh33M}brQ%>+*U zsA|tMzy~9o3Eav!=@XEw=u@SWe>HH@=P{l93BalU*$te^p~}AvILUukC%>HKf31`M z2+Q}!O{A#*ZsxxlxLDqInSY#){~T~C?=8T^^7>9t{5&5xiYepVPoepW(noeY#9k_$TT3!+;b2 zZ94wznEx&v|6JyOK*wLo{Lkz7?_>T0I{xQ?lir^JSM5yo)dHN_#Sg%(pwwQdzD~3J zzF342%iF>7ZNSCyhD}n+J6*>g3!KWEspFpuocy5zxabe*z{wxh09W-Seacw=lREkL zv;18;`P-TQeI5T>%zsA5-_HDgxQP+VYniO*9|l}3uN64?!&n`EJoC@e@y}!a0v-RI z%wMhJZ(#nXbo^VH|5Y9TLFWHR$A5zPztZtbQxyHX;pR&$Z(rb4UxR^*<&9(h8+80P zG5=g0e-g6&|Ghf?Ex^eio(1j?N`6R=@FH-yob)_!G&LEg{_s4@|4t{r$5ciC zZkU{l`rCk0eGLOHmUjyC-=O2qX8r{_{tD(V*6}wne}j(y73P0d$KT5QEjs?Mng3%Q zfAEcp{^xc4*8->d3c}zbmUlAqj|483*U9|JI{tFzPuKB3!u-p0{JWWdosR!q=KrmZ z{~Yrl)bU?2P0{~T9se-kR9`>o_>-8w7kof0Z#whafQ#i_&is>f{Efi7LVhN2(cd-! zj{=?xJQ9@rko@ff#-GsP{?ipXM|5&}0*^!bR^YLMoTtf$oj$55r&`AXn4zkLEY{xsYMoXYt!K&l^- zPj;9HocR8Lf1>^l#!u?-GRA+<;rBBhjLbzjzX49=yaqUxTh14D{t!6nGaI<5&spHZ zfoB6BA@E;$lcMK?I{9OOj|SgwfR7RQ7c&2!bo@&hKc~Zg4g6Z9_rpyz<*(|w8#vux zM*vsrk=BKd0w;f-0elGa)B4Z%z)7Dwfs6Wt&r-_M1YE6m^8cB@uL1vI;6quC59BNb zPWJf*IJ!8k9@jGN2c<;2Z30g9*dMrP|JN9g)Zs@NpQ6LRWISDm`=%-Km+A0hMPx_lEJsa=plSKOO!D#v^q2Dc}*%Z!+*mLC-$3 z6+5p0F4}VhT7+Qm%*&QbAA^zZE#?r+!rYKm3YC{$n4- z4*%}{@L04m-u_Sh+)PeVjMDGu?ze*poeD8`=`dz)A zX61bs{M28oAGKWn;a4p3OW9#Id?QCZMe|Oxhyx!xK`I+7hP7~bB&&}%Pmum0- z*W~}J?C`J3_j2w3@1p1Bmg{oI{mYeqx%~ewcK%oC`Ag;dOUb$1`u)GgZ)S)8?RIgw z@-LVF|C*gIS0A%_xm-Dy%m4p3J72DS{==`#EdRec5ByL4{-=J)0@M%E=ij9t{-yM6 z!2VM&rReg1)ee`7|EtzX%j%vEFLyn`Ope+8yBWV3ZnmCgW{1nw-^@Oj zi<{|hCdW+A|80IVJ<5e!<$0$m&h;roRzgWt0*f!BWpBXA38cBD&A3= zpYP1e%5-EbrWcClFL8{Hu-lZ_m{_COm^e8$GSVnEGLmDXq72eTM%k6Lu}1ku#wqzm z#zh#Vjf+&$#u-YEW65!bTE($eafbQEEBQu6MjPZC6&WMv8)aCcC@xV{jA7asC9U0N zl&>A{JEdB%M;MjY9-)-i9${2odxTP6dxTNG_K297sDRR zv?*z`9kWs=ALUlwh5arudT!G!SQxh*v~L+GM`zDYGX#<|fT@ z%t)G^;*g=VlxZo+vuDl{6*1r)ZI6sFlX43dIdjM77G&JPxkou1 ziztX!<`!q*eYtoOts~Or$cnN%5+foLZ?Gi}hH;V$@(K&`@pf4VqBquN6%DrEmJye$ zCeF<%$trT@I+n=tWo<;$<~wtjm*iv=BXvGryjxJ@;xIBzq}{lf(VmK_RA^^2qV%zz z(sZsjv78rCFy0j}RG2>VC|%Xgz9p5b){RrCK@FBUN86(!<$N?)_6@*Mone*R*lbaX z*)$<4x3R&Z6oa{OE2h$5RTIS!8qBiox`H#eT~|sK)|FBfqAR7!ZMWnq?IYZgI&0?a znaMM!Ii}1=o1KJ~>L5*KPDqm*wCZ(J^5L8XO6zvh)Yv$7opDr^jE!U08As(dHcqt8 zILsZbGmZ)y8z(x-zzRy?9hB100%{V?Y)Z$cvy;j-EopqpG?$4z@@f*bK9f6Doou1m zP(PVeRODRl!i@TYXk(|2_S6?d>uQfZC)!hA5Us02HH}h-MqM#pysfKAP7~v)JC4!S zrl_%jI;?k@{7=&MHew%jLy5&%oO{WWTx|RHH~5)lQfEzR0U}?MOUAh zLvL$$=FTb3D&p6tFQ@UNh+e;5ja7`R^;}#baf*eEDy8J-JQ1 zajz8bsaJ|uOr@4gbG1wD0OAd;8Ex}m&1jpU??l@?_)fGx*Ix}8?y%(%lf+m4QiR42^h zY&*`8WyhSmIMQC^$cl9=jl--v$DS*fN7w43BRqIzbcC@%BRmu39F8c(Iw&-pnG&-sll z6m4vSXiqjUo-Idvnk`2g&z7S-&6cB$XUoyio@`(|TaNZLTaJ!VmUyCL43{bF+;L*H zBHFPuB1T@VP*-0D+vSxD#pegd-Ifs%Y22m8cxpt(GwA3TrIi?0T#WHh6XU5Pi81a- zcp7Y+4^M{m&5ozRCTWa25}pQ|q)}RsTRxs_U_8-{_B7FrHlFB4dz$D*8&7nj<2(%# zamF_AG|`QYGqypTCmY1YDuYp6oWZDX#~K@t`o)oP#Zi&PQ8C4iEcmeGY7^GI2WRlUI`vkgzP?r5HM>)nE<)5fmElWMm#o|+&} zs@>9fGCfbK)v*tE%+8XF417G*cFV>?mlnhGXkD5Zoa?8Vk}Rwc%PLELrZzaAssHb%pXIsg{_LHgnPKSUYwZLRokn9m7+2x5DdsRAoIa zh9~cO?g-taOy!PLSHr@2uYeNj7Z^2zxhof8v`(j#Nsu%x2fs$mi#cwZ8LfAAmM}AQ zHZ6D>N>K}<>%UYu##KIT4Np@v=BTpWU5qB~EYuDyKAQPcgl_m&O{JUUs<6(@l$l+O;jYf;7~^}Im`K6RJT7Hx z)=^6=>={A2ZeU{-jki-`B8^=lQt34GZm7RIQf0@f^%U+}gh!V$C29OL-6C{n-4!oT zt)&ZIATXDN&PI&5?d-&?ukN(*+!m8pO`t{BT5@7&%}9rCI)b;PDFs+7gt zJtt++zL~P~byI0pY1ZgF>AyRSUAnB<1$SiS8x7)^Fz9Coowwa!8|4N!CMw2}nNwWo zEWr=l=V80fai{DrO5;?t4Hu9ZGiOXoy7d-yH#9eQY2N74;;c;hA_H50Iasfi5zC1A zhL*7A7C18(%AI&#@shNx{7m^8TaL&*sT4bYS-DwGh@6#GQd*QR--j}XjGM}(+~tkO z;@JhWvX;r9xR!L4C?bADpN=6sjaxl%ZN1G{VD2TT{bMlwM=z_-brPHOh zyVg`Ld0{6b*O|X$w6iFK?9*8>SV30HGRnkg87O-ZJi}%RrA%BotnXzDu%7gbf4eNm7!Xxw(t5mgb?H zdCs!V=@J%dZJ;nQ;K3(&08#_lTUGG|VS z22(pRtu0iknGbeq(T>H1XwRO+2=-sDuluF6^yH!XigWS`(WG;-GF@Ihv8W(V_InqU zu+ZU%i8iaIOBbR%^Pn_*^E&ca8K#yf;(kgSFw_}w!ZKHbP)wVXpHp&kmh%o2D$=Y_ zmnN>0JIehRb;%?fofkc^k*Rruvv_%a#xIRiu5Hsb7`mo4SI~+RR6SEV|XFHs#tq^3WhzNur9aq%$&cedntWh}y#c_aaqtGpu<~m{CB?SdbaxoTWjLAvO#Su)igDIiw4$PIAIw$lnvK2XuXN8`JIejWBDCUJm zI?%+>h11N?%z~aKhKjk=1}@JGJ&3u4iJ@ugOP?41FH8(gE6U+<6gMl3>G<7gW~kWK zH8uQ&Csu}&LzhSJ?C=-P6w||BSR&?!rnM7k*XCx$o@+|SX+CY!1TIsm$2CXv+%om) zI?WP26adpi&w`hkIoTyn6U~wv&JsN`3!S?AB+)FTYmR8f(RqrfSY4YVnk7;P8f}Vb z#t7-|Gek3H*96gwgT%S!hh|)zr-wq3l=-2-Z17?;L|3~Nr-&|;=7`EjtxOW(Ri2N% zOjAxe(7_kS?38)4N1~NsJp$)mMlyBqs$=mqhrvTOI2+?|Oh}rYL<#xCj4CrG);LK_ z9CP5vj3EaO&8QqvQN|omc9kPG-k2lKrgFqZm~cdD945KMX}QFiXd0(!8fT(Mys8I| z(-`W312wD%j?@@)Xr;xm8e@(aRR)gM7;@ln4d;U6H6|RYJ#fUvghRClj@g)S#3<|d zyz0y+ZKesJ`%~YV11Wdoxo}-9PZp2F@QM4FqLKLp=o+1w4)V)Ftq{f)g2OpNUc%`d z&nn=|5zHpErB;ty z9%dC2rB;kv3UsrbGgr0}?NO?|^(pLbR^t?Qx00(7ZYAde+TBX7rm*KKT3zPRBwZWG zpkt}}@~L^7+0gE0Lp6n&4ef3=R8yGQFxt(AoFdxIhH8YF4WpynO+{5UbAs!^18q@? zPjGPxY}qQOzB=#ocV;qr5J4}mbN`F&u#y6r>5a@NaOR>D%*yQC_3E>~$XO=?>2m*W zB3s%JMFZpDa!Tpcx!Rby%vrOzocgdb~Ftan=J9|oJ;=<7p zsu2xc7{|2S>&IkZ;rz{7ZM1eXjI&yX9T84znHVL~v(rYxW^xyYGg~H-)lLxSwoEuw zJLsK>mW@0ZR=YRTr_=7Rj13!QR#xp^$t0cXA8z@no?((M+Pxy>N9ZnAZBb^Pqup1T zWT@KBO;NS^8KEb_0OpUmoir z26jEcbpe9 z%g?i2Xg;s_JDnPH_jjX1V4aSQU0M?1+?bXhHhkO@U&_%jlahMAlfdyYvvi(oM7vMW zdz^NMVC>=XW;LSSA(*6#?L7D@XUSN1(+N|&+PvMgR2|qbH=HOlwhGRaafC@awV%Yf zGQ*JQ~l7as13A1?|Df$Xq4jl1`wp5asq< znR>)TL}?PVrBj80^5Vm6d`L^Lget;*F%g~5py|b^rFU~BH6q4czM`CKHJCMIMy({` zDKw5VTKnysS}DFN!}JUq%Y!BtJ%XlHp5{2>?Xb2+qOd91yAGjE6JgclZX={>E4Qvi zjc{{17G<)5NypJRXU*x<6fUQ`wDV|Ya@?jBtgG1;9!{m{MX4#&-o{N=Gebqj<*F@5 zE5t>Prg7e#nvZsu2zL>Wr!lV%r2}fFF{-)U)2L&fdyHy9_n1y?($hILHiJ?s^J8l6 zkDn;#)C_Rppqjy)q0>nP36rRlZOK2 zzElyQJKok=P=0PkZn3!_<=L51^)MWERh_g$t-$m^vUW61`1x7+auhwBkeelWd>~sI zm6exMG73)+NTcw~CjE-oD0*UeR3Y|+vx=orGmB+m>3Zp|a6T@xByaqpt@5Gpm-vd< ze8kfGs=G)Qjjst;`|uU{7I{n3W_(4=*AKr#?$sIFh?gXiVj^E}yrA(OMP5?YREx9+ zFDiYonw+@V50p(@$SnZI{j|Idn{kqVLw^% zZdn}`HduKtEkq(l`Ah~z?~KJq!}5XA`#wc%wE^F64fysM@U;V*1z}?SCcyp^fQe=M z6|n1c7^+SFSXRuEEGzvj!2w--YN07iEq~KrywE{yLrMztuksq--DhHTml~f+Z;Bs> z@9z*#?M5F@??qjJ?_E1CbWmMr@e``$v}J%cBaYgV7AMGV1U&Jj3mw$1wD>8mymtdW zwEIE_wJ|MTNZ$%L<+TePaz|jGJEA4aiqvUxsr?@N9dcV$4o_35dRM1sjchdNw?mx=_4%{I^=dQ zl#AkQh+A(EXGI*9`9Z`{Kj7ni)XipOmqNrHK5(If`UQR76yE^6`&$<}sE;s;-;VfU zhc0wbf1$;*ZAiZ(z*7(Fd~STTH^rSr+;W3B%GV$DvI%k2muPZRT=g{!@gJC^oq)It zh@<|+C~YRg*Er<_%_d>@6F&^!O;#v?FgE;Ejw6utOVTdFxgF9^Y=Ko&&rPcsi$_2y8LJ0dm8ZHd6Rje3yf7mLQk# zDY|r{f!ztdp+lri+wl%o(&ziZl4J$G5_nJGI|V#|@t+1un|2HMr$|Hm?+f_bz+Mr; zI}qN)eCvU$avKN}!b=g(!uM{-y9KzaR~oPz@GSry3t9p?Mu@)_SWk}c3QBhF7^Kj@ zgO(zEdXTjFFuiyjN^tu+|4FbQF`T8(DXI1R*7f>qaF{bY^J;e0) zOm~7(c~)3m<(ZB-Lm%vBz)&XBD z;I+UhzZIY)H<$SqgD+8#H;?0|a{LX5SM5*o`vWIA-8tS5@irm-dGL_@GoYkLTR&;@ zNFn|sgv;5VNL~xRB=0rme+lto`8EPyf%peGz83Lfd5aOw!M!0q8%bU&z9cV&X#&$R zOv9P>1kXZjA)*ZX3;;PMdv&c5icAdB*+@M8!&1$hqu zBYo~=dJpIdgiArmK3U+86XY%A_%x1BLA+gvPXJEiO&?H_+ZB}j*^9&f2vP8}OiwWV zkm(Yr~3B4QrdJ%z&rX#n`y0r>YMo55mxJ)!k;3n zjt><6u#dcs)4c_h^xXqW`aBK3o!lQ0-{ZhZp9eX<3h}C)DgIZ$Dg9E8&p^C7-ckH~ z#%BUg7vxT1{5s(3Jc9UR5w7BXhr%OS{$S?shImmwZ{Vcg58y2YJ=43her>=>zYjr) z?=bT0_B|)wiaI)VI zkVW(hP%3|0&(7sP$oOkacOgDgDAy*&*8y)6>{`osC2&!{

`a`0~L=_3B`n09t@> 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

&xh&D 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 literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/Modules/module.modulemap b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/Modules/module.modulemap new file mode 100755 index 00000000..99a4b1dc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/Modules/module.modulemap @@ -0,0 +1,11 @@ +framework module FIRAnalyticsConnector { + export * + module * { export * } + link "sqlite3" + link "z" + link framework "CoreData" + link framework "Security" + link framework "StoreKit" + link framework "SystemConfiguration" + link framework "UIKit" +} diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics new file mode 100755 index 0000000000000000000000000000000000000000..656fb342c4bc12d51ae46a5855f263991b73ea2c GIT binary patch literal 808072 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 z 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

sDK!DP|; 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 z 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 + +#import "FIRAnalytics.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Provides App Delegate handlers to be used in your App Delegate. + * + * To save time integrating Firebase Analytics in an application, Firebase Analytics does not + * require delegation implementation from the AppDelegate. Instead this is automatically done by + * Firebase Analytics. Should you choose instead to delegate manually, you can turn off the App + * Delegate Proxy by adding FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting + * it to NO, and adding the methods in this category to corresponding delegation handlers. + * + * To handle Universal Links, you must return YES in + * [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. + */ +@interface FIRAnalytics (AppDelegate) + +/** + * Handles events related to a URL session that are waiting to be processed. + * + * For optimal use of Firebase Analytics, call this method from the + * [UIApplicationDelegate application:handleEventsForBackgroundURLSession:completionHandler] + * method of the app delegate in your app. + * + * @param identifier The identifier of the URL session requiring attention. + * @param completionHandler The completion handler to call when you finish processing the events. + * Calling this completion handler lets the system know that your app's user interface is + * updated and a new snapshot can be taken. + */ ++ (void)handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(nullable void (^)(void))completionHandler; + +/** + * Handles the event when the app is launched by a URL. + * + * Call this method from [UIApplicationDelegate application:openURL:options:] (on iOS 9.0 and + * above), or [UIApplicationDelegate application:openURL:sourceApplication:annotation:] (on + * iOS 8.x and below) in your app. + * + * @param url The URL resource to open. This resource can be a network resource or a file. + */ ++ (void)handleOpenURL:(NSURL *)url; + +/** + * Handles the event when the app receives data associated with user activity that includes a + * Universal Link (on iOS 9.0 and above). + * + * Call this method from [UIApplication continueUserActivity:restorationHandler:] in your app + * delegate (on iOS 9.0 and above). + * + * @param userActivity The activity object containing the data associated with the task the user + * was performing. + */ ++ (void)handleUserActivity:(id)userActivity; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h new file mode 100755 index 00000000..be0b1fae --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h @@ -0,0 +1,136 @@ +#import + +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" + +NS_ASSUME_NONNULL_BEGIN + +/// The top level Firebase Analytics singleton that provides methods for logging events and setting +/// user properties. See the developer guides for general +/// information on using Firebase Analytics in your apps. +/// +/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling +/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in +/// unexpected crashes at runtime. +NS_SWIFT_NAME(Analytics) +@interface FIRAnalytics : NSObject + +/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have +/// the same parameters. Up to 500 event names are supported. Using predefined events and/or +/// parameters is recommended for optimal reporting. +/// +/// The following event names are reserved and cannot be used: +///

    +///
  • ad_activeview
  • +///
  • ad_click
  • +///
  • ad_exposure
  • +///
  • ad_impression
  • +///
  • ad_query
  • +///
  • adunit_exposure
  • +///
  • app_clear_data
  • +///
  • app_remove
  • +///
  • app_update
  • +///
  • error
  • +///
  • first_open
  • +///
  • in_app_purchase
  • +///
  • notification_dismiss
  • +///
  • notification_foreground
  • +///
  • notification_open
  • +///
  • notification_receive
  • +///
  • os_update
  • +///
  • screen_view
  • +///
  • session_start
  • +///
  • user_engagement
  • +///
+/// +/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or +/// underscores. The name must start with an alphabetic character. Some event names are +/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are +/// case-sensitive and that logging two events whose names differ only in case will result in +/// two distinct events. +/// @param parameters The dictionary of event parameters. Passing nil indicates that the event has +/// no parameters. Parameter names can be up to 40 characters long and must start with an +/// alphabetic character and contain only alphanumeric characters and underscores. Only NSString +/// and NSNumber (signed 64-bit integer and 64-bit floating-point number) parameter types are +/// supported. NSString parameter values can be up to 100 characters long. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used for parameter names. ++ (void)logEventWithName:(NSString *)name + parameters:(nullable NSDictionary *)parameters + NS_SWIFT_NAME(logEvent(_:parameters:)); + +/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, +/// user property values persist throughout the app lifecycle and across sessions. +/// +/// The following user property names are reserved and cannot be used: +///
    +///
  • first_open_time
  • +///
  • last_deep_link_referrer
  • +///
  • user_id
  • +///
+/// +/// @param value The value of the user property. Values can be up to 36 characters long. Setting the +/// value to nil removes the user property. +/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters +/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and +/// "ga_" prefixes are reserved and should not be used for user property names. ++ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name + NS_SWIFT_NAME(setUserProperty(_:forName:)); + +/// Sets the user ID property. This feature must be used in accordance with +/// Google's Privacy Policy +/// +/// @param userID The user ID to ascribe to the user of this app on this device, which must be +/// non-empty and no more than 256 characters long. Setting userID to nil removes the user ID. ++ (void)setUserID:(nullable NSString *)userID; + +/// Sets the current screen name, which specifies the current visual context in your app. This helps +/// identify the areas in your app where users spend their time and how they interact with your app. +/// Must be called on the main thread. +/// +/// Note that screen reporting is enabled automatically and records the class name of the current +/// UIViewController for you without requiring you to call this method. If you implement +/// viewDidAppear in your UIViewController but do not call [super viewDidAppear:], that screen class +/// will not be automatically tracked. The class name can optionally be overridden by calling this +/// method in the viewDidAppear callback of your UIViewController and specifying the +/// screenClassOverride parameter. setScreenName:screenClass: must be called after +/// [super viewDidAppear:]. +/// +/// If your app does not use a distinct UIViewController for each screen, you should call this +/// method and specify a distinct screenName each time a new screen is presented to the user. +/// +/// The screen name and screen class remain in effect until the current UIViewController changes or +/// a new call to setScreenName:screenClass: is made. +/// +/// @param screenName The name of the current screen. Should contain 1 to 100 characters. Set to nil +/// to clear the current screen name. +/// @param screenClassOverride The name of the screen class. Should contain 1 to 100 characters. By +/// default this is the class name of the current UIViewController. Set to nil to revert to the +/// default class name. ++ (void)setScreenName:(nullable NSString *)screenName + screenClass:(nullable NSString *)screenClassOverride; + +/// Sets whether analytics collection is enabled for this app on this device. This setting is +/// persisted across app sessions. By default it is enabled. +/// +/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection. ++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; + +/// Sets the interval of inactivity in seconds that terminates the current session. The default +/// value is 1800 seconds (30 minutes). +/// +/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current +/// session terminates. ++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; + +/// The unique ID for this instance of the application. ++ (NSString *)appInstanceID; + +/// Clears all analytics data for this instance from the device and resets the app instance ID. +/// FIRAnalyticsConfiguration values will be reset to the default values. ++ (void)resetAnalyticsData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h new file mode 100755 index 00000000..807b6159 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h @@ -0,0 +1,471 @@ +/// @file FIREventNames.h +/// +/// Predefined event names. +/// +/// An Event is an important occurrence in your app that you want to measure. You can report up to +/// 500 different types of Events per app and you can associate up to 25 unique parameters with each +/// Event type. Some common events are suggested below, but you may also choose to specify custom +/// Event types that are associated with your specific app. Each event type is identified by a +/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_", +/// "google_", and "ga_" prefixes are reserved and should not be used. + +#import + +/// Add Payment Info event. This event signifies that a user has submitted their payment +/// information. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the +/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c kFIRParameterCoupon (NSString) (optional)
  • +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterPaymentType (NSString) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) = + @"add_payment_info"; + +/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for +/// purchase. Add this event to a funnel with @c kFIREventPurchase to gauge the effectiveness of +/// your checkout process. Note: If you supply the @c kFIRParameterValue parameter, you must also +/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart"; + +/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use +/// this event to identify popular gift items. Note: If you supply the @c kFIRParameterValue +/// parameter, you must also supply the @c kFIRParameterCurrency parameter so that revenue metrics +/// can be computed accurately. Params: +/// +///
    +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) = + @"add_to_wishlist"; + +/// App Open event. By logging this event when an App becomes active, developers can understand how +/// often users leave and return during the course of a Session. Although Sessions are automatically +/// reported, this event can provide further clarification around the continuous engagement of +/// app-users. +static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open"; + +/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of +/// checking out. Add this event to a funnel with your @c kFIREventPurchase event to gauge the +/// effectiveness of your checkout process. Note: If you supply the @c kFIRParameterValue parameter, +/// you must also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be +/// computed accurately. Params: +/// +///
    +///
  • @c kFIRParameterCoupon (NSString) (optional)
  • +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) = + @"begin_checkout"; + +/// Campaign Detail event. Log this event to supply the referral details of a re-engagement +/// campaign. Note: you must supply at least one of the required parameters kFIRParameterSource, +/// kFIRParameterMedium or kFIRParameterCampaign. Params: +/// +///
    +///
  • @c kFIRParameterSource (NSString)
  • +///
  • @c kFIRParameterMedium (NSString)
  • +///
  • @c kFIRParameterCampaign (NSString)
  • +///
  • @c kFIRParameterTerm (NSString) (optional)
  • +///
  • @c kFIRParameterContent (NSString) (optional)
  • +///
  • @c kFIRParameterAdNetworkClickID (NSString) (optional)
  • +///
  • @c kFIRParameterCP1 (NSString) (optional)
  • +///
+static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) = + @"campaign_details"; + +/// Checkout progress. Params: +/// +///
    +///
  • @c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)
  • +///
  • @c kFIRParameterCheckoutOption (NSString) (optional)
  • +///
+/// This constant has been deprecated. +static NSString *const kFIREventCheckoutProgress NS_SWIFT_NAME(AnalyticsEventCheckoutProgress) = + @"checkout_progress"; + +/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log +/// this along with @c kFIREventSpendVirtualCurrency to better understand your virtual economy. +/// Params: +/// +///
    +///
  • @c kFIRParameterVirtualCurrencyName (NSString)
  • +///
  • @c kFIRParameterValue (signed 64-bit integer or double as NSNumber)
  • +///
+static NSString *const kFIREventEarnVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency"; + +/// E-Commerce Purchase event. This event signifies that an item was purchased by a user. Note: +/// This is different from the in-app purchase event, which is reported automatically for App +/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also +/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterTransactionID (NSString) (optional)
  • +///
  • @c kFIRParameterTax (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterShipping (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterCoupon (NSString) (optional)
  • +///
  • @c kFIRParameterLocation (NSString) (optional)
  • +///
  • @c kFIRParameterStartDate (NSString) (optional)
  • +///
  • @c kFIRParameterEndDate (NSString) (optional)
  • +///
  • @c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for +/// hotel bookings
  • +///
  • @c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for +/// hotel bookings
  • +///
  • @c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional) +/// for travel bookings
  • +///
  • @c kFIRParameterOrigin (NSString) (optional)
  • +///
  • @c kFIRParameterDestination (NSString) (optional)
  • +///
  • @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
  • +///
+/// This constant has been deprecated. Use @c kFIREventPurchase constant instead. +static NSString *const kFIREventEcommercePurchase NS_SWIFT_NAME(AnalyticsEventEcommercePurchase) = + @"ecommerce_purchase"; + +/// Generate Lead event. Log this event when a lead has been generated in the app to understand the +/// efficacy of your install and re-engagement campaigns. Note: If you supply the +/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency +/// parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) = + @"generate_lead"; + +/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use +/// this event to analyze how popular certain groups or social features are in your app. Params: +/// +///
    +///
  • @c kFIRParameterGroupID (NSString)
  • +///
+static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group"; + +/// Level End event. Log this event when the user finishes a level. Params: +/// +///
    +///
  • @c kFIRParameterLevelName (NSString)
  • +///
  • @c kFIRParameterSuccess (NSString)
  • +///
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end"; + +/// Level Start event. Log this event when the user starts a new level. Params: +/// +///
    +///
  • @c kFIRParameterLevelName (NSString)
  • +///
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start"; + +/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can +/// help you gauge the level distribution of your userbase and help you identify certain levels that +/// are difficult to pass. Params: +/// +///
    +///
  • @c kFIRParameterLevel (signed 64-bit integer as NSNumber)
  • +///
  • @c kFIRParameterCharacter (NSString) (optional)
  • +///
+static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up"; + +/// Login event. Apps with a login feature can report this event to signify that a user has logged +/// in. +static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login"; + +/// Post Score event. Log this event when the user posts a score in your gaming app. This event can +/// help you understand how users are actually performing in your game and it can help you correlate +/// high scores with certain audiences or behaviors. Params: +/// +///
    +///
  • @c kFIRParameterScore (signed 64-bit integer as NSNumber)
  • +///
  • @c kFIRParameterLevel (signed 64-bit integer as NSNumber) (optional)
  • +///
  • @c kFIRParameterCharacter (NSString) (optional)
  • +///
+static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score"; + +/// Present Offer event. This event signifies that the app has presented a purchase offer to a user. +/// Add this event to a funnel with the kFIREventAddToCart and kFIREventEcommercePurchase to gauge +/// your conversion process. Note: If you supply the @c kFIRParameterValue parameter, you must +/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c kFIRParameterQuantity (signed 64-bit integer as NSNumber)
  • +///
  • @c kFIRParameterItemID (NSString)
  • +///
  • @c kFIRParameterItemName (NSString)
  • +///
  • @c kFIRParameterItemCategory (NSString)
  • +///
  • @c kFIRParameterItemLocationID (NSString) (optional)
  • +///
  • @c kFIRParameterPrice (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+/// This constant has been deprecated. Use @c kFIREventViewPromotion constant instead. +static NSString *const kFIREventPresentOffer NS_SWIFT_NAME(AnalyticsEventPresentOffer) = + @"present_offer"; + +/// E-Commerce Purchase Refund event. This event signifies that an item purchase was refunded. +/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the +/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterTransactionID (NSString) (optional)
  • +///
+/// This constant has been deprecated. Use @c kFIREventRefund constant instead. +static NSString *const kFIREventPurchaseRefund NS_SWIFT_NAME(AnalyticsEventPurchaseRefund) = + @"purchase_refund"; + +/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart. +/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the @c +/// kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) = + @"remove_from_cart"; + +/// Search event. Apps that support search features can use this event to contextualize search +/// operations by supplying the appropriate, corresponding parameters. This event can help you +/// identify the most popular content in your app. Params: +/// +///
    +///
  • @c kFIRParameterSearchTerm (NSString)
  • +///
  • @c kFIRParameterStartDate (NSString) (optional)
  • +///
  • @c kFIRParameterEndDate (NSString) (optional)
  • +///
  • @c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for +/// hotel bookings
  • +///
  • @c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for +/// hotel bookings
  • +///
  • @c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional) +/// for travel bookings
  • +///
  • @c kFIRParameterOrigin (NSString) (optional)
  • +///
  • @c kFIRParameterDestination (NSString) (optional)
  • +///
  • @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
  • +///
+static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search"; + +/// Select Content event. This general purpose event signifies that a user has selected some content +/// of a certain type in an app. The content can be any object in your app. This event can help you +/// identify popular content and categories of content in your app. Params: +/// +///
    +///
  • @c kFIRParameterContentType (NSString)
  • +///
  • @c kFIRParameterItemID (NSString)
  • +///
+static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) = + @"select_content"; + +/// Set checkout option. Params: +/// +///
    +///
  • @c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)
  • +///
  • @c kFIRParameterCheckoutOption (NSString)
  • +///
+/// This constant has been deprecated. +static NSString *const kFIREventSetCheckoutOption NS_SWIFT_NAME(AnalyticsEventSetCheckoutOption) = + @"set_checkout_option"; + +/// Share event. Apps with social features can log the Share event to identify the most viral +/// content. Params: +/// +///
    +///
  • @c kFIRParameterContentType (NSString)
  • +///
  • @c kFIRParameterItemID (NSString)
  • +///
+static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share"; + +/// Sign Up event. This event indicates that a user has signed up for an account in your app. The +/// parameter signifies the method by which the user signed up. Use this event to understand the +/// different behaviors between logged in and logged out users. Params: +/// +///
    +///
  • @c kFIRParameterSignUpMethod (NSString)
  • +///
+static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up"; + +/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can +/// help you identify which virtual goods are the most popular objects of purchase. Params: +/// +///
    +///
  • @c kFIRParameterItemName (NSString)
  • +///
  • @c kFIRParameterVirtualCurrencyName (NSString)
  • +///
  • @c kFIRParameterValue (signed 64-bit integer or double as NSNumber)
  • +///
+static NSString *const kFIREventSpendVirtualCurrency + NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency"; + +/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use +/// this in a funnel with kFIREventTutorialComplete to understand how many users complete this +/// process and move on to the full app experience. +static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) = + @"tutorial_begin"; + +/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding +/// process. Add this to a funnel with kFIREventTutorialBegin to gauge the completion rate of your +/// on-boarding process. +static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) = + @"tutorial_complete"; + +/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your +/// game. Since achievements generally represent the breadth of a gaming experience, this event can +/// help you understand how many users are experiencing all that your game has to offer. Params: +/// +///
    +///
  • @c kFIRParameterAchievementID (NSString)
  • +///
+static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) = + @"unlock_achievement"; + +/// View Item event. This event signifies that a user has viewed an item. Use the appropriate +/// parameters to contextualize the event. Use this event to discover the most popular items viewed +/// in your app. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the +/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item"; + +/// View Item List event. Log this event when a user sees a list of items or offerings. Params: +/// +///
    +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterItemListID (NSString) (optional)
  • +///
  • @c kFIRParameterItemListName (NSString) (optional)
  • +///
+static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) = + @"view_item_list"; + +/// View Search Results event. Log this event when the user has been presented with the results of a +/// search. Params: +/// +///
    +///
  • @c kFIRParameterSearchTerm (NSString)
  • +///
+static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) = + @"view_search_results"; + +/// Add Shipping Info event. This event signifies that a user has submitted their shipping +/// information. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the +/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c kFIRParameterCoupon (NSString) (optional)
  • +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterShippingTier (NSString) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) = + @"add_shipping_info"; + +/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note: +/// This is different from the in-app purchase event, which is reported automatically for App +/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also supply +/// the @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. +/// Params: +/// +///
    +///
  • @c kFIRParameterAffiliation (NSString) (optional)
  • +///
  • @c kFIRParameterCoupon (NSString) (optional)
  • +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterShipping (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterTax (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterTransactionID (NSString) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase"; + +/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the +/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency parameter so +/// that revenue metrics can be computed accurately. Params: +/// +///
    +///
  • @c kFIRParameterAffiliation (NSString) (optional)
  • +///
  • @c kFIRParameterCoupon (NSString) (optional)
  • +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterShipping (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterTax (double as NSNumber) (optional)
  • +///
  • @c kFIRParameterTransactionID (NSString) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund"; + +/// Select Item event. This event signifies that an item was selected by a user from a list. Use the +/// appropriate parameters to contextualize the event. Use this event to discover the most popular +/// items selected. Params: +/// +///
    +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterItemListID (NSString) (optional)
  • +///
  • @c kFIRParameterItemListName (NSString) (optional)
  • +///
+static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item"; + +/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the +/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion +/// applies. Params: +/// +///
    +///
  • @c kFIRParameterCreativeName (NSString) (optional)
  • +///
  • @c kFIRParameterCreativeSlot (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterLocationID (NSString) (optional)
  • +///
  • @c kFIRParameterPromotionID (NSString) (optional)
  • +///
  • @c kFIRParameterPromotionName (NSString) (optional)
  • +///
+static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) = + @"select_promotion"; + +/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to +/// analyze your purchase funnel. Note: If you supply the @c kFIRParameterValue parameter, you must +/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed +/// accurately. Params: +/// +///
    +///
  • @c kFIRParameterCurrency (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • +///
+static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart"; + +/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event +/// to a funnel with the @c kFIREventAddToCart and @c kFIREventPurchase to gauge your conversion +/// process. Params: +/// +///
    +///
  • @c kFIRParameterCreativeName (NSString) (optional)
  • +///
  • @c kFIRParameterCreativeSlot (NSString) (optional)
  • +///
  • @c kFIRParameterItems (NSArray) (optional)
  • +///
  • @c kFIRParameterLocationID (NSString) (optional)
  • +///
  • @c kFIRParameterPromotionID (NSString) (optional)
  • +///
  • @c kFIRParameterPromotionName (NSString) (optional)
  • +///
+static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) = + @"view_promotion"; diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h new file mode 100755 index 00000000..5775d866 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h @@ -0,0 +1,670 @@ +/// @file FIRParameterNames.h +/// +/// Predefined event parameter names. +/// +/// Params supply information that contextualize Events. You can associate up to 25 unique Params +/// with each Event type. Some Params are suggested below for certain common Events, but you are +/// not limited to these. You may supply extra Params for suggested Events or custom Params for +/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric +/// characters and underscores ("_"), and must start with an alphabetic character. Param values can +/// be up to 100 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and +/// should not be used. + +#import + +/// Game achievement ID (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterAchievementID : @"10_matches_won",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) = + @"achievement_id"; + +/// Ad Network Click ID (NSString). Used for network-specific click IDs which vary in format. +///
+///     NSDictionary *params = @{
+///       kFIRParameterAdNetworkClickID : @"1234567",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterAdNetworkClickID + NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid"; + +/// A product affiliation to designate a supplying company or brick and mortar store location +/// (NSString).
+///     NSDictionary *params = @{
+///       kFIRParameterAffiliation : @"Google Store",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) = + @"affiliation"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterCampaign : @"winter_promotion",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Character used in game (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterCharacter : @"beat_boss",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) = + @"character"; + +/// The checkout step (1..N) (unsigned 64-bit integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterCheckoutStep : @"1",
+///       // ...
+///     };
+/// 
+/// This constant has been deprecated. +static NSString *const kFIRParameterCheckoutStep NS_SWIFT_NAME(AnalyticsParameterCheckoutStep) = + @"checkout_step"; + +/// Some option on a step in an ecommerce flow (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterCheckoutOption : @"Visa",
+///       // ...
+///     };
+/// 
+/// This constant has been deprecated. +static NSString *const kFIRParameterCheckoutOption + NS_SWIFT_NAME(AnalyticsParameterCheckoutOption) = @"checkout_option"; + +/// Campaign content (NSString). +static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content"; + +/// Type of content selected (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterContentType : @"news article",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) = + @"content_type"; + +/// Coupon code used for a purchase (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterCoupon : @"SUMMER_FUN",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon"; + +/// Campaign custom parameter (NSString). Used as a method of capturing custom data in a campaign. +/// Use varies by network. +///
+///     NSDictionary *params = @{
+///       kFIRParameterCP1 : @"custom_data",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1"; + +/// The name of a creative used in a promotional spot (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterCreativeName : @"Summer Sale",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) = + @"creative_name"; + +/// The name of a creative slot (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterCreativeSlot : @"summer_banner2",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) = + @"creative_slot"; + +/// Currency of the purchase or items associated with the event, in 3-letter +/// ISO_4217 format (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterCurrency : @"USD",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) = + @"currency"; + +/// Flight or Travel destination (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterDestination : @"Mountain View, CA",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) = + @"destination"; + +/// The arrival date, check-out date or rental end date for the item. This should be in +/// YYYY-MM-DD format (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterEndDate : @"2015-09-14",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date"; + +/// Flight number for travel events (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterFlightNumber : @"ZZ800",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) = + @"flight_number"; + +/// Group/clan/guild ID (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterGroupID : @"g1",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id"; + +/// The index of the item in a list (signed 64-bit integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterIndex : @(5),
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index"; + +/// Item brand (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemBrand : @"Google",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) = + @"item_brand"; + +/// Item category (context-specific) (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemCategory : @"pants",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) = + @"item_category"; + +/// Item ID (context-specific) (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemID : @"SKU_12345",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id"; + +/// The Google Place ID (NSString) that +/// corresponds to the associated item. Alternatively, you can supply your own custom Location ID. +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     };
+/// 
+/// This constant has been deprecated. Use @c kFIRParameterLocationID constant instead. +static NSString *const kFIRParameterItemLocationID + NS_SWIFT_NAME(AnalyticsParameterItemLocationID) = @"item_location_id"; + +/// Item Name (context-specific) (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemName : @"jeggings",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) = + @"item_name"; + +/// The list in which the item was presented to the user (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemList : @"Search Results",
+///       // ...
+///     };
+/// 
+/// This constant has been deprecated. Use @c kFIRParameterItemListName constant instead. +static NSString *const kFIRParameterItemList NS_SWIFT_NAME(AnalyticsParameterItemList) = + @"item_list"; + +/// Item variant (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemVariant : @"Black",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) = + @"item_variant"; + +/// Level in game (signed 64-bit integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterLevel : @(42),
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level"; + +/// Location (NSString). The Google Place ID +/// that corresponds to the associated event. Alternatively, you can supply your own custom +/// Location ID. +///
+///     NSDictionary *params = @{
+///       kFIRParameterLocation : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) = + @"location"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterMedium : @"email",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// Number of nights staying at hotel (signed 64-bit integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterNumberOfNights : @(3),
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterNumberOfNights + NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights"; + +/// Number of passengers traveling (signed 64-bit integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterNumberOfPassengers : @(11),
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterNumberOfPassengers + NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers"; + +/// Number of rooms for travel events (signed 64-bit integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterNumberOfRooms : @(2),
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) = + @"number_of_rooms"; + +/// Flight or Travel origin (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterOrigin : @"Mountain View, CA",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin"; + +/// Purchase price (double as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterPrice : @(1.0),
+///       kFIRParameterCurrency : @"USD",  // e.g. $1.00 USD
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price"; + +/// Purchase quantity (signed 64-bit integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterQuantity : @(1),
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) = + @"quantity"; + +/// Score in game (signed 64-bit integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterScore : @(4200),
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score"; + +/// The search string/keywords used (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterSearchTerm : @"periodic table",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) = + @"search_term"; + +/// Shipping cost associated with a transaction (double as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterShipping : @(5.99),
+///       kFIRParameterCurrency : @"USD",  // e.g. $5.99 USD
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) = + @"shipping"; + +/// Sign up method (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterSignUpMethod : @"google",
+///       // ...
+///     };
+/// 
+/// +/// This constant has been deprecated. Use Method constant instead. +static NSString *const kFIRParameterSignUpMethod NS_SWIFT_NAME(AnalyticsParameterSignUpMethod) = + @"sign_up_method"; + +/// A particular approach used in an operation; for example, "facebook" or "email" in the context +/// of a sign_up or login event. (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterMethod : @"google",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method"; + +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterSource : @"InMobi",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// The departure date, check-in date or rental start date for the item. This should be in +/// YYYY-MM-DD format (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterStartDate : @"2015-09-14",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) = + @"start_date"; + +/// Tax cost associated with a transaction (double as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterTax : @(2.43),
+///       kFIRParameterCurrency : @"USD",  // e.g. $2.43 USD
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax"; + +/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword +/// (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterTerm : @"game",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term"; + +/// The unique identifier of a transaction (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterTransactionID : @"T12345",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) = + @"transaction_id"; + +/// Travel class (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterTravelClass : @"business",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) = + @"travel_class"; + +/// A context-specific numeric value which is accumulated automatically for each event type. This is +/// a general purpose parameter that is useful for accumulating a key metric that pertains to an +/// event. Examples include revenue, distance, time and points. Value should be specified as signed +/// 64-bit integer or double as NSNumber. Notes: Values for pre-defined currency-related events +/// (such as @c kFIREventAddToCart) should be supplied using double as NSNumber and must be +/// accompanied by a @c kFIRParameterCurrency parameter. The valid range of accumulated values is +/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the +/// corresponding @c kFIRParameterCurrency parameter, or supplying an invalid +/// currency code for conversion events will cause that +/// conversion to be omitted from reporting. +///
+///     NSDictionary *params = @{
+///       kFIRParameterValue : @(3.99),
+///       kFIRParameterCurrency : @"USD",  // e.g. $3.99 USD
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value"; + +/// Name of virtual currency type (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterVirtualCurrencyName : @"virtual_currency_name",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterVirtualCurrencyName + NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name"; + +/// The name of a level in a game (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterLevelName : @"room_1",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) = + @"level_name"; + +/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (unsigned +/// integer as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterSuccess : @(1),
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success"; + +/// Indicates that the associated event should either extend the current session +/// or start a new session if no session was active when the event was logged. +/// Specify YES to extend the current session or to start a new session; any +/// other value will not extend or start a session. +///
+///     NSDictionary *params = @{
+///       kFIRParameterExtendSession : @YES,
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) = + @"extend_session"; + +/// Monetary value of discount associated with a purchase (double as NSNumber). +///
+///     NSDictionary *params = @{
+///       kFIRParameterDiscount : @(2.0),
+///       kFIRParameterCurrency : @"USD",  // e.g. $2.00 USD
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) = + @"discount"; + +/// Item Category (context-specific) (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemCategory2 : @"pants",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) = + @"item_category2"; + +/// Item Category (context-specific) (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemCategory3 : @"pants",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) = + @"item_category3"; + +/// Item Category (context-specific) (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemCategory4 : @"pants",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) = + @"item_category4"; + +/// Item Category (context-specific) (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemCategory5 : @"pants",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) = + @"item_category5"; + +/// The ID of the list in which the item was presented to the user (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemListID : @"ABC123",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) = + @"item_list_id"; + +/// The name of the list in which the item was presented to the user (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItemListName : @"Related products",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) = + @"item_list_name"; + +/// The list of items involved in the transaction. (NSArray). +///
+///     NSDictionary *params = @{
+///       kFIRParameterItems : @[
+///         @{kFIRParameterItemName : @"jeggings", kFIRParameterItemCategory : @"pants"},
+///         @{kFIRParameterItemName : @"boots", kFIRParameterItemCategory : @"shoes"},
+///       ],
+///     };
+/// 
+static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items"; + +/// The location associated with the event. Preferred to be the Google +/// Place ID that corresponds to the +/// associated item but could be overridden to a custom location ID string.(NSString).
+///     NSDictionary *params = @{
+///       kFIRParameterLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) = + @"location_id"; + +/// The chosen method of payment (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterPaymentType : @"Visa",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) = + @"payment_type"; + +/// The ID of a product promotion (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterPromotionID : @"ABC123",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) = + @"promotion_id"; + +/// The name of a product promotion (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterPromotionName : @"Summer Sale",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) = + @"promotion_name"; + +/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item +/// (NSString). +///
+///     NSDictionary *params = @{
+///       kFIRParameterShippingTier : @"Ground",
+///       // ...
+///     };
+/// 
+static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) = + @"shipping_tier"; diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h new file mode 100755 index 00000000..132aef77 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h @@ -0,0 +1,29 @@ +/// @file FIRUserPropertyNames.h +/// +/// Predefined user property names. +/// +/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can +/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 +/// unique UserProperties per app, and you can use the name and value of your choosing for each one. +/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and +/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to +/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not +/// be used. + +#import + +/// The method used to sign in. For example, "google", "facebook" or "twitter". +static NSString *const kFIRUserPropertySignUpMethod + NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method"; + +/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user. +/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the +/// documentation for +/// more details and information about related settings. +/// +///
+///     [FIRAnalytics setUserPropertyString:@"NO"
+///                                 forName:kFIRUserPropertyAllowAdPersonalizationSignals];
+/// 
+static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals + NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads"; diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h new file mode 100755 index 00000000..ed7588a6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h @@ -0,0 +1,5 @@ +#import "FIRAnalytics+AppDelegate.h" +#import "FIRAnalytics.h" +#import "FIREventNames.h" +#import "FIRParameterNames.h" +#import "FIRUserPropertyNames.h" diff --git a/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap new file mode 100755 index 00000000..d7c59054 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap @@ -0,0 +1,12 @@ +framework module FirebaseAnalytics { + umbrella header "FirebaseAnalytics.h" + export * + module * { export * } + link "sqlite3" + link "z" + link framework "CoreData" + link framework "Security" + link framework "StoreKit" + link framework "SystemConfiguration" + link framework "UIKit" +} diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/CHANGELOG.md b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/CHANGELOG.md new file mode 100644 index 00000000..7a319088 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/CHANGELOG.md @@ -0,0 +1,253 @@ +# v6.5.3 +- [changed] Remove unused mfa request field "mfa_provider" (#5397) +- [fixed] Suppress deprecation warnings when targeting iOS versions up to iOS 13. (#5437) + +# v6.5.2 +- [fixed] Handle calls to `useUserAccessGroup` soon after configure. (#4175) + +# v6.5.1 +- [changed] File structure changes. No functional change. +- [changed] Code formatting changes. + +# v6.5.0 +- [feature] Added support of Multi-factor Authentication. (#4823) + +# v6.4.1 +- [fixed] Added support of UISceneDelegate for URL redirect. (#4380) +- [fixed] Fixed rawNonce in encoder. (#4337) + +# v6.4.0 +- [feature] Added support for Sign-in with Apple. (#4183) + +# v6.3.1 +- [fixed] Removed usage of a deprecated property on iOS 13. (#4066) + +# v6.3.0 +- [added] Added methods allowing developers to link and reauthenticate with federated providers. (#3971) + +# v6.2.3 +- [fixed] Make sure the first valid auth domain is retrieved. (#3493) +- [fixed] Add assertion for Facebook generic IDP flow. (#3208) +- [fixed] Build for Catalyst. (#3549) + +# v6.2.2 +- [fixed] Fixed an issue where unlinking an email auth provider raised an incorrect error stating the account was not linked to an email auth provider. (#3405) +- [changed] Renamed internal Keychain classes. (#3473) + +# v6.2.1 +- [added] Add new client error MISSING_CLIENT_IDENTIFIER. (#3341) + +# v6.2.0 +- [feature] Expose `secret` of OAuth credential in public header. (#3089) +- [fixed] Fix a keychain issue where API key is incorrectly set. (#3239) + +# v6.1.2 +- [fixed] Fix line limits and linter warnings in public documentation. (#3139) + +# v6.1.1 +- [fixed] Fix an issue where a user can't link with email provider by email link. (#3030) + +# v6.1.0 +- [added] Add support of web.app as an auth domain. (#2959) +- [fixed] Fix an issue where the return type of `getStoredUserForAccessGroup:error:` is nonnull. (#2879) + +# v6.0.0 +- [added] Add support of single sign on. (#2684) +- [deprecated] Deprecate `reauthenticateAndRetrieveDataWithCredential:completion:`, `signInAndRetrieveDataWithCredential:completion:`, `linkAndRetrieveDataWithCredential:completion:`, `fetchProvidersForEmail:completion:`. (#2723, #2756) +- [added] Returned oauth secret token in Generic IDP sign-in for Twitter. (#2663) +- [removed] Remove pendingToken from public API. (#2676) +- [changed] `GULAppDelegateSwizzler` is used for the app delegate swizzling. (#2591) + +# v5.4.2 +- [added] Support new error code ERROR_INVALID_PROVIDER_ID. (#2629) + +# v5.4.1 +- [deprecated] Deprecate Microsoft and Yahoo OAuth Provider ID (#2517) +- [fixed] Fix an issue where an exception was thrown when linking OAuth credentials. (#2521) +- [fixed] Fix an issue where a wrong error was thrown when handling error with + FEDERATED_USER_ID_ALREADY_LINKED. (#2522) + +# v5.4.0 +- [added] Add support of Generic IDP (#2405). + +# v5.3.0 +- [changed] Use the new registerInternalLibrary API to register with FirebaseCore. (#2137) + +# v5.2.0 +- [added] Add support of Game Center sign in (#2127). + +# v5.1.0 +- [added] Add support of custom FDL domain link (#2121). + +# v5.0.5 +- [changed] Restore SafariServices framework dependency (#2002). + +# v5.0.4 +- [fixed] Fix analyzer issues (#1740). + +# v5.0.3 +- [added] Add `FIRAuthErrorCodeMalformedJWT`, which is raised on JWT token parsing. + failures during auth operations (#1436). +- [changed] Migrate to use FirebaseAuthInterop interfaces to access FirebaseAuth (#1501). + +# v5.0.2 +- [fixed] Fix an issue where JWT date timestamps weren't parsed correctly. (#1319) +- [fixed] Fix an issue where anonymous accounts weren't correctly promoted to + non-anonymous when linked with passwordless email auth accounts. (#1383) +- [fixed] Fix an exception from using an invalidated NSURLSession. (#1261) +- [fixed] Fix a data race issue caught by the sanitizer. (#1446) + +# v5.0.1 +- [fixed] Restore 4.x level of support for extensions (#1357). + +# v5.0.0 +- [added] Adds APIs for phone Auth testing to bypass the verification flow (#1192). +- [feature] Changes the callback block signature for sign in and create user methods + to provide an AuthDataResult that includes the user and user info (#1123, #1186). +- [changed] Removes GoogleToolboxForMac dependency (#1175). +- [removed] Removes miscellaneous deprecated APIs (#1188, #1200). + +# v4.6.1 +- [fixed] Fixes crash which occurred when certain Firebase IDTokens were being parsed (#1076). + +# v4.6.0 +- [added] Adds `getIDTokenResultWithCompletion:` and `getIDTokenResultForcingRefresh:completion:` APIs which + call back with an AuthTokenResult object. The Auth token result object contains the ID token JWT string and other properties associated with the token including the decoded available payload claims (#1004). + +- [added] Adds the `updateCurrentUser:completion:` API which sets the currentUser on the calling Auth instance to the provided user object (#1018). + +- [added] Adds client-side validation to prevent setting `handleCodeInApp` to false when performing + email-link authentication. If `handleCodeInApp` is set to false an invalid argument exception + is thrown (#931). + +- [added] Adds support for passing the deep link (which is embedded in the sign-in link sent via email) to the + `signInWithEmail:link:completion:` and `isSignInWithEmailLink:` methods during an + email/link sign-in flow (#1023). + +# v4.5.0 +- [added] Adds new API which provides a way to determine the sign-in methods associated with an + email address. +- [added] Adds new API which allows authentication using only an email link (Passwordless Authentication + with email link). + +# v4.4.4 +- [fixed] Addresses CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF warnings that surface in newer versions of + Xcode and CocoaPods. +- [fixed] Improves FIRUser documentation with clear message explaining when Firebase Auth attempts to validate + users and what happens when an invalidated user is detected (#694) . + +# v4.4.3 +- [added] Adds an explicit dependency on CoreGraphics from Firebase Auth. + +# v4.4.2 +- [fixed] Fixes bug where the FIRAuthResult object returned following a Phone Number authentication + always contained a nil FIRAdditionalUserInfo object. Now the FIRAdditionalUserInfo object is + never nil and its newUser field is populated correctly. + +# v4.4.0 +- [fixed] Adds new APIs which return an AuthDataResult object after successfully creating an + Email/Password user, signing in anonymously, signing in with Email/Password and signing + in with Custom Token. The AuthDataResult object contains the new user and additional + information pertaining to the new user. + +# v4.3.2 +- [fixed] Improves error handling for the phone number sign-in reCAPTCHA flow. +- [fixed] Improves error handling for phone number linking flow. +- [fixed] Fixes issue where after linking an anonymous user to a phone number the user remained + anonymous. + +# v4.3.1 +- [changed] Internal clean up. + +# v4.3.0 +- [added] Provides account creation and last sign-in dates as metadata to the user + object. +- [added] Returns more descriptive errors for some error cases of the phone number + sign-in reCAPTCHA flow. +- [fixed] Fixes an issue that invalid users were not automatically signed out earlier. +- [fixed] Fixes an issue that ID token listeners were not fired in some cases. + +# v4.2.1 +- [fixed] Fixes a threading issue in phone number auth that completion block was not + executed on the main thread in some error cases. + +# v4.2.0 +- [added] Adds new phone number verification API which makes use of an intelligent reCAPTCHA to verify the application. + +# v4.1.1 +- [changed] Improves some method documentation in headers. + +# v4.1.0 +- [added] Allows the app to handle continue URL natively, e.g., from password reset + email. +- [added] Allows the app to set language code, e.g., for sending password reset email. +- [fixed] Fixes an issue that user's phone number did not persist on client. +- [fixed] Fixes an issue that recover email action code type was reported as unknown. +- [feature] Improves app start-up time by moving initialization off from the main + thread. +- [fixed] Better reports missing email error when creating a new password user. +- [fixed] Changes console message logging levels to be more consistent with other + Firebase products on the iOS platform. + +# 2017-05-17 -- v4.0.0 +- [added] Adds Phone Number Authentication. +- [added] Adds support for generic OAuth2 identity providers. +- [added] Adds methods that return additional user data from identity providers if + available when authenticating users. +- [added] Improves session management by automatically refreshing tokens if possible + and signing out users if the session is detected invalidated, for example, + after the user changed password or deleted account from another device. +- [fixed] Fixes an issue that reauthentication creates new user account if the user + credential is valid but does not match the currently signed in user. +- [fixed] Fixes an issue that the "password" provider is not immediately listed on the + client side after adding a password to an account. +- [changed] Changes factory methods to return non-null FIRAuth instances or raises an + exception, instead of returning nullable instances. +- [changed] Changes auth state change listener to only be triggered when the user changes. +- [added] Adds a new listener which is triggered whenever the ID token is changed. +- [changed] Switches ERROR_EMAIL_ALREADY_IN_USE to + ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL when the email used in the + signInWithCredential: call is already in use by another account. +- [deprecated] Deprecates FIREmailPasswordAuthProvider in favor of FIREmailAuthProvider. +- [deprecated] Deprecates getTokenWithCompletion in favor of getIDTokenWithCompletion on + FIRUser. +- [fixed] Changes Swift API names to better align with Swift convention. + +# 2017-02-06 -- v3.1.1 +- [added] Allows handling of additional errors when sending OOB action emails. The + server can respond with the following new error messages: + INVALID_MESSAGE_PAYLOAD,INVALID_SENDER and INVALID_RECIPIENT_EMAIL. +- [fixed] Removes incorrect reference to FIRAuthErrorCodeCredentialTooOld in FIRUser.h. +- [added] Provides additional error information from server if available. + +# 2016-12-13 -- v3.1.0 +- [added] Adds FIRAuth methods that enable the app to follow up with user actions + delivered by email, such as verifying email address or reset password. +- [fixed] No longer applies the keychain workaround introduced in v3.0.5 on iOS 10.2 + simulator or above since the issue has been fixed. +- [fixed] Fixes nullability compilation warnings when used in Swift. +- [fixed] Better reports missing password error. + +# 2016-10-24 -- v3.0.6 +- [changed] Switches to depend on open sourced GoogleToolboxForMac and GTMSessionFetcher. +- [fixed] Improves logging of keychain error when initializing. + +# 2016-09-14 -- v3.0.5 +- [fixed] Works around a keychain issue in iOS 10 simulator. +- [fixed] Reports the correct error for invalid email when signing in with email and + password. + +# 2016-07-18 -- v3.0.4 +- [fixed] Fixes a race condition bug that could crash the app with an exception from + NSURLSession on iOS 9. + +# 2016-06-20 -- v3.0.3 +- [added] Adds documentation for all possible errors returned by each method. +- [fixed] Improves error handling and messages for a variety of error conditions. +- [fixed] Whether or not an user is considered anonymous is now consistent with other + platforms. +- [changed] A saved signed in user is now siloed between different Firebase projects + within the same app. + +# 2016-05-18 -- v3.0.2 +- Initial public release. diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/README.md b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/README.md new file mode 100644 index 00000000..f6e123e3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/README.md @@ -0,0 +1,17 @@ +# Firebase Auth for iOS + +Firebase Auth enables apps to easily support multiple authentication options +for their end users. + +Please visit [our developer site](https://firebase.google.com/docs/auth/) for +integration instructions, documentation, support information, and terms of +service. + +# Firebase Auth Development + +Example/Auth contains a set of samples and tests that integrate with +FirebaseAuth. + +The unit tests run without any additional configuration along with the rest of +Firebase. See [Example/Auth/README.md](../../Example/Auth/README.md) for +information about setting up, running, and testing the samples. diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRActionCodeSettings.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRActionCodeSettings.m new file mode 100644 index 00000000..e45bb600 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRActionCodeSettings.m @@ -0,0 +1,45 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRActionCodeSettings + +- (instancetype)init { + self = [super init]; + if (self) { + _iOSBundleID = [NSBundle mainBundle].bundleIdentifier; + } + return self; +} + +- (void)setIOSBundleID:(NSString *)iOSBundleID { + _iOSBundleID = [iOSBundleID copy]; +} + +- (void)setAndroidPackageName:(NSString *)androidPackageName + installIfNotAvailable:(BOOL)installIfNotAvailable + minimumVersion:(nullable NSString *)minimumVersion { + _androidPackageName = [androidPackageName copy]; + _androidInstallIfNotAvailable = installIfNotAvailable; + _androidMinimumVersion = [minimumVersion copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuth.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuth.m new file mode 100644 index 00000000..577be48d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuth.m @@ -0,0 +1,2247 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h" + +#if __has_include() +#import +#endif + +#import +#import +#import +#import +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h" +#import "FirebaseAuth/Sources/Auth/FIRAuthDispatcher.h" +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/Auth/FIRAuthOperationType.h" +#import "FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.h" +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h" +#import "FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.h" +#import "FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.h" +#import "FirebaseAuth/Sources/User/FIRAdditionalUserInfo_Internal.h" +#import "FirebaseAuth/Sources/User/FIRUser_Internal.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h" + +#if TARGET_OS_IOS +#import "FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +#pragma mark - Constants + +#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +const NSNotificationName FIRAuthStateDidChangeNotification = @"FIRAuthStateDidChangeNotification"; +#else +NSString *const FIRAuthStateDidChangeNotification = @"FIRAuthStateDidChangeNotification"; +#endif // defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 + +/** @var kMaxWaitTimeForBackoff + @brief The maximum wait time before attempting to retry auto refreshing tokens after a failed + attempt. + @remarks This is the upper limit (in seconds) of the exponential backoff used for retrying + token refresh. + */ +static NSTimeInterval kMaxWaitTimeForBackoff = 16 * 60; + +/** @var kTokenRefreshHeadStart + @brief The amount of time before the token expires that proactive refresh should be attempted. + */ +NSTimeInterval kTokenRefreshHeadStart = 5 * 60; + +/** @var kUserKey + @brief Key of user stored in the keychain. Prefixed with a Firebase app name. + */ +static NSString *const kUserKey = @"%@_firebase_user"; + +/** @var kMissingEmailInvalidParameterExceptionReason + @brief The reason for @c invalidParameterException when the email used to initiate password + reset is nil. + */ +static NSString *const kMissingEmailInvalidParameterExceptionReason = + @"The email used to initiate password reset cannot be nil."; + +/** @var kHandleCodeInAppFalseExceptionReason + @brief The reason for @c invalidParameterException when the handleCodeInApp parameter is false + on the ActionCodeSettings object used to send the link for Email-link Authentication. + */ +static NSString *const kHandleCodeInAppFalseExceptionReason = + @"You must set handleCodeInApp in your ActionCodeSettings to true for Email-link " + "Authentication."; + +static NSString *const kInvalidEmailSignInLinkExceptionMessage = + @"The link provided is not valid for email/link sign-in. Please check the link by calling " + "isSignInWithEmailLink:link: on Auth before attempting to use it for email/link sign-in."; + +/** @var kPasswordResetRequestType + @brief The action code type value for resetting password in the check action code response. + */ +static NSString *const kPasswordResetRequestType = @"PASSWORD_RESET"; + +/** @var kVerifyEmailRequestType + @brief The action code type value for verifying email in the check action code response. + */ +static NSString *const kVerifyEmailRequestType = @"VERIFY_EMAIL"; + +/** @var kRecoverEmailRequestType + @brief The action code type value for recovering email in the check action code response. + */ +static NSString *const kRecoverEmailRequestType = @"RECOVER_EMAIL"; + +/** @var kEmailLinkSignInRequestType + @brief The action code type value for an email sign-in link in the check action code response. +*/ +static NSString *const kEmailLinkSignInRequestType = @"EMAIL_SIGNIN"; + +/** @var kVerifyAndChangeEmailRequestType + @brief The action code type value for verifing and changing email in the check action code + response. + */ +static NSString *const kVerifyAndChangeEmailRequestType = @"VERIFY_AND_CHANGE_EMAIL"; + +/** @var kRevertSecondFactorAdditionRequestType + @brief The action code type value for reverting second factor addition in the check action code + response. + */ +static NSString *const kRevertSecondFactorAdditionRequestType = @"REVERT_SECOND_FACTOR_ADDITION"; + +/** @var kMissingPasswordReason + @brief The reason why the @c FIRAuthErrorCodeWeakPassword error is thrown. + @remarks This error message will be localized in the future. + */ +static NSString *const kMissingPasswordReason = @"Missing Password"; + +/** @var gKeychainServiceNameForAppName + @brief A map from Firebase app name to keychain service names. + @remarks This map is needed for looking up the keychain service name after the FIRApp instance + is deleted, to remove the associated keychain item. Accessing should occur within a + @syncronized([FIRAuth class]) context. + */ +static NSMutableDictionary *gKeychainServiceNameForAppName; + +#pragma mark - FIRActionCodeInfo + +@interface FIRActionCodeInfo () + +/** + @brief The operation being performed. + */ +@property(nonatomic, readwrite) FIRActionCodeOperation operation; + +/** @property email + @brief The email address to which the code was sent. The new email address in the case of + FIRActionCodeOperationRecoverEmail. + */ +@property(nonatomic, nullable, readwrite, copy) NSString *email; + +/** @property previousEmail + @brief The current email address in the case of FIRActionCodeOperationRecoverEmail. + */ +@property(nonatomic, nullable, readwrite, copy) NSString *previousEmail; + +#if TARGET_OS_IOS +/** @property multiFactorInfo + @brief The MultiFactorInfo object of the second factor to be reverted in case of + FIRActionCodeMultiFactorInfoKey. + */ +@property(nonatomic, nullable, readwrite) FIRMultiFactorInfo *multiFactorInfo; +#endif + +@end + +@implementation FIRActionCodeInfo + +- (NSString *)dataForKey:(FIRActionDataKey)key { + switch (key) { + case FIRActionCodeEmailKey: + return self.email; + case FIRActionCodeFromEmailKey: + return self.previousEmail; + } +} + +- (instancetype)initWithOperation:(FIRActionCodeOperation)operation + email:(NSString *)email + newEmail:(nullable NSString *)newEmail { + self = [super init]; + if (self) { + _operation = operation; + if (newEmail) { + _email = [newEmail copy]; + _previousEmail = [email copy]; + } else { + _email = [email copy]; + } + } + return self; +} + +/** @fn actionCodeOperationForRequestType: + @brief Returns the corresponding operation type per provided request type string. + @param requestType Request type returned in in the server response. + @return The corresponding FIRActionCodeOperation for the supplied request type. + */ ++ (FIRActionCodeOperation)actionCodeOperationForRequestType:(NSString *)requestType { + if ([requestType isEqualToString:kPasswordResetRequestType]) { + return FIRActionCodeOperationPasswordReset; + } + if ([requestType isEqualToString:kVerifyEmailRequestType]) { + return FIRActionCodeOperationVerifyEmail; + } + if ([requestType isEqualToString:kRecoverEmailRequestType]) { + return FIRActionCodeOperationRecoverEmail; + } + if ([requestType isEqualToString:kEmailLinkSignInRequestType]) { + return FIRActionCodeOperationEmailLink; + } + if ([requestType isEqualToString:kVerifyAndChangeEmailRequestType]) { + return FIRActionCodeOperationVerifyAndChangeEmail; + } + if ([requestType isEqualToString:kRevertSecondFactorAdditionRequestType]) { + return FIRActionCodeOperationRevertSecondFactorAddition; + } + return FIRActionCodeOperationUnknown; +} + +@end + +#pragma mark - FIRActionCodeURL + +@implementation FIRActionCodeURL + +/** @fn FIRAuthParseURL:NSString + @brief Parses an incoming URL into all available query items. + @param urlString The url to be parsed. + @return A dictionary of available query items in the target URL. + */ ++ (NSDictionary *)parseURL:(NSString *)urlString { + NSString *linkURL = [NSURLComponents componentsWithString:urlString].query; + if (!linkURL) { + return @{}; + } + NSArray *URLComponents = [linkURL componentsSeparatedByString:@"&"]; + NSMutableDictionary *queryItems = + [[NSMutableDictionary alloc] initWithCapacity:URLComponents.count]; + for (NSString *component in URLComponents) { + NSRange equalRange = [component rangeOfString:@"="]; + if (equalRange.location != NSNotFound) { + NSString *queryItemKey = + [[component substringToIndex:equalRange.location] stringByRemovingPercentEncoding]; + NSString *queryItemValue = + [[component substringFromIndex:equalRange.location + 1] stringByRemovingPercentEncoding]; + if (queryItemKey && queryItemValue) { + queryItems[queryItemKey] = queryItemValue; + } + } + } + return queryItems; +} + ++ (nullable instancetype)actionCodeURLWithLink:(NSString *)link { + NSDictionary *queryItems = [FIRActionCodeURL parseURL:link]; + if (!queryItems.count) { + NSURLComponents *urlComponents = [NSURLComponents componentsWithString:link]; + queryItems = [FIRActionCodeURL parseURL:urlComponents.query]; + } + if (!queryItems.count) { + return nil; + } + NSString *APIKey = queryItems[@"apiKey"]; + NSString *actionCode = queryItems[@"oobCode"]; + NSString *continueURLString = queryItems[@"continueUrl"]; + NSString *languageCode = queryItems[@"languageCode"]; + NSString *mode = queryItems[@"mode"]; + NSString *tenantID = queryItems[@"tenantID"]; + return [[FIRActionCodeURL alloc] initWithAPIKey:APIKey + actionCode:actionCode + continueURLString:continueURLString + languageCode:languageCode + mode:mode + tenantID:tenantID]; +} + +- (nullable instancetype)initWithAPIKey:(NSString *)APIKey + actionCode:(NSString *)actionCode + continueURLString:(NSString *)continueURLString + languageCode:(NSString *)languageCode + mode:(NSString *)mode + tenantID:(NSString *)tenantID { + self = [super init]; + if (self) { + _APIKey = APIKey; + _operation = [FIRActionCodeInfo actionCodeOperationForRequestType:mode]; + _code = actionCode; + _continueURL = [NSURL URLWithString:continueURLString]; + _languageCode = languageCode; + } + return self; +} + +@end + +#pragma mark - FIRAuth + +#if TARGET_OS_IOS +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 +@interface FIRAuth () +#else +@interface FIRAuth () +#endif +#else +@interface FIRAuth () +#endif + +/** @property firebaseAppId + @brief The Firebase app ID. + */ +@property(nonatomic, copy, readonly) NSString *firebaseAppId; + +/** @property additionalFrameworkMarker + @brief Additional framework marker that will be added as part of the header of every request. + */ +@property(nonatomic, copy, nullable) NSString *additionalFrameworkMarker; + +/** @property storedUserManager + @brief The stored user manager. + */ +@property(nonatomic, strong, nullable) FIRAuthStoredUserManager *storedUserManager; + +/** @fn initWithApp: + @brief Creates a @c FIRAuth instance associated with the provided @c FIRApp instance. + @param app The application to associate the auth instance with. + */ +- (instancetype)initWithApp:(FIRApp *)app; + +@end + +@implementation FIRAuth { + /** @var _currentUser + @brief The current user. + */ + FIRUser *_currentUser; + + /** @var _firebaseAppName + @brief The Firebase app name. + */ + NSString *_firebaseAppName; + + /** @var _listenerHandles + @brief Handles returned from @c NSNotificationCenter for blocks which are "auth state did + change" notification listeners. + @remarks Mutations should occur within a @syncronized(self) context. + */ + NSMutableArray *_listenerHandles; + + /** @var _keychainServices + @brief The keychain service. + */ + FIRAuthKeychainServices *_keychainServices; + + /** @var _lastNotifiedUserToken + @brief The user access (ID) token used last time for posting auth state changed notification. + */ + NSString *_lastNotifiedUserToken; + + /** @var _autoRefreshTokens + @brief This flag denotes whether or not tokens should be automatically refreshed. + @remarks Will only be set to @YES if the another Firebase service is included (additionally to + Firebase Auth). + */ + BOOL _autoRefreshTokens; + + /** @var _autoRefreshScheduled + @brief Whether or not token auto-refresh is currently scheduled. + */ + BOOL _autoRefreshScheduled; + + /** @var _isAppInBackground + @brief A flag that is set to YES if the app is put in the background and no when the app is + returned to the foreground. + */ + BOOL _isAppInBackground; + + /** @var _applicationDidBecomeActiveObserver + @brief An opaque object to act as the observer for UIApplicationDidBecomeActiveNotification. + */ + id _applicationDidBecomeActiveObserver; + + /** @var _applicationDidBecomeActiveObserver + @brief An opaque object to act as the observer for + UIApplicationDidEnterBackgroundNotification. + */ + id _applicationDidEnterBackgroundObserver; +} + ++ (void)load { + [FIRApp registerInternalLibrary:(Class)self + withName:@"fire-auth" + withVersion:[NSString stringWithUTF8String:FirebaseAuthVersionStr]]; +} + ++ (void)initialize { + gKeychainServiceNameForAppName = [[NSMutableDictionary alloc] init]; +} + ++ (FIRAuth *)auth { + FIRApp *defaultApp = [FIRApp defaultApp]; + if (!defaultApp) { + [NSException raise:NSInternalInconsistencyException + format:@"The default FIRApp instance must be configured before the default FIRAuth" + @"instance can be initialized. One way to ensure that is to call " + @"`[FIRApp configure];` (`FirebaseApp.configure()` in Swift) in the App " + @"Delegate's `application:didFinishLaunchingWithOptions:` " + @"(`application(_:didFinishLaunchingWithOptions:)` in Swift)."]; + } + return [self authWithApp:defaultApp]; +} + ++ (FIRAuth *)authWithApp:(FIRApp *)app { + // Get the instance of Auth from the container, which will create or return the cached instance + // associated with this app. + id auth = FIR_COMPONENT(FIRAuthInterop, app.container); + return (FIRAuth *)auth; +} + +- (instancetype)initWithApp:(FIRApp *)app { + [FIRAuth setKeychainServiceNameForApp:app]; + self = [self initWithAPIKey:app.options.APIKey appName:app.name]; + if (self) { + _app = app; +#if TARGET_OS_IOS + _authURLPresenter = [[FIRAuthURLPresenter alloc] init]; +#endif + } + return self; +} + +- (nullable instancetype)initWithAPIKey:(NSString *)APIKey appName:(NSString *)appName { + self = [super init]; + if (self) { + _listenerHandles = [NSMutableArray array]; + _requestConfiguration = [[FIRAuthRequestConfiguration alloc] initWithAPIKey:APIKey]; + _firebaseAppName = [appName copy]; +#if TARGET_OS_IOS + _settings = [[FIRAuthSettings alloc] init]; + static Class applicationClass = nil; + // iOS App extensions should not call [UIApplication sharedApplication], even if UIApplication + // responds to it. + if (![GULAppEnvironmentUtil isAppExtension]) { + Class cls = NSClassFromString(@"UIApplication"); + if (cls && [cls respondsToSelector:NSSelectorFromString(@"sharedApplication")]) { + applicationClass = cls; + } + } + UIApplication *application = [applicationClass sharedApplication]; + + [GULAppDelegateSwizzler proxyOriginalDelegateIncludingAPNSMethods]; + [GULSceneDelegateSwizzler proxyOriginalSceneDelegate]; +#endif // TARGET_OS_IOS + + // Continue with the rest of initialization in the work thread. + __weak FIRAuth *weakSelf = self; + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + // Load current user from Keychain. + FIRAuth *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + NSString *keychainServiceName = + [FIRAuth keychainServiceNameForAppName:strongSelf->_firebaseAppName]; + if (keychainServiceName) { + strongSelf->_keychainServices = + [[FIRAuthKeychainServices alloc] initWithService:keychainServiceName]; + strongSelf.storedUserManager = + [[FIRAuthStoredUserManager alloc] initWithServiceName:keychainServiceName]; + } + + NSError *error; + NSString *storedUserAccessGroup = + [strongSelf.storedUserManager getStoredUserAccessGroupWithError:&error]; + if (!error) { + if (!storedUserAccessGroup) { + FIRUser *user; + if ([strongSelf getUser:&user error:&error]) { + [strongSelf updateCurrentUser:user byForce:NO savingToDisk:NO error:&error]; + self->_lastNotifiedUserToken = user.rawAccessToken; + } else { + FIRLogError(kFIRLoggerAuth, @"I-AUT000001", + @"Error loading saved user when starting up: %@", error); + } + } else { + [strongSelf internalUseUserAccessGroup:storedUserAccessGroup error:&error]; + if (error) { + FIRLogError(kFIRLoggerAuth, @"I-AUT000001", + @"Error loading saved user when starting up: %@", error); + } + } + } else { + FIRLogError(kFIRLoggerAuth, @"I-AUT000001", + @"Error loading saved user when starting up: %@", error); + } + +#if TARGET_OS_IOS + // Initialize for phone number auth. + strongSelf->_tokenManager = [[FIRAuthAPNSTokenManager alloc] initWithApplication:application]; + + strongSelf->_appCredentialManager = + [[FIRAuthAppCredentialManager alloc] initWithKeychain:strongSelf->_keychainServices]; + + strongSelf->_notificationManager = [[FIRAuthNotificationManager alloc] + initWithApplication:application + appCredentialManager:strongSelf->_appCredentialManager]; + + [GULAppDelegateSwizzler registerAppDelegateInterceptor:strongSelf]; +#if ((TARGET_OS_IOS || TARGET_OS_TV) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 130000)) + if (@available(iOS 13, tvos 13, *)) { + [GULSceneDelegateSwizzler registerSceneDelegateInterceptor:strongSelf]; + } +#endif // ((TARGET_OS_IOS || TARGET_OS_TV) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 130000)) +#endif // TARGET_OS_IOS + }); + } + return self; +} + +- (void)dealloc { + @synchronized(self) { + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; + while (_listenerHandles.count != 0) { + FIRAuthStateDidChangeListenerHandle handleToRemove = _listenerHandles.lastObject; + [defaultCenter removeObserver:handleToRemove]; + [_listenerHandles removeLastObject]; + } + +#if TARGET_OS_IOS + [defaultCenter removeObserver:_applicationDidBecomeActiveObserver + name:UIApplicationDidBecomeActiveNotification + object:nil]; + [defaultCenter removeObserver:_applicationDidEnterBackgroundObserver + name:UIApplicationDidEnterBackgroundNotification + object:nil]; +#endif + } +} + +#pragma mark - Public API + +- (nullable FIRUser *)currentUser { + __block FIRUser *result; + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + result = self->_currentUser; + }); + return result; +} + +- (void)fetchProvidersForEmail:(NSString *)email + completion:(nullable FIRProviderQueryCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRCreateAuthURIRequest *request = + [[FIRCreateAuthURIRequest alloc] initWithIdentifier:email + continueURI:@"http://www.google.com/" + requestConfiguration:self->_requestConfiguration]; + [FIRAuthBackend + createAuthURI:request + callback:^(FIRCreateAuthURIResponse *_Nullable response, NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(response.allProviders, error); + }); + } + }]; + }); +} + +- (void)signInWithProvider:(id)provider + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRAuthDataResultCallback)completion { +#if TARGET_OS_IOS + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuthDataResultCallback decoratedCallback = + [self signInFlowAuthDataResultCallbackByDecoratingCallback:completion]; + [provider getCredentialWithUIDelegate:UIDelegate + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) { + if (error) { + decoratedCallback(nil, error); + return; + } + [self + internalSignInAndRetrieveDataWithCredential:credential + isReauthentication:NO + callback:decoratedCallback]; + }]; + }); +#endif // TARGET_OS_IOS +} + +- (void)fetchSignInMethodsForEmail:(nonnull NSString *)email + completion:(nullable FIRSignInMethodQueryCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRCreateAuthURIRequest *request = + [[FIRCreateAuthURIRequest alloc] initWithIdentifier:email + continueURI:@"http://www.google.com/" + requestConfiguration:self->_requestConfiguration]; + [FIRAuthBackend + createAuthURI:request + callback:^(FIRCreateAuthURIResponse *_Nullable response, NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(response.signinMethods, error); + }); + } + }]; + }); +} + +- (void)signInWithEmail:(NSString *)email + password:(NSString *)password + completion:(nullable FIRAuthDataResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuthDataResultCallback decoratedCallback = + [self signInFlowAuthDataResultCallbackByDecoratingCallback:completion]; + [self internalSignInAndRetrieveDataWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + decoratedCallback(authResult, error); + }]; + }); +} + +- (void)signInWithEmail:(NSString *)email + link:(NSString *)link + completion:(nullable FIRAuthDataResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuthDataResultCallback decoratedCallback = + [self signInFlowAuthDataResultCallbackByDecoratingCallback:completion]; + FIREmailPasswordAuthCredential *credential = + [[FIREmailPasswordAuthCredential alloc] initWithEmail:email link:link]; + [self internalSignInAndRetrieveDataWithCredential:credential + isReauthentication:NO + callback:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + decoratedCallback(authResult, error); + }]; + }); +} + +/** @fn signInWithEmail:password:callback: + @brief Signs in using an email address and password. + @param email The user's email address. + @param password The user's password. + @param callback A block which is invoked when the sign in finishes (or is cancelled.) Invoked + asynchronously on the global auth work queue in the future. + @remarks This is the internal counterpart of this method, which uses a callback that does not + update the current user. + */ +- (void)signInWithEmail:(NSString *)email + password:(NSString *)password + callback:(FIRAuthResultCallback)callback { + FIRVerifyPasswordRequest *request = + [[FIRVerifyPasswordRequest alloc] initWithEmail:email + password:password + requestConfiguration:_requestConfiguration]; + + if (![request.password length]) { + callback(nil, [FIRAuthErrorUtils wrongPasswordErrorWithMessage:nil]); + return; + } + [FIRAuthBackend + verifyPassword:request + callback:^(FIRVerifyPasswordResponse *_Nullable response, NSError *_Nullable error) { + if (error) { + callback(nil, error); + return; + } + [self completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken + anonymous:NO + callback:callback]; + }]; +} + +/** @fn internalSignInAndRetrieveDataWithEmail:password:callback: + @brief Signs in using an email address and password. + @param email The user's email address. + @param password The user's password. + @param completion A block which is invoked when the sign in finishes (or is cancelled.) Invoked + asynchronously on the global auth work queue in the future. + @remarks This is the internal counterpart of this method, which uses a callback that does not + update the current user. + */ +- (void)internalSignInAndRetrieveDataWithEmail:(NSString *)email + password:(NSString *)password + completion:(FIRAuthDataResultCallback)completion { + FIREmailPasswordAuthCredential *credentail = + [[FIREmailPasswordAuthCredential alloc] initWithEmail:email password:password]; + [self internalSignInAndRetrieveDataWithCredential:credentail + isReauthentication:NO + callback:completion]; +} + +/** @fn signInAndRetrieveDataWithGameCenterCredential:callback: + @brief Signs in using a game center credential. + @param credential The Game Center Auth Credential used to sign in. + @param callback A block which is invoked when the sign in finished (or is cancelled). Invoked + asynchronously on the global auth work queue in the future. + */ +- (void)signInAndRetrieveDataWithGameCenterCredential:(FIRGameCenterAuthCredential *)credential + callback:(FIRAuthDataResultCallback)callback { + FIRSignInWithGameCenterRequest *request = + [[FIRSignInWithGameCenterRequest alloc] initWithPlayerID:credential.playerID + publicKeyURL:credential.publicKeyURL + signature:credential.signature + salt:credential.salt + timestamp:credential.timestamp + displayName:credential.displayName + requestConfiguration:_requestConfiguration]; + [FIRAuthBackend + signInWithGameCenter:request + callback:^(FIRSignInWithGameCenterResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + if (callback) { + callback(nil, error); + } + return; + } + + [self + completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + if (error && callback) { + callback(nil, error); + return; + } + FIRAdditionalUserInfo *additionalUserInfo = + [[FIRAdditionalUserInfo alloc] + initWithProviderID: + FIRGameCenterAuthProviderID + profile:nil + username:nil + isNewUser:response.isNewUser]; + FIRAuthDataResult *result = + user ? [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo:additionalUserInfo] + : nil; + if (callback) { + callback(result, error); + } + }]; + }]; +} + +/** @fn internalSignInAndRetrieveDataWithEmail:link:completion: + @brief Signs in using an email and email sign-in link. + @param email The user's email address. + @param link The email sign-in link. + @param callback A block which is invoked when the sign in finishes (or is cancelled.) Invoked + asynchronously on the global auth work queue in the future. + */ +- (void)internalSignInAndRetrieveDataWithEmail:(nonnull NSString *)email + link:(nonnull NSString *)link + callback:(nullable FIRAuthDataResultCallback)callback { + if (![self isSignInWithEmailLink:link]) { + [FIRAuthExceptionUtils + raiseInvalidParameterExceptionWithReason:kInvalidEmailSignInLinkExceptionMessage]; + return; + } + NSDictionary *queryItems = [FIRAuthWebUtils parseURL:link]; + if (![queryItems count]) { + NSURLComponents *urlComponents = [NSURLComponents componentsWithString:link]; + queryItems = [FIRAuthWebUtils parseURL:urlComponents.query]; + } + NSString *actionCode = queryItems[@"oobCode"]; + + FIREmailLinkSignInRequest *request = + [[FIREmailLinkSignInRequest alloc] initWithEmail:email + oobCode:actionCode + requestConfiguration:_requestConfiguration]; + + [FIRAuthBackend + emailLinkSignin:request + callback:^(FIREmailLinkSignInResponse *_Nullable response, NSError *_Nullable error) { + if (error) { + if (callback) { + callback(nil, error); + } + return; + } + [self completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + if (error && callback) { + callback(nil, error); + return; + } + FIRAdditionalUserInfo *additionalUserInfo = + [[FIRAdditionalUserInfo alloc] + initWithProviderID:FIREmailAuthProviderID + profile:nil + username:nil + isNewUser:response.isNewUser]; + FIRAuthDataResult *result = + user ? [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo:additionalUserInfo] + : nil; + if (callback) { + callback(result, error); + } + }]; + }]; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +- (void)signInWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion { + [self signInAndRetrieveDataWithCredential:credential completion:completion]; +} +#pragma clang diagnostic pop + +- (void)signInAndRetrieveDataWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuthDataResultCallback callback = + [self signInFlowAuthDataResultCallbackByDecoratingCallback:completion]; + [self internalSignInAndRetrieveDataWithCredential:credential + isReauthentication:NO + callback:callback]; + }); +} + +- (void)internalSignInWithCredential:(FIRAuthCredential *)credential + callback:(FIRAuthResultCallback)callback { + [self internalSignInAndRetrieveDataWithCredential:credential + isReauthentication:NO + callback:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + callback(authResult.user, error); + }]; +} + +- (void)internalSignInAndRetrieveDataWithCredential:(FIRAuthCredential *)credential + isReauthentication:(BOOL)isReauthentication + callback:(nullable FIRAuthDataResultCallback)callback { + if ([credential isKindOfClass:[FIREmailPasswordAuthCredential class]]) { + // Special case for email/password credentials + FIREmailPasswordAuthCredential *emailPasswordCredential = + (FIREmailPasswordAuthCredential *)credential; + + if (emailPasswordCredential.link) { + // Email link sign in + [self internalSignInAndRetrieveDataWithEmail:emailPasswordCredential.email + link:emailPasswordCredential.link + callback:callback]; + } else { + // Email password sign in + FIRAuthResultCallback completeEmailSignIn = + ^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (callback) { + if (error) { + callback(nil, error); + return; + } + FIRAdditionalUserInfo *additionalUserInfo = + [[FIRAdditionalUserInfo alloc] initWithProviderID:FIREmailAuthProviderID + profile:nil + username:nil + isNewUser:NO]; + FIRAuthDataResult *result = + user ? [[FIRAuthDataResult alloc] initWithUser:user + additionalUserInfo:additionalUserInfo] + : nil; + callback(result, error); + } + }; + + [self signInWithEmail:emailPasswordCredential.email + password:emailPasswordCredential.password + callback:completeEmailSignIn]; + } + return; + } + + if ([credential isKindOfClass:[FIRGameCenterAuthCredential class]]) { + // Special case for Game Center credentials. + [self signInAndRetrieveDataWithGameCenterCredential:(FIRGameCenterAuthCredential *)credential + callback:callback]; + return; + } + +#if TARGET_OS_IOS + if ([credential isKindOfClass:[FIRPhoneAuthCredential class]]) { + // Special case for phone auth credentials + FIRPhoneAuthCredential *phoneCredential = (FIRPhoneAuthCredential *)credential; + FIRAuthOperationType operation = + isReauthentication ? FIRAuthOperationTypeReauth : FIRAuthOperationTypeSignUpOrSignIn; + [self + signInWithPhoneCredential:phoneCredential + operation:operation + callback:^(FIRVerifyPhoneNumberResponse *_Nullable response, + NSError *_Nullable error) { + if (callback) { + if (error) { + callback(nil, error); + return; + } + + [self + completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + if (error && callback) { + callback(nil, error); + return; + } + FIRAdditionalUserInfo *additionalUserInfo = + [[FIRAdditionalUserInfo alloc] + initWithProviderID: + FIRPhoneAuthProviderID + profile:nil + username:nil + isNewUser:response + .isNewUser]; + FIRAuthDataResult *result = + user ? [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo: + additionalUserInfo] + : nil; + if (callback) { + callback(result, error); + } + }]; + } + }]; + return; + } +#endif + FIRVerifyAssertionRequest *request = + [[FIRVerifyAssertionRequest alloc] initWithProviderID:credential.provider + requestConfiguration:_requestConfiguration]; + request.autoCreate = !isReauthentication; + [credential prepareVerifyAssertionRequest:request]; + [FIRAuthBackend + verifyAssertion:request + callback:^(FIRVerifyAssertionResponse *response, NSError *error) { + if (error) { + if (callback) { + callback(nil, error); + } + return; + } + + if (response.needConfirmation) { + if (callback) { + NSString *email = response.email; + FIROAuthCredential *credential = + [[FIROAuthCredential alloc] initWithVerifyAssertionResponse:response]; + callback(nil, + [FIRAuthErrorUtils + accountExistsWithDifferentCredentialErrorWithEmail:email + updatedCredential:credential]); + } + return; + } + + if (!response.providerID.length) { + if (callback) { + callback(nil, [FIRAuthErrorUtils + unexpectedResponseWithDeserializedResponse:response]); + } + return; + } + [self + completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + if (callback) { + if (error) { + callback(nil, error); + return; + } + FIRAdditionalUserInfo *additionalUserInfo = + [FIRAdditionalUserInfo + userInfoWithVerifyAssertionResponse:response]; + FIROAuthCredential *updatedOAuthCredential = + [[FIROAuthCredential alloc] + initWithVerifyAssertionResponse:response]; + FIRAuthDataResult *result = + user + ? [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo:additionalUserInfo + credential:updatedOAuthCredential] + : nil; + callback(result, error); + } + }]; + }]; +} + +- (void)signInAnonymouslyWithCompletion:(nullable FIRAuthDataResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuthDataResultCallback decoratedCallback = + [self signInFlowAuthDataResultCallbackByDecoratingCallback:completion]; + if (self->_currentUser.anonymous) { + FIRAuthDataResult *result = [[FIRAuthDataResult alloc] initWithUser:self->_currentUser + additionalUserInfo:nil]; + decoratedCallback(result, nil); + return; + } + [self internalSignInAnonymouslyWithCompletion:^(FIRSignUpNewUserResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + decoratedCallback(nil, error); + return; + } + [self completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken + anonymous:YES + callback:^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (error) { + decoratedCallback(nil, error); + return; + } + FIRAdditionalUserInfo *additionalUserInfo = + [[FIRAdditionalUserInfo alloc] initWithProviderID:nil + profile:nil + username:nil + isNewUser:YES]; + FIRAuthDataResult *authDataResult = + user ? [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo:additionalUserInfo] + : nil; + decoratedCallback(authDataResult, error); + }]; + }]; + }); +} + +- (void)signInWithCustomToken:(NSString *)token + completion:(nullable FIRAuthDataResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuthDataResultCallback decoratedCallback = + [self signInFlowAuthDataResultCallbackByDecoratingCallback:completion]; + [self internalSignInAndRetrieveDataWithCustomToken:token + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + decoratedCallback(authResult, error); + }]; + }); +} + +- (void)createUserWithEmail:(NSString *)email + password:(NSString *)password + completion:(nullable FIRAuthDataResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuthDataResultCallback decoratedCallback = + [self signInFlowAuthDataResultCallbackByDecoratingCallback:completion]; + [self internalCreateUserWithEmail:email + password:password + completion:^(FIRSignUpNewUserResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + decoratedCallback(nil, error); + return; + } + [self + completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + if (error) { + decoratedCallback(nil, error); + return; + } + FIRAdditionalUserInfo *additionalUserInfo = + [[FIRAdditionalUserInfo alloc] + initWithProviderID: + FIREmailAuthProviderID + profile:nil + username:nil + isNewUser:YES]; + FIRAuthDataResult *authDataResult = + user ? [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo: + additionalUserInfo] + : nil; + decoratedCallback(authDataResult, error); + }]; + }]; + }); +} + +- (void)confirmPasswordResetWithCode:(NSString *)code + newPassword:(NSString *)newPassword + completion:(FIRConfirmPasswordResetCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRResetPasswordRequest *request = + [[FIRResetPasswordRequest alloc] initWithOobCode:code + newPassword:newPassword + requestConfiguration:self->_requestConfiguration]; + [FIRAuthBackend + resetPassword:request + callback:^(FIRResetPasswordResponse *_Nullable response, NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (error) { + completion(error); + return; + } + completion(nil); + }); + } + }]; + }); +} + +- (void)checkActionCode:(NSString *)code completion:(FIRCheckActionCodeCallBack)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRResetPasswordRequest *request = + [[FIRResetPasswordRequest alloc] initWithOobCode:code + newPassword:nil + requestConfiguration:self->_requestConfiguration]; + [FIRAuthBackend + resetPassword:request + callback:^(FIRResetPasswordResponse *_Nullable response, NSError *_Nullable error) { + if (completion) { + if (error) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, error); + }); + return; + } + FIRActionCodeOperation operation = + [FIRActionCodeInfo actionCodeOperationForRequestType:response.requestType]; + FIRActionCodeInfo *actionCodeInfo = + [[FIRActionCodeInfo alloc] initWithOperation:operation + email:response.email + newEmail:response.verifiedEmail]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(actionCodeInfo, nil); + }); + } + }]; + }); +} + +- (void)verifyPasswordResetCode:(NSString *)code + completion:(FIRVerifyPasswordResetCodeCallback)completion { + [self checkActionCode:code + completion:^(FIRActionCodeInfo *_Nullable info, NSError *_Nullable error) { + if (completion) { + if (error) { + completion(nil, error); + return; + } + completion(info.email, nil); + } + }]; +} + +- (void)applyActionCode:(NSString *)code completion:(FIRApplyActionCodeCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRSetAccountInfoRequest *request = + [[FIRSetAccountInfoRequest alloc] initWithRequestConfiguration:self->_requestConfiguration]; + request.OOBCode = code; + [FIRAuthBackend + setAccountInfo:request + callback:^(FIRSetAccountInfoResponse *_Nullable response, NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(error); + }); + } + }]; + }); +} + +- (void)sendPasswordResetWithEmail:(NSString *)email + completion:(nullable FIRSendPasswordResetCallback)completion { + [self sendPasswordResetWithNullableActionCodeSettings:nil email:email completion:completion]; +} + +- (void)sendPasswordResetWithEmail:(NSString *)email + actionCodeSettings:(FIRActionCodeSettings *)actionCodeSettings + completion:(nullable FIRSendPasswordResetCallback)completion { + [self sendPasswordResetWithNullableActionCodeSettings:actionCodeSettings + email:email + completion:completion]; +} + +/** @fn sendPasswordResetWithNullableActionCodeSettings:actionCodeSetting:email:completion: + @brief Initiates a password reset for the given email address and @FIRActionCodeSettings object. + + @param actionCodeSettings Optionally, An @c FIRActionCodeSettings object containing settings + related to the handling action codes. + @param email The email address of the user. + @param completion Optionally; a block which is invoked when the request finishes. Invoked + asynchronously on the main thread in the future. + */ +- (void)sendPasswordResetWithNullableActionCodeSettings: + (nullable FIRActionCodeSettings *)actionCodeSettings + email:(NSString *)email + completion: + (nullable FIRSendPasswordResetCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + if (!email) { + [FIRAuthExceptionUtils + raiseInvalidParameterExceptionWithReason:kMissingEmailInvalidParameterExceptionReason]; + return; + } + FIRGetOOBConfirmationCodeRequest *request = [FIRGetOOBConfirmationCodeRequest + passwordResetRequestWithEmail:email + actionCodeSettings:actionCodeSettings + requestConfiguration:self->_requestConfiguration]; + [FIRAuthBackend getOOBConfirmationCode:request + callback:^(FIRGetOOBConfirmationCodeResponse *_Nullable response, + NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(error); + }); + } + }]; + }); +} + +- (void)sendSignInLinkToEmail:(nonnull NSString *)email + actionCodeSettings:(nonnull FIRActionCodeSettings *)actionCodeSettings + completion:(nullable FIRSendSignInLinkToEmailCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + if (!email) { + [FIRAuthExceptionUtils + raiseInvalidParameterExceptionWithReason:kMissingEmailInvalidParameterExceptionReason]; + } + + if (!actionCodeSettings.handleCodeInApp) { + [FIRAuthExceptionUtils + raiseInvalidParameterExceptionWithReason:kHandleCodeInAppFalseExceptionReason]; + } + FIRGetOOBConfirmationCodeRequest *request = + [FIRGetOOBConfirmationCodeRequest signInWithEmailLinkRequest:email + actionCodeSettings:actionCodeSettings + requestConfiguration:self->_requestConfiguration]; + [FIRAuthBackend getOOBConfirmationCode:request + callback:^(FIRGetOOBConfirmationCodeResponse *_Nullable response, + NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(error); + }); + } + }]; + }); +} + +- (void)updateCurrentUser:(FIRUser *)user completion:(nullable FIRUserUpdateCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + if (!user) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion([FIRAuthErrorUtils nullUserErrorWithMessage:nil]); + }); + } + return; + } + void (^updateUserBlock)(FIRUser *user) = ^(FIRUser *user) { + NSError *error; + [self updateCurrentUser:user byForce:YES savingToDisk:YES error:(&error)]; + if (error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(error); + }); + } + return; + } + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil); + }); + } + }; + if (![user.requestConfiguration.APIKey isEqualToString:self->_requestConfiguration.APIKey]) { + // If the API keys are different, then we need to confirm that the user belongs to the same + // project before proceeding. + user.requestConfiguration = self->_requestConfiguration; + [user reloadWithCompletion:^(NSError *_Nullable error) { + if (error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(error); + }); + } + return; + } + updateUserBlock(user); + }]; + } else { + updateUserBlock(user); + } + }); +} + +- (BOOL)signOut:(NSError *_Nullable __autoreleasing *_Nullable)error { + __block BOOL result = YES; + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + if (!self->_currentUser) { + return; + } + result = [self updateCurrentUser:nil byForce:NO savingToDisk:YES error:error]; + }); + return result; +} + +- (BOOL)signOutByForceWithUserID:(NSString *)userID error:(NSError *_Nullable *_Nullable)error { + if (_currentUser.uid != userID) { + return YES; + } + return [self updateCurrentUser:nil byForce:YES savingToDisk:YES error:error]; +} + +- (BOOL)isSignInWithEmailLink:(NSString *)link { + if (link.length == 0) { + return NO; + } + NSDictionary *queryItems = [FIRAuthWebUtils parseURL:link]; + if (![queryItems count]) { + NSURLComponents *urlComponents = [NSURLComponents componentsWithString:link]; + if (!urlComponents.query) { + return NO; + } + queryItems = [FIRAuthWebUtils parseURL:urlComponents.query]; + } + + if (![queryItems count]) { + return NO; + } + + NSString *actionCode = queryItems[@"oobCode"]; + NSString *mode = queryItems[@"mode"]; + + if (actionCode && [mode isEqualToString:@"signIn"]) { + return YES; + } + return NO; +} + +- (FIRAuthStateDidChangeListenerHandle)addAuthStateDidChangeListener: + (FIRAuthStateDidChangeListenerBlock)listener { + __block BOOL firstInvocation = YES; + __block NSString *previousUserID; + return [self addIDTokenDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) { + BOOL shouldCallListener = firstInvocation || !(previousUserID == user.uid || + [previousUserID isEqualToString:user.uid]); + firstInvocation = NO; + previousUserID = [user.uid copy]; + if (shouldCallListener) { + listener(auth, user); + } + }]; +} + +- (void)removeAuthStateDidChangeListener:(FIRAuthStateDidChangeListenerHandle)listenerHandle { + [self removeIDTokenDidChangeListener:listenerHandle]; +} + +- (FIRIDTokenDidChangeListenerHandle)addIDTokenDidChangeListener: + (FIRIDTokenDidChangeListenerBlock)listener { + if (!listener) { + [NSException raise:NSInvalidArgumentException format:@"listener must not be nil."]; + return nil; + } + FIRAuthStateDidChangeListenerHandle handle; + NSNotificationCenter *notifications = [NSNotificationCenter defaultCenter]; + handle = [notifications addObserverForName:FIRAuthStateDidChangeNotification + object:self + queue:[NSOperationQueue mainQueue] + usingBlock:^(NSNotification *_Nonnull notification) { + FIRAuth *auth = notification.object; + listener(auth, auth.currentUser); + }]; + @synchronized(self) { + [_listenerHandles addObject:handle]; + } + dispatch_async(dispatch_get_main_queue(), ^{ + listener(self, self->_currentUser); + }); + return handle; +} + +- (void)removeIDTokenDidChangeListener:(FIRIDTokenDidChangeListenerHandle)listenerHandle { + [[NSNotificationCenter defaultCenter] removeObserver:listenerHandle]; + @synchronized(self) { + [_listenerHandles removeObject:listenerHandle]; + } +} + +- (void)useAppLanguage { + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + self->_requestConfiguration.languageCode = [[NSLocale preferredLanguages] firstObject]; + }); +} + +- (nullable NSString *)languageCode { + return _requestConfiguration.languageCode; +} + +- (void)setLanguageCode:(nullable NSString *)languageCode { + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + self->_requestConfiguration.languageCode = [languageCode copy]; + }); +} + +- (nullable NSString *)additionalFrameworkMarker { + return self->_requestConfiguration.additionalFrameworkMarker; +} + +- (void)setAdditionalFrameworkMarker:(nullable NSString *)additionalFrameworkMarker { + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + self->_requestConfiguration.additionalFrameworkMarker = [additionalFrameworkMarker copy]; + }); +} + +#if TARGET_OS_IOS +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-property-ivar" +// The warning is ignored because we use the token manager to get the token, instead of using the +// ivar. +- (nullable NSData *)APNSToken { + __block NSData *result = nil; + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + result = self->_tokenManager.token.data; + }); + return result; +} +#pragma clang diagnostic pop + +#pragma mark - UIApplicationDelegate + +- (void)application:(UIApplication *)application + didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + [self setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeUnknown]; +} + +- (void)application:(UIApplication *)application + didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + [self->_tokenManager cancelWithError:error]; + }); +} + +- (void)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)userInfo + fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { + [self canHandleNotification:userInfo]; +} + +// iOS 10 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +- (void)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)userInfo { + [self canHandleNotification:userInfo]; +} +#pragma clang diagnostic pop + +- (BOOL)application:(UIApplication *)app + openURL:(NSURL *)url + options:(NSDictionary *)options { + return [self canHandleURL:url]; +} + +// iOS 10 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(nullable NSString *)sourceApplication + annotation:(id)annotation { + return [self canHandleURL:url]; +} +#pragma clang diagnostic pop + +- (void)setAPNSToken:(NSData *)token type:(FIRAuthAPNSTokenType)type { + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + self->_tokenManager.token = [[FIRAuthAPNSToken alloc] initWithData:token type:type]; + }); +} + +- (BOOL)canHandleNotification:(NSDictionary *)userInfo { + __block BOOL result = NO; + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + result = [self->_notificationManager canHandleNotification:userInfo]; + }); + return result; +} + +- (BOOL)canHandleURL:(NSURL *)URL { + __block BOOL result = NO; + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + result = [self->_authURLPresenter canHandleURL:URL]; + }); + return result; +} + +#pragma mark - UISceneDelegate +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 +- (void)scene:(UIScene *)scene + openURLContexts:(NSSet *)URLContexts API_AVAILABLE(ios(13.0)) { + for (UIOpenURLContext *urlContext in URLContexts) { + NSURL *url = [urlContext URL]; + [self canHandleURL:url]; + } +} +#endif // __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 +#endif // TARGET_OS_IOS + +#pragma mark - Internal Methods + +#if TARGET_OS_IOS +/** @fn signInWithPhoneCredential:callback: + @brief Signs in using a phone credential. + @param credential The Phone Auth credential used to sign in. + @param operation The type of operation for which this sign-in attempt is initiated. + @param callback A block which is invoked when the sign in finishes (or is cancelled.) Invoked + asynchronously on the global auth work queue in the future. + */ +- (void)signInWithPhoneCredential:(FIRPhoneAuthCredential *)credential + operation:(FIRAuthOperationType)operation + callback:(FIRVerifyPhoneNumberResponseCallback)callback { + if (credential.temporaryProof.length && credential.phoneNumber.length) { + FIRVerifyPhoneNumberRequest *request = + [[FIRVerifyPhoneNumberRequest alloc] initWithTemporaryProof:credential.temporaryProof + phoneNumber:credential.phoneNumber + operation:operation + requestConfiguration:_requestConfiguration]; + [FIRAuthBackend verifyPhoneNumber:request callback:callback]; + return; + } + + if (!credential.verificationID.length) { + callback(nil, [FIRAuthErrorUtils missingVerificationIDErrorWithMessage:nil]); + return; + } + if (!credential.verificationCode.length) { + callback(nil, [FIRAuthErrorUtils missingVerificationCodeErrorWithMessage:nil]); + return; + } + FIRVerifyPhoneNumberRequest *request = + [[FIRVerifyPhoneNumberRequest alloc] initWithVerificationID:credential.verificationID + verificationCode:credential.verificationCode + operation:operation + requestConfiguration:_requestConfiguration]; + [FIRAuthBackend verifyPhoneNumber:request callback:callback]; +} + +#endif + +/** @fn internalSignInAndRetrieveDataWithCustomToken:completion: + @brief Signs in a Firebase user given a custom token. + @param token A self-signed custom auth token. + @param completion A block which is invoked when the custom token sign in request completes. + */ +- (void)internalSignInAndRetrieveDataWithCustomToken:(NSString *)token + completion: + (nullable FIRAuthDataResultCallback)completion { + FIRVerifyCustomTokenRequest *request = + [[FIRVerifyCustomTokenRequest alloc] initWithToken:token + requestConfiguration:_requestConfiguration]; + [FIRAuthBackend + verifyCustomToken:request + callback:^(FIRVerifyCustomTokenResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + if (completion) { + completion(nil, error); + return; + } + } + [self completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + if (error && completion) { + completion(nil, error); + return; + } + FIRAdditionalUserInfo *additonalUserInfo = + [[FIRAdditionalUserInfo alloc] + initWithProviderID:nil + profile:nil + username:nil + isNewUser:response.isNewUser]; + FIRAuthDataResult *result = + user ? [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo:additonalUserInfo] + : nil; + if (completion) { + completion(result, error); + } + }]; + }]; +} + +/** @fn internalCreateUserWithEmail:password:completion: + @brief Makes a backend request attempting to create a new Firebase user given an email address + and password. + @param email The email address used to create the new Firebase user. + @param password The password used to create the new Firebase user. + @param completion Optionally; a block which is invoked when the request finishes. + */ +- (void)internalCreateUserWithEmail:(NSString *)email + password:(NSString *)password + completion:(nullable FIRSignupNewUserCallback)completion { + FIRSignUpNewUserRequest *request = + [[FIRSignUpNewUserRequest alloc] initWithEmail:email + password:password + displayName:nil + requestConfiguration:_requestConfiguration]; + if (![request.password length]) { + completion( + nil, [FIRAuthErrorUtils weakPasswordErrorWithServerResponseReason:kMissingPasswordReason]); + return; + } + if (![request.email length]) { + completion(nil, [FIRAuthErrorUtils missingEmailErrorWithMessage:nil]); + return; + } + [FIRAuthBackend signUpNewUser:request callback:completion]; +} + +/** @fn internalSignInAnonymouslyWithCompletion: + @param completion A block which is invoked when the anonymous sign in request completes. + */ +- (void)internalSignInAnonymouslyWithCompletion:(FIRSignupNewUserCallback)completion { + FIRSignUpNewUserRequest *request = + [[FIRSignUpNewUserRequest alloc] initWithRequestConfiguration:_requestConfiguration]; + [FIRAuthBackend signUpNewUser:request callback:completion]; +} + +/** @fn possiblyPostAuthStateChangeNotification + @brief Posts the auth state change notificaton if current user's token has been changed. + */ +- (void)possiblyPostAuthStateChangeNotification { + NSString *token = _currentUser.rawAccessToken; + if (_lastNotifiedUserToken == token || + (token != nil && [_lastNotifiedUserToken isEqualToString:token])) { + return; + } + _lastNotifiedUserToken = token; + if (_autoRefreshTokens) { + // Shedule new refresh task after successful attempt. + [self scheduleAutoTokenRefresh]; + } + NSMutableDictionary *internalNotificationParameters = [NSMutableDictionary dictionary]; + if (self.app) { + internalNotificationParameters[FIRAuthStateDidChangeInternalNotificationAppKey] = self.app; + } + if (token.length) { + internalNotificationParameters[FIRAuthStateDidChangeInternalNotificationTokenKey] = token; + } + internalNotificationParameters[FIRAuthStateDidChangeInternalNotificationUIDKey] = + _currentUser.uid; + NSNotificationCenter *notifications = [NSNotificationCenter defaultCenter]; + dispatch_async(dispatch_get_main_queue(), ^{ + [notifications postNotificationName:FIRAuthStateDidChangeInternalNotification + object:self + userInfo:internalNotificationParameters]; + [notifications postNotificationName:FIRAuthStateDidChangeNotification object:self]; + }); +} + +- (BOOL)updateKeychainWithUser:(FIRUser *)user error:(NSError *_Nullable *_Nullable)error { + if (user != _currentUser) { + // No-op if the user is no longer signed in. This is not considered an error as we don't check + // whether the user is still current on other callbacks of user operations either. + return YES; + } + if ([self saveUser:user error:error]) { + [self possiblyPostAuthStateChangeNotification]; + return YES; + } + return NO; +} + +/** @fn setKeychainServiceNameForApp + @brief Sets the keychain service name global data for the particular app. + @param app The Firebase app to set keychain service name for. + */ ++ (void)setKeychainServiceNameForApp:(FIRApp *)app { + @synchronized(self) { + gKeychainServiceNameForAppName[app.name] = + [@"firebase_auth_" stringByAppendingString:app.options.googleAppID]; + } +} + +/** @fn keychainServiceNameForAppName: + @brief Gets the keychain service name global data for the particular app by name. + @param appName The name of the Firebase app to get keychain service name for. + */ ++ (NSString *)keychainServiceNameForAppName:(NSString *)appName { + @synchronized(self) { + return gKeychainServiceNameForAppName[appName]; + } +} + +/** @fn deleteKeychainServiceNameForAppName: + @brief Deletes the keychain service name global data for the particular app by name. + @param appName The name of the Firebase app to delete keychain service name for. + */ ++ (void)deleteKeychainServiceNameForAppName:(NSString *)appName { + @synchronized(self) { + [gKeychainServiceNameForAppName removeObjectForKey:appName]; + } +} + +/** @fn scheduleAutoTokenRefreshWithDelay: + @brief Schedules a task to automatically refresh tokens on the current user. The token refresh + is scheduled 5 minutes before the scheduled expiration time. + @remarks If the token expires in less than 5 minutes, schedule the token refresh immediately. + */ +- (void)scheduleAutoTokenRefresh { + NSTimeInterval tokenExpirationInterval = + [_currentUser.accessTokenExpirationDate timeIntervalSinceNow] - kTokenRefreshHeadStart; + [self scheduleAutoTokenRefreshWithDelay:MAX(tokenExpirationInterval, 0) retry:NO]; +} + +/** @fn scheduleAutoTokenRefreshWithDelay: + @brief Schedules a task to automatically refresh tokens on the current user. + @param delay The delay in seconds after which the token refresh task should be scheduled to be + executed. + @param retry Flag to determine whether the invocation is a retry attempt or not. + */ +- (void)scheduleAutoTokenRefreshWithDelay:(NSTimeInterval)delay retry:(BOOL)retry { + NSString *accessToken = _currentUser.rawAccessToken; + if (!accessToken) { + return; + } + if (retry) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000003", + @"Token auto-refresh re-scheduled in %02d:%02d " + @"because of error on previous refresh attempt.", + (int)ceil(delay) / 60, (int)ceil(delay) % 60); + } else { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000004", + @"Token auto-refresh scheduled in %02d:%02d for the new token.", + (int)ceil(delay) / 60, (int)ceil(delay) % 60); + } + _autoRefreshScheduled = YES; + __weak FIRAuth *weakSelf = self; + [[FIRAuthDispatcher sharedInstance] + dispatchAfterDelay:delay + queue:FIRAuthGlobalWorkQueue() + task:^(void) { + FIRAuth *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + if (![strongSelf->_currentUser.rawAccessToken isEqualToString:accessToken]) { + // Another auto refresh must have been scheduled, so keep + // _autoRefreshScheduled unchanged. + return; + } + strongSelf->_autoRefreshScheduled = NO; + if (strongSelf->_isAppInBackground) { + return; + } + NSString *uid = strongSelf->_currentUser.uid; + [strongSelf->_currentUser + internalGetTokenForcingRefresh:YES + callback:^(NSString *_Nullable token, + NSError *_Nullable error) { + if (![strongSelf->_currentUser.uid + isEqualToString:uid]) { + return; + } + if (error) { + // Kicks off exponential back off logic to retry + // failed attempt. Starts with one minute delay + // (60 seconds) if this is the first failed + // attempt. + NSTimeInterval rescheduleDelay; + if (retry) { + rescheduleDelay = + MIN(delay * 2, kMaxWaitTimeForBackoff); + } else { + rescheduleDelay = 60; + } + [strongSelf + scheduleAutoTokenRefreshWithDelay: + rescheduleDelay + retry:YES]; + } + }]; + }]; +} + +#pragma mark - + +/** @fn completeSignInWithTokenService:callback: + @brief Completes a sign-in flow once we have access and refresh tokens for the user. + @param accessToken The STS access token. + @param accessTokenExpirationDate The approximate expiration date of the access token. + @param refreshToken The STS refresh token. + @param anonymous Whether or not the user is anonymous. + @param callback Called when the user has been signed in or when an error occurred. Invoked + asynchronously on the global auth work queue in the future. + */ +- (void)completeSignInWithAccessToken:(nullable NSString *)accessToken + accessTokenExpirationDate:(nullable NSDate *)accessTokenExpirationDate + refreshToken:(nullable NSString *)refreshToken + anonymous:(BOOL)anonymous + callback:(FIRAuthResultCallback)callback { + [FIRUser retrieveUserWithAuth:self + accessToken:accessToken + accessTokenExpirationDate:accessTokenExpirationDate + refreshToken:refreshToken + anonymous:anonymous + callback:callback]; +} + +/** @fn signInFlowAuthResultCallbackByDecoratingCallback: + @brief Creates a FIRAuthResultCallback block which wraps another FIRAuthResultCallback; trying + to update the current user before forwarding it's invocations along to a subject block + @param callback Called when the user has been updated or when an error has occurred. Invoked + asynchronously on the main thread in the future. + @return Returns a block that updates the current user. + @remarks Typically invoked as part of the complete sign-in flow. For any other uses please + consider alternative ways of updating the current user. +*/ +- (FIRAuthResultCallback)signInFlowAuthResultCallbackByDecoratingCallback: + (nullable FIRAuthResultCallback)callback { + return ^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (error) { + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, error); + }); + } + return; + } + if (![self updateCurrentUser:user byForce:NO savingToDisk:YES error:&error]) { + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, error); + }); + } + return; + } + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(user, nil); + }); + } + }; +} + +/** @fn signInFlowAuthDataResultCallbackByDecoratingCallback: + @brief Creates a FIRAuthDataResultCallback block which wraps another FIRAuthDataResultCallback; + trying to update the current user before forwarding it's invocations along to a subject + block. + @param callback Called when the user has been updated or when an error has occurred. Invoked + asynchronously on the main thread in the future. + @return Returns a block that updates the current user. + @remarks Typically invoked as part of the complete sign-in flow. For any other uses please + consider alternative ways of updating the current user. +*/ +- (FIRAuthDataResultCallback)signInFlowAuthDataResultCallbackByDecoratingCallback: + (nullable FIRAuthDataResultCallback)callback { + return ^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error) { + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, error); + }); + } + return; + } + if (![self updateCurrentUser:authResult.user byForce:NO savingToDisk:YES error:&error]) { + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, error); + }); + } + return; + } + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(authResult, nil); + }); + } + }; +} + +#pragma mark - User-Related Methods + +/** @fn updateCurrentUser:byForce:savingToDisk:error: + @brief Update the current user; initializing the user's internal properties correctly, and + optionally saving the user to disk. + @remarks This method is called during: sign in and sign out events, as well as during class + initialization time. The only time the saveToDisk parameter should be set to NO is during + class initialization time because the user was just read from disk. + @param user The user to use as the current user (including nil, which is passed at sign out + time.) + @param saveToDisk Indicates the method should persist the user data to disk. + */ +- (BOOL)updateCurrentUser:(nullable FIRUser *)user + byForce:(BOOL)force + savingToDisk:(BOOL)saveToDisk + error:(NSError *_Nullable *_Nullable)error { + if (user == _currentUser) { + [self possiblyPostAuthStateChangeNotification]; + return YES; + } + BOOL success = YES; + if (saveToDisk) { + success = [self saveUser:user error:error]; + } + if (success || force) { + _currentUser = user; + [self possiblyPostAuthStateChangeNotification]; + } + return success; +} + +/** @fn saveUser:error: + @brief Persists user. + @param user The user to save. + @param outError Return value for any error which occurs. + @return @YES on success, @NO otherwise. + */ +- (BOOL)saveUser:(nullable FIRUser *)user error:(NSError *_Nullable *_Nullable)outError { + BOOL success; + + if (!self.userAccessGroup) { + NSString *userKey = [NSString stringWithFormat:kUserKey, _firebaseAppName]; + if (!user) { + success = [_keychainServices removeDataForKey:userKey error:outError]; + } else { + // Encode the user object. + NSMutableData *archiveData = [NSMutableData data]; +// iOS 12 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSKeyedArchiver *archiver = + [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiveData]; +#pragma clang diagnostic pop + [archiver encodeObject:user forKey:userKey]; + [archiver finishEncoding]; + + // Save the user object's encoded value. + success = [_keychainServices setData:archiveData forKey:userKey error:outError]; + } + } else { + if (!user) { + success = [self.storedUserManager removeStoredUserForAccessGroup:self.userAccessGroup + projectIdentifier:self.app.options.APIKey + error:outError]; + } else { + success = [self.storedUserManager setStoredUser:user + forAccessGroup:self.userAccessGroup + projectIdentifier:self.app.options.APIKey + error:outError]; + } + } + + return success; +} + +/** @fn getUser:error: + @brief Retrieves the saved user associated, if one exists, from the keychain. + @param outUser An out parameter which is populated with the saved user, if one exists. + @param error Return value for any error which occurs. + @return YES if the operation was a success (irrespective of whether or not a saved user existed + for the given @c firebaseAppId,) NO if an error occurred. + */ +- (BOOL)getUser:(FIRUser *_Nullable *)outUser error:(NSError *_Nullable *_Nullable)error { + if (!self.userAccessGroup) { + NSString *userKey = [NSString stringWithFormat:kUserKey, _firebaseAppName]; + + NSError *keychainError; + NSData *encodedUserData = [_keychainServices dataForKey:userKey error:&keychainError]; + if (keychainError) { + if (error) { + *error = keychainError; + } + return NO; + } + if (!encodedUserData) { + *outUser = nil; + return YES; + } +// iOS 12 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSKeyedUnarchiver *unarchiver = + [[NSKeyedUnarchiver alloc] initForReadingWithData:encodedUserData]; +#pragma clang diagnostic pop + FIRUser *user = [unarchiver decodeObjectOfClass:[FIRUser class] forKey:userKey]; + user.auth = self; + *outUser = user; + + return YES; + } else { + FIRUser *user = [self.storedUserManager getStoredUserForAccessGroup:self.userAccessGroup + projectIdentifier:self.app.options.APIKey + error:error]; + user.auth = self; + *outUser = user; + if (user) { + return YES; + } else { + if (error && *error) { + return NO; + } else { + return YES; + } + } + } +} + +#pragma mark - Interoperability + ++ (nonnull NSArray *)componentsToRegister { + FIRComponentCreationBlock authCreationBlock = + ^id _Nullable(FIRComponentContainer *_Nonnull container, BOOL *_Nonnull isCacheable) { + *isCacheable = YES; + return [[FIRAuth alloc] initWithApp:container.app]; + }; + FIRComponent *authInterop = [FIRComponent componentWithProtocol:@protocol(FIRAuthInterop) + instantiationTiming:FIRInstantiationTimingAlwaysEager + dependencies:@[] + creationBlock:authCreationBlock]; + return @[ authInterop ]; +} + +#pragma mark - FIRComponentLifecycleMaintainer + +- (void)appWillBeDeleted:(nonnull FIRApp *)app { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + // This doesn't stop any request already issued, see b/27704535 . + NSString *keychainServiceName = [FIRAuth keychainServiceNameForAppName:app.name]; + if (keychainServiceName) { + [[self class] deleteKeychainServiceNameForAppName:app.name]; + FIRAuthKeychainServices *keychain = + [[FIRAuthKeychainServices alloc] initWithService:keychainServiceName]; + NSString *userKey = [NSString stringWithFormat:kUserKey, app.name]; + [keychain removeDataForKey:userKey error:NULL]; + } + dispatch_async(dispatch_get_main_queue(), ^{ + // TODO: Move over to fire an event instead, once ready. + [[NSNotificationCenter defaultCenter] postNotificationName:FIRAuthStateDidChangeNotification + object:nil]; + }); + }); +} + +#pragma mark - FIRAuthInterop + +- (void)getTokenForcingRefresh:(BOOL)forceRefresh withCallback:(FIRTokenCallback)callback { + __weak FIRAuth *weakSelf = self; + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuth *strongSelf = weakSelf; + // Enable token auto-refresh if not aleady enabled. + if (strongSelf && !strongSelf->_autoRefreshTokens) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000002", @"Token auto-refresh enabled."); + strongSelf->_autoRefreshTokens = YES; + [strongSelf scheduleAutoTokenRefresh]; + +#if TARGET_OS_IOS || TARGET_OS_TV // TODO: Is a similar mechanism needed on macOS? + strongSelf->_applicationDidBecomeActiveObserver = [[NSNotificationCenter defaultCenter] + addObserverForName:UIApplicationDidBecomeActiveNotification + object:nil + queue:nil + usingBlock:^(NSNotification *notification) { + FIRAuth *strongSelf = weakSelf; + if (strongSelf) { + strongSelf->_isAppInBackground = NO; + if (!strongSelf->_autoRefreshScheduled) { + [weakSelf scheduleAutoTokenRefresh]; + } + } + }]; + strongSelf->_applicationDidEnterBackgroundObserver = [[NSNotificationCenter defaultCenter] + addObserverForName:UIApplicationDidEnterBackgroundNotification + object:nil + queue:nil + usingBlock:^(NSNotification *notification) { + FIRAuth *strongSelf = weakSelf; + if (strongSelf) { + strongSelf->_isAppInBackground = YES; + } + }]; +#endif + } + // Call back with 'nil' if there is no current user. + if (!strongSelf || !strongSelf->_currentUser) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, nil); + }); + return; + } + // Call back with current user token. + [strongSelf->_currentUser + internalGetTokenForcingRefresh:forceRefresh + callback:^(NSString *_Nullable token, NSError *_Nullable error) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(token, error); + }); + }]; + }); +} + +- (nullable NSString *)getUserID { + return _currentUser.uid; +} + +#pragma mark - Keychain sharing + +- (BOOL)internalUseUserAccessGroup:(NSString *_Nullable)accessGroup + error:(NSError *_Nullable *_Nullable)outError { + BOOL success; + success = [self.storedUserManager setStoredUserAccessGroup:accessGroup error:outError]; + if (!success) { + return NO; + } + + FIRUser *user = [self getStoredUserForAccessGroup:accessGroup error:outError]; + if (!user && outError && *outError) { + return NO; + } + success = [self updateCurrentUser:user byForce:NO savingToDisk:NO error:outError]; + if (!success) { + return NO; + } + + if (_userAccessGroup == nil && accessGroup != nil) { + NSString *userKey = [NSString stringWithFormat:kUserKey, _firebaseAppName]; + [_keychainServices removeDataForKey:userKey error:outError]; + } + _userAccessGroup = accessGroup; + self->_lastNotifiedUserToken = user.rawAccessToken; + + return YES; +} + +- (BOOL)useUserAccessGroup:(NSString *_Nullable)accessGroup + error:(NSError *_Nullable *_Nullable)outError { + // self.storedUserManager is initialized asynchronously. Make sure it is done. + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + }); + return [self internalUseUserAccessGroup:accessGroup error:outError]; +} + +- (nullable FIRUser *)getStoredUserForAccessGroup:(NSString *_Nullable)accessGroup + error:(NSError *_Nullable *_Nullable)outError { + FIRUser *user; + if (!accessGroup) { + NSString *userKey = [NSString stringWithFormat:kUserKey, _firebaseAppName]; + NSData *encodedUserData = [_keychainServices dataForKey:userKey error:outError]; + if (!encodedUserData) { + return nil; + } + +// iOS 12 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSKeyedUnarchiver *unarchiver = + [[NSKeyedUnarchiver alloc] initForReadingWithData:encodedUserData]; +#pragma clang diagnostic pop + user = [unarchiver decodeObjectOfClass:[FIRUser class] forKey:userKey]; + } else { + user = [self.storedUserManager getStoredUserForAccessGroup:self.userAccessGroup + projectIdentifier:self.app.options.APIKey + error:outError]; + } + + user.auth = self; + return user; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDataResult.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDataResult.m new file mode 100644 index 00000000..d4c7c2be --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDataResult.m @@ -0,0 +1,83 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import +#import + +#import "FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthDataResult + +/** @var kAdditionalUserInfoCodingKey + @brief The key used to encode the additionalUserInfo property for NSSecureCoding. + */ +static NSString *const kAdditionalUserInfoCodingKey = @"additionalUserInfo"; + +/** @var kUserCodingKey + @brief The key used to encode the user property for NSSecureCoding. + */ +static NSString *const kUserCodingKey = @"user"; + +/** @var kCredentialCodingKey + @brief The key used to encode the credential for NSSecureCoding. + */ +static NSString *const kCredentialCodingKey = @"credential"; + +- (nullable instancetype)initWithUser:(FIRUser *)user + additionalUserInfo:(nullable FIRAdditionalUserInfo *)additionalUserInfo { + return [self initWithUser:user additionalUserInfo:additionalUserInfo credential:nil]; +} + +- (nullable instancetype)initWithUser:(FIRUser *)user + additionalUserInfo:(nullable FIRAdditionalUserInfo *)additionalUserInfo + credential:(nullable FIROAuthCredential *)credential { + self = [super init]; + if (self) { + _additionalUserInfo = additionalUserInfo; + _user = user; + _credential = credential; + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + FIRUser *user = [aDecoder decodeObjectOfClass:[FIRUser class] forKey:kUserCodingKey]; + FIRAdditionalUserInfo *additionalUserInfo = + [aDecoder decodeObjectOfClass:[FIRAdditionalUserInfo class] + forKey:kAdditionalUserInfoCodingKey]; + FIROAuthCredential *credential = [aDecoder decodeObjectOfClass:[FIROAuthCredential class] + forKey:kCredentialCodingKey]; + return [self initWithUser:user additionalUserInfo:additionalUserInfo credential:credential]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_user forKey:kUserCodingKey]; + [aCoder encodeObject:_additionalUserInfo forKey:kAdditionalUserInfoCodingKey]; + [aCoder encodeObject:_credential forKey:kCredentialCodingKey]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h new file mode 100644 index 00000000..30c5ec7e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIROAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthDataResult () + +/** @fn initWithUser:additionalUserInfo: + @brief Designated initializer. + @param user The signed in user reference. + @param additionalUserInfo The additional user info if available. + */ +- (nullable instancetype)initWithUser:(FIRUser *)user + additionalUserInfo:(nullable FIRAdditionalUserInfo *)additionalUserInfo; + +/** @fn initWithUser:additionalUserInfo: + @brief Designated initializer. + @param user The signed in user reference. + @param additionalUserInfo The additional user info if available. + @param credential The updated OAuth credential if available. + */ +- (nullable instancetype)initWithUser:(FIRUser *)user + additionalUserInfo:(nullable FIRAdditionalUserInfo *)additionalUserInfo + credential:(nullable FIROAuthCredential *)credential + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDispatcher.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDispatcher.h new file mode 100644 index 00000000..2c5839b1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDispatcher.h @@ -0,0 +1,63 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRAuthDispatcherImplBlock + @brief The type of block which can be set as the implementation for @c + dispatchAfterDelay:queue:callback: . + + @param delay The delay in seconds after which the task will be scheduled to execute. + @param queue The dispatch queue on which the task will be submitted. + @param task The task (block) to be scheduled for future execution. + */ +typedef void (^FIRAuthDispatcherImplBlock)(NSTimeInterval delay, + dispatch_queue_t queue, + void (^task)(void)); + +/** @class FIRAuthDispatchAfter + @brief A utility class used to facilitate scheduling tasks to be executed in the future. + */ +@interface FIRAuthDispatcher : NSObject + +/** @property dispatchAfterImplementation + @brief Allows custom implementation of dispatchAfterDelay:queue:callback:. + @remarks Set to nil to restore default implementation. + */ +@property(nonatomic, nullable, copy) FIRAuthDispatcherImplBlock dispatchAfterImplementation; + +/** @fn dispatchAfterDelay:queue:callback: + @brief Schedules task in the future after a specified delay. + + @param delay The delay in seconds after which the task will be scheduled to execute. + @param queue The dispatch queue on which the task will be submitted. + @param task The task (block) to be scheduled for future execution. + */ +- (void)dispatchAfterDelay:(NSTimeInterval)delay + queue:(dispatch_queue_t)queue + task:(void (^)(void))task; + +/** @fn sharedInstance + @brief Gets the shared instance of this class. + @returns The shared instance of this clss + */ ++ (instancetype)sharedInstance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDispatcher.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDispatcher.m new file mode 100644 index 00000000..e5e32c39 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthDispatcher.m @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Auth/FIRAuthDispatcher.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthDispatcher + +@synthesize dispatchAfterImplementation = _dispatchAfterImplementation; + ++ (instancetype)sharedInstance { + static dispatch_once_t onceToken; + static FIRAuthDispatcher *sharedInstance; + dispatch_once(&onceToken, ^{ + sharedInstance = [[self alloc] init]; + }); + return sharedInstance; +} + +- (void)dispatchAfterDelay:(NSTimeInterval)delay + queue:(dispatch_queue_t)queue + task:(void (^)(void))task { + if (_dispatchAfterImplementation) { + _dispatchAfterImplementation(delay, queue, task); + return; + } + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), queue, task); +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h new file mode 100644 index 00000000..55bb1a70 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h @@ -0,0 +1,31 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @fn FIRAuthGlobalWorkQueue + @brief Retrieves the global serial work queue for Firebase Auth. + @return The global serial dispatch queue. + @remarks To ensure thread safety, all auth code must be executed in either this global work + queue, or a serial queue that has its target queue set to this work queue. All public method + implementations that may involve contested code shall dispatch to this work queue as the + first thing they do. + */ +extern dispatch_queue_t FIRAuthGlobalWorkQueue(void); + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.m new file mode 100644 index 00000000..bfe263a7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.m @@ -0,0 +1,30 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" + +NS_ASSUME_NONNULL_BEGIN + +dispatch_queue_t FIRAuthGlobalWorkQueue() { + static dispatch_once_t once; + static dispatch_queue_t queue; + dispatch_once(&once, ^{ + queue = dispatch_queue_create("com.google.firebase.auth.globalWorkQueue", NULL); + }); + return queue; +} + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthOperationType.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthOperationType.h new file mode 100644 index 00000000..62d6cd10 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthOperationType.h @@ -0,0 +1,47 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief Indicates the type of operation performed for RPCs that support the operation + parameter. + */ +typedef NS_ENUM(NSInteger, FIRAuthOperationType) { + /** Indicates that the operation type is uspecified. + */ + FIRAuthOperationTypeUnspecified = 0, + + /** Indicates that the operation type is sign in or sign up. + */ + FIRAuthOperationTypeSignUpOrSignIn = 1, + + /** Indicates that the operation type is reauthentication. + */ + FIRAuthOperationTypeReauth = 2, + + /** Indicates that the operation type is update. + */ + FIRAuthOperationTypeUpdate = 3, + + /** Indicates that the operation type is link. + */ + FIRAuthOperationTypeLink = 4, +}; + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.h new file mode 100644 index 00000000..cdae0468 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRAuthSerialTaskCompletionBlock + @brief The type of method a @c FIRAuthSerialTask must call when it is complete. + */ +typedef void (^FIRAuthSerialTaskCompletionBlock)(void); + +/** @typedef FIRAuthSerialTask + @brief Represents a unit of work submitted to a task queue. + @param complete The task MUST call the complete method when done. + */ +typedef void (^FIRAuthSerialTask)(FIRAuthSerialTaskCompletionBlock complete); + +/** @class FIRAuthSerialTaskQueue + @brief An easy to use serial task queue which supports a callback-based completion notification + system for easy asyncronous call chaining. + */ +@interface FIRAuthSerialTaskQueue : NSObject + +/** @fn enqueueTask: + @brief Enqueues a task for serial execution in the queue. + @remarks The task MUST call the complete method when done. This method is thread-safe. + The task block won't be executed concurrently with any other blocks in other task queues or + the global work queue as returned by @c FIRAuthGlobalWorkQueue , but an uncompleted task + (e.g. task block finished executation before complete method is called at a later time) + does not affect other task queues or the global work queue. + */ +- (void)enqueueTask:(FIRAuthSerialTask)task; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.m new file mode 100644 index 00000000..4bded783 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.m @@ -0,0 +1,56 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.h" + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthSerialTaskQueue { + /** @var _dispatchQueue + @brief The asyncronous dispatch queue into which tasks are enqueued and processed + serially. + */ + dispatch_queue_t _dispatchQueue; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _dispatchQueue = dispatch_queue_create("com.google.firebase.auth.serialTaskQueue", NULL); + dispatch_set_target_queue(_dispatchQueue, FIRAuthGlobalWorkQueue()); + } + return self; +} + +- (void)enqueueTask:(FIRAuthSerialTask)task { + // This dispatch queue will run tasks serially in FIFO order, as long as it's not suspended. + dispatch_async(self->_dispatchQueue, ^{ + // But as soon as a task is started, stop other tasks from running until the task calls it's + // completion handler, which allows the queue to resume processing of tasks. This allows the + // task to perform other asyncronous actions on other dispatch queues and "get back to us" when + // all of their sub-tasks are complete. + dispatch_suspend(self->_dispatchQueue); + task(^{ + dispatch_resume(self->_dispatchQueue); + }); + }); +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSettings.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSettings.m new file mode 100644 index 00000000..32dc65c7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthSettings.m @@ -0,0 +1,33 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthSettings + +- (instancetype)init { + self = [super init]; + if (self) { + _appVerificationDisabledForTesting = NO; + } + return self; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthTokenResult.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthTokenResult.m new file mode 100644 index 00000000..fd857e30 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthTokenResult.m @@ -0,0 +1,166 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Auth/FIRAuthTokenResult_Internal.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kExpirationDateKey + @brief The key used to encode the expirationDate property for NSSecureCoding. + */ +static NSString *const kExpirationDateKey = @"expiratinDate"; + +/** @var kTokenKey + @brief The key used to encode the token property for NSSecureCoding. + */ +static NSString *const kTokenKey = @"token"; + +/** @var kAuthDateKey + @brief The key used to encode the authDate property for NSSecureCoding. + */ +static NSString *const kAuthDateKey = @"authDate"; + +/** @var kIssuedDateKey + @brief The key used to encode the issuedDate property for NSSecureCoding. + */ +static NSString *const kIssuedDateKey = @"issuedDate"; + +/** @var kSignInProviderKey + @brief The key used to encode the signInProvider property for NSSecureCoding. + */ +static NSString *const kSignInProviderKey = @"signInProvider"; + +/** @var kSignInSecondFactorKey + @brief The key used to encode the signInSecondFactor property for NSSecureCoding. + */ +static NSString *const kSignInSecondFactorKey = @"signInSecondFactor"; + +/** @var kClaimsKey + @brief The key used to encode the claims property for NSSecureCoding. + */ +static NSString *const kClaimsKey = @"claims"; + +@implementation FIRAuthTokenResult + +- (instancetype)initWithToken:(NSString *)token + expirationDate:(NSDate *)expirationDate + authDate:(NSDate *)authDate + issuedAtDate:(NSDate *)issuedAtDate + signInProvider:(NSString *)signInProvider + signInSecondFactor:(NSString *)signInSecondFactor + claims:(NSDictionary *)claims { + self = [super init]; + if (self) { + _token = token; + _expirationDate = expirationDate; + _authDate = authDate; + _issuedAtDate = issuedAtDate; + _signInProvider = signInProvider; + _signInSecondFactor = signInSecondFactor; + _claims = claims; + } + return self; +} + ++ (nullable FIRAuthTokenResult *)tokenResultWithToken:(NSString *)token { + NSArray *tokenStringArray = [token componentsSeparatedByString:@"."]; + + // The JWT should have three parts, though we only use the second in this method. + if (tokenStringArray.count != 3) { + return nil; + } + + // The token payload is always the second index of the array. + NSString *IDToken = tokenStringArray[1]; + + // Convert the base64URL encoded string to a base64 encoded string. + // Replace "_" with "/" + NSMutableString *tokenPayload = [[IDToken stringByReplacingOccurrencesOfString:@"_" + withString:@"/"] mutableCopy]; + + // Replace "-" with "+" + [tokenPayload replaceOccurrencesOfString:@"-" + withString:@"+" + options:kNilOptions + range:NSMakeRange(0, tokenPayload.length)]; + + // Pad the token payload with "=" signs if the payload's length is not a multiple of 4. + while ((tokenPayload.length % 4) != 0) { + [tokenPayload appendFormat:@"="]; + } + NSData *decodedTokenPayloadData = + [[NSData alloc] initWithBase64EncodedString:tokenPayload + options:NSDataBase64DecodingIgnoreUnknownCharacters]; + if (!decodedTokenPayloadData) { + return nil; + } + NSError *jsonError = nil; + NSJSONReadingOptions options = NSJSONReadingMutableContainers | NSJSONReadingAllowFragments; + NSDictionary *tokenPayloadDictionary = + [NSJSONSerialization JSONObjectWithData:decodedTokenPayloadData + options:options + error:&jsonError]; + if (jsonError != nil) { + return nil; + } + + if (!tokenPayloadDictionary) { + return nil; + } + + // These are dates since 00:00:00 January 1 1970, as described by the Terminology section in + // the JWT spec. https://tools.ietf.org/html/rfc7519 + NSDate *expirationDate = + [NSDate dateWithTimeIntervalSince1970:[tokenPayloadDictionary[@"exp"] doubleValue]]; + NSDate *authDate = + [NSDate dateWithTimeIntervalSince1970:[tokenPayloadDictionary[@"auth_time"] doubleValue]]; + NSDate *issuedAtDate = + [NSDate dateWithTimeIntervalSince1970:[tokenPayloadDictionary[@"iat"] doubleValue]]; + + NSDictionary *firebaseTokenPayloadDictionary = tokenPayloadDictionary[@"firebase"]; + NSString *signInProvider = firebaseTokenPayloadDictionary[@"sign_in_provider"]; + NSString *signInSecondFactor = firebaseTokenPayloadDictionary[@"sign_in_second_factor"]; + + FIRAuthTokenResult *tokenResult = + [[FIRAuthTokenResult alloc] initWithToken:token + expirationDate:expirationDate + authDate:authDate + issuedAtDate:issuedAtDate + signInProvider:signInProvider + signInSecondFactor:signInSecondFactor + claims:tokenPayloadDictionary]; + return tokenResult; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *token = [aDecoder decodeObjectOfClass:[NSDate class] forKey:kTokenKey]; + return [FIRAuthTokenResult tokenResultWithToken:token]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_token forKey:kTokenKey]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthTokenResult_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthTokenResult_Internal.h new file mode 100644 index 00000000..bffe2eec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuthTokenResult_Internal.h @@ -0,0 +1,36 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @extension FIRAuthAPNSTokenResult + @brief An internal class used to expose internal methods of FIRAuthAPNSTokenResult. + */ +@interface FIRAuthTokenResult () + +/** @fn tokenResultWithToken: + @brief Parse a token string to a structured token. + @param token The token string to parse. + @return A structured token result. +*/ ++ (nullable FIRAuthTokenResult *)tokenResultWithToken:(NSString *)token; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuth_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuth_Internal.h new file mode 100644 index 00000000..0a75ccfd --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Auth/FIRAuth_Internal.h @@ -0,0 +1,147 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import +#import "Interop/Auth/Public/FIRAuthInterop.h" + +@class FIRAuthRequestConfiguration; +@class FIRAuthURLPresenter; + +#if TARGET_OS_IOS +@class FIRAuthAPNSTokenManager; +@class FIRAuthAppCredentialManager; +@class FIRAuthNotificationManager; +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuth () + +/** @property requestConfiguration + @brief The configuration object comprising of paramters needed to make a request to Firebase + Auth's backend. + */ +@property(nonatomic, copy, readonly) FIRAuthRequestConfiguration *requestConfiguration; + +#if TARGET_OS_IOS + +/** @property tokenManager + @brief The manager for APNs tokens used by phone number auth. + */ +@property(nonatomic, strong, readonly) FIRAuthAPNSTokenManager *tokenManager; + +/** @property appCredentailManager + @brief The manager for app credentials used by phone number auth. + */ +@property(nonatomic, strong, readonly) FIRAuthAppCredentialManager *appCredentialManager; + +/** @property notificationManager + @brief The manager for remote notifications used by phone number auth. + */ +@property(nonatomic, strong, readonly) FIRAuthNotificationManager *notificationManager; + +#endif // TARGET_OS_IOS + +/** @property authURLPresenter + @brief An object that takes care of presenting URLs via the auth instance. + */ +@property(nonatomic, strong, readonly) FIRAuthURLPresenter *authURLPresenter; + +/** @fn initWithAPIKey:appName: + @brief Designated initializer. + @param APIKey The Google Developers Console API key for making requests from your app. + @param appName The name property of the previously created @c FIRApp instance. + */ +- (nullable instancetype)initWithAPIKey:(NSString *)APIKey + appName:(NSString *)appName NS_DESIGNATED_INITIALIZER; + +/** @fn getUserID + @brief Gets the identifier of the current user, if any. + @return The identifier of the current user, or nil if there is no current user. + */ +- (nullable NSString *)getUserID; + +/** @fn updateKeychainWithUser:error: + @brief Updates the keychain for the given user. + @param user The user to be updated. + @param error The error caused the method to fail if the method returns NO. + @return Whether updating keychain has succeeded or not. + @remarks Called by @c FIRUser when user info or token changes occur. + */ +- (BOOL)updateKeychainWithUser:(FIRUser *)user error:(NSError *_Nullable *_Nullable)error; + +/** @fn internalSignInWithCredential:callback: + @brief Convenience method for @c internalSignInAndRetrieveDataWithCredential:callback: + This method doesn't return additional identity provider data. +*/ +- (void)internalSignInWithCredential:(FIRAuthCredential *)credential + callback:(FIRAuthResultCallback)callback; + +/** @fn internalSignInAndRetrieveDataWithCredential:callback: + @brief Asynchronously signs in Firebase with the given 3rd party credentials (e.g. a Facebook + login Access Token, a Google ID Token/Access Token pair, etc.) and returns additional + identity provider data. + @param credential The credential supplied by the IdP. + @param isReauthentication Indicates whether or not the current invocation originated from an + attempt to reauthenticate. + @param callback A block which is invoked when the sign in finishes (or is cancelled.) Invoked + asynchronously on the auth global work queue in the future. + @remarks This is the internal counterpart of this method, which uses a callback that does not + update the current user. + */ +- (void)internalSignInAndRetrieveDataWithCredential:(FIRAuthCredential *)credential + isReauthentication:(BOOL)isReauthentication + callback:(nullable FIRAuthDataResultCallback)callback; + +/** @fn signOutByForceWithUserID:error: + @brief Signs out the current user. + @param userID The ID of the user to force sign out. + @param error An optional out parameter for error results. + @return @YES when the sign out request was successful. @NO otherwise. + */ +- (BOOL)signOutByForceWithUserID:(NSString *)userID error:(NSError *_Nullable *_Nullable)error; + +/** @fn completeSignInWithTokenService:callback: + @brief Completes a sign-in flow once we have access and refresh tokens for the user. + @param accessToken The STS access token. + @param accessTokenExpirationDate The approximate expiration date of the access token. + @param refreshToken The STS refresh token. + @param anonymous Whether or not the user is anonymous. + @param callback Called when the user has been signed in or when an error occurred. Invoked + asynchronously on the global auth work queue in the future. +*/ +- (void)completeSignInWithAccessToken:(nullable NSString *)accessToken + accessTokenExpirationDate:(nullable NSDate *)accessTokenExpirationDate + refreshToken:(nullable NSString *)refreshToken + anonymous:(BOOL)anonymous + callback:(FIRAuthResultCallback)callback; + +/** @fn signInFlowAuthResultCallbackByDecoratingCallback: + @brief Creates a FIRAuthResultCallback block which wraps another FIRAuthResultCallback; trying + to update the current user before forwarding it's invocations along to a subject block + @param callback Called when the user has been updated or when an error has occurred. Invoked + asynchronously on the main thread in the future. + @return Returns a block that updates the current user. + @remarks Typically invoked as part of the complete sign-in flow. For any other uses please + consider alternative ways of updating the current user. +*/ +- (FIRAuthDataResultCallback)signInFlowAuthDataResultCallbackByDecoratingCallback: + (nullable FIRAuthDataResultCallback)callback; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailAuthProvider.m new file mode 100644 index 00000000..27bf16e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailAuthProvider.m @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIREmailAuthProvider + +- (instancetype)init { + @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." + reason:@"This class is not meant to be initialized." + userInfo:nil]; +} + ++ (FIRAuthCredential *)credentialWithEmail:(NSString *)email password:(NSString *)password { + return [[FIREmailPasswordAuthCredential alloc] initWithEmail:email password:password]; +} + ++ (FIRAuthCredential *)credentialWithEmail:(NSString *)email link:(NSString *)link { + return [[FIREmailPasswordAuthCredential alloc] initWithEmail:email link:link]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.h new file mode 100644 index 00000000..df683e6f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.h @@ -0,0 +1,61 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIREmailPasswordAuthCredential + @brief Internal implementation of FIRAuthCredential for Email/Password credentials. + */ +@interface FIREmailPasswordAuthCredential : FIRAuthCredential + +/** @property email + @brief The user's email address. + */ +@property(nonatomic, readonly) NSString *email; + +/** @property password + @brief The user's password. + */ +@property(nonatomic, readonly) NSString *password; + +/** @property link + @brief The email sign-in link. + */ +@property(nonatomic, readonly) NSString *link; + +/** @fn initWithEmail:password: + @brief Designated initializer. + @param email The user's email address. + @param password The user's password. + */ +- (nullable instancetype)initWithEmail:(NSString *)email + password:(NSString *)password NS_DESIGNATED_INITIALIZER; + +/** @fn initWithEmail:link: + @brief Designated initializer. + @param email The user's email address. + @param link The email sign-in link. + */ +- (nullable instancetype)initWithEmail:(NSString *)email + link:(NSString *)link NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.m new file mode 100644 index 00000000..d589e656 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.m @@ -0,0 +1,92 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.h" + +#import + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIREmailPasswordAuthCredential () + +- (nullable instancetype)initWithProvider:(NSString *)provider NS_UNAVAILABLE; + +@end + +@implementation FIREmailPasswordAuthCredential + +- (nullable instancetype)initWithProvider:(NSString *)provider { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"Please call the designated initializer."]; + return nil; +} + +- (nullable instancetype)initWithEmail:(NSString *)email password:(NSString *)password { + self = [super initWithProvider:FIREmailAuthProviderID]; + if (self) { + _email = [email copy]; + _password = [password copy]; + } + return self; +} + +- (nullable instancetype)initWithEmail:(NSString *)email link:(NSString *)link { + self = [super initWithProvider:FIREmailAuthProviderID]; + if (self) { + _email = [email copy]; + _link = [link copy]; + } + return self; +} + +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason: + @"Attempt to call prepareVerifyAssertionRequest: on a FIREmailPasswordAuthCredential."]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *email = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"email"]; + NSString *password = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"password"]; + NSString *link = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"link"]; + if (email.length && password.length) { + self = [self initWithEmail:email password:password]; + } else if (email.length && link.length) { + self = [self initWithEmail:email link:link]; + } else { + self = nil; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.email forKey:@"email"]; + [aCoder encodeObject:self.password forKey:@"password"]; + [aCoder encodeObject:self.link forKey:@"link"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthCredential.m new file mode 100644 index 00000000..2f633f79 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthCredential.m @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthCredential + +- (instancetype)init { + @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." + reason:@"This class is an abstract base class. It's init method " + "should not be called directly." + userInfo:nil]; +} + +- (nullable instancetype)initWithProvider:(NSString *)provider { + self = [super init]; + if (self) { + _provider = [provider copy]; + } + return self; +} + +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request { + @throw [NSException exceptionWithName:@"Attempt to call virtual method." + reason:@"This method must be overridden by a subclass." + userInfo:nil]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h new file mode 100644 index 00000000..82ecf4fa --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRVerifyAssertionRequest; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthCredential () + +/** @fn initWithProvider: + @brief Designated initializer. + @remarks This is the designated initializer for internal/friend subclasses. + @param provider The provider name. + */ +- (nullable instancetype)initWithProvider:(NSString *)provider NS_DESIGNATED_INITIALIZER; + +/** @fn prepareVerifyAssertionRequest: + @brief Called immediately before a request to the verifyAssertion endpoint is made. Implementers + should update the passed request instance with their credentials. + @param request The request to be updated with credentials. + */ +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthProvider.m new file mode 100644 index 00000000..6192ad69 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/FIRAuthProvider.m @@ -0,0 +1,66 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#pragma mark - Provider ID constants + +// Declared 'extern' in FIRGoogleAuthProvider.h +NSString *const FIRGoogleAuthProviderID = @"google.com"; + +// Declared 'extern' in FIRFacebookAuthProvider.h +NSString *const FIRFacebookAuthProviderID = @"facebook.com"; + +// Declared 'extern' in FIREmailAuthProvider.h +NSString *const FIREmailAuthProviderID = @"password"; + +// Declared 'extern' in FIRTwitterAuthProvider.h +NSString *const FIRTwitterAuthProviderID = @"twitter.com"; + +// Declared 'extern' in FIRGitHubAuthProvider.h +NSString *const FIRGitHubAuthProviderID = @"github.com"; + +// Declared 'extern' in FIRPhoneAuthProvider.h +NSString *const FIRPhoneAuthProviderID = @"phone"; + +// Declared 'extern' in FIRGameCenterAuthProvider.h +NSString *const FIRGameCenterAuthProviderID = @"gc.apple.com"; + +#pragma mark - sign-in methods constants + +// Declared 'extern' in FIRGoogleAuthProvider.h +NSString *const FIRGoogleAuthSignInMethod = @"google.com"; + +// Declared 'extern' in FIREmailAuthProvider.h +NSString *const FIREmailPasswordAuthSignInMethod = @"password"; + +// Declared 'extern' in FIREmailAuthProvider.h +NSString *const FIREmailLinkAuthSignInMethod = @"emailLink"; + +// Declared 'extern' in FIRTwitterAuthProvider.h +NSString *const FIRTwitterAuthSignInMethod = @"twitter.com"; + +// Declared 'extern' in FIRFacebookAuthProvider.h +NSString *const FIRFacebookAuthSignInMethod = @"facebook.com"; + +// Declared 'extern' in FIRGitHubAuthProvider.h +NSString *const FIRGitHubAuthSignInMethod = @"github.com"; + +// Declared 'extern' in FIRPhoneAuthProvider.h +NSString *const FIRPhoneAuthSignInMethod = @"phone"; + +// Declared 'extern' in FIRGameCenterAuthProvider.h +NSString *const FIRGameCenterAuthSignInMethod = @"gc.apple.com"; diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.h new file mode 100644 index 00000000..646ddba4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.h @@ -0,0 +1,36 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRFacebookAuthCredential + @brief Internal implementation of FIRAuthCredential for the Facebook IdP. + */ +@interface FIRFacebookAuthCredential : FIRAuthCredential + +/** @fn initWithAccessToken: + @brief Designated initializer. + @param accessToken The Access Token obtained from Facebook. + */ +- (nullable instancetype)initWithAccessToken:(NSString *)accessToken NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.m new file mode 100644 index 00000000..1f1adc4e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.m @@ -0,0 +1,72 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.h" + +#import + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRFacebookAuthCredential () + +- (nullable instancetype)initWithProvider:(NSString *)provider NS_UNAVAILABLE; + +@end + +@implementation FIRFacebookAuthCredential { + NSString *_accessToken; +} + +- (nullable instancetype)initWithProvider:(NSString *)provider { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"Please call the designated initializer."]; + return nil; +} + +- (nullable instancetype)initWithAccessToken:(NSString *)accessToken { + self = [super initWithProvider:FIRFacebookAuthProviderID]; + if (self) { + _accessToken = [accessToken copy]; + } + return self; +} + +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request { + request.providerAccessToken = _accessToken; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *accessToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"accessToken"]; + self = [self initWithAccessToken:accessToken]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_accessToken forKey:@"accessToken"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthProvider.m new file mode 100644 index 00000000..83becf66 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthProvider.m @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/Facebook/FIRFacebookAuthCredential.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +// FIRFacebookAuthProviderID is defined in FIRAuthProvider.m. + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRFacebookAuthProvider + +- (instancetype)init { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"This class is not meant to be initialized."]; + return nil; +} + ++ (FIRAuthCredential *)credentialWithAccessToken:(NSString *)accessToken { + return [[FIRFacebookAuthCredential alloc] initWithAccessToken:accessToken]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h new file mode 100644 index 00000000..3272c5aa --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h @@ -0,0 +1,79 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRGameCenterAuthCredential + @brief Internal implementation of FIRAuthCredential for Game Center credentials. + */ +@interface FIRGameCenterAuthCredential : FIRAuthCredential + +/** @property playerID + @brief The ID of the Game Center local player. + */ +@property(nonatomic, readonly) NSString *playerID; + +/** @property publicKeyURL + @brief The URL for the public encryption key. + */ +@property(nonatomic, readonly) NSURL *publicKeyURL; + +/** @property signature + @brief The verification signature data generated. + */ +@property(nonatomic, readonly) NSData *signature; + +/** @property salt + @brief A random string used to compute the hash and keep it randomized. + */ +@property(nonatomic, readonly) NSData *salt; + +/** @property timestamp + @brief The date and time that the signature was created. + */ +@property(nonatomic, readonly) uint64_t timestamp; + +/** @property displayName + @brief The date and time that the signature was created. + */ +@property(nonatomic, readonly) NSString *displayName; + +/** @fn initWithPlayerID:publicKeyURL:signature:salt:timestamp:displayName: + @brief Designated initializer. + @param publicKeyURL The URL for the public encryption key. + @param signature The verification signature generated. + @param salt A random string used to compute the hash and keep it randomized. + @param timestamp The date and time that the signature was created. + */ +- (nullable instancetype)initWithPlayerID:(NSString *)playerID + publicKeyURL:(NSURL *)publicKeyURL + signature:(NSData *)signature + salt:(NSData *)salt + timestamp:(uint64_t)timestamp + displayName:(NSString *)displayName NS_DESIGNATED_INITIALIZER; + +/** @fn initWithProvider: + @brief Initializer with a provider name. + @param provider The provider name. + */ +- (nullable instancetype)initWithProvider:(NSString *)provider NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.m new file mode 100644 index 00000000..132eafe5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.m @@ -0,0 +1,92 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h" + +#import + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRGameCenterAuthCredential + +- (nullable instancetype)initWithProvider:(NSString *)provider { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"Please call the designated initializer."]; + return nil; +} + +- (nullable instancetype)initWithPlayerID:(NSString *)playerID + publicKeyURL:(NSURL *)publicKeyURL + signature:(NSData *)signature + salt:(NSData *)salt + timestamp:(uint64_t)timestamp + displayName:(NSString *)displayName { + self = [super initWithProvider:FIRGameCenterAuthProviderID]; + if (self) { + _playerID = [playerID copy]; + _publicKeyURL = [publicKeyURL copy]; + _signature = [signature copy]; + _salt = [salt copy]; + _timestamp = timestamp; + _displayName = [displayName copy]; + } + return self; +} + +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason: + @"Attempt to call prepareVerifyAssertionRequest: on a FIRGameCenterAuthCredential."]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *playerID = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"playerID"]; + NSURL *publicKeyURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:@"publicKeyURL"]; + NSData *signature = [aDecoder decodeObjectOfClass:[NSData class] forKey:@"signature"]; + NSData *salt = [aDecoder decodeObjectOfClass:[NSData class] forKey:@"salt"]; + NSNumber *timestamp = [aDecoder decodeObjectOfClass:[NSNumber class] forKey:@"timestamp"]; + NSString *displayName = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"displayName"]; + self = [self initWithPlayerID:playerID + publicKeyURL:publicKeyURL + signature:signature + salt:salt + timestamp:timestamp.unsignedLongLongValue + displayName:displayName]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.playerID forKey:@"playerID"]; + [aCoder encodeObject:self.publicKeyURL forKey:@"publicKeyURL"]; + [aCoder encodeObject:self.signature forKey:@"signature"]; + [aCoder encodeObject:self.salt forKey:@"salt"]; + [aCoder encodeObject:[NSNumber numberWithUnsignedLongLong:self.timestamp] forKey:@"timestamp"]; + [aCoder encodeObject:self.displayName forKey:@"displayName"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthProvider.m new file mode 100644 index 00000000..d2daef40 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthProvider.m @@ -0,0 +1,92 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +#import "FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRGameCenterAuthProvider + +- (instancetype)init { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"This class is not meant to be initialized."]; + return nil; +} + ++ (void)getCredentialWithCompletion:(FIRGameCenterCredentialCallback)completion { + /** + Linking GameKit.framework without using it on macOS results in App Store rejection. + Thus we don't link GameKit.framework to our SDK directly. `optionalLocalPlayer` is used for + checking whether the APP that consuming our SDK has linked GameKit.framework. If not, a + `GameKitNotLinkedError` will be raised. + **/ + GKLocalPlayer *_Nullable optionalLocalPlayer = [[NSClassFromString(@"GKLocalPlayer") alloc] init]; + + if (!optionalLocalPlayer) { + if (completion) { + completion(nil, [FIRAuthErrorUtils gameKitNotLinkedError]); + } + return; + } + + __weak GKLocalPlayer *localPlayer = [[optionalLocalPlayer class] localPlayer]; + if (!localPlayer.isAuthenticated) { + if (completion) { + completion(nil, [FIRAuthErrorUtils localPlayerNotAuthenticatedError]); + } + return; + } + + [localPlayer generateIdentityVerificationSignatureWithCompletionHandler:^( + NSURL *publicKeyURL, NSData *signature, NSData *salt, uint64_t timestamp, + NSError *error) { + if (error) { + if (completion) { + completion(nil, error); + } + } else { + if (completion) { + /** + @c `localPlayer.alias` is actually the displayname needed, instead of + `localPlayer.displayname`. For more information, check + https://developer.apple.com/documentation/gamekit/gkplayer + **/ + NSString *displayName = localPlayer.alias; +// iOS 13 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + FIRGameCenterAuthCredential *credential = + [[FIRGameCenterAuthCredential alloc] initWithPlayerID:localPlayer.playerID + publicKeyURL:publicKeyURL + signature:signature + salt:salt + timestamp:timestamp + displayName:displayName]; +#pragma clang diagnostic pop + completion(credential, nil); + } + } + }]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.h new file mode 100644 index 00000000..f6765c41 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRGitHubAuthCredential + @brief Internal implementation of FIRAuthCredential for GitHub credentials. + */ +@interface FIRGitHubAuthCredential : FIRAuthCredential + +/** @property token + @brief The GitHub OAuth access token. + */ +@property(nonatomic, readonly) NSString *token; + +/** @fn initWithToken: + @brief Designated initializer. + @param token The GitHub OAuth access token. + */ +- (nullable instancetype)initWithToken:(NSString *)token NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.m new file mode 100644 index 00000000..ce9dbf13 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.m @@ -0,0 +1,70 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.h" + +#import + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRGitHubAuthCredential () + +- (nullable instancetype)initWithProvider:(NSString *)provider NS_UNAVAILABLE; + +@end + +@implementation FIRGitHubAuthCredential + +- (nullable instancetype)initWithProvider:(NSString *)provider { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"Please call the designated initializer."]; + return nil; +} + +- (nullable instancetype)initWithToken:(NSString *)token { + self = [super initWithProvider:FIRGitHubAuthProviderID]; + if (self) { + _token = [token copy]; + } + return self; +} + +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request { + request.providerAccessToken = _token; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *token = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"token"]; + self = [self initWithToken:token]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.token forKey:@"token"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthProvider.m new file mode 100644 index 00000000..6c448e1e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthProvider.m @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/GitHub/FIRGitHubAuthCredential.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +// FIRGitHubAuthProviderID is defined in FIRAuthProvider.m. + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRGitHubAuthProvider + +- (instancetype)init { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"This class is not meant to be initialized."]; + return nil; +} + ++ (FIRAuthCredential *)credentialWithToken:(NSString *)token { + return [[FIRGitHubAuthCredential alloc] initWithToken:token]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.h new file mode 100644 index 00000000..6d205c10 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRGoogleAuthCredential + @brief Internal implementation of FIRAuthCredential for the Google IdP. + */ +@interface FIRGoogleAuthCredential : FIRAuthCredential + +/** @fn initWithIDToken:accessToken: + @brief Designated initializer. + @param IDToken The ID Token obtained from Google. + @param accessToken The Access Token obtained from Google. + */ +- (nullable instancetype)initWithIDToken:(NSString *)IDToken + accessToken:(NSString *)accessToken NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.m new file mode 100644 index 00000000..36b8b5c5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.m @@ -0,0 +1,77 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.h" + +#import + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRGoogleAuthCredential () + +- (nullable instancetype)initWithProvider:(NSString *)provider NS_UNAVAILABLE; + +@end + +@implementation FIRGoogleAuthCredential { + NSString *_IDToken; + NSString *_accessToken; +} + +- (nullable instancetype)initWithProvider:(NSString *)provider { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"Please call the designated initializer."]; + return nil; +} + +- (nullable instancetype)initWithIDToken:(NSString *)IDToken accessToken:(NSString *)accessToken { + self = [super initWithProvider:FIRGoogleAuthProviderID]; + if (self) { + _IDToken = [IDToken copy]; + _accessToken = [accessToken copy]; + } + return self; +} + +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request { + request.providerIDToken = _IDToken; + request.providerAccessToken = _accessToken; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *IDToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"IDToken"]; + NSString *accessToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"accessToken"]; + self = [self initWithIDToken:IDToken accessToken:accessToken]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_IDToken forKey:@"IDToken"]; + [aCoder encodeObject:_accessToken forKey:@"accessToken"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthProvider.m new file mode 100644 index 00000000..ce234bc7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthProvider.m @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/Google/FIRGoogleAuthCredential.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +// FIRGoogleAuthProviderID is defined in FIRAuthProvider.m. + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRGoogleAuthProvider + +- (instancetype)init { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"This class is not meant to be initialized."]; + return nil; +} + ++ (FIRAuthCredential *)credentialWithIDToken:(NSString *)IDToken + accessToken:(NSString *)accessToken { + return [[FIRGoogleAuthCredential alloc] initWithIDToken:IDToken accessToken:accessToken]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential.m new file mode 100644 index 00000000..99a118fa --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential.m @@ -0,0 +1,130 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIROAuthCredential () + +@property(nonatomic, nullable) NSString *rawNonce; + +- (nullable instancetype)initWithProvider:(NSString *)provider NS_UNAVAILABLE; + +@end + +@implementation FIROAuthCredential + +- (nullable instancetype)initWithProvider:(NSString *)provider { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"Please call the designated initializer."]; + return nil; +} + +- (instancetype)initWithProviderID:(NSString *)providerID + IDToken:(nullable NSString *)IDToken + rawNonce:(nullable NSString *)rawNonce + accessToken:(nullable NSString *)accessToken + secret:(nullable NSString *)secret + pendingToken:(nullable NSString *)pendingToken { + self = [super initWithProvider:providerID]; + if (self) { + _IDToken = IDToken; + _rawNonce = rawNonce; + _accessToken = accessToken; + _pendingToken = pendingToken; + _secret = secret; + } + return self; +} + +- (instancetype)initWithProviderID:(NSString *)providerID + sessionID:(NSString *)sessionID + OAuthResponseURLString:(NSString *)OAuthResponseURLString { + self = [self initWithProviderID:providerID + IDToken:nil + rawNonce:nil + accessToken:nil + secret:nil + pendingToken:nil]; + if (self) { + _OAuthResponseURLString = OAuthResponseURLString; + _sessionID = sessionID; + } + return self; +} + +- (nullable instancetype)initWithVerifyAssertionResponse:(FIRVerifyAssertionResponse *)response { + if (response.oauthIDToken.length || response.oauthAccessToken.length || + response.oauthSecretToken.length) { + return [self initWithProviderID:response.providerID + IDToken:response.oauthIDToken + rawNonce:nil + accessToken:response.oauthAccessToken + secret:response.oauthSecretToken + pendingToken:response.pendingToken]; + } + return nil; +} + +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request { + request.providerIDToken = _IDToken; + request.providerRawNonce = _rawNonce; + request.providerAccessToken = _accessToken; + request.requestURI = _OAuthResponseURLString; + request.sessionID = _sessionID; + request.providerOAuthTokenSecret = _secret; + request.pendingToken = _pendingToken; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *IDToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"IDToken"]; + NSString *rawNonce = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"rawNonce"]; + NSString *accessToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"accessToken"]; + NSString *pendingToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"pendingToken"]; + NSString *secret = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"secret"]; + self = [self initWithProviderID:self.provider + IDToken:IDToken + rawNonce:rawNonce + accessToken:accessToken + secret:secret + pendingToken:pendingToken]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.IDToken forKey:@"IDToken"]; + [aCoder encodeObject:self.rawNonce forKey:@"rawNonce"]; + [aCoder encodeObject:self.accessToken forKey:@"accessToken"]; + [aCoder encodeObject:self.pendingToken forKey:@"pendingToken"]; + [aCoder encodeObject:self.secret forKey:@"secret"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h new file mode 100644 index 00000000..9f2c459f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h @@ -0,0 +1,78 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +@class FIRVerifyAssertionResponse; + +NS_ASSUME_NONNULL_BEGIN + +/** @extension FIROAuthCredential + @brief Internal implementation of FIRAuthCredential for generic credentials. + */ +@interface FIROAuthCredential () + +/** @property OAuthResponseURLString + @brief A string representation of the response URL corresponding to this OAuthCredential. + */ +@property(nonatomic, readonly, nullable) NSString *OAuthResponseURLString; + +/** @property sessionID + @brief The session ID used when completing the headful-lite flow. + */ +@property(nonatomic, readonly, nullable) NSString *sessionID; + +/** @property pendingToken + @brief The pending token used when completing the headful-lite flow. + */ +@property(nonatomic, readonly, nullable) NSString *pendingToken; + +/** @fn initWithProviderId:IDToken:accessToken:secret:pendingToken + @brief Designated initializer. + @param providerID The provider ID associated with the credential being created. + @param IDToken The ID Token associated with the credential being created. + @param rawNonce The raw nonce associated with the Auth credential being created. + @param accessToken The access token associated with the credential being created. + @param secret The secret associated with the credential being created. + @param pendingToken The pending token associated with the credential being created. + */ +- (instancetype)initWithProviderID:(NSString *)providerID + IDToken:(nullable NSString *)IDToken + rawNonce:(nullable NSString *)rawNonce + accessToken:(nullable NSString *)accessToken + secret:(nullable NSString *)secret + pendingToken:(nullable NSString *)pendingToken NS_DESIGNATED_INITIALIZER; + +/** @fn initWithProviderId:sessionID:OAuthResponseURLString: + @brief Intitializer which takes a sessionID and an OAuthResponseURLString. + @param providerID The provider ID associated with the credential being created. + @param sessionID The session ID used when completing the headful-lite flow. + @param OAuthResponseURLString The error that occurred if any. + */ +- (instancetype)initWithProviderID:(NSString *)providerID + sessionID:(NSString *)sessionID + OAuthResponseURLString:(NSString *)OAuthResponseURLString; + +/** @fn initWithVerifyAssertionResponse + @brief Intitializer which takes an verifyAssertion response. + @param response The verifyAssertion Response to create the credential instance. + */ +- (nullable instancetype)initWithVerifyAssertionResponse:(FIRVerifyAssertionResponse *)response; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthProvider.m new file mode 100644 index 00000000..348fb57b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthProvider.m @@ -0,0 +1,400 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#import +#import +#import +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h" +#import "FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h" + +#if TARGET_OS_IOS +#import "FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRHeadfulLiteURLCallBack + @brief The callback invoked at the end of the flow to fetch a headful-lite URL. + @param headfulLiteURL The headful lite URL. + @param error The error that occurred while fetching the headful-lite, if any. + */ +typedef void (^FIRHeadfulLiteURLCallBack)(NSURL *_Nullable headfulLiteURL, + NSError *_Nullable error); + +/** @var kHeadfulLiteURLStringFormat + @brief The format of the URL used to open the headful lite page during sign-in. + */ +NSString *const kHeadfulLiteURLStringFormat = @"https://%@/__/auth/handler?%@"; + +/** @var kauthTypeSignInWithRedirect + @brief The auth type to be specified in the sign-in request with redirect request and response. + */ +static NSString *const kAuthTypeSignInWithRedirect = @"signInWithRedirect"; + +@implementation FIROAuthProvider { + /** @var _auth + @brief The auth instance used for launching the URL presenter. + */ + FIRAuth *_auth; + + /** @var _callbackScheme + @brief The callback URL scheme used for headful-lite sign-in. + */ + NSString *_callbackScheme; +} + ++ (FIROAuthCredential *)credentialWithProviderID:(NSString *)providerID + IDToken:(NSString *)IDToken + accessToken:(nullable NSString *)accessToken { + return [[FIROAuthCredential alloc] initWithProviderID:providerID + IDToken:IDToken + rawNonce:nil + accessToken:accessToken + secret:nil + pendingToken:nil]; +} + ++ (FIROAuthCredential *)credentialWithProviderID:(NSString *)providerID + accessToken:(NSString *)accessToken { + return [[FIROAuthCredential alloc] initWithProviderID:providerID + IDToken:nil + rawNonce:nil + accessToken:accessToken + secret:nil + pendingToken:nil]; +} + ++ (FIROAuthCredential *)credentialWithProviderID:(NSString *)providerID + IDToken:(NSString *)IDToken + rawNonce:(nullable NSString *)rawNonce + accessToken:(nullable NSString *)accessToken { + return [[FIROAuthCredential alloc] initWithProviderID:providerID + IDToken:IDToken + rawNonce:rawNonce + accessToken:accessToken + secret:nil + pendingToken:nil]; +} + ++ (FIROAuthCredential *)credentialWithProviderID:(NSString *)providerID + IDToken:(NSString *)IDToken + rawNonce:(nullable NSString *)rawNonce { + return [[FIROAuthCredential alloc] initWithProviderID:providerID + IDToken:IDToken + rawNonce:rawNonce + accessToken:nil + secret:nil + pendingToken:nil]; +} + ++ (instancetype)providerWithProviderID:(NSString *)providerID { + return [[self alloc] initWithProviderID:providerID auth:[FIRAuth auth]]; +} + ++ (instancetype)providerWithProviderID:(NSString *)providerID auth:(FIRAuth *)auth { + return [[self alloc] initWithProviderID:providerID auth:auth]; +} + +#if TARGET_OS_IOS +- (void)getCredentialWithUIDelegate:(nullable id)UIDelegate + completion:(nullable FIRAuthCredentialCallback)completion { + if (![FIRAuthWebUtils isCallbackSchemeRegisteredForCustomURLScheme:self->_callbackScheme]) { + [NSException raise:NSInternalInconsistencyException + format:@"Please register custom URL scheme '%@' in the app's Info.plist file.", + self->_callbackScheme]; + } + __weak __typeof__(self) weakSelf = self; + __weak FIRAuth *weakAuth = _auth; + __weak NSString *weakProviderID = _providerID; + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRAuthCredentialCallback callbackOnMainThread = + ^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(credential, error); + }); + } + }; + NSString *eventID = [FIRAuthWebUtils randomStringWithLength:10]; + NSString *sessionID = [FIRAuthWebUtils randomStringWithLength:10]; + __strong __typeof__(self) strongSelf = weakSelf; + [strongSelf + getHeadFulLiteURLWithEventID:eventID + sessionID:sessionID + completion:^(NSURL *_Nullable headfulLiteURL, NSError *_Nullable error) { + if (error) { + callbackOnMainThread(nil, error); + return; + } + FIRAuthURLCallbackMatcher callbackMatcher = + ^BOOL(NSURL *_Nullable callbackURL) { + return [FIRAuthWebUtils + isExpectedCallbackURL:callbackURL + eventID:eventID + authType:kAuthTypeSignInWithRedirect + callbackScheme:strongSelf->_callbackScheme]; + }; + __strong FIRAuth *strongAuth = weakAuth; + [strongAuth.authURLPresenter + presentURL:headfulLiteURL + UIDelegate:UIDelegate + callbackMatcher:callbackMatcher + completion:^(NSURL *_Nullable callbackURL, + NSError *_Nullable error) { + if (error) { + callbackOnMainThread(nil, error); + return; + } + NSString *OAuthResponseURLString = + [strongSelf OAuthResponseForURL:callbackURL + error:&error]; + if (error) { + callbackOnMainThread(nil, error); + return; + } + __strong NSString *strongProviderID = weakProviderID; + FIROAuthCredential *credential = [[FIROAuthCredential alloc] + initWithProviderID:strongProviderID + sessionID:sessionID + OAuthResponseURLString:OAuthResponseURLString]; + callbackOnMainThread(credential, nil); + }]; + }]; + }); +} +#endif // TARGET_OS_IOS + +#pragma mark - Internal Methods + +/** @fn initWithProviderID:auth: + @brief returns an instance of @c FIROAuthProvider associated with the provided auth instance. + @param auth The Auth instance to be associated with the OAuthProvider instance. + @return An Instance of @c FIROAuthProvider. + */ +- (nullable instancetype)initWithProviderID:(NSString *)providerID auth:(FIRAuth *)auth { + NSAssert(![providerID isEqual:FIRFacebookAuthProviderID], + @"Sign in with Facebook is not supported via generic IDP; the Facebook TOS " + "dictate that you must use the Facebook iOS SDK for Facebook login."); + NSAssert(![providerID isEqual:@"apple.com"], + @"Sign in with Apple is not supported via generic IDP; You must use the Apple iOS SDK" + " for Sign in with Apple."); + self = [super init]; + if (self) { + _auth = auth; + _providerID = providerID; + _callbackScheme = [[[_auth.app.options.clientID componentsSeparatedByString:@"."] + reverseObjectEnumerator].allObjects componentsJoinedByString:@"."]; + } + return self; +} + +/** @fn OAuthResponseForURL:error: + @brief Parses the redirected URL and returns a string representation of the OAuth response URL. + @param URL The url to be parsed for an OAuth response URL. + @param error The error that occurred if any. + @return The OAuth response if successful. + */ +- (nullable NSString *)OAuthResponseForURL:(NSURL *)URL error:(NSError *_Nullable *_Nullable)error { + NSDictionary *URLQueryItems = + [FIRAuthWebUtils dictionaryWithHttpArgumentsString:URL.query]; + NSURL *deepLinkURL = [NSURL URLWithString:URLQueryItems[@"deep_link_id"]]; + URLQueryItems = [FIRAuthWebUtils dictionaryWithHttpArgumentsString:deepLinkURL.query]; + NSString *queryItemLink = URLQueryItems[@"link"]; + if (queryItemLink) { + return queryItemLink; + } + if (!error) { + return nil; + } + NSData *errorData = [URLQueryItems[@"firebaseError"] dataUsingEncoding:NSUTF8StringEncoding]; + NSError *jsonError; + NSDictionary *errorDict = [NSJSONSerialization JSONObjectWithData:errorData + options:0 + error:&jsonError]; + if (jsonError) { + *error = [FIRAuthErrorUtils JSONSerializationErrorWithUnderlyingError:jsonError]; + return nil; + } + *error = [FIRAuthErrorUtils URLResponseErrorWithCode:errorDict[@"code"] + message:errorDict[@"message"]]; + if (!*error) { + NSString *reason; + if (errorDict[@"code"] && errorDict[@"message"]) { + reason = [NSString stringWithFormat:@"[%@] - %@", errorDict[@"code"], errorDict[@"message"]]; + } + *error = [FIRAuthErrorUtils webSignInUserInteractionFailureWithReason:reason]; + } + return nil; +} + +/** @fn getHeadFulLiteURLWithEventID:completion: + @brief Constructs a URL used for opening a headful-lite flow using a given event + ID and session ID. + @param eventID The event ID used for this purpose. + @param sessionID The session ID used when completing the headful lite flow. + @param completion The callback invoked after the URL has been constructed or an error + has been encountered. + */ +- (void)getHeadFulLiteURLWithEventID:(NSString *)eventID + sessionID:(NSString *)sessionID + completion:(FIRHeadfulLiteURLCallBack)completion { + __weak __typeof__(self) weakSelf = self; + [FIRAuthWebUtils + fetchAuthDomainWithRequestConfiguration:_auth.requestConfiguration + completion:^(NSString *_Nullable authDomain, + NSError *_Nullable error) { + if (error) { + if (completion) { + completion(nil, error); + } + return; + } + __strong __typeof__(self) strongSelf = weakSelf; + NSString *bundleID = [NSBundle mainBundle].bundleIdentifier; + NSString *clienID = strongSelf->_auth.app.options.clientID; + NSString *apiKey = + strongSelf->_auth.requestConfiguration.APIKey; + NSMutableDictionary *urlArguments = [@{ + @"apiKey" : apiKey, + @"authType" : @"signInWithRedirect", + @"ibi" : bundleID ?: @"", + @"clientId" : clienID, + @"sessionId" : [strongSelf hashforString:sessionID], + @"v" : [FIRAuthBackend authUserAgent], + @"eventId" : eventID, + @"providerId" : strongSelf->_providerID, + } mutableCopy]; + if (strongSelf.scopes.count) { + urlArguments[@"scopes"] = + [strongSelf.scopes componentsJoinedByString:@","]; + } + if (strongSelf.customParameters.count) { + NSString *customParameters = + [strongSelf customParametersStringWithError:&error]; + if (error) { + completion(nil, error); + return; + } + if (customParameters) { + urlArguments[@"customParameters"] = customParameters; + } + } + if (strongSelf->_auth.requestConfiguration.languageCode) { + urlArguments[@"hl"] = + strongSelf->_auth.requestConfiguration.languageCode; + } + NSString *argumentsString = [strongSelf + httpArgumentsStringForArgsDictionary:urlArguments]; + NSString *URLString = + [NSString stringWithFormat:kHeadfulLiteURLStringFormat, + authDomain, argumentsString]; + if (completion) { + NSCharacterSet *set = + [NSCharacterSet URLFragmentAllowedCharacterSet]; + completion( + [NSURL + URLWithString: + [URLString + stringByAddingPercentEncodingWithAllowedCharacters: + set]], + nil); + } + }]; +} + +/** @fn customParametersString + @brief Returns a JSON string representation of the custom parameters dictionary corresponding + to the OAuthProvider. + @return The JSON string representation of the custom parameters dictionary corresponding + to the OAuthProvider. + */ +- (nullable NSString *)customParametersStringWithError:(NSError *_Nullable *_Nullable)error { + if (!_customParameters.count) { + return nil; + } + + if (!error) { + return nil; + } + NSError *jsonError; + NSData *customParametersJSONData = [NSJSONSerialization dataWithJSONObject:_customParameters + options:0 + error:&jsonError]; + if (jsonError) { + *error = [FIRAuthErrorUtils JSONSerializationErrorWithUnderlyingError:jsonError]; + return nil; + } + + NSString *customParamsRawJSON = [[NSString alloc] initWithData:customParametersJSONData + encoding:NSUTF8StringEncoding]; + return customParamsRawJSON; +} + +/** @fn hashforString: + @brief Returns the SHA256 hash representation of a given string object. + @param string The string for which a SHA256 hash is desired. + @return An hexadecimal string representation of the SHA256 hash. + */ +- (NSString *)hashforString:(NSString *)string { + NSData *sessionIDData = [string dataUsingEncoding:NSUTF8StringEncoding]; + NSMutableData *hashOutputData = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; + if (CC_SHA256(sessionIDData.bytes, (CC_LONG)[sessionIDData length], + hashOutputData.mutableBytes)) { + } + return [self hexStringFromData:hashOutputData]; + ; +} + +/** @fn hexStringFromData: + @brief Returns the hexadecimal string representation of an NSData object. + @param data The NSData object for which a hexadecical string is desired. + @return The hexadecimal string representation of the supplied NSData object. + */ +- (NSString *)hexStringFromData:(NSData *)data { + const unsigned char *dataBuffer = (const unsigned char *)[data bytes]; + NSMutableString *string = [[NSMutableString alloc] init]; + for (unsigned int i = 0; i < data.length; i++) { + [string appendFormat:@"%02lx", (unsigned long)dataBuffer[i]]; + } + return [string copy]; +} + +- (NSString *)httpArgumentsStringForArgsDictionary:(NSDictionary *)argsDictionary { + NSMutableArray *arguments = [NSMutableArray arrayWithCapacity:argsDictionary.count]; + NSString *key; + for (key in argsDictionary) { + NSString *description = [argsDictionary[key] description]; + [arguments + addObject:[NSString + stringWithFormat:@"%@=%@", + [FIRAuthWebUtils stringByUnescapingFromURLArgument:key], + [FIRAuthWebUtils + stringByUnescapingFromURLArgument:description]]]; + } + return [arguments componentsJoinedByString:@"&"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential.m new file mode 100644 index 00000000..0444adfc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential.m @@ -0,0 +1,107 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +#if TARGET_OS_IOS +#import "FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRPhoneAuthCredential () + +- (nullable instancetype)initWithProvider:(NSString *)provider NS_UNAVAILABLE; + +@end + +@implementation FIRPhoneAuthCredential + +- (instancetype)initWithTemporaryProof:(NSString *)temporaryProof + phoneNumber:(NSString *)phoneNumber + providerID:(NSString *)providerID { + self = [super initWithProvider:providerID]; + if (self) { + _temporaryProof = [temporaryProof copy]; + _phoneNumber = [phoneNumber copy]; + } + return self; +} + +- (nullable instancetype)initWithProvider:(NSString *)provider { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"Please call the designated initializer."]; + return nil; +} + +- (instancetype)initWithProviderID:(NSString *)providerID + verificationID:(NSString *)verificationID + verificationCode:(NSString *)verificationCode { + self = [super initWithProvider:providerID]; + if (self) { + _verificationID = [verificationID copy]; + _verificationCode = [verificationCode copy]; + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *verificationID = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"verificationID"]; + NSString *verificationCode = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"verificationCode"]; + NSString *temporaryProof = [aDecoder decodeObjectOfClass:[NSString class] + forKey:@"temporaryProof"]; + NSString *phoneNumber = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"phoneNumber"]; + if (temporaryProof.length && phoneNumber.length) { + self = [self initWithTemporaryProof:temporaryProof + phoneNumber:phoneNumber + providerID:self.provider]; + } else if (verificationID.length && verificationCode.length) { + self = [self initWithProviderID:self.provider + verificationID:verificationID + verificationCode:verificationCode]; + } else { + self = nil; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.verificationID forKey:@"verificationID"]; + [aCoder encodeObject:self.verificationCode forKey:@"verificationCode"]; + [aCoder encodeObject:self.temporaryProof forKey:@"temporaryProof"]; + [aCoder encodeObject:self.phoneNumber forKey:@"phoneNumber"]; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h new file mode 100644 index 00000000..709ccfc6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h @@ -0,0 +1,73 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @extension FIRPhoneAuthCredential + @brief Internal implementation of FIRAuthCredential for Phone Auth credentials. + */ +@interface FIRPhoneAuthCredential () + +/** @var verificationID + @brief The verification ID obtained from invoking @c verifyPhoneNumber:completion: + */ +@property(nonatomic, readonly, nonnull) NSString *verificationID; + +/** @var verificationCode + @brief The verification code provided by the user. + */ +@property(nonatomic, readonly, nonnull) NSString *verificationCode; + +/** @var temporaryProof + @brief The a temporary proof code perftaining to this credential, returned from the backend. + */ +@property(nonatomic, readonly, nonnull) NSString *temporaryProof; + +/** @var phoneNumber + @brief The a phone number pertaining to this credential, returned from the backend. + */ +@property(nonatomic, readonly, nonnull) NSString *phoneNumber; + +/** @var initWithTemporaryProof:phoneNumber: + @brief Designated Initializer. + @param providerID The provider ID associated with the phone auth credential being created. + */ +- (instancetype)initWithTemporaryProof:(NSString *)temporaryProof + phoneNumber:(NSString *)phoneNumber + providerID:(NSString *)providerID NS_DESIGNATED_INITIALIZER; + +/** @var initWithProviderID:verificationID:verificationCode: + @brief Designated Initializer. + @param providerID The provider ID associated with the phone auth credential being created. + @param verificationID The verification ID associated witht Phone Auth credential being created. + @param verificationCode The verification code associated witht Phone Auth credential being + created. + */ +- (instancetype)initWithProviderID:(NSString *)providerID + verificationID:(NSString *)verificationID + verificationCode:(NSString *)verificationCode NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthProvider.m new file mode 100644 index 00000000..e0ddf86b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthProvider.m @@ -0,0 +1,716 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import +#import +#import +#import +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h" +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession+Internal.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h" + +#if TARGET_OS_IOS +#import "FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo+Internal.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRReCAPTCHAURLCallBack + @brief The callback invoked at the end of the flow to fetch a reCAPTCHA URL. + @param reCAPTCHAURL The reCAPTCHA URL. + @param error The error that occurred while fetching the reCAPTCHAURL, if any. + */ +typedef void (^FIRReCAPTCHAURLCallBack)(NSURL *_Nullable reCAPTCHAURL, NSError *_Nullable error); + +/** @typedef FIRVerifyClientCallback + @brief The callback invoked at the end of a client verification flow. + @param appCredential credential that proves the identity of the app during a phone + authentication flow. + @param error The error that occurred while verifying the app, if any. + */ +typedef void (^FIRVerifyClientCallback)(FIRAuthAppCredential *_Nullable appCredential, + NSString *_Nullable reCAPTCHAToken, + NSError *_Nullable error); + +/** @typedef FIRFetchAuthDomainCallback + @brief The callback invoked at the end of the flow to fetch the Auth domain. + @param authDomain The Auth domain. + @param error The error that occurred while fetching the auth domain, if any. + */ +typedef void (^FIRFetchAuthDomainCallback)(NSString *_Nullable authDomain, + NSError *_Nullable error); + +/** @var kauthTypeVerifyApp + @brief The auth type to be specified in the app verification request. + */ +static NSString *const kAuthTypeVerifyApp = @"verifyApp"; + +/** @var kReCAPTCHAURLStringFormat + @brief The format of the URL used to open the reCAPTCHA page during app verification. + */ +NSString *const kReCAPTCHAURLStringFormat = @"https://%@/__/auth/handler?"; + +extern NSString *const FIRPhoneMultiFactorID; + +@implementation FIRPhoneAuthProvider { + /** @var _auth + @brief The auth instance used for verifying the phone number. + */ + FIRAuth *_auth; + + /** @var _callbackScheme + @brief The callback URL scheme used for reCAPTCHA fallback. + */ + NSString *_callbackScheme; +} + +/** @fn initWithAuth: + @brief returns an instance of @c FIRPhoneAuthProvider associated with the provided auth + instance. + @return An Instance of @c FIRPhoneAuthProvider. + */ +- (nullable instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + _callbackScheme = [[[_auth.app.options.clientID componentsSeparatedByString:@"."] + reverseObjectEnumerator].allObjects componentsJoinedByString:@"."]; + } + return self; +} + +- (void)verifyPhoneNumber:(NSString *)phoneNumber + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRVerificationResultCallback)completion { + if (![FIRAuthWebUtils isCallbackSchemeRegisteredForCustomURLScheme:_callbackScheme]) { + [NSException raise:NSInternalInconsistencyException + format:@"Please register custom URL scheme '%@' in the app's Info.plist file.", + _callbackScheme]; + } + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRVerificationResultCallback callBackOnMainThread = + ^(NSString *_Nullable verificationID, NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(verificationID, error); + }); + } + }; + [self + internalVerifyPhoneNumber:phoneNumber + UIDelegate:UIDelegate + completion:^(NSString *_Nullable verificationID, NSError *_Nullable error) { + if (!error) { + callBackOnMainThread(verificationID, nil); + return; + } else { + callBackOnMainThread(nil, error); + return; + } + }]; + }); +} + +- (void)verifyPhoneNumberWithMultiFactorInfo:(FIRPhoneMultiFactorInfo *)phoneMultiFactorInfo + UIDelegate:(nullable id)UIDelegate + multiFactorSession:(nullable FIRMultiFactorSession *)session + completion:(nullable FIRVerificationResultCallback)completion { + session.multiFactorInfo = phoneMultiFactorInfo; + [self verifyPhoneNumber:phoneMultiFactorInfo.phoneNumber + UIDelegate:UIDelegate + multiFactorSession:session + completion:completion]; +} + +- (void)verifyPhoneNumber:(NSString *)phoneNumber + UIDelegate:(nullable id)UIDelegate + multiFactorSession:(nullable FIRMultiFactorSession *)session + completion:(nullable FIRVerificationResultCallback)completion { + if (!session) { + [self verifyPhoneNumber:phoneNumber UIDelegate:UIDelegate completion:completion]; + return; + } + + if (![FIRAuthWebUtils isCallbackSchemeRegisteredForCustomURLScheme:_callbackScheme]) { + [NSException raise:NSInternalInconsistencyException + format:@"Please register custom URL scheme '%@' in the app's Info.plist file.", + _callbackScheme]; + } + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + FIRVerificationResultCallback callBackOnMainThread = + ^(NSString *_Nullable verificationID, NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(verificationID, error); + }); + } + }; + [self + internalVerifyPhoneNumber:phoneNumber + UIDelegate:UIDelegate + multiFactorSession:session + completion:^(NSString *_Nullable verificationID, NSError *_Nullable error) { + if (!error) { + callBackOnMainThread(verificationID, nil); + return; + } else { + callBackOnMainThread(nil, error); + return; + } + }]; + }); +} + +- (FIRPhoneAuthCredential *)credentialWithVerificationID:(NSString *)verificationID + verificationCode:(NSString *)verificationCode { + return [[FIRPhoneAuthCredential alloc] initWithProviderID:FIRPhoneAuthProviderID + verificationID:verificationID + verificationCode:verificationCode]; +} + ++ (instancetype)provider { + return [[self alloc] initWithAuth:[FIRAuth auth]]; +} + ++ (instancetype)providerWithAuth:(FIRAuth *)auth { + return [[self alloc] initWithAuth:auth]; +} + +#pragma mark - Internal Methods + +/** @fn reCAPTCHATokenForURL:error: + @brief Parses the reCAPTCHA URL and returns the reCAPTCHA token. + @param URL The url to be parsed for a reCAPTCHA token. + @param error The error that occurred if any. + @return The reCAPTCHA token if successful. + */ +- (NSString *)reCAPTCHATokenForURL:(NSURL *)URL error:(NSError **)error { + NSURLComponents *actualURLComponents = [NSURLComponents componentsWithURL:URL + resolvingAgainstBaseURL:NO]; + NSArray *queryItems = [actualURLComponents queryItems]; + NSString *deepLinkURL = [FIRAuthWebUtils queryItemValue:@"deep_link_id" from:queryItems]; + NSData *errorData; + if (deepLinkURL) { + actualURLComponents = [NSURLComponents componentsWithString:deepLinkURL]; + queryItems = [actualURLComponents queryItems]; + NSString *recaptchaToken = [FIRAuthWebUtils queryItemValue:@"recaptchaToken" from:queryItems]; + if (recaptchaToken) { + return recaptchaToken; + } + NSString *firebaseError = [FIRAuthWebUtils queryItemValue:@"firebaseError" from:queryItems]; + errorData = [firebaseError dataUsingEncoding:NSUTF8StringEncoding]; + } else { + errorData = nil; + } + NSError *jsonError; + NSDictionary *errorDict = [NSJSONSerialization JSONObjectWithData:errorData + options:0 + error:&jsonError]; + if (jsonError) { + *error = [FIRAuthErrorUtils JSONSerializationErrorWithUnderlyingError:jsonError]; + return nil; + } + *error = [FIRAuthErrorUtils URLResponseErrorWithCode:errorDict[@"code"] + message:errorDict[@"message"]]; + if (!*error) { + NSString *reason; + if (errorDict[@"code"] && errorDict[@"message"]) { + reason = [NSString stringWithFormat:@"[%@] - %@", errorDict[@"code"], errorDict[@"message"]]; + } else { + reason = [NSString stringWithFormat:@"An unknown error occurred with the following " + "response: %@", + deepLinkURL]; + } + *error = [FIRAuthErrorUtils appVerificationUserInteractionFailureWithReason:reason]; + } + return nil; +} + +/** @fn internalVerifyPhoneNumber:completion: + @brief Starts the phone number authentication flow by sending a verifcation code to the + specified phone number. + @param phoneNumber The phone number to be verified. + @param completion The callback to be invoked when the verification flow is finished. + */ + +- (void)internalVerifyPhoneNumber:(NSString *)phoneNumber + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRVerificationResultCallback)completion { + if (!phoneNumber.length) { + completion(nil, [FIRAuthErrorUtils missingPhoneNumberErrorWithMessage:nil]); + return; + } + [_auth.notificationManager + checkNotificationForwardingWithCallback:^(BOOL isNotificationBeingForwarded) { + if (!isNotificationBeingForwarded) { + completion(nil, [FIRAuthErrorUtils notificationNotForwardedError]); + return; + } + FIRVerificationResultCallback callback = + ^(NSString *_Nullable verificationID, NSError *_Nullable error) { + if (completion) { + completion(verificationID, error); + } + }; + [self verifyClientAndSendVerificationCodeToPhoneNumber:phoneNumber + retryOnInvalidAppCredential:YES + UIDelegate:UIDelegate + callback:callback]; + }]; +} + +- (void)internalVerifyPhoneNumber:(NSString *)phoneNumber + UIDelegate:(nullable id)UIDelegate + multiFactorSession:(nullable FIRMultiFactorSession *)session + completion:(nullable FIRVerificationResultCallback)completion { + if (!phoneNumber.length) { + if (completion) { + completion(nil, [FIRAuthErrorUtils missingPhoneNumberErrorWithMessage:nil]); + } + return; + } + [_auth.notificationManager + checkNotificationForwardingWithCallback:^(BOOL isNotificationBeingForwarded) { + if (!isNotificationBeingForwarded) { + if (completion) { + completion(nil, [FIRAuthErrorUtils notificationNotForwardedError]); + } + return; + } + FIRVerificationResultCallback callback = + ^(NSString *_Nullable verificationID, NSError *_Nullable error) { + if (completion) { + completion(verificationID, error); + } + }; + [self verifyClientAndSendVerificationCodeToPhoneNumber:phoneNumber + retryOnInvalidAppCredential:YES + UIDelegate:UIDelegate + multiFactorSession:session + callback:callback]; + }]; +} + +/** @fn verifyClientAndSendVerificationCodeToPhoneNumber:retryOnInvalidAppCredential:callback: + @brief Starts the flow to verify the client via silent push notification. + @param retryOnInvalidAppCredential Whether of not the flow should be retried if an + FIRAuthErrorCodeInvalidAppCredential error is returned from the backend. + @param phoneNumber The phone number to be verified. + @param callback The callback to be invoked on the global work queue when the flow is + finished. + */ +- (void)verifyClientAndSendVerificationCodeToPhoneNumber:(NSString *)phoneNumber + retryOnInvalidAppCredential:(BOOL)retryOnInvalidAppCredential + UIDelegate:(nullable id)UIDelegate + callback:(FIRVerificationResultCallback)callback { + if (_auth.settings.isAppVerificationDisabledForTesting) { + FIRSendVerificationCodeRequest *request = + [[FIRSendVerificationCodeRequest alloc] initWithPhoneNumber:phoneNumber + appCredential:nil + reCAPTCHAToken:nil + requestConfiguration:_auth.requestConfiguration]; + [FIRAuthBackend sendVerificationCode:request + callback:^(FIRSendVerificationCodeResponse *_Nullable response, + NSError *_Nullable error) { + callback(response.verificationID, error); + }]; + return; + } + [self + verifyClientWithUIDelegate:UIDelegate + completion:^(FIRAuthAppCredential *_Nullable appCredential, + NSString *_Nullable reCAPTCHAToken, NSError *_Nullable error) { + if (error) { + callback(nil, error); + return; + } + FIRSendVerificationCodeRequest *_Nullable request; + if (appCredential) { + request = [[FIRSendVerificationCodeRequest alloc] + initWithPhoneNumber:phoneNumber + appCredential:appCredential + reCAPTCHAToken:nil + requestConfiguration:self->_auth.requestConfiguration]; + } else if (reCAPTCHAToken) { + request = [[FIRSendVerificationCodeRequest alloc] + initWithPhoneNumber:phoneNumber + appCredential:nil + reCAPTCHAToken:reCAPTCHAToken + requestConfiguration:self->_auth.requestConfiguration]; + } + if (request) { + [FIRAuthBackend + sendVerificationCode:request + callback:^( + FIRSendVerificationCodeResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + if (error.code == + FIRAuthErrorCodeInvalidAppCredential) { + if (retryOnInvalidAppCredential) { + [self->_auth + .appCredentialManager clearCredential]; + [self + verifyClientAndSendVerificationCodeToPhoneNumber: + phoneNumber + retryOnInvalidAppCredential: + NO + UIDelegate: + UIDelegate + callback: + callback]; + return; + } + callback( + nil, + [FIRAuthErrorUtils + unexpectedResponseWithDeserializedResponse: + nil + underlyingError: + error]); + return; + } + callback(nil, error); + return; + } + callback(response.verificationID, nil); + }]; + } + }]; +} + +- (void)verifyClientAndSendVerificationCodeToPhoneNumber:(NSString *)phoneNumber + retryOnInvalidAppCredential:(BOOL)retryOnInvalidAppCredential + UIDelegate:(nullable id)UIDelegate + multiFactorSession:(nullable FIRMultiFactorSession *)session + callback:(FIRVerificationResultCallback)callback { + if (_auth.settings.isAppVerificationDisabledForTesting) { + FIRSendVerificationCodeRequest *request = + [[FIRSendVerificationCodeRequest alloc] initWithPhoneNumber:phoneNumber + appCredential:nil + reCAPTCHAToken:nil + requestConfiguration:_auth.requestConfiguration]; + [FIRAuthBackend sendVerificationCode:request + callback:^(FIRSendVerificationCodeResponse *_Nullable response, + NSError *_Nullable error) { + callback(response.verificationID, error); + }]; + return; + } + + [self + verifyClientWithUIDelegate:UIDelegate + completion:^(FIRAuthAppCredential *_Nullable appCredential, + NSString *_Nullable reCAPTCHAToken, NSError *_Nullable error) { + if (error) { + if (callback) { + callback(nil, error); + } + return; + } + + NSString *IDToken = session.IDToken; + FIRAuthProtoStartMFAPhoneRequestInfo *startMFARequestInfo = + [[FIRAuthProtoStartMFAPhoneRequestInfo alloc] + initWithPhoneNumber:phoneNumber + appCredential:appCredential + reCAPTCHAToken:reCAPTCHAToken]; + if (session.IDToken) { + FIRStartMFAEnrollmentRequest *request = + [[FIRStartMFAEnrollmentRequest alloc] + initWithIDToken:IDToken + enrollmentInfo:startMFARequestInfo + requestConfiguration:self->_auth.requestConfiguration]; + [FIRAuthBackend + startMultiFactorEnrollment:request + callback:^(FIRStartMFAEnrollmentResponse + *_Nullable response, + NSError *_Nullable error) { + if (error) { + if (error.code == + FIRAuthErrorCodeInvalidAppCredential) { + if (retryOnInvalidAppCredential) { + [self->_auth.appCredentialManager + clearCredential]; + [self + verifyClientAndSendVerificationCodeToPhoneNumber: + phoneNumber + retryOnInvalidAppCredential: + NO + UIDelegate: + UIDelegate + multiFactorSession: + session + callback: + callback]; + return; + } + if (callback) { + callback( + nil, + [FIRAuthErrorUtils + unexpectedResponseWithDeserializedResponse: + nil + underlyingError: + error]); + } + return; + } else { + if (callback) { + callback(nil, error); + } + } + } else { + if (callback) { + callback( + response.enrollmentResponse.sessionInfo, + nil); + } + } + }]; + } else { + FIRStartMFASignInRequest *request = [[FIRStartMFASignInRequest alloc] + initWithMFAPendingCredential:session.MFAPendingCredential + MFAEnrollmentID:session.multiFactorInfo.UID + signInInfo:startMFARequestInfo + requestConfiguration:self->_auth.requestConfiguration]; + [FIRAuthBackend + startMultiFactorSignIn:request + callback:^( + FIRStartMFASignInResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + if (error.code == + FIRAuthErrorCodeInvalidAppCredential) { + if (retryOnInvalidAppCredential) { + [self->_auth + .appCredentialManager clearCredential]; + [self + verifyClientAndSendVerificationCodeToPhoneNumber: + phoneNumber + retryOnInvalidAppCredential: + NO + UIDelegate: + UIDelegate + multiFactorSession: + session + callback: + callback]; + return; + } + if (callback) { + callback( + nil, + [FIRAuthErrorUtils + unexpectedResponseWithDeserializedResponse: + nil + underlyingError: + error]); + } + return; + } else { + if (callback) { + callback(nil, error); + } + } + } else { + if (callback) { + callback(response.responseInfo.sessionInfo, nil); + } + } + }]; + } + }]; +} + +/** @fn verifyClientWithCompletion:completion: + @brief Continues the flow to verify the client via silent push notification. + @param completion The callback to be invoked when the client verification flow is finished. + */ +- (void)verifyClientWithUIDelegate:(nullable id)UIDelegate + completion:(FIRVerifyClientCallback)completion { + if (_auth.appCredentialManager.credential) { + completion(_auth.appCredentialManager.credential, nil, nil); + return; + } + [_auth.tokenManager getTokenWithCallback:^(FIRAuthAPNSToken *_Nullable token, + NSError *_Nullable error) { + if (!token) { + [self reCAPTCHAFlowWithUIDelegate:UIDelegate completion:completion]; + return; + } + FIRVerifyClientRequest *request = + [[FIRVerifyClientRequest alloc] initWithAppToken:token.string + isSandbox:token.type == FIRAuthAPNSTokenTypeSandbox + requestConfiguration:self->_auth.requestConfiguration]; + [FIRAuthBackend + verifyClient:request + callback:^(FIRVerifyClientResponse *_Nullable response, NSError *_Nullable error) { + if (error) { + NSError *underlyingError = error.userInfo[NSUnderlyingErrorKey]; + BOOL isInvalidAppCredential = + error.code == FIRAuthErrorCodeInternalError && + underlyingError.code == FIRAuthErrorCodeInvalidAppCredential; + if (error.code != FIRAuthErrorCodeMissingAppToken && !isInvalidAppCredential) { + completion(nil, nil, error); + return; + } else { + [self reCAPTCHAFlowWithUIDelegate:UIDelegate completion:completion]; + return; + } + } + NSTimeInterval timeout = [response.suggestedTimeOutDate timeIntervalSinceNow]; + [self->_auth.appCredentialManager + didStartVerificationWithReceipt:response.receipt + timeout:timeout + callback:^(FIRAuthAppCredential *credential) { + if (!credential.secret) { + FIRLogWarning(kFIRLoggerAuth, @"I-AUT000014", + @"Failed to receive remote notification " + @"to verify app identity within " + @"%.0f second(s)", + timeout); + } + completion(credential, nil, nil); + }]; + }]; + }]; +} + +- (void)reCAPTCHAFlowWithUIDelegate:(nullable id)UIDelegate + completion:(FIRVerifyClientCallback)completion { + NSString *eventID = [FIRAuthWebUtils randomStringWithLength:10]; + [self + reCAPTCHAURLWithEventID:eventID + completion:^(NSURL *_Nullable reCAPTCHAURL, NSError *_Nullable error) { + if (error) { + completion(nil, nil, error); + return; + } + FIRAuthURLCallbackMatcher callbackMatcher = + ^BOOL(NSURL *_Nullable callbackURL) { + return [FIRAuthWebUtils isExpectedCallbackURL:callbackURL + eventID:eventID + authType:kAuthTypeVerifyApp + callbackScheme:self->_callbackScheme]; + }; + [self->_auth.authURLPresenter + presentURL:reCAPTCHAURL + UIDelegate:UIDelegate + callbackMatcher:callbackMatcher + completion:^(NSURL *_Nullable callbackURL, NSError *_Nullable error) { + if (error) { + completion(nil, nil, error); + return; + } + NSError *reCAPTCHAError; + NSString *reCAPTCHAToken = + [self reCAPTCHATokenForURL:callbackURL error:&reCAPTCHAError]; + if (!reCAPTCHAToken) { + completion(nil, nil, reCAPTCHAError); + return; + } else { + completion(nil, reCAPTCHAToken, nil); + return; + } + }]; + }]; +} + +/** @fn reCAPTCHAURLWithEventID:completion: + @brief Constructs a URL used for opening a reCAPTCHA app verification flow using a given event + ID. + @param eventID The event ID used for this purpose. + @param completion The callback invoked after the URL has been constructed or an error + has been encountered. + */ +- (void)reCAPTCHAURLWithEventID:(NSString *)eventID completion:(FIRReCAPTCHAURLCallBack)completion { + [FIRAuthWebUtils + fetchAuthDomainWithRequestConfiguration:_auth.requestConfiguration + completion:^(NSString *_Nullable authDomain, + NSError *_Nullable error) { + if (error) { + if (completion) { + completion(nil, error); + return; + } + } + NSString *bundleID = [NSBundle mainBundle].bundleIdentifier; + NSString *clientID = self->_auth.app.options.clientID; + NSString *apiKey = self->_auth.requestConfiguration.APIKey; + NSMutableArray *queryItems = [@[ + [NSURLQueryItem queryItemWithName:@"apiKey" value:apiKey], + [NSURLQueryItem queryItemWithName:@"authType" + value:kAuthTypeVerifyApp], + [NSURLQueryItem queryItemWithName:@"ibi" + value:bundleID ?: @""], + [NSURLQueryItem queryItemWithName:@"clientId" + value:clientID], + [NSURLQueryItem + queryItemWithName:@"v" + value:[FIRAuthBackend authUserAgent]], + [NSURLQueryItem queryItemWithName:@"eventId" value:eventID] + ] mutableCopy]; + + if (self->_auth.requestConfiguration.languageCode) { + [queryItems + addObject:[NSURLQueryItem + queryItemWithName:@"hl" + value:self->_auth + .requestConfiguration + .languageCode]]; + } + NSURLComponents *components = [[NSURLComponents alloc] + initWithString: + [NSString stringWithFormat:kReCAPTCHAURLStringFormat, + authDomain]]; + [components setQueryItems:queryItems]; + if (completion) { + completion([components URL], nil); + } + }]; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.h new file mode 100644 index 00000000..ad25dc6b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.h @@ -0,0 +1,48 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRTwitterAuthCredential + @brief Internal implementation of FIRAuthCredential for Twitter credentials. + */ +@interface FIRTwitterAuthCredential : FIRAuthCredential + +/** @property token + @brief The Twitter OAuth token. + */ +@property(nonatomic, readonly) NSString *token; + +/** @property secret + @brief The Twitter OAuth secret. + */ +@property(nonatomic, readonly) NSString *secret; + +/** @fn initWithToken:secret: + @brief Designated initializer. + @param token The Twitter OAuth token. + @param secret The Twitter OAuth secret. + */ +- (nullable instancetype)initWithToken:(NSString *)token + secret:(NSString *)secret NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.m new file mode 100644 index 00000000..8b83420b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.m @@ -0,0 +1,74 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.h" + +#import + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRTwitterAuthCredential () + +- (nullable instancetype)initWithProvider:(NSString *)provider NS_UNAVAILABLE; + +@end + +@implementation FIRTwitterAuthCredential + +- (nullable instancetype)initWithProvider:(NSString *)provider { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"Please call the designated initializer."]; + return nil; +} + +- (nullable instancetype)initWithToken:(NSString *)token secret:(NSString *)secret { + self = [super initWithProvider:FIRTwitterAuthProviderID]; + if (self) { + _token = [token copy]; + _secret = [secret copy]; + } + return self; +} + +- (void)prepareVerifyAssertionRequest:(FIRVerifyAssertionRequest *)request { + request.providerAccessToken = _token; + request.providerOAuthTokenSecret = _secret; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *token = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"token"]; + NSString *secret = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"secret"]; + self = [self initWithToken:token secret:secret]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.token forKey:@"token"]; + [aCoder encodeObject:self.secret forKey:@"secret"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthProvider.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthProvider.m new file mode 100644 index 00000000..121fae4b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthProvider.m @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/AuthProvider/Twitter/FIRTwitterAuthCredential.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +// FIRTwitterAuthProviderID is defined in FIRAuthProvider.m. + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRTwitterAuthProvider + +- (instancetype)init { + [FIRAuthExceptionUtils + raiseMethodNotImplementedExceptionWithReason:@"This class is not meant to be initialized."]; + return nil; +} + ++ (FIRAuthCredential *)credentialWithToken:(NSString *)token secret:(NSString *)secret { + return [[FIRTwitterAuthCredential alloc] initWithToken:token secret:secret]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h new file mode 100644 index 00000000..34b38925 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h @@ -0,0 +1,125 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRStartMFAEnrollmentResponseCallback + @brief The type of block used to return the result of a call to the startMFAEnroll endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. +*/ +typedef void (^FIRStartMFAEnrollmentResponseCallback)( + FIRStartMFAEnrollmentResponse *_Nullable response, NSError *_Nullable error); + +/** @typedef FIRFinalizeMFAEnrollmentResponseCallback + @brief The type of block used to return the result of a call to the finalizeMFAEnroll endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. +*/ +typedef void (^FIRFinalizeMFAEnrollmentResponseCallback)( + FIRFinalizeMFAEnrollmentResponse *_Nullable response, NSError *_Nullable error); + +/** @typedef FIRStartMFASignInResponseCallback + @brief The type of block used to return the result of a call to the startMFASignIn endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. +*/ +typedef void (^FIRStartMFASignInResponseCallback)(FIRStartMFASignInResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRFinalizeMFASignInResponseCallback + @brief The type of block used to return the result of a call to the finalizeMFASignIn endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. +*/ +typedef void (^FIRFinalizeMFASignInResponseCallback)( + FIRFinalizeMFASignInResponse *_Nullable response, NSError *_Nullable error); + +/** @typedef FIRWithdrawMFAResponseCallback + @brief The type of block used to return the result of a call to the MFAUnenroll endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. +*/ +typedef void (^FIRWithdrawMFAResponseCallback)(FIRWithdrawMFAResponse *_Nullable response, + NSError *_Nullable error); + +@interface FIRAuthBackend (MultiFactor) + +/** @fn startMultiFactorEnrollment:callback: + @brief Calls the startMFAEnrollment endpoint. + @param request The request parameters. + @param callback The callback. +*/ ++ (void)startMultiFactorEnrollment:(FIRStartMFAEnrollmentRequest *)request + callback:(FIRStartMFAEnrollmentResponseCallback)callback; + +/** @fn finalizeMultiFactorEnrollment:callback: + @brief Calls the finalizeMultiFactorEnrollment endpoint. + @param request The request parameters. + @param callback The callback. +*/ ++ (void)finalizeMultiFactorEnrollment:(FIRFinalizeMFAEnrollmentRequest *)request + callback:(FIRFinalizeMFAEnrollmentResponseCallback)callback; + +/** @fn startMultiFactorSignIn:callback: + @brief Calls the startMultiFactorSignIn endpoint. + @param request The request parameters. + @param callback The callback. +*/ ++ (void)startMultiFactorSignIn:(FIRStartMFASignInRequest *)request + callback:(FIRStartMFASignInResponseCallback)callback; + +/** @fn finalizeMultiFactorSignIn:callback: + @brief Calls the finalizeMultiFactorSignIn endpoint. + @param request The request parameters. + @param callback The callback. +*/ ++ (void)finalizeMultiFactorSignIn:(FIRFinalizeMFASignInRequest *)request + callback:(FIRFinalizeMFASignInResponseCallback)callback; + +/** @fn withdrawMultiFactor:callback: + @brief Calls the withdrawMultiFactor endpoint. + @param request The request parameters. + @param callback The callback. +*/ ++ (void)withdrawMultiFactor:(FIRWithdrawMFARequest *)request + callback:(FIRWithdrawMFAResponseCallback)callback; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.m new file mode 100644 index 00000000..147fc7be --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.m @@ -0,0 +1,96 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h" + +@implementation FIRAuthBackend (MultiFactor) + ++ (void)startMultiFactorEnrollment:(FIRStartMFAEnrollmentRequest *)request + callback:(FIRStartMFAEnrollmentResponseCallback)callback { + FIRStartMFAEnrollmentResponse *response = [[FIRStartMFAEnrollmentResponse alloc] init]; + [[self implementation] postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + ++ (void)finalizeMultiFactorEnrollment:(FIRFinalizeMFAEnrollmentRequest *)request + callback:(FIRFinalizeMFAEnrollmentResponseCallback)callback { + FIRFinalizeMFAEnrollmentResponse *response = [[FIRFinalizeMFAEnrollmentResponse alloc] init]; + [[self implementation] postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + ++ (void)startMultiFactorSignIn:(FIRStartMFASignInRequest *)request + callback:(FIRStartMFASignInResponseCallback)callback { + FIRStartMFASignInResponse *response = [[FIRStartMFASignInResponse alloc] init]; + [[self implementation] postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + ++ (void)finalizeMultiFactorSignIn:(FIRFinalizeMFASignInRequest *)request + callback:(FIRFinalizeMFASignInResponseCallback)callback { + FIRFinalizeMFASignInResponse *response = [[FIRFinalizeMFASignInResponse alloc] init]; + [[self implementation] postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + ++ (void)withdrawMultiFactor:(FIRWithdrawMFARequest *)request + callback:(FIRWithdrawMFAResponseCallback)callback { + FIRWithdrawMFAResponse *response = [[FIRWithdrawMFAResponse alloc] init]; + [[self implementation] postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +@end + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend.h new file mode 100644 index 00000000..d3e9bca4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend.h @@ -0,0 +1,620 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +@class FIRAuthRequestConfiguration; +@class FIRCreateAuthURIRequest; +@class FIRCreateAuthURIResponse; +@class FIRDeleteAccountRequest; +@class FIRDeleteAccountResponse; +@class FIREmailLinkSignInRequest; +@class FIREmailLinkSignInResponse; +@class FIRGetAccountInfoRequest; +@class FIRGetAccountInfoResponse; +@class FIRGetProjectConfigRequest; +@class FIRGetProjectConfigResponse; +@class FIRGetOOBConfirmationCodeRequest; +@class FIRGetOOBConfirmationCodeResponse; +@class FIRResetPasswordRequest; +@class FIRResetPasswordResponse; +@class FIRSecureTokenRequest; +@class FIRSecureTokenResponse; +@class FIRSetAccountInfoRequest; +@class FIRSetAccountInfoResponse; +@class FIRVerifyAssertionRequest; +@class FIRVerifyAssertionResponse; +@class FIRVerifyClientRequest; +@class FIRVerifyClientResponse; +@class FIRVerifyCustomTokenRequest; +@class FIRVerifyCustomTokenResponse; +@class FIRVerifyPasswordRequest; +@class FIRVerifyPasswordResponse; +@class FIRVerifyPhoneNumberRequest; +@class FIRVerifyPhoneNumberResponse; +@class FIRSendVerificationCodeRequest; +@class FIRSendVerificationCodeResponse; +@class FIRSignInWithGameCenterRequest; +@class FIRSignInWithGameCenterResponse; +@class FIRSignUpNewUserRequest; +@class FIRSignUpNewUserResponse; + +@protocol FIRAuthBackendImplementation; +@protocol FIRAuthBackendRPCIssuer; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRAuthBackendRPCIssuerCompletionHandler + @brief The type of block used to return the result of a call to an endpoint. + @param data The HTTP response body. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRAuthBackendRPCIssuerCompletionHandler)(NSData *_Nullable data, + NSError *_Nullable error); + +/** @typedef FIRCreateAuthURIResponseCallback + @brief The type of block used to return the result of a call to the createAuthURI + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRCreateAuthURIResponseCallback)(FIRCreateAuthURIResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRGetAccountInfoResponseCallback + @brief The type of block used to return the result of a call to the getAccountInfo + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRGetAccountInfoResponseCallback)(FIRGetAccountInfoResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRGetProjectConfigResponseCallback + @brief The type of block used to return the result of a call to the getProjectInfo + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRGetProjectConfigResponseCallback)(FIRGetProjectConfigResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRSetAccountInfoResponseCallback + @brief The type of block used to return the result of a call to the setAccountInfo + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRSetAccountInfoResponseCallback)(FIRSetAccountInfoResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRSecureTokenResponseCallback + @brief The type of block used to return the result of a call to the token endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRSecureTokenResponseCallback)(FIRSecureTokenResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRVerifyAssertionResponseCallback + @brief The type of block used to return the result of a call to the verifyAssertion + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRVerifyAssertionResponseCallback)(FIRVerifyAssertionResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRVerifyPasswordResponseCallback + @brief The type of block used to return the result of a call to the verifyPassword + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRVerifyPasswordResponseCallback)(FIRVerifyPasswordResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIREmailLinkSigninResponseCallback + @brief The type of block used to return the result of a call to the emailLinkSignin + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIREmailLinkSigninResponseCallback)(FIREmailLinkSignInResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRVerifyCustomTokenResponseCallback + @brief The type of block used to return the result of a call to the verifyCustomToken + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRVerifyCustomTokenResponseCallback)( + FIRVerifyCustomTokenResponse *_Nullable response, NSError *_Nullable error); + +/** @typedef FIRDeleteCallBack + @brief The type of block called when a request delete account has finished. + @param error The error which occurred, or nil if the request was successful. + */ +typedef void (^FIRDeleteCallBack)(NSError *_Nullable error); + +/** @typedef FIRGetOOBConfirmationCodeResponseCallback + @brief The type of block used to return the result of a call to the getOOBConfirmationCode + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRGetOOBConfirmationCodeResponseCallback)( + FIRGetOOBConfirmationCodeResponse *_Nullable response, NSError *_Nullable error); + +/** @typedef FIRSignupNewUserCallback + @brief The type of block used to return the result of a call to the signupNewUser endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRSignupNewUserCallback)(FIRSignUpNewUserResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRResetPasswordCallback + @brief The type of block used to return the result of a call to the resetPassword endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRResetPasswordCallback)(FIRResetPasswordResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRSendVerificationCodeResponseCallback + @brief The type of block used to return the result of a call to the sendVerificationCode + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRSendVerificationCodeResponseCallback)( + FIRSendVerificationCodeResponse *_Nullable response, NSError *_Nullable error); + +/** @typedef FIRVerifyPhoneNumberResponseCallback + @brief The type of block used to return the result of a call to the verifyPhoneNumber endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRVerifyPhoneNumberResponseCallback)( + FIRVerifyPhoneNumberResponse *_Nullable response, NSError *_Nullable error); + +/** @typedef FIRVerifyClientResponseCallback + @brief The type of block used to return the result of a call to the verifyClient endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRVerifyClientResponseCallback)(FIRVerifyClientResponse *_Nullable response, + NSError *_Nullable error); + +/** @typedef FIRSignInWithGameCenterResponseCallback + @brief The type of block used to return the result of a call to the SignInWithGameCenter + endpoint. + @param response The received response, if any. + @param error The error which occurred, if any. + @remarks One of response or error will be non-nil. + */ +typedef void (^FIRSignInWithGameCenterResponseCallback)( + FIRSignInWithGameCenterResponse *_Nullable response, NSError *_Nullable error); + +/** @class FIRAuthBackend + @brief Simple static class with methods representing the backend RPCs. + @remarks All callback blocks passed as method parameters are invoked asynchronously on the + global work queue in the future. See + https://github.com/firebase/firebase-ios-sdk/tree/master/FirebaseAuth/Docs/threading.md + */ +@interface FIRAuthBackend : NSObject + +/** @fn authUserAgent + @brief Retrieves the Firebase Auth user agent. + @return The Firebase Auth user agent. + */ ++ (NSString *)authUserAgent; + ++ (id)implementation; + +/** @fn setBackendImplementation: + @brief Changes the default backend implementation to something else. + @param backendImplementation The backend implementation to use. + @remarks This is not, generally, safe to call in a scenario where other backend requests may + be occuring. This is specifically to help mock the backend for testing purposes. + */ ++ (void)setBackendImplementation:(id)backendImplementation; + +/** @fn setDefaultBackendImplementationWithRPCIssuer: + @brief Uses the default backend implementation, but with a custom RPC issuer. + @param RPCIssuer The RPC issuer to use. If @c nil, will use the default implementation. + @remarks This is not, generally, safe to call in a scenario where other backend requests may + be occuring. This is specifically to help test the backend interfaces (requests, responses, + and shared FIRAuthBackend logic.) + */ ++ (void)setDefaultBackendImplementationWithRPCIssuer: + (nullable id)RPCIssuer; + +/** @fn createAuthURI:callback: + @brief Calls the createAuthURI endpoint, which is responsible for creating the URI used by the + IdP to authenticate the user. + @param request The request parameters. + @param callback The callback. + */ ++ (void)createAuthURI:(FIRCreateAuthURIRequest *)request + callback:(FIRCreateAuthURIResponseCallback)callback; + +/** @fn getAccountInfo:callback: + @brief Calls the getAccountInfo endpoint, which returns account info for a given account. + @param request The request parameters. + @param callback The callback. + */ ++ (void)getAccountInfo:(FIRGetAccountInfoRequest *)request + callback:(FIRGetAccountInfoResponseCallback)callback; + +/** @fn getProjectConfig:callback: + @brief Calls the getProjectConfig endpoint, which returns configuration information for a given + project. + @param request An object wrapping the backend get request. + @param callback The callback. + */ ++ (void)getProjectConfig:(FIRGetProjectConfigRequest *)request + callback:(FIRGetProjectConfigResponseCallback)callback; + +/** @fn setAccountInfo:callback: + @brief Calls the setAccountInfo endpoint, which is responsible for setting account info for a + user, for example, to sign up a new user with email and password. + @param request The request parameters. + @param callback The callback. + */ ++ (void)setAccountInfo:(FIRSetAccountInfoRequest *)request + callback:(FIRSetAccountInfoResponseCallback)callback; + +/** @fn verifyAssertion:callback: + @brief Calls the verifyAssertion endpoint, which is responsible for authenticating a + user who has IDP-related credentials (an ID Token, an Access Token, etc.) + @param request The request parameters. + @param callback The callback. + */ ++ (void)verifyAssertion:(FIRVerifyAssertionRequest *)request + callback:(FIRVerifyAssertionResponseCallback)callback; + +/** @fn verifyCustomToken:callback: + @brief Calls the verifyCustomToken endpoint, which is responsible for authenticating a + user who has BYOAuth credentials (a self-signed token using their BYOAuth private key.) + @param request The request parameters. + @param callback The callback. + */ ++ (void)verifyCustomToken:(FIRVerifyCustomTokenRequest *)request + callback:(FIRVerifyCustomTokenResponseCallback)callback; + +/** @fn verifyPassword:callback: + @brief Calls the verifyPassword endpoint, which is responsible for authenticating a + user who has email and password credentials. + @param request The request parameters. + @param callback The callback. + */ ++ (void)verifyPassword:(FIRVerifyPasswordRequest *)request + callback:(FIRVerifyPasswordResponseCallback)callback; + +/** @fn emailLinkSignin:callback: + @brief Calls the emailLinkSignin endpoint, which is responsible for authenticating a + user through passwordless sign-in. + @param request The request parameters. + @param callback The callback. + */ ++ (void)emailLinkSignin:(FIREmailLinkSignInRequest *)request + callback:(FIREmailLinkSigninResponseCallback)callback; + +/** @fn secureToken:callback: + @brief Calls the token endpoint, which is responsible for performing STS token exchanges and + token refreshes. + @param request The request parameters. + @param callback The callback. + */ ++ (void)secureToken:(FIRSecureTokenRequest *)request + callback:(FIRSecureTokenResponseCallback)callback; + +/** @fn getOOBConfirmationCode:callback: + @brief Calls the getOOBConfirmationCode endpoint, which is responsible for sending email change + request emails, and password reset emails. + @param request The request parameters. + @param callback The callback. + */ ++ (void)getOOBConfirmationCode:(FIRGetOOBConfirmationCodeRequest *)request + callback:(FIRGetOOBConfirmationCodeResponseCallback)callback; + +/** @fn signUpNewUser: + @brief Calls the signUpNewUser endpoint, which is responsible anonymously signing up a user + or signing in a user anonymously. + @param request The request parameters. + @param callback The callback. + */ ++ (void)signUpNewUser:(FIRSignUpNewUserRequest *)request + callback:(FIRSignupNewUserCallback)callback; + +/** @fn resetPassword:callback + @brief Calls the resetPassword endpoint, which is responsible for resetting a user's password + given an OOB code and new password. + @param request The request parameters. + @param callback The callback. + */ ++ (void)resetPassword:(FIRResetPasswordRequest *)request + callback:(FIRResetPasswordCallback)callback; + +/** @fn deleteAccount: + @brief Calls the DeleteAccount endpoint, which is responsible for deleting a user. + @param request The request parameters. + @param callback The callback. + */ ++ (void)deleteAccount:(FIRDeleteAccountRequest *)request callback:(FIRDeleteCallBack)callback; + +/** @fn SignInWithGameCenter:callback: + @brief Calls the SignInWithGameCenter endpoint, which is responsible for authenticating a user + who has Game Center credentials. + @param request The request parameters. + @param callback The callback. + */ ++ (void)signInWithGameCenter:(FIRSignInWithGameCenterRequest *)request + callback:(FIRSignInWithGameCenterResponseCallback)callback; + +#if TARGET_OS_IOS +/** @fn sendVerificationCode:callback: + @brief Calls the sendVerificationCode endpoint, which is responsible for sending the + verification code to a phone number specified in the request parameters. + @param request The request parameters. + @param callback The callback. + */ ++ (void)sendVerificationCode:(FIRSendVerificationCodeRequest *)request + callback:(FIRSendVerificationCodeResponseCallback)callback; + +/** @fn verifyPhoneNumber:callback: + @brief Calls the verifyPhoneNumber endpoint, which is responsible for sending the verification + code to a phone number specified in the request parameters. + @param request The request parameters. + @param callback The callback. + */ ++ (void)verifyPhoneNumber:(FIRVerifyPhoneNumberRequest *)request + callback:(FIRVerifyPhoneNumberResponseCallback)callback; + +/** @fn verifyClient:callback: + @brief Calls the verifyClient endpoint, which is responsible for sending the silent push + notification used for app validation to the device provided in the request parameters. + @param request The request parameters. + @param callback The callback. + */ ++ (void)verifyClient:(FIRVerifyClientRequest *)request + callback:(FIRVerifyClientResponseCallback)callback; +#endif + +@end + +/** @protocol FIRAuthBackendRPCIssuer + @brief Used to make FIRAuthBackend + */ +@protocol FIRAuthBackendRPCIssuer + +/** @fn asyncPostToURLWithRequestConfiguration:URL:body:contentType:completionHandler: + @brief Asynchronously seXnds a POST request. + @param requestConfiguration The request to be made. + @param URL The request URL. + @param body Request body. + @param contentType Content type of the body. + @param handler provided that handles POST response. Invoked asynchronously on the auth global + work queue in the future. + */ +- (void)asyncPostToURLWithRequestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + URL:(NSURL *)URL + body:(nullable NSData *)body + contentType:(NSString *)contentType + completionHandler:(FIRAuthBackendRPCIssuerCompletionHandler)handler; + +@end + +/** @protocol FIRAuthBackendImplementation + @brief Used to make FIRAuthBackend provide a layer of indirection to an actual RPC-based backend + or a mock backend. + */ +@protocol FIRAuthBackendImplementation + +/** @fn createAuthURI:callback: + @brief Calls the createAuthURI endpoint, which is responsible for creating the URI used by the + IdP to authenticate the user. + @param request The request parameters. + @param callback The callback. + */ +- (void)createAuthURI:(FIRCreateAuthURIRequest *)request + callback:(FIRCreateAuthURIResponseCallback)callback; + +/** @fn getAccountInfo:callback: + @brief Calls the getAccountInfo endpoint, which returns account info for a given account. + @param request The request parameters. + @param callback The callback. + */ +- (void)getAccountInfo:(FIRGetAccountInfoRequest *)request + callback:(FIRGetAccountInfoResponseCallback)callback; + +/** @fn getProjectConfig:callback: + @brief Calls the getProjectInfo endpoint, which returns configuration information for a given + project. + @param request The request parameters. + @param callback The callback. + */ +- (void)getProjectConfig:(FIRGetProjectConfigRequest *)request + callback:(FIRGetProjectConfigResponseCallback)callback; + +/** @fn setAccountInfo:callback: + @brief Calls the setAccountInfo endpoint, which is responsible for setting account info for a + user, for example, to sign up a new user with email and password. + @param request The request parameters. + @param callback The callback. + */ +- (void)setAccountInfo:(FIRSetAccountInfoRequest *)request + callback:(FIRSetAccountInfoResponseCallback)callback; + +/** @fn verifyAssertion:callback: + @brief Calls the verifyAssertion endpoint, which is responsible for authenticating a + user who has IDP-related credentials (an ID Token, an Access Token, etc.) + @param request The request parameters. + @param callback The callback. + */ +- (void)verifyAssertion:(FIRVerifyAssertionRequest *)request + callback:(FIRVerifyAssertionResponseCallback)callback; + +/** @fn verifyCustomToken:callback: + @brief Calls the verifyCustomToken endpoint, which is responsible for authenticating a + user who has BYOAuth credentials (a self-signed token using their BYOAuth private key.) + @param request The request parameters. + @param callback The callback. + */ +- (void)verifyCustomToken:(FIRVerifyCustomTokenRequest *)request + callback:(FIRVerifyCustomTokenResponseCallback)callback; + +/** @fn verifyPassword:callback: + @brief Calls the verifyPassword endpoint, which is responsible for authenticating a + user who has email and password credentials. + @param request The request parameters. + @param callback The callback. + */ +- (void)verifyPassword:(FIRVerifyPasswordRequest *)request + callback:(FIRVerifyPasswordResponseCallback)callback; + +/** @fn emailLinkSignin:callback: + @brief Calls the emailLinkSignin endpoint, which is responsible for authenticating a + user through passwordless sign-in. + @param request The request parameters. + @param callback The callback. + */ +- (void)emailLinkSignin:(FIREmailLinkSignInRequest *)request + callback:(FIREmailLinkSigninResponseCallback)callback; + +/** @fn secureToken:callback: + @brief Calls the token endpoint, which is responsible for performing STS token exchanges and + token refreshes. + @param request The request parameters. + @param callback The callback. + */ +- (void)secureToken:(FIRSecureTokenRequest *)request + callback:(FIRSecureTokenResponseCallback)callback; + +/** @fn getOOBConfirmationCode:callback: + @brief Calls the getOOBConfirmationCode endpoint, which is responsible for sending email change + request emails, email sign-in link emails, and password reset emails. + @param request The request parameters. + @param callback The callback. + */ +- (void)getOOBConfirmationCode:(FIRGetOOBConfirmationCodeRequest *)request + callback:(FIRGetOOBConfirmationCodeResponseCallback)callback; + +/** @fn signUpNewUser: + @brief Calls the signUpNewUser endpoint, which is responsible anonymously signing up a user + or signing in a user anonymously. + @param request The request parameters. + @param callback The callback. + */ +- (void)signUpNewUser:(FIRSignUpNewUserRequest *)request + callback:(FIRSignupNewUserCallback)callback; + +/** @fn deleteAccount: + @brief Calls the DeleteAccount endpoint, which is responsible for deleting a user. + @param request The request parameters. + @param callback The callback. + */ +- (void)deleteAccount:(FIRDeleteAccountRequest *)request callback:(FIRDeleteCallBack)callback; + +#if TARGET_OS_IOS +/** @fn sendVerificationCode:callback: + @brief Calls the sendVerificationCode endpoint, which is responsible for sending the + verification code to a phone number specified in the request parameters. + @param request The request parameters. + @param callback The callback. + */ +- (void)sendVerificationCode:(FIRSendVerificationCodeRequest *)request + callback:(FIRSendVerificationCodeResponseCallback)callback; + +/** @fn verifyPhoneNumber:callback: + @brief Calls the verifyPhoneNumber endpoint, which is responsible for sending the verification + code to a phone number specified in the request parameters. + @param request The request parameters. + @param callback The callback. + */ +- (void)verifyPhoneNumber:(FIRVerifyPhoneNumberRequest *)request + callback:(FIRVerifyPhoneNumberResponseCallback)callback; + +/** @fn verifyClient:callback: + @brief Calls the verifyClient endpoint, which is responsible for sending the silent push + notification used for app validation to the device provided in the request parameters. + @param request The request parameters. + @param callback The callback. + */ +- (void)verifyClient:(FIRVerifyClientRequest *)request + callback:(FIRVerifyClientResponseCallback)callback; +#endif + +/** @fn SignInWithGameCenter:callback: + @brief Calls the SignInWithGameCenter endpoint, which is responsible for authenticating a user + who has Game Center credentials. + @param request The request parameters. + @param callback The callback. + */ +- (void)signInWithGameCenter:(FIRSignInWithGameCenterRequest *)request + callback:(FIRSignInWithGameCenterResponseCallback)callback; + +/** @fn resetPassword:callback + @brief Calls the resetPassword endpoint, which is responsible for resetting a user's password + given an OOB code and new password. + @param request The request parameters. + @param callback The callback. + */ +- (void)resetPassword:(FIRResetPasswordRequest *)request + callback:(FIRResetPasswordCallback)callback; + +/** @fn postWithRequest:response:callback: + @brief Calls the RPC using HTTP POST. + @remarks Possible error responses: + @see FIRAuthInternalErrorCodeRPCRequestEncodingError + @see FIRAuthInternalErrorCodeJSONSerializationError + @see FIRAuthInternalErrorCodeNetworkError + @see FIRAuthInternalErrorCodeUnexpectedErrorResponse + @see FIRAuthInternalErrorCodeUnexpectedResponse + @see FIRAuthInternalErrorCodeRPCResponseDecodingError + @param request The request. + @param response The empty response to be filled. + @param callback The callback for both success and failure. +*/ +- (void)postWithRequest:(id)request + response:(id)response + callback:(void (^)(NSError *_Nullable error))callback; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend.m new file mode 100644 index 00000000..6b7c90b9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthBackend.m @@ -0,0 +1,1404 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend.h" + +#import +#import +#import + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +#if TARGET_OS_IOS +#import + +#import "FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo+Internal.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** @var kClientVersionHeader + @brief HTTP header name for the client version. + */ +static NSString *const kClientVersionHeader = @"X-Client-Version"; + +/** @var kIosBundleIdentifierHeader + @brief HTTP header name for iOS bundle ID. + */ +static NSString *const kIosBundleIdentifierHeader = @"X-Ios-Bundle-Identifier"; + +/** @var kFirebaseLocalHeader + @brief HTTP header name for the firebase locale. + */ +static NSString *const kFirebaseLocalHeader = @"X-Firebase-Locale"; + +/** @var kFirebaseAuthCoreFrameworkMarker + @brief The marker in the HTTP header that indicates the request comes from Firebase Auth Core. + */ +static NSString *const kFirebaseAuthCoreFrameworkMarker = @"FirebaseCore-iOS"; + +/** @var kJSONContentType + @brief The value of the HTTP content-type header for JSON payloads. + */ +static NSString *const kJSONContentType = @"application/json"; + +/** @var kErrorDataKey + @brief Key for error data in NSError returned by @c GTMSessionFetcher. + */ +static NSString *const kErrorDataKey = @"data"; + +/** @var kErrorKey + @brief The key for the "error" value in JSON responses from the server. + */ +static NSString *const kErrorKey = @"error"; + +/** @var kErrorsKey + @brief The key for the "errors" value in JSON responses from the server. + */ +static NSString *const kErrorsKey = @"errors"; + +/** @var kReasonKey + @brief The key for the "reason" value in JSON responses from the server. + */ +static NSString *const kReasonKey = @"reason"; + +/** @var kInvalidKeyReasonValue + @brief The value for the "reason" key indicating an invalid API Key was received by the server. + */ +static NSString *const kInvalidKeyReasonValue = @"keyInvalid"; + +/** @var kAppNotAuthorizedReasonValue + @brief The value for the "reason" key indicating the App is not authorized to use Firebase + Authentication. + */ +static NSString *const kAppNotAuthorizedReasonValue = @"ipRefererBlocked"; + +/** @var kErrorMessageKey + @brief The key for an error's "message" value in JSON responses from the server. + */ +static NSString *const kErrorMessageKey = @"message"; + +/** @var kReturnIDPCredentialErrorMessageKey + @brief The key for "errorMessage" value in JSON responses from the server, In case + returnIDPCredential of a verifyAssertion request is set to @YES. + */ +static NSString *const kReturnIDPCredentialErrorMessageKey = @"errorMessage"; + +/** @var kUserNotFoundErrorMessage + @brief This is the error message returned when the user is not found, which means the user + account has been deleted given the token was once valid. + */ +static NSString *const kUserNotFoundErrorMessage = @"USER_NOT_FOUND"; + +/** @var kUserDeletedErrorMessage + @brief This is the error message the server will respond with if the user entered an invalid + email address. + */ +static NSString *const kUserDeletedErrorMessage = @"EMAIL_NOT_FOUND"; + +/** @var kInvalidLocalIDErrorMessage + @brief This is the error message the server responds with if the user local id in the id token + does not exit. + */ +static NSString *const kInvalidLocalIDErrorMessage = @"INVALID_LOCAL_ID"; + +/** @var kUserTokenExpiredErrorMessage + @brief The error returned by the server if the token issue time is older than the account's + valid_since time. + */ +static NSString *const kUserTokenExpiredErrorMessage = @"TOKEN_EXPIRED"; + +/** @var kTooManyRequestsErrorMessage + @brief This is the error message the server will respond with if too many requests were made to + a server method. + */ +static NSString *const kTooManyRequestsErrorMessage = @"TOO_MANY_ATTEMPTS_TRY_LATER"; + +/** @var kInvalidCustomTokenErrorMessage + @brief This is the error message the server will respond with if there is a validation error + with the custom token. + */ +static NSString *const kInvalidCustomTokenErrorMessage = @"INVALID_CUSTOM_TOKEN"; + +/** @var kCustomTokenMismatch + @brief This is the error message the server will respond with if the service account and API key + belong to different projects. + */ +static NSString *const kCustomTokenMismatch = @"CREDENTIAL_MISMATCH"; + +/** @var kInvalidCredentialErrorMessage + @brief This is the error message the server responds with if the IDP token or requestUri is + invalid. + */ +static NSString *const kInvalidCredentialErrorMessage = @"INVALID_IDP_RESPONSE"; + +/** @var kUserDisabledErrorMessage + @brief The error returned by the server if the user account is diabled. + */ +static NSString *const kUserDisabledErrorMessage = @"USER_DISABLED"; + +/** @var kOperationNotAllowedErrorMessage + @brief This is the error message the server will respond with if Admin disables IDP specified by + provider. + */ +static NSString *const kOperationNotAllowedErrorMessage = @"OPERATION_NOT_ALLOWED"; + +/** @var kPasswordLoginDisabledErrorMessage + @brief This is the error message the server responds with if password login is disabled. + */ +static NSString *const kPasswordLoginDisabledErrorMessage = @"PASSWORD_LOGIN_DISABLED"; + +/** @var kEmailAlreadyInUseErrorMessage + @brief This is the error message the server responds with if the email address already exists. + */ +static NSString *const kEmailAlreadyInUseErrorMessage = @"EMAIL_EXISTS"; + +/** @var kInvalidEmailErrorMessage + @brief The error returned by the server if the email is invalid. + */ +static NSString *const kInvalidEmailErrorMessage = @"INVALID_EMAIL"; + +/** @var kInvalidIdentifierErrorMessage + @brief The error returned by the server if the identifier is invalid. + */ +static NSString *const kInvalidIdentifierErrorMessage = @"INVALID_IDENTIFIER"; + +/** @var kWrongPasswordErrorMessage + @brief This is the error message the server will respond with if the user entered a wrong + password. + */ +static NSString *const kWrongPasswordErrorMessage = @"INVALID_PASSWORD"; + +/** @var kCredentialTooOldErrorMessage + @brief This is the error message the server responds with if account change is attempted 5 + minutes after signing in. + */ +static NSString *const kCredentialTooOldErrorMessage = @"CREDENTIAL_TOO_OLD_LOGIN_AGAIN"; + +/** @var kFederatedUserIDAlreadyLinkedMessage + @brief This is the error message the server will respond with if the federated user ID has been + already linked with another account. + */ +static NSString *const kFederatedUserIDAlreadyLinkedMessage = @"FEDERATED_USER_ID_ALREADY_LINKED"; + +/** @var kInvalidUserTokenErrorMessage + @brief This is the error message the server responds with if user's saved auth credential is + invalid, and the user needs to sign in again. + */ +static NSString *const kInvalidUserTokenErrorMessage = @"INVALID_ID_TOKEN"; + +/** @var kWeakPasswordErrorMessagePrefix + @brief This is the prefix for the error message the server responds with if user's new password + to be set is too weak. + */ +static NSString *const kWeakPasswordErrorMessagePrefix = @"WEAK_PASSWORD"; + +/** @var kExpiredActionCodeErrorMessage + @brief This is the error message the server will respond with if the action code is expired. + */ +static NSString *const kExpiredActionCodeErrorMessage = @"EXPIRED_OOB_CODE"; + +/** @var kInvalidActionCodeErrorMessage + @brief This is the error message the server will respond with if the action code is invalid. + */ +static NSString *const kInvalidActionCodeErrorMessage = @"INVALID_OOB_CODE"; + +/** @var kMissingEmailErrorMessage + @brief This is the error message the server will respond with if the email address is missing + during a "send password reset email" attempt. + */ +static NSString *const kMissingEmailErrorMessage = @"MISSING_EMAIL"; + +/** @var kInvalidSenderEmailErrorMessage + @brief This is the error message the server will respond with if the sender email is invalid + during a "send password reset email" attempt. + */ +static NSString *const kInvalidSenderEmailErrorMessage = @"INVALID_SENDER"; + +/** @var kInvalidMessagePayloadErrorMessage + @brief This is the error message the server will respond with if there are invalid parameters in + the payload during a "send password reset email" attempt. + */ +static NSString *const kInvalidMessagePayloadErrorMessage = @"INVALID_MESSAGE_PAYLOAD"; + +/** @var kInvalidRecipientEmailErrorMessage + @brief This is the error message the server will respond with if the recipient email is invalid. + */ +static NSString *const kInvalidRecipientEmailErrorMessage = @"INVALID_RECIPIENT_EMAIL"; + +/** @var kMissingIosBundleIDErrorMessage + @brief This is the error message the server will respond with if iOS bundle ID is missing but + the iOS App store ID is provided. + */ +static NSString *const kMissingIosBundleIDErrorMessage = @"MISSING_IOS_BUNDLE_ID"; + +/** @var kMissingAndroidPackageNameErrorMessage + @brief This is the error message the server will respond with if Android Package Name is missing + but the flag indicating the app should be installed is set to true. + */ +static NSString *const kMissingAndroidPackageNameErrorMessage = @"MISSING_ANDROID_PACKAGE_NAME"; + +/** @var kUnauthorizedDomainErrorMessage + @brief This is the error message the server will respond with if the domain of the continue URL + specified is not whitelisted in the firebase console. + */ +static NSString *const kUnauthorizedDomainErrorMessage = @"UNAUTHORIZED_DOMAIN"; + +/** @var kInvalidProviderIDErrorMessage + @brief This is the error message the server will respond with if the provider id given for the + web operation is invalid. + */ +static NSString *const kInvalidProviderIDErrorMessage = @"INVALID_PROVIDER_ID"; + +/** @var kInvalidDynamicLinkDomainErrorMessage + @brief This is the error message the server will respond with if the dynamic link domain + provided in the request is invalid. + */ +static NSString *const kInvalidDynamicLinkDomainErrorMessage = @"INVALID_DYNAMIC_LINK_DOMAIN"; + +/** @var kInvalidContinueURIErrorMessage + @brief This is the error message the server will respond with if the continue URL provided in + the request is invalid. + */ +static NSString *const kInvalidContinueURIErrorMessage = @"INVALID_CONTINUE_URI"; + +/** @var kMissingContinueURIErrorMessage + @brief This is the error message the server will respond with if there was no continue URI + present in a request that required one. + */ +static NSString *const kMissingContinueURIErrorMessage = @"MISSING_CONTINUE_URI"; + +/** @var kInvalidPhoneNumberErrorMessage + @brief This is the error message the server will respond with if an incorrectly formatted phone + number is provided. + */ +static NSString *const kInvalidPhoneNumberErrorMessage = @"INVALID_PHONE_NUMBER"; + +/** @var kInvalidVerificationCodeErrorMessage + @brief This is the error message the server will respond with if an invalid verification code is + provided. + */ +static NSString *const kInvalidVerificationCodeErrorMessage = @"INVALID_CODE"; + +/** @var kInvalidSessionInfoErrorMessage + @brief This is the error message the server will respond with if an invalid session info + (verification ID) is provided. + */ +static NSString *const kInvalidSessionInfoErrorMessage = @"INVALID_SESSION_INFO"; + +/** @var kSessionExpiredErrorMessage + @brief This is the error message the server will respond with if the SMS code has expired before + it is used. + */ +static NSString *const kSessionExpiredErrorMessage = @"SESSION_EXPIRED"; + +/** @var kMissingOrInvalidNonceErrorMessage + @brief This is the error message the server will respond with if the nonce is missing or + invalid. + */ +static NSString *const kMissingOrInvalidNonceErrorMessage = @"MISSING_OR_INVALID_NONCE"; + +/** @var kMissingAppTokenErrorMessage + @brief This is the error message the server will respond with if the APNS token is missing in a + verifyClient request. + */ +static NSString *const kMissingAppTokenErrorMessage = @"MISSING_IOS_APP_TOKEN"; + +/** @var kMissingAppCredentialErrorMessage + @brief This is the error message the server will respond with if the app token is missing in a + sendVerificationCode request. + */ +static NSString *const kMissingAppCredentialErrorMessage = @"MISSING_APP_CREDENTIAL"; + +/** @var kInvalidAppCredentialErrorMessage + @brief This is the error message the server will respond with if the app credential in a + sendVerificationCode request is invalid. + */ +static NSString *const kInvalidAppCredentialErrorMessage = @"INVALID_APP_CREDENTIAL"; + +/** @var kQuoutaExceededErrorMessage + @brief This is the error message the server will respond with if the quota for SMS text messages + has been exceeded for the project. + */ +static NSString *const kQuoutaExceededErrorMessage = @"QUOTA_EXCEEDED"; + +/** @var kAppNotVerifiedErrorMessage + @brief This is the error message the server will respond with if Firebase could not verify the + app during a phone authentication flow. + */ +static NSString *const kAppNotVerifiedErrorMessage = @"APP_NOT_VERIFIED"; + +/** @var kMissingClientIdentifier + @brief This is the error message the server will respond with if Firebase could not verify the + app during a phone authentication flow when a real phone number is used and app verification + is disabled for testing. + */ +static NSString *const kMissingClientIdentifier = @"MISSING_CLIENT_IDENTIFIER"; + +/** @var kCaptchaCheckFailedErrorMessage + @brief This is the error message the server will respond with if the reCAPTCHA token provided is + invalid. + */ +static NSString *const kCaptchaCheckFailedErrorMessage = @"CAPTCHA_CHECK_FAILED"; + +/** @var kMissingMFAPendingCredentialErrorMessage + @brief This is the error message the server will respond with if the MFA pending credential is + missing. + */ +static NSString *const kMissingMFAPendingCredentialErrorMessage = @"MISSING_MFA_PENDING_CREDENTIAL"; + +/** @var kMissingMFAEnrollmentIDErrorMessage + @brief This is the error message the server will respond with if the MFA enrollment ID is missing. + */ +static NSString *const kMissingMFAEnrollmentIDErrorMessage = @"MISSING_MFA_ENROLLMENT_ID"; + +/** @var kInvalidMFAPendingCredentialErrorMessage + @brief This is the error message the server will respond with if the MFA pending credential is + invalid. + */ +static NSString *const kInvalidMFAPendingCredentialErrorMessage = @"INVALID_MFA_PENDING_CREDENTIAL"; + +/** @var kMFAEnrollmentNotFoundErrorMessage + @brief This is the error message the server will respond with if the MFA enrollment info is not + found. + */ +static NSString *const kMFAEnrollmentNotFoundErrorMessage = @"MFA_ENROLLMENT_NOT_FOUND"; + +/** @var kAdminOnlyOperationErrorMessage + @brief This is the error message the server will respond with if the operation is admin only. + */ +static NSString *const kAdminOnlyOperationErrorMessage = @"ADMIN_ONLY_OPERATION"; + +/** @var kUnverifiedEmailErrorMessage + @brief This is the error message the server will respond with if the email is unverified. + */ +static NSString *const kUnverifiedEmailErrorMessage = @"UNVERIFIED_EMAIL"; + +/** @var kSecondFactorExistsErrorMessage + @brief This is the error message the server will respond with if the second factor already exsists. + */ +static NSString *const kSecondFactorExistsErrorMessage = @"SECOND_FACTOR_EXISTS"; + +/** @var kSecondFactorLimitExceededErrorMessage + @brief This is the error message the server will respond with if the number of second factor + reaches the limit. + */ +static NSString *const kSecondFactorLimitExceededErrorMessage = @"SECOND_FACTOR_LIMIT_EXCEEDED"; + +/** @var kUnsupportedFirstFactorErrorMessage + @brief This is the error message the server will respond with if the first factor doesn't support + MFA. + */ +static NSString *const kUnsupportedFirstFactorErrorMessage = @"UNSUPPORTED_FIRST_FACTOR"; + +/** @var kEmailChangeNeedsVerificationErrorMessage + @brief This is the error message the server will respond with if changing an unverified email. + */ +static NSString *const kEmailChangeNeedsVerificationErrorMessage = + @"EMAIL_CHANGE_NEEDS_VERIFICATION"; + +/** @var kInvalidPendingToken + @brief Generic IDP error codes. + */ +static NSString *const kInvalidPendingToken = @"INVALID_PENDING_TOKEN"; + +/** @var gBackendImplementation + @brief The singleton FIRAuthBackendImplementation instance to use. + */ +static id gBackendImplementation; + +/** @class FIRAuthBackendRPCImplementation + @brief The default RPC-based backend implementation. + */ +@interface FIRAuthBackendRPCImplementation : NSObject + +/** @property RPCIssuer + @brief An instance of FIRAuthBackendRPCIssuer for making RPC requests. Allows the RPC + requests/responses to be easily faked. + */ +@property(nonatomic, strong) id RPCIssuer; + +@end + +@implementation FIRAuthBackend + ++ (id)implementation { + if (!gBackendImplementation) { + gBackendImplementation = [[FIRAuthBackendRPCImplementation alloc] init]; + } + return gBackendImplementation; +} + ++ (void)setBackendImplementation:(id)backendImplementation { + gBackendImplementation = backendImplementation; +} + ++ (void)setDefaultBackendImplementationWithRPCIssuer: + (nullable id)RPCIssuer { + FIRAuthBackendRPCImplementation *defaultImplementation = + [[FIRAuthBackendRPCImplementation alloc] init]; + if (RPCIssuer) { + defaultImplementation.RPCIssuer = RPCIssuer; + } + gBackendImplementation = defaultImplementation; +} + ++ (void)createAuthURI:(FIRCreateAuthURIRequest *)request + callback:(FIRCreateAuthURIResponseCallback)callback { + [[self implementation] createAuthURI:request callback:callback]; +} + ++ (void)getAccountInfo:(FIRGetAccountInfoRequest *)request + callback:(FIRGetAccountInfoResponseCallback)callback { + [[self implementation] getAccountInfo:request callback:callback]; +} + ++ (void)getProjectConfig:(FIRGetProjectConfigRequest *)request + callback:(FIRGetProjectConfigResponseCallback)callback { + [[self implementation] getProjectConfig:request callback:callback]; +} + ++ (void)setAccountInfo:(FIRSetAccountInfoRequest *)request + callback:(FIRSetAccountInfoResponseCallback)callback { + [[self implementation] setAccountInfo:request callback:callback]; +} + ++ (void)verifyAssertion:(FIRVerifyAssertionRequest *)request + callback:(FIRVerifyAssertionResponseCallback)callback { + [[self implementation] verifyAssertion:request callback:callback]; +} + ++ (void)verifyCustomToken:(FIRVerifyCustomTokenRequest *)request + callback:(FIRVerifyCustomTokenResponseCallback)callback { + [[self implementation] verifyCustomToken:request callback:callback]; +} + ++ (void)verifyPassword:(FIRVerifyPasswordRequest *)request + callback:(FIRVerifyPasswordResponseCallback)callback { + [[self implementation] verifyPassword:request callback:callback]; +} + ++ (void)emailLinkSignin:(FIREmailLinkSignInRequest *)request + callback:(FIREmailLinkSigninResponseCallback)callback { + [[self implementation] emailLinkSignin:request callback:callback]; +} + ++ (void)secureToken:(FIRSecureTokenRequest *)request + callback:(FIRSecureTokenResponseCallback)callback { + [[self implementation] secureToken:request callback:callback]; +} + ++ (void)getOOBConfirmationCode:(FIRGetOOBConfirmationCodeRequest *)request + callback:(FIRGetOOBConfirmationCodeResponseCallback)callback { + [[self implementation] getOOBConfirmationCode:request callback:callback]; +} + ++ (void)signUpNewUser:(FIRSignUpNewUserRequest *)request + callback:(FIRSignupNewUserCallback)callback { + [[self implementation] signUpNewUser:request callback:callback]; +} + ++ (void)deleteAccount:(FIRDeleteAccountRequest *)request callback:(FIRDeleteCallBack)callback { + [[self implementation] deleteAccount:request callback:callback]; +} + ++ (void)signInWithGameCenter:(FIRSignInWithGameCenterRequest *)request + callback:(FIRSignInWithGameCenterResponseCallback)callback { + [[self implementation] signInWithGameCenter:request callback:callback]; +} + +#if TARGET_OS_IOS ++ (void)sendVerificationCode:(FIRSendVerificationCodeRequest *)request + callback:(FIRSendVerificationCodeResponseCallback)callback { + [[self implementation] sendVerificationCode:request callback:callback]; +} + ++ (void)verifyPhoneNumber:(FIRVerifyPhoneNumberRequest *)request + callback:(FIRVerifyPhoneNumberResponseCallback)callback { + [[self implementation] verifyPhoneNumber:request callback:callback]; +} + ++ (void)verifyClient:(id)request callback:(FIRVerifyClientResponseCallback)callback { + [[self implementation] verifyClient:request callback:callback]; +} +#endif + ++ (void)resetPassword:(FIRResetPasswordRequest *)request + callback:(FIRResetPasswordCallback)callback { + [[self implementation] resetPassword:request callback:callback]; +} + ++ (NSString *)authUserAgent { + return [NSString stringWithFormat:@"FirebaseAuth.iOS/%s %@", FirebaseAuthVersionStr, + GTMFetcherStandardUserAgentString(nil)]; +} + +@end + +@interface FIRAuthBackendRPCIssuerImplementation : NSObject +@end + +@implementation FIRAuthBackendRPCIssuerImplementation { + /** @var The session fetcher service. + */ + GTMSessionFetcherService *_fetcherService; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _fetcherService = [[GTMSessionFetcherService alloc] init]; + _fetcherService.userAgent = [FIRAuthBackend authUserAgent]; + _fetcherService.callbackQueue = FIRAuthGlobalWorkQueue(); + + // Avoid reusing the session to prevent + // https://github.com/firebase/firebase-ios-sdk/issues/1261 + _fetcherService.reuseSession = NO; + } + return self; +} + +- (void)asyncPostToURLWithRequestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + URL:(NSURL *)URL + body:(nullable NSData *)body + contentType:(NSString *)contentType + completionHandler: + (void (^)(NSData *_Nullable, NSError *_Nullable))handler { + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; + [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; + NSString *additionalFrameworkMarker = + requestConfiguration.additionalFrameworkMarker ?: kFirebaseAuthCoreFrameworkMarker; + NSString *clientVersion = [NSString + stringWithFormat:@"iOS/FirebaseSDK/%s/%@", FirebaseAuthVersionStr, additionalFrameworkMarker]; + [request setValue:clientVersion forHTTPHeaderField:kClientVersionHeader]; + NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier]; + [request setValue:bundleID forHTTPHeaderField:kIosBundleIdentifierHeader]; + + NSArray *preferredLocalizations = [NSBundle mainBundle].preferredLocalizations; + if (preferredLocalizations.count) { + NSString *acceptLanguage = preferredLocalizations.firstObject; + [request setValue:acceptLanguage forHTTPHeaderField:@"Accept-Language"]; + } + NSString *languageCode = requestConfiguration.languageCode; + if (languageCode.length) { + [request setValue:languageCode forHTTPHeaderField:kFirebaseLocalHeader]; + } + GTMSessionFetcher *fetcher = [_fetcherService fetcherWithRequest:request]; + fetcher.bodyData = body; + [fetcher beginFetchWithCompletionHandler:handler]; +} + +@end + +@implementation FIRAuthBackendRPCImplementation + +- (instancetype)init { + self = [super init]; + if (self) { + _RPCIssuer = [[FIRAuthBackendRPCIssuerImplementation alloc] init]; + } + return self; +} + +- (void)createAuthURI:(FIRCreateAuthURIRequest *)request + callback:(FIRCreateAuthURIResponseCallback)callback { + FIRCreateAuthURIResponse *response = [[FIRCreateAuthURIResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)getAccountInfo:(FIRGetAccountInfoRequest *)request + callback:(FIRGetAccountInfoResponseCallback)callback { + FIRGetAccountInfoResponse *response = [[FIRGetAccountInfoResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)getProjectConfig:(FIRGetProjectConfigRequest *)request + callback:(FIRGetProjectConfigResponseCallback)callback { + FIRGetProjectConfigResponse *response = [[FIRGetProjectConfigResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)setAccountInfo:(FIRSetAccountInfoRequest *)request + callback:(FIRSetAccountInfoResponseCallback)callback { + FIRSetAccountInfoResponse *response = [[FIRSetAccountInfoResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)verifyAssertion:(FIRVerifyAssertionRequest *)request + callback:(FIRVerifyAssertionResponseCallback)callback { + FIRVerifyAssertionResponse *response = [[FIRVerifyAssertionResponse alloc] init]; + [self + postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + if (!response.IDToken && response.MFAInfo) { +#if TARGET_OS_IOS + NSMutableArray *multiFactorInfo = [NSMutableArray array]; + for (FIRAuthProtoMFAEnrollment *MFAEnrollment in response.MFAInfo) { + FIRPhoneMultiFactorInfo *info = + [[FIRPhoneMultiFactorInfo alloc] initWithProto:MFAEnrollment]; + [multiFactorInfo addObject:info]; + } + NSError *multiFactorRequiredError = [FIRAuthErrorUtils + secondFactorRequiredErrorWithPendingCredential:response.MFAPendingCredential + hints:multiFactorInfo]; + callback(nil, multiFactorRequiredError); +#endif + } else { + callback(response, nil); + } + } + }]; +} + +- (void)verifyCustomToken:(FIRVerifyCustomTokenRequest *)request + callback:(FIRVerifyCustomTokenResponseCallback)callback { + FIRVerifyCustomTokenResponse *response = [[FIRVerifyCustomTokenResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)verifyPassword:(FIRVerifyPasswordRequest *)request + callback:(FIRVerifyPasswordResponseCallback)callback { + FIRVerifyPasswordResponse *response = [[FIRVerifyPasswordResponse alloc] init]; + [self + postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + if (!response.IDToken && response.MFAInfo) { +#if TARGET_OS_IOS + NSMutableArray *multiFactorInfo = [NSMutableArray array]; + for (FIRAuthProtoMFAEnrollment *MFAEnrollment in response.MFAInfo) { + FIRPhoneMultiFactorInfo *info = + [[FIRPhoneMultiFactorInfo alloc] initWithProto:MFAEnrollment]; + [multiFactorInfo addObject:info]; + } + NSError *multiFactorRequiredError = [FIRAuthErrorUtils + secondFactorRequiredErrorWithPendingCredential:response.MFAPendingCredential + hints:multiFactorInfo]; + callback(nil, multiFactorRequiredError); +#endif + } else { + callback(response, nil); + } + } + }]; +} + +- (void)emailLinkSignin:(FIREmailLinkSignInRequest *)request + callback:(FIREmailLinkSigninResponseCallback)callback { + FIREmailLinkSignInResponse *response = [[FIREmailLinkSignInResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)secureToken:(FIRSecureTokenRequest *)request + callback:(FIRSecureTokenResponseCallback)callback { + FIRSecureTokenResponse *response = [[FIRSecureTokenResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)getOOBConfirmationCode:(FIRGetOOBConfirmationCodeRequest *)request + callback:(FIRGetOOBConfirmationCodeResponseCallback)callback { + FIRGetOOBConfirmationCodeResponse *response = [[FIRGetOOBConfirmationCodeResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)signUpNewUser:(FIRSignUpNewUserRequest *)request + callback:(FIRSignupNewUserCallback)callback { + FIRSignUpNewUserResponse *response = [[FIRSignUpNewUserResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, nil); + } + }]; +} + +- (void)deleteAccount:(FIRDeleteAccountRequest *)request callback:(FIRDeleteCallBack)callback { + FIRDeleteAccountResponse *response = [[FIRDeleteAccountResponse alloc] init]; + [self postWithRequest:request response:response callback:callback]; +} + +#if TARGET_OS_IOS +- (void)sendVerificationCode:(FIRSendVerificationCodeRequest *)request + callback:(FIRSendVerificationCodeResponseCallback)callback { + FIRSendVerificationCodeResponse *response = [[FIRSendVerificationCodeResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + } else { + callback(response, error); + } + }]; +} + +- (void)verifyPhoneNumber:(FIRVerifyPhoneNumberRequest *)request + callback:(FIRVerifyPhoneNumberResponseCallback)callback { + FIRVerifyPhoneNumberResponse *response = [[FIRVerifyPhoneNumberResponse alloc] init]; + [self + postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + return; + } + // Check whether or not the successful response is actually the special case phone + // auth flow that returns a temporary proof and phone number. + if (response.phoneNumber.length && response.temporaryProof.length) { + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthCredential alloc] initWithTemporaryProof:response.temporaryProof + phoneNumber:response.phoneNumber + providerID:FIRPhoneAuthProviderID]; + callback(nil, [FIRAuthErrorUtils credentialAlreadyInUseErrorWithMessage:nil + credential:credential + email:nil]); + return; + } + callback(response, nil); + }]; +} + +- (void)verifyClient:(id)request callback:(FIRVerifyClientResponseCallback)callback { + FIRVerifyClientResponse *response = [[FIRVerifyClientResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + return; + } + callback(response, nil); + }]; +} +#endif + +- (void)resetPassword:(FIRResetPasswordRequest *)request + callback:(FIRResetPasswordCallback)callback { + FIRResetPasswordResponse *response = [[FIRResetPasswordResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + callback(nil, error); + return; + } + callback(response, nil); + }]; +} + +- (void)signInWithGameCenter:(FIRSignInWithGameCenterRequest *)request + callback:(FIRSignInWithGameCenterResponseCallback)callback { + FIRSignInWithGameCenterResponse *response = [[FIRSignInWithGameCenterResponse alloc] init]; + [self postWithRequest:request + response:response + callback:^(NSError *error) { + if (error) { + if (callback) { + callback(nil, error); + } + } else { + if (callback) { + callback(response, nil); + } + } + }]; +} + +#pragma mark - Generic RPC handling methods + +/** @fn postWithRequest:response:callback: + @brief Calls the RPC using HTTP POST. + @remarks Possible error responses: + @see FIRAuthInternalErrorCodeRPCRequestEncodingError + @see FIRAuthInternalErrorCodeJSONSerializationError + @see FIRAuthInternalErrorCodeNetworkError + @see FIRAuthInternalErrorCodeUnexpectedErrorResponse + @see FIRAuthInternalErrorCodeUnexpectedResponse + @see FIRAuthInternalErrorCodeRPCResponseDecodingError + @param request The request. + @param response The empty response to be filled. + @param callback The callback for both success and failure. + */ +- (void)postWithRequest:(id)request + response:(id)response + callback:(void (^)(NSError *_Nullable error))callback { + NSError *error; + NSData *bodyData; + if ([request containsPostBody]) { + id postBody = [request unencodedHTTPRequestBodyWithError:&error]; + if (!postBody) { + callback([FIRAuthErrorUtils RPCRequestEncodingErrorWithUnderlyingError:error]); + return; + } + + NSJSONWritingOptions JSONWritingOptions = 0; +#if DEBUG + JSONWritingOptions |= NSJSONWritingPrettyPrinted; +#endif + + if ([NSJSONSerialization isValidJSONObject:postBody]) { + bodyData = [NSJSONSerialization dataWithJSONObject:postBody + options:JSONWritingOptions + error:&error]; + if (!bodyData) { + // This is an untested case. This happens exclusively when there is an error in the + // framework implementation of dataWithJSONObject:options:error:. This shouldn't normally + // occur as isValidJSONObject: should return NO in any case we should encounter an error. + error = [FIRAuthErrorUtils JSONSerializationErrorWithUnderlyingError:error]; + } + } else { + error = [FIRAuthErrorUtils JSONSerializationErrorForUnencodableType]; + } + if (!bodyData) { + callback(error); + return; + } + } + + [_RPCIssuer + asyncPostToURLWithRequestConfiguration:[request requestConfiguration] + URL:[request requestURL] + body:bodyData + contentType:kJSONContentType + completionHandler:^(NSData *data, NSError *error) { + // If there is an error with no body data at all, then this must be a + // network error. + if (error && !data) { + callback([FIRAuthErrorUtils networkErrorWithUnderlyingError:error]); + return; + } + + // Try to decode the HTTP response data which may contain either a + // successful response or error message. + NSError *jsonError; + NSDictionary *dictionary = + [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingMutableLeaves + error:&jsonError]; + if (!dictionary) { + if (error) { + // We have an error, but we couldn't decode the body, so we have no + // additional information other than the raw response and the + // original NSError (the jsonError is infered by the error code + // (FIRAuthErrorCodeUnexpectedHTTPResponse, and is irrelevant.) + callback([FIRAuthErrorUtils + unexpectedErrorResponseWithData:data + underlyingError:error]); + } else { + // This is supposed to be a "successful" response, but we couldn't + // deserialize the body. + callback([FIRAuthErrorUtils unexpectedResponseWithData:data + underlyingError:jsonError]); + } + return; + } + if (![dictionary isKindOfClass:[NSDictionary class]]) { + if (error) { + callback([FIRAuthErrorUtils + unexpectedErrorResponseWithDeserializedResponse:dictionary]); + } else { + callback([FIRAuthErrorUtils + unexpectedResponseWithDeserializedResponse:dictionary]); + } + return; + } + + // At this point we either have an error with successfully decoded + // details in the body, or we have a response which must pass further + // validation before we know it's truly successful. We deal with the + // case where we have an error with successfully decoded error details + // first: + if (error) { + NSDictionary *errorDictionary = dictionary[kErrorKey]; + if ([errorDictionary isKindOfClass:[NSDictionary class]]) { + id errorMessage = errorDictionary[kErrorMessageKey]; + if ([errorMessage isKindOfClass:[NSString class]]) { + NSString *errorMessageString = (NSString *)errorMessage; + + // Contruct client error. + NSError *clientError = [[self class] + clientErrorWithServerErrorMessage:errorMessageString + errorDictionary:errorDictionary + response:response]; + if (clientError) { + callback(clientError); + return; + } + } + // Not a message we know, return the message directly. + if (errorMessage) { + NSError *unexpecterErrorResponse = [FIRAuthErrorUtils + unexpectedErrorResponseWithDeserializedResponse: + errorDictionary]; + callback(unexpecterErrorResponse); + return; + } + } + // No error message at all, return the decoded response. + callback([FIRAuthErrorUtils + unexpectedErrorResponseWithDeserializedResponse:dictionary]); + return; + } + + // Finally, we try to populate the response object with the JSON + // values. + if (![response setWithDictionary:dictionary error:&error]) { + callback([FIRAuthErrorUtils + RPCResponseDecodingErrorWithDeserializedResponse:dictionary + underlyingError:error]); + return; + } + // In case returnIDPCredential of a verifyAssertion request is set to + // @YES, the server may return a 200 with a response that may contain a + // server error. + if ([request isKindOfClass:[FIRVerifyAssertionRequest class]]) { + FIRVerifyAssertionRequest *verifyAssertionRequest = + (FIRVerifyAssertionRequest *)request; + if (verifyAssertionRequest.returnIDPCredential) { + NSString *errorMessage = + dictionary[kReturnIDPCredentialErrorMessageKey]; + if ([errorMessage isKindOfClass:[NSString class]]) { + NSString *errorString = (NSString *)errorMessage; + NSError *clientError = + [[self class] clientErrorWithServerErrorMessage:errorString + errorDictionary:@{} + response:response]; + if (clientError) { + callback(clientError); + return; + } + } + } + } + // Success! The response object originally passed in can be used by the + // caller. + callback(nil); + }]; +} + +/** @fn clientErrorWithServerErrorMessage:errorDictionary: + @brief Translates known server errors to client errors. + @param serverErrorMessage The error message from the server. + @param errorDictionary The error part of the response from the server. + @param response The response from the server RPC. + @return A client error, if any. + */ ++ (nullable NSError *)clientErrorWithServerErrorMessage:(NSString *)serverErrorMessage + errorDictionary:(NSDictionary *)errorDictionary + response:(id)response { + NSString *shortErrorMessage = serverErrorMessage; + NSString *serverDetailErrorMessage; + NSRange colonRange = [serverErrorMessage rangeOfString:@":"]; + if (colonRange.location != NSNotFound) { + shortErrorMessage = [serverErrorMessage substringToIndex:colonRange.location]; + shortErrorMessage = + [shortErrorMessage stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + serverDetailErrorMessage = [serverErrorMessage substringFromIndex:colonRange.location + 1]; + serverDetailErrorMessage = [serverDetailErrorMessage + stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + } + + // Delegate the responsibility for constructing the client error to the response object, + // if possible. + SEL clientErrorWithServerErrorMessageSelector = @selector(clientErrorWithShortErrorMessage: + detailErrorMessage:); + if ([response respondsToSelector:clientErrorWithServerErrorMessageSelector]) { + NSError *error = [response clientErrorWithShortErrorMessage:shortErrorMessage + detailErrorMessage:serverDetailErrorMessage]; + if (error) { + return error; + } + } + + if ([shortErrorMessage isEqualToString:kUserNotFoundErrorMessage]) { + return [FIRAuthErrorUtils userNotFoundErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kUserDeletedErrorMessage]) { + return [FIRAuthErrorUtils userNotFoundErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidLocalIDErrorMessage]) { + // This case shouldn't be necessary but it is for now: b/27908364 . + return [FIRAuthErrorUtils userNotFoundErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kUserTokenExpiredErrorMessage]) { + return [FIRAuthErrorUtils userTokenExpiredErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kTooManyRequestsErrorMessage]) { + return [FIRAuthErrorUtils tooManyRequestsErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidCustomTokenErrorMessage]) { + return [FIRAuthErrorUtils invalidCustomTokenErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kCustomTokenMismatch]) { + return [FIRAuthErrorUtils customTokenMistmatchErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidCredentialErrorMessage] || + [shortErrorMessage isEqualToString:kInvalidPendingToken]) { + return [FIRAuthErrorUtils invalidCredentialErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kUserDisabledErrorMessage]) { + return [FIRAuthErrorUtils userDisabledErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kOperationNotAllowedErrorMessage]) { + return [FIRAuthErrorUtils operationNotAllowedErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kPasswordLoginDisabledErrorMessage]) { + return [FIRAuthErrorUtils operationNotAllowedErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kEmailAlreadyInUseErrorMessage]) { + return [FIRAuthErrorUtils emailAlreadyInUseErrorWithEmail:nil]; + } + + if ([shortErrorMessage isEqualToString:kInvalidEmailErrorMessage]) { + return [FIRAuthErrorUtils invalidEmailErrorWithMessage:serverDetailErrorMessage]; + } + + // "INVALID_IDENTIFIER" can be returned by createAuthURI RPC. Considering email addresses are + // currently the only identifiers, we surface the FIRAuthErrorCodeInvalidEmail error code in this + // case. + if ([shortErrorMessage isEqualToString:kInvalidIdentifierErrorMessage]) { + return [FIRAuthErrorUtils invalidEmailErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kWrongPasswordErrorMessage]) { + return [FIRAuthErrorUtils wrongPasswordErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kCredentialTooOldErrorMessage]) { + return [FIRAuthErrorUtils requiresRecentLoginErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidUserTokenErrorMessage]) { + return [FIRAuthErrorUtils invalidUserTokenErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kFederatedUserIDAlreadyLinkedMessage]) { + FIROAuthCredential *credential; + NSString *email; + if ([response isKindOfClass:[FIRVerifyAssertionResponse class]]) { + FIRVerifyAssertionResponse *verifyAssertion = (FIRVerifyAssertionResponse *)response; + credential = [[FIROAuthCredential alloc] initWithVerifyAssertionResponse:verifyAssertion]; + email = verifyAssertion.email; + } + return [FIRAuthErrorUtils credentialAlreadyInUseErrorWithMessage:serverDetailErrorMessage + credential:credential + email:email]; + } + + if ([shortErrorMessage isEqualToString:kWeakPasswordErrorMessagePrefix]) { + return [FIRAuthErrorUtils weakPasswordErrorWithServerResponseReason:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kExpiredActionCodeErrorMessage]) { + return [FIRAuthErrorUtils expiredActionCodeErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidActionCodeErrorMessage]) { + return [FIRAuthErrorUtils invalidActionCodeErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingEmailErrorMessage]) { + return [FIRAuthErrorUtils missingEmailErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidSenderEmailErrorMessage]) { + return [FIRAuthErrorUtils invalidSenderErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidMessagePayloadErrorMessage]) { + return [FIRAuthErrorUtils invalidMessagePayloadErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidRecipientEmailErrorMessage]) { + return [FIRAuthErrorUtils invalidRecipientEmailErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingIosBundleIDErrorMessage]) { + return [FIRAuthErrorUtils missingIosBundleIDErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingAndroidPackageNameErrorMessage]) { + return [FIRAuthErrorUtils missingAndroidPackageNameErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kUnauthorizedDomainErrorMessage]) { + return [FIRAuthErrorUtils unauthorizedDomainErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidContinueURIErrorMessage]) { + return [FIRAuthErrorUtils invalidContinueURIErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidProviderIDErrorMessage]) { + return [FIRAuthErrorUtils invalidProviderIDErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidDynamicLinkDomainErrorMessage]) { + return [FIRAuthErrorUtils invalidDynamicLinkDomainErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingContinueURIErrorMessage]) { + return [FIRAuthErrorUtils missingContinueURIErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidPhoneNumberErrorMessage]) { + return [FIRAuthErrorUtils invalidPhoneNumberErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidSessionInfoErrorMessage]) { + return [FIRAuthErrorUtils invalidVerificationIDErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidVerificationCodeErrorMessage]) { + return [FIRAuthErrorUtils invalidVerificationCodeErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kSessionExpiredErrorMessage]) { + return [FIRAuthErrorUtils sessionExpiredErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingAppTokenErrorMessage]) { + return [FIRAuthErrorUtils missingAppTokenErrorWithUnderlyingError:nil]; + } + + if ([shortErrorMessage isEqualToString:kMissingAppCredentialErrorMessage]) { + return [FIRAuthErrorUtils missingAppCredentialWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidAppCredentialErrorMessage]) { + return [FIRAuthErrorUtils invalidAppCredentialWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kQuoutaExceededErrorMessage]) { + return [FIRAuthErrorUtils quotaExceededErrorWithMessage:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kAppNotVerifiedErrorMessage]) { + return [FIRAuthErrorUtils appNotVerifiedErrorWithMessage:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingClientIdentifier]) { + return [FIRAuthErrorUtils missingClientIdentifierErrorWithMessage:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kCaptchaCheckFailedErrorMessage]) { + return [FIRAuthErrorUtils captchaCheckFailedErrorWithMessage:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingOrInvalidNonceErrorMessage]) { + return [FIRAuthErrorUtils missingOrInvalidNonceErrorWithMessage:serverDetailErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingMFAPendingCredentialErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeMissingMultiFactorSession + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMissingMFAEnrollmentIDErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeMissingMultiFactorInfo + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kInvalidMFAPendingCredentialErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeInvalidMultiFactorSession + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kMFAEnrollmentNotFoundErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeMultiFactorInfoNotFound + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kAdminOnlyOperationErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeAdminRestrictedOperation + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kUnverifiedEmailErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeUnverifiedEmail + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kSecondFactorExistsErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeSecondFactorAlreadyEnrolled + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kSecondFactorLimitExceededErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeMaximumSecondFactorCountExceeded + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kUnsupportedFirstFactorErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeUnsupportedFirstFactor + message:serverErrorMessage]; + } + + if ([shortErrorMessage isEqualToString:kEmailChangeNeedsVerificationErrorMessage]) { + return [FIRAuthErrorUtils errorWithCode:FIRAuthInternalErrorCodeEmailChangeNeedsVerification + message:serverErrorMessage]; + } + + // In this case we handle an error that might be specified in the underlying errors dictionary, + // the error message in determined based on the @c reason key in the dictionary. + if (errorDictionary[kErrorsKey]) { + // Check for underlying error with reason = keyInvalid; + id underlyingErrors = errorDictionary[kErrorsKey]; + if ([underlyingErrors isKindOfClass:[NSArray class]]) { + NSArray *underlyingErrorsArray = (NSArray *)underlyingErrors; + for (id underlyingError in underlyingErrorsArray) { + if ([underlyingError isKindOfClass:[NSDictionary class]]) { + NSDictionary *underlyingErrorDictionary = (NSDictionary *)underlyingError; + NSString *reason = underlyingErrorDictionary[kReasonKey]; + if ([reason hasPrefix:kInvalidKeyReasonValue]) { + return [FIRAuthErrorUtils invalidAPIKeyError]; + } + if ([reason isEqualToString:kAppNotAuthorizedReasonValue]) { + return [FIRAuthErrorUtils appNotAuthorizedError]; + } + } + } + } + } + return nil; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h new file mode 100644 index 00000000..9ca4f449 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h @@ -0,0 +1,57 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthRequestConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/** @protocol FIRAuthRPCRequest + @brief The generic interface for an RPC request needed by @c FIRAuthBackend. + */ +@protocol FIRAuthRPCRequest + +/** @fn requestURL + @brief Gets the request's full URL. + */ +- (NSURL *)requestURL; + +@optional + +/** @fn containsPostBody + @brief Returns whether the request contains a post body or not. Requests without a post body + are get requests. + @remarks The default implementation returns YES. + */ +- (BOOL)containsPostBody; + +/** @fn UnencodedHTTPRequestBodyWithError: + @brief Creates unencoded HTTP body representing the request. + @param error An out field for an error which occurred constructing the request. + @return The HTTP body data representing the request before any encoding, or nil for error. + */ +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error; + +/** @fn requestConfiguration + @brief Obtains the request configurations if available. + @return Returns the request configurations. + */ +- (FIRAuthRequestConfiguration *)requestConfiguration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h new file mode 100644 index 00000000..0fe981a6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h @@ -0,0 +1,48 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @protocol FIRAuthRPCResponse + @brief The generic interface for an RPC response needed by @c FIRAuthBackend. + */ +@protocol FIRAuthRPCResponse + +/** @fn setFieldsWithDictionary:error: + @brief Sets the response instance from the decoded JSON response. + @param dictionary The dictionary decoded from HTTP JSON response. + @param error An out field for an error which occurred constructing the request. + @return Whether the operation was successful or not. + */ +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error; + +@optional + +/** @fn clientErrorWithshortErrorMessage:detailErrorMessage + @brief This optional method allows response classes to create client errors given a short error + message and a detail error message from the server. + @param shortErrorMessage The short error message from the server. + @param detailErrorMessage The detailed error message from the server. + @return A client error, if any. + */ +- (nullable NSError *)clientErrorWithShortErrorMessage:(NSString *)shortErrorMessage + detailErrorMessage:(nullable NSString *)detailErrorMessage; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h new file mode 100644 index 00000000..575ee951 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h @@ -0,0 +1,52 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthRequestConfiguration + @brief Defines configurations to be added to a request to Firebase Auth's backend. + */ +@interface FIRAuthRequestConfiguration : NSObject + +/** @property APIKey + @brief The Firebase Auth API key used in the request. + */ +@property(nonatomic, copy, readonly) NSString *APIKey; + +/** @property LanguageCode + @brief The language code used in the request. + */ +@property(nonatomic, copy, nullable) NSString *languageCode; + +/** @property additionalFrameworkMarker + @brief Additional framework marker that will be added as part of the header of every request. + */ +@property(nonatomic, copy, nullable) NSString *additionalFrameworkMarker; + +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithRequestClass:APIKey:authLanguage: + @brief Designated initializer. + @param APIKey The API key to be used in the request. + */ +- (nullable instancetype)initWithAPIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER; +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.m new file mode 100644 index 00000000..40996e57 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.m @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h" + +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthRequestConfiguration + +- (nullable instancetype)initWithAPIKey:(NSString *)APIKey { + self = [super init]; + if (self) { + _APIKey = [APIKey copy]; + } + return self; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h new file mode 100644 index 00000000..f1e55093 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h @@ -0,0 +1,71 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h" + +@class FIRAuthRequestConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRIdentityToolkitRequest + @brief Represents a request to an identity toolkit endpoint. + */ +@interface FIRIdentityToolkitRequest : NSObject + +/** @property endpoint + @brief Gets the RPC's endpoint. + */ +@property(nonatomic, copy, readonly) NSString *endpoint; + +/** @property APIKey + @brief Gets the client's API key used for the request. + */ +@property(nonatomic, copy, readonly) NSString *APIKey; + +/** @fn init + @brief Please use initWithEndpoint:APIKey: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithEndpoint:APIKey: + @brief Designated initializer. + @param endpoint The endpoint name. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + useIdentityPlatform:(BOOL)useIdentityPlatform + useStaging:(BOOL)useStaging; + +/** @fn requestURL + @brief Gets the request's full URL. + */ +- (NSURL *)requestURL; + +/** @fn requestConfiguration + @brief Gets the request's configuration. + */ +- (FIRAuthRequestConfiguration *)requestConfiguration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.m new file mode 100644 index 00000000..6b7e420f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.m @@ -0,0 +1,110 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +static NSString *const kFirebaseAuthAPIURLFormat = + @"https://%@/identitytoolkit/v3/relyingparty/%@?key=%@"; +static NSString *const kIdentityPlatformAPIURLFormat = @"https://%@/v2/%@?key=%@"; + +static NSString *gAPIHost = @"www.googleapis.com"; + +static NSString *kFirebaseAuthAPIHost = @"www.googleapis.com"; +static NSString *kIdentityPlatformAPIHost = @"identitytoolkit.googleapis.com"; + +static NSString *kFirebaseAuthStagingAPIHost = @"staging-www.sandbox.googleapis.com"; +static NSString *kIdentityPlatformStagingAPIHost = + @"staging-identitytoolkit.sandbox.googleapis.com"; + +@implementation FIRIdentityToolkitRequest { + FIRAuthRequestConfiguration *_requestConfiguration; + + BOOL _useIdentityPlatform; + + BOOL _useStaging; +} + +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super init]; + if (self) { + _APIKey = [requestConfiguration.APIKey copy]; + _endpoint = [endpoint copy]; + _requestConfiguration = requestConfiguration; + _useIdentityPlatform = NO; + _useStaging = NO; + } + return self; +} + +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + useIdentityPlatform:(BOOL)useIdentityPlatform + useStaging:(BOOL)useStaging { + self = [self initWithEndpoint:endpoint requestConfiguration:requestConfiguration]; + if (self) { + _useIdentityPlatform = useIdentityPlatform; + _useStaging = useStaging; + } + return self; +} + +- (BOOL)containsPostBody { + return YES; +} + +- (NSURL *)requestURL { + NSString *apiURLFormat; + NSString *apiHost; + if (_useIdentityPlatform) { + apiURLFormat = kIdentityPlatformAPIURLFormat; + if (_useStaging) { + apiHost = kIdentityPlatformStagingAPIHost; + } else { + apiHost = kIdentityPlatformAPIHost; + } + } else { + apiURLFormat = kFirebaseAuthAPIURLFormat; + if (_useStaging) { + apiHost = kFirebaseAuthStagingAPIHost; + } else { + apiHost = kFirebaseAuthAPIHost; + } + } + NSString *URLString = [NSString stringWithFormat:apiURLFormat, apiHost, _endpoint, _APIKey]; + NSURL *URL = [NSURL URLWithString:URLString]; + return URL; +} + +- (FIRAuthRequestConfiguration *)requestConfiguration { + return _requestConfiguration; +} + +#pragma mark - Internal API for development + ++ (NSString *)host { + return gAPIHost; +} + ++ (void)setHost:(NSString *)host { + gAPIHost = host; +} + +NS_ASSUME_NONNULL_END + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.h new file mode 100644 index 00000000..633ffa97 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.h @@ -0,0 +1,88 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRCreateAuthURIRequest + @brief Represents the parameters for the createAuthUri endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/createAuthUri + */ +@interface FIRCreateAuthURIRequest : FIRIdentityToolkitRequest + +/** @property identifier + @brief The email or federated ID of the user. + */ +@property(nonatomic, copy) NSString *identifier; + +/** @property continueURI + @brief The URI to which the IDP redirects the user after the federated login flow. + */ +@property(nonatomic, copy) NSString *continueURI; + +/** @property openIDRealm + @brief Optional realm for OpenID protocol. The sub string "scheme://domain:port" of the param + "continueUri" is used if this is not set. + */ +@property(nonatomic, copy, nullable) NSString *openIDRealm; + +/** @property providerID + @brief The IdP ID. For white listed IdPs it's a short domain name e.g. google.com, aol.com, + live.net and yahoo.com. For other OpenID IdPs it's the OP identifier. + */ +@property(nonatomic, copy, nullable) NSString *providerID; + +/** @property clientID + @brief The relying party OAuth client ID. + */ +@property(nonatomic, copy, nullable) NSString *clientID; + +/** @property context + @brief The opaque value used by the client to maintain context info between the authentication + request and the IDP callback. + */ +@property(nonatomic, copy, nullable) NSString *context; + +/** @property appID + @brief The iOS client application's bundle identifier. + */ +@property(nonatomic, copy, nullable) NSString *appID; + +/** @fn initWithEndpoint:requestConfiguration:requestConfiguration. + @brief Please use initWithIdentifier:continueURI:requestConfiguration: instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithIdentifier:continueURI:requestConfiguration: + @brief Designated initializer. + @param identifier The email or federated ID of the user. + @param continueURI The URI to which the IDP redirects the user after the federated login flow. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithIdentifier:(NSString *)identifier + continueURI:(NSString *)continueURI + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.m new file mode 100644 index 00000000..c1a6fc0e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.m @@ -0,0 +1,97 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kCreateAuthURIEndpoint + @brief The "createAuthUri" endpoint. + */ +static NSString *const kCreateAuthURIEndpoint = @"createAuthUri"; + +/** @var kProviderIDKey + @brief The key for the "providerId" value in the request. + */ +static NSString *const kProviderIDKey = @"providerId"; + +/** @var kIdentifierKey + @brief The key for the "identifier" value in the request. + */ +static NSString *const kIdentifierKey = @"identifier"; + +/** @var kContinueURIKey + @brief The key for the "continueUri" value in the request. + */ +static NSString *const kContinueURIKey = @"continueUri"; + +/** @var kOpenIDRealmKey + @brief The key for the "openidRealm" value in the request. + */ +static NSString *const kOpenIDRealmKey = @"openidRealm"; + +/** @var kClientIDKey + @brief The key for the "clientId" value in the request. + */ +static NSString *const kClientIDKey = @"clientId"; + +/** @var kContextKey + @brief The key for the "context" value in the request. + */ +static NSString *const kContextKey = @"context"; + +/** @var kAppIDKey + @brief The key for the "appId" value in the request. + */ +static NSString *const kAppIDKey = @"appId"; + +@implementation FIRCreateAuthURIRequest + +- (nullable instancetype)initWithIdentifier:(NSString *)identifier + continueURI:(NSString *)continueURI + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kCreateAuthURIEndpoint requestConfiguration:requestConfiguration]; + if (self) { + _identifier = [identifier copy]; + _continueURI = [continueURI copy]; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = + [@{kIdentifierKey : _identifier, kContinueURIKey : _continueURI} mutableCopy]; + if (_providerID) { + postBody[kProviderIDKey] = _providerID; + } + if (_openIDRealm) { + postBody[kOpenIDRealmKey] = _openIDRealm; + } + if (_clientID) { + postBody[kClientIDKey] = _clientID; + } + if (_context) { + postBody[kContextKey] = _context; + } + if (_appID) { + postBody[kAppIDKey] = _appID; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.h new file mode 100644 index 00000000..79c5ea7d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.h @@ -0,0 +1,61 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRCreateAuthURIResponse + @brief Represents the parameters for the createAuthUri endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/createAuthUri + */ +@interface FIRCreateAuthURIResponse : NSObject + +/** @property authUri + @brief The URI used by the IDP to authenticate the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *authURI; + +/** @property registered + @brief Whether the user is registered if the identifier is an email. + */ +@property(nonatomic, assign, readonly) BOOL registered; + +/** @property providerId + @brief The provider ID of the auth URI. + */ +@property(nonatomic, strong, readonly, nullable) NSString *providerID; + +/** @property forExistingProvider + @brief True if the authUri is for user's existing provider. + */ +@property(nonatomic, assign, readonly) BOOL forExistingProvider; + +/** @property allProviders + @brief A list of provider IDs the passed @c identifier could use to sign in with. + */ +@property(nonatomic, copy, readonly, nullable) NSArray *allProviders; + +/** @property signinMethods + @brief A list of sign-in methods available for the passed @c identifier. + */ +@property(nonatomic, copy, readonly, nullable) NSArray *signinMethods; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.m new file mode 100644 index 00000000..bf422c9c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.m @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRCreateAuthURIResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRCreateAuthURIResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _providerID = [dictionary[@"providerId"] copy]; + _authURI = [dictionary[@"authUri"] copy]; + _registered = [dictionary[@"registered"] boolValue]; + _forExistingProvider = [dictionary[@"forExistingProvider"] boolValue]; + _allProviders = [dictionary[@"allProviders"] copy]; + _signinMethods = [dictionary[@"signinMethods"] copy]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.h new file mode 100644 index 00000000..b6b6e404 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRDeleteAccountRequest + @brief Represents the parameters for the deleteAccount endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/deleteAccount + */ +@interface FIRDeleteAccountRequest : FIRIdentityToolkitRequest + +/** @fn initWithEndpoint:requestConfiguration:requestConfiguration. + @brief Please use initWitLocalID:accessToken:requestConfiguration instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWitLocalID:accessToken:requestConfiguration. + @brief Designated initializer. + @param localID The local ID. + @param accessToken The access token. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWitLocalID:(NSString *)localID + accessToken:(NSString *)accessToken + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.m new file mode 100644 index 00000000..8bc6c52e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.m @@ -0,0 +1,69 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kCreateAuthURIEndpoint + @brief The "deleteAccount" endpoint. + */ +static NSString *const kDeleteAccountEndpoint = @"deleteAccount"; + +/** @var kIDTokenKey + @brief The key for the "idToken" value in the request. This is actually the STS Access Token, + despite it's confusing (backwards compatiable) parameter name. + */ +static NSString *const kIDTokenKey = @"idToken"; + +/** @var kLocalIDKey + @brief The key for the "localID" value in the request. + */ +static NSString *const kLocalIDKey = @"localId"; + +@implementation FIRDeleteAccountRequest { + /** @var _accessToken + @brief The STS Access Token of the authenticated user. + */ + NSString *_accessToken; + + /** @var _localID + @brief The localID of the user. + */ + NSString *_localID; +} + +- (nullable instancetype)initWitLocalID:(NSString *)localID + accessToken:(NSString *)accessToken + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kDeleteAccountEndpoint requestConfiguration:requestConfiguration]; + if (self) { + _localID = [localID copy]; + _accessToken = [accessToken copy]; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + postBody[kIDTokenKey] = _accessToken; + postBody[kLocalIDKey] = _localID; + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.h new file mode 100644 index 00000000..bc4d0d99 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.h @@ -0,0 +1,30 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRDeleteAccountResponse + @brief Represents the response from the deleteAccount endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/deleteAccount + */ +@interface FIRDeleteAccountResponse : NSObject +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.m new file mode 100644 index 00000000..fba1b6b0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.m @@ -0,0 +1,29 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRDeleteAccountResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.h new file mode 100644 index 00000000..752ffb4b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.h @@ -0,0 +1,66 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIREmailLinkSignInRequest + @brief Represents the parameters for the emailLinkSignin endpoint. + */ +@interface FIREmailLinkSignInRequest : FIRIdentityToolkitRequest + +#pragma mark - Components of "postBody" + +/** @property email + @brief The email identifier used to complete the email link sign-in. + */ +@property(nonatomic, copy, readonly) NSString *email; + +/** @property oobCode + @brief The OOB code used to complete the email link sign-in flow. + */ +@property(nonatomic, copy, readonly) NSString *oobCode; + +/** @property IDToken + @brief The ID Token code potentially used to complete the email link sign-in flow. + */ +@property(nonatomic, copy) NSString *IDToken; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithProviderID:requestConfifuration instead. + */ +- (instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration NS_UNAVAILABLE; + +/** @fn initWithProviderID:requestConfifuration + @brief Designated initializer. + @param email The email identifier used to complete hte email link sign-in flow. + @param oobCode The OOB code used to complete the email link sign-in flow. + @param requestConfiguration An object containing configurations to be added to the request. + + */ +- (instancetype)initWithEmail:(NSString *)email + oobCode:(NSString *)oobCode + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.m new file mode 100644 index 00000000..dc5b512e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.m @@ -0,0 +1,74 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kEmailLinkSigninEndpoint + @brief The "EmailLinkSignin" endpoint. + */ +static NSString *const kEmailLinkSigninEndpoint = @"emailLinkSignin"; + +/** @var kEmailKey + @brief The key for the "identifier" value in the request. + */ +static NSString *const kEmailKey = @"email"; + +/** @var kEmailLinkKey + @brief The key for the "emailLink" value in the request. + */ +static NSString *const kOOBCodeKey = @"oobCode"; + +/** @var kIDTokenKey + @brief The key for the "IDToken" value in the request. + */ +static NSString *const kIDTokenKey = @"idToken"; + +/** @var kPostBodyKey + @brief The key for the "postBody" value in the request. + */ +static NSString *const kPostBodyKey = @"postBody"; + +@implementation FIREmailLinkSignInRequest + +- (instancetype)initWithEmail:(NSString *)email + oobCode:(NSString *)oobCode + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kEmailLinkSigninEndpoint + requestConfiguration:requestConfiguration]; + if (self) { + _email = email; + _oobCode = oobCode; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = [@{ + kEmailKey : _email, + kOOBCodeKey : _oobCode, + } mutableCopy]; + + if (_IDToken) { + postBody[kIDTokenKey] = _IDToken; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.h new file mode 100644 index 00000000..c12b0aa8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.h @@ -0,0 +1,54 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRVerifyAssertionResponse + @brief Represents the response from the emailLinkSignin endpoint. + */ +@interface FIREmailLinkSignInResponse : NSObject + +/** @property IDToken + @brief The ID token in the email link sign-in response. + */ +@property(nonatomic, copy, readonly) NSString *IDToken; + +/** @property email + @brief The email returned by the IdP. + */ +@property(nonatomic, strong, readonly, nullable) NSString *email; + +/** @property refreshToken + @brief The refreshToken returned by the server. + */ +@property(nonatomic, strong, readonly, nullable) NSString *refreshToken; + +/** @property approximateExpirationDate + @brief The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +/** @property isNewUser + @brief Flag indicating that the user signing in is a new user and not a returning user. + */ +@property(nonatomic, assign) BOOL isNewUser; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.m new file mode 100644 index 00000000..9f125e14 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.m @@ -0,0 +1,37 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIREmailLinkSignInResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _email = [dictionary[@"email"] copy]; + _IDToken = [dictionary[@"idToken"] copy]; + _isNewUser = [dictionary[@"isNewUser"] boolValue]; + _refreshToken = [dictionary[@"refreshToken"] copy]; + _approximateExpirationDate = + [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] + : nil; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.h new file mode 100644 index 00000000..7d78500a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.h @@ -0,0 +1,53 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRGetAccountInfoRequest + @brief Represents the parameters for the getAccountInfo endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo + */ +@interface FIRGetAccountInfoRequest : FIRIdentityToolkitRequest + +/** @property accessToken + @brief The STS Access Token for the authenticated user. + */ +@property(nonatomic, copy) NSString *accessToken; + +/** @fn initWithEndpoint:requestConfiguration:requestConfiguration + @brief Please use initWithAccessToken:requestConfiguration: instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithAccessToken:requestConfiguration + @brief Designated initializer. + @param accessToken The Access Token of the authenticated user. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithAccessToken:(NSString *)accessToken + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.m new file mode 100644 index 00000000..db86f934 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.m @@ -0,0 +1,49 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kGetAccountInfoEndpoint + @brief The "getAccountInfo" endpoint. + */ +static NSString *const kGetAccountInfoEndpoint = @"getAccountInfo"; + +/** @var kIDTokenKey + @brief The key for the "idToken" value in the request. This is actually the STS Access Token, + despite it's confusing (backwards compatiable) parameter name. + */ +static NSString *const kIDTokenKey = @"idToken"; + +@implementation FIRGetAccountInfoRequest + +- (nullable instancetype)initWithAccessToken:(NSString *)accessToken + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kGetAccountInfoEndpoint requestConfiguration:requestConfiguration]; + if (self) { + _accessToken = [accessToken copy]; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + return @{kIDTokenKey : _accessToken}; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h new file mode 100644 index 00000000..14e7f88c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h @@ -0,0 +1,158 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRGetAccountInfoResponseProviderUserInfo + @brief Represents the provider user info part of the response from the getAccountInfo endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo + */ +@interface FIRGetAccountInfoResponseProviderUserInfo : NSObject + +/** @property providerID + @brief The ID of the identity provider. + */ +@property(nonatomic, strong, readonly, nullable) NSString *providerID; + +/** @property displayName + @brief The user's display name at the identity provider. + */ +@property(nonatomic, strong, readonly, nullable) NSString *displayName; + +/** @property photoURL + @brief The user's photo URL at the identity provider. + */ +@property(nonatomic, strong, readonly, nullable) NSURL *photoURL; + +/** @property federatedID + @brief The user's identifier at the identity provider. + */ +@property(nonatomic, strong, readonly, nullable) NSString *federatedID; + +/** @property email + @brief The user's email at the identity provider. + */ +@property(nonatomic, strong, readonly, nullable) NSString *email; + +/** @property phoneNumber + @brief A phone number associated with the user. + */ +@property(nonatomic, readonly, nullable) NSString *phoneNumber; + +/** @fn init + @brief Please use initWithDictionary: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithAPIKey: + @brief Designated initializer. + @param dictionary The provider user info data from endpoint. + */ +- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER; + +@end + +/** @class FIRGetAccountInfoResponseUser + @brief Represents the firebase user info part of the response from the getAccountInfo endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo + */ +@interface FIRGetAccountInfoResponseUser : NSObject + +/** @property localID + @brief The ID of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *localID; + +/** @property email + @brief The email or the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *email; + +/** @property emailVerified + @brief Whether the email has been verified. + */ +@property(nonatomic, assign, readonly) BOOL emailVerified; + +/** @property displayName + @brief The display name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *displayName; + +/** @property photoURL + @brief The user's photo URL. + */ +@property(nonatomic, strong, readonly, nullable) NSURL *photoURL; + +/** @property creationDate + @brief The user's creation date. + */ +@property(nonatomic, strong, readonly, nullable) NSDate *creationDate; + +/** @property lastSignInDate + @brief The user's last login date. + */ +@property(nonatomic, strong, readonly, nullable) NSDate *lastLoginDate; + +/** @property providerUserInfo + @brief The user's profiles at the associated identity providers. + */ +@property(nonatomic, strong, readonly, nullable) + NSArray *providerUserInfo; + +/** @property passwordHash + @brief Information about user's password. + @remarks This is not necessarily the hash of user's actual password. + */ +@property(nonatomic, strong, readonly, nullable) NSString *passwordHash; + +/** @property phoneNumber + @brief A phone number associated with the user. + */ +@property(nonatomic, readonly, nullable) NSString *phoneNumber; + +@property(nonatomic, strong, readonly, nullable) + NSArray *MFAEnrollments; + +/** @fn init + @brief Please use initWithDictionary: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithAPIKey: + @brief Designated initializer. + @param dictionary The provider user info data from endpoint. + */ +- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER; + +@end + +/** @class FIRGetAccountInfoResponse + @brief Represents the response from the setAccountInfo endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo + */ +@interface FIRGetAccountInfoResponse : NSObject + +/** @property providerUserInfo + @brief The requested users' profiles. + */ +@property(nonatomic, strong, readonly, nullable) NSArray *users; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.m new file mode 100644 index 00000000..6b812bd9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.m @@ -0,0 +1,117 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h" + +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kErrorKey + @brief The key for the "error" value in JSON responses from the server. + */ +static NSString *const kErrorKey = @"error"; + +@implementation FIRGetAccountInfoResponseProviderUserInfo + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + self = [super init]; + if (self) { + _providerID = [dictionary[@"providerId"] copy]; + _displayName = [dictionary[@"displayName"] copy]; + NSString *photoURL = dictionary[@"photoUrl"]; + if (photoURL) { + _photoURL = [NSURL URLWithString:photoURL]; + } + _federatedID = [dictionary[@"federatedId"] copy]; + _email = [dictionary[@"email"] copy]; + _phoneNumber = [dictionary[@"phoneNumber"] copy]; + } + return self; +} + +@end + +@implementation FIRGetAccountInfoResponseUser + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + self = [super init]; + if (self) { + NSArray *providerUserInfoData = dictionary[@"providerUserInfo"]; + if (providerUserInfoData) { + NSMutableArray *providerUserInfoArray = + [NSMutableArray arrayWithCapacity:providerUserInfoData.count]; + for (NSDictionary *dictionary in providerUserInfoData) { + [providerUserInfoArray addObject:[[FIRGetAccountInfoResponseProviderUserInfo alloc] + initWithDictionary:dictionary]]; + } + _providerUserInfo = [providerUserInfoArray copy]; + } + _localID = [dictionary[@"localId"] copy]; + _displayName = [dictionary[@"displayName"] copy]; + _email = [dictionary[@"email"] copy]; + NSString *photoURL = dictionary[@"photoUrl"]; + if (photoURL) { + _photoURL = [NSURL URLWithString:photoURL]; + } + if ([dictionary[@"createdAt"] isKindOfClass:[NSString class]]) { + // Divide by 1000 in order to convert miliseconds to seconds. + NSTimeInterval creationDateTimeInterval = [dictionary[@"createdAt"] doubleValue] / 1000; + _creationDate = [NSDate dateWithTimeIntervalSince1970:creationDateTimeInterval]; + } + if ([dictionary[@"lastLoginAt"] isKindOfClass:[NSString class]]) { + // Divide by 1000 in order to convert miliseconds to seconds + NSTimeInterval creationDateTimeInterval = [dictionary[@"lastLoginAt"] doubleValue] / 1000; + _lastLoginDate = [NSDate dateWithTimeIntervalSince1970:creationDateTimeInterval]; + } + _emailVerified = [dictionary[@"emailVerified"] boolValue]; + _passwordHash = [dictionary[@"passwordHash"] copy]; + _phoneNumber = [dictionary[@"phoneNumber"] copy]; + NSArray *MFAEnrollmentData = dictionary[@"mfaInfo"]; + if (MFAEnrollmentData) { + NSMutableArray *MFAEnrollments = + [NSMutableArray arrayWithCapacity:MFAEnrollmentData.count]; + for (NSDictionary *dictionary in MFAEnrollmentData) { + [MFAEnrollments + addObject:[[FIRAuthProtoMFAEnrollment alloc] initWithDictionary:dictionary]]; + } + _MFAEnrollments = [MFAEnrollments copy]; + } + } + return self; +} + +@end + +@implementation FIRGetAccountInfoResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + NSArray *usersData = dictionary[@"users"]; + // The client side never sends a getAccountInfo request with multiple localID, so only one user + // data is expected in the response. + if (![usersData isKindOfClass:[NSArray class]] || usersData.count != 1) { + if (error) { + *error = [FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:dictionary]; + } + return NO; + } + _users = @[ [[FIRGetAccountInfoResponseUser alloc] initWithDictionary:usersData.firstObject] ]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h new file mode 100644 index 00000000..dc48a3ed --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h @@ -0,0 +1,178 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +@class FIRActionCodeSettings; + +NS_ASSUME_NONNULL_BEGIN + +/** @enum FIRGetOOBConfirmationCodeRequestType + @brief Types of OOB Confirmation Code requests. + */ +typedef NS_ENUM(NSInteger, FIRGetOOBConfirmationCodeRequestType) { + /** @var FIRGetOOBConfirmationCodeRequestTypePasswordReset + @brief Requests a password reset code. + */ + FIRGetOOBConfirmationCodeRequestTypePasswordReset, + + /** @var FIRGetOOBConfirmationCodeRequestTypeVerifyEmail + @brief Requests an email verification code. + */ + FIRGetOOBConfirmationCodeRequestTypeVerifyEmail, + + /** @var FIRGetOOBConfirmationCodeRequestTypeEmailLink + @brief Requests an email sign-in link. + */ + FIRGetOOBConfirmationCodeRequestTypeEmailLink, + + /** @var FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail + @brief Requests an verify before update email. + */ + FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail, +}; + +/** @enum FIRGetOOBConfirmationCodeRequest + @brief Represents the parameters for the getOOBConfirmationCode endpoint. + */ +@interface FIRGetOOBConfirmationCodeRequest : FIRIdentityToolkitRequest + +/** @property requestType + @brief The types of OOB Confirmation Code to request. + */ +@property(nonatomic, assign, readonly) FIRGetOOBConfirmationCodeRequestType requestType; + +/** @property email + @brief The email of the user. + @remarks For password reset. + */ +@property(nonatomic, copy, nullable, readonly) NSString *email; + +/** @property updatedEmail + @brief The new email to be updated. + @remarks For verifyBeforeUpdateEmail. + */ +@property(nonatomic, copy, nullable, readonly) NSString *updatedEmail; + +/** @property accessToken + @brief The STS Access Token of the authenticated user. + @remarks For email change. + */ +@property(nonatomic, copy, nullable, readonly) NSString *accessToken; + +/** @property continueURL + @brief This URL represents the state/Continue URL in the form of a universal link. + */ +@property(nonatomic, copy, nullable, readonly) NSString *continueURL; + +/** @property iOSBundleID + @brief The iOS bundle Identifier, if available. + */ +@property(nonatomic, copy, nullable, readonly) NSString *iOSBundleID; + +/** @property androidPackageName + @brief The Android package name, if available. + */ +@property(nonatomic, copy, nullable, readonly) NSString *androidPackageName; + +/** @property androidMinimumVersion + @brief The minimum Android version supported, if available. + */ +@property(nonatomic, copy, nullable, readonly) NSString *androidMinimumVersion; + +/** @property androidInstallIfNotAvailable + @brief Indicates whether or not the Android app should be installed if not already available. + */ +@property(nonatomic, assign, readonly) BOOL androidInstallApp; + +/** @property handleCodeInApp + @brief Indicates whether the action code link will open the app directly or after being + redirected from a Firebase owned web widget. + */ +@property(assign, nonatomic) BOOL handleCodeInApp; + +/** @property dynamicLinkDomain + @brief The Firebase Dynamic Link domain used for out of band code flow. + */ +@property(copy, nonatomic, nullable) NSString *dynamicLinkDomain; + +/** @fn passwordResetRequestWithEmail:actionCodeSettings:requestConfiguration: + @brief Creates a password reset request. + @param email The user's email address. + @param actionCodeSettings An object of FIRActionCodeSettings which specifies action code + settings to be applied to the password reset request. + @param requestConfiguration An object containing configurations to be added to the request. + @return A password reset request. + */ ++ (nullable FIRGetOOBConfirmationCodeRequest *) + passwordResetRequestWithEmail:(NSString *)email + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +/** @fn verifyEmailRequestWithAccessToken:actionCodeSettings:requestConfiguration: + @brief Creates a password reset request. + @param accessToken The user's STS Access Token. + @param actionCodeSettings An object of FIRActionCodeSettings which specifies action code + settings to be applied to the email verification request. + @param requestConfiguration An object containing configurations to be added to the request. + @return A password reset request. + */ ++ (nullable FIRGetOOBConfirmationCodeRequest *) + verifyEmailRequestWithAccessToken:(NSString *)accessToken + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +/** @fn signInWithEmailLinkRequest:actionCodeSettings:requestConfiguration: + @brief Creates a sign-in with email link. + @param email The user's email address. + @param actionCodeSettings An object of FIRActionCodeSettings which specifies action code + settings to be applied to the email sign-in link. + @param requestConfiguration An object containing configurations to be added to the request. + @return An email sign-in link request. + */ ++ (nullable FIRGetOOBConfirmationCodeRequest *) + signInWithEmailLinkRequest:(NSString *)email + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +/** @fn verifyBeforeUpdateEmailWithAccessToken:newEmail:actionCodeSettings:requestConfiguration: + @brief Creates a verifyBeforeUpdateEmail request. + @param accessToken The user's STS Access Token. + @param newEmail The user's email address to be updated. + @param actionCodeSettings An object of FIRActionCodeSettings which specifies action code + settings to be applied to the password reset request. + @param requestConfiguration An object containing configurations to be added to the request. + @return A verifyBeforeUpdateEmail request. + */ ++ (nullable FIRGetOOBConfirmationCodeRequest *) + verifyBeforeUpdateEmailWithAccessToken:(NSString *)accessToken + newEmail:(NSString *)newEmail + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +/** @fn init + @brief Please use a factory method. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.m new file mode 100644 index 00000000..cbcde818 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.m @@ -0,0 +1,288 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h" + +#import + +#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kEndpoint + @brief The getOobConfirmationCode endpoint name. + */ +static NSString *const kGetOobConfirmationCodeEndpoint = @"getOobConfirmationCode"; + +/** @var kRequestTypeKey + @brief The name of the required "requestType" property in the request. + */ +static NSString *const kRequestTypeKey = @"requestType"; + +/** @var kEmailKey + @brief The name of the "email" property in the request. + */ +static NSString *const kEmailKey = @"email"; + +/** @var kNewEmailKey + @brief The name of the "newEmail" property in the request. + */ +static NSString *const kNewEmailKey = @"newEmail"; + +/** @var kIDTokenKey + @brief The key for the "idToken" value in the request. This is actually the STS Access Token, + despite it's confusing (backwards compatiable) parameter name. + */ +static NSString *const kIDTokenKey = @"idToken"; + +/** @var kContinueURLKey + @brief The key for the "continue URL" value in the request. + */ +static NSString *const kContinueURLKey = @"continueUrl"; + +/** @var kIosBundeIDKey + @brief The key for the "iOS Bundle Identifier" value in the request. + */ +static NSString *const kIosBundleIDKey = @"iOSBundleId"; + +/** @var kAndroidPackageNameKey + @brief The key for the "Android Package Name" value in the request. + */ +static NSString *const kAndroidPackageNameKey = @"androidPackageName"; + +/** @var kAndroidInstallAppKey + @brief The key for the request parameter indicating whether the android app should be installed + or not. + */ +static NSString *const kAndroidInstallAppKey = @"androidInstallApp"; + +/** @var kAndroidMinimumVersionKey + @brief The key for the "minimum Android version supported" value in the request. + */ +static NSString *const kAndroidMinimumVersionKey = @"androidMinimumVersion"; + +/** @var kCanHandleCodeInAppKey + @brief The key for the request parameter indicating whether the action code can be handled in + the app or not. + */ +static NSString *const kCanHandleCodeInAppKey = @"canHandleCodeInApp"; + +/** @var kDynamicLinkDomainKey + @brief The key for the "dynamic link domain" value in the request. + */ +static NSString *const kDynamicLinkDomainKey = @"dynamicLinkDomain"; + +/** @var kPasswordResetRequestTypeValue + @brief The value for the "PASSWORD_RESET" request type. + */ +static NSString *const kPasswordResetRequestTypeValue = @"PASSWORD_RESET"; + +/** @var kEmailLinkSignInTypeValue + @brief The value for the "EMAIL_SIGNIN" request type. + */ +static NSString *const kEmailLinkSignInTypeValue = @"EMAIL_SIGNIN"; + +/** @var kVerifyEmailRequestTypeValue + @brief The value for the "VERIFY_EMAIL" request type. + */ +static NSString *const kVerifyEmailRequestTypeValue = @"VERIFY_EMAIL"; + +/** @var kVerifyBeforeUpdateEmailRequestTypeValue + @brief The value for the "VERIFY_AND_CHANGE_EMAIL" request type. + */ +static NSString *const kVerifyBeforeUpdateEmailRequestTypeValue = @"VERIFY_AND_CHANGE_EMAIL"; + +@interface FIRGetOOBConfirmationCodeRequest () + +/** @fn initWithRequestType:email:APIKey: + @brief Designated initializer. + @param requestType The types of OOB Confirmation Code to request. + @param email The email of the user. + @param newEmail The email of the user to be updated. + @param accessToken The STS Access Token of the currently signed in user. + @param actionCodeSettings An object of FIRActionCodeSettings which specifies action code + settings to be applied to the OOB code request. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType + email:(nullable NSString *)email + newEmail:(nullable NSString *)newEmail + accessToken:(nullable NSString *)accessToken + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +@implementation FIRGetOOBConfirmationCodeRequest + +/** @var requestTypeStringValueForRequestType: + @brief Returns the string equivilent for an @c FIRGetOOBConfirmationCodeRequestType value. + */ ++ (NSString *)requestTypeStringValueForRequestType: + (FIRGetOOBConfirmationCodeRequestType)requestType { + switch (requestType) { + case FIRGetOOBConfirmationCodeRequestTypePasswordReset: + return kPasswordResetRequestTypeValue; + case FIRGetOOBConfirmationCodeRequestTypeVerifyEmail: + return kVerifyEmailRequestTypeValue; + case FIRGetOOBConfirmationCodeRequestTypeEmailLink: + return kEmailLinkSignInTypeValue; + case FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail: + return kVerifyBeforeUpdateEmailRequestTypeValue; + // No default case so that we get a compiler warning if a new value was added to the enum. + } +} + ++ (nullable FIRGetOOBConfirmationCodeRequest *) + passwordResetRequestWithEmail:(NSString *)email + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypePasswordReset + email:email + newEmail:nil + accessToken:nil + actionCodeSettings:actionCodeSettings + requestConfiguration:requestConfiguration]; +} + ++ (nullable FIRGetOOBConfirmationCodeRequest *) + verifyEmailRequestWithAccessToken:(NSString *)accessToken + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeVerifyEmail + email:nil + newEmail:nil + accessToken:accessToken + actionCodeSettings:actionCodeSettings + requestConfiguration:requestConfiguration]; +} + ++ (nullable FIRGetOOBConfirmationCodeRequest *) + signInWithEmailLinkRequest:(NSString *)email + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeEmailLink + email:email + newEmail:nil + accessToken:nil + actionCodeSettings:actionCodeSettings + requestConfiguration:requestConfiguration]; +} + ++ (nullable FIRGetOOBConfirmationCodeRequest *) + verifyBeforeUpdateEmailWithAccessToken:(NSString *)accessToken + newEmail:(NSString *)newEmail + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + return + [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail + email:nil + newEmail:newEmail + accessToken:accessToken + actionCodeSettings:actionCodeSettings + requestConfiguration:requestConfiguration]; +} + +- (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType + email:(nullable NSString *)email + newEmail:(nullable NSString *)newEmail + accessToken:(nullable NSString *)accessToken + actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kGetOobConfirmationCodeEndpoint + requestConfiguration:requestConfiguration]; + if (self) { + _requestType = requestType; + _email = email; + _updatedEmail = newEmail; + _accessToken = accessToken; + _continueURL = actionCodeSettings.URL.absoluteString; + _iOSBundleID = actionCodeSettings.iOSBundleID; + _androidPackageName = actionCodeSettings.androidPackageName; + _androidMinimumVersion = actionCodeSettings.androidMinimumVersion; + _androidInstallApp = actionCodeSettings.androidInstallIfNotAvailable; + _handleCodeInApp = actionCodeSettings.handleCodeInApp; + _dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *body = + [@{kRequestTypeKey : [[self class] requestTypeStringValueForRequestType:_requestType]} + mutableCopy]; + + // For password reset requests, we only need an email address in addition to the already required + // fields. + if (_requestType == FIRGetOOBConfirmationCodeRequestTypePasswordReset) { + body[kEmailKey] = _email; + } + + // For verify email requests, we only need an STS Access Token in addition to the already required + // fields. + if (_requestType == FIRGetOOBConfirmationCodeRequestTypeVerifyEmail) { + body[kIDTokenKey] = _accessToken; + } + + // For email sign-in link requests, we only need an email address in addition to the already + // required fields. + if (_requestType == FIRGetOOBConfirmationCodeRequestTypeEmailLink) { + body[kEmailKey] = _email; + } + + // For email sign-in link requests, we only need an STS Access Token, a new email address in + // addition to the already required fields. + if (_requestType == FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail) { + body[kNewEmailKey] = _updatedEmail; + body[kIDTokenKey] = _accessToken; + } + + if (_continueURL) { + body[kContinueURLKey] = _continueURL; + } + + if (_iOSBundleID) { + body[kIosBundleIDKey] = _iOSBundleID; + } + + if (_androidPackageName) { + body[kAndroidPackageNameKey] = _androidPackageName; + } + + if (_androidMinimumVersion) { + body[kAndroidMinimumVersionKey] = _androidMinimumVersion; + } + + if (_androidInstallApp) { + body[kAndroidInstallAppKey] = @YES; + } + + if (_handleCodeInApp) { + body[kCanHandleCodeInAppKey] = @YES; + } + + if (_dynamicLinkDomain) { + body[kDynamicLinkDomainKey] = _dynamicLinkDomain; + } + + return body; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.h new file mode 100644 index 00000000..9ea445e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.h @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRGetOOBConfirmationCodeResponse + @brief Represents the response from the getOobConfirmationCode endpoint. + */ +@interface FIRGetOOBConfirmationCodeResponse : NSObject + +/** @property OOBCode + @brief The OOB code returned by the server in some cases. + */ +@property(nonatomic, copy, readonly, nullable) NSString *OOBCode; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.m new file mode 100644 index 00000000..7eef6885 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.m @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kOOBCodeKey + @brief The name of the field in the response JSON for the OOB code. + */ +static NSString *const kOOBCodeKey = @"oobCode"; + +@implementation FIRGetOOBConfirmationCodeResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _OOBCode = [dictionary[kOOBCodeKey] copy]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.h new file mode 100644 index 00000000..cfaefccb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.h @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRGetProjectConfigRequest : FIRIdentityToolkitRequest + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithRequestConfiguration: + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithTemporaryProof:phoneNumberAPIKey + @brief Designated initializer. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithRequestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.m new file mode 100644 index 00000000..402f2207 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.m @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kGetProjectConfigEndPoint + @brief The "getProjectConfig" endpoint. + */ +static NSString *const kGetProjectConfigEndPoint = @"getProjectConfig"; + +@implementation FIRGetProjectConfigRequest + +- (nullable instancetype)initWithRequestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration { + return [super initWithEndpoint:kGetProjectConfigEndPoint + requestConfiguration:requestConfiguration]; +} + +- (BOOL)containsPostBody { + return NO; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.h new file mode 100644 index 00000000..12248e11 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.h @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRGetProjectConfigResponse + @brief Represents the response from the getProjectConfig endpoint. + */ +@interface FIRGetProjectConfigResponse : NSObject + +/** @property projectID + @brief The unique ID pertaining to the current project. + */ +@property(nonatomic, strong, readonly, nullable) NSString *projectID; + +/** @property authorizedDomains + @brief A list of domains whitelisted for the current project. + */ +@property(nonatomic, strong, readonly, nullable) NSArray *authorizedDomains; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.m new file mode 100644 index 00000000..38a3ba05 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.m @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRGetProjectConfigResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _projectID = [dictionary[@"projectId"] copy]; + id authorizedDomains = dictionary[@"authorizedDomains"]; + if ([authorizedDomains isKindOfClass:[NSString class]]) { + NSData *data = [authorizedDomains dataUsingEncoding:NSUTF8StringEncoding]; + authorizedDomains = [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingMutableLeaves + error:nil]; + } + if ([authorizedDomains isKindOfClass:[NSArray class]]) { + _authorizedDomains = [[NSArray alloc] initWithArray:authorizedDomains copyItems:YES]; + } + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.h new file mode 100644 index 00000000..1b918f50 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.h @@ -0,0 +1,55 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRResetPasswordRequest : FIRIdentityToolkitRequest + +/** @property oobCode + @brief The oobCode sent in the request. + */ +@property(nonatomic, copy, readonly) NSString *oobCode; + +/** @property updatedPassword + @brief The new password sent in the request. + */ +@property(nonatomic, copy, readonly) NSString *updatedPassword; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithOobCode:newPassword:requestConfiguration: instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithOobCode:newPassword:requestConfiguration: + @brief Designated initializer. + @param oobCode The OOB Code. + @param newPassword The new password. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithOobCode:(NSString *)oobCode + newPassword:(nullable NSString *)newPassword + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.m new file mode 100644 index 00000000..9f70935e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.m @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kResetPasswordEndpoint + @brief The "resetPassword" endpoint. + */ +static NSString *const kResetPasswordEndpoint = @"resetPassword"; + +/** @var kOOBCodeKey + @brief The "resetPassword" key. + */ +static NSString *const kOOBCodeKey = @"oobCode"; + +/** @var kCurrentPasswordKey + @brief The "newPassword" key. + */ +static NSString *const kCurrentPasswordKey = @"newPassword"; + +@implementation FIRResetPasswordRequest + +- (nullable instancetype)initWithOobCode:(NSString *)oobCode + newPassword:(nullable NSString *)newPassword + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kResetPasswordEndpoint requestConfiguration:requestConfiguration]; + if (self) { + _oobCode = oobCode; + _updatedPassword = newPassword; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + postBody[kOOBCodeKey] = _oobCode; + if (_updatedPassword) { + postBody[kCurrentPasswordKey] = _updatedPassword; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.h new file mode 100644 index 00000000..3e8c5604 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.h @@ -0,0 +1,52 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthResetPasswordResponse + @brief Represents the response from the resetPassword endpoint. + @remarks Possible error codes: + - FIRAuthErrorCodeWeakPassword + - FIRAuthErrorCodeUserDisabled + - FIRAuthErrorCodeOperationNotAllowed + - FIRAuthErrorCodeExpiredActionCode + - FIRAuthErrorCodeInvalidActionCode + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/resetPassword + */ +@interface FIRResetPasswordResponse : NSObject + +/** @property email + @brief The email address corresponding to the reset password request. + */ +@property(nonatomic, strong, readonly) NSString *email; + +/** @property verifiedEmail + @brief The verified email returned from the backend. + */ +@property(nonatomic, strong, readonly) NSString *verifiedEmail; + +/** @property requestType + @brief The tpye of request as returned by the backend. + */ +@property(nonatomic, strong, readonly) NSString *requestType; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.m new file mode 100644 index 00000000..5ad1e361 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.m @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRResetPasswordResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRResetPasswordResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _email = [dictionary[@"email"] copy]; + _requestType = [dictionary[@"requestType"] copy]; + _verifiedEmail = [dictionary[@"newEmail"] copy]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.h new file mode 100644 index 00000000..c17a2378 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.h @@ -0,0 +1,113 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @enum FIRSecureTokenRequestGrantType + @brief Represents the possible grant types for a token request. + */ +typedef NS_ENUM(NSUInteger, FIRSecureTokenRequestGrantType) { + /** @var FIRSecureTokenRequestGrantTypeAuthorizationCode + @brief Indicates an authorization code request. + @remarks Exchanges a Gitkit "ID Token" for an STS Access Token and Refresh Token. + */ + FIRSecureTokenRequestGrantTypeAuthorizationCode, + + /** @var FIRSecureTokenRequestGrantTypeRefreshToken + @brief Indicates an refresh token request. + @remarks Uses an existing Refresh Token to create a new Access Token. + */ + FIRSecureTokenRequestGrantTypeRefreshToken, +}; + +/** @class FIRSecureTokenRequest + @brief Represents the parameters for the token endpoint. + */ +@interface FIRSecureTokenRequest : NSObject + +/** @property grantType + @brief The type of grant requested. + @see FIRSecureTokenRequestGrantType + */ +@property(nonatomic, assign, readonly) FIRSecureTokenRequestGrantType grantType; + +/** @property scope + @brief The scopes requested (a comma-delimited list of scope strings.) + */ +@property(nonatomic, copy, readonly, nullable) NSString *scope; + +/** @property refreshToken + @brief The client's refresh token. + */ +@property(nonatomic, copy, readonly, nullable) NSString *refreshToken; + +/** @property code + @brief The client's authorization code (legacy Gitkit "ID Token"). + */ +@property(nonatomic, copy, readonly, nullable) NSString *code; + +/** @property APIKey + @brief The client's API Key. + */ +@property(nonatomic, copy, readonly) NSString *APIKey; + +/** @fn authCodeRequestWithCode: + @brief Creates an authorization code request with the given code (legacy Gitkit "ID Token"). + @param code The authorization code (legacy Gitkit "ID Token"). + @param requestConfiguration An object containing configurations to be added to the request. + @return An authorization request. + */ ++ (FIRSecureTokenRequest *)authCodeRequestWithCode:(NSString *)code + requestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration; + +/** @fn refreshRequestWithCode: + @brief Creates a refresh request with the given refresh token. + @param refreshToken The refresh token. + @param requestConfiguration An object containing configurations to be added to the request. + @return A refresh request. + */ ++ (FIRSecureTokenRequest *)refreshRequestWithRefreshToken:(NSString *)refreshToken + requestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration; + +/** @fn init + @brief Please use initWithGrantType:scope:refreshToken:code: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithGrantType:scope:refreshToken:code:APIKey: + @brief Designated initializer. + @param grantType The type of request. + @param scope The scopes requested. + @param refreshToken The client's refresh token (for refresh requests.) + @param code The client's authorization code (Gitkit ID Token) (for authorization code requests.) + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithGrantType:(FIRSecureTokenRequestGrantType)grantType + scope:(nullable NSString *)scope + refreshToken:(nullable NSString *)refreshToken + code:(nullable NSString *)code + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.m new file mode 100644 index 00000000..a2bbc1eb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.m @@ -0,0 +1,163 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.h" + +#import "FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kFIRSecureTokenServiceGetTokenURLFormat + @brief The format of the secure token service URLs. Requires string format substitution with + the client's API Key. + */ +static NSString *const kFIRSecureTokenServiceGetTokenURLFormat = @"https://%@/v1/token?key=%@"; + +/** @var kFIRSecureTokenServiceGrantTypeRefreshToken + @brief The string value of the @c FIRSecureTokenRequestGrantTypeRefreshToken request type. + */ +static NSString *const kFIRSecureTokenServiceGrantTypeRefreshToken = @"refresh_token"; + +/** @var kFIRSecureTokenServiceGrantTypeAuthorizationCode + @brief The string value of the @c FIRSecureTokenRequestGrantTypeAuthorizationCode request type. + */ +static NSString *const kFIRSecureTokenServiceGrantTypeAuthorizationCode = @"authorization_code"; + +/** @var kGrantTypeKey + @brief The key for the "grantType" parameter in the request. + */ +static NSString *const kGrantTypeKey = @"grantType"; + +/** @var kScopeKey + @brief The key for the "scope" parameter in the request. + */ +static NSString *const kScopeKey = @"scope"; + +/** @var kRefreshTokenKey + @brief The key for the "refreshToken" parameter in the request. + */ +static NSString *const kRefreshTokenKey = @"refreshToken"; + +/** @var kCodeKey + @brief The key for the "code" parameter in the request. + */ +static NSString *const kCodeKey = @"code"; + +/** @var gAPIHost + @brief Host for server API calls. + */ +static NSString *gAPIHost = @"securetoken.googleapis.com"; + +@implementation FIRSecureTokenRequest { + /** @var _requestConfiguration + @brief Contains configuration relevant to the request. + */ + FIRAuthRequestConfiguration *_requestConfiguration; +} + ++ (FIRSecureTokenRequest *)authCodeRequestWithCode:(NSString *)code + requestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration { + return [[self alloc] initWithGrantType:FIRSecureTokenRequestGrantTypeAuthorizationCode + scope:nil + refreshToken:nil + code:code + requestConfiguration:requestConfiguration]; +} + ++ (FIRSecureTokenRequest *)refreshRequestWithRefreshToken:(NSString *)refreshToken + requestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration { + return [[self alloc] initWithGrantType:FIRSecureTokenRequestGrantTypeRefreshToken + scope:nil + refreshToken:refreshToken + code:nil + requestConfiguration:requestConfiguration]; +} + +/** @fn grantTypeStringWithGrantType: + @brief Converts a @c FIRSecureTokenRequestGrantType to it's @c NSString equivilent. + */ ++ (NSString *)grantTypeStringWithGrantType:(FIRSecureTokenRequestGrantType)grantType { + switch (grantType) { + case FIRSecureTokenRequestGrantTypeAuthorizationCode: + return kFIRSecureTokenServiceGrantTypeAuthorizationCode; + case FIRSecureTokenRequestGrantTypeRefreshToken: + return kFIRSecureTokenServiceGrantTypeRefreshToken; + // No Default case so we will notice if new grant types are added to the enum. + } +} + +- (nullable instancetype)initWithGrantType:(FIRSecureTokenRequestGrantType)grantType + scope:(nullable NSString *)scope + refreshToken:(nullable NSString *)refreshToken + code:(nullable NSString *)code + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super init]; + if (self) { + _grantType = grantType; + _scope = [scope copy]; + _refreshToken = [refreshToken copy]; + _code = [code copy]; + _APIKey = [requestConfiguration.APIKey copy]; + _requestConfiguration = requestConfiguration; + } + return self; +} + +- (FIRAuthRequestConfiguration *)requestConfiguration { + return _requestConfiguration; +} + +- (NSURL *)requestURL { + NSString *URLString = + [NSString stringWithFormat:kFIRSecureTokenServiceGetTokenURLFormat, gAPIHost, _APIKey]; + NSURL *URL = [NSURL URLWithString:URLString]; + return URL; +} + +- (BOOL)containsPostBody { + return YES; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = + [@{kGrantTypeKey : [[self class] grantTypeStringWithGrantType:_grantType]} mutableCopy]; + if (_scope) { + postBody[kScopeKey] = _scope; + } + if (_refreshToken) { + postBody[kRefreshTokenKey] = _refreshToken; + } + if (_code) { + postBody[kCodeKey] = _code; + } + return [postBody copy]; +} + +#pragma mark - Internal API for development + ++ (NSString *)host { + return gAPIHost; +} + ++ (void)setHost:(NSString *)host { + gAPIHost = host; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.h new file mode 100644 index 00000000..a45f9ad4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRSecureTokenResponse + @brief Represents the response from the token endpoint. + */ +@interface FIRSecureTokenResponse : NSObject + +/** @property approximateExpirationDate + @brief The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +/** @property refreshToken + @brief The refresh token. (Possibly an updated one for refresh requests.) + */ +@property(nonatomic, copy, readonly, nullable) NSString *refreshToken; + +/** @property accessToken + @brief The new access token. + */ +@property(nonatomic, copy, readonly, nullable) NSString *accessToken; + +/** @property IDToken + @brief The new ID Token. + */ +@property(nonatomic, copy, readonly, nullable) NSString *IDToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.m new file mode 100644 index 00000000..5d4c00ae --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.m @@ -0,0 +1,73 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.h" + +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kExpiresInKey + @brief The key for the number of seconds till the access token expires. + */ +static NSString *const kExpiresInKey = @"expires_in"; + +/** @var kRefreshTokenKey + @brief The key for the refresh token. + */ +static NSString *const kRefreshTokenKey = @"refresh_token"; + +/** @var kAccessTokenKey + @brief The key for the access token. + */ +static NSString *const kAccessTokenKey = @"access_token"; + +/** @var kIDTokenKey + @brief The key for the "id_token" value in the response. + */ +static NSString *const kIDTokenKey = @"id_token"; + +@implementation FIRSecureTokenResponse + +- (nullable NSString *)expectedKind { + return nil; +} + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _refreshToken = dictionary[kRefreshTokenKey]; + _accessToken = dictionary[kAccessTokenKey]; + _IDToken = dictionary[kIDTokenKey]; + if (!_accessToken.length) { + if (error) { + *error = [FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:dictionary]; + } + return NO; + } + id expiresIn = dictionary[kExpiresInKey]; + if (![expiresIn isKindOfClass:[NSString class]]) { + if (error) { + *error = [FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:dictionary]; + } + return NO; + } + + _approximateExpirationDate = [NSDate dateWithTimeIntervalSinceNow:[expiresIn doubleValue]]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.h new file mode 100644 index 00000000..974eb6a4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.h @@ -0,0 +1,64 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +@class FIRAuthAppCredential; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRSendVerificationCodeRequest : FIRIdentityToolkitRequest + +/** @property phoneNumber + @brief The phone number to which the verification code should be sent. + */ +@property(nonatomic, strong, readonly) NSString *phoneNumber; + +/** @property appCredential + @brief The credential to prove the identity of the app in order to send the verification code. + */ +@property(nonatomic, strong, readonly, nullable) FIRAuthAppCredential *appCredential; + +/** @property reCAPTCHAToken + @brief The reCAPTCHA token to prove the identity of the app in order to send the verification + code. + */ +@property(nonatomic, strong, readonly, nullable) NSString *reCAPTCHAToken; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithPhoneNumber:appCredentials:requestConfiguration: instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithPhoneNumber:appCredentials:requestConfiguration: + @brief Designated initializer. + @param phoneNumber The phone number to which the verification code is to be sent. + @param appCredential The credential that proves the identity of the app. + @param reCAPTCHAToken The reCAPTCHA token that proves the identity of the app. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithPhoneNumber:(NSString *)phoneNumber + appCredential:(nullable FIRAuthAppCredential *)appCredential + reCAPTCHAToken:(nullable NSString *)reCAPTCHAToken + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.m new file mode 100644 index 00000000..b0eb544d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.m @@ -0,0 +1,84 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeRequest.h" + +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kSendVerificationCodeEndPoint + @brief The "sendVerificationCodeEnd" endpoint. + */ +static NSString *const kSendVerificationCodeEndPoint = @"sendVerificationCode"; + +/** @var kPhoneNumberKey + @brief The key for the Phone Number parameter in the request. + */ +static NSString *const kPhoneNumberKey = @"phoneNumber"; + +/** @var kReceiptKey + @brief The key for the receipt parameter in the request. + */ +static NSString *const kReceiptKey = @"iosReceipt"; + +/** @var kSecretKey + @brief The key for the Secret parameter in the request. + */ +static NSString *const kSecretKey = @"iosSecret"; + +/** @var kreCAPTCHATokenKey + @brief The key for the reCAPTCHAToken parameter in the request. + */ +static NSString *const kreCAPTCHATokenKey = @"recaptchaToken"; + +@implementation FIRSendVerificationCodeRequest { +} + +- (nullable instancetype)initWithPhoneNumber:(NSString *)phoneNumber + appCredential:(nullable FIRAuthAppCredential *)appCredential + reCAPTCHAToken:(nullable NSString *)reCAPTCHAToken + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kSendVerificationCodeEndPoint + requestConfiguration:requestConfiguration]; + if (self) { + _phoneNumber = [phoneNumber copy]; + _appCredential = appCredential; + _reCAPTCHAToken = [reCAPTCHAToken copy]; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_phoneNumber) { + postBody[kPhoneNumberKey] = _phoneNumber; + } + if (_appCredential.receipt) { + postBody[kReceiptKey] = _appCredential.receipt; + } + if (_appCredential.secret) { + postBody[kSecretKey] = _appCredential.secret; + } + if (_reCAPTCHAToken) { + postBody[kreCAPTCHATokenKey] = _reCAPTCHAToken; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.h new file mode 100644 index 00000000..605f3f47 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.h @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRSendVerificationCodeResponse : NSObject + +/** @property verificationID + @brief Encrypted session information returned by the backend. + */ +@property(nonatomic, readonly) NSString *verificationID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.m new file mode 100644 index 00000000..6e8598cb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.m @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSendVerificationCodeResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRSendVerificationCodeResponse + +// TODO: remove when resolving b/37169084 . +- (nullable NSString *)expectedKind { + return nil; +} + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _verificationID = [dictionary[@"sessionInfo"] copy]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.h new file mode 100644 index 00000000..5ba22bae --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.h @@ -0,0 +1,151 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +@class FIRGetAccountInfoResponse; + +NS_ASSUME_NONNULL_BEGIN + +/** @var FIRSetAccountInfoUserAttributeEmail + @brief Constant for email attribute used in "deleteAttributes". + */ +extern NSString *const FIRSetAccountInfoUserAttributeEmail; + +/** @var FIRSetAccountInfoUserAttributeDisplayName + @brief Constant for displayName attribute used in "deleteAttributes". + */ +extern NSString *const FIRSetAccountInfoUserAttributeDisplayName; + +/** @var FIRSetAccountInfoUserAttributeProvider + @brief Constant for provider attribute used in "deleteAttributes". + */ +extern NSString *const FIRSetAccountInfoUserAttributeProvider; + +/** @var FIRSetAccountInfoUserAttributePhotoURL + @brief Constant for photoURL attribute used in "deleteAttributes". + */ +extern NSString *const FIRSetAccountInfoUserAttributePhotoURL; + +/** @var FIRSetAccountInfoUserAttributePassword + @brief Constant for password attribute used in "deleteAttributes". + */ +extern NSString *const FIRSetAccountInfoUserAttributePassword; + +/** @class FIRSetAccountInfoRequest + @brief Represents the parameters for the setAccountInfo endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/setAccountInfo + */ +@interface FIRSetAccountInfoRequest : FIRIdentityToolkitRequest + +/** @property accessToken + @brief The STS Access Token of the authenticated user. + */ +@property(nonatomic, copy, nullable) NSString *accessToken; + +/** @property displayName + @brief The name of the user. + */ +@property(nonatomic, copy, nullable) NSString *displayName; + +/** @property localID + @brief The local ID of the user. + */ +@property(nonatomic, copy, nullable) NSString *localID; + +/** @property email + @brief The email of the user. + */ +@property(nonatomic, copy, nullable) NSString *email; + +/** @property photoURL + @brief The photoURL of the user. + */ +@property(nonatomic, copy, nullable) NSURL *photoURL; + +/** @property password + @brief The new password of the user. + */ +@property(nonatomic, copy, nullable) NSString *password; + +/** @property providers + @brief The associated identity providers of the user. + */ +@property(nonatomic, copy, nullable) NSArray *providers; + +/** @property OOBCode + @brief The out-of-band code of the change email request. + */ +@property(nonatomic, copy, nullable) NSString *OOBCode; + +/** @property emailVerified + @brief Whether to mark the email as verified or not. + */ +@property(nonatomic, assign) BOOL emailVerified; + +/** @property upgradeToFederatedLogin + @brief Whether to mark the user to upgrade to federated login. + */ +@property(nonatomic, assign) BOOL upgradeToFederatedLogin; + +/** @property captchaChallenge + @brief The captcha challenge. + */ +@property(nonatomic, copy, nullable) NSString *captchaChallenge; + +/** @property captchaResponse + @brief Response to the captcha. + */ +@property(nonatomic, copy, nullable) NSString *captchaResponse; + +/** @property deleteAttributes + @brief The list of user attributes to delete. + @remarks Every element of the list must be one of the predefined constant starts with + "FIRSetAccountInfoUserAttribute". + */ +@property(nonatomic, copy, nullable) NSArray *deleteAttributes; + +/** @property deleteProviders + @brief The list of identity providers to delete. + */ +@property(nonatomic, copy, nullable) NSArray *deleteProviders; + +/** @property returnSecureToken + @brief Whether the response should return access token and refresh token directly. + @remarks The default value is @c YES . + */ +@property(nonatomic, assign) BOOL returnSecureToken; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithAPIKey:email:password:displayName:requestConfiguration instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithRequestConfiguration: + @brief Designated initializer. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithRequestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.m new file mode 100644 index 00000000..99415868 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.m @@ -0,0 +1,179 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.h" + +#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +NSString *const FIRSetAccountInfoUserAttributeEmail = @"EMAIL"; + +NSString *const FIRSetAccountInfoUserAttributeDisplayName = @"DISPLAY_NAME"; + +NSString *const FIRSetAccountInfoUserAttributeProvider = @"PROVIDER"; + +NSString *const FIRSetAccountInfoUserAttributePhotoURL = @"PHOTO_URL"; + +NSString *const FIRSetAccountInfoUserAttributePassword = @"PASSWORD"; + +/** @var kCreateAuthURIEndpoint + @brief The "setAccountInfo" endpoint. + */ +static NSString *const kSetAccountInfoEndpoint = @"setAccountInfo"; + +/** @var kIDTokenKey + @brief The key for the "idToken" value in the request. This is actually the STS Access Token, + despite it's confusing (backwards compatiable) parameter name. + */ +static NSString *const kIDTokenKey = @"idToken"; + +/** @var kDisplayNameKey + @brief The key for the "displayName" value in the request. + */ +static NSString *const kDisplayNameKey = @"displayName"; + +/** @var kLocalIDKey + @brief The key for the "localID" value in the request. + */ +static NSString *const kLocalIDKey = @"localId"; + +/** @var kEmailKey + @brief The key for the "email" value in the request. + */ +static NSString *const kEmailKey = @"email"; + +/** @var kPasswordKey + @brief The key for the "password" value in the request. + */ +static NSString *const kPasswordKey = @"password"; + +/** @var kPhotoURLKey + @brief The key for the "photoURL" value in the request. + */ +static NSString *const kPhotoURLKey = @"photoUrl"; + +/** @var kProvidersKey + @brief The key for the "providers" value in the request. + */ +static NSString *const kProvidersKey = @"provider"; + +/** @var kOOBCodeKey + @brief The key for the "OOBCode" value in the request. + */ +static NSString *const kOOBCodeKey = @"oobCode"; + +/** @var kEmailVerifiedKey + @brief The key for the "emailVerified" value in the request. + */ +static NSString *const kEmailVerifiedKey = @"emailVerified"; + +/** @var kUpgradeToFederatedLoginKey + @brief The key for the "upgradeToFederatedLogin" value in the request. + */ +static NSString *const kUpgradeToFederatedLoginKey = @"upgradeToFederatedLogin"; + +/** @var kCaptchaChallengeKey + @brief The key for the "captchaChallenge" value in the request. + */ +static NSString *const kCaptchaChallengeKey = @"captchaChallenge"; + +/** @var kCaptchaResponseKey + @brief The key for the "captchaResponse" value in the request. + */ +static NSString *const kCaptchaResponseKey = @"captchaResponse"; + +/** @var kDeleteAttributesKey + @brief The key for the "deleteAttribute" value in the request. + */ +static NSString *const kDeleteAttributesKey = @"deleteAttribute"; + +/** @var kDeleteProvidersKey + @brief The key for the "deleteProvider" value in the request. + */ +static NSString *const kDeleteProvidersKey = @"deleteProvider"; + +/** @var kReturnSecureTokenKey + @brief The key for the "returnSecureToken" value in the request. + */ +static NSString *const kReturnSecureTokenKey = @"returnSecureToken"; + +@implementation FIRSetAccountInfoRequest + +- (nullable instancetype)initWithRequestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kSetAccountInfoEndpoint requestConfiguration:requestConfiguration]; + if (self) { + _returnSecureToken = YES; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_accessToken) { + postBody[kIDTokenKey] = _accessToken; + } + if (_displayName) { + postBody[kDisplayNameKey] = _displayName; + } + if (_localID) { + postBody[kLocalIDKey] = _localID; + } + if (_email) { + postBody[kEmailKey] = _email; + } + if (_password) { + postBody[kPasswordKey] = _password; + } + if (_photoURL) { + postBody[kPhotoURLKey] = _photoURL.absoluteString; + } + if (_providers) { + postBody[kProvidersKey] = _providers; + } + if (_OOBCode) { + postBody[kOOBCodeKey] = _OOBCode; + } + if (_emailVerified) { + postBody[kEmailVerifiedKey] = @YES; + } + if (_upgradeToFederatedLogin) { + postBody[kUpgradeToFederatedLoginKey] = @YES; + } + if (_captchaChallenge) { + postBody[kCaptchaChallengeKey] = _captchaChallenge; + } + if (_captchaResponse) { + postBody[kCaptchaResponseKey] = _captchaResponse; + } + if (_deleteAttributes) { + postBody[kDeleteAttributesKey] = _deleteAttributes; + } + if (_deleteProviders) { + postBody[kDeleteProvidersKey] = _deleteProviders; + } + if (_returnSecureToken) { + postBody[kReturnSecureTokenKey] = @YES; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.h new file mode 100644 index 00000000..9e309304 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.h @@ -0,0 +1,98 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRSetAccountInfoResponseProviderUserInfo + @brief Represents the provider user info part of the response from the setAccountInfo endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/setAccountInfo + */ +@interface FIRSetAccountInfoResponseProviderUserInfo : NSObject + +/** @property providerID + @brief The ID of the identity provider. + */ +@property(nonatomic, strong, readonly, nullable) NSString *providerID; + +/** @property displayName + @brief The user's display name at the identity provider. + */ +@property(nonatomic, strong, readonly, nullable) NSString *displayName; + +/** @property photoURL + @brief The user's photo URL at the identity provider. + */ +@property(nonatomic, strong, readonly, nullable) NSURL *photoURL; + +/** @fn init + @brief Please use initWithDictionary: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithAPIKey: + @brief Designated initializer. + @param dictionary The provider user info data from endpoint. + */ +- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER; + +@end + +/** @class FIRSetAccountInfoResponse + @brief Represents the response from the setAccountInfo endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/setAccountInfo + */ +@interface FIRSetAccountInfoResponse : NSObject + +/** @property email + @brief The email or the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *email; + +/** @property displayName + @brief The display name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *displayName; + +/** @property providerUserInfo + @brief The user's profiles at the associated identity providers. + */ +@property(nonatomic, strong, readonly, nullable) + NSArray *providerUserInfo; + +/** @property IDToken + @brief Either an authorization code suitable for performing an STS token exchange, or the + access token from Secure Token Service, depending on whether @c returnSecureToken is set + on the request. + */ +@property(nonatomic, strong, readonly, nullable) NSString *IDToken; + +/** @property approximateExpirationDate + @brief The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +/** @property refreshToken + @brief The refresh token from Secure Token Service. + */ +@property(nonatomic, strong, readonly, nullable) NSString *refreshToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.m new file mode 100644 index 00000000..138fba3e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.m @@ -0,0 +1,64 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRSetAccountInfoResponseProviderUserInfo + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + self = [super init]; + if (self) { + _providerID = [dictionary[@"providerId"] copy]; + _displayName = [dictionary[@"displayName"] copy]; + NSString *photoURL = dictionary[@"photoUrl"]; + if (photoURL) { + _photoURL = [NSURL URLWithString:photoURL]; + } + } + return self; +} + +@end + +@implementation FIRSetAccountInfoResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _email = [dictionary[@"email"] copy]; + _displayName = [dictionary[@"displayName"] copy]; + _IDToken = [dictionary[@"idToken"] copy]; + _approximateExpirationDate = + [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] + : nil; + _refreshToken = [dictionary[@"refreshToken"] copy]; + NSArray *providerUserInfoData = dictionary[@"providerUserInfo"]; + if (providerUserInfoData) { + NSMutableArray *providerUserInfoArray = + [NSMutableArray arrayWithCapacity:providerUserInfoData.count]; + for (NSDictionary *dictionary in providerUserInfoData) { + [providerUserInfoArray addObject:[[FIRSetAccountInfoResponseProviderUserInfo alloc] + initWithDictionary:dictionary]]; + } + _providerUserInfo = [providerUserInfoArray copy]; + } + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.h new file mode 100644 index 00000000..781d63a2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.h @@ -0,0 +1,91 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRSignInWithGameCenterRequest + @brief The request to sign in with Game Center account + */ +@interface FIRSignInWithGameCenterRequest : FIRIdentityToolkitRequest + +/** @property playerID + @brief The playerID to verify. + */ +@property(nonatomic, copy) NSString *playerID; + +/** @property publicKeyURL + @brief The URL for the public encryption key. + */ +@property(nonatomic, copy) NSURL *publicKeyURL; + +/** @property signature + @brief The verification signature data generated by Game Center. + */ +@property(nonatomic, copy) NSData *signature; + +/** @property salt + @brief A random strong used to compute the hash and keep it randomized. + */ +@property(nonatomic, copy) NSData *salt; + +/** @property timestamp + @brief The date and time that the signature was created. + */ +@property(nonatomic, assign) uint64_t timestamp; + +/** @property accessToken + @brief The STS Access Token for the authenticated user, only needed for linking the user. + */ +@property(nonatomic, copy, nullable) NSString *accessToken; + +/** @property displayName + @brief The display name of the local Game Center player. + */ +@property(nonatomic, copy, nullable) NSString *displayName; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithPlayerID:publicKeyURL:signature:salt:timestamp:requestConfiguration:. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithPlayerID:publicKeyURL:signature:salt:timestamp:displayName:requestConfiguration: + @brief Designated initializer. + @param playerID The ID of the Game Center player. + @param publicKeyURL The URL for the public encryption key. + @param signature The verification signature generated. + @param salt A random string used to compute the hash and keep it randomized. + @param timestamp The date and time that the signature was created. + @param displayName The display name of the Game Center player. + */ +- (nullable instancetype)initWithPlayerID:(NSString *)playerID + publicKeyURL:(NSURL *)publicKeyURL + signature:(NSData *)signature + salt:(NSData *)salt + timestamp:(uint64_t)timestamp + displayName:(NSString *)displayName + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.m new file mode 100644 index 00000000..864b9696 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.m @@ -0,0 +1,80 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.h" + +#import "FirebaseAuth/Sources/Utilities/NSData+FIRBase64.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kSignInWithGameCenterEndPoint + @brief The "SignInWithGameCenter" endpoint. + */ +static NSString *const kSignInWithGameCenterEndPoint = @"signInWithGameCenter"; + +@implementation FIRSignInWithGameCenterRequest + +- (nullable instancetype)initWithPlayerID:(NSString *)playerID + publicKeyURL:(NSURL *)publicKeyURL + signature:(NSData *)signature + salt:(NSData *)salt + timestamp:(uint64_t)timestamp + displayName:(NSString *)displayName + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kSignInWithGameCenterEndPoint + requestConfiguration:requestConfiguration]; + if (self) { + _playerID = playerID; + _publicKeyURL = [publicKeyURL copy]; + _signature = [signature copy]; + _salt = [salt copy]; + _timestamp = timestamp; + _displayName = displayName; + } + return self; +} + +#pragma mark - FIRAuthRPCRequest + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_playerID) { + postBody[@"playerId"] = _playerID; + } + if (_publicKeyURL) { + postBody[@"publicKeyUrl"] = _publicKeyURL.absoluteString; + } + if (_signature) { + postBody[@"signature"] = [_signature fir_base64URLEncodedStringWithOptions:0]; + } + if (_salt) { + postBody[@"salt"] = [_salt fir_base64URLEncodedStringWithOptions:0]; + } + if (_timestamp != 0) { + postBody[@"timestamp"] = [NSNumber numberWithUnsignedLongLong:_timestamp]; + } + if (_accessToken) { + postBody[@"idToken"] = _accessToken; + } + if (_displayName) { + postBody[@"displayName"] = _displayName; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.h new file mode 100644 index 00000000..ee07b3e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.h @@ -0,0 +1,64 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRSignInWithGameCenterResponse : NSObject + +/** @property IDToken + @breif Either an authorization code suitable for performing an STS token exchange, or the access + token from Secure Token Service, depending on whether @c returnSecureToken is set on the + request. + */ +@property(nonatomic, copy, readonly, nullable) NSString *IDToken; + +/** @property refreshToken + @breif @breif The refresh token from Secure Token Service. + */ +@property(nonatomic, copy, readonly, nullable) NSString *refreshToken; + +/** @property localID + @breif @breif The Firebase Auth user ID. + */ +@property(nonatomic, copy, readonly, nullable) NSString *localID; + +/** @property playerID + @breif @breif The verified player ID. + */ +@property(nonatomic, copy, readonly, nullable) NSString *playerID; + +/** @property approximateExpirationDate + @breif The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +/** @property isNewUser + @breif Flag indicating that the user signing in is a new user and not a returning user. + */ +@property(nonatomic, assign) BOOL isNewUser; + +/** @property displayName + @breif The user's Game Center display name. + */ +@property(nonatomic, copy, readonly, nullable) NSString *displayName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.m new file mode 100644 index 00000000..ebad3158 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.m @@ -0,0 +1,40 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRSignInWithGameCenterResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _IDToken = [dictionary[@"idToken"] copy]; + _refreshToken = [dictionary[@"refreshToken"] copy]; + _localID = [dictionary[@"localId"] copy]; + _approximateExpirationDate = nil; + if ([dictionary[@"expiresIn"] isKindOfClass:[NSString class]]) { + _approximateExpirationDate = + [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] integerValue]]; + } + _playerID = [dictionary[@"playerId"] copy]; + _isNewUser = [dictionary[@"isNewUser"] boolValue]; + _displayName = [dictionary[@"displayName"] copy]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.h new file mode 100644 index 00000000..070290d0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.h @@ -0,0 +1,72 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRSignUpNewUserRequest : FIRIdentityToolkitRequest + +/** @property email + @brief The email of the user. + */ +@property(nonatomic, copy, nullable) NSString *email; + +/** @property password + @brief The password inputed by the user. + */ +@property(nonatomic, copy, nullable) NSString *password; + +/** @property displayName + @brief The password inputed by the user. + */ +@property(nonatomic, copy, nullable) NSString *displayName; + +/** @property returnSecureToken + @brief Whether the response should return access token and refresh token directly. + @remarks The default value is @c YES . + */ +@property(nonatomic, assign) BOOL returnSecureToken; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithAPIKey:email:password:displayName:requestConfiguration instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithEndpoint:requestConfiguration: + @brief initializer for anonymous sign-in. + */ +- (nullable instancetype)initWithRequestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration; + +/** @fn initWithAPIKey:email:password:displayName:requestConfiguration + @brief Designated initializer. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithEmail:(nullable NSString *)email + password:(nullable NSString *)password + displayName:(nullable NSString *)displayName + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.m new file mode 100644 index 00000000..548ca932 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.m @@ -0,0 +1,90 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kSignupNewUserEndpoint + @brief The "SingupNewUserEndpoint" endpoint. + */ +static NSString *const kSignupNewUserEndpoint = @"signupNewUser"; + +/** @var kEmailKey + @brief The key for the "email" value in the request. + */ +static NSString *const kEmailKey = @"email"; + +/** @var kPasswordKey + @brief The key for the "password" value in the request. + */ +static NSString *const kPasswordKey = @"password"; + +/** @var kDisplayNameKey + @brief The key for the "kDisplayName" value in the request. + */ +static NSString *const kDisplayNameKey = @"displayName"; + +/** @var kReturnSecureTokenKey + @brief The key for the "returnSecureToken" value in the request. + */ +static NSString *const kReturnSecureTokenKey = @"returnSecureToken"; + +@implementation FIRSignUpNewUserRequest + +- (nullable instancetype)initWithEmail:(nullable NSString *)email + password:(nullable NSString *)password + displayName:(nullable NSString *)displayName + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kSignupNewUserEndpoint requestConfiguration:requestConfiguration]; + if (self) { + _email = [email copy]; + _password = [password copy]; + _displayName = [displayName copy]; + _returnSecureToken = YES; + } + return self; +} + +- (nullable instancetype)initWithRequestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration { + self = [self initWithEmail:nil + password:nil + displayName:nil + requestConfiguration:requestConfiguration]; + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_email) { + postBody[kEmailKey] = _email; + } + if (_password) { + postBody[kPasswordKey] = _password; + } + if (_displayName) { + postBody[kDisplayNameKey] = _displayName; + } + if (_returnSecureToken) { + postBody[kReturnSecureTokenKey] = @YES; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.h new file mode 100644 index 00000000..f2e74f6a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.h @@ -0,0 +1,44 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRSignUpNewUserResponse : NSObject + +/** @property IDToken + @brief Either an authorization code suitable for performing an STS token exchange, or the + access token from Secure Token Service, depending on whether @c returnSecureToken is set + on the request. + */ +@property(nonatomic, strong, readonly, nullable) NSString *IDToken; + +/** @property approximateExpirationDate + @brief The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +/** @property refreshToken + @brief The refresh token from Secure Token Service. + */ +@property(nonatomic, strong, readonly, nullable) NSString *refreshToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.m new file mode 100644 index 00000000..bdfa6d56 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.m @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignUpNewUserResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRSignUpNewUserResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _IDToken = [dictionary[@"idToken"] copy]; + _approximateExpirationDate = + [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] + : nil; + _refreshToken = [dictionary[@"refreshToken"] copy]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h new file mode 100644 index 00000000..0a1aa370 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h @@ -0,0 +1,118 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRVerifyAssertionRequest + @brief Represents the parameters for the verifyAssertion endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/verifyAssertion + */ +@interface FIRVerifyAssertionRequest : FIRIdentityToolkitRequest + +/** @property requestURI + @brief The URI to which the IDP redirects the user back. It may contain federated login result + params added by the IDP. + */ +@property(nonatomic, copy, nullable) NSString *requestURI; + +/** @property pendingToken + @brief The Firebase ID Token for the IDP pending to be confirmed by the user. + */ +@property(nonatomic, copy, nullable) NSString *pendingToken; + +/** @property accessToken + @brief The STS Access Token for the authenticated user, only needed for linking the user. + */ +@property(nonatomic, copy, nullable) NSString *accessToken; + +/** @property returnSecureToken + @brief Whether the response should return access token and refresh token directly. + @remarks The default value is @c YES . + */ +@property(nonatomic, assign) BOOL returnSecureToken; + +#pragma mark - Components of "postBody" + +/** @property providerID + @brief The ID of the IDP whose credentials are being presented to the endpoint. + */ +@property(nonatomic, copy, readonly) NSString *providerID; + +/** @property providerAccessToken + @brief An access token from the IDP. + */ +@property(nonatomic, copy, nullable) NSString *providerAccessToken; + +/** @property providerIDToken + @brief An ID Token from the IDP. + */ +@property(nonatomic, copy, nullable) NSString *providerIDToken; + +/** @property providerRawNonce + @brief An raw nonce from the IDP. + */ +@property(nonatomic, copy, nullable) NSString *providerRawNonce; + +/** @property returnIDPCredential + @brief Whether the response should return the IDP credential directly. + */ +@property(nonatomic, assign) BOOL returnIDPCredential; + +/** @property providerOAuthTokenSecret + @brief A session ID used to map this request to a headful-lite flow. + */ +@property(nonatomic, copy, nullable) NSString *sessionID; + +/** @property providerOAuthTokenSecret + @brief An OAuth client secret from the IDP. + */ +@property(nonatomic, copy, nullable) NSString *providerOAuthTokenSecret; + +/** @property inputEmail + @brief The originally entered email in the UI. + */ +@property(nonatomic, copy, nullable) NSString *inputEmail; + +/** @property autoCreate + @brief A flag that indicates whether or not the user should be automatically created. + */ +@property(nonatomic, assign) BOOL autoCreate; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithProviderID:requestConfifuration instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithProviderID:requestConfifuration + @brief Designated initializer. + @param providerID The auth provider's ID. + @param requestConfiguration An object containing configurations to be added to the request. + + */ +- (nullable instancetype)initWithProviderID:(NSString *)providerID + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.m new file mode 100644 index 00000000..2b530518 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.m @@ -0,0 +1,177 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kVerifyAssertionEndpoint + @brief The "verifyAssertion" endpoint. + */ +static NSString *const kVerifyAssertionEndpoint = @"verifyAssertion"; + +/** @var kProviderIDKey + @brief The key for the "providerId" value in the request. + */ +static NSString *const kProviderIDKey = @"providerId"; + +/** @var kProviderIDTokenKey + @brief The key for the "id_token" value in the request. + */ +static NSString *const kProviderIDTokenKey = @"id_token"; + +/** @var kProviderNonceKey + @brief The key for the "nonce" value in the request. + */ +static NSString *const kProviderNonceKey = @"nonce"; + +/** @var kProviderAccessTokenKey + @brief The key for the "access_token" value in the request. + */ +static NSString *const kProviderAccessTokenKey = @"access_token"; + +/** @var kProviderOAuthTokenSecretKey + @brief The key for the "oauth_token_secret" value in the request. + */ +static NSString *const kProviderOAuthTokenSecretKey = @"oauth_token_secret"; + +/** @var kIdentifierKey + @brief The key for the "identifier" value in the request. + */ +static NSString *const kIdentifierKey = @"identifier"; + +/** @var kRequestURIKey + @brief The key for the "requestUri" value in the request. + */ +static NSString *const kRequestURIKey = @"requestUri"; + +/** @var kPostBodyKey + @brief The key for the "postBody" value in the request. + */ +static NSString *const kPostBodyKey = @"postBody"; + +/** @var kPendingTokenKey + @brief The key for the "pendingToken" value in the request. + */ +static NSString *const kPendingTokenKey = @"pendingToken"; + +/** @var kAutoCreateKey + @brief The key for the "autoCreate" value in the request. + */ +static NSString *const kAutoCreateKey = @"autoCreate"; + +/** @var kIDTokenKey + @brief The key for the "idToken" value in the request. This is actually the STS Access Token, + despite it's confusing (backwards compatiable) parameter name. + */ +static NSString *const kIDTokenKey = @"idToken"; + +/** @var kReturnSecureTokenKey + @brief The key for the "returnSecureToken" value in the request. + */ +static NSString *const kReturnSecureTokenKey = @"returnSecureToken"; + +/** @var kReturnIDPCredentialKey + @brief The key for the "returnIdpCredential" value in the request. + */ +static NSString *const kReturnIDPCredentialKey = @"returnIdpCredential"; + +/** @var kSessionIDKey + @brief The key for the "sessionID" value in the request. + */ +static NSString *const kSessionIDKey = @"sessionId"; + +@implementation FIRVerifyAssertionRequest + +- (nullable instancetype)initWithProviderID:(NSString *)providerID + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kVerifyAssertionEndpoint + requestConfiguration:requestConfiguration]; + if (self) { + _providerID = providerID; + _returnSecureToken = YES; + _autoCreate = YES; + _returnIDPCredential = YES; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSURLComponents *components = [[NSURLComponents alloc] init]; + NSMutableArray *queryItems = + [@[ [NSURLQueryItem queryItemWithName:kProviderIDKey value:_providerID] ] mutableCopy]; + + if (_providerIDToken) { + [queryItems addObject:[NSURLQueryItem queryItemWithName:kProviderIDTokenKey + value:_providerIDToken]]; + } + + if (_providerRawNonce) { + [queryItems addObject:[NSURLQueryItem queryItemWithName:kProviderNonceKey + value:_providerRawNonce]]; + } + + if (_providerAccessToken) { + [queryItems addObject:[NSURLQueryItem queryItemWithName:kProviderAccessTokenKey + value:_providerAccessToken]]; + } + + if (!_providerIDToken && !_providerAccessToken && !_pendingToken && !_requestURI) { + [NSException + raise:NSInvalidArgumentException + format:@"One of IDToken, accessToken, pendingToken, or requestURI must be supplied."]; + } + + if (_providerOAuthTokenSecret) { + [queryItems addObject:[NSURLQueryItem queryItemWithName:kProviderOAuthTokenSecretKey + value:_providerOAuthTokenSecret]]; + } + + if (_inputEmail) { + [queryItems addObject:[NSURLQueryItem queryItemWithName:kIdentifierKey value:_inputEmail]]; + } + [components setQueryItems:queryItems]; + NSMutableDictionary *body = [@{ + kRequestURIKey : _requestURI ?: @"http://localhost", // Unused by server, but required + kPostBodyKey : [components query] + } mutableCopy]; + + if (_pendingToken) { + body[kPendingTokenKey] = _pendingToken; + } + if (_accessToken) { + body[kIDTokenKey] = _accessToken; + } + if (_returnSecureToken) { + body[kReturnSecureTokenKey] = @YES; + } + + if (_returnIDPCredential) { + body[kReturnIDPCredentialKey] = @YES; + } + + if (_sessionID) { + body[kSessionIDKey] = _sessionID; + } + + body[kAutoCreateKey] = @(_autoCreate); + + return body; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h new file mode 100644 index 00000000..d739467b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h @@ -0,0 +1,214 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRVerifyAssertionResponse + @brief Represents the response from the verifyAssertion endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/verifyAssertion + */ +@interface FIRVerifyAssertionResponse : NSObject + +/** @property federatedID + @brief The unique ID identifies the IdP account. + */ +@property(nonatomic, strong, readonly, nullable) NSString *federatedID; + +/** @property providerID + @brief The IdP ID. For white listed IdPs it's a short domain name e.g. google.com, aol.com, + live.net and yahoo.com. If the "providerId" param is set to OpenID OP identifer other than + the whilte listed IdPs the OP identifier is returned. If the "identifier" param is federated + ID in the createAuthUri request. The domain part of the federated ID is returned. + */ +@property(nonatomic, strong, readonly, nullable) NSString *providerID; + +/** @property localID + @brief The RP local ID if it's already been mapped to the IdP account identified by the + federated ID. + */ +@property(nonatomic, strong, readonly, nullable) NSString *localID; + +/** @property email + @brief The email returned by the IdP. NOTE: The federated login user may not own the email. + */ +@property(nonatomic, strong, readonly, nullable) NSString *email; + +/** @property inputEmail + @brief It's the identifier param in the createAuthUri request if the identifier is an email. It + can be used to check whether the user input email is different from the asserted email. + */ +@property(nonatomic, strong, readonly, nullable) NSString *inputEmail; + +/** @property originalEmail + @brief The original email stored in the mapping storage. It's returned when the federated ID is + associated to a different email. + */ +@property(nonatomic, strong, readonly, nullable) NSString *originalEmail; + +/** @property oauthRequestToken + @brief The user approved request token for the OpenID OAuth extension. + */ +@property(nonatomic, strong, readonly, nullable) NSString *oauthRequestToken; + +/** @property oauthScope + @brief The scope for the OpenID OAuth extension. + */ +@property(nonatomic, strong, readonly, nullable) NSString *oauthScope; + +/** @property firstName + @brief The first name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *firstName; + +/** @property lastName + @brief The last name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *lastName; + +/** @property fullName + @brief The full name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *fullName; + +/** @property nickName + @brief The nick name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *nickName; + +/** @property displayName + @brief The display name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *displayName; + +/** @property IDToken + @brief Either an authorization code suitable for performing an STS token exchange, or the + access token from Secure Token Service, depending on whether @c returnSecureToken is set + on the request. + */ +@property(nonatomic, strong, readonly, nullable) NSString *IDToken; + +/** @property approximateExpirationDate + @brief The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +/** @property refreshToken + @brief The refresh token from Secure Token Service. + */ +@property(nonatomic, strong, readonly, nullable) NSString *refreshToken; + +/** @property action + @brief The action code. + */ +@property(nonatomic, strong, readonly, nullable) NSString *action; + +/** @property language + @brief The language preference of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *language; + +/** @property timeZone + @brief The timezone of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *timeZone; + +/** @property photoURL + @brief The URI of the public accessible profile picture. + */ +@property(nonatomic, strong, readonly, nullable) NSURL *photoURL; + +/** @property dateOfBirth + @brief The birth date of the IdP account. + */ +@property(nonatomic, strong, readonly, nullable) NSString *dateOfBirth; + +/** @property context + @brief The opaque value used by the client to maintain context info between the authentication + request and the IDP callback. + */ +@property(nonatomic, strong, readonly, nullable) NSString *context; + +/** @property verifiedProvider + @brief When action is 'map', contains the idps which can be used for confirmation. + */ +@property(nonatomic, strong, readonly, nullable) NSArray *verifiedProvider; + +/** @property needConfirmation + @brief Whether the assertion is from a non-trusted IDP and need account linking confirmation. + */ +@property(nonatomic, assign) BOOL needConfirmation; + +/** @property emailRecycled + @brief It's true if the email is recycled. + */ +@property(nonatomic, assign) BOOL emailRecycled; + +/** @property emailVerified + @brief The value is true if the IDP is also the email provider. It means the user owns the + email. + */ +@property(nonatomic, assign) BOOL emailVerified; + +/** @property isNewUser + @brief Flag indicating that the user signing in is a new user and not a returning user. + */ +@property(nonatomic, assign) BOOL isNewUser; + +/** @property profile + @brief Dictionary containing the additional IdP specific information. + */ +@property(nonatomic, readonly, nullable) NSDictionary *profile; + +/** @property username + @brief The name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *username; + +/** @property oauthIDToken + @brief The ID token for the OpenID OAuth extension. + */ +@property(nonatomic, strong, readonly, nullable) NSString *oauthIDToken; + +/** @property oauthExpirationDate + @brief The approximate expiration date of the oauth access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *oauthExpirationDate; + +/** @property oauthAccessToken + @brief The access token for the OpenID OAuth extension. + */ +@property(nonatomic, strong, readonly, nullable) NSString *oauthAccessToken; + +/** @property oauthSecretToken + @brief The secret for the OpenID OAuth extention. + */ +@property(nonatomic, readonly, nullable) NSString *oauthSecretToken; + +/** @property pendingToken + @brief The pending ID Token string. + */ +@property(nonatomic, copy, nullable) NSString *pendingToken; + +@property(nonatomic, strong, readonly, nullable) NSString *MFAPendingCredential; + +@property(nonatomic, strong, readonly, nullable) NSArray *MFAInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.m new file mode 100644 index 00000000..6c605e74 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.m @@ -0,0 +1,100 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRVerifyAssertionResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _federatedID = [dictionary[@"federatedId"] copy]; + _providerID = [dictionary[@"providerId"] copy]; + _localID = [dictionary[@"localId"] copy]; + _emailRecycled = [dictionary[@"emailRecycled"] boolValue]; + _emailVerified = [dictionary[@"emailVerified"] boolValue]; + _email = [dictionary[@"email"] copy]; + _inputEmail = [dictionary[@"inputEmail"] copy]; + _originalEmail = [dictionary[@"originalEmail"] copy]; + _oauthRequestToken = [dictionary[@"oauthRequestToken"] copy]; + _oauthScope = [dictionary[@"oauthScope"] copy]; + _firstName = [dictionary[@"firstName"] copy]; + _lastName = [dictionary[@"lastName"] copy]; + _fullName = [dictionary[@"fullName"] copy]; + _nickName = [dictionary[@"nickName"] copy]; + _displayName = [dictionary[@"displayName"] copy]; + _IDToken = [dictionary[@"idToken"] copy]; + _approximateExpirationDate = + [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] + : nil; + _refreshToken = [dictionary[@"refreshToken"] copy]; + _isNewUser = [dictionary[@"isNewUser"] boolValue]; + id rawUserInfo = dictionary[@"rawUserInfo"]; + if ([rawUserInfo isKindOfClass:[NSString class]]) { + NSData *data = [rawUserInfo dataUsingEncoding:NSUTF8StringEncoding]; + rawUserInfo = [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingMutableLeaves + error:nil]; + } + if ([rawUserInfo isKindOfClass:[NSDictionary class]]) { + _profile = [[NSDictionary alloc] initWithDictionary:rawUserInfo copyItems:YES]; + } + _username = [dictionary[@"username"] copy]; + _action = [dictionary[@"action"] copy]; + _language = [dictionary[@"language"] copy]; + _timeZone = [dictionary[@"timeZone"] copy]; + _photoURL = dictionary[@"photoUrl"] ? [NSURL URLWithString:dictionary[@"photoUrl"]] : nil; + _dateOfBirth = [dictionary[@"dateOfBirth"] copy]; + _context = [dictionary[@"context"] copy]; + _needConfirmation = [dictionary[@"needConfirmation"] boolValue]; + id verifiedProvider = dictionary[@"verifiedProvider"]; + if ([verifiedProvider isKindOfClass:[NSString class]]) { + NSData *data = [verifiedProvider dataUsingEncoding:NSUTF8StringEncoding]; + verifiedProvider = [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingMutableLeaves + error:nil]; + } + if ([verifiedProvider isKindOfClass:[NSArray class]]) { + _verifiedProvider = [[NSArray alloc] initWithArray:verifiedProvider copyItems:YES]; + } + _oauthIDToken = [dictionary[@"oauthIdToken"] copy]; + _oauthExpirationDate = + [dictionary[@"oauthExpireIn"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"oauthExpireIn"] doubleValue]] + : nil; + _oauthAccessToken = [dictionary[@"oauthAccessToken"] copy]; + _oauthSecretToken = [dictionary[@"oauthTokenSecret"] copy]; + _pendingToken = [dictionary[@"pendingToken"] copy]; + + if (dictionary[@"mfaInfo"] != nil) { + NSMutableArray *MFAInfo = [NSMutableArray array]; + NSArray *MFAInfoDataArray = dictionary[@"mfaInfo"]; + for (NSDictionary *MFAInfoData in MFAInfoDataArray) { + FIRAuthProtoMFAEnrollment *MFAEnrollment = + [[FIRAuthProtoMFAEnrollment alloc] initWithDictionary:MFAInfoData]; + [MFAInfo addObject:MFAEnrollment]; + } + _MFAInfo = MFAInfo; + } + _MFAPendingCredential = [dictionary[@"mfaPendingCredential"] copy]; + + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.h new file mode 100644 index 00000000..7b4d3bc9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.h @@ -0,0 +1,55 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRVerifyClientRequest : FIRIdentityToolkitRequest + +/** @property appToken + @brief The APNS device token. + */ +@property(nonatomic, readonly, nullable) NSString *appToken; + +/** @property isSandbox + @brief The flag that denotes if the appToken pertains to Sandbox or Production. + */ +@property(nonatomic, assign, readonly) BOOL isSandbox; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithToken:requestConfiguration: instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithAppToken:isSandbox:requestConfiguration: + @brief Designated initializer. + @param appToken The APNS device token. + @param isSandbox The flag indicating whether or not the app token provided is for Sandbox or + Production. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithAppToken:(nullable NSString *)appToken + isSandbox:(BOOL)isSandbox + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.m new file mode 100644 index 00000000..02e984cc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.m @@ -0,0 +1,62 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kVerifyClientEndpoint + @brief The endpoint for the verifyClient request. + */ +static NSString *const kVerifyClientEndpoint = @"verifyClient"; + +/** @var kAppTokenKey + @brief The key for the appToken request paramenter. + */ +static NSString *const kAPPTokenKey = @"appToken"; + +/** @var kIsSandboxKey + @brief The key for the isSandbox request parameter + */ +static NSString *const kIsSandboxKey = @"isSandbox"; + +@implementation FIRVerifyClientRequest + +- (nullable instancetype)initWithAppToken:(nullable NSString *)appToken + isSandbox:(BOOL)isSandbox + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kVerifyClientEndpoint requestConfiguration:requestConfiguration]; + if (self) { + _appToken = appToken; + _isSandbox = isSandbox; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_appToken) { + postBody[kAPPTokenKey] = _appToken; + } + if (_isSandbox) { + postBody[kIsSandboxKey] = @YES; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.h new file mode 100644 index 00000000..40e69072 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRVerifyClientResponse : NSObject + +/** @property receipt + @brief Receipt that the APNS token was successfully validated with APNS. + */ +@property(nonatomic, copy, readonly, nullable) NSString *receipt; + +/** @property suggestedTimeOut + @brief The date after which delivery of the silent push notification is considered to have + failed. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *suggestedTimeOutDate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.m new file mode 100644 index 00000000..78d648c5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.m @@ -0,0 +1,34 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyClientResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRVerifyClientResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _receipt = dictionary[@"receipt"]; + _suggestedTimeOutDate = + [dictionary[@"suggestedTimeout"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"suggestedTimeout"] doubleValue]] + : nil; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.h new file mode 100644 index 00000000..abea35af --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.h @@ -0,0 +1,58 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRVerifyCustomTokenRequest + @brief Represents the parameters for the verifyCustomToken endpoint. + */ +@interface FIRVerifyCustomTokenRequest : FIRIdentityToolkitRequest + +/** @property token + @brief The self-signed token from the client's BYOAuth server. + */ +@property(nonatomic, copy, readonly) NSString *token; + +/** @property returnSecureToken + @brief Whether the response should return access token and refresh token directly. + @remarks The default value is @c YES . + */ +@property(nonatomic, assign) BOOL returnSecureToken; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithToken:requestConfiguration: instead. + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithToken:requestConfiguration: + @brief Designated initializer. + @param token The self-signed token from the client's BYOAuth server. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithToken:(NSString *)token + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.m new file mode 100644 index 00000000..63c81f61 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.m @@ -0,0 +1,59 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kVerifyCustomTokenEndpoint + @brief The "verifyPassword" endpoint. + */ +static NSString *const kVerifyCustomTokenEndpoint = @"verifyCustomToken"; + +/** @var kTokenKey + @brief The key for the "token" value in the request. + */ +static NSString *const kTokenKey = @"token"; + +/** @var kReturnSecureTokenKey + @brief The key for the "returnSecureToken" value in the request. + */ +static NSString *const kReturnSecureTokenKey = @"returnSecureToken"; + +@implementation FIRVerifyCustomTokenRequest + +- (nullable instancetype)initWithToken:(NSString *)token + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kVerifyCustomTokenEndpoint + requestConfiguration:requestConfiguration]; + if (self) { + _token = [token copy]; + _returnSecureToken = YES; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *body = [@{kTokenKey : _token} mutableCopy]; + if (_returnSecureToken) { + body[kReturnSecureTokenKey] = @YES; + } + return body; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.h new file mode 100644 index 00000000..7484a94f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.h @@ -0,0 +1,52 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRVerifyCustomTokenResponse + @brief Represents the response from the verifyCustomToken endpoint. + */ +@interface FIRVerifyCustomTokenResponse : NSObject + +/** @property IDToken + @brief Either an authorization code suitable for performing an STS token exchange, or the + access token from Secure Token Service, depending on whether @c returnSecureToken is set + on the request. + */ +@property(nonatomic, strong, readonly, nullable) NSString *IDToken; + +/** @property approximateExpirationDate + @brief The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +/** @property refreshToken + @brief The refresh token from Secure Token Service. + */ +@property(nonatomic, strong, readonly, nullable) NSString *refreshToken; + +/** @property isNewUser + @brief Flag indicating that the user signing in is a new user and not a returning user. + */ +@property(nonatomic, assign) BOOL isNewUser; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.m new file mode 100644 index 00000000..1bbe645a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.m @@ -0,0 +1,36 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRVerifyCustomTokenResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _IDToken = [dictionary[@"idToken"] copy]; + _approximateExpirationDate = + [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] + : nil; + _refreshToken = [dictionary[@"refreshToken"] copy]; + _isNewUser = [dictionary[@"isNewUser"] boolValue]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.h new file mode 100644 index 00000000..5931578e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.h @@ -0,0 +1,81 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRVerifyPasswordRequest + @brief Represents the parameters for the verifyPassword endpoint. + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/verifyPassword + */ +@interface FIRVerifyPasswordRequest : FIRIdentityToolkitRequest + +/** @property email + @brief The email of the user. + */ +@property(nonatomic, copy) NSString *email; + +/** @property password + @brief The password inputed by the user. + */ +@property(nonatomic, copy) NSString *password; + +/** @property pendingIDToken + @brief The GITKit token for the non-trusted IDP, which is to be confirmed by the user. + */ +@property(nonatomic, copy, nullable) NSString *pendingIDToken; + +/** @property captchaChallenge + @brief The captcha challenge. + */ +@property(nonatomic, copy, nullable) NSString *captchaChallenge; + +/** @property captchaResponse + @brief Response to the captcha. + */ +@property(nonatomic, copy, nullable) NSString *captchaResponse; + +/** @property returnSecureToken + @brief Whether the response should return access token and refresh token directly. + @remarks The default value is @c YES . + */ +@property(nonatomic, assign) BOOL returnSecureToken; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithEmail:password:requestConfiguration: + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithEmail:password:requestConfiguration: + @brief Designated initializer. + @param email The email of the user. + @param password The password inputed by the user. + @param requestConfiguration The configu + */ +- (nullable instancetype)initWithEmail:(NSString *)email + password:(NSString *)password + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.m new file mode 100644 index 00000000..03cf490a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.m @@ -0,0 +1,95 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kVerifyPasswordEndpoint + @brief The "verifyPassword" endpoint. + */ +static NSString *const kVerifyPasswordEndpoint = @"verifyPassword"; + +/** @var kEmailKey + @brief The key for the "email" value in the request. + */ +static NSString *const kEmailKey = @"email"; + +/** @var kPasswordKey + @brief The key for the "password" value in the request. + */ +static NSString *const kPasswordKey = @"password"; + +/** @var kPendingIDTokenKey + @brief The key for the "pendingIdToken" value in the request. + */ +static NSString *const kPendingIDTokenKey = @"pendingIdToken"; + +/** @var kCaptchaChallengeKey + @brief The key for the "captchaChallenge" value in the request. + */ +static NSString *const kCaptchaChallengeKey = @"captchaChallenge"; + +/** @var kCaptchaResponseKey + @brief The key for the "captchaResponse" value in the request. + */ +static NSString *const kCaptchaResponseKey = @"captchaResponse"; + +/** @var kReturnSecureTokenKey + @brief The key for the "returnSecureToken" value in the request. + */ +static NSString *const kReturnSecureTokenKey = @"returnSecureToken"; + +@implementation FIRVerifyPasswordRequest + +- (nullable instancetype)initWithEmail:(NSString *)email + password:(NSString *)password + requestConfiguration:(nonnull FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kVerifyPasswordEndpoint requestConfiguration:requestConfiguration]; + if (self) { + _email = [email copy]; + _password = [password copy]; + _returnSecureToken = YES; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_email) { + postBody[kEmailKey] = _email; + } + if (_password) { + postBody[kPasswordKey] = _password; + } + if (_pendingIDToken) { + postBody[kPendingIDTokenKey] = _pendingIDToken; + } + if (_captchaChallenge) { + postBody[kCaptchaChallengeKey] = _captchaChallenge; + } + if (_captchaResponse) { + postBody[kCaptchaResponseKey] = _captchaResponse; + } + if (_returnSecureToken) { + postBody[kReturnSecureTokenKey] = @YES; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.h new file mode 100644 index 00000000..26563c71 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.h @@ -0,0 +1,75 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRVerifyPasswordResponse + @brief Represents the response from the verifyPassword endpoint. + @remarks Possible error codes: + - FIRAuthInternalErrorCodeUserDisabled + - FIRAuthInternalErrorCodeEmailNotFound + @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/verifyPassword + */ +@interface FIRVerifyPasswordResponse : NSObject + +/** @property localID + @brief The RP local ID if it's already been mapped to the IdP account identified by the + federated ID. + */ +@property(nonatomic, strong, readonly, nullable) NSString *localID; + +/** @property email + @brief The email returned by the IdP. NOTE: The federated login user may not own the email. + */ +@property(nonatomic, strong, readonly, nullable) NSString *email; + +/** @property displayName + @brief The display name of the user. + */ +@property(nonatomic, strong, readonly, nullable) NSString *displayName; + +/** @property IDToken + @brief Either an authorization code suitable for performing an STS token exchange, or the + access token from Secure Token Service, depending on whether @c returnSecureToken is set + on the request. + */ +@property(nonatomic, strong, readonly, nullable) NSString *IDToken; + +/** @property approximateExpirationDate + @brief The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +/** @property refreshToken + @brief The refresh token from Secure Token Service. + */ +@property(nonatomic, strong, readonly, nullable) NSString *refreshToken; + +/** @property photoURL + @brief The URI of the public accessible profile picture. + */ +@property(nonatomic, strong, readonly, nullable) NSURL *photoURL; + +@property(nonatomic, strong, readonly, nullable) NSString *MFAPendingCredential; + +@property(nonatomic, strong, readonly, nullable) NSArray *MFAInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.m new file mode 100644 index 00000000..df8208f6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.m @@ -0,0 +1,52 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRVerifyPasswordResponse + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _localID = [dictionary[@"localId"] copy]; + _email = [dictionary[@"email"] copy]; + _displayName = [dictionary[@"displayName"] copy]; + _IDToken = [dictionary[@"idToken"] copy]; + _approximateExpirationDate = + [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] + : nil; + _refreshToken = [dictionary[@"refreshToken"] copy]; + _photoURL = dictionary[@"photoUrl"] ? [NSURL URLWithString:dictionary[@"photoUrl"]] : nil; + + if (dictionary[@"mfaInfo"] != nil) { + NSMutableArray *MFAInfo = [NSMutableArray array]; + NSArray *MFAInfoDataArray = dictionary[@"mfaInfo"]; + for (NSDictionary *MFAInfoData in MFAInfoDataArray) { + FIRAuthProtoMFAEnrollment *MFAEnrollment = + [[FIRAuthProtoMFAEnrollment alloc] initWithDictionary:MFAInfoData]; + [MFAInfo addObject:MFAEnrollment]; + } + _MFAInfo = MFAInfo; + } + _MFAPendingCredential = [dictionary[@"mfaPendingCredential"] copy]; + + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.h new file mode 100644 index 00000000..da8d4e87 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.h @@ -0,0 +1,90 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Auth/FIRAuthOperationType.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRVerifyPhoneNumberRequest : FIRIdentityToolkitRequest + +/** @property verificationID + @brief The verification ID obtained from the response of @c sendVerificationCode. +*/ +@property(nonatomic, readonly, nullable) NSString *verificationID; + +/** @property verificationCode + @brief The verification code provided by the user. +*/ +@property(nonatomic, readonly, nullable) NSString *verificationCode; + +/** @property accessToken + @brief The STS Access Token for the authenticated user. + */ +@property(nonatomic, copy, nullable) NSString *accessToken; + +/** @var temporaryProof + @brief The temporary proof code, previously returned from the backend. + */ +@property(nonatomic, readonly, nonnull) NSString *temporaryProof; + +/** @var phoneNumber + @brief The phone number to be verified in the request. + */ +@property(nonatomic, readonly, nonnull) NSString *phoneNumber; + +/** @var operation + @brief The type of operation triggering this verify phone number request. + */ +@property(nonatomic, assign, readonly) FIRAuthOperationType operation; + +/** @fn initWithEndpoint:requestConfiguration: + @brief Please use initWithVerificationID:verificationCode:requestConfiguration + */ +- (nullable instancetype)initWithEndpoint:(NSString *)endpoint + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_UNAVAILABLE; + +/** @fn initWithTemporaryProof:phoneNumberAPIKey + @brief Designated initializer. + @param temporaryProof The temporary proof sent by the backed. + @param phoneNumber The phone number associated with the credential to be signed in. + @param operation Indicates what operation triggered the verify phone number request. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithTemporaryProof:(NSString *)temporaryProof + phoneNumber:(NSString *)phoneNumber + operation:(FIRAuthOperationType)operation + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +/** @fn initWithVerificationID:verificationCode:requestConfiguration + @brief Designated initializer. + @param verificationID The verification ID obtained from the response of @c sendVerificationCode. + @param verificationCode The verification code provided by the user. + @param operation Indicates what operation triggered the verify phone number request. + @param requestConfiguration An object containing configurations to be added to the request. + */ +- (nullable instancetype)initWithVerificationID:(NSString *)verificationID + verificationCode:(NSString *)verificationCode + operation:(FIRAuthOperationType)operation + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.m new file mode 100644 index 00000000..e2ee9166 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.m @@ -0,0 +1,133 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kVerifyPhoneNumberEndPoint + @brief The "verifyPhoneNumber" endpoint. + */ +static NSString *const kVerifyPhoneNumberEndPoint = @"verifyPhoneNumber"; + +/** @var kVerificationIDKey + @brief The key for the verification ID parameter in the request. + */ +static NSString *const kVerificationIDKey = @"sessionInfo"; + +/** @var kVerificationCodeKey + @brief The key for the verification code parameter in the request. + */ +static NSString *const kVerificationCodeKey = @"code"; + +/** @var kIDTokenKey + @brief The key for the "ID Token" value in the request. + */ +static NSString *const kIDTokenKey = @"idToken"; + +/** @var kTemporaryProofKey + @brief The key for the temporary proof value in the request. + */ +static NSString *const kTemporaryProofKey = @"temporaryProof"; + +/** @var kPhoneNumberKey + @brief The key for the phone number value in the request. + */ +static NSString *const kPhoneNumberKey = @"phoneNumber"; + +/** @var kOperationKey + @brief The key for the operation value in the request. + */ +static NSString *const kOperationKey = @"operation"; + +@implementation FIRVerifyPhoneNumberRequest + +- (nullable instancetype)initWithTemporaryProof:(NSString *)temporaryProof + phoneNumber:(NSString *)phoneNumber + operation:(FIRAuthOperationType)operation + requestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kVerifyPhoneNumberEndPoint + requestConfiguration:requestConfiguration]; + if (self) { + _temporaryProof = [temporaryProof copy]; + _phoneNumber = [phoneNumber copy]; + _operation = operation; + } + return self; +} + +- (nullable instancetype)initWithVerificationID:(NSString *)verificationID + verificationCode:(NSString *)verificationCode + operation:(FIRAuthOperationType)operation + requestConfiguration: + (FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kVerifyPhoneNumberEndPoint + requestConfiguration:requestConfiguration]; + if (self) { + _verificationID = verificationID; + _verificationCode = verificationCode; + _operation = operation; + } + return self; +} + +/** @fn FIRAuthOperationString + @brief Returns a string object corresponding to the provided FIRAuthOperationType value. + @param operationType The value of the FIRAuthOperationType enum which will be translated to its + corresponding string value. + @return The string value corresponding to the FIRAuthOperationType argument. + */ +NSString *const FIRAuthOperationString(FIRAuthOperationType operationType) { + switch (operationType) { + case FIRAuthOperationTypeUnspecified: + return @"VERIFY_OP_UNSPECIFIED"; + case FIRAuthOperationTypeSignUpOrSignIn: + return @"SIGN_UP_OR_IN"; + case FIRAuthOperationTypeReauth: + return @"REAUTH"; + case FIRAuthOperationTypeLink: + return @"LINK"; + case FIRAuthOperationTypeUpdate: + return @"UPDATE"; + } +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_verificationID) { + postBody[kVerificationIDKey] = _verificationID; + } + if (_verificationCode) { + postBody[kVerificationCodeKey] = _verificationCode; + } + if (_accessToken) { + postBody[kIDTokenKey] = _accessToken; + } + if (_temporaryProof) { + postBody[kTemporaryProofKey] = _temporaryProof; + } + if (_phoneNumber) { + postBody[kPhoneNumberKey] = _phoneNumber; + } + NSString *operation = FIRAuthOperationString(_operation); + postBody[kOperationKey] = operation; + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.h new file mode 100644 index 00000000..7817ccf0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.h @@ -0,0 +1,64 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRVerifyPhoneNumberResponse : NSObject + +/** @property IDToken + @brief Either an authorization code suitable for performing an STS token exchange, or the + access token from Secure Token Service, depending on whether @c returnSecureToken is set + on the request. + */ +@property(nonatomic, strong, readonly, nullable) NSString *IDToken; + +/** @property refreshToken + @brief The refresh token from Secure Token Service. + */ +@property(nonatomic, strong, readonly, nullable) NSString *refreshToken; + +/** @property localID + @brief The Firebase Auth user ID. + */ +@property(nonatomic, strong, readonly, nullable) NSString *localID; + +/** @property phoneNumber + @brief The verified phone number. + */ +@property(nonatomic, strong, readonly, nullable) NSString *phoneNumber; + +/** @property temporaryProof + @brief The temporary proof code returned by the backend. + */ +@property(nonatomic, strong, readonly, nullable) NSString *temporaryProof; + +/** @property isNewUser + @brief Flag indicating that the user signing in is a new user and not a returning user. + */ +@property(nonatomic, assign) BOOL isNewUser; + +/** @property approximateExpirationDate + @brief The approximate expiration date of the access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.m new file mode 100644 index 00000000..902fb967 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.m @@ -0,0 +1,43 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRVerifyPhoneNumberResponse + +- (nullable NSString *)expectedKind { + return nil; +} + +- (BOOL)setWithDictionary:(NSDictionary *)dictionary error:(NSError *_Nullable *_Nullable)error { + _IDToken = [dictionary[@"idToken"] copy]; + _refreshToken = [dictionary[@"refreshToken"] copy]; + _isNewUser = [dictionary[@"isNewUser"] boolValue]; + _localID = [dictionary[@"localId"] copy]; + _phoneNumber = [dictionary[@"phoneNumber"] copy]; + _temporaryProof = [dictionary[@"temporaryProof"] copy]; + _approximateExpirationDate = + [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] + ? [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] + : nil; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.h new file mode 100644 index 00000000..edd8a732 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.h @@ -0,0 +1,39 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRFinalizeMFAEnrollmentRequest : FIRIdentityToolkitRequest + +@property(nonatomic, copy, readonly, nullable) NSString *IDToken; + +@property(nonatomic, copy, readonly, nullable) NSString *displayName; + +@property(nonatomic, copy, readonly, nullable) + FIRAuthProtoFinalizeMFAPhoneRequestInfo *verificationInfo; + +- (nullable instancetype)initWithIDToken:(NSString *)IDToken + displayName:(NSString *)displayName + verificationInfo:(FIRAuthProtoFinalizeMFAPhoneRequestInfo *)verificationInfo + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.m new file mode 100644 index 00000000..3874a8f9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.m @@ -0,0 +1,55 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentRequest.h" + +static NSString *const kFinalizeMFAEnrollmentEndPoint = @"accounts/mfaEnrollment:finalize"; + +@implementation FIRFinalizeMFAEnrollmentRequest + +- (nullable instancetype)initWithIDToken:(NSString *)IDToken + displayName:(NSString *)displayName + verificationInfo:(FIRAuthProtoFinalizeMFAPhoneRequestInfo *)verificationInfo + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kFinalizeMFAEnrollmentEndPoint + requestConfiguration:requestConfiguration + useIdentityPlatform:YES + useStaging:NO]; + if (self) { + _IDToken = IDToken; + _displayName = displayName; + _verificationInfo = verificationInfo; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_IDToken) { + postBody[@"idToken"] = _IDToken; + } + if (_displayName) { + postBody[@"displayName"] = _displayName; + } + if (_verificationInfo) { + if ([_verificationInfo isKindOfClass:[FIRAuthProtoFinalizeMFAPhoneRequestInfo class]]) { + postBody[@"phoneVerificationInfo"] = [_verificationInfo dictionary]; + } + } + return [postBody copy]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.h new file mode 100644 index 00000000..aca12a17 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.h @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRFinalizeMFAEnrollmentResponse : NSObject + +@property(nonatomic, copy, readonly, nullable) NSString *IDToken; + +@property(nonatomic, copy, readonly, nullable) NSString *refreshToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.m new file mode 100644 index 00000000..1e9cac5b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.m @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRFinalizeMFAEnrollmentResponse.h" + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.h" + +@implementation FIRFinalizeMFAEnrollmentResponse + +- (BOOL)setWithDictionary:(nonnull NSDictionary *)dictionary + error:(NSError *__autoreleasing _Nullable *_Nullable)error { + _IDToken = [dictionary[@"idToken"] copy]; + _refreshToken = [dictionary[@"refreshToken"] copy]; + return YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.h new file mode 100644 index 00000000..62599f6d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStartMFAEnrollmentRequest : FIRIdentityToolkitRequest + +@property(nonatomic, copy, readonly, nullable) NSString *IDToken; + +@property(nonatomic, copy, readonly, nullable) FIRAuthProtoStartMFAPhoneRequestInfo *enrollmentInfo; + +- (nullable instancetype)initWithIDToken:(NSString *)IDToken + enrollmentInfo:(FIRAuthProtoStartMFAPhoneRequestInfo *)enrollmentInfo + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.m new file mode 100644 index 00000000..977c1b71 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.m @@ -0,0 +1,52 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.h" + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h" + +static NSString *const kStartMFAEnrollmentEndPoint = @"accounts/mfaEnrollment:start"; + +@implementation FIRStartMFAEnrollmentRequest + +- (nullable instancetype)initWithIDToken:(NSString *)IDToken + enrollmentInfo:(FIRAuthProtoStartMFAPhoneRequestInfo *)enrollmentInfo + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kStartMFAEnrollmentEndPoint + requestConfiguration:requestConfiguration + useIdentityPlatform:YES + useStaging:NO]; + if (self) { + _IDToken = IDToken; + _enrollmentInfo = enrollmentInfo; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_IDToken) { + postBody[@"idToken"] = _IDToken; + } + if (_enrollmentInfo) { + if ([_enrollmentInfo isKindOfClass:[FIRAuthProtoStartMFAPhoneRequestInfo class]]) { + postBody[@"phoneEnrollmentInfo"] = [_enrollmentInfo dictionary]; + } + } + return [postBody copy]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.h new file mode 100644 index 00000000..d0d5bdaa --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.h @@ -0,0 +1,29 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStartMFAEnrollmentResponse : NSObject + +@property(nonatomic, copy, readonly, nullable) + FIRAuthProtoStartMFAPhoneResponseInfo *enrollmentResponse; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.m new file mode 100644 index 00000000..658462ce --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.m @@ -0,0 +1,34 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentResponse.h" + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.h" + +@implementation FIRStartMFAEnrollmentResponse + +- (BOOL)setWithDictionary:(nonnull NSDictionary *)dictionary + error:(NSError *__autoreleasing _Nullable *_Nullable)error { + if (dictionary[@"phoneSessionInfo"] != nil) { + NSDictionary *data = dictionary[@"phoneSessionInfo"]; + _enrollmentResponse = [[FIRAuthProtoStartMFAPhoneResponseInfo alloc] initWithDictionary:data]; + } else { + return NO; + } + return YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.h new file mode 100644 index 00000000..155f5ea7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.h @@ -0,0 +1,37 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRFinalizeMFASignInRequest : FIRIdentityToolkitRequest + +@property(nonatomic, copy, readonly, nullable) NSString *MFAPendingCredential; + +@property(nonatomic, copy, readonly, nullable) + FIRAuthProtoFinalizeMFAPhoneRequestInfo *verificationInfo; + +- (nullable instancetype) + initWithMFAPendingCredential:(NSString *)MFAPendingCredential + verificationInfo:(FIRAuthProtoFinalizeMFAPhoneRequestInfo *)verificationInfo + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.m new file mode 100644 index 00000000..65fe3158 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.m @@ -0,0 +1,51 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.h" + +static NSString *const kFinalizeMFASignInEndPoint = @"accounts/mfaSignIn:finalize"; + +@implementation FIRFinalizeMFASignInRequest + +- (nullable instancetype) + initWithMFAPendingCredential:(NSString *)MFAPendingCredential + verificationInfo:(FIRAuthProtoFinalizeMFAPhoneRequestInfo *)verificationInfo + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kFinalizeMFASignInEndPoint + requestConfiguration:requestConfiguration + useIdentityPlatform:YES + useStaging:NO]; + if (self) { + _MFAPendingCredential = MFAPendingCredential; + _verificationInfo = verificationInfo; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_MFAPendingCredential) { + postBody[@"mfaPendingCredential"] = _MFAPendingCredential; + } + if (_verificationInfo) { + if ([_verificationInfo isKindOfClass:[FIRAuthProtoFinalizeMFAPhoneRequestInfo class]]) { + postBody[@"phoneVerificationInfo"] = [_verificationInfo dictionary]; + } + } + return [postBody copy]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.h new file mode 100644 index 00000000..5ad8bd69 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.h @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRFinalizeMFASignInResponse : NSObject + +@property(nonatomic, copy, readonly, nullable) NSString *IDToken; + +@property(nonatomic, copy, readonly, nullable) NSString *refreshToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.m new file mode 100644 index 00000000..0763880a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.m @@ -0,0 +1,28 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInResponse.h" + +@implementation FIRFinalizeMFASignInResponse + +- (BOOL)setWithDictionary:(nonnull NSDictionary *)dictionary + error:(NSError *__autoreleasing _Nullable *_Nullable)error { + _IDToken = [dictionary[@"idToken"] copy]; + _refreshToken = [dictionary[@"refreshToken"] copy]; + return YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.h new file mode 100644 index 00000000..8a12bad2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.h @@ -0,0 +1,39 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStartMFASignInRequest : FIRIdentityToolkitRequest + +@property(nonatomic, copy, readonly, nullable) NSString *MFAPendingCredential; + +@property(nonatomic, copy, readonly, nullable) NSString *MFAEnrollmentID; + +@property(nonatomic, copy, readonly, nullable) FIRAuthProtoStartMFAPhoneRequestInfo *signInInfo; + +- (nullable instancetype) + initWithMFAPendingCredential:(NSString *)MFAPendingCredential + MFAEnrollmentID:(NSString *)MFAEnrollmentID + signInInfo:(FIRAuthProtoStartMFAPhoneRequestInfo *)signInInfo + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.m new file mode 100644 index 00000000..0ba4876a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.m @@ -0,0 +1,56 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInRequest.h" + +static NSString *const kStartMFASignInEndPoint = @"accounts/mfaSignIn:start"; + +@implementation FIRStartMFASignInRequest + +- (nullable instancetype) + initWithMFAPendingCredential:(NSString *)MFAPendingCredential + MFAEnrollmentID:(NSString *)MFAEnrollmentID + signInInfo:(FIRAuthProtoStartMFAPhoneRequestInfo *)signInInfo + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kStartMFASignInEndPoint + requestConfiguration:requestConfiguration + useIdentityPlatform:YES + useStaging:NO]; + if (self) { + _MFAPendingCredential = MFAPendingCredential; + _MFAEnrollmentID = MFAEnrollmentID; + _signInInfo = signInInfo; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_MFAPendingCredential) { + postBody[@"mfaPendingCredential"] = _MFAPendingCredential; + } + if (_MFAEnrollmentID) { + postBody[@"mfaEnrollmentId"] = _MFAEnrollmentID; + } + if (_signInInfo) { + if ([_signInInfo isKindOfClass:[FIRAuthProtoStartMFAPhoneRequestInfo class]]) { + postBody[@"phoneSignInInfo"] = [_signInInfo dictionary]; + } + } + return [postBody copy]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.h new file mode 100644 index 00000000..bd1c372e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.h @@ -0,0 +1,28 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStartMFASignInResponse : NSObject + +@property(nonatomic, copy, readonly, nullable) FIRAuthProtoStartMFAPhoneResponseInfo *responseInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.m new file mode 100644 index 00000000..7ad49f85 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.m @@ -0,0 +1,32 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRStartMFASignInResponse.h" + +@implementation FIRStartMFASignInResponse + +- (BOOL)setWithDictionary:(nonnull NSDictionary *)dictionary + error:(NSError *__autoreleasing _Nullable *_Nullable)error { + if (dictionary[@"phoneResponseInfo"] != nil) { + NSDictionary *data = dictionary[@"phoneResponseInfo"]; + _responseInfo = [[FIRAuthProtoStartMFAPhoneResponseInfo alloc] initWithDictionary:data]; + } else { + return NO; + } + return YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.h new file mode 100644 index 00000000..df211f80 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.h @@ -0,0 +1,34 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCRequest.h" +#import "FirebaseAuth/Sources/Backend/FIRIdentityToolkitRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRWithdrawMFARequest : FIRIdentityToolkitRequest + +@property(nonatomic, copy, readonly, nullable) NSString *IDToken; + +@property(nonatomic, copy, readonly, nullable) NSString *MFAEnrollmentID; + +- (nullable instancetype)initWithIDToken:(NSString *)IDToken + MFAEnrollmentID:(NSString *)MFAEnrollmentID + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.m new file mode 100644 index 00000000..f4468e39 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.m @@ -0,0 +1,52 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFARequest.h" + +NS_ASSUME_NONNULL_BEGIN + +static NSString *const kWithdrawMFAEndPoint = @"accounts/mfaEnrollment:withdraw"; + +@implementation FIRWithdrawMFARequest + +- (nullable instancetype)initWithIDToken:(NSString *)IDToken + MFAEnrollmentID:(NSString *)MFAEnrollmentID + requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration { + self = [super initWithEndpoint:kWithdrawMFAEndPoint + requestConfiguration:requestConfiguration + useIdentityPlatform:YES + useStaging:NO]; + if (self) { + _IDToken = IDToken; + _MFAEnrollmentID = MFAEnrollmentID; + } + return self; +} + +- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error { + NSMutableDictionary *postBody = [NSMutableDictionary dictionary]; + if (_IDToken) { + postBody[@"idToken"] = _IDToken; + } + if (_MFAEnrollmentID) { + postBody[@"mfaEnrollmentId"] = _MFAEnrollmentID; + } + return [postBody copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.h new file mode 100644 index 00000000..84adf824 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.h @@ -0,0 +1,29 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/FIRAuthRPCResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRWithdrawMFAResponse : NSObject + +@property(nonatomic, copy, readonly, nullable) NSString *IDToken; + +@property(nonatomic, copy, readonly, nullable) NSString *refreshToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.m new file mode 100644 index 00000000..7d1c3c76 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.m @@ -0,0 +1,32 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Unenroll/FIRWithdrawMFAResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRWithdrawMFAResponse + +- (BOOL)setWithDictionary:(nonnull NSDictionary *)dictionary + error:(NSError *__autoreleasing _Nullable *_Nullable)error { + _IDToken = [dictionary[@"idToken"] copy]; + _refreshToken = [dictionary[@"refreshToken"] copy]; + return YES; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h new file mode 100644 index 00000000..5d0d8616 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol FIRAuthProto + +@optional +- (instancetype)initWithDictionary:(NSDictionary *)dictionary; + +- (NSDictionary *)dictionary; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h new file mode 100644 index 00000000..4246e62f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthProtoMFAEnrollment : NSObject + +@property(nonatomic, copy, readonly, nullable) NSString *MFAValue; + +@property(nonatomic, copy, readonly, nullable) NSString *MFAEnrollmentID; + +@property(nonatomic, copy, readonly, nullable) NSString *displayName; + +@property(nonatomic, copy, readonly, nullable) NSDate *enrolledAt; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.m new file mode 100644 index 00000000..92237e9b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.m @@ -0,0 +1,43 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthProtoMFAEnrollment + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + self = [super init]; + if (self) { + if (dictionary[@"phoneInfo"]) { + _MFAValue = dictionary[@"phoneInfo"]; + } + _MFAEnrollmentID = dictionary[@"mfaEnrollmentId"]; + _displayName = dictionary[@"displayName"]; + if ([dictionary[@"enrolledAt"] isKindOfClass:[NSString class]]) { + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; + NSDate *date = [dateFormatter dateFromString:dictionary[@"enrolledAt"]]; + _enrolledAt = date; + } + } + return self; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.h new file mode 100644 index 00000000..df6e39af --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.h @@ -0,0 +1,31 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthProtoFinalizeMFAPhoneRequestInfo : NSObject + +@property(nonatomic, strong, readonly, nullable) NSString *sessionInfo; + +@property(nonatomic, strong, readonly, nullable) NSString *code; + +- (instancetype)initWithSessionInfo:(NSString *)sessionInfo + verificationCode:(NSString *)verificationCode; +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.m new file mode 100644 index 00000000..b233a137 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.m @@ -0,0 +1,46 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthProtoFinalizeMFAPhoneRequestInfo + +- (instancetype)initWithSessionInfo:(NSString *)sessionInfo + verificationCode:(NSString *)verificationCode { + self = [super init]; + if (self) { + _sessionInfo = sessionInfo; + _code = verificationCode; + } + return self; +} + +- (NSDictionary *)dictionary { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + if (_sessionInfo) { + dict[@"sessionInfo"] = _sessionInfo; + } + if (_code) { + dict[@"code"] = _code; + } + return [dict copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.h new file mode 100644 index 00000000..fc9af6ec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.h @@ -0,0 +1,27 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthProtoFinalizeMFAPhoneResponseInfo : NSObject + +@property(nonatomic, copy, readonly, nullable) NSString *phoneNumber; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.m new file mode 100644 index 00000000..f8f1d96e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.m @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneResponseInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthProtoFinalizeMFAPhoneResponseInfo + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + self = [super init]; + if (self) { + _phoneNumber = [dictionary[@"phoneNumber"] copy]; + } + return self; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h new file mode 100644 index 00000000..e17315fa --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthProtoStartMFAPhoneRequestInfo : NSObject + +@property(nonatomic, strong, readonly, nullable) NSString *phoneNumber; + +@property(nonatomic, strong, readonly, nullable) FIRAuthAppCredential *appCredential; + +@property(nonatomic, strong, readonly, nullable) NSString *reCAPTCHAToken; + +- (nullable instancetype)initWithPhoneNumber:(NSString *)phoneNumber + appCredential:(nullable FIRAuthAppCredential *)appCredential + reCAPTCHAToken:(nullable NSString *)reCAPTCHAToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.m new file mode 100644 index 00000000..1c0ffeaa --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.m @@ -0,0 +1,74 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneRequestInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kPhoneNumberKey + @brief The key for the Phone Number parameter in the request. + */ +static NSString *const kPhoneNumberKey = @"phoneNumber"; + +/** @var kReceiptKey + @brief The key for the receipt parameter in the request. + */ +static NSString *const kReceiptKey = @"iosReceipt"; + +/** @var kSecretKey + @brief The key for the Secret parameter in the request. + */ +static NSString *const kSecretKey = @"iosSecret"; + +/** @var kreCAPTCHATokenKey + @brief The key for the reCAPTCHAToken parameter in the request. + */ +static NSString *const kreCAPTCHATokenKey = @"recaptchaToken"; + +@implementation FIRAuthProtoStartMFAPhoneRequestInfo + +- (nullable instancetype)initWithPhoneNumber:(NSString *)phoneNumber + appCredential:(nullable FIRAuthAppCredential *)appCredential + reCAPTCHAToken:(nullable NSString *)reCAPTCHAToken { + self = [super init]; + if (self) { + _phoneNumber = [phoneNumber copy]; + _appCredential = appCredential; + _reCAPTCHAToken = [reCAPTCHAToken copy]; + } + return self; +} + +- (NSDictionary *)dictionary { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + if (_phoneNumber) { + dict[kPhoneNumberKey] = _phoneNumber; + } + if (_appCredential.receipt) { + dict[kReceiptKey] = _appCredential.receipt; + } + if (_appCredential.secret) { + dict[kSecretKey] = _appCredential.secret; + } + if (_reCAPTCHAToken) { + dict[kreCAPTCHATokenKey] = _reCAPTCHAToken; + } + return [dict copy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.h new file mode 100644 index 00000000..1cdb6903 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.h @@ -0,0 +1,27 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProto.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthProtoStartMFAPhoneResponseInfo : NSObject + +@property(nonatomic, copy, readonly, nullable) NSString *sessionInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.m new file mode 100644 index 00000000..065e4178 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.m @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoStartMFAPhoneResponseInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthProtoStartMFAPhoneResponseInfo + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + self = [super init]; + if (self) { + _sessionInfo = [dictionary[@"sessionInfo"] copy]; + } + return self; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/FirebaseAuthVersion.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/FirebaseAuthVersion.m new file mode 100644 index 00000000..75d32e94 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/FirebaseAuthVersion.m @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +// Convert the macro to a string +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x + +const double FirebaseAuthVersionNum = FIRAuth_MINOR_VERSION; + +const char *const FirebaseAuthVersionStr = (const char *const)STR(FIRAuth_VERSION); diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactor+Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactor+Internal.h new file mode 100644 index 00000000..56b49aab --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactor+Internal.h @@ -0,0 +1,39 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRMultiFactor () + +@property(nonatomic, weak) FIRUser *user; + +/** @fn initWithMFAEnrollments: + @brief Initialize a multi factor instance with a list of MFA enrollments. +*/ +- (instancetype)initWithMFAEnrollments:(NSArray *)MFAEnrollments; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactor.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactor.m new file mode 100644 index 00000000..838b1b5b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactor.m @@ -0,0 +1,195 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#if TARGET_OS_IOS + +#import + +#import "FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h" +#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/Enroll/FIRStartMFAEnrollmentRequest.h" +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactor+Internal.h" +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo+Internal.h" +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession+Internal.h" +#import "FirebaseAuth/Sources/User/FIRUser_Internal.h" + +#if TARGET_OS_IOS +#import + +#import "FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion+Internal.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +static NSString *kEnrolledFactorsCodingKey = @"enrolledFactors"; + +static NSString *kUserCodingKey = @"user"; + +@implementation FIRMultiFactor + +- (void)getSessionWithCompletion:(nullable FIRMultiFactorSessionCallback)completion { + FIRMultiFactorSession *session = [FIRMultiFactorSession sessionForCurrentUser]; + if (completion) { + completion(session, nil); + } +} + +- (void)enrollWithAssertion:(FIRMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(nullable FIRAuthVoidErrorCallback)completion { +#if TARGET_OS_IOS + FIRPhoneMultiFactorAssertion *phoneAssertion = (FIRPhoneMultiFactorAssertion *)assertion; + FIRAuthProtoFinalizeMFAPhoneRequestInfo *finalizeMFAPhoneRequestInfo = + [[FIRAuthProtoFinalizeMFAPhoneRequestInfo alloc] + initWithSessionInfo:phoneAssertion.authCredential.verificationID + verificationCode:phoneAssertion.authCredential.verificationCode]; + FIRFinalizeMFAEnrollmentRequest *request = + [[FIRFinalizeMFAEnrollmentRequest alloc] initWithIDToken:self.user.rawAccessToken + displayName:displayName + verificationInfo:finalizeMFAPhoneRequestInfo + requestConfiguration:self.user.requestConfiguration]; + [FIRAuthBackend + finalizeMultiFactorEnrollment:request + callback:^(FIRFinalizeMFAEnrollmentResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + if (completion) { + completion(error); + } + } else { + [FIRAuth.auth + completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:nil + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + FIRAuthDataResult *result = + [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo:nil]; + FIRAuthDataResultCallback + decoratedCallback = [FIRAuth.auth + signInFlowAuthDataResultCallbackByDecoratingCallback: + ^(FIRAuthDataResult + *_Nullable authResult, + NSError *_Nullable error) { + if (completion) { + completion(error); + } + }]; + decoratedCallback(result, error); + }]; + } + }]; +#endif +} + +- (void)unenrollWithInfo:(FIRMultiFactorInfo *)factorInfo + completion:(nullable FIRAuthVoidErrorCallback)completion { + [self unenrollWithFactorUID:factorInfo.UID completion:completion]; +} + +- (void)unenrollWithFactorUID:(NSString *)factorUID + completion:(nullable FIRAuthVoidErrorCallback)completion { + FIRWithdrawMFARequest *request = + [[FIRWithdrawMFARequest alloc] initWithIDToken:self.user.rawAccessToken + MFAEnrollmentID:factorUID + requestConfiguration:self.user.requestConfiguration]; + [FIRAuthBackend + withdrawMultiFactor:request + callback:^(FIRWithdrawMFAResponse *_Nullable response, NSError *_Nullable error) { + if (error) { + if (completion) { + completion(error); + } + } else { + [FIRAuth.auth + completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:nil + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + FIRAuthDataResult *result = + [[FIRAuthDataResult alloc] initWithUser:user + additionalUserInfo:nil]; + FIRAuthDataResultCallback decoratedCallback = [FIRAuth + .auth + signInFlowAuthDataResultCallbackByDecoratingCallback: + ^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + if (error) { + [[FIRAuth auth] signOut:NULL]; + } + if (completion) { + completion(error); + } + }]; + decoratedCallback(result, error); + }]; + } + }]; +} + +#pragma mark - Internal + +- (instancetype)initWithMFAEnrollments:(NSArray *)MFAEnrollments { + self = [super init]; + + if (self) { + NSMutableArray *multiFactorInfoArray = [[NSMutableArray alloc] init]; + for (FIRAuthProtoMFAEnrollment *MFAEnrollment in MFAEnrollments) { + FIRMultiFactorInfo *multiFactorInfo = + [[FIRMultiFactorInfo alloc] initWithProto:MFAEnrollment]; + [multiFactorInfoArray addObject:multiFactorInfo]; + } + _enrolledFactors = [multiFactorInfoArray copy]; + } + + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [self init]; + if (self) { + NSArray *enrolledFactors = + [aDecoder decodeObjectOfClass:[NSArray class] + forKey:kEnrolledFactorsCodingKey]; + _enrolledFactors = enrolledFactors; + _user = [aDecoder decodeObjectOfClass:[FIRUser class] forKey:kUserCodingKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_enrolledFactors forKey:kEnrolledFactorsCodingKey]; + [aCoder encodeObject:_user forKey:kUserCodingKey]; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion+Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion+Internal.h new file mode 100644 index 00000000..10065937 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion+Internal.h @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRMultiFactorAssertion () { + @protected + NSString *_factorID; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion.m new file mode 100644 index 00000000..4a462320 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion.m @@ -0,0 +1,29 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRMultiFactorAssertion +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorConstants.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorConstants.m new file mode 100644 index 00000000..22d299db --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorConstants.m @@ -0,0 +1,26 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#pragma mark - Multi Factor ID constants + +NSString *const FIRPhoneMultiFactorID = @"1"; + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo+Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo+Internal.h new file mode 100644 index 00000000..84232930 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo+Internal.h @@ -0,0 +1,37 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRMultiFactorInfo () { + @protected + NSString *_factorID; +} + +- (instancetype)initWithProto:(FIRAuthProtoMFAEnrollment *)proto; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo.m new file mode 100644 index 00000000..fe7e4afc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo.m @@ -0,0 +1,74 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h" + +static NSString *kUIDCodingKey = @"uid"; + +static NSString *kDisplayNameCodingKey = @"displayName"; + +static NSString *kEnrollmentDateCodingKey = @"enrollmentDate"; + +static NSString *kFactorIDCodingKey = @"factorID"; + +@implementation FIRMultiFactorInfo + +#pragma mark - Internal + +- (instancetype)initWithProto:(FIRAuthProtoMFAEnrollment *)proto { + self = [super init]; + + if (self) { + _UID = proto.MFAEnrollmentID; + _displayName = proto.displayName; + _enrollmentDate = proto.enrolledAt; + } + + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [self init]; + if (self) { + _UID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kUIDCodingKey]; + _displayName = [aDecoder decodeObjectOfClass:[NSString class] forKey:kDisplayNameCodingKey]; + _enrollmentDate = [aDecoder decodeObjectOfClass:[NSDate class] forKey:kEnrollmentDateCodingKey]; + _factorID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kFactorIDCodingKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_UID forKey:kUIDCodingKey]; + [aCoder encodeObject:_displayName forKey:kDisplayNameCodingKey]; + [aCoder encodeObject:_enrollmentDate forKey:kEnrollmentDateCodingKey]; + [aCoder encodeObject:_factorID forKey:kFactorIDCodingKey]; +} + +@end + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver+Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver+Internal.h new file mode 100644 index 00000000..c28d6696 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver+Internal.h @@ -0,0 +1,34 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#if TARGET_OS_IOS + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRMultiFactorResolver () + +@property(nonatomic) NSString *MFAPendingCredential; + +- (instancetype)initWithMFAPendingCredential:(NSString *_Nullable)MFAPendingCredential + hints:(NSArray *)hints; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver.m new file mode 100644 index 00000000..4153f413 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver.m @@ -0,0 +1,101 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#if TARGET_OS_IOS + +#import +#import + +#import "FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h" +#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h" +#import "FirebaseAuth/Sources/Backend/RPC/MultiFactor/SignIn/FIRFinalizeMFASignInRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/Proto/Phone/FIRAuthProtoFinalizeMFAPhoneRequestInfo.h" +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver+Internal.h" +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession+Internal.h" + +#if TARGET_OS_IOS +#import + +#import "FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion+Internal.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRMultiFactorResolver + +- (instancetype)initWithMFAPendingCredential:(NSString *_Nullable)MFAPendingCredential + hints:(NSArray *)hints { + self = [super init]; + if (self) { + _MFAPendingCredential = MFAPendingCredential; + _hints = hints; + _auth = [FIRAuth auth]; + _session = [[FIRMultiFactorSession alloc] init]; + _session.MFAPendingCredential = MFAPendingCredential; + } + return self; +} + +- (void)resolveSignInWithAssertion:(nonnull FIRMultiFactorAssertion *)assertion + completion:(nullable FIRAuthDataResultCallback)completion { +#if TARGET_OS_IOS + FIRPhoneMultiFactorAssertion *phoneAssertion = (FIRPhoneMultiFactorAssertion *)assertion; + FIRAuthProtoFinalizeMFAPhoneRequestInfo *finalizeMFAPhoneRequestInfo = + [[FIRAuthProtoFinalizeMFAPhoneRequestInfo alloc] + initWithSessionInfo:phoneAssertion.authCredential.verificationID + verificationCode:phoneAssertion.authCredential.verificationCode]; + FIRFinalizeMFASignInRequest *request = [[FIRFinalizeMFASignInRequest alloc] + initWithMFAPendingCredential:self.MFAPendingCredential + verificationInfo:finalizeMFAPhoneRequestInfo + requestConfiguration:self.auth.requestConfiguration]; + [FIRAuthBackend + finalizeMultiFactorSignIn:request + callback:^(FIRFinalizeMFASignInResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + if (completion) { + completion(nil, error); + } + } else { + [FIRAuth.auth + completeSignInWithAccessToken:response.IDToken + accessTokenExpirationDate:nil + refreshToken:response.refreshToken + anonymous:NO + callback:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + FIRAuthDataResult *result = + [[FIRAuthDataResult alloc] + initWithUser:user + additionalUserInfo:nil]; + FIRAuthDataResultCallback decoratedCallback = + [FIRAuth.auth + signInFlowAuthDataResultCallbackByDecoratingCallback: + completion]; + decoratedCallback(result, error); + }]; + } + }]; +#endif +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession+Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession+Internal.h new file mode 100644 index 00000000..e4cf0d4c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession+Internal.h @@ -0,0 +1,39 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRMultiFactorSession () + +@property(nonatomic, readonly) NSString *IDToken; + +@property(nonatomic) NSString *MFAPendingCredential; + +@property(nonatomic) FIRMultiFactorInfo *multiFactorInfo; + ++ (FIRMultiFactorSession *)sessionForCurrentUser; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession.m new file mode 100644 index 00000000..ab1439a7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession.m @@ -0,0 +1,52 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#if TARGET_OS_IOS + +#import +#import + +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorSession+Internal.h" +#import "FirebaseAuth/Sources/User/FIRUser_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRMultiFactorSession + +#pragma mark - Private + +- (instancetype)initWithIDToken:(NSString *)IDToken { + self = [super init]; + if (self) { + _IDToken = IDToken; + } + return self; +} + +#pragma mark - Internal + ++ (FIRMultiFactorSession *)sessionForCurrentUser { + FIRUser *currentUser = [[FIRAuth auth] currentUser]; + NSString *IDToken = currentUser.rawAccessToken; + FIRMultiFactorSession *session = [[FIRMultiFactorSession alloc] initWithIDToken:IDToken]; + return session; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion+Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion+Internal.h new file mode 100644 index 00000000..82a5aca3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion+Internal.h @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRPhoneMultiFactorAssertion () + +@property(nonatomic) FIRPhoneAuthCredential *authCredential; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion.m new file mode 100644 index 00000000..2ad2d1f5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion.m @@ -0,0 +1,43 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorAssertion+Internal.h" +#import "FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion+Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +extern NSString *const _Nonnull FIRPhoneMultiFactorID; + +@implementation FIRPhoneMultiFactorAssertion + +- (instancetype)init { + self = [super init]; + if (self) { + _factorID = FIRPhoneMultiFactorID; + } + return self; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorGenerator.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorGenerator.m new file mode 100644 index 00000000..3845083c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorGenerator.m @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import +#import + +#import "FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorAssertion+Internal.h" + +@implementation FIRPhoneMultiFactorGenerator + ++ (FIRPhoneMultiFactorAssertion *)assertionWithCredential: + (FIRPhoneAuthCredential *)phoneAuthCredential { + FIRPhoneMultiFactorAssertion *assertion = [[FIRPhoneMultiFactorAssertion alloc] init]; + assertion.authCredential = phoneAuthCredential; + return assertion; +} + +@end + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo+Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo+Internal.h new file mode 100644 index 00000000..e4181999 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo+Internal.h @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +@class FIRAuthProtoMFAEnrollment; + +@interface FIRPhoneMultiFactorInfo () + +- (instancetype)initWithProto:(FIRAuthProtoMFAEnrollment *)proto; + +@end + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo.m new file mode 100644 index 00000000..0b9c455c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/MultiFactor/Phone/FIRPhoneMultiFactorInfo.m @@ -0,0 +1,41 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import +#import + +#import "FirebaseAuth/Sources/Backend/RPC/Proto/FIRAuthProtoMFAEnrollment.h" +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorInfo+Internal.h" + +extern NSString *const FIRPhoneMultiFactorID; + +@implementation FIRPhoneMultiFactorInfo + +- (instancetype)initWithProto:(FIRAuthProtoMFAEnrollment *)proto { + self = [super initWithProto:proto]; + if (self) { + _factorID = FIRPhoneMultiFactorID; + _phoneNumber = proto.MFAValue; + } + return self; +} + +@end + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRActionCodeSettings.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRActionCodeSettings.h new file mode 100644 index 00000000..5024bd59 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRActionCodeSettings.h @@ -0,0 +1,89 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRActionCodeSettings + @brief Used to set and retrieve settings related to handling action codes. + */ +NS_SWIFT_NAME(ActionCodeSettings) +@interface FIRActionCodeSettings : NSObject + +/** @property URL + @brief This URL represents the state/Continue URL in the form of a universal link. + @remarks This URL can should be constructed as a universal link that would either directly open + the app where the action code would be handled or continue to the app after the action code + is handled by Firebase. + */ +@property(nonatomic, copy, nullable) NSURL *URL; + +/** @property handleCodeInApp + @brief Indicates whether the action code link will open the app directly or after being + redirected from a Firebase owned web widget. + */ +@property(assign, nonatomic) BOOL handleCodeInApp; + +/** @property iOSBundleID + @brief The iOS bundle ID, if available. The default value is the current app's bundle ID. + */ +@property(copy, nonatomic, readonly, nullable) NSString *iOSBundleID; + +/** @property androidPackageName + @brief The Android package name, if available. + */ +@property(nonatomic, copy, readonly, nullable) NSString *androidPackageName; + +/** @property androidMinimumVersion + @brief The minimum Android version supported, if available. + */ +@property(nonatomic, copy, readonly, nullable) NSString *androidMinimumVersion; + +/** @property androidInstallIfNotAvailable + @brief Indicates whether the Android app should be installed on a device where it is not + available. + */ +@property(nonatomic, assign, readonly) BOOL androidInstallIfNotAvailable; + +/** @property dynamicLinkDomain + @brief The Firebase Dynamic Link domain used for out of band code flow. + */ +@property(copy, nonatomic, nullable) NSString *dynamicLinkDomain; + +/** @fn setIOSBundleID + @brief Sets the iOS bundle Id. + @param iOSBundleID The iOS bundle ID. + */ +- (void)setIOSBundleID:(NSString *)iOSBundleID; + +/** @fn setAndroidPackageName:installIfNotAvailable:minimumVersion: + @brief Sets the Android package name, the flag to indicate whether or not to install the app + and the minimum Android version supported. + @param androidPackageName The Android package name. + @param installIfNotAvailable Indicates whether or not the app should be installed if not + available. + @param minimumVersion The minimum version of Android supported. + @remarks If installIfNotAvailable is set to YES and the link is opened on an android device, it + will try to install the app if not already available. Otherwise the web URL is used. + */ +- (void)setAndroidPackageName:(NSString *)androidPackageName + installIfNotAvailable:(BOOL)installIfNotAvailable + minimumVersion:(nullable NSString *)minimumVersion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAdditionalUserInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAdditionalUserInfo.h new file mode 100644 index 00000000..4f6947ac --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAdditionalUserInfo.h @@ -0,0 +1,57 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRVerifyAssertionResponse; + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAdditionalUserInfo + @brief Represents additional user data returned from an identity provider. + */ +NS_SWIFT_NAME(AdditionalUserInfo) +@interface FIRAdditionalUserInfo : NSObject + +/** @fn init + @brief This class should not be initialized manually. `FIRAdditionalUserInfo` can be retrieved + from from an instance of `FIRAuthDataResult`. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @property providerID + @brief The provider identifier. + */ +@property(nonatomic, readonly) NSString *providerID; + +/** @property profile + @brief Dictionary containing the additional IdP specific information. + */ +@property(nonatomic, readonly, nullable) NSDictionary *profile; + +/** @property username + @brief username The name of the user. + */ +@property(nonatomic, readonly, nullable) NSString *username; + +/** @property newUser + @brief Indicates whether or not the current user was signed in for the first time. + */ +@property(nonatomic, readonly, getter=isNewUser) BOOL newUser; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuth.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuth.h new file mode 100644 index 00000000..f81c8950 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuth.h @@ -0,0 +1,882 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +#import "FIRAuthErrors.h" + +#if TARGET_OS_IOS +#import "FIRAuthAPNSTokenType.h" +#endif + +@class FIRActionCodeSettings; +@class FIRApp; +@class FIRAuth; +@class FIRAuthCredential; +@class FIRAuthDataResult; +@class FIRAuthSettings; +@class FIRUser; +@protocol FIRAuthStateListener; +@protocol FIRAuthUIDelegate; +@protocol FIRFederatedAuthProvider; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRUserUpdateCallback + @brief The type of block invoked when a request to update the current user is completed. + */ +typedef void (^FIRUserUpdateCallback)(NSError *_Nullable error) NS_SWIFT_NAME(UserUpdateCallback); + +/** @typedef FIRAuthStateDidChangeListenerHandle + @brief The type of handle returned by `FIRAuth.addAuthStateDidChangeListener:`. + */ +typedef id FIRAuthStateDidChangeListenerHandle + NS_SWIFT_NAME(AuthStateDidChangeListenerHandle); + +/** @typedef FIRAuthStateDidChangeListenerBlock + @brief The type of block which can be registered as a listener for auth state did change events. + + @param auth The FIRAuth object on which state changes occurred. + @param user Optionally; the current signed in user, if any. + */ +typedef void (^FIRAuthStateDidChangeListenerBlock)(FIRAuth *auth, FIRUser *_Nullable user) + NS_SWIFT_NAME(AuthStateDidChangeListenerBlock); + +/** @typedef FIRIDTokenDidChangeListenerHandle + @brief The type of handle returned by `FIRAuth.addIDTokenDidChangeListener:`. + */ +typedef id FIRIDTokenDidChangeListenerHandle + NS_SWIFT_NAME(IDTokenDidChangeListenerHandle); + +/** @typedef FIRIDTokenDidChangeListenerBlock + @brief The type of block which can be registered as a listener for ID token did change events. + + @param auth The FIRAuth object on which ID token changes occurred. + @param user Optionally; the current signed in user, if any. + */ +typedef void (^FIRIDTokenDidChangeListenerBlock)(FIRAuth *auth, FIRUser *_Nullable user) + NS_SWIFT_NAME(IDTokenDidChangeListenerBlock); + +/** @typedef FIRAuthDataResultCallback + @brief The type of block invoked when sign-in related events complete. + + @param authResult Optionally; Result of sign-in request containing both the user and + the additional user info associated with the user. + @param error Optionally; the error which occurred - or nil if the request was successful. + */ +typedef void (^FIRAuthDataResultCallback)(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) + NS_SWIFT_NAME(AuthDataResultCallback); + +#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +/** + @brief The name of the `NSNotificationCenter` notification which is posted when the auth state + changes (for example, a new token has been produced, a user signs in or signs out). The + object parameter of the notification is the sender `FIRAuth` instance. + */ +extern const NSNotificationName FIRAuthStateDidChangeNotification NS_SWIFT_NAME(AuthStateDidChange); +#else +/** + @brief The name of the `NSNotificationCenter` notification which is posted when the auth state + changes (for example, a new token has been produced, a user signs in or signs out). The + object parameter of the notification is the sender `FIRAuth` instance. + */ +extern NSString *const FIRAuthStateDidChangeNotification + NS_SWIFT_NAME(AuthStateDidChangeNotification); +#endif // defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 + +/** @typedef FIRAuthResultCallback + @brief The type of block invoked when sign-in related events complete. + + @param user Optionally; the signed in user, if any. + @param error Optionally; if an error occurs, this is the NSError object that describes the + problem. Set to nil otherwise. + */ +typedef void (^FIRAuthResultCallback)(FIRUser *_Nullable user, NSError *_Nullable error) + NS_SWIFT_NAME(AuthResultCallback); + +/** @typedef FIRProviderQueryCallback + @brief The type of block invoked when a list of identity providers for a given email address is + requested. + + @param providers Optionally; a list of provider identifiers, if any. + @see FIRGoogleAuthProviderID etc. + @param error Optionally; if an error occurs, this is the NSError object that describes the + problem. Set to nil otherwise. + */ +typedef void (^FIRProviderQueryCallback)(NSArray *_Nullable providers, + NSError *_Nullable error) + NS_SWIFT_NAME(ProviderQueryCallback); + +/** @typedef FIRSignInMethodQueryCallback + @brief The type of block invoked when a list of sign-in methods for a given email address is + requested. + */ +typedef void (^FIRSignInMethodQueryCallback)(NSArray *_Nullable, NSError *_Nullable) + NS_SWIFT_NAME(SignInMethodQueryCallback); + +/** @typedef FIRSendPasswordResetCallback + @brief The type of block invoked when sending a password reset email. + + @param error Optionally; if an error occurs, this is the NSError object that describes the + problem. Set to nil otherwise. + */ +typedef void (^FIRSendPasswordResetCallback)(NSError *_Nullable error) + NS_SWIFT_NAME(SendPasswordResetCallback); + +/** @typedef FIRSendSignInLinkToEmailCallback + @brief The type of block invoked when sending an email sign-in link email. + */ +typedef void (^FIRSendSignInLinkToEmailCallback)(NSError *_Nullable error) + NS_SWIFT_NAME(SendSignInLinkToEmailCallback); + +/** @typedef FIRConfirmPasswordResetCallback + @brief The type of block invoked when performing a password reset. + + @param error Optionally; if an error occurs, this is the NSError object that describes the + problem. Set to nil otherwise. + */ +typedef void (^FIRConfirmPasswordResetCallback)(NSError *_Nullable error) + NS_SWIFT_NAME(ConfirmPasswordResetCallback); + +/** @typedef FIRVerifyPasswordResetCodeCallback + @brief The type of block invoked when verifying that an out of band code should be used to + perform password reset. + + @param email Optionally; the email address of the user for which the out of band code applies. + @param error Optionally; if an error occurs, this is the NSError object that describes the + problem. Set to nil otherwise. + */ +typedef void (^FIRVerifyPasswordResetCodeCallback)(NSString *_Nullable email, + NSError *_Nullable error) + NS_SWIFT_NAME(VerifyPasswordResetCodeCallback); + +/** @typedef FIRApplyActionCodeCallback + @brief The type of block invoked when applying an action code. + + @param error Optionally; if an error occurs, this is the NSError object that describes the + problem. Set to nil otherwise. + */ +typedef void (^FIRApplyActionCodeCallback)(NSError *_Nullable error) + NS_SWIFT_NAME(ApplyActionCodeCallback); + +typedef void (^FIRAuthVoidErrorCallback)(NSError *_Nullable) NS_SWIFT_NAME(AuthVoidErrorCallback); + +/** + @brief Deprecated. Please directly use email or previousEmail properties instead. + */ +typedef NS_ENUM(NSInteger, FIRActionDataKey) { + /** Deprecated. Please directly use email property instead. */ + FIRActionCodeEmailKey = 0, + + /** Deprecated. Please directly use previousEmail property instead. */ + FIRActionCodeFromEmailKey = 1, + +} NS_SWIFT_NAME(ActionDataKey) + DEPRECATED_MSG_ATTRIBUTE("Please directly use email or previousEmail properties instead."); + +/** @class FIRActionCodeInfo + @brief Manages information regarding action codes. + */ +NS_SWIFT_NAME(ActionCodeInfo) +@interface FIRActionCodeInfo : NSObject + +/** + @brief Operations which can be performed with action codes. + */ +typedef NS_ENUM(NSInteger, FIRActionCodeOperation) { + /** Action code for unknown operation. */ + FIRActionCodeOperationUnknown = 0, + + /** Action code for password reset operation. */ + FIRActionCodeOperationPasswordReset = 1, + + /** Action code for verify email operation. */ + FIRActionCodeOperationVerifyEmail = 2, + + /** Action code for recover email operation. */ + FIRActionCodeOperationRecoverEmail = 3, + + /** Action code for email link operation. */ + FIRActionCodeOperationEmailLink = 4, + + /** Action code for verifing and changing email */ + FIRActionCodeOperationVerifyAndChangeEmail = 5, + + /** Action code for reverting second factor addition */ + FIRActionCodeOperationRevertSecondFactorAddition = 6, + +} NS_SWIFT_NAME(ActionCodeOperation); + +/** + @brief The operation being performed. + */ +@property(nonatomic, readonly) FIRActionCodeOperation operation; + +/** @fn dataForKey: + @brief Deprecated. Please directly use email or previousEmail properties instead. + */ +- (NSString *)dataForKey:(FIRActionDataKey)key + DEPRECATED_MSG_ATTRIBUTE("Please directly use email or previousEmail properties instead."); + +/** @property email + @brief The email address to which the code was sent. The new email address in the case of + FIRActionCodeOperationRecoverEmail. + */ +@property(nonatomic, nullable, readonly, copy) NSString *email; + +/** @property previousEmail + @brief The email that is being recovered in the case of FIRActionCodeOperationRecoverEmail. + */ +@property(nonatomic, nullable, readonly, copy) NSString *previousEmail; + +/** @fn init + @brief please use initWithOperation: instead. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +/** @class FIRActionCodeURL + @brief This class will allow developers to easily extract information about out of band links. + */ +NS_SWIFT_NAME(ActionCodeURL) +@interface FIRActionCodeURL : NSObject + +/** @property APIKey + @brief Returns the API key from the link. nil, if not provided. + */ +@property(nonatomic, nullable, copy, readonly) NSString *APIKey; + +/** @property operation + @brief Returns the mode of oob action. The property will be of FIRActionCodeOperation type. + It will return FIRActionCodeOperationUnknown if no oob action is provided. + */ +@property(nonatomic, readonly) FIRActionCodeOperation operation; + +/** @property code + @brief Returns the email action code from the link. nil, if not provided. + */ +@property(nonatomic, nullable, copy, readonly) NSString *code; + +/** @property continueURL + @brief Returns the continue URL from the link. nil, if not provided. + */ +@property(nonatomic, nullable, copy, readonly) NSURL *continueURL; + +/** @property languageCode + @brief Returns the language code from the link. nil, if not provided. + */ +@property(nonatomic, nullable, copy, readonly) NSString *languageCode; + +/** @fn actionCodeURLWithLink: + @brief Construct an FIRActionCodeURL from an out of band link (e.g. email link). + @param link The oob link string used to construct the action code URL. + @return The FIRActionCodeURL object constructed based on the oob link provided. + */ ++ (nullable instancetype)actionCodeURLWithLink:(NSString *)link; + +/** @fn init + @brief Please use actionCodeURLWithLink: for Objective-C or actionCodeURLWithLink(link:) for + Swift instead. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +/** @typedef FIRCheckActionCodeCallBack + @brief The type of block invoked when performing a check action code operation. + + @param info Metadata corresponding to the action code. + @param error Optionally; if an error occurs, this is the NSError object that describes the + problem. Set to nil otherwise. + */ +typedef void (^FIRCheckActionCodeCallBack)(FIRActionCodeInfo *_Nullable info, + NSError *_Nullable error) + NS_SWIFT_NAME(CheckActionCodeCallback); + +/** @class FIRAuth + @brief Manages authentication for Firebase apps. + @remarks This class is thread-safe. + */ +NS_SWIFT_NAME(Auth) +@interface FIRAuth : NSObject + +/** @fn auth + @brief Gets the auth object for the default Firebase app. + @remarks The default Firebase app must have already been configured or an exception will be + raised. + */ ++ (FIRAuth *)auth NS_SWIFT_NAME(auth()); + +/** @fn authWithApp: + @brief Gets the auth object for a `FIRApp`. + + @param app The FIRApp for which to retrieve the associated FIRAuth instance. + @return The FIRAuth instance associated with the given FIRApp. + */ ++ (FIRAuth *)authWithApp:(FIRApp *)app NS_SWIFT_NAME(auth(app:)); + +/** @property app + @brief Gets the `FIRApp` object that this auth object is connected to. + */ +@property(nonatomic, weak, readonly, nullable) FIRApp *app; + +/** @property currentUser + @brief Synchronously gets the cached current user, or null if there is none. + */ +@property(nonatomic, strong, readonly, nullable) FIRUser *currentUser; + +/** @property languageCode + @brief The current user language code. This property can be set to the app's current language by + calling `useAppLanguage`. + + @remarks The string used to set this property must be a language code that follows BCP 47. + */ +@property(nonatomic, copy, nullable) NSString *languageCode; + +/** @property settings + @brief Contains settings related to the auth object. + */ +@property(nonatomic, copy, nullable) FIRAuthSettings *settings; + +/** @property userAccessGroup + @brief The current user access group that the Auth instance is using. Default is nil. + */ +@property(readonly, nonatomic, copy, nullable) NSString *userAccessGroup; + +#if TARGET_OS_IOS +/** @property APNSToken + @brief The APNs token used for phone number authentication. The type of the token (production + or sandbox) will be attempted to be automatcially detected. + @remarks If swizzling is disabled, the APNs Token must be set for phone number auth to work, + by either setting this property or by calling `setAPNSToken:type:` + */ +@property(nonatomic, strong, nullable) NSData *APNSToken; +#endif + +/** @fn init + @brief Please access auth instances using `FIRAuth.auth` and `FIRAuth.authForApp:`. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn updateCurrentUser:completion: + @brief Sets the currentUser on the calling Auth instance to the provided user object. + @param user The user object to be set as the current user of the calling Auth instance. + @param completion Optionally; a block invoked after the user of the calling Auth instance has + been updated or an error was encountered. + */ +- (void)updateCurrentUser:(FIRUser *)user completion:(nullable FIRUserUpdateCallback)completion; + +/** @fn fetchProvidersForEmail:completion: + @brief Please use fetchSignInMethodsForEmail:completion: for Objective-C or + fetchSignInMethods(forEmail:completion:) for Swift instead. + */ +- (void)fetchProvidersForEmail:(NSString *)email + completion:(nullable FIRProviderQueryCallback)completion + DEPRECATED_MSG_ATTRIBUTE("Please use fetchSignInMethodsForEmail:completion: for Objective-C or " + "fetchSignInMethods(forEmail:completion:) for Swift instead."); + +/** @fn fetchSignInMethodsForEmail:completion: + @brief Fetches the list of all sign-in methods previously used for the provided email address. + + @param email The email address for which to obtain a list of sign-in methods. + @param completion Optionally; a block which is invoked when the list of sign in methods for the + specified email address is ready or an error was encountered. Invoked asynchronously on the + main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. + + @remarks See @c FIRAuthErrors for a list of error codes that are common to all API methods. + */ + +- (void)fetchSignInMethodsForEmail:(NSString *)email + completion:(nullable FIRSignInMethodQueryCallback)completion; + +/** @fn signInWithEmail:password:completion: + @brief Signs in using an email address and password. + + @param email The user's email address. + @param password The user's password. + @param completion Optionally; a block which is invoked when the sign in flow finishes, or is + canceled. Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that email and password + accounts are not enabled. Enable them in the Auth section of the + Firebase console. + + `FIRAuthErrorCodeUserDisabled` - Indicates the user's account is disabled. + + `FIRAuthErrorCodeWrongPassword` - Indicates the user attempted + sign in with an incorrect password. + + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. + + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)signInWithEmail:(NSString *)email + password:(NSString *)password + completion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn signInWithEmail:link:completion: + @brief Signs in using an email address and email sign-in link. + + @param email The user's email address. + @param link The email sign-in link. + @param completion Optionally; a block which is invoked when the sign in flow finishes, or is + canceled. Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that email and email sign-in link + accounts are not enabled. Enable them in the Auth section of the + Firebase console. + + `FIRAuthErrorCodeUserDisabled` - Indicates the user's account is disabled. + + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is invalid. + + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ + +- (void)signInWithEmail:(NSString *)email + link:(NSString *)link + completion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn signInWithProvider:UIDelegate:completion: + @brief Signs in using the provided auth provider instance. + + @param provider An instance of an auth provider used to initiate the sign-in flow. + @param UIDelegate Optionally an instance of a class conforming to the FIRAuthUIDelegate + protocol, this is used for presenting the web context. If nil, a default FIRAuthUIDelegate + will be used. + @param completion Optionally; a block which is invoked when the sign in flow finishes, or is + canceled. Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: +
    +
  • @c FIRAuthErrorCodeOperationNotAllowed - Indicates that email and password + accounts are not enabled. Enable them in the Auth section of the + Firebase console. +
  • +
  • @c FIRAuthErrorCodeUserDisabled - Indicates the user's account is disabled. +
  • +
  • @c FIRAuthErrorCodeWebNetworkRequestFailed - Indicates that a network request within a + SFSafariViewController or WKWebView failed. +
  • +
  • @c FIRAuthErrorCodeWebInternalError - Indicates that an internal error occurred within a + SFSafariViewController or WKWebView. +
  • +
  • @c FIRAuthErrorCodeWebSignInUserInteractionFailure - Indicates a general failure during + a web sign-in flow. +
  • +
  • @c FIRAuthErrorCodeWebContextAlreadyPresented - Indicates that an attempt was made to + present a new web context while one was already being presented. +
  • +
  • @c FIRAuthErrorCodeWebContextCancelled - Indicates that the URL presentation was + cancelled prematurely by the user. +
  • +
  • @c FIRAuthErrorCodeAccountExistsWithDifferentCredential - Indicates the email asserted + by the credential (e.g. the email in a Facebook access token) is already in use by an + existing account, that cannot be authenticated with this sign-in method. Call + fetchProvidersForEmail for this user’s email and then prompt them to sign in with any of + the sign-in providers returned. This error will only be thrown if the "One account per + email address" setting is enabled in the Firebase console, under Auth settings. +
  • +
+ + @remarks See @c FIRAuthErrors for a list of error codes that are common to all API methods. + */ +- (void)signInWithProvider:(id)provider + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn signInAndRetrieveDataWithCredential:completion: + @brief Please use signInWithCredential:completion: for Objective-C or " + "signIn(with:completion:) for Swift instead. + */ +- (void)signInAndRetrieveDataWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion + DEPRECATED_MSG_ATTRIBUTE("Please use signInWithCredential:completion: for Objective-C or " + "signIn(with:completion:) for Swift instead."); + +/** @fn signInWithCredential:completion: + @brief Asynchronously signs in to Firebase with the given 3rd-party credentials (e.g. a Facebook + login Access Token, a Google ID Token/Access Token pair, etc.) and returns additional + identity provider data. + + @param credential The credential supplied by the IdP. + @param completion Optionally; a block which is invoked when the sign in flow finishes, or is + canceled. Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidCredential` - Indicates the supplied credential is invalid. + This could happen if it has expired or it is malformed. + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that accounts + with the identity provider represented by the credential are not enabled. + Enable them in the Auth section of the Firebase console. + + `FIRAuthErrorCodeAccountExistsWithDifferentCredential` - Indicates the email asserted + by the credential (e.g. the email in a Facebook access token) is already in use by an + existing account, that cannot be authenticated with this sign-in method. Call + fetchProvidersForEmail for this user’s email and then prompt them to sign in with any of + the sign-in providers returned. This error will only be thrown if the "One account per + email address" setting is enabled in the Firebase console, under Auth settings. + + `FIRAuthErrorCodeUserDisabled` - Indicates the user's account is disabled. + + `FIRAuthErrorCodeWrongPassword` - Indicates the user attempted sign in with an + incorrect password, if credential is of the type EmailPasswordAuthCredential. + + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. + + `FIRAuthErrorCodeMissingVerificationID` - Indicates that the phone auth credential was + created with an empty verification ID. + + `FIRAuthErrorCodeMissingVerificationCode` - Indicates that the phone auth credential + was created with an empty verification code. + + `FIRAuthErrorCodeInvalidVerificationCode` - Indicates that the phone auth credential + was created with an invalid verification Code. + + `FIRAuthErrorCodeInvalidVerificationID` - Indicates that the phone auth credential was + created with an invalid verification ID. + + `FIRAuthErrorCodeSessionExpired` - Indicates that the SMS code has expired. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods +*/ +- (void)signInWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn signInAnonymouslyWithCompletion: + @brief Asynchronously creates and becomes an anonymous user. + @param completion Optionally; a block which is invoked when the sign in finishes, or is + canceled. Invoked asynchronously on the main thread in the future. + + @remarks If there is already an anonymous user signed in, that user will be returned instead. + If there is any other existing user signed in, that user will be signed out. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that anonymous accounts are + not enabled. Enable them in the Auth section of the Firebase console. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)signInAnonymouslyWithCompletion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn signInWithCustomToken:completion: + @brief Asynchronously signs in to Firebase with the given Auth token. + + @param token A self-signed custom auth token. + @param completion Optionally; a block which is invoked when the sign in finishes, or is + canceled. Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidCustomToken` - Indicates a validation error with + the custom token. + + `FIRAuthErrorCodeCustomTokenMismatch` - Indicates the service account and the API key + belong to different projects. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)signInWithCustomToken:(NSString *)token + completion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn createUserWithEmail:password:completion: + @brief Creates and, on success, signs in a user with the given email address and password. + + @param email The user's email address. + @param password The user's desired password. + @param completion Optionally; a block which is invoked when the sign up flow finishes, or is + canceled. Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. + + `FIRAuthErrorCodeEmailAlreadyInUse` - Indicates the email used to attempt sign up + already exists. Call fetchProvidersForEmail to check which sign-in mechanisms the user + used, and prompt the user to sign in with one of those. + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that email and password accounts + are not enabled. Enable them in the Auth section of the Firebase console. + + `FIRAuthErrorCodeWeakPassword` - Indicates an attempt to set a password that is + considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo + dictionary object will contain more detailed explanation that can be shown to the user. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)createUserWithEmail:(NSString *)email + password:(NSString *)password + completion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn confirmPasswordResetWithCode:newPassword:completion: + @brief Resets the password given a code sent to the user outside of the app and a new password + for the user. + + @param newPassword The new password. + @param completion Optionally; a block which is invoked when the request finishes. Invoked + asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeWeakPassword` - Indicates an attempt to set a password that is + considered too weak. + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates the administrator disabled sign + in with the specified identity provider. + + `FIRAuthErrorCodeExpiredActionCode` - Indicates the OOB code is expired. + + `FIRAuthErrorCodeInvalidActionCode` - Indicates the OOB code is invalid. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)confirmPasswordResetWithCode:(NSString *)code + newPassword:(NSString *)newPassword + completion:(FIRConfirmPasswordResetCallback)completion; + +/** @fn checkActionCode:completion: + @brief Checks the validity of an out of band code. + + @param code The out of band code to check validity. + @param completion Optionally; a block which is invoked when the request finishes. Invoked + asynchronously on the main thread in the future. + */ +- (void)checkActionCode:(NSString *)code completion:(FIRCheckActionCodeCallBack)completion; + +/** @fn verifyPasswordResetCode:completion: + @brief Checks the validity of a verify password reset code. + + @param code The password reset code to be verified. + @param completion Optionally; a block which is invoked when the request finishes. Invoked + asynchronously on the main thread in the future. + */ +- (void)verifyPasswordResetCode:(NSString *)code + completion:(FIRVerifyPasswordResetCodeCallback)completion; + +/** @fn applyActionCode:completion: + @brief Applies out of band code. + + @param code The out of band code to be applied. + @param completion Optionally; a block which is invoked when the request finishes. Invoked + asynchronously on the main thread in the future. + + @remarks This method will not work for out of band codes which require an additional parameter, + such as password reset code. + */ +- (void)applyActionCode:(NSString *)code completion:(FIRApplyActionCodeCallback)completion; + +/** @fn sendPasswordResetWithEmail:completion: + @brief Initiates a password reset for the given email address. + + @param email The email address of the user. + @param completion Optionally; a block which is invoked when the request finishes. Invoked + asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was + sent in the request. + + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in + the console for this action. + + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for + sending update email. + + + */ +- (void)sendPasswordResetWithEmail:(NSString *)email + completion:(nullable FIRSendPasswordResetCallback)completion; + +/** @fn sendPasswordResetWithEmail:actionCodeSetting:completion: + @brief Initiates a password reset for the given email address and @FIRActionCodeSettings object. + + @param email The email address of the user. + @param actionCodeSettings An `FIRActionCodeSettings` object containing settings related to + handling action codes. + @param completion Optionally; a block which is invoked when the request finishes. Invoked + asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was + sent in the request. + + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in + the console for this action. + + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for + sending update email. + + `FIRAuthErrorCodeMissingIosBundleID` - Indicates that the iOS bundle ID is missing when + `handleCodeInApp` is set to YES. + + `FIRAuthErrorCodeMissingAndroidPackageName` - Indicates that the android package name + is missing when the `androidInstallApp` flag is set to true. + + `FIRAuthErrorCodeUnauthorizedDomain` - Indicates that the domain specified in the + continue URL is not whitelisted in the Firebase console. + + `FIRAuthErrorCodeInvalidContinueURI` - Indicates that the domain specified in the + continue URI is not valid. + + + */ +- (void)sendPasswordResetWithEmail:(NSString *)email + actionCodeSettings:(FIRActionCodeSettings *)actionCodeSettings + completion:(nullable FIRSendPasswordResetCallback)completion; + +/** @fn sendSignInLinkToEmail:actionCodeSettings:completion: + @brief Sends a sign in with email link to provided email address. + + @param email The email address of the user. + @param actionCodeSettings An `FIRActionCodeSettings` object containing settings related to + handling action codes. + @param completion Optionally; a block which is invoked when the request finishes. Invoked + asynchronously on the main thread in the future. + */ +- (void)sendSignInLinkToEmail:(NSString *)email + actionCodeSettings:(FIRActionCodeSettings *)actionCodeSettings + completion:(nullable FIRSendSignInLinkToEmailCallback)completion; + +/** @fn signOut: + @brief Signs out the current user. + + @param error Optionally; if an error occurs, upon return contains an NSError object that + describes the problem; is nil otherwise. + @return @YES when the sign out request was successful. @NO otherwise. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeKeychainError` - Indicates an error occurred when accessing the + keychain. The `NSLocalizedFailureReasonErrorKey` field in the `NSError.userInfo` + dictionary will contain more information about the error encountered. + + + + */ +- (BOOL)signOut:(NSError *_Nullable *_Nullable)error; + +/** @fn isSignInWithEmailLink + @brief Checks if link is an email sign-in link. + + @param link The email sign-in link. + @return @YES when the link passed matches the expected format of an email sign-in link. + */ +- (BOOL)isSignInWithEmailLink:(NSString *)link; + +/** @fn addAuthStateDidChangeListener: + @brief Registers a block as an "auth state did change" listener. To be invoked when: + + + The block is registered as a listener, + + A user with a different UID from the current user has signed in, or + + The current user has signed out. + + @param listener The block to be invoked. The block is always invoked asynchronously on the main + thread, even for it's initial invocation after having been added as a listener. + + @remarks The block is invoked immediately after adding it according to it's standard invocation + semantics, asynchronously on the main thread. Users should pay special attention to + making sure the block does not inadvertently retain objects which should not be retained by + the long-lived block. The block itself will be retained by `FIRAuth` until it is + unregistered or until the `FIRAuth` instance is otherwise deallocated. + + @return A handle useful for manually unregistering the block as a listener. + */ +- (FIRAuthStateDidChangeListenerHandle)addAuthStateDidChangeListener: + (FIRAuthStateDidChangeListenerBlock)listener; + +/** @fn removeAuthStateDidChangeListener: + @brief Unregisters a block as an "auth state did change" listener. + + @param listenerHandle The handle for the listener. + */ +- (void)removeAuthStateDidChangeListener:(FIRAuthStateDidChangeListenerHandle)listenerHandle; + +/** @fn addIDTokenDidChangeListener: + @brief Registers a block as an "ID token did change" listener. To be invoked when: + + + The block is registered as a listener, + + A user with a different UID from the current user has signed in, + + The ID token of the current user has been refreshed, or + + The current user has signed out. + + @param listener The block to be invoked. The block is always invoked asynchronously on the main + thread, even for it's initial invocation after having been added as a listener. + + @remarks The block is invoked immediately after adding it according to it's standard invocation + semantics, asynchronously on the main thread. Users should pay special attention to + making sure the block does not inadvertently retain objects which should not be retained by + the long-lived block. The block itself will be retained by `FIRAuth` until it is + unregistered or until the `FIRAuth` instance is otherwise deallocated. + + @return A handle useful for manually unregistering the block as a listener. + */ +- (FIRIDTokenDidChangeListenerHandle)addIDTokenDidChangeListener: + (FIRIDTokenDidChangeListenerBlock)listener; + +/** @fn removeIDTokenDidChangeListener: + @brief Unregisters a block as an "ID token did change" listener. + + @param listenerHandle The handle for the listener. + */ +- (void)removeIDTokenDidChangeListener:(FIRIDTokenDidChangeListenerHandle)listenerHandle; + +/** @fn useAppLanguage + @brief Sets `languageCode` to the app's current language. + */ +- (void)useAppLanguage; + +#if TARGET_OS_IOS + +/** @fn canHandleURL: + @brief Whether the specific URL is handled by `FIRAuth` . + @param URL The URL received by the application delegate from any of the openURL method. + @return Whether or the URL is handled. YES means the URL is for Firebase Auth + so the caller should ignore the URL from further processing, and NO means the + the URL is for the app (or another libaray) so the caller should continue handling + this URL as usual. + @remarks If swizzling is disabled, URLs received by the application delegate must be forwarded + to this method for phone number auth to work. + */ +- (BOOL)canHandleURL:(nonnull NSURL *)URL; + +/** @fn setAPNSToken:type: + @brief Sets the APNs token along with its type. + @remarks If swizzling is disabled, the APNs Token must be set for phone number auth to work, + by either setting calling this method or by setting the `APNSToken` property. + */ +- (void)setAPNSToken:(NSData *)token type:(FIRAuthAPNSTokenType)type; + +/** @fn canHandleNotification: + @brief Whether the specific remote notification is handled by `FIRAuth` . + @param userInfo A dictionary that contains information related to the + notification in question. + @return Whether or the notification is handled. YES means the notification is for Firebase Auth + so the caller should ignore the notification from further processing, and NO means the + the notification is for the app (or another libaray) so the caller should continue handling + this notification as usual. + @remarks If swizzling is disabled, related remote notifications must be forwarded to this method + for phone number auth to work. + */ +- (BOOL)canHandleNotification:(NSDictionary *)userInfo; + +#endif // TARGET_OS_IOS + +#pragma mark - User sharing + +/** @fn useUserAccessGroup:error: + @brief Switch userAccessGroup and current user to the given accessGroup and the user stored in + it. + */ +- (BOOL)useUserAccessGroup:(NSString *_Nullable)accessGroup + error:(NSError *_Nullable *_Nullable)outError; + +/** @fn getStoredUserForAccessGroup:error: + @brief Get the stored user in the given accessGroup. + */ +- (nullable FIRUser *)getStoredUserForAccessGroup:(NSString *_Nullable)accessGroup + error:(NSError *_Nullable *_Nullable)outError; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthAPNSTokenType.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthAPNSTokenType.h new file mode 100644 index 00000000..5630e219 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthAPNSTokenType.h @@ -0,0 +1,45 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * @brief The APNs token type for the app. + */ +typedef NS_ENUM(NSInteger, FIRAuthAPNSTokenType) { + + /** Unknown token type. + The actual token type will be detected from the provisioning profile in the app's bundle. + */ + FIRAuthAPNSTokenTypeUnknown, + + /** Sandbox token type. + */ + FIRAuthAPNSTokenTypeSandbox, + + /** Production token type. + */ + FIRAuthAPNSTokenTypeProd, +} NS_SWIFT_NAME(AuthAPNSTokenType); + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthCredential.h new file mode 100644 index 00000000..106d844f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthCredential.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthCredential + @brief Represents a credential. + */ +NS_SWIFT_NAME(AuthCredential) +@interface FIRAuthCredential : NSObject + +/** @property provider + @brief Gets the name of the identity provider for the credential. + */ +@property(nonatomic, copy, readonly) NSString *provider; + +/** @fn init + @brief This is an abstract base class. Concrete instances should be created via factory + methods available in the various authentication provider libraries (like the Facebook + provider or the Google provider libraries.) + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthDataResult.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthDataResult.h new file mode 100644 index 00000000..93c8b3bc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthDataResult.h @@ -0,0 +1,57 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAdditionalUserInfo; +@class FIRAuthCredential; +@class FIRUser; + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthDataResult + @brief Helper object that contains the result of a successful sign-in, link and reauthenticate + action. It contains references to a FIRUser instance and a FIRAdditionalUserInfo instance. + */ +NS_SWIFT_NAME(AuthDataResult) +@interface FIRAuthDataResult : NSObject + +/** @fn init + @brief This class should not be initialized manually. `FIRAuthDataResult` instance is + returned as part of `FIRAuthDataResultCallback`. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @property user + @brief The signed in user. + */ +@property(nonatomic, readonly) FIRUser *user; + +/** @property additionalUserInfo + @brief If available contains the additional IdP specific information about signed in user. + */ +@property(nonatomic, readonly, nullable) FIRAdditionalUserInfo *additionalUserInfo; + +/** @property credential + @brief This property will be non-nil after a successful headful-lite sign-in via + signInWithProvider:UIDelegate:. May be used to obtain the accessToken and/or IDToken + pertaining to a recently signed-in user. + */ +@property(nonatomic, readonly, nullable) FIRAuthCredential *credential; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthErrors.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthErrors.h new file mode 100644 index 00000000..dede5a07 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthErrors.h @@ -0,0 +1,421 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthErrors + @remarks Error Codes common to all API Methods: + + + `FIRAuthErrorCodeNetworkError` + + `FIRAuthErrorCodeUserNotFound` + + `FIRAuthErrorCodeUserTokenExpired` + + `FIRAuthErrorCodeTooManyRequests` + + `FIRAuthErrorCodeInvalidAPIKey` + + `FIRAuthErrorCodeAppNotAuthorized` + + `FIRAuthErrorCodeKeychainError` + + `FIRAuthErrorCodeInternalError` + + @remarks Common error codes for `FIRUser` operations: + + + `FIRAuthErrorCodeInvalidUserToken` + + `FIRAuthErrorCodeUserDisabled` + + */ +NS_SWIFT_NAME(AuthErrors) +@interface FIRAuthErrors + +/** + @brief The Firebase Auth error domain. + */ +extern NSString *const FIRAuthErrorDomain NS_SWIFT_NAME(AuthErrorDomain); + +/** + @brief The name of the key for the error short string of an error code. + */ +extern NSString *const FIRAuthErrorUserInfoNameKey NS_SWIFT_NAME(AuthErrorUserInfoNameKey); + +/** + @brief Errors with one of the following three codes: + - `FIRAuthErrorCodeAccountExistsWithDifferentCredential` + - `FIRAuthErrorCodeCredentialAlreadyInUse` + - `FIRAuthErrorCodeEmailAlreadyInUse` + may contain an `NSError.userInfo` dictinary object which contains this key. The value + associated with this key is an NSString of the email address of the account that already + exists. + */ +extern NSString *const FIRAuthErrorUserInfoEmailKey NS_SWIFT_NAME(AuthErrorUserInfoEmailKey); + +/** + @brief The key used to read the updated Auth credential from the userInfo dictionary of the + NSError object returned. This is the updated auth credential the developer should use for + recovery if applicable. + */ +extern NSString *const FIRAuthErrorUserInfoUpdatedCredentialKey + NS_SWIFT_NAME(AuthErrorUserInfoUpdatedCredentialKey); + +/** + @brief The key used to read the MFA resolver from the userInfo dictionary of the NSError object + returned when 2FA is required for sign-incompletion. + */ +extern NSString *const FIRAuthErrorUserInfoMultiFactorResolverKey + NS_SWIFT_NAME(AuthErrorUserInfoMultiFactorResolverKey); + +/** + @brief Error codes used by Firebase Auth. + */ +typedef NS_ENUM(NSInteger, FIRAuthErrorCode) { + /** Indicates a validation error with the custom token. + */ + FIRAuthErrorCodeInvalidCustomToken = 17000, + + /** Indicates the service account and the API key belong to different projects. + */ + FIRAuthErrorCodeCustomTokenMismatch = 17002, + + /** Indicates the IDP token or requestUri is invalid. + */ + FIRAuthErrorCodeInvalidCredential = 17004, + + /** Indicates the user's account is disabled on the server. + */ + FIRAuthErrorCodeUserDisabled = 17005, + + /** Indicates the administrator disabled sign in with the specified identity provider. + */ + FIRAuthErrorCodeOperationNotAllowed = 17006, + + /** Indicates the email used to attempt a sign up is already in use. + */ + FIRAuthErrorCodeEmailAlreadyInUse = 17007, + + /** Indicates the email is invalid. + */ + FIRAuthErrorCodeInvalidEmail = 17008, + + /** Indicates the user attempted sign in with a wrong password. + */ + FIRAuthErrorCodeWrongPassword = 17009, + + /** Indicates that too many requests were made to a server method. + */ + FIRAuthErrorCodeTooManyRequests = 17010, + + /** Indicates the user account was not found. + */ + FIRAuthErrorCodeUserNotFound = 17011, + + /** Indicates account linking is required. + */ + FIRAuthErrorCodeAccountExistsWithDifferentCredential = 17012, + + /** Indicates the user has attemped to change email or password more than 5 minutes after + signing in. + */ + FIRAuthErrorCodeRequiresRecentLogin = 17014, + + /** Indicates an attempt to link a provider to which the account is already linked. + */ + FIRAuthErrorCodeProviderAlreadyLinked = 17015, + + /** Indicates an attempt to unlink a provider that is not linked. + */ + FIRAuthErrorCodeNoSuchProvider = 17016, + + /** Indicates user's saved auth credential is invalid, the user needs to sign in again. + */ + FIRAuthErrorCodeInvalidUserToken = 17017, + + /** Indicates a network error occurred (such as a timeout, interrupted connection, or + unreachable host). These types of errors are often recoverable with a retry. The + `NSUnderlyingError` field in the `NSError.userInfo` dictionary will contain the error + encountered. + */ + FIRAuthErrorCodeNetworkError = 17020, + + /** Indicates the saved token has expired, for example, the user may have changed account + password on another device. The user needs to sign in again on the device that made this + request. + */ + FIRAuthErrorCodeUserTokenExpired = 17021, + + /** Indicates an invalid API key was supplied in the request. + */ + FIRAuthErrorCodeInvalidAPIKey = 17023, + + /** Indicates that an attempt was made to reauthenticate with a user which is not the current + user. + */ + FIRAuthErrorCodeUserMismatch = 17024, + + /** Indicates an attempt to link with a credential that has already been linked with a + different Firebase account + */ + FIRAuthErrorCodeCredentialAlreadyInUse = 17025, + + /** Indicates an attempt to set a password that is considered too weak. + */ + FIRAuthErrorCodeWeakPassword = 17026, + + /** Indicates the App is not authorized to use Firebase Authentication with the + provided API Key. + */ + FIRAuthErrorCodeAppNotAuthorized = 17028, + + /** Indicates the OOB code is expired. + */ + FIRAuthErrorCodeExpiredActionCode = 17029, + + /** Indicates the OOB code is invalid. + */ + FIRAuthErrorCodeInvalidActionCode = 17030, + + /** Indicates that there are invalid parameters in the payload during a "send password reset + * email" attempt. + */ + FIRAuthErrorCodeInvalidMessagePayload = 17031, + + /** Indicates that the sender email is invalid during a "send password reset email" attempt. + */ + FIRAuthErrorCodeInvalidSender = 17032, + + /** Indicates that the recipient email is invalid. + */ + FIRAuthErrorCodeInvalidRecipientEmail = 17033, + + /** Indicates that an email address was expected but one was not provided. + */ + FIRAuthErrorCodeMissingEmail = 17034, + + // The enum values 17035 is reserved and should NOT be used for new error codes. + + /** Indicates that the iOS bundle ID is missing when a iOS App Store ID is provided. + */ + FIRAuthErrorCodeMissingIosBundleID = 17036, + + /** Indicates that the android package name is missing when the `androidInstallApp` flag is set + to true. + */ + FIRAuthErrorCodeMissingAndroidPackageName = 17037, + + /** Indicates that the domain specified in the continue URL is not whitelisted in the Firebase + console. + */ + FIRAuthErrorCodeUnauthorizedDomain = 17038, + + /** Indicates that the domain specified in the continue URI is not valid. + */ + FIRAuthErrorCodeInvalidContinueURI = 17039, + + /** Indicates that a continue URI was not provided in a request to the backend which requires + one. + */ + FIRAuthErrorCodeMissingContinueURI = 17040, + + /** Indicates that a phone number was not provided in a call to + `verifyPhoneNumber:completion:`. + */ + FIRAuthErrorCodeMissingPhoneNumber = 17041, + + /** Indicates that an invalid phone number was provided in a call to + `verifyPhoneNumber:completion:`. + */ + FIRAuthErrorCodeInvalidPhoneNumber = 17042, + + /** Indicates that the phone auth credential was created with an empty verification code. + */ + FIRAuthErrorCodeMissingVerificationCode = 17043, + + /** Indicates that an invalid verification code was used in the verifyPhoneNumber request. + */ + FIRAuthErrorCodeInvalidVerificationCode = 17044, + + /** Indicates that the phone auth credential was created with an empty verification ID. + */ + FIRAuthErrorCodeMissingVerificationID = 17045, + + /** Indicates that an invalid verification ID was used in the verifyPhoneNumber request. + */ + FIRAuthErrorCodeInvalidVerificationID = 17046, + + /** Indicates that the APNS device token is missing in the verifyClient request. + */ + FIRAuthErrorCodeMissingAppCredential = 17047, + + /** Indicates that an invalid APNS device token was used in the verifyClient request. + */ + FIRAuthErrorCodeInvalidAppCredential = 17048, + + // The enum values between 17048 and 17051 are reserved and should NOT be used for new error + // codes. + + /** Indicates that the SMS code has expired. + */ + FIRAuthErrorCodeSessionExpired = 17051, + + /** Indicates that the quota of SMS messages for a given project has been exceeded. + */ + FIRAuthErrorCodeQuotaExceeded = 17052, + + /** Indicates that the APNs device token could not be obtained. The app may not have set up + remote notification correctly, or may fail to forward the APNs device token to FIRAuth + if app delegate swizzling is disabled. + */ + FIRAuthErrorCodeMissingAppToken = 17053, + + /** Indicates that the app fails to forward remote notification to FIRAuth. + */ + FIRAuthErrorCodeNotificationNotForwarded = 17054, + + /** Indicates that the app could not be verified by Firebase during phone number authentication. + */ + FIRAuthErrorCodeAppNotVerified = 17055, + + /** Indicates that the reCAPTCHA token is not valid. + */ + FIRAuthErrorCodeCaptchaCheckFailed = 17056, + + /** Indicates that an attempt was made to present a new web context while one was already being + presented. + */ + FIRAuthErrorCodeWebContextAlreadyPresented = 17057, + + /** Indicates that the URL presentation was cancelled prematurely by the user. + */ + FIRAuthErrorCodeWebContextCancelled = 17058, + + /** Indicates a general failure during the app verification flow. + */ + FIRAuthErrorCodeAppVerificationUserInteractionFailure = 17059, + + /** Indicates that the clientID used to invoke a web flow is invalid. + */ + FIRAuthErrorCodeInvalidClientID = 17060, + + /** Indicates that a network request within a SFSafariViewController or WKWebView failed. + */ + FIRAuthErrorCodeWebNetworkRequestFailed = 17061, + + /** Indicates that an internal error occurred within a SFSafariViewController or WKWebView. + */ + FIRAuthErrorCodeWebInternalError = 17062, + + /** Indicates a general failure during a web sign-in flow. + */ + FIRAuthErrorCodeWebSignInUserInteractionFailure = 17063, + + /** Indicates that the local player was not authenticated prior to attempting Game Center + signin. + */ + FIRAuthErrorCodeLocalPlayerNotAuthenticated = 17066, + + /** Indicates that a non-null user was expected as an argmument to the operation but a null + user was provided. + */ + FIRAuthErrorCodeNullUser = 17067, + + /** Indicates that a Firebase Dynamic Link is not activated. + */ + FIRAuthErrorCodeDynamicLinkNotActivated = 17068, + + /** + * Represents the error code for when the given provider id for a web operation is invalid. + */ + FIRAuthErrorCodeInvalidProviderID = 17071, + + /** Indicates that the Firebase Dynamic Link domain used is either not configured or is + unauthorized for the current project. + */ + FIRAuthErrorCodeInvalidDynamicLinkDomain = 17074, + + /** Indicates that the credential is rejected because it's misformed or mismatching. + */ + FIRAuthErrorCodeRejectedCredential = 17075, + + /** Indicates that the GameKit framework is not linked prior to attempting Game Center signin. + */ + FIRAuthErrorCodeGameKitNotLinked = 17076, + + /** Indicates that the second factor is required for signin. + */ + FIRAuthErrorCodeSecondFactorRequired = 17078, + + /** Indicates that the multi factor session is missing. + */ + FIRAuthErrorCodeMissingMultiFactorSession = 17081, + + /** Indicates that the multi factor info is missing. + */ + FIRAuthErrorCodeMissingMultiFactorInfo = 17082, + + /** Indicates that the multi factor session is invalid. + */ + FIRAuthErrorCodeInvalidMultiFactorSession = 17083, + + /** Indicates that the multi factor info is not found. + */ + FIRAuthErrorCodeMultiFactorInfoNotFound = 17084, + + /** Indicates that the operation is admin restricted. + */ + FIRAuthErrorCodeAdminRestrictedOperation = 17085, + + /** Indicates that the email is required for verification. + */ + FIRAuthErrorCodeUnverifiedEmail = 17086, + + /** Indicates that the second factor is already enrolled. + */ + FIRAuthErrorCodeSecondFactorAlreadyEnrolled = 17087, + + /** Indicates that the maximum second factor count is exceeded. + */ + FIRAuthErrorCodeMaximumSecondFactorCountExceeded = 17088, + + /** Indicates that the first factor is not supported. + */ + FIRAuthErrorCodeUnsupportedFirstFactor = 17089, + + /** Indicates that the a verifed email is required to changed to. + */ + FIRAuthErrorCodeEmailChangeNeedsVerification = 17090, + + /** Indicates that the nonce is missing or invalid. + */ + FIRAuthErrorCodeMissingOrInvalidNonce = 17094, + + /** Indicates an error for when the client identifier is missing. + */ + FIRAuthErrorCodeMissingClientIdentifier = 17993, + + /** Indicates an error occurred while attempting to access the keychain. + */ + FIRAuthErrorCodeKeychainError = 17995, + + /** Indicates an internal error occurred. + */ + FIRAuthErrorCodeInternalError = 17999, + + /** Raised when a JWT fails to parse correctly. May be accompanied by an underlying error + describing which step of the JWT parsing process failed. + */ + FIRAuthErrorCodeMalformedJWT = 18000, +} NS_SWIFT_NAME(AuthErrorCode); + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthSettings.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthSettings.h new file mode 100644 index 00000000..60ba7109 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthSettings.h @@ -0,0 +1,35 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthSettings + @brief Determines settings related to an auth object. + */ +NS_SWIFT_NAME(AuthSettings) +@interface FIRAuthSettings : NSObject + +/** @property appVerificationDisabledForTesting + @brief Flag to determine whether app verification should be disabled for testing or not. + */ +@property(nonatomic, assign, getter=isAppVerificationDisabledForTesting) + BOOL appVerificationDisabledForTesting; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthTokenResult.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthTokenResult.h new file mode 100644 index 00000000..3c98c5f8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthTokenResult.h @@ -0,0 +1,69 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthTokenResult + @brief A data class containing the ID token JWT string and other properties associated with the + token including the decoded payload claims. + */ +NS_SWIFT_NAME(AuthTokenResult) +@interface FIRAuthTokenResult : NSObject + +/** @property token + @brief Stores the JWT string of the ID token. + */ +@property(nonatomic, readonly) NSString *token; + +/** @property expirationDate + @brief Stores the ID token's expiration date. + */ +@property(nonatomic, readonly) NSDate *expirationDate; + +/** @property authDate + @brief Stores the ID token's authentication date. + @remarks This is the date the user was signed in and NOT the date the token was refreshed. + */ +@property(nonatomic, readonly) NSDate *authDate; + +/** @property issuedAtDate + @brief Stores the date that the ID token was issued. + @remarks This is the date last refreshed and NOT the last authentication date. + */ +@property(nonatomic, readonly) NSDate *issuedAtDate; + +/** @property signInProvider + @brief Stores sign-in provider through which the token was obtained. + @remarks This does not necessarily map to provider IDs. + */ +@property(nonatomic, readonly) NSString *signInProvider; + +/** @property signInSecondFactor + @brief Stores sign-in second factor through which the token was obtained. + */ +@property(nonatomic, readonly) NSString *signInSecondFactor; + +/** @property claims + @brief Stores the entire payload of claims found on the ID token. This includes the standard + reserved claims as well as custom claims set by the developer via the Admin SDK. + */ +@property(nonatomic, readonly) NSDictionary *claims; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthUIDelegate.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthUIDelegate.h new file mode 100644 index 00000000..43b7fb2e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRAuthUIDelegate.h @@ -0,0 +1,59 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import + +@class UIViewController; + +NS_ASSUME_NONNULL_BEGIN + +/** @protocol FIRAuthUIDelegate + @brief A protocol to handle user interface interactions for Firebase Auth. + */ +NS_SWIFT_NAME(AuthUIDelegate) +@protocol FIRAuthUIDelegate + +/** @fn presentViewController:animated:completion: + @brief If implemented, this method will be invoked when Firebase Auth needs to display a view + controller. + @param viewControllerToPresent The view controller to be presented. + @param flag Decides whether the view controller presentation should be animated or not. + @param completion The block to execute after the presentation finishes. This block has no return + value and takes no parameters. +*/ +- (void)presentViewController:(UIViewController *)viewControllerToPresent + animated:(BOOL)flag + completion:(void (^_Nullable)(void))completion; + +/** @fn dismissViewControllerAnimated:completion: + @brief If implemented, this method will be invoked when Firebase Auth needs to display a view + controller. + @param flag Decides whether removing the view controller should be animated or not. + @param completion The block to execute after the presentation finishes. This block has no return + value and takes no parameters. +*/ +- (void)dismissViewControllerAnimated:(BOOL)flag + completion:(void (^_Nullable)(void))completion + NS_SWIFT_NAME(dismiss(animated:completion:)); + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIREmailAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIREmailAuthProvider.h new file mode 100644 index 00000000..aac0bf0a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIREmailAuthProvider.h @@ -0,0 +1,70 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief A string constant identifying the email & password identity provider. + */ +extern NSString *const FIREmailAuthProviderID NS_SWIFT_NAME(EmailAuthProviderID); + +/** + @brief A string constant identifying the email-link sign-in method. + */ +extern NSString *const FIREmailLinkAuthSignInMethod NS_SWIFT_NAME(EmailLinkAuthSignInMethod); + +/** + @brief A string constant identifying the email & password sign-in method. + */ +extern NSString *const FIREmailPasswordAuthSignInMethod + NS_SWIFT_NAME(EmailPasswordAuthSignInMethod); + +/** @class FIREmailAuthProvider + @brief A concrete implementation of `FIRAuthProvider` for Email & Password Sign In. + */ +NS_SWIFT_NAME(EmailAuthProvider) +@interface FIREmailAuthProvider : NSObject + +/** @fn credentialWithEmail:password: + @brief Creates an `FIRAuthCredential` for an email & password sign in. + + @param email The user's email address. + @param password The user's password. + @return A FIRAuthCredential containing the email & password credential. + */ ++ (FIRAuthCredential *)credentialWithEmail:(NSString *)email password:(NSString *)password; + +/** @fn credentialWithEmail:Link: + @brief Creates an `FIRAuthCredential` for an email & link sign in. + + @param email The user's email address. + @param link The email sign-in link. + @return A FIRAuthCredential containing the email & link credential. + */ ++ (FIRAuthCredential *)credentialWithEmail:(NSString *)email link:(NSString *)link; + +/** @fn init + @brief This class is not meant to be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRFacebookAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRFacebookAuthProvider.h new file mode 100644 index 00000000..75efe13f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRFacebookAuthProvider.h @@ -0,0 +1,54 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief A string constant identifying the Facebook identity provider. + */ +extern NSString *const FIRFacebookAuthProviderID NS_SWIFT_NAME(FacebookAuthProviderID); + +/** + @brief A string constant identifying the Facebook sign-in method. + */ +extern NSString *const _Nonnull FIRFacebookAuthSignInMethod NS_SWIFT_NAME(FacebookAuthSignInMethod); + +/** @class FIRFacebookAuthProvider + @brief Utility class for constructing Facebook credentials. + */ +NS_SWIFT_NAME(FacebookAuthProvider) +@interface FIRFacebookAuthProvider : NSObject + +/** @fn credentialWithAccessToken: + @brief Creates an `FIRAuthCredential` for a Facebook sign in. + + @param accessToken The Access Token from Facebook. + @return A FIRAuthCredential containing the Facebook credentials. + */ ++ (FIRAuthCredential *)credentialWithAccessToken:(NSString *)accessToken; + +/** @fn init + @brief This class should not be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRFederatedAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRFederatedAuthProvider.h new file mode 100644 index 00000000..3effcacb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRFederatedAuthProvider.h @@ -0,0 +1,55 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#if TARGET_OS_IOS +#import "FIRAuthUIDelegate.h" +#endif // TARGET_OS_IOS + +@class FIRAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** + Utility type for constructing federated auth provider credentials. + */ +NS_SWIFT_NAME(FederatedAuthProvider) +@protocol FIRFederatedAuthProvider + +/** @typedef FIRAuthCredentialCallback + @brief The type of block invoked when obtaining an auth credential. + @param credential The credential obtained. + @param error The error that occurred if any. + */ +typedef void (^FIRAuthCredentialCallback)(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) + NS_SWIFT_NAME(AuthCredentialCallback); + +#if TARGET_OS_IOS +/** @fn getCredentialWithUIDelegate:completion: + @brief Used to obtain an auth credential via a mobile web flow. + @param UIDelegate An optional UI delegate used to presenet the mobile web flow. + @param completion Optionally; a block which is invoked asynchronously on the main thread when + the mobile web flow is completed. + */ +- (void)getCredentialWithUIDelegate:(nullable id)UIDelegate + completion:(nullable FIRAuthCredentialCallback)completion; +#endif // TARGET_OS_IOS + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGameCenterAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGameCenterAuthProvider.h new file mode 100644 index 00000000..f84492d6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGameCenterAuthProvider.h @@ -0,0 +1,62 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief A string constant identifying the Game Center identity provider. + */ +extern NSString *const FIRGameCenterAuthProviderID NS_SWIFT_NAME(GameCenterAuthProviderID); + +/** + @brief A string constant identifying the Game Center sign-in method. + */ +extern NSString *const _Nonnull FIRGameCenterAuthSignInMethod NS_SWIFT_NAME( + GameCenterAuthSignInMethod); + +/** @typedef FIRGameCenterCredentialCallback + @brief The type of block invoked when the Game Center credential code has finished. + @param credential On success, the credential will be provided, nil otherwise. + @param error On error, the error that occurred, nil otherwise. + */ +typedef void (^FIRGameCenterCredentialCallback)(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) + NS_SWIFT_NAME(GameCenterCredentialCallback); + +/** @class FIRGameCenterAuthProvider + @brief A concrete implementation of @c FIRAuthProvider for Game Center Sign In. + */ +NS_SWIFT_NAME(GameCenterAuthProvider) +@interface FIRGameCenterAuthProvider : NSObject + +/** @fn getCredentialWithCompletion: + @brief Creates a @c FIRAuthCredential for a Game Center sign in. + */ ++ (void)getCredentialWithCompletion:(FIRGameCenterCredentialCallback)completion + NS_SWIFT_NAME(getCredential(completion:)); + +/** @fn init + @brief This class is not meant to be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGitHubAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGitHubAuthProvider.h new file mode 100644 index 00000000..0577c7bc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGitHubAuthProvider.h @@ -0,0 +1,54 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief A string constant identifying the GitHub identity provider. + */ +extern NSString *const FIRGitHubAuthProviderID NS_SWIFT_NAME(GitHubAuthProviderID); + +/** + @brief A string constant identifying the GitHub sign-in method. + */ +extern NSString *const _Nonnull FIRGitHubAuthSignInMethod NS_SWIFT_NAME(GitHubAuthSignInMethod); + +/** @class FIRGitHubAuthProvider + @brief Utility class for constructing GitHub credentials. + */ +NS_SWIFT_NAME(GitHubAuthProvider) +@interface FIRGitHubAuthProvider : NSObject + +/** @fn credentialWithToken: + @brief Creates an `FIRAuthCredential` for a GitHub sign in. + + @param token The GitHub OAuth access token. + @return A FIRAuthCredential containing the GitHub credential. + */ ++ (FIRAuthCredential *)credentialWithToken:(NSString *)token; + +/** @fn init + @brief This class is not meant to be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGoogleAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGoogleAuthProvider.h new file mode 100644 index 00000000..7d6fa226 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRGoogleAuthProvider.h @@ -0,0 +1,56 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief A string constant identifying the Google identity provider. + */ +extern NSString *const FIRGoogleAuthProviderID NS_SWIFT_NAME(GoogleAuthProviderID); + +/** + @brief A string constant identifying the Google sign-in method. + */ +extern NSString *const _Nonnull FIRGoogleAuthSignInMethod NS_SWIFT_NAME(GoogleAuthSignInMethod); + +/** @class FIRGoogleAuthProvider + @brief Utility class for constructing Google Sign In credentials. + */ +NS_SWIFT_NAME(GoogleAuthProvider) +@interface FIRGoogleAuthProvider : NSObject + +/** @fn credentialWithIDToken:accessToken: + @brief Creates an `FIRAuthCredential` for a Google sign in. + + @param IDToken The ID Token from Google. + @param accessToken The Access Token from Google. + @return A FIRAuthCredential containing the Google credentials. + */ ++ (FIRAuthCredential *)credentialWithIDToken:(NSString *)IDToken + accessToken:(NSString *)accessToken; + +/** @fn init + @brief This class should not be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactor.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactor.h new file mode 100644 index 00000000..1794b551 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactor.h @@ -0,0 +1,89 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FIRAuth.h" +#import "FIRMultiFactorAssertion.h" +#import "FIRMultiFactorInfo.h" +#import "FIRMultiFactorSession.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRMultiFactorSessionCallback + @brief The callback that triggered when a developer calls `getSessionWithCompletion`. + @param session The multi factor session returned, if any. + @param error The error which occurred, if any. +*/ +typedef void (^FIRMultiFactorSessionCallback)(FIRMultiFactorSession *_Nullable session, + NSError *_Nullable error) + NS_SWIFT_NAME(MultiFactorSessionCallback); + +/** + @brief The string identifier for second factors. e.g. "phone". +*/ +extern NSString *const _Nonnull FIRPhoneMultiFactorID NS_SWIFT_NAME(PhoneMultiFactorID); + +/** @class FIRMultiFactor + @brief The interface defining the multi factor related properties and operations pertaining to a + user. +*/ +NS_SWIFT_NAME(MultiFactor) +@interface FIRMultiFactor : NSObject + +@property(nonatomic, readonly) NSArray *enrolledFactors; + +/** @fn getSessionWithCompletion: + @brief Get a session for a second factor enrollment operation. + @param completion A block with the session identifier for a second factor enrollment operation. + This is used to identify the current user trying to enroll a second factor. +*/ +- (void)getSessionWithCompletion:(nullable FIRMultiFactorSessionCallback)completion; + +/** @fn enrollWithAssertion:displayName:completion: + @brief Enrolls a second factor as identified by the `FIRMultiFactorAssertion` parameter for the + current user. + @param displayName An optional display name associated with the multi factor to enroll. + @param completion The block invoked when the request is complete, or fails. +*/ +- (void)enrollWithAssertion:(FIRMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(nullable FIRAuthVoidErrorCallback)completion; + +/** @fn unenrollWithInfo:completion: + @brief Unenroll the given multi factor. + @param completion The block invoked when the request to send the verification email is complete, + or fails. +*/ +- (void)unenrollWithInfo:(FIRMultiFactorInfo *)factorInfo + completion:(nullable FIRAuthVoidErrorCallback)completion; + +/** @fn unenrollWithFactorUID:completion: + @brief Unenroll the given multi factor. + @param completion The block invoked when the request to send the verification email is complete, + or fails. +*/ +- (void)unenrollWithFactorUID:(NSString *)factorUID + completion:(nullable FIRAuthVoidErrorCallback)completion; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorAssertion.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorAssertion.h new file mode 100644 index 00000000..536289c6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorAssertion.h @@ -0,0 +1,40 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRMultiFactorAssertion + @brief The base class for asserting ownership of a second factor. This is equivalent to the + AuthCredential class. +*/ +NS_SWIFT_NAME(MultiFactorAssertion) +@interface FIRMultiFactorAssertion : NSObject + +/** + @brief The second factor identifier for this opaque object asserting a second factor. +*/ +@property(nonatomic, readonly, nonnull) NSString *factorID; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorInfo.h new file mode 100644 index 00000000..df7579e0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorInfo.h @@ -0,0 +1,54 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRMultiFactorInfo + @brief Safe public structure used to represent a second factor entity from a client perspective. +*/ +NS_SWIFT_NAME(MultiFactorInfo) +@interface FIRMultiFactorInfo : NSObject + +/** + @brief The multi-factor enrollment ID. +*/ +@property(nonatomic, readonly) NSString *UID; + +/** + @brief The user friendly name of the current second factor. +*/ +@property(nonatomic, readonly, nullable) NSString *displayName; + +/** + @brief The second factor enrollment date. +*/ +@property(nonatomic, readonly) NSDate *enrollmentDate; + +/** + @brief The identifier of the second factor. +*/ +@property(nonatomic, readonly) NSString *factorID; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorResolver.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorResolver.h new file mode 100644 index 00000000..5e040f16 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorResolver.h @@ -0,0 +1,60 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import "FIRMultiFactor.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRMultiFactorResolver + @brief The data structure used to help developers resolve 2nd factor requirements on users that + have opted in to 2 factor authentication. +*/ +NS_SWIFT_NAME(MultiFactorResolver) +@interface FIRMultiFactorResolver : NSObject + +/** + @brief The opaque session identifier for the current sign-in flow. +*/ +@property(nonatomic, readonly) FIRMultiFactorSession *session; + +/** + @brief The list of hints for the second factors needed to complete the sign-in for the current + session. +*/ +@property(nonatomic, readonly) NSArray *hints NS_SWIFT_NAME(hints); + +/** + @brief The Auth reference for the current FIRMultiResolver. +*/ +@property(nonatomic, readonly) FIRAuth *auth; + +/** @fn resolveSignInWithAssertion:completion: + @brief A helper function to help users complete sign in with a second factor using an + FIRMultiFactorAssertion confirming the user successfully completed the second factor + challenge. + @param completion The block invoked when the request is complete, or fails. +*/ +- (void)resolveSignInWithAssertion:(FIRMultiFactorAssertion *)assertion + completion:(nullable FIRAuthDataResultCallback)completion; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorSession.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorSession.h new file mode 100644 index 00000000..c7234b23 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRMultiFactorSession.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRMultiFactorSession + @brief Opaque object that identifies the current session to enroll a second factor or to + complete sign in when previously enrolled. + */ +NS_SWIFT_NAME(MultiFactorSession) +@interface FIRMultiFactorSession : NSObject + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIROAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIROAuthCredential.h new file mode 100644 index 00000000..94abe4f2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIROAuthCredential.h @@ -0,0 +1,53 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRAuthCredential.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIROAuthCredential + @brief Internal implementation of FIRAuthCredential for generic credentials. + */ +NS_SWIFT_NAME(OAuthCredential) +@interface FIROAuthCredential : FIRAuthCredential + +/** @property IDToken + @brief The ID Token associated with this credential. + */ +@property(nonatomic, readonly, nullable) NSString *IDToken; + +/** @property accessToken + @brief The access token associated with this credential. + */ +@property(nonatomic, readonly, nullable) NSString *accessToken; + +/** @property secret + @brief The secret associated with this credential. This will be nil for OAuth 2.0 providers. + @detail OAuthCredential already exposes a providerId getter. This will help the developer + determine whether an access token/secret pair is needed. + */ +@property(nonatomic, readonly, nullable) NSString *secret; + +/** @fn init + @brief This class is not supposed to be instantiated directly. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIROAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIROAuthProvider.h new file mode 100644 index 00000000..9b6f4f3d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIROAuthProvider.h @@ -0,0 +1,124 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRFederatedAuthProvider.h" + +@class FIRAuth; +@class FIROAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIROAuthProvider + @brief A concrete implementation of `FIRAuthProvider` for generic OAuth Providers. + */ +NS_SWIFT_NAME(OAuthProvider) +@interface FIROAuthProvider : NSObject + +/** @property scopes + @brief Array used to configure the OAuth scopes. + */ +@property(nonatomic, copy, nullable) NSArray *scopes; + +/** @property customParameters + @brief Dictionary used to configure the OAuth custom parameters. + */ +@property(nonatomic, copy, nullable) NSDictionary *customParameters; + +/** @property providerID + @brief The provider ID indicating the specific OAuth provider this OAuthProvider instance + represents. + */ +@property(nonatomic, copy, readonly) NSString *providerID; + +/** @fn providerWithProviderID: + @param providerID The provider ID of the IDP for which this auth provider instance will be + configured. + @return An instance of FIROAuthProvider corresponding to the specified provider ID. + */ ++ (FIROAuthProvider *)providerWithProviderID:(NSString *)providerID; + +/** @fn providerWithProviderID:auth: + @param providerID The provider ID of the IDP for which this auth provider instance will be + configured. + @param auth The auth instance to be associated with the FIROAuthProvider instance. + @return An instance of FIROAuthProvider corresponding to the specified provider ID. + */ ++ (FIROAuthProvider *)providerWithProviderID:(NSString *)providerID auth:(FIRAuth *)auth; + +/** @fn credentialWithProviderID:IDToken:accessToken: + @brief Creates an `FIRAuthCredential` for that OAuth 2 provider identified by providerID, ID + token and access token. + + @param providerID The provider ID associated with the Auth credential being created. + @param IDToken The IDToken associated with the Auth credential being created. + @param accessToken The accessstoken associated with the Auth credential be created, if + available. + @return A FIRAuthCredential for the specified provider ID, ID token and access token. + */ ++ (FIROAuthCredential *)credentialWithProviderID:(NSString *)providerID + IDToken:(NSString *)IDToken + accessToken:(nullable NSString *)accessToken; + +/** @fn credentialWithProviderID:accessToken: + @brief Creates an `FIRAuthCredential` for that OAuth 2 provider identified by providerID using + an ID token. + + @param providerID The provider ID associated with the Auth credential being created. + @param accessToken The accessstoken associated with the Auth credential be created + @return A FIRAuthCredential. + */ ++ (FIROAuthCredential *)credentialWithProviderID:(NSString *)providerID + accessToken:(NSString *)accessToken; + +/** @fn credentialWithProviderID:IDToken:rawNonce:accessToken: + @brief Creates an `FIRAuthCredential` for that OAuth 2 provider identified by providerID, ID + token, raw nonce and access token. + + @param providerID The provider ID associated with the Auth credential being created. + @param IDToken The IDToken associated with the Auth credential being created. + @param rawNonce The raw nonce associated with the Auth credential being created. + @param accessToken The accessstoken associated with the Auth credential be created, if + available. + @return A FIRAuthCredential for the specified provider ID, ID token and access token. + */ ++ (FIROAuthCredential *)credentialWithProviderID:(NSString *)providerID + IDToken:(NSString *)IDToken + rawNonce:(nullable NSString *)rawNonce + accessToken:(nullable NSString *)accessToken; + +/** @fn credentialWithProviderID:IDToken:rawNonce: + @brief Creates an `FIRAuthCredential` for that OAuth 2 provider identified by providerID using + an ID token and raw nonce. + + @param providerID The provider ID associated with the Auth credential being created. + @param IDToken The IDToken associated with the Auth credential being created. + @param rawNonce The raw nonce associated with the Auth credential being created. + @return A FIRAuthCredential. + */ ++ (FIROAuthCredential *)credentialWithProviderID:(NSString *)providerID + IDToken:(NSString *)IDToken + rawNonce:(nullable NSString *)rawNonce; + +/** @fn init + @brief This class is not meant to be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneAuthCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneAuthCredential.h new file mode 100644 index 00000000..dba06b9f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneAuthCredential.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FIRAuthCredential.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRPhoneAuthCredential + @brief Implementation of FIRAuthCredential for Phone Auth credentials. + */ +NS_SWIFT_NAME(PhoneAuthCredential) +@interface FIRPhoneAuthCredential : FIRAuthCredential + +/** @fn init + @brief This class is not supposed to be instantiated directly. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneAuthProvider.h new file mode 100644 index 00000000..a3e2ee37 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneAuthProvider.h @@ -0,0 +1,141 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +@class FIRAuth; +@class FIRMultiFactorSession; +@class FIRPhoneAuthCredential; +@class FIRPhoneMultiFactorInfo; +@protocol FIRAuthUIDelegate; + +NS_ASSUME_NONNULL_BEGIN + +/** @var FIRPhoneAuthProviderID + @brief A string constant identifying the phone identity provider. + */ +extern NSString *const FIRPhoneAuthProviderID NS_SWIFT_NAME(PhoneAuthProviderID); + +/** @var FIRPhoneAuthProviderID + @brief A string constant identifying the phone sign-in method. + */ +extern NSString *const _Nonnull FIRPhoneAuthSignInMethod NS_SWIFT_NAME(PhoneAuthSignInMethod); + +/** @typedef FIRVerificationResultCallback + @brief The type of block invoked when a request to send a verification code has finished. + + @param verificationID On success, the verification ID provided, nil otherwise. + @param error On error, the error that occurred, nil otherwise. + */ +typedef void (^FIRVerificationResultCallback)(NSString *_Nullable verificationID, + NSError *_Nullable error) + NS_SWIFT_NAME(VerificationResultCallback); + +/** @class FIRPhoneAuthProvider + @brief A concrete implementation of `FIRAuthProvider` for phone auth providers. + */ +NS_SWIFT_NAME(PhoneAuthProvider) +@interface FIRPhoneAuthProvider : NSObject + +/** @fn provider + @brief Returns an instance of `FIRPhoneAuthProvider` for the default `FIRAuth` object. + */ ++ (instancetype)provider NS_SWIFT_NAME(provider()); + +/** @fn providerWithAuth: + @brief Returns an instance of `FIRPhoneAuthProvider` for the provided `FIRAuth` object. + @param auth The auth object to associate with the phone auth provider instance. + */ ++ (instancetype)providerWithAuth:(FIRAuth *)auth NS_SWIFT_NAME(provider(auth:)); + +/** @fn verifyPhoneNumber:UIDelegate:completion: + @brief Starts the phone number authentication flow by sending a verification code to the + specified phone number. + @param phoneNumber The phone number to be verified. + @param UIDelegate An object used to present the SFSafariViewController. The object is retained + by this method until the completion block is executed. + @param completion The callback to be invoked when the verification flow is finished. + @remarks Possible error codes: + + + `FIRAuthErrorCodeCaptchaCheckFailed` - Indicates that the reCAPTCHA token obtained by + the Firebase Auth is invalid or has expired. + + `FIRAuthErrorCodeQuotaExceeded` - Indicates that the phone verification quota for this + project has been exceeded. + + `FIRAuthErrorCodeInvalidPhoneNumber` - Indicates that the phone number provided is + invalid. + + `FIRAuthErrorCodeMissingPhoneNumber` - Indicates that a phone number was not provided. + */ +- (void)verifyPhoneNumber:(NSString *)phoneNumber + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRVerificationResultCallback)completion; + +/** @fn verifyPhoneNumber:UIDelegate:multiFactorSession:completion: + @brief Verify ownership of the second factor phone number by the current user. + @param phoneNumber The phone number to be verified. + @param UIDelegate An object used to present the SFSafariViewController. The object is retained + by this method until the completion block is executed. + @param session A session to identify the MFA flow. For enrollment, this identifies the user + trying to enroll. For sign-in, this identifies that the user already passed the first + factor challenge. + @param completion The callback to be invoked when the verification flow is finished. +*/ +- (void)verifyPhoneNumber:(NSString *)phoneNumber + UIDelegate:(nullable id)UIDelegate + multiFactorSession:(nullable FIRMultiFactorSession *)session + completion:(nullable FIRVerificationResultCallback)completion; + +/** @fn verifyPhoneNumberWithMultiFactorInfo:UIDelegate:multiFactorSession:completion: + @brief Verify ownership of the second factor phone number by the current user. + @param phoneMultiFactorInfo The phone multi factor whose number need to be verified. + @param UIDelegate An object used to present the SFSafariViewController. The object is retained + by this method until the completion block is executed. + @param session A session to identify the MFA flow. For enrollment, this identifies the user + trying to enroll. For sign-in, this identifies that the user already passed the first + factor challenge. + @param completion The callback to be invoked when the verification flow is finished. +*/ +- (void)verifyPhoneNumberWithMultiFactorInfo:(FIRPhoneMultiFactorInfo *)phoneMultiFactorInfo + UIDelegate:(nullable id)UIDelegate + multiFactorSession:(nullable FIRMultiFactorSession *)session + completion:(nullable FIRVerificationResultCallback)completion; + +/** @fn credentialWithVerificationID:verificationCode: + @brief Creates an `FIRAuthCredential` for the phone number provider identified by the + verification ID and verification code. + + @param verificationID The verification ID obtained from invoking + verifyPhoneNumber:completion: + @param verificationCode The verification code obtained from the user. + @return The corresponding phone auth credential for the verification ID and verification code + provided. + */ +- (FIRPhoneAuthCredential *)credentialWithVerificationID:(NSString *)verificationID + verificationCode:(NSString *)verificationCode; + +/** @fn init + @brief Please use the `provider` or `providerWithAuth:` methods to obtain an instance of + `FIRPhoneAuthProvider`. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorAssertion.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorAssertion.h new file mode 100644 index 00000000..30cc2c45 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorAssertion.h @@ -0,0 +1,37 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FIRMultiFactorAssertion.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRPhoneMultiFactorAssertion + @brief The subclass of base class FIRMultiFactorAssertion, used to assert ownership of a phone + second factor. +*/ +NS_SWIFT_NAME(PhoneMultiFactorAssertion) +@interface FIRPhoneMultiFactorAssertion : FIRMultiFactorAssertion + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorGenerator.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorGenerator.h new file mode 100644 index 00000000..8e9cc7b3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorGenerator.h @@ -0,0 +1,47 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FIRPhoneAuthCredential.h" +#import "FIRPhoneMultiFactorAssertion.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRPhoneMultiFactorGenerator + @brief The data structure used to help initialize an assertion for a second factor entity to the + Firebase Auth/CICP server. Depending on the type of second factor, this will help generate + the assertion. +*/ +NS_SWIFT_NAME(PhoneMultiFactorGenerator) +@interface FIRPhoneMultiFactorGenerator : NSObject + +/** @fn assertionWithCredential: + @brief Initializes the MFA assertion to confirm ownership of the phone second factor. Note that + this API is used for both enrolling and signing in with a phone second factor. + @param phoneAuthCredential The phone auth credential used for multi factor flows. +*/ ++ (FIRPhoneMultiFactorAssertion *)assertionWithCredential: + (FIRPhoneAuthCredential *)phoneAuthCredential; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorInfo.h new file mode 100644 index 00000000..30f02132 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRPhoneMultiFactorInfo.h @@ -0,0 +1,42 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +#import "FIRMultiFactorInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRPhoneMultiFactorInfo + @brief Extends the FIRMultiFactorInfo class for phone number second factors. + The identifier of this second factor is "phone". +*/ +NS_SWIFT_NAME(PhoneMultiFactorInfo) +@interface FIRPhoneMultiFactorInfo : FIRMultiFactorInfo + +/** + @brief This is the phone number associated with the current second factor. +*/ +@property(nonatomic, readonly, nonnull) NSString *phoneNumber; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRTwitterAuthProvider.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRTwitterAuthProvider.h new file mode 100644 index 00000000..0f1b28d7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRTwitterAuthProvider.h @@ -0,0 +1,54 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief A string constant identifying the Twitter identity provider. + */ +extern NSString *const FIRTwitterAuthProviderID NS_SWIFT_NAME(TwitterAuthProviderID); +/** + @brief A string constant identifying the Twitter sign-in method. + */ +extern NSString *const _Nonnull FIRTwitterAuthSignInMethod NS_SWIFT_NAME(TwitterAuthSignInMethod); + +/** @class FIRTwitterAuthProvider + @brief Utility class for constructing Twitter credentials. + */ +NS_SWIFT_NAME(TwitterAuthProvider) +@interface FIRTwitterAuthProvider : NSObject + +/** @fn credentialWithToken:secret: + @brief Creates an `FIRAuthCredential` for a Twitter sign in. + + @param token The Twitter OAuth token. + @param secret The Twitter OAuth secret. + @return A FIRAuthCredential containing the Twitter credential. + */ ++ (FIRAuthCredential *)credentialWithToken:(NSString *)token secret:(NSString *)secret; + +/** @fn init + @brief This class is not meant to be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUser.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUser.h new file mode 100644 index 00000000..15580b8e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUser.h @@ -0,0 +1,557 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRAuth.h" +#import "FIRAuthDataResult.h" +#import "FIRMultiFactor.h" +#import "FIRUserInfo.h" + +@class FIRAuthTokenResult; +@class FIRPhoneAuthCredential; +@class FIRUserProfileChangeRequest; +@class FIRUserMetadata; +@protocol FIRAuthUIDelegate; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRAuthTokenCallback + @brief The type of block called when a token is ready for use. + @see FIRUser.getIDTokenWithCompletion: + @see FIRUser.getIDTokenForcingRefresh:withCompletion: + + @param token Optionally; an access token if the request was successful. + @param error Optionally; the error which occurred - or nil if the request was successful. + + @remarks One of: `token` or `error` will always be non-nil. + */ +typedef void (^FIRAuthTokenCallback)(NSString *_Nullable token, NSError *_Nullable error) + NS_SWIFT_NAME(AuthTokenCallback); + +/** @typedef FIRAuthTokenResultCallback + @brief The type of block called when a token is ready for use. + @see FIRUser.getIDTokenResultWithCompletion: + @see FIRUser.getIDTokenResultForcingRefresh:withCompletion: + + @param tokenResult Optionally; an object containing the raw access token string as well as other + useful data pertaining to the token. + @param error Optionally; the error which occurred - or nil if the request was successful. + + @remarks One of: `token` or `error` will always be non-nil. + */ +typedef void (^FIRAuthTokenResultCallback)(FIRAuthTokenResult *_Nullable tokenResult, + NSError *_Nullable error) + NS_SWIFT_NAME(AuthTokenResultCallback); + +/** @typedef FIRUserProfileChangeCallback + @brief The type of block called when a user profile change has finished. + + @param error Optionally; the error which occurred - or nil if the request was successful. + */ +typedef void (^FIRUserProfileChangeCallback)(NSError *_Nullable error) + NS_SWIFT_NAME(UserProfileChangeCallback); + +/** @typedef FIRSendEmailVerificationCallback + @brief The type of block called when a request to send an email verification has finished. + + @param error Optionally; the error which occurred - or nil if the request was successful. + */ +typedef void (^FIRSendEmailVerificationCallback)(NSError *_Nullable error) + NS_SWIFT_NAME(SendEmailVerificationCallback); + +/** @class FIRUser + @brief Represents a user. Firebase Auth does not attempt to validate users + when loading them from the keychain. Invalidated users (such as those + whose passwords have been changed on another client) are automatically + logged out when an auth-dependent operation is attempted or when the + ID token is automatically refreshed. + @remarks This class is thread-safe. + */ +NS_SWIFT_NAME(User) +@interface FIRUser : NSObject + +/** @property anonymous + @brief Indicates the user represents an anonymous user. + */ +@property(nonatomic, readonly, getter=isAnonymous) BOOL anonymous; + +/** @property emailVerified + @brief Indicates the email address associated with this user has been verified. + */ +@property(nonatomic, readonly, getter=isEmailVerified) BOOL emailVerified; + +/** @property refreshToken + @brief A refresh token; useful for obtaining new access tokens independently. + @remarks This property should only be used for advanced scenarios, and is not typically needed. + */ +@property(nonatomic, readonly, nullable) NSString *refreshToken; + +/** @property providerData + @brief Profile data for each identity provider, if any. + @remarks This data is cached on sign-in and updated when linking or unlinking. + */ +@property(nonatomic, readonly, nonnull) NSArray> *providerData; + +/** @property metadata + @brief Metadata associated with the Firebase user in question. + */ +@property(nonatomic, readonly, nonnull) FIRUserMetadata *metadata; + +#if TARGET_OS_IOS +/** @property multiFactor + @brief Multi factor object associated with the user. +*/ +@property(nonatomic, readonly, nonnull) FIRMultiFactor *multiFactor; +#endif + +/** @fn init + @brief This class should not be instantiated. + @remarks To retrieve the current user, use `FIRAuth.currentUser`. To sign a user + in or out, use the methods on `FIRAuth`. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn updateEmail:completion: + @brief Updates the email address for the user. On success, the cached user profile data is + updated. + @remarks May fail if there is already an account with this email address that was created using + email and password authentication. + + @param email The email address for the user. + @param completion Optionally; the block invoked when the user profile change has finished. + Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was + sent in the request. + + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in + the console for this action. + + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for + sending update email. + + `FIRAuthErrorCodeEmailAlreadyInUse` - Indicates the email is already in use by another + account. + + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. + + `FIRAuthErrorCodeRequiresRecentLogin` - Updating a user’s email is a security + sensitive operation that requires a recent login from the user. This error indicates + the user has not signed in recently enough. To resolve, reauthenticate the user by + invoking reauthenticateWithCredential:completion: on FIRUser. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. + */ +- (void)updateEmail:(NSString *)email + completion:(nullable FIRUserProfileChangeCallback)completion + NS_SWIFT_NAME(updateEmail(to:completion:)); + +/** @fn updatePassword:completion: + @brief Updates the password for the user. On success, the cached user profile data is updated. + + @param password The new password for the user. + @param completion Optionally; the block invoked when the user profile change has finished. + Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates the administrator disabled + sign in with the specified identity provider. + + `FIRAuthErrorCodeRequiresRecentLogin` - Updating a user’s password is a security + sensitive operation that requires a recent login from the user. This error indicates + the user has not signed in recently enough. To resolve, reauthenticate the user by + invoking reauthenticateWithCredential:completion: on FIRUser. + + `FIRAuthErrorCodeWeakPassword` - Indicates an attempt to set a password that is + considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo + dictionary object will contain more detailed explanation that can be shown to the user. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. + */ +- (void)updatePassword:(NSString *)password + completion:(nullable FIRUserProfileChangeCallback)completion + NS_SWIFT_NAME(updatePassword(to:completion:)); + +#if TARGET_OS_IOS +/** @fn updatePhoneNumberCredential:completion: + @brief Updates the phone number for the user. On success, the cached user profile data is + updated. + + @param phoneNumberCredential The new phone number credential corresponding to the phone number + to be added to the Firebase account, if a phone number is already linked to the account this + new phone number will replace it. + @param completion Optionally; the block invoked when the user profile change has finished. + Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeRequiresRecentLogin` - Updating a user’s phone number is a security + sensitive operation that requires a recent login from the user. This error indicates + the user has not signed in recently enough. To resolve, reauthenticate the user by + invoking reauthenticateWithCredential:completion: on FIRUser. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. + */ +- (void)updatePhoneNumberCredential:(FIRPhoneAuthCredential *)phoneNumberCredential + completion:(nullable FIRUserProfileChangeCallback)completion; +#endif + +/** @fn profileChangeRequest + @brief Creates an object which may be used to change the user's profile data. + + @remarks Set the properties of the returned object, then call + `FIRUserProfileChangeRequest.commitChangesWithCallback:` to perform the updates atomically. + + @return An object which may be used to change the user's profile data atomically. + */ +- (FIRUserProfileChangeRequest *)profileChangeRequest NS_SWIFT_NAME(createProfileChangeRequest()); + +/** @fn reloadWithCompletion: + @brief Reloads the user's profile data from the server. + + @param completion Optionally; the block invoked when the reload has finished. Invoked + asynchronously on the main thread in the future. + + @remarks May fail with a `FIRAuthErrorCodeRequiresRecentLogin` error code. In this case + you should call `FIRUser.reauthenticateWithCredential:completion:` before re-invoking + `FIRUser.updateEmail:completion:`. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)reloadWithCompletion:(nullable FIRUserProfileChangeCallback)completion; + +/** @fn reauthenticateWithCredential:completion: + @brief Renews the user's authentication tokens by validating a fresh set of credentials supplied + by the user and returns additional identity provider data. + + @param credential A user-supplied credential, which will be validated by the server. This can be + a successful third-party identity provider sign-in, or an email address and password. + @param completion Optionally; the block invoked when the re-authentication operation has + finished. Invoked asynchronously on the main thread in the future. + + @remarks If the user associated with the supplied credential is different from the current user, + or if the validation of the supplied credentials fails; an error is returned and the current + user remains signed in. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidCredential` - Indicates the supplied credential is invalid. + This could happen if it has expired or it is malformed. + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that accounts with the + identity provider represented by the credential are not enabled. Enable them in the + Auth section of the Firebase console. + + `FIRAuthErrorCodeEmailAlreadyInUse` - Indicates the email asserted by the credential + (e.g. the email in a Facebook access token) is already in use by an existing account, + that cannot be authenticated with this method. Call fetchProvidersForEmail for + this user’s email and then prompt them to sign in with any of the sign-in providers + returned. This error will only be thrown if the "One account per email address" + setting is enabled in the Firebase console, under Auth settings. Please note that the + error code raised in this specific situation may not be the same on Web and Android. + + `FIRAuthErrorCodeUserDisabled` - Indicates the user's account is disabled. + + `FIRAuthErrorCodeWrongPassword` - Indicates the user attempted reauthentication with + an incorrect password, if credential is of the type EmailPasswordAuthCredential. + + `FIRAuthErrorCodeUserMismatch` - Indicates that an attempt was made to + reauthenticate with a user which is not the current user. + + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)reauthenticateWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn reauthenticateAndRetrieveDataWithCredential:completion: + @brief Please use linkWithCredential:completion: for Objective-C + or link(withCredential:completion:) for Swift instead. + */ +- (void)reauthenticateAndRetrieveDataWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion + DEPRECATED_MSG_ATTRIBUTE("Please use reauthenticateWithCredential:completion: for" + " Objective-C or reauthenticate(withCredential:completion:)" + " for Swift instead."); + +/** @fn reauthenticateWithProvider:UIDelegate:completion: + @brief Renews the user's authentication using the provided auth provider instance. + + @param provider An instance of an auth provider used to initiate the reauthenticate flow. + @param UIDelegate Optionally an instance of a class conforming to the FIRAuthUIDelegate + protocol, this is used for presenting the web context. If nil, a default FIRAuthUIDelegate + will be used. + @param completion Optionally; a block which is invoked when the reauthenticate flow finishes, or + is canceled. Invoked asynchronously on the main thread in the future. + */ +// clang-format off +- (void)reauthenticateWithProvider:(id)provider + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRAuthDataResultCallback)completion + NS_SWIFT_NAME(reauthenticate(with:uiDelegate:completion:)) + API_AVAILABLE(ios(8.0)); +// clang-format on + +/** @fn getIDTokenResultWithCompletion: + @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. + + @param completion Optionally; the block invoked when the token is available. Invoked + asynchronously on the main thread in the future. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)getIDTokenResultWithCompletion:(nullable FIRAuthTokenResultCallback)completion + NS_SWIFT_NAME(getIDTokenResult(completion:)); + +/** @fn getIDTokenResultForcingRefresh:completion: + @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. + + @param forceRefresh Forces a token refresh. Useful if the token becomes invalid for some reason + other than an expiration. + @param completion Optionally; the block invoked when the token is available. Invoked + asynchronously on the main thread in the future. + + @remarks The authentication token will be refreshed (by making a network request) if it has + expired, or if `forceRefresh` is YES. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)getIDTokenResultForcingRefresh:(BOOL)forceRefresh + completion:(nullable FIRAuthTokenResultCallback)completion + NS_SWIFT_NAME(getIDTokenResult(forcingRefresh:completion:)); + +/** @fn getIDTokenWithCompletion: + @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. + + @param completion Optionally; the block invoked when the token is available. Invoked + asynchronously on the main thread in the future. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)getIDTokenWithCompletion:(nullable FIRAuthTokenCallback)completion + NS_SWIFT_NAME(getIDToken(completion:)); + +/** @fn getIDTokenForcingRefresh:completion: + @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. + + @param forceRefresh Forces a token refresh. Useful if the token becomes invalid for some reason + other than an expiration. + @param completion Optionally; the block invoked when the token is available. Invoked + asynchronously on the main thread in the future. + + @remarks The authentication token will be refreshed (by making a network request) if it has + expired, or if `forceRefresh` is YES. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. + */ +- (void)getIDTokenForcingRefresh:(BOOL)forceRefresh + completion:(nullable FIRAuthTokenCallback)completion; + +/** @fn linkAndRetrieveDataWithCredential:completion: + @brief Please use linkWithCredential:completion: for Objective-C + or link(withCredential:completion:) for Swift instead. + */ +- (void)linkAndRetrieveDataWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion + DEPRECATED_MSG_ATTRIBUTE("Please use linkWithCredential:completion: for Objective-C " + "or link(withCredential:completion:) for Swift instead."); + +/** @fn linkWithCredential:completion: + @brief Associates a user account from a third-party identity provider with this user and + returns additional identity provider data. + + @param credential The credential for the identity provider. + @param completion Optionally; the block invoked when the unlinking is complete, or fails. + Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeProviderAlreadyLinked` - Indicates an attempt to link a provider of a + type already linked to this account. + + `FIRAuthErrorCodeCredentialAlreadyInUse` - Indicates an attempt to link with a + credential that has already been linked with a different Firebase account. + + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that accounts with the identity + provider represented by the credential are not enabled. Enable them in the Auth section + of the Firebase console. + + @remarks This method may also return error codes associated with updateEmail:completion: and + updatePassword:completion: on FIRUser. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. + */ +- (void)linkWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion; + +/** @fn linkWithProvider:UIDelegate:completion: + @brief link the user with the provided auth provider instance. + + @param provider An instance of an auth provider used to initiate the link flow. + @param UIDelegate Optionally an instance of a class conforming to the FIRAuthUIDelegate + protocol, this is used for presenting the web context. If nil, a default FIRAuthUIDelegate + will be used. + @param completion Optionally; a block which is invoked when the link flow finishes, or + is canceled. Invoked asynchronously on the main thread in the future. + */ +// clang-format off +- (void)linkWithProvider:(id)provider + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRAuthDataResultCallback)completion + NS_SWIFT_NAME(link(with:uiDelegate:completion:)) + API_AVAILABLE(ios(8.0)); +// clang-format on + +/** @fn unlinkFromProvider:completion: + @brief Disassociates a user account from a third-party identity provider with this user. + + @param provider The provider ID of the provider to unlink. + @param completion Optionally; the block invoked when the unlinking is complete, or fails. + Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeNoSuchProvider` - Indicates an attempt to unlink a provider + that is not linked to the account. + + `FIRAuthErrorCodeRequiresRecentLogin` - Updating email is a security sensitive + operation that requires a recent login from the user. This error indicates the user + has not signed in recently enough. To resolve, reauthenticate the user by invoking + reauthenticateWithCredential:completion: on FIRUser. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. + */ +- (void)unlinkFromProvider:(NSString *)provider + completion:(nullable FIRAuthResultCallback)completion; + +/** @fn sendEmailVerificationWithCompletion: + @brief Initiates email verification for the user. + + @param completion Optionally; the block invoked when the request to send an email verification + is complete, or fails. Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was + sent in the request. + + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in + the console for this action. + + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for + sending update email. + + `FIRAuthErrorCodeUserNotFound` - Indicates the user account was not found. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. + */ +- (void)sendEmailVerificationWithCompletion:(nullable FIRSendEmailVerificationCallback)completion; + +/** @fn sendEmailVerificationWithActionCodeSettings:completion: + @brief Initiates email verification for the user. + + @param actionCodeSettings An `FIRActionCodeSettings` object containing settings related to + handling action codes. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was + sent in the request. + + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in + the console for this action. + + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for + sending update email. + + `FIRAuthErrorCodeUserNotFound` - Indicates the user account was not found. + + `FIRAuthErrorCodeMissingIosBundleID` - Indicates that the iOS bundle ID is missing when + a iOS App Store ID is provided. + + `FIRAuthErrorCodeMissingAndroidPackageName` - Indicates that the android package name + is missing when the `androidInstallApp` flag is set to true. + + `FIRAuthErrorCodeUnauthorizedDomain` - Indicates that the domain specified in the + continue URL is not whitelisted in the Firebase console. + + `FIRAuthErrorCodeInvalidContinueURI` - Indicates that the domain specified in the + continue URI is not valid. + */ +- (void)sendEmailVerificationWithActionCodeSettings:(FIRActionCodeSettings *)actionCodeSettings + completion: + (nullable FIRSendEmailVerificationCallback)completion; + +/** @fn deleteWithCompletion: + @brief Deletes the user account (also signs out the user, if this was the current user). + + @param completion Optionally; the block invoked when the request to delete the account is + complete, or fails. Invoked asynchronously on the main thread in the future. + + @remarks Possible error codes: + + + `FIRAuthErrorCodeRequiresRecentLogin` - Updating email is a security sensitive + operation that requires a recent login from the user. This error indicates the user + has not signed in recently enough. To resolve, reauthenticate the user by invoking + reauthenticateWithCredential:completion: on FIRUser. + + @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. + + */ +- (void)deleteWithCompletion:(nullable FIRUserProfileChangeCallback)completion; + +/** @fn sendEmailVerificationBeforeUpdatingEmail:completion: + @brief Send an email to verify the ownership of the account then update to the new email. + @param email The email to be updated to. + @param completion Optionally; the block invoked when the request to send the verification + email is complete, or fails. +*/ +- (void)sendEmailVerificationBeforeUpdatingEmail:(nonnull NSString *)email + completion:(nullable FIRAuthVoidErrorCallback)completion; + +/** @fn sendEmailVerificationBeforeUpdatingEmail:completion: + @brief Send an email to verify the ownership of the account then update to the new email. + @param email The email to be updated to. + @param actionCodeSettings An `FIRActionCodeSettings` object containing settings related to + handling action codes. + @param completion Optionally; the block invoked when the request to send the verification + email is complete, or fails. +*/ +- (void)sendEmailVerificationBeforeUpdatingEmail:(nonnull NSString *)email + actionCodeSettings:(nonnull FIRActionCodeSettings *)actionCodeSettings + completion:(nullable FIRAuthVoidErrorCallback)completion; + +@end + +/** @class FIRUserProfileChangeRequest + @brief Represents an object capable of updating a user's profile data. + @remarks Properties are marked as being part of a profile update when they are set. Setting a + property value to nil is not the same as leaving the property unassigned. + */ +NS_SWIFT_NAME(UserProfileChangeRequest) +@interface FIRUserProfileChangeRequest : NSObject + +/** @fn init + @brief Please use `FIRUser.profileChangeRequest` + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @property displayName + @brief The user's display name. + @remarks It is an error to set this property after calling + `FIRUserProfileChangeRequest.commitChangesWithCallback:` + */ +@property(nonatomic, copy, nullable) NSString *displayName; + +/** @property photoURL + @brief The user's photo URL. + @remarks It is an error to set this property after calling + `FIRUserProfileChangeRequest.commitChangesWithCallback:` + */ +@property(nonatomic, copy, nullable) NSURL *photoURL; + +/** @fn commitChangesWithCompletion: + @brief Commits any pending changes. + @remarks This method should only be called once. Once called, property values should not be + changed. + + @param completion Optionally; the block invoked when the user profile change has been applied. + Invoked asynchronously on the main thread in the future. + */ +- (void)commitChangesWithCompletion:(nullable FIRUserProfileChangeCallback)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUserInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUserInfo.h new file mode 100644 index 00000000..04eca495 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUserInfo.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief Represents user data returned from an identity provider. + */ +NS_SWIFT_NAME(UserInfo) +@protocol FIRUserInfo + +/** @property providerID + @brief The provider identifier. + */ +@property(nonatomic, copy, readonly) NSString *providerID; + +/** @property uid + @brief The provider's user ID for the user. + */ +@property(nonatomic, copy, readonly) NSString *uid; + +/** @property displayName + @brief The name of the user. + */ +@property(nonatomic, copy, readonly, nullable) NSString *displayName; + +/** @property photoURL + @brief The URL of the user's profile photo. + */ +@property(nonatomic, copy, readonly, nullable) NSURL *photoURL; + +/** @property email + @brief The user's email address. + */ +@property(nonatomic, copy, readonly, nullable) NSString *email; + +/** @property phoneNumber + @brief A phone number associated with the user. + @remarks This property is only available for users authenticated via phone number auth. + */ +@property(nonatomic, readonly, nullable) NSString *phoneNumber; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUserMetadata.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUserMetadata.h new file mode 100644 index 00000000..3ceae38d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FIRUserMetadata.h @@ -0,0 +1,45 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRUserMetadata + @brief A data class representing the metadata corresponding to a Firebase user. + */ +NS_SWIFT_NAME(UserMetadata) +@interface FIRUserMetadata : NSObject + +/** @property lastSignInDate + @brief Stores the last sign in date for the corresponding Firebase user. + */ +@property(copy, nonatomic, readonly, nullable) NSDate *lastSignInDate; + +/** @property creationDate + @brief Stores the creation date for the corresponding Firebase user. + */ +@property(copy, nonatomic, readonly, nullable) NSDate *creationDate; + +/** @fn init + @brief This class should not be initialized manually, an instance of this class can be obtained + from a Firebase user object. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FirebaseAuth.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FirebaseAuth.h new file mode 100644 index 00000000..4f4d1ca1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FirebaseAuth.h @@ -0,0 +1,54 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRActionCodeSettings.h" +#import "FIRAdditionalUserInfo.h" +#import "FIRAuth.h" +#import "FIRAuthCredential.h" +#import "FIRAuthDataResult.h" +#import "FIRAuthErrors.h" +#import "FIRAuthTokenResult.h" +#import "FIREmailAuthProvider.h" +#import "FIRFacebookAuthProvider.h" +#import "FIRFederatedAuthProvider.h" +#import "FIRGameCenterAuthProvider.h" +#import "FIRGitHubAuthProvider.h" +#import "FIRGoogleAuthProvider.h" +#import "FIRMultiFactor.h" +#import "FIRMultiFactorAssertion.h" +#import "FIRMultiFactorInfo.h" +#import "FIRMultiFactorResolver.h" +#import "FIRMultiFactorSession.h" +#import "FIROAuthCredential.h" +#import "FIROAuthProvider.h" +#import "FIRTwitterAuthProvider.h" +#import "FIRUser.h" +#import "FIRUserInfo.h" +#import "FIRUserMetadata.h" +#import "FirebaseAuthVersion.h" + +#if TARGET_OS_IOS +#import "FIRAuthAPNSTokenType.h" +#import "FIRAuthSettings.h" +#import "FIRAuthUIDelegate.h" +#import "FIRPhoneAuthCredential.h" +#import "FIRPhoneAuthProvider.h" +#import "FIRPhoneMultiFactorAssertion.h" +#import "FIRPhoneMultiFactorGenerator.h" +#import "FIRPhoneMultiFactorInfo.h" +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FirebaseAuthVersion.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FirebaseAuthVersion.h new file mode 100644 index 00000000..7b4b94e9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Public/FirebaseAuthVersion.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** + Version number for FirebaseAuth. + */ +extern const double FirebaseAuthVersionNum; + +/** + Version string for FirebaseAuth. + */ +extern const char *const FirebaseAuthVersionStr; diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h new file mode 100644 index 00000000..ff7c05de --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h @@ -0,0 +1,99 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + @brief The protocol for permanant data storage. + */ +@protocol FIRAuthStorage + +/** @fn initWithService: + @brief Initialize a @c FIRAuthStorage instance. + @param service The name of the storage service to use. + @return An initialized @c FIRAuthStorage instance for the specified service. + */ +- (id)initWithService:(NSString *)service; + +/** @fn dataForKey:error: + @brief Gets the data for @c key in the storage. The key is set for the attribute + @c kSecAttrAccount of a generic password query. + @param key The key to use. + @param error The address to store any error that occurs during the process, if not NULL. + If the operation was successful, its content is set to @c nil . + @return The data stored in the storage for @c key, if any. + */ +- (nullable NSData *)dataForKey:(NSString *)key error:(NSError **_Nullable)error; + +/** @fn setData:forKey:error: + @brief Sets the data for @c key in the storage. The key is set for the attribute + @c kSecAttrAccount of a generic password query. + @param data The data to store. + @param key The key to use. + @param error The address to store any error that occurs during the process, if not NULL. + @return Whether the operation succeeded or not. + */ +- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError **_Nullable)error; + +/** @fn removeDataForKey:error: + @brief Removes the data for @c key in the storage. The key is set for the attribute + @c kSecAttrAccount of a generic password query. + @param key The key to use. + @param error The address to store any error that occurs during the process, if not NULL. + @return Whether the operation succeeded or not. + */ +- (BOOL)removeDataForKey:(NSString *)key error:(NSError **_Nullable)error; + +@end + +/** @class FIRAuthKeychain + @brief The utility class to manipulate data in iOS Keychain. + */ +@interface FIRAuthKeychainServices : NSObject + +/** @fn getItemWithQuery:error: + @brief Get the item from keychain by given query. + @param query The query to query the keychain. + @param outError The address to store any error that occurs during the process, if not nil. + @return The item of the given query. nil if not exsit. + */ +- (nullable NSData *)getItemWithQuery:(NSDictionary *)query + error:(NSError *_Nullable *_Nullable)outError; + +/** @fn setItem:withQuery:error: + @brief Set the item into keychain with given query. + @param item The item to be added into keychain. + @param query The query to query the keychain. + @param outError The address to store any error that occurs during the process, if not nil. + @return Whether the operation succeed. + */ +- (BOOL)setItem:(NSData *)item + withQuery:(NSDictionary *)query + error:(NSError *_Nullable *_Nullable)outError; + +/** @fn getItemWithQuery:error: + @brief Remove the item with given queryfrom keychain. + @param query The query to query the keychain. + @param outError The address to store any error that occurs during the process, if not nil. + @return Whether the operation succeed. + */ +- (BOOL)removeItemWithQuery:(NSDictionary *)query error:(NSError *_Nullable *_Nullable)outError; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.m new file mode 100644 index 00000000..aa1683b4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.m @@ -0,0 +1,323 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h" + +#import + +#import "FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +/** @var kAccountPrefix + @brief The prefix string for keychain item account attribute before the key. + @remarks A number "1" is encoded in the prefix in case we need to upgrade the scheme in future. + */ +static NSString *const kAccountPrefix = @"firebase_auth_1_"; + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthKeychainServices { + /** @var _service + @brief The name of the keychain service. + */ + NSString *_service; + + /** @var _legacyItemDeletedForKey + @brief Indicates whether or not this class knows that the legacy item for a particular key has + been deleted. + @remarks This dictionary is to avoid unecessary keychain operations against legacy items. + */ + NSMutableDictionary *_legacyEntryDeletedForKey; +} + +- (id)initWithService:(NSString *)service { + self = [super init]; + if (self) { + _service = [service copy]; + _legacyEntryDeletedForKey = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (nullable NSData *)dataForKey:(NSString *)key error:(NSError **_Nullable)error { + if (!key.length) { + [NSException raise:NSInvalidArgumentException format:@"%@", @"The key cannot be nil or empty."]; + return nil; + } + NSData *data = [self itemWithQuery:[self genericPasswordQueryWithKey:key] error:error]; + if (error && *error) { + return nil; + } + if (data) { + return data; + } + // Check for legacy form. + if (_legacyEntryDeletedForKey[key]) { + return nil; + } + data = [self itemWithQuery:[self legacyGenericPasswordQueryWithKey:key] error:error]; + if (error && *error) { + return nil; + } + if (!data) { + // Mark legacy data as non-existing so we don't have to query it again. + _legacyEntryDeletedForKey[key] = @YES; + return nil; + } + // Move the data to current form. + if (![self setData:data forKey:key error:error]) { + return nil; + } + [self deleteLegacyItemWithKey:key]; + return data; +} + +- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError **_Nullable)error { + if (!key.length) { + [NSException raise:NSInvalidArgumentException format:@"%@", @"The key cannot be nil or empty."]; + return NO; + } + NSDictionary *attributes = @{ + (__bridge id)kSecValueData : data, + (__bridge id)kSecAttrAccessible : (__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly, + }; + return [self setItemWithQuery:[self genericPasswordQueryWithKey:key] + attributes:attributes + error:error]; +} + +- (BOOL)removeDataForKey:(NSString *)key error:(NSError **_Nullable)error { + if (!key.length) { + [NSException raise:NSInvalidArgumentException format:@"%@", @"The key cannot be nil or empty."]; + return NO; + } + if (![self deleteItemWithQuery:[self genericPasswordQueryWithKey:key] error:error]) { + return NO; + } + // Legacy form item, if exists, also needs to be removed, otherwise it will be exposed when + // current form item is removed, leading to incorrect semantics. + [self deleteLegacyItemWithKey:key]; + return YES; +} + +#pragma mark - Private methods for non-sharing keychain operations + +- (nullable NSData *)itemWithQuery:(NSDictionary *)query error:(NSError **_Nullable)error { + NSMutableDictionary *returningQuery = [query mutableCopy]; + returningQuery[(__bridge id)kSecReturnData] = @YES; + returningQuery[(__bridge id)kSecReturnAttributes] = @YES; + // Using a match limit of 2 means that we can check whether there is more than one item. + // If we used a match limit of 1 we would never find out. + returningQuery[(__bridge id)kSecMatchLimit] = @2; + + CFArrayRef result = NULL; + OSStatus status = + SecItemCopyMatching((__bridge CFDictionaryRef)returningQuery, (CFTypeRef *)&result); + + if (status == noErr && result != NULL) { + NSArray *items = (__bridge_transfer NSArray *)result; + if (items.count != 1) { + if (error) { + *error = [FIRAuthErrorUtils keychainErrorWithFunction:@"SecItemCopyMatching" status:status]; + } + return nil; + } + + if (error) { + *error = nil; + } + NSDictionary *item = items[0]; + return item[(__bridge id)kSecValueData]; + } + + if (status == errSecItemNotFound) { + if (error) { + *error = nil; + } + } else { + if (error) { + *error = [FIRAuthErrorUtils keychainErrorWithFunction:@"SecItemCopyMatching" status:status]; + } + } + return nil; +} + +- (BOOL)setItemWithQuery:(NSDictionary *)query + attributes:(NSDictionary *)attributes + error:(NSError **_Nullable)error { + NSMutableDictionary *combined = [attributes mutableCopy]; + [combined addEntriesFromDictionary:query]; + BOOL hasItem = NO; + OSStatus status = SecItemAdd((__bridge CFDictionaryRef)combined, NULL); + + if (status == errSecDuplicateItem) { + hasItem = YES; + status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)attributes); + } + + if (status == noErr) { + return YES; + } + if (error) { + NSString *function = hasItem ? @"SecItemUpdate" : @"SecItemAdd"; + *error = [FIRAuthErrorUtils keychainErrorWithFunction:function status:status]; + } + return NO; +} + +- (BOOL)deleteItemWithQuery:(NSDictionary *)query error:(NSError **_Nullable)error { + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query); + if (status == noErr || status == errSecItemNotFound) { + return YES; + } + if (error) { + *error = [FIRAuthErrorUtils keychainErrorWithFunction:@"SecItemDelete" status:status]; + } + return NO; +} + +/** @fn deleteLegacyItemsWithKey: + @brief Deletes legacy item from the keychain if it is not already known to be deleted. + @param key The key for the item. + */ +- (void)deleteLegacyItemWithKey:(NSString *)key { + if (_legacyEntryDeletedForKey[key]) { + return; + } + NSDictionary *query = [self legacyGenericPasswordQueryWithKey:key]; + SecItemDelete((__bridge CFDictionaryRef)query); + _legacyEntryDeletedForKey[key] = @YES; +} + +/** @fn genericPasswordQueryWithKey: + @brief Returns a keychain query of generic password to be used to manipulate key'ed value. + @param key The key for the value being manipulated, used as the account field in the query. + */ +- (NSDictionary *)genericPasswordQueryWithKey:(NSString *)key { + return @{ + (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, + (__bridge id)kSecAttrAccount : [kAccountPrefix stringByAppendingString:key], + (__bridge id)kSecAttrService : _service, + }; +} + +/** @fn legacyGenericPasswordQueryWithKey: + @brief Returns a keychain query of generic password without service field, which is used by + previous version of this class. + @param key The key for the value being manipulated, used as the account field in the query. + */ +- (NSDictionary *)legacyGenericPasswordQueryWithKey:(NSString *)key { + return @{ + (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, + (__bridge id)kSecAttrAccount : key, + }; +} + +#pragma mark - Private methods for shared keychain operations + +- (nullable NSData *)getItemWithQuery:(NSDictionary *)query + error:(NSError *_Nullable *_Nullable)outError { + NSMutableDictionary *mutableQuery = [query mutableCopy]; + + mutableQuery[(__bridge id)kSecReturnData] = @YES; + mutableQuery[(__bridge id)kSecReturnAttributes] = @YES; + mutableQuery[(__bridge id)kSecMatchLimit] = @2; + + CFArrayRef result = NULL; + OSStatus status = + SecItemCopyMatching((__bridge CFDictionaryRef)mutableQuery, (CFTypeRef *)&result); + + if (status == noErr && result != NULL) { + NSArray *items = (__bridge_transfer NSArray *)result; + if (items.count != 1) { + if (outError) { + *outError = [FIRAuthErrorUtils keychainErrorWithFunction:@"SecItemCopyMatching" + status:status]; + } + return nil; + } + + if (outError) { + *outError = nil; + } + NSDictionary *item = items[0]; + return item[(__bridge id)kSecValueData]; + } + + if (status == errSecItemNotFound) { + if (outError) { + *outError = nil; + } + } else { + if (outError) { + *outError = [FIRAuthErrorUtils keychainErrorWithFunction:@"SecItemCopyMatching" + status:status]; + } + } + return nil; +} + +- (BOOL)setItem:(NSData *)item + withQuery:(NSDictionary *)query + error:(NSError *_Nullable *_Nullable)outError { + NSData *existingItem = [self getItemWithQuery:query error:outError]; + if (outError && *outError) { + return NO; + } + + OSStatus status; + if (!existingItem) { + NSMutableDictionary *queryWithItem = [query mutableCopy]; + [queryWithItem setObject:item forKey:(__bridge id)kSecValueData]; + status = SecItemAdd((__bridge CFDictionaryRef)queryWithItem, NULL); + } else { + NSDictionary *attributes = @{(__bridge id)kSecValueData : item}; + status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)attributes); + } + + if (status == noErr) { + if (outError) { + *outError = nil; + } + return YES; + } + + NSString *function = existingItem ? @"SecItemUpdate" : @"SecItemAdd"; + if (outError) { + *outError = [FIRAuthErrorUtils keychainErrorWithFunction:function status:status]; + } + return NO; +} + +- (BOOL)removeItemWithQuery:(NSDictionary *)query error:(NSError *_Nullable *_Nullable)outError { + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query); + + if (status == noErr || status == errSecItemNotFound) { + if (outError) { + *outError = nil; + } + return YES; + } + + if (outError) { + *outError = [FIRAuthErrorUtils keychainErrorWithFunction:@"SecItemDelete" status:status]; + } + return NO; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.h new file mode 100644 index 00000000..dfd8aad9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.h @@ -0,0 +1,36 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthUserDefaults + @brief The utility class to storage data in NSUserDefaults. + */ +@interface FIRAuthUserDefaults : NSObject + +/** @fn clear + @brief Clears all data from the storage. + @remarks This method is only supposed to be called from tests. + */ +- (void)clear; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.m new file mode 100644 index 00000000..b1094505 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.m @@ -0,0 +1,74 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.h" + +NS_ASSUME_NONNULL_BEGIN + +static NSString *const kPersistentDomainNamePrefix = @"com.google.Firebase.Auth."; + +@implementation FIRAuthUserDefaults { + /** @var _persistentDomainName + @brief The name of the persistent domain in user defaults. + */ + NSString *_persistentDomainName; + + /** @var _storage + @brief The backing NSUserDefaults storage for this instance. + */ + NSUserDefaults *_storage; +} + +- (instancetype)initWithService:(NSString *)service { + self = [super init]; + if (self) { + _persistentDomainName = [kPersistentDomainNamePrefix stringByAppendingString:service]; + _storage = [[NSUserDefaults alloc] init]; + } + return self; +} + +- (nullable NSData *)dataForKey:(NSString *)key error:(NSError **_Nullable)error { + if (error) { + *error = nil; + } + NSDictionary *allData = [_storage persistentDomainForName:_persistentDomainName]; + return allData[key]; +} + +- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError **_Nullable)error { + NSMutableDictionary *allData = + [([_storage persistentDomainForName:_persistentDomainName] ?: @{}) mutableCopy]; + allData[key] = data; + [_storage setPersistentDomain:allData forName:_persistentDomainName]; + return YES; +} + +- (BOOL)removeDataForKey:(NSString *)key error:(NSError **_Nullable)error { + NSMutableDictionary *allData = + [[_storage persistentDomainForName:_persistentDomainName] mutableCopy]; + [allData removeObjectForKey:key]; + [_storage setPersistentDomain:allData forName:_persistentDomainName]; + return YES; +} + +- (void)clear { + [_storage setPersistentDomain:@{} forName:_persistentDomainName]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.h new file mode 100644 index 00000000..b797199b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.h @@ -0,0 +1,63 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthAPNSToken + @brief A data structure for an APNs token. + */ +@interface FIRAuthAPNSToken : NSObject + +/** @property data + @brief The APNs token data. + */ +@property(nonatomic, strong, readonly) NSData *data; + +/** @property string + @brief The uppercase hexadecimal string form of the APNs token data. + */ +@property(nonatomic, strong, readonly) NSString *string; + +/** @property type + @brief The APNs token type. + */ +@property(nonatomic, assign, readonly) FIRAuthAPNSTokenType type; + +/** @fn initWithData:type: + @brief Initializes the instance. + @param data The APNs token data. + @param type The APNs token type. + @return The initialized instance. + */ +- (instancetype)initWithData:(NSData *)data + type:(FIRAuthAPNSTokenType)type NS_DESIGNATED_INITIALIZER; + +/** @fn init + @brief Call @c initWithData:type: to get an instance of this class. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.m new file mode 100644 index 00000000..1a976a0e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.m @@ -0,0 +1,57 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import "FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthAPNSToken { + /** @var _string + @brief The lazy-initialized string form of the token data. + */ + NSString *_string; +} + +- (instancetype)initWithData:(NSData *)data type:(FIRAuthAPNSTokenType)type { + self = [super init]; + if (self) { + _data = [data copy]; + _type = type; + } + return self; +} + +- (NSString *)string { + if (!_string) { + NSUInteger capacity = _data.length * 2; + NSMutableString *tokenString = [NSMutableString stringWithCapacity:capacity]; + const unsigned char *tokenData = _data.bytes; + for (int idx = 0; idx < _data.length; ++idx) { + [tokenString appendFormat:@"%02X", (int)tokenData[idx]]; + } + _string = tokenString; + } + return _string; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.h new file mode 100644 index 00000000..5e2acfeb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.h @@ -0,0 +1,83 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import +#import + +@class FIRAuthAPNSToken; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRAuthAPNSTokenCallback + @brief The type of block to receive an APNs token. + @param token The APNs token if one is available. + @param error The error happened if any. + @remarks Both `token` and `error` being `nil` means the request timed-out. + */ +typedef void (^FIRAuthAPNSTokenCallback)(FIRAuthAPNSToken *_Nullable token, + NSError *_Nullable error); + +/** @class FIRAuthAPNSTokenManager + @brief A class to manage APNs token in memory. + */ +@interface FIRAuthAPNSTokenManager : NSObject + +/** @property token + @brief The APNs token, if one is available. + @remarks Setting a token with FIRAuthAPNSTokenTypeUnknown will automatically converts it to + a token with the automatically detected type. + */ +@property(nonatomic, strong, nullable) FIRAuthAPNSToken *token; + +/** @property timeout + @brief The timeout for registering for remote notification. + @remarks Only tests should access this property. + */ +@property(nonatomic, assign) NSTimeInterval timeout; + +/** @fn init + @brief Call @c initWithApplication: to initialize an instance of this class. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithApplication:bundle + @brief Initializes the instance. + @param application The @c UIApplication to request the token from. + @return The initialized instance. + */ +- (instancetype)initWithApplication:(UIApplication *)application NS_DESIGNATED_INITIALIZER; + +/** @fn getTokenWithCallback: + @brief Attempts to get the APNs token. + @param callback The block to be called either immediately or in future, either when a token + becomes available, or when timeout occurs, whichever happens earlier. + */ +- (void)getTokenWithCallback:(FIRAuthAPNSTokenCallback)callback; + +/** @fn cancelWithError: + @brief Cancels any pending `getTokenWithCallback:` request. + @param error The error to return. + */ +- (void)cancelWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.m new file mode 100644 index 00000000..967aace6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.m @@ -0,0 +1,250 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAPNSToken.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAPNSTokenManager.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kRegistrationTimeout + @brief Timeout for registration for remote notification. + @remarks Once we start to handle `application:didFailToRegisterForRemoteNotificationsWithError:` + we probably don't have to use timeout at all. + */ +static const NSTimeInterval kRegistrationTimeout = 5; + +/** @var kLegacyRegistrationTimeout + @brief Timeout for registration for remote notification on iOS 7. + */ +static const NSTimeInterval kLegacyRegistrationTimeout = 30; + +@implementation FIRAuthAPNSTokenManager { + /** @var _application + @brief The @c UIApplication to request the token from. + */ + UIApplication *_application; + + /** @var _pendingCallbacks + @brief The list of all pending callbacks for the APNs token. + */ + NSMutableArray *_pendingCallbacks; +} + +- (instancetype)initWithApplication:(UIApplication *)application { + self = [super init]; + if (self) { + _application = application; + _timeout = [_application respondsToSelector:@selector(registerForRemoteNotifications)] + ? kRegistrationTimeout + : kLegacyRegistrationTimeout; + } + return self; +} + +- (void)getTokenWithCallback:(FIRAuthAPNSTokenCallback)callback { + if (_token) { + callback(_token, nil); + return; + } + if (_pendingCallbacks) { + [_pendingCallbacks addObject:callback]; + return; + } + _pendingCallbacks = + [[NSMutableArray alloc] initWithObjects:callback, nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + if ([self->_application respondsToSelector:@selector(registerForRemoteNotifications)]) { + [self->_application registerForRemoteNotifications]; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#if TARGET_OS_IOS + [self->_application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert]; +#endif // TARGET_OS_IOS +#pragma clang diagnostic pop + } + }); + NSArray *applicableCallbacks = _pendingCallbacks; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_timeout * NSEC_PER_SEC)), + FIRAuthGlobalWorkQueue(), ^{ + // Only cancel if the pending callbacks remain the same, i.e., not triggered yet. + if (applicableCallbacks == self->_pendingCallbacks) { + [self callBackWithToken:nil error:nil]; + } + }); +} + +- (void)setToken:(nullable FIRAuthAPNSToken *)token { + if (!token) { + _token = nil; + return; + } + if (token.type == FIRAuthAPNSTokenTypeUnknown) { + static FIRAuthAPNSTokenType detectedTokenType = FIRAuthAPNSTokenTypeUnknown; + if (detectedTokenType == FIRAuthAPNSTokenTypeUnknown) { + detectedTokenType = + [[self class] isProductionApp] ? FIRAuthAPNSTokenTypeProd : FIRAuthAPNSTokenTypeSandbox; + } + token = [[FIRAuthAPNSToken alloc] initWithData:token.data type:detectedTokenType]; + } + _token = token; + [self callBackWithToken:token error:nil]; +} + +- (void)cancelWithError:(NSError *)error { + [self callBackWithToken:nil error:error]; +} + +#pragma mark - Internal methods + +/** @fn callBack + @brief Calls back all pending callbacks with APNs token or error. + @param token The APNs token if one is available. + @param error The error occurred, if any. + */ +- (void)callBackWithToken:(nullable FIRAuthAPNSToken *)token error:(nullable NSError *)error { + if (!_pendingCallbacks) { + return; + } + NSArray *allCallbacks = _pendingCallbacks; + _pendingCallbacks = nil; + for (FIRAuthAPNSTokenCallback callback in allCallbacks) { + callback(token, error); + } +}; + +/** @fn isProductionApp + @brief Whether or not the app has production (versus sandbox) provisioning profile. + @remarks This method is adapted from @c FIRInstanceID . + */ ++ (BOOL)isProductionApp { + const BOOL defaultAppTypeProd = YES; + + NSError *error = nil; + + if ([GULAppEnvironmentUtil isSimulator]) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000006", @"Assuming prod APNs token type on simulator."); + return defaultAppTypeProd; + } + + // Apps distributed via AppStore or TestFlight use the Production APNS certificates. + if ([GULAppEnvironmentUtil isFromAppStore]) { + return defaultAppTypeProd; + } + NSString *path = [[[NSBundle mainBundle] bundlePath] + stringByAppendingPathComponent:@"embedded.mobileprovision"]; + if ([GULAppEnvironmentUtil isAppStoreReceiptSandbox] && !path.length) { + // Distributed via TestFlight + return defaultAppTypeProd; + } + + NSMutableData *profileData = [NSMutableData dataWithContentsOfFile:path options:0 error:&error]; + + if (!profileData.length || error) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000007", @"Error while reading embedded mobileprovision %@", + error); + return defaultAppTypeProd; + } + + // The "embedded.mobileprovision" sometimes contains characters with value 0, which signals the + // end of a c-string and halts the ASCII parser, or with value > 127, which violates strict 7-bit + // ASCII. Replace any 0s or invalid characters in the input. + uint8_t *profileBytes = (uint8_t *)profileData.bytes; + for (int i = 0; i < profileData.length; i++) { + uint8_t currentByte = profileBytes[i]; + if (!currentByte || currentByte > 127) { + profileBytes[i] = '.'; + } + } + + NSString *embeddedProfile = [[NSString alloc] initWithBytesNoCopy:profileBytes + length:profileData.length + encoding:NSASCIIStringEncoding + freeWhenDone:NO]; + + if (error || !embeddedProfile.length) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000008", @"Error while reading embedded mobileprovision %@", + error); + return defaultAppTypeProd; + } + + NSScanner *scanner = [NSScanner scannerWithString:embeddedProfile]; + NSString *plistContents; + if ([scanner scanUpToString:@"" intoString:&plistContents]) { + plistContents = [plistContents stringByAppendingString:@""]; + } + } + + if (!plistContents.length) { + return defaultAppTypeProd; + } + + NSData *data = [plistContents dataUsingEncoding:NSUTF8StringEncoding]; + if (!data.length) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000009", + @"Couldn't read plist fetched from embedded mobileprovision"); + return defaultAppTypeProd; + } + + NSError *plistMapError; + id plistData = [NSPropertyListSerialization propertyListWithData:data + options:NSPropertyListImmutable + format:nil + error:&plistMapError]; + if (plistMapError || ![plistData isKindOfClass:[NSDictionary class]]) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000010", @"Error while converting assumed plist to dict %@", + plistMapError.localizedDescription); + return defaultAppTypeProd; + } + NSDictionary *plistMap = (NSDictionary *)plistData; + + if ([plistMap valueForKeyPath:@"ProvisionedDevices"]) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000011", + @"Provisioning profile has specifically provisioned devices, " + @"most likely a Dev profile."); + } + + NSString *apsEnvironment = [plistMap valueForKeyPath:@"Entitlements.aps-environment"]; + FIRLogDebug(kFIRLoggerAuth, @"I-AUT000012", @"APNS Environment in profile: %@", apsEnvironment); + + // No aps-environment in the profile. + if (!apsEnvironment.length) { + FIRLogInfo(kFIRLoggerAuth, @"I-AUT000013", + @"No aps-environment set. If testing on a device APNS is not " + @"correctly configured. Please recheck your provisioning profiles."); + return defaultAppTypeProd; + } + + if ([apsEnvironment isEqualToString:@"development"]) { + return NO; + } + + return defaultAppTypeProd; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h new file mode 100644 index 00000000..ceb93e29 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h @@ -0,0 +1,52 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthAppCredential + @brief A class represents a credential that proves the identity of the app. + */ +@interface FIRAuthAppCredential : NSObject + +/** @property receipt + @brief The server acknowledgement of receiving client's claim of identity. + */ +@property(nonatomic, strong, readonly) NSString *receipt; + +/** @property secret + @brief The secret that the client received from server via a trusted channel, if ever. + */ +@property(nonatomic, strong, readonly, nullable) NSString *secret; + +/** @fn initWithReceipt:secret: + @brief Initializes the instance. + @param receipt The server acknowledgement of receiving client's claim of identity. + @param secret The secret that the client received from server via a trusted channel, if ever. + @return The initialized instance. + */ +- (instancetype)initWithReceipt:(NSString *)receipt + secret:(nullable NSString *)secret NS_DESIGNATED_INITIALIZER; + +/** @fn init + @brief Call @c initWithReceipt:secret: to get an instance of this class. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.m new file mode 100644 index 00000000..7bf1021a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.m @@ -0,0 +1,64 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kReceiptKey + @brief The key used to encode the receipt property for NSSecureCoding. + */ +static NSString *const kReceiptKey = @"receipt"; + +/** @var kSecretKey + @brief The key used to encode the secret property for NSSecureCoding. + */ +static NSString *const kSecretKey = @"secret"; + +@implementation FIRAuthAppCredential + +- (instancetype)initWithReceipt:(NSString *)receipt secret:(nullable NSString *)secret { + self = [super init]; + if (self) { + _receipt = [receipt copy]; + _secret = [secret copy]; + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *receipt = [aDecoder decodeObjectOfClass:[NSString class] forKey:kReceiptKey]; + if (!receipt) { + return nil; + } + NSString *secret = [aDecoder decodeObjectOfClass:[NSString class] forKey:kSecretKey]; + return [self initWithReceipt:receipt secret:secret]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_receipt forKey:kReceiptKey]; + [aCoder encodeObject:_secret forKey:kSecretKey]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.h new file mode 100644 index 00000000..a307d422 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.h @@ -0,0 +1,90 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import + +#import "FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRAuthAppCredentialCallback + @brief The type of block to receive an app crdential. + @param credential The best available app credential at the time. + */ +typedef void (^FIRAuthAppCredentialCallback)(FIRAuthAppCredential *credential); + +/** @class FIRAuthAppCredentialManager + @brief A class to manage app credentials backed by iOS Keychain. + */ +@interface FIRAuthAppCredentialManager : NSObject + +/** @property credential + @brief The full credential (which has a secret) to be used by the app, if one is available. + */ +@property(nonatomic, strong, readonly, nullable) FIRAuthAppCredential *credential; + +/** @property maximumNumberOfPendingReceipts + @brief The maximum (but not necessarily the minimum) number of pending receipts to be kept. + @remarks Only tests should access this property. + */ +@property(nonatomic, assign, readonly) NSUInteger maximumNumberOfPendingReceipts; + +/** @fn init + @brief Call @c initWithKeychain: to initialize an instance of this class. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithKeychain: + @brief Initializes the instance. + @param keychain The iOS Keychain storage to back up the app credential with. + @return The initialized instance. + */ +- (instancetype)initWithKeychain:(FIRAuthKeychainServices *)keychain NS_DESIGNATED_INITIALIZER; + +/** @fn didStartVerificationWithReceipt:timeout:callback: + @brief Notifies that the app verification process has started. + @param receipt The receipt for verification. + @param timeout The timeout value for how long the callback is waited to be called. + @param callback The block to be called in future either when the verification finishes, or + when timeout occurs, whichever happens earlier. + */ +- (void)didStartVerificationWithReceipt:(NSString *)receipt + timeout:(NSTimeInterval)timeout + callback:(FIRAuthAppCredentialCallback)callback; + +/** @fn canFinishVerificationWithReceipt: + @brief Attempts to finish verification. + @param receipt The receipt to match the original receipt obtained when verification started. + @param secret The secret to complete the verification. + @return Whether or not the receipt matches a pending verification, and finishes verification + if it does. + */ +- (BOOL)canFinishVerificationWithReceipt:(NSString *)receipt secret:(NSString *)secret; + +/** @fn clearCredential + @brief Clears the saved credential, to be used in the case that it is rejected by the server. + */ +- (void)clearCredential; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.m new file mode 100644 index 00000000..94ceaf11 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.m @@ -0,0 +1,175 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kKeychainDataKey + @brief The keychain key for the data. + */ +static NSString *const kKeychainDataKey = @"app_credentials"; + +/** @var kFullCredentialKey + @brief The data key for the full app credential. + */ +static NSString *const kFullCredentialKey = @"full_credential"; + +/** @var kPendingReceiptsKey + @brief The data key for the array of pending receipts. + */ +static NSString *const kPendingReceiptsKey = @"pending_receipts"; + +/** @var kMaximumNumberOfPendingReceipts + @brief The maximum number of partial credentials kept by this class. + */ +static const NSUInteger kMaximumNumberOfPendingReceipts = 32; + +@implementation FIRAuthAppCredentialManager { + /** @var _keychainServices + @brief The keychain for app credentials to load from and to save to. + */ + FIRAuthKeychainServices *_keychainServices; + + /** @var _pendingReceipts + @brief A list of pending receipts sorted in the order they were recorded. + */ + NSMutableArray *_pendingReceipts; + + /** @var _callbacksByReceipt + @brief A map from pending receipts to callbacks. + */ + NSMutableDictionary *_callbacksByReceipt; +} + +- (instancetype)initWithKeychain:(FIRAuthKeychainServices *)keychain { + self = [super init]; + if (self) { + _keychainServices = keychain; + // Load the credentials from keychain if possible. + NSError *error; + NSData *encodedData = [_keychainServices dataForKey:kKeychainDataKey error:&error]; + if (!error && encodedData) { +// iOS 12 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSKeyedUnarchiver *unarchiver = + [[NSKeyedUnarchiver alloc] initForReadingWithData:encodedData]; +#pragma clang diagnostic pop + FIRAuthAppCredential *credential = + [unarchiver decodeObjectOfClass:[FIRAuthAppCredential class] forKey:kFullCredentialKey]; + if ([credential isKindOfClass:[FIRAuthAppCredential class]]) { + _credential = credential; + } + NSSet *allowedClasses = + [NSSet setWithObjects:[NSArray class], [NSString class], nil]; + NSArray *pendingReceipts = [unarchiver decodeObjectOfClasses:allowedClasses + forKey:kPendingReceiptsKey]; + if ([pendingReceipts isKindOfClass:[NSArray class]]) { + _pendingReceipts = [pendingReceipts mutableCopy]; + } + } + if (!_pendingReceipts) { + _pendingReceipts = [[NSMutableArray alloc] init]; + } + _callbacksByReceipt = + [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (NSUInteger)maximumNumberOfPendingReceipts { + return kMaximumNumberOfPendingReceipts; +} + +- (void)didStartVerificationWithReceipt:(NSString *)receipt + timeout:(NSTimeInterval)timeout + callback:(FIRAuthAppCredentialCallback)callback { + [_pendingReceipts removeObject:receipt]; + if (_pendingReceipts.count >= kMaximumNumberOfPendingReceipts) { + [_pendingReceipts removeObjectAtIndex:0]; + } + [_pendingReceipts addObject:receipt]; + _callbacksByReceipt[receipt] = callback; + [self saveData]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)), + FIRAuthGlobalWorkQueue(), ^{ + [self callBackWithReceipt:receipt]; + }); +} + +- (BOOL)canFinishVerificationWithReceipt:(NSString *)receipt secret:(NSString *)secret { + if (![_pendingReceipts containsObject:receipt]) { + return NO; + } + [_pendingReceipts removeObject:receipt]; + _credential = [[FIRAuthAppCredential alloc] initWithReceipt:receipt secret:secret]; + [self saveData]; + [self callBackWithReceipt:receipt]; + return YES; +} + +- (void)clearCredential { + _credential = nil; + [self saveData]; +} + +#pragma mark - Internal methods + +/** @fn saveData + @brief Save the data in memory to the keychain ignoring any errors. + */ +- (void)saveData { + NSMutableData *archiveData = [NSMutableData data]; +// iOS 12 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiveData]; +#pragma clang diagnostic pop + [archiver encodeObject:_credential forKey:kFullCredentialKey]; + [archiver encodeObject:_pendingReceipts forKey:kPendingReceiptsKey]; + [archiver finishEncoding]; + [_keychainServices setData:archiveData forKey:kKeychainDataKey error:NULL]; +} + +/** @fn callBackWithReceipt: + @brief Calls the saved callback for the specifc receipt. + @param receipt The receipt associated with the callback. + */ +- (void)callBackWithReceipt:(NSString *)receipt { + FIRAuthAppCredentialCallback callback = _callbacksByReceipt[receipt]; + if (!callback) { + return; + } + [_callbacksByReceipt removeObjectForKey:receipt]; + if (_credential) { + callback(_credential); + } else { + callback([[FIRAuthAppCredential alloc] initWithReceipt:receipt secret:nil]); + } +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.h new file mode 100644 index 00000000..3de2e32e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.h @@ -0,0 +1,76 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import +#import + +@class FIRAuthAppCredentialManager; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRAuthNotificationForwardingCallback + @brief The type of block to receive whether or not remote notifications are being forwarded. + @param isNotificationBeingForwarded Whether or not remote notifications are being forwarded. + */ +typedef void (^FIRAuthNotificationForwardingCallback)(BOOL isNotificationBeingForwarded); + +/** @class FIRAuthNotificationManager + */ +@interface FIRAuthNotificationManager : NSObject + +/** @property timeout + @brief The timeout for checking for notification forwarding. + @remarks Only tests should access this property. + */ +@property(nonatomic, assign) NSTimeInterval timeout; + +/** @fn initWithApplication:appCredentialManager: + @brief Initializes the instance. + @param application The application. + @param appCredentialManager The object to handle app credentials delivered via notification. + @return The initialized instance. + */ +- (instancetype)initWithApplication:(UIApplication *)application + appCredentialManager:(FIRAuthAppCredentialManager *)appCredentialManager + NS_DESIGNATED_INITIALIZER; + +/** @fn init + @brief please use initWithAppCredentialManager: instead. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn checkNotificationForwardingWithCallback: + @brief Checks whether or not remote notifications are being forwarded to this class. + @param callback The block to be called either immediately or in future once a result + is available. + */ +- (void)checkNotificationForwardingWithCallback:(FIRAuthNotificationForwardingCallback)callback; + +/** @fn canHandleNotification: + @brief Attempts to handle the remote notification. + @param notification The notification in question. + @return Whether or the notification has been handled. + */ +- (BOOL)canHandleNotification:(NSDictionary *)notification; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.m new file mode 100644 index 00000000..45844149 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.m @@ -0,0 +1,188 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredential.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthAppCredentialManager.h" +#import "FirebaseAuth/Sources/SystemService/FIRAuthNotificationManager.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kNotificationKey + @brief The key to locate payload data in the remote notification. + */ +static NSString *const kNotificationDataKey = @"com.google.firebase.auth"; + +/** @var kNotificationReceiptKey + @brief The key for the receipt in the remote notification payload data. + */ +static NSString *const kNotificationReceiptKey = @"receipt"; + +/** @var kNotificationSecretKey + @brief The key for the secret in the remote notification payload data. + */ +static NSString *const kNotificationSecretKey = @"secret"; + +/** @var kNotificationProberKey + @brief The key for marking the prober in the remote notification payload data. + */ +static NSString *const kNotificationProberKey = @"warning"; + +/** @var kProbingTimeout + @brief Timeout for probing whether the app delegate forwards the remote notification to us. + */ +static const NSTimeInterval kProbingTimeout = 1; + +@implementation FIRAuthNotificationManager { + /** @var _application + @brief The application. + */ + UIApplication *_application; + + /** @var _appCredentialManager + @brief The object to handle app credentials delivered via notification. + */ + FIRAuthAppCredentialManager *_appCredentialManager; + + /** @var _hasCheckedNotificationForwarding + @brief Whether notification forwarding has been checked or not. + */ + BOOL _hasCheckedNotificationForwarding; + + /** @var _isNotificationBeingForwarded + @brief Whether or not notification is being forwarded + */ + BOOL _isNotificationBeingForwarded; + + /** @var _pendingCallbacks + @brief All pending callbacks while a check is being performed. + */ + NSMutableArray *_pendingCallbacks; +} + +- (instancetype)initWithApplication:(UIApplication *)application + appCredentialManager:(FIRAuthAppCredentialManager *)appCredentialManager { + self = [super init]; + if (self) { + _application = application; + _appCredentialManager = appCredentialManager; + _timeout = kProbingTimeout; + } + return self; +} + +- (void)checkNotificationForwardingWithCallback:(FIRAuthNotificationForwardingCallback)callback { + if (_pendingCallbacks) { + [_pendingCallbacks addObject:callback]; + return; + } + if (_hasCheckedNotificationForwarding) { + callback(_isNotificationBeingForwarded); + return; + } + _hasCheckedNotificationForwarding = YES; + _pendingCallbacks = + [[NSMutableArray alloc] initWithObjects:callback, nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + NSDictionary *proberNotification = @{ + kNotificationDataKey : @{ + kNotificationProberKey : @"This fake notification should be forwarded to Firebase Auth." + } + }; + if ([self->_application.delegate + respondsToSelector:@selector(application: + didReceiveRemoteNotification:fetchCompletionHandler:)]) { + [self->_application.delegate application:self->_application + didReceiveRemoteNotification:proberNotification + fetchCompletionHandler:^(UIBackgroundFetchResult result){ + }]; +#if !TARGET_OS_TV + } else if ([self->_application.delegate + respondsToSelector:@selector(application:didReceiveRemoteNotification:)]) { +// iOS 10 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [self->_application.delegate application:self->_application + didReceiveRemoteNotification:proberNotification]; +#pragma clang diagnostic pop +#endif + } else { + FIRLogWarning(kFIRLoggerAuth, @"I-AUT000015", + @"The UIApplicationDelegate must handle remote notification for phone number " + @"authentication to work."); + } + }); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_timeout * NSEC_PER_SEC)), + FIRAuthGlobalWorkQueue(), ^{ + [self callBack]; + }); +} + +- (BOOL)canHandleNotification:(NSDictionary *)notification { + NSDictionary *data = notification[kNotificationDataKey]; + if ([data isKindOfClass:[NSString class]]) { + // Deserialize in case the data is a JSON string. + NSData *JSONData = [((NSString *)data) dataUsingEncoding:NSUTF8StringEncoding]; + data = [NSJSONSerialization JSONObjectWithData:JSONData options:0 error:NULL]; + } + if (![data isKindOfClass:[NSDictionary class]]) { + return NO; + } + if (data[kNotificationProberKey]) { + if (!_pendingCallbacks) { + // The prober notification probably comes from another instance, so pass it along. + return NO; + } + _isNotificationBeingForwarded = YES; + [self callBack]; + return YES; + } + NSString *receipt = data[kNotificationReceiptKey]; + if (![receipt isKindOfClass:[NSString class]]) { + return NO; + } + NSString *secret = data[kNotificationSecretKey]; + if (![receipt isKindOfClass:[NSString class]]) { + return NO; + } + return [_appCredentialManager canFinishVerificationWithReceipt:receipt secret:secret]; +} + +#pragma mark - Internal methods + +/** @fn callBack + @brief Calls back all pending callbacks with the result of notification forwarding check. + */ +- (void)callBack { + if (!_pendingCallbacks) { + return; + } + NSArray *allCallbacks = _pendingCallbacks; + _pendingCallbacks = nil; + for (FIRAuthNotificationForwardingCallback callback in allCallbacks) { + callback(_isNotificationBeingForwarded); + } +}; + +@end +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.h new file mode 100644 index 00000000..ebb10ec5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.h @@ -0,0 +1,99 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +#import "FirebaseAuth/Sources/Storage/FIRAuthKeychainServices.h" +#import "FirebaseAuth/Sources/Storage/FIRAuthUserDefaults.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthStoredUserManager : NSObject + +/** @property keychain + @brief The mediator object to access to the system Keychain services. + */ +@property(readonly, nonatomic, strong) FIRAuthKeychainServices *keychainServices; + +/** @property userDefaults + @brief The mediator object to access to the system User Defaults services. + */ +@property(readonly, nonatomic, strong) FIRAuthUserDefaults *userDefaults; + +/** @fn init + @brief The default initializer is disabled. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithServiceName: + @brief The designated initializer. + @param serviceName The service name to initialize with. + */ +- (instancetype)initWithServiceName:(NSString *)serviceName NS_DESIGNATED_INITIALIZER; + +/** @fn getStoredUserAccessGroupWithError: + @brief Get the user access group stored locally. + @param outError Return value for any error which occurs. + */ +- (NSString *_Nullable)getStoredUserAccessGroupWithError:(NSError *_Nullable *_Nullable)outError; + +/** @fn setStoredUserAccessGroup:error: + @brief The setter of the user access group stored locally. + @param accessGroup The access group to be set. + @param outError Return value for any error which occurs. + */ +- (BOOL)setStoredUserAccessGroup:(NSString *_Nullable)accessGroup + error:(NSError *_Nullable *_Nullable)outError; + +/** @fn getStoredUserForAccessGroup:projectID:error: + @brief The getter of the user stored locally. + @param accessGroup The access group to retrieve the user from. + @param projectIdentifier An identifier of the project that the user associates with. Currently, + we use API KEY. + @param outError Return value for any error which occurs. + */ +- (FIRUser *)getStoredUserForAccessGroup:(NSString *)accessGroup + projectIdentifier:(NSString *)projectIdentifier + error:(NSError *_Nullable *_Nullable)outError; + +/** @fn setStoredUser:forAccessGroup:projectID:error: + @brief The setter of the user stored locally. + @param user The user to be stored. + @param accessGroup The access group to store the user in. + @param projectIdentifier An identifier of the project that the user associates with. Currently, + we use API KEY. + @param outError Return value for any error which occurs. + */ +- (BOOL)setStoredUser:(FIRUser *)user + forAccessGroup:(NSString *)accessGroup + projectIdentifier:(NSString *)projectIdentifier + error:(NSError *_Nullable *_Nullable)outError; + +/** @fn removeStoredUserForAccessGroup:projectID:error: + @brief Remove the user that stored locally. + @param accessGroup The access group to remove the user from. + @param projectIdentifier An identifier of the project that the user associates with. Currently, + we use API KEY. + @param outError Return value for any error which occurs. + */ +- (BOOL)removeStoredUserForAccessGroup:(NSString *)accessGroup + projectIdentifier:(NSString *)projectIdentifier + error:(NSError *_Nullable *_Nullable)outError; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.m new file mode 100644 index 00000000..0eeb3e81 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.m @@ -0,0 +1,133 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/SystemService/FIRAuthStoredUserManager.h" + +/** @var kUserAccessGroupKey + @brief Key of user access group stored in user defaults. Used for retrieve the user access + group at launch. + */ +static NSString *kStoredUserAccessGroupKey = @"firebase_auth_stored_user_access_group"; + +/** @var kSharedKeychainAccountValue + @brief Default value for kSecAttrAccount of shared keychain items. + */ +static NSString *kSharedKeychainAccountValue = @"firebase_auth_firebase_user"; + +/** @var kStoredUserCoderKey + @brief The key to encode and decode the stored user. + */ +static NSString *kStoredUserCoderKey = @"firebase_auth_stored_user_coder_key"; + +@implementation FIRAuthStoredUserManager + +#pragma mark - Initializers + +- (instancetype)initWithServiceName:(NSString *)serviceName { + self = [super init]; + if (self) { + _keychainServices = [[FIRAuthKeychainServices alloc] initWithService:serviceName]; + _userDefaults = [[FIRAuthUserDefaults alloc] initWithService:serviceName]; + } + return self; +} + +#pragma mark - User Access Group + +- (NSString *_Nullable)getStoredUserAccessGroupWithError:(NSError *_Nullable *_Nullable)outError { + NSData *data = [self.userDefaults dataForKey:kStoredUserAccessGroupKey error:outError]; + if (data) { + NSString *userAccessGroup = [NSString stringWithUTF8String:data.bytes]; + return userAccessGroup; + } else { + return nil; + } +} + +- (BOOL)setStoredUserAccessGroup:(NSString *_Nullable)accessGroup + error:(NSError *_Nullable *_Nullable)outError { + NSData *data = [accessGroup dataUsingEncoding:NSUTF8StringEncoding]; + if (!data) { + return [self.userDefaults removeDataForKey:kStoredUserAccessGroupKey error:outError]; + } else { + return [self.userDefaults setData:data forKey:kStoredUserAccessGroupKey error:outError]; + } +} + +#pragma mark - User for Access Group + +- (FIRUser *)getStoredUserForAccessGroup:(NSString *)accessGroup + projectIdentifier:(NSString *)projectIdentifier + error:(NSError *_Nullable *_Nullable)outError { + NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; + query[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword; + + query[(__bridge id)kSecAttrAccessGroup] = accessGroup; + query[(__bridge id)kSecAttrService] = projectIdentifier; + query[(__bridge id)kSecAttrAccount] = kSharedKeychainAccountValue; + + NSData *data = [self.keychainServices getItemWithQuery:query error:outError]; +// iOS 12 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; +#pragma clang diagnostic pop + FIRUser *user = [unarchiver decodeObjectOfClass:[FIRUser class] forKey:kStoredUserCoderKey]; + + return user; +} + +- (BOOL)setStoredUser:(FIRUser *)user + forAccessGroup:(NSString *)accessGroup + projectIdentifier:(NSString *)projectIdentifier + error:(NSError *_Nullable *_Nullable)outError { + NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; + query[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword; + query[(__bridge id)kSecAttrAccessible] = + (__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + + query[(__bridge id)kSecAttrAccessGroup] = accessGroup; + query[(__bridge id)kSecAttrService] = projectIdentifier; + query[(__bridge id)kSecAttrAccount] = kSharedKeychainAccountValue; + + NSMutableData *data = [NSMutableData data]; +// iOS 12 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; +#pragma clang diagnostic pop + [archiver encodeObject:user forKey:kStoredUserCoderKey]; + [archiver finishEncoding]; + + return [self.keychainServices setItem:data withQuery:query error:outError]; +} + +- (BOOL)removeStoredUserForAccessGroup:(NSString *)accessGroup + projectIdentifier:(NSString *)projectIdentifier + error:(NSError *_Nullable *_Nullable)outError { + NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; + query[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword; + query[(__bridge id)kSecAttrAccessible] = + (__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + + query[(__bridge id)kSecAttrAccessGroup] = accessGroup; + query[(__bridge id)kSecAttrService] = projectIdentifier; + query[(__bridge id)kSecAttrAccount] = kSharedKeychainAccountValue; + + return [self.keychainServices removeItemWithQuery:query error:outError]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRSecureTokenService.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRSecureTokenService.h new file mode 100644 index 00000000..ba03b7dd --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRSecureTokenService.h @@ -0,0 +1,99 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthRequestConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRFetchAccessTokenCallback + @brief The callback used to return the value of attempting to fetch an access token. + + In the event the operation was successful @c token will be set and @c error will be @c nil. + In the event of failure @c token will be @c nil and @c error will be set. + @c tokenUpdated indicates whether either the access or the refresh token has been updated. + + The token returned should be considered ephemeral and not cached. It should be used immediately + and discarded. All operations that need this token should call fetchAccessToken and do their + work from the callback. + */ +typedef void (^FIRFetchAccessTokenCallback)(NSString *_Nullable token, + NSError *_Nullable error, + BOOL tokenUpdated); + +/** @class FIRSecureTokenService + @brief Provides services for token exchanges and refreshes. + */ +@interface FIRSecureTokenService : NSObject + +/** @property requestConfiguration + @brief The configuration for making requests to server. + */ +@property(nonatomic, strong) FIRAuthRequestConfiguration *requestConfiguration; + +/** @property rawAccessToken + @brief The cached access token. + @remarks This method is specifically for providing the access token to internal clients during + deserialization and sign-in events, and should not be used to retrieve the access token by + anyone else. + */ +@property(nonatomic, copy, readonly) NSString *rawAccessToken; + +/** @property refreshToken + @brief The refresh token for the user, or @c nil if the user has yet completed sign-in flow. + @remarks This property needs to be set manually after the instance is decoded from archive. + */ +@property(nonatomic, copy, readonly, nullable) NSString *refreshToken; + +/** @property accessTokenExpirationDate + @brief The expiration date of the cached access token. + */ +@property(nonatomic, copy, readonly, nullable) NSDate *accessTokenExpirationDate; + +/** @fn initWithRequestConfiguration:authorizationCode: + @brief Creates a @c FIRSecureTokenService with an authroization code. + @param requestConfiguration The configuration for making requests to server. + @param authorizationCode An authorization code which needs to be exchanged for STS tokens. + */ +- (instancetype)initWithRequestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + authorizationCode:(NSString *)authorizationCode; + +/** @fn initWithRequestConfiguration:accessToken:accessTokenExpirationDate:refreshToken + @brief Creates a @c FIRSecureTokenService with access and refresh tokens. + @param requestConfiguration The configuration for making requests to server. + @param accessToken The STS access token. + @param accessTokenExpirationDate The approximate expiration date of the access token. + @param refreshToken The STS refresh token. + */ +- (instancetype)initWithRequestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + accessToken:(nullable NSString *)accessToken + accessTokenExpirationDate:(nullable NSDate *)accessTokenExpirationDate + refreshToken:(NSString *)refreshToken; + +/** @fn fetchAccessTokenForcingRefresh:callback: + @brief Fetch a fresh ephemeral access token for the ID associated with this instance. The token + received in the callback should be considered short lived and not cached. + @param forceRefresh Forces the token to be refreshed. + @param callback Callback block that will be called to return either the token or an error. + Invoked asyncronously on the auth global work queue in the future. + */ +- (void)fetchAccessTokenForcingRefresh:(BOOL)forceRefresh + callback:(FIRFetchAccessTokenCallback)callback; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRSecureTokenService.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRSecureTokenService.m new file mode 100644 index 00000000..fb10cd68 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/SystemService/FIRSecureTokenService.m @@ -0,0 +1,208 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/SystemService/FIRSecureTokenService.h" + +#import + +#import "FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSecureTokenResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kAPIKeyCodingKey + @brief The key used to encode the APIKey for NSSecureCoding. + */ +static NSString *const kAPIKeyCodingKey = @"APIKey"; + +/** @var kRefreshTokenKey + @brief The key used to encode the refresh token for NSSecureCoding. + */ +static NSString *const kRefreshTokenKey = @"refreshToken"; + +/** @var kAccessTokenKey + @brief The key used to encode the access token for NSSecureCoding. + */ +static NSString *const kAccessTokenKey = @"accessToken"; + +/** @var kAccessTokenExpirationDateKey + @brief The key used to encode the access token expiration date for NSSecureCoding. + */ +static NSString *const kAccessTokenExpirationDateKey = @"accessTokenExpirationDate"; + +/** @var kFiveMinutes + @brief Five minutes (in seconds.) + */ +static const NSTimeInterval kFiveMinutes = 5 * 60; + +@interface FIRSecureTokenService () +- (instancetype)init NS_DESIGNATED_INITIALIZER; +@end + +@implementation FIRSecureTokenService { + /** @var _taskQueue + @brief Used to serialize all requests for access tokens. + */ + FIRAuthSerialTaskQueue *_taskQueue; + + /** @var _authorizationCode + @brief An authorization code which needs to be exchanged for Secure Token Service tokens. + */ + NSString *_Nullable _authorizationCode; + + /** @var _accessToken + @brief The currently cached access token. Or |nil| if no token is currently cached. + */ + NSString *_Nullable _accessToken; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _taskQueue = [[FIRAuthSerialTaskQueue alloc] init]; + } + return self; +} + +- (instancetype)initWithRequestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + authorizationCode:(NSString *)authorizationCode { + self = [self init]; + if (self) { + _requestConfiguration = requestConfiguration; + _authorizationCode = [authorizationCode copy]; + } + return self; +} + +- (instancetype)initWithRequestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + accessToken:(nullable NSString *)accessToken + accessTokenExpirationDate:(nullable NSDate *)accessTokenExpirationDate + refreshToken:(NSString *)refreshToken { + self = [self init]; + if (self) { + _requestConfiguration = requestConfiguration; + _accessToken = [accessToken copy]; + _accessTokenExpirationDate = [accessTokenExpirationDate copy]; + _refreshToken = [refreshToken copy]; + } + return self; +} + +- (void)fetchAccessTokenForcingRefresh:(BOOL)forceRefresh + callback:(FIRFetchAccessTokenCallback)callback { + [_taskQueue enqueueTask:^(FIRAuthSerialTaskCompletionBlock complete) { + if (!forceRefresh && [self hasValidAccessToken]) { + complete(); + callback(self->_accessToken, nil, NO); + } else { + [self requestAccessToken:^(NSString *_Nullable token, NSError *_Nullable error, + BOOL tokenUpdated) { + complete(); + callback(token, error, tokenUpdated); + }]; + } + }]; +} + +- (NSString *)rawAccessToken { + return _accessToken; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *refreshToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:kRefreshTokenKey]; + NSString *accessToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:kAccessTokenKey]; + NSDate *accessTokenExpirationDate = [aDecoder decodeObjectOfClass:[NSDate class] + forKey:kAccessTokenExpirationDateKey]; + if (!refreshToken) { + return nil; + } + self = [self init]; + if (self) { + _refreshToken = refreshToken; + _accessToken = accessToken; + _accessTokenExpirationDate = accessTokenExpirationDate; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + // The API key is encoded even it is not used in decoding to be compatible with previous versions + // of the library. + [aCoder encodeObject:_requestConfiguration.APIKey forKey:kAPIKeyCodingKey]; + // Authorization code is not encoded because it is not long-lived. + [aCoder encodeObject:_refreshToken forKey:kRefreshTokenKey]; + [aCoder encodeObject:_accessToken forKey:kAccessTokenKey]; + [aCoder encodeObject:_accessTokenExpirationDate forKey:kAccessTokenExpirationDateKey]; +} + +#pragma mark - Private methods + +/** @fn requestAccessToken: + @brief Makes a request to STS for an access token. + @details This handles both the case that the token has not been granted yet and that it just + needs to be refreshed. The caller is responsible for making sure that this is occurring in + a @c _taskQueue task. + @param callback Called when the fetch is complete. Invoked asynchronously on the main thread in + the future. + @remarks Because this method is guaranteed to only be called from tasks enqueued in + @c _taskQueue, we do not need any @synchronized guards around access to _accessToken/etc. + since only one of those tasks is ever running at a time, and those tasks are the only + access to and mutation of these instance variables. + */ +- (void)requestAccessToken:(FIRFetchAccessTokenCallback)callback { + FIRSecureTokenRequest *request; + if (_refreshToken.length) { + request = [FIRSecureTokenRequest refreshRequestWithRefreshToken:_refreshToken + requestConfiguration:_requestConfiguration]; + } else { + request = [FIRSecureTokenRequest authCodeRequestWithCode:_authorizationCode + requestConfiguration:_requestConfiguration]; + } + [FIRAuthBackend + secureToken:request + callback:^(FIRSecureTokenResponse *_Nullable response, NSError *_Nullable error) { + BOOL tokenUpdated = NO; + NSString *newAccessToken = response.accessToken; + if (newAccessToken.length && ![newAccessToken isEqualToString:self->_accessToken]) { + self->_accessToken = [newAccessToken copy]; + self->_accessTokenExpirationDate = response.approximateExpirationDate; + tokenUpdated = YES; + } + NSString *newRefreshToken = response.refreshToken; + if (newRefreshToken.length && ![newRefreshToken isEqualToString:self->_refreshToken]) { + self->_refreshToken = [newRefreshToken copy]; + tokenUpdated = YES; + } + callback(newAccessToken, error, tokenUpdated); + }]; +} + +- (BOOL)hasValidAccessToken { + return _accessToken && [_accessTokenExpirationDate timeIntervalSinceNow] > kFiveMinutes; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRAdditionalUserInfo.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRAdditionalUserInfo.m new file mode 100644 index 00000000..52f56c4f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRAdditionalUserInfo.m @@ -0,0 +1,97 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h" +#import "FirebaseAuth/Sources/User/FIRAdditionalUserInfo_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAdditionalUserInfo + +/** @var kProviderIDCodingKey + @brief The key used to encode the providerID property for NSSecureCoding. + */ +static NSString *const kProviderIDCodingKey = @"providerID"; + +/** @var kProfileCodingKey + @brief The key used to encode the profile property for NSSecureCoding. + */ +static NSString *const kProfileCodingKey = @"profile"; + +/** @var kUsernameCodingKey + @brief The key used to encode the username property for NSSecureCoding. + */ +static NSString *const kUsernameCodingKey = @"username"; + +/** @var kNewUserKey + @brief The key used to encode the newUser property for NSSecureCoding. + */ +static NSString *const kNewUserKey = @"newUser"; + ++ (nullable instancetype)userInfoWithVerifyAssertionResponse: + (FIRVerifyAssertionResponse *)verifyAssertionResponse { + return [[self alloc] initWithProviderID:verifyAssertionResponse.providerID + profile:verifyAssertionResponse.profile + username:verifyAssertionResponse.username + isNewUser:verifyAssertionResponse.isNewUser]; +} + +- (nullable instancetype)initWithProviderID:(nullable NSString *)providerID + profile:(nullable NSDictionary *)profile + username:(nullable NSString *)username + isNewUser:(BOOL)isNewUser { + self = [super init]; + if (self) { + _providerID = [providerID copy]; + if (profile) { + _profile = [[NSDictionary alloc] initWithDictionary:profile copyItems:YES]; + } + _username = [username copy]; + _newUser = isNewUser; + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *providerID = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kProviderIDCodingKey]; + NSDictionary *profile = [aDecoder decodeObjectOfClass:[NSDictionary class] + forKey:kProfileCodingKey]; + NSString *username = [aDecoder decodeObjectOfClass:[NSString class] forKey:kUsernameCodingKey]; + NSNumber *isNewUser = [aDecoder decodeObjectOfClass:[NSNumber class] forKey:kNewUserKey]; + + return [self initWithProviderID:providerID + profile:profile + username:username + isNewUser:isNewUser.boolValue]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_providerID forKey:kProviderIDCodingKey]; + [aCoder encodeObject:_profile forKey:kProfileCodingKey]; + [aCoder encodeObject:_username forKey:kUsernameCodingKey]; + [aCoder encodeObject:[NSNumber numberWithBool:_newUser] forKey:kNewUserKey]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRAdditionalUserInfo_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRAdditionalUserInfo_Internal.h new file mode 100644 index 00000000..485a883d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRAdditionalUserInfo_Internal.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAdditionalUserInfo () + +/** @fn userInfoWithVerifyAssertionResponse: + @brief A convenience factory method for constructing a @c FIRAdditionalUserInfo instance from + data returned by the verifyAssertion endpoint. + @param verifyAssertionResponse Data returned by the verifyAssertion endpoint. + @return A new instance of @c FIRAdditionalUserInfo using data from the verifyAssertion endpoint. + */ ++ (nullable instancetype)userInfoWithVerifyAssertionResponse: + (FIRVerifyAssertionResponse *)verifyAssertionResponse; + +/** @fn initWithProviderID:profile:username: + @brief Designated initializer. + @param providerID The provider identifier. + @param profile Dictionary containing the additional IdP specific information. + @param username The name of the user. + @param isNewUser Indicates whether or not the current user was signed in for the first time. + */ +- (nullable instancetype)initWithProviderID:(nullable NSString *)providerID + profile:(nullable NSDictionary *)profile + username:(nullable NSString *)username + isNewUser:(BOOL)isNewUser NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUser.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUser.m new file mode 100644 index 00000000..a97acc9f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUser.m @@ -0,0 +1,1604 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import +#import +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h" +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/Auth/FIRAuthOperationType.h" +#import "FirebaseAuth/Sources/Auth/FIRAuthSerialTaskQueue.h" +#import "FirebaseAuth/Sources/Auth/FIRAuthTokenResult_Internal.h" +#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h" +#import "FirebaseAuth/Sources/AuthProvider/Email/FIREmailPasswordAuthCredential.h" +#import "FirebaseAuth/Sources/AuthProvider/FIRAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h" +#import "FirebaseAuth/Sources/AuthProvider/OAuth/FIROAuthCredential_Internal.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend.h" +#import "FirebaseAuth/Sources/Backend/FIRAuthRequestConfiguration.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRDeleteAccountResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIREmailLinkSignInRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSetAccountInfoResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRSignInWithGameCenterResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyAssertionResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyCustomTokenResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPasswordResponse.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRVerifyPhoneNumberResponse.h" +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactor+Internal.h" +#import "FirebaseAuth/Sources/SystemService/FIRSecureTokenService.h" +#import "FirebaseAuth/Sources/User/FIRAdditionalUserInfo_Internal.h" +#import "FirebaseAuth/Sources/User/FIRUserInfoImpl.h" +#import "FirebaseAuth/Sources/User/FIRUserMetadata_Internal.h" +#import "FirebaseAuth/Sources/User/FIRUser_Internal.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h" + +#if TARGET_OS_IOS +#import + +#import "FirebaseAuth/Sources/AuthProvider/Phone/FIRPhoneAuthCredential_Internal.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** @var kUserIDCodingKey + @brief The key used to encode the user ID for NSSecureCoding. + */ +static NSString *const kUserIDCodingKey = @"userID"; + +/** @var kHasEmailPasswordCredentialCodingKey + @brief The key used to encode the hasEmailPasswordCredential property for NSSecureCoding. + */ +static NSString *const kHasEmailPasswordCredentialCodingKey = @"hasEmailPassword"; + +/** @var kAnonymousCodingKey + @brief The key used to encode the anonymous property for NSSecureCoding. + */ +static NSString *const kAnonymousCodingKey = @"anonymous"; + +/** @var kEmailCodingKey + @brief The key used to encode the email property for NSSecureCoding. + */ +static NSString *const kEmailCodingKey = @"email"; + +/** @var kPhoneNumberCodingKey + @brief The key used to encode the phoneNumber property for NSSecureCoding. + */ +static NSString *const kPhoneNumberCodingKey = @"phoneNumber"; + +/** @var kEmailVerifiedCodingKey + @brief The key used to encode the isEmailVerified property for NSSecureCoding. + */ +static NSString *const kEmailVerifiedCodingKey = @"emailVerified"; + +/** @var kDisplayNameCodingKey + @brief The key used to encode the displayName property for NSSecureCoding. + */ +static NSString *const kDisplayNameCodingKey = @"displayName"; + +/** @var kPhotoURLCodingKey + @brief The key used to encode the photoURL property for NSSecureCoding. + */ +static NSString *const kPhotoURLCodingKey = @"photoURL"; + +/** @var kProviderDataKey + @brief The key used to encode the providerData instance variable for NSSecureCoding. + */ +static NSString *const kProviderDataKey = @"providerData"; + +/** @var kAPIKeyCodingKey + @brief The key used to encode the APIKey instance variable for NSSecureCoding. + */ +static NSString *const kAPIKeyCodingKey = @"APIKey"; + +/** @var kTokenServiceCodingKey + @brief The key used to encode the tokenService instance variable for NSSecureCoding. + */ +static NSString *const kTokenServiceCodingKey = @"tokenService"; + +/** @var kMetadataCodingKey + @brief The key used to encode the metadata instance variable for NSSecureCoding. + */ +static NSString *const kMetadataCodingKey = @"metadata"; + +static NSString *const kMultiFactorCodingKey = @"multiFactor"; + +/** @var kMissingUsersErrorMessage + @brief The error message when there is no users array in the getAccountInfo response. + */ +static NSString *const kMissingUsersErrorMessage = @"users"; + +/** @typedef CallbackWithError + @brief The type for a callback block that only takes an error parameter. + */ +typedef void (^CallbackWithError)(NSError *_Nullable); + +/** @typedef CallbackWithUserAndError + @brief The type for a callback block that takes a user parameter and an error parameter. + */ +typedef void (^CallbackWithUserAndError)(FIRUser *_Nullable, NSError *_Nullable); + +/** @typedef CallbackWithUserAndError + @brief The type for a callback block that takes a user parameter and an error parameter. + */ +typedef void (^CallbackWithAuthDataResultAndError)(FIRAuthDataResult *_Nullable, + NSError *_Nullable); + +/** @var kMissingPasswordReason + @brief The reason why the @c FIRAuthErrorCodeWeakPassword error is thrown. + @remarks This error message will be localized in the future. + */ +static NSString *const kMissingPasswordReason = @"Missing Password"; + +/** @fn callInMainThreadWithError + @brief Calls a callback in main thread with error. + @param callback The callback to be called in main thread. + @param error The error to pass to callback. + */ +static void callInMainThreadWithError(_Nullable CallbackWithError callback, + NSError *_Nullable error) { + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(error); + }); + } +} + +/** @fn callInMainThreadWithUserAndError + @brief Calls a callback in main thread with user and error. + @param callback The callback to be called in main thread. + @param user The user to pass to callback if there is no error. + @param error The error to pass to callback. + */ +static void callInMainThreadWithUserAndError(_Nullable CallbackWithUserAndError callback, + FIRUser *_Nonnull user, + NSError *_Nullable error) { + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(error ? nil : user, error); + }); + } +} + +/** @fn callInMainThreadWithUserAndError + @brief Calls a callback in main thread with user and error. + @param callback The callback to be called in main thread. + @param result The result to pass to callback if there is no error. + @param error The error to pass to callback. + */ +static void callInMainThreadWithAuthDataResultAndError( + _Nullable CallbackWithAuthDataResultAndError callback, + FIRAuthDataResult *_Nullable result, + NSError *_Nullable error) { + if (callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(result, error); + }); + } +} + +@interface FIRUserProfileChangeRequest () + +/** @fn initWithUser: + @brief Designated initializer. + @param user The user for which we are updating profile information. + */ +- (nullable instancetype)initWithUser:(FIRUser *)user NS_DESIGNATED_INITIALIZER; + +@end + +@interface FIRUser () + +/** @property anonymous + @brief Whether the current user is anonymous. + */ +@property(nonatomic, readwrite) BOOL anonymous; + +@end + +@implementation FIRUser { + /** @var _hasEmailPasswordCredential + @brief Whether or not the user can be authenticated by using Firebase email and password. + */ + BOOL _hasEmailPasswordCredential; + + /** @var _providerData + @brief Provider specific user data. + */ + NSDictionary *_providerData; + + /** @var _taskQueue + @brief Used to serialize the update profile calls. + */ + FIRAuthSerialTaskQueue *_taskQueue; + + /** @var _tokenService + @brief A secure token service associated with this user. For performing token exchanges and + refreshing access tokens. + */ + FIRSecureTokenService *_tokenService; +} + +#pragma mark - Properties + +// Explicitly @synthesize because these properties are defined in FIRUserInfo protocol. +@synthesize uid = _userID; +@synthesize displayName = _displayName; +@synthesize photoURL = _photoURL; +@synthesize email = _email; +@synthesize phoneNumber = _phoneNumber; + +#pragma mark - + ++ (void)retrieveUserWithAuth:(FIRAuth *)auth + accessToken:(nullable NSString *)accessToken + accessTokenExpirationDate:(nullable NSDate *)accessTokenExpirationDate + refreshToken:(nullable NSString *)refreshToken + anonymous:(BOOL)anonymous + callback:(FIRRetrieveUserCallback)callback { + FIRSecureTokenService *tokenService = + [[FIRSecureTokenService alloc] initWithRequestConfiguration:auth.requestConfiguration + accessToken:accessToken + accessTokenExpirationDate:accessTokenExpirationDate + refreshToken:refreshToken]; + FIRUser *user = [[self alloc] initWithTokenService:tokenService]; + user.auth = auth; + user.requestConfiguration = auth.requestConfiguration; + [user internalGetTokenWithCallback:^(NSString *_Nullable accessToken, NSError *_Nullable error) { + if (error) { + callback(nil, error); + return; + } + FIRGetAccountInfoRequest *getAccountInfoRequest = + [[FIRGetAccountInfoRequest alloc] initWithAccessToken:accessToken + requestConfiguration:auth.requestConfiguration]; + [FIRAuthBackend + getAccountInfo:getAccountInfoRequest + callback:^(FIRGetAccountInfoResponse *_Nullable response, NSError *_Nullable error) { + if (error) { + // No need to sign out user here for errors because the user hasn't been signed in + // yet. + callback(nil, error); + return; + } + user.anonymous = anonymous; + [user updateWithGetAccountInfoResponse:response]; + callback(user, nil); + }]; + }]; +} + +- (instancetype)initWithTokenService:(FIRSecureTokenService *)tokenService { + self = [super init]; + if (self) { + _providerData = @{}; + _taskQueue = [[FIRAuthSerialTaskQueue alloc] init]; + _tokenService = tokenService; + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *userID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kUserIDCodingKey]; + BOOL hasAnonymousKey = [aDecoder containsValueForKey:kAnonymousCodingKey]; + BOOL anonymous = [aDecoder decodeBoolForKey:kAnonymousCodingKey]; + BOOL hasEmailPasswordCredential = + [aDecoder decodeBoolForKey:kHasEmailPasswordCredentialCodingKey]; + NSString *displayName = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kDisplayNameCodingKey]; + NSURL *photoURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:kPhotoURLCodingKey]; + NSString *email = [aDecoder decodeObjectOfClass:[NSString class] forKey:kEmailCodingKey]; + NSString *phoneNumber = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kPhoneNumberCodingKey]; + BOOL emailVerified = [aDecoder decodeBoolForKey:kEmailVerifiedCodingKey]; + NSSet *providerDataClasses = + [NSSet setWithArray:@ [[NSDictionary class], [NSString class], [FIRUserInfoImpl class]]]; + NSDictionary *providerData = + [aDecoder decodeObjectOfClasses:providerDataClasses forKey:kProviderDataKey]; + FIRSecureTokenService *tokenService = [aDecoder decodeObjectOfClass:[FIRSecureTokenService class] + forKey:kTokenServiceCodingKey]; + FIRUserMetadata *metadata = [aDecoder decodeObjectOfClass:[FIRUserMetadata class] + forKey:kMetadataCodingKey]; + NSString *APIKey = [aDecoder decodeObjectOfClass:[NSString class] forKey:kAPIKeyCodingKey]; +#if TARGET_OS_IOS + FIRMultiFactor *multiFactor = [aDecoder decodeObjectOfClass:[FIRMultiFactor class] + forKey:kMultiFactorCodingKey]; +#endif + if (!userID || !tokenService) { + return nil; + } + self = [self initWithTokenService:tokenService]; + if (self) { + _userID = userID; + // Previous version of this code didn't save 'anonymous' bit directly but deduced it from + // 'hasEmailPasswordCredential' and 'providerData' instead, so here backward compatibility is + // provided to read old format data. + _anonymous = hasAnonymousKey ? anonymous : (!hasEmailPasswordCredential && !providerData.count); + _hasEmailPasswordCredential = hasEmailPasswordCredential; + _email = email; + _emailVerified = emailVerified; + _displayName = displayName; + _photoURL = photoURL; + _providerData = providerData; + _phoneNumber = phoneNumber; + _metadata = metadata ?: [[FIRUserMetadata alloc] initWithCreationDate:nil lastSignInDate:nil]; + _requestConfiguration = [[FIRAuthRequestConfiguration alloc] initWithAPIKey:APIKey]; +#if TARGET_OS_IOS + _multiFactor = multiFactor ?: [[FIRMultiFactor alloc] init]; +#endif + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_userID forKey:kUserIDCodingKey]; + [aCoder encodeBool:self.anonymous forKey:kAnonymousCodingKey]; + [aCoder encodeBool:_hasEmailPasswordCredential forKey:kHasEmailPasswordCredentialCodingKey]; + [aCoder encodeObject:_providerData forKey:kProviderDataKey]; + [aCoder encodeObject:_email forKey:kEmailCodingKey]; + [aCoder encodeObject:_phoneNumber forKey:kPhoneNumberCodingKey]; + [aCoder encodeBool:_emailVerified forKey:kEmailVerifiedCodingKey]; + [aCoder encodeObject:_photoURL forKey:kPhotoURLCodingKey]; + [aCoder encodeObject:_displayName forKey:kDisplayNameCodingKey]; + [aCoder encodeObject:_metadata forKey:kMetadataCodingKey]; + [aCoder encodeObject:_auth.requestConfiguration.APIKey forKey:kAPIKeyCodingKey]; + [aCoder encodeObject:_tokenService forKey:kTokenServiceCodingKey]; +#if TARGET_OS_IOS + [aCoder encodeObject:_multiFactor forKey:kMultiFactorCodingKey]; +#endif +} + +#pragma mark - + +- (void)setAuth:(nullable FIRAuth *)auth { + _auth = auth; + _tokenService.requestConfiguration = auth.requestConfiguration; +} + +- (NSString *)providerID { + return @"Firebase"; +} + +- (NSArray> *)providerData { + return _providerData.allValues; +} + +/** @fn getAccountInfoRefreshingCache: + @brief Gets the users's account data from the server, updating our local values. + @param callback Invoked when the request to getAccountInfo has completed, or when an error has + been detected. Invoked asynchronously on the auth global work queue in the future. + */ +- (void)getAccountInfoRefreshingCache:(void (^)(FIRGetAccountInfoResponseUser *_Nullable user, + NSError *_Nullable error))callback { + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, NSError *_Nullable error) { + if (error) { + callback(nil, error); + return; + } + FIRGetAccountInfoRequest *getAccountInfoRequest = + [[FIRGetAccountInfoRequest alloc] initWithAccessToken:accessToken + requestConfiguration:self->_auth.requestConfiguration]; + [FIRAuthBackend + getAccountInfo:getAccountInfoRequest + callback:^(FIRGetAccountInfoResponse *_Nullable response, NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + callback(nil, error); + return; + } + [self updateWithGetAccountInfoResponse:response]; + if (![self updateKeychain:&error]) { + callback(nil, error); + return; + } + callback(response.users.firstObject, nil); + }]; + }]; +} + +- (void)updateWithGetAccountInfoResponse:(FIRGetAccountInfoResponse *)response { + FIRGetAccountInfoResponseUser *user = response.users.firstObject; + _userID = user.localID; + _email = user.email; + _emailVerified = user.emailVerified; + _displayName = user.displayName; + _photoURL = user.photoURL; + _phoneNumber = user.phoneNumber; + _hasEmailPasswordCredential = user.passwordHash.length > 0; + _metadata = [[FIRUserMetadata alloc] initWithCreationDate:user.creationDate + lastSignInDate:user.lastLoginDate]; + NSMutableDictionary *providerData = + [NSMutableDictionary dictionary]; + for (FIRGetAccountInfoResponseProviderUserInfo *providerUserInfo in user.providerUserInfo) { + FIRUserInfoImpl *userInfo = + [FIRUserInfoImpl userInfoWithGetAccountInfoResponseProviderUserInfo:providerUserInfo]; + if (userInfo) { + providerData[providerUserInfo.providerID] = userInfo; + } + } + _providerData = [providerData copy]; +#if TARGET_OS_IOS + _multiFactor = [[FIRMultiFactor alloc] initWithMFAEnrollments:user.MFAEnrollments]; + _multiFactor.user = self; +#endif +} + +/** @fn executeUserUpdateWithChanges:callback: + @brief Performs a setAccountInfo request by mutating the results of a getAccountInfo response, + atomically in regards to other calls to this method. + @param changeBlock A block responsible for mutating a template @c FIRSetAccountInfoRequest + @param callback A block to invoke when the change is complete. Invoked asynchronously on the + auth global work queue in the future. + */ +- (void)executeUserUpdateWithChanges:(void (^)(FIRGetAccountInfoResponseUser *, + FIRSetAccountInfoRequest *))changeBlock + callback:(nonnull FIRUserProfileChangeCallback)callback { + [_taskQueue enqueueTask:^(FIRAuthSerialTaskCompletionBlock _Nonnull complete) { + [self getAccountInfoRefreshingCache:^(FIRGetAccountInfoResponseUser *_Nullable user, + NSError *_Nullable error) { + if (error) { + complete(); + callback(error); + return; + } + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, + NSError *_Nullable error) { + if (error) { + complete(); + callback(error); + return; + } + FIRAuthRequestConfiguration *configuration = self->_auth.requestConfiguration; + // Mutate setAccountInfoRequest in block: + FIRSetAccountInfoRequest *setAccountInfoRequest = + [[FIRSetAccountInfoRequest alloc] initWithRequestConfiguration:configuration]; + setAccountInfoRequest.accessToken = accessToken; + changeBlock(user, setAccountInfoRequest); + // Execute request: + [FIRAuthBackend + setAccountInfo:setAccountInfoRequest + callback:^(FIRSetAccountInfoResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + complete(); + callback(error); + return; + } + if (response.IDToken && response.refreshToken) { + FIRSecureTokenService *tokenService = [[FIRSecureTokenService alloc] + initWithRequestConfiguration:configuration + accessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken]; + [self setTokenService:tokenService + callback:^(NSError *_Nullable error) { + complete(); + callback(error); + }]; + return; + } + complete(); + callback(nil); + }]; + }]; + }]; + }]; +} + +/** @fn updateKeychain: + @brief Updates the keychain for user token or info changes. + @param error The error if NO is returned. + @return Whether the operation is successful. + */ +- (BOOL)updateKeychain:(NSError *_Nullable *_Nullable)error { + return [_auth updateKeychainWithUser:self error:error]; +} + +/** @fn setTokenService:callback: + @brief Sets a new token service for the @c FIRUser instance. + @param tokenService The new token service object. + @param callback The block to be called in the global auth working queue once finished. + @remarks The method makes sure the token service has access and refresh token and the new tokens + are saved in the keychain before calling back. + */ +- (void)setTokenService:(FIRSecureTokenService *)tokenService + callback:(nonnull CallbackWithError)callback { + [tokenService fetchAccessTokenForcingRefresh:NO + callback:^(NSString *_Nullable token, + NSError *_Nullable error, BOOL tokenUpdated) { + if (error) { + callback(error); + return; + } + self->_tokenService = tokenService; + if (![self updateKeychain:&error]) { + callback(error); + return; + } + callback(nil); + }]; +} + +#pragma mark - + +/** @fn updateEmail:password:callback: + @brief Updates email address and/or password for the current user. + @remarks May fail if there is already an email/password-based account for the same email + address. + @param email The email address for the user, if to be updated. + @param password The new password for the user, if to be updated. + @param callback The block called when the user profile change has finished. Invoked + asynchronously on the auth global work queue in the future. + @remarks May fail with a @c FIRAuthErrorCodeRequiresRecentLogin error code. + Call @c reauthentateWithCredential:completion: beforehand to avoid this error case. + */ +- (void)updateEmail:(nullable NSString *)email + password:(nullable NSString *)password + callback:(nonnull FIRUserProfileChangeCallback)callback { + if (password && ![password length]) { + callback([FIRAuthErrorUtils weakPasswordErrorWithServerResponseReason:kMissingPasswordReason]); + return; + } + BOOL hadEmailPasswordCredential = _hasEmailPasswordCredential; + [self + executeUserUpdateWithChanges:^(FIRGetAccountInfoResponseUser *user, + FIRSetAccountInfoRequest *request) { + if (email) { + request.email = email; + } + if (password) { + request.password = password; + } + } + callback:^(NSError *error) { + if (error) { + callback(error); + return; + } + if (email) { + self->_email = [email copy]; + } + if (self->_email) { + if (!hadEmailPasswordCredential) { + // The list of providers need to be updated for the newly added email-password provider. + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, + NSError *_Nullable error) { + if (error) { + callback(error); + return; + } + FIRAuthRequestConfiguration *requestConfiguration = self->_auth.requestConfiguration; + FIRGetAccountInfoRequest *getAccountInfoRequest = + [[FIRGetAccountInfoRequest alloc] initWithAccessToken:accessToken + requestConfiguration:requestConfiguration]; + [FIRAuthBackend + getAccountInfo:getAccountInfoRequest + callback:^(FIRGetAccountInfoResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + callback(error); + return; + } + for (FIRGetAccountInfoResponseUser *userAccountInfo in response.users) { + // Set the account to non-anonymous if there are any providers, even if + // they're not email/password ones. + if (userAccountInfo.providerUserInfo.count > 0) { + self.anonymous = NO; + } + for (FIRGetAccountInfoResponseProviderUserInfo + *providerUserInfo in userAccountInfo.providerUserInfo) { + if ([providerUserInfo.providerID + isEqualToString:FIREmailAuthProviderID]) { + self->_hasEmailPasswordCredential = YES; + break; + } + } + } + [self updateWithGetAccountInfoResponse:response]; + if (![self updateKeychain:&error]) { + callback(error); + return; + } + callback(nil); + }]; + }]; + return; + } + } + if (![self updateKeychain:&error]) { + callback(error); + return; + } + callback(nil); + }]; +} + +- (void)updateEmail:(NSString *)email completion:(nullable FIRUserProfileChangeCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self updateEmail:email + password:nil + callback:^(NSError *_Nullable error) { + callInMainThreadWithError(completion, error); + }]; + }); +} + +- (void)updatePassword:(NSString *)password + completion:(nullable FIRUserProfileChangeCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self updateEmail:nil + password:password + callback:^(NSError *_Nullable error) { + callInMainThreadWithError(completion, error); + }]; + }); +} + +#if TARGET_OS_IOS +/** @fn internalUpdateOrLinkPhoneNumberCredential:completion: + @brief Updates the phone number for the user. On success, the cached user profile data is + updated. + + @param phoneAuthCredential The new phone number credential corresponding to the phone number + to be added to the Firebase account, if a phone number is already linked to the account this + new phone number will replace it. + @param isLinkOperation Boolean value indicating whether or not this is a link operation. + @param completion Optionally; the block invoked when the user profile change has finished. + Invoked asynchronously on the global work queue in the future. + */ +- (void)internalUpdateOrLinkPhoneNumberCredential:(FIRPhoneAuthCredential *)phoneAuthCredential + isLinkOperation:(BOOL)isLinkOperation + completion:(FIRUserProfileChangeCallback)completion { + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, NSError *_Nullable error) { + if (error) { + completion(error); + return; + } + FIRAuthOperationType operation = + isLinkOperation ? FIRAuthOperationTypeLink : FIRAuthOperationTypeUpdate; + FIRVerifyPhoneNumberRequest *request = [[FIRVerifyPhoneNumberRequest alloc] + initWithVerificationID:phoneAuthCredential.verificationID + verificationCode:phoneAuthCredential.verificationCode + operation:operation + requestConfiguration:self->_auth.requestConfiguration]; + request.accessToken = accessToken; + [FIRAuthBackend verifyPhoneNumber:request + callback:^(FIRVerifyPhoneNumberResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + completion(error); + return; + } + // Get account info to update cached user info. + [self getAccountInfoRefreshingCache:^( + FIRGetAccountInfoResponseUser *_Nullable user, + NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + completion(error); + return; + } + self.anonymous = NO; + if (![self updateKeychain:&error]) { + completion(error); + return; + } + completion(nil); + }]; + }]; + }]; +} + +- (void)updatePhoneNumberCredential:(FIRPhoneAuthCredential *)phoneAuthCredential + completion:(nullable FIRUserProfileChangeCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self internalUpdateOrLinkPhoneNumberCredential:phoneAuthCredential + isLinkOperation:NO + completion:^(NSError *_Nullable error) { + callInMainThreadWithError(completion, error); + }]; + }); +} +#endif + +- (FIRUserProfileChangeRequest *)profileChangeRequest { + __block FIRUserProfileChangeRequest *result; + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + result = [[FIRUserProfileChangeRequest alloc] initWithUser:self]; + }); + return result; +} + +- (void)setDisplayName:(NSString *)displayName { + _displayName = [displayName copy]; +} + +- (void)setPhotoURL:(NSURL *)photoURL { + _photoURL = [photoURL copy]; +} + +- (NSString *)rawAccessToken { + return _tokenService.rawAccessToken; +} + +- (NSDate *)accessTokenExpirationDate { + return _tokenService.accessTokenExpirationDate; +} + +#pragma mark - + +- (void)reloadWithCompletion:(nullable FIRUserProfileChangeCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self getAccountInfoRefreshingCache:^(FIRGetAccountInfoResponseUser *_Nullable user, + NSError *_Nullable error) { + callInMainThreadWithError(completion, error); + }]; + }); +} + +#pragma mark - + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +- (void)reauthenticateWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion { + [self reauthenticateAndRetrieveDataWithCredential:credential completion:completion]; +} +#pragma clang diagnostic pop + +- (void)reauthenticateAndRetrieveDataWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self->_auth + internalSignInAndRetrieveDataWithCredential:credential + isReauthentication:YES + callback:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + if (error) { + // If "user not found" error returned by backend, + // translate to user mismatch error which is more + // accurate. + if (error.code == FIRAuthErrorCodeUserNotFound) { + error = [FIRAuthErrorUtils userMismatchError]; + } + callInMainThreadWithAuthDataResultAndError( + completion, authResult, error); + return; + } + if (![authResult.user.uid + isEqual:[self->_auth getUserID]]) { + callInMainThreadWithAuthDataResultAndError( + completion, authResult, + [FIRAuthErrorUtils userMismatchError]); + return; + } + // Successful reauthenticate + [self + setTokenService:authResult.user->_tokenService + callback:^(NSError *_Nullable error) { + callInMainThreadWithAuthDataResultAndError( + completion, authResult, error); + }]; + }]; + }); +} + +- (void)reauthenticateWithProvider:(id)provider + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRAuthDataResultCallback)completion { +#if TARGET_OS_IOS + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [provider getCredentialWithUIDelegate:UIDelegate + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) { + [self reauthenticateWithCredential:credential + completion:completion]; + }]; + }); +#endif // TARGET_OS_IOS +} + +- (nullable NSString *)refreshToken { + __block NSString *result; + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + result = self->_tokenService.refreshToken; + }); + return result; +} + +- (void)getIDTokenWithCompletion:(nullable FIRAuthTokenCallback)completion { + // |getIDTokenForcingRefresh:completion:| is also a public API so there is no need to dispatch to + // global work queue here. + [self getIDTokenForcingRefresh:NO completion:completion]; +} + +- (void)getIDTokenForcingRefresh:(BOOL)forceRefresh + completion:(nullable FIRAuthTokenCallback)completion { + [self getIDTokenResultForcingRefresh:forceRefresh + completion:^(FIRAuthTokenResult *_Nullable tokenResult, + NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(tokenResult.token, error); + }); + } + }]; +} + +- (void)getIDTokenResultWithCompletion:(nullable FIRAuthTokenResultCallback)completion { + [self getIDTokenResultForcingRefresh:NO + completion:^(FIRAuthTokenResult *_Nullable tokenResult, + NSError *_Nullable error) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(tokenResult, error); + }); + } + }]; +} + +- (void)getIDTokenResultForcingRefresh:(BOOL)forceRefresh + completion:(nullable FIRAuthTokenResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self internalGetTokenForcingRefresh:forceRefresh + callback:^(NSString *_Nullable token, NSError *_Nullable error) { + FIRAuthTokenResult *tokenResult; + if (token) { + tokenResult = [FIRAuthTokenResult tokenResultWithToken:token]; + } + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(tokenResult, error); + }); + } + }]; + }); +} + +/** @fn parseIDToken:error: + @brief Parses the provided IDToken and returns an instance of FIRAuthTokenResult containing + claims obtained from the IDToken. + + @param token The raw text of the Firebase IDToken encoded in base64. + @param error An out parameter which would contain any error that occurs during parsing. + @return An instance of FIRAuthTokenResult containing claims obtained from the IDToken. + + @remarks IDToken returned from the backend in some cases is of a length that is not a multiple + of 4. In these cases this function pads the token with as many "=" characters as needed and + then attempts to parse the token. If the token cannot be parsed an error is returned via the + "error" out parameter. + */ +- (nullable FIRAuthTokenResult *)parseIDToken:(NSString *)token error:(NSError **)error { + // Though this is an internal method, errors returned here are surfaced in user-visible + // callbacks. + if (error) { + *error = nil; + } + NSArray *tokenStringArray = [token componentsSeparatedByString:@"."]; + + // The JWT should have three parts, though we only use the second in this method. + if (tokenStringArray.count != 3) { + if (error) { + *error = [FIRAuthErrorUtils malformedJWTErrorWithToken:token underlyingError:nil]; + } + return nil; + } + + // The token payload is always the second index of the array. + NSString *IDToken = tokenStringArray[1]; + + // Convert the base64URL encoded string to a base64 encoded string. + // Replace "_" with "/" + NSMutableString *tokenPayload = [[IDToken stringByReplacingOccurrencesOfString:@"_" + withString:@"/"] mutableCopy]; + + // Replace "-" with "+" + [tokenPayload replaceOccurrencesOfString:@"-" + withString:@"+" + options:kNilOptions + range:NSMakeRange(0, tokenPayload.length)]; + + // Pad the token payload with "=" signs if the payload's length is not a multiple of 4. + while ((tokenPayload.length % 4) != 0) { + [tokenPayload appendFormat:@"="]; + } + NSData *decodedTokenPayloadData = + [[NSData alloc] initWithBase64EncodedString:tokenPayload + options:NSDataBase64DecodingIgnoreUnknownCharacters]; + if (!decodedTokenPayloadData) { + if (error) { + *error = [FIRAuthErrorUtils malformedJWTErrorWithToken:token underlyingError:nil]; + } + return nil; + } + NSError *jsonError = nil; + NSJSONReadingOptions options = NSJSONReadingMutableContainers | NSJSONReadingAllowFragments; + NSDictionary *tokenPayloadDictionary = + [NSJSONSerialization JSONObjectWithData:decodedTokenPayloadData + options:options + error:&jsonError]; + if (jsonError != nil) { + if (error) { + *error = [FIRAuthErrorUtils malformedJWTErrorWithToken:token underlyingError:jsonError]; + } + return nil; + } + + if (!tokenPayloadDictionary) { + if (error) { + *error = [FIRAuthErrorUtils malformedJWTErrorWithToken:token underlyingError:nil]; + } + return nil; + } + + FIRAuthTokenResult *result = [FIRAuthTokenResult tokenResultWithToken:token]; + return result; +} + +/** @fn internalGetTokenForcingRefresh:callback: + @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. + @param callback The block to invoke when the token is available. Invoked asynchronously on the + global work thread in the future. + */ +- (void)internalGetTokenWithCallback:(nonnull FIRAuthTokenCallback)callback { + [self internalGetTokenForcingRefresh:NO callback:callback]; +} + +- (void)internalGetTokenForcingRefresh:(BOOL)forceRefresh + callback:(nonnull FIRAuthTokenCallback)callback { + [_tokenService fetchAccessTokenForcingRefresh:forceRefresh + callback:^(NSString *_Nullable token, + NSError *_Nullable error, BOOL tokenUpdated) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + callback(nil, error); + return; + } + if (tokenUpdated) { + if (![self updateKeychain:&error]) { + callback(nil, error); + return; + } + } + callback(token, nil); + }]; +} + +- (void)sendEmailVerificationBeforeUpdatingEmail:(nonnull NSString *)email + completion:(nullable FIRAuthVoidErrorCallback)completion { + [self internalVerifyBeforeUpdateEmailWithNewEmail:email + actionCodeSettings:nil + completion:completion]; +} + +- (void)sendEmailVerificationBeforeUpdatingEmail:(nonnull NSString *)email + actionCodeSettings:(nonnull FIRActionCodeSettings *)actionCodeSettings + completion:(nullable FIRAuthVoidErrorCallback)completion { + [self internalVerifyBeforeUpdateEmailWithNewEmail:email + actionCodeSettings:actionCodeSettings + completion:completion]; +} + +- (void)internalVerifyBeforeUpdateEmailWithNewEmail:(NSString *)newEmail + actionCodeSettings: + (nullable FIRActionCodeSettings *)actionCodeSettings + completion:(FIRVerifyBeforeUpdateEmailCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self + internalGetTokenWithCallback:^(NSString *_Nullable accessToken, NSError *_Nullable error) { + if (error) { + callInMainThreadWithError(completion, error); + return; + } + FIRAuthRequestConfiguration *configuration = self->_auth.requestConfiguration; + FIRActionCodeSettings *settings = actionCodeSettings; + FIRGetOOBConfirmationCodeRequest *request = [FIRGetOOBConfirmationCodeRequest + verifyBeforeUpdateEmailWithAccessToken:accessToken + newEmail:newEmail + actionCodeSettings:settings + requestConfiguration:configuration]; + [FIRAuthBackend + getOOBConfirmationCode:request + callback:^(FIRGetOOBConfirmationCodeResponse *_Nullable response, + NSError *_Nullable error) { + callInMainThreadWithError(completion, error); + }]; + }]; + }); +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +- (void)linkWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion { + [self linkAndRetrieveDataWithCredential:credential completion:completion]; +} +#pragma clang diagnostic pop + +- (void)linkAndRetrieveDataWithCredential:(FIRAuthCredential *)credential + completion:(nullable FIRAuthDataResultCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + if (self->_providerData[credential.provider]) { + callInMainThreadWithAuthDataResultAndError(completion, nil, + [FIRAuthErrorUtils providerAlreadyLinkedError]); + return; + } + FIRAuthDataResult *result = [[FIRAuthDataResult alloc] initWithUser:self + additionalUserInfo:nil]; + if ([credential isKindOfClass:[FIREmailPasswordAuthCredential class]]) { + if (self->_hasEmailPasswordCredential) { + callInMainThreadWithAuthDataResultAndError(completion, nil, + [FIRAuthErrorUtils providerAlreadyLinkedError]); + return; + } + FIREmailPasswordAuthCredential *emailPasswordCredential = + (FIREmailPasswordAuthCredential *)credential; + if (emailPasswordCredential.password) { + [self updateEmail:emailPasswordCredential.email + password:emailPasswordCredential.password + callback:^(NSError *error) { + if (error) { + callInMainThreadWithAuthDataResultAndError(completion, nil, error); + } else { + callInMainThreadWithAuthDataResultAndError(completion, result, nil); + } + }]; + } else { + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, + NSError *_Nullable error) { + NSDictionary *queryItems = + [FIRAuthWebUtils parseURL:emailPasswordCredential.link]; + if (![queryItems count]) { + NSURLComponents *urlComponents = + [NSURLComponents componentsWithString:emailPasswordCredential.link]; + queryItems = [FIRAuthWebUtils parseURL:urlComponents.query]; + } + NSString *actionCode = queryItems[@"oobCode"]; + FIRAuthRequestConfiguration *requestConfiguration = self.auth.requestConfiguration; + FIREmailLinkSignInRequest *request = + [[FIREmailLinkSignInRequest alloc] initWithEmail:emailPasswordCredential.email + oobCode:actionCode + requestConfiguration:requestConfiguration]; + request.IDToken = accessToken; + [FIRAuthBackend + emailLinkSignin:request + callback:^(FIREmailLinkSignInResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + callInMainThreadWithAuthDataResultAndError(completion, nil, error); + } else { + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, + NSError *_Nullable error) { + if (error) { + callInMainThreadWithAuthDataResultAndError(completion, nil, error); + return; + } + + FIRGetAccountInfoRequest *getAccountInfoRequest = + [[FIRGetAccountInfoRequest alloc] + initWithAccessToken:accessToken + requestConfiguration:requestConfiguration]; + [FIRAuthBackend + getAccountInfo:getAccountInfoRequest + callback:^(FIRGetAccountInfoResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + callInMainThreadWithAuthDataResultAndError(completion, nil, + error); + return; + } + self.anonymous = NO; + [self updateWithGetAccountInfoResponse:response]; + if (![self updateKeychain:&error]) { + callInMainThreadWithAuthDataResultAndError(completion, nil, + error); + return; + } + callInMainThreadWithAuthDataResultAndError(completion, + result, nil); + }]; + }]; + } + }]; + }]; + } + return; + } + + if ([credential isKindOfClass:[FIRGameCenterAuthCredential class]]) { + FIRGameCenterAuthCredential *gameCenterCredential = (FIRGameCenterAuthCredential *)credential; + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, + NSError *_Nullable error) { + FIRAuthRequestConfiguration *requestConfiguration = self.auth.requestConfiguration; + FIRSignInWithGameCenterRequest *gameCenterRequest = [[FIRSignInWithGameCenterRequest alloc] + initWithPlayerID:gameCenterCredential.playerID + publicKeyURL:gameCenterCredential.publicKeyURL + signature:gameCenterCredential.signature + salt:gameCenterCredential.salt + timestamp:gameCenterCredential.timestamp + displayName:gameCenterCredential.displayName + requestConfiguration:requestConfiguration]; + gameCenterRequest.accessToken = accessToken; + + [FIRAuthBackend + signInWithGameCenter:gameCenterRequest + callback:^(FIRSignInWithGameCenterResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + callInMainThreadWithAuthDataResultAndError(completion, nil, error); + } else { + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, + NSError *_Nullable error) { + if (error) { + callInMainThreadWithAuthDataResultAndError(completion, nil, error); + return; + } + + FIRGetAccountInfoRequest *getAccountInfoRequest = + [[FIRGetAccountInfoRequest alloc] + initWithAccessToken:accessToken + requestConfiguration:requestConfiguration]; + [FIRAuthBackend + getAccountInfo:getAccountInfoRequest + callback:^(FIRGetAccountInfoResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + callInMainThreadWithAuthDataResultAndError(completion, + nil, error); + return; + } + self.anonymous = NO; + [self updateWithGetAccountInfoResponse:response]; + if (![self updateKeychain:&error]) { + callInMainThreadWithAuthDataResultAndError(completion, + nil, error); + return; + } + callInMainThreadWithAuthDataResultAndError(completion, + result, nil); + }]; + }]; + } + }]; + }]; + return; + } + +#if TARGET_OS_IOS + if ([credential isKindOfClass:[FIRPhoneAuthCredential class]]) { + FIRPhoneAuthCredential *phoneAuthCredential = (FIRPhoneAuthCredential *)credential; + [self internalUpdateOrLinkPhoneNumberCredential:phoneAuthCredential + isLinkOperation:YES + completion:^(NSError *_Nullable error) { + if (error) { + callInMainThreadWithAuthDataResultAndError( + completion, nil, error); + } else { + callInMainThreadWithAuthDataResultAndError( + completion, result, nil); + } + }]; + return; + } +#endif + + [self->_taskQueue enqueueTask:^(FIRAuthSerialTaskCompletionBlock _Nonnull complete) { + CallbackWithAuthDataResultAndError completeWithError = + ^(FIRAuthDataResult *result, NSError *error) { + complete(); + callInMainThreadWithAuthDataResultAndError(completion, result, error); + }; + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, + NSError *_Nullable error) { + if (error) { + completeWithError(nil, error); + return; + } + FIRAuthRequestConfiguration *requestConfiguration = self->_auth.requestConfiguration; + FIRVerifyAssertionRequest *request = + [[FIRVerifyAssertionRequest alloc] initWithProviderID:credential.provider + requestConfiguration:requestConfiguration]; + [credential prepareVerifyAssertionRequest:request]; + request.accessToken = accessToken; + [FIRAuthBackend + verifyAssertion:request + callback:^(FIRVerifyAssertionResponse *response, NSError *error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + completeWithError(nil, error); + return; + } + FIRAdditionalUserInfo *additionalUserInfo = + [FIRAdditionalUserInfo userInfoWithVerifyAssertionResponse:response]; + FIROAuthCredential *updatedOAuthCredential = + [[FIROAuthCredential alloc] initWithVerifyAssertionResponse:response]; + FIRAuthDataResult *result = + [[FIRAuthDataResult alloc] initWithUser:self + additionalUserInfo:additionalUserInfo + credential:updatedOAuthCredential]; + // Update the new token and refresh user info again. + self->_tokenService = [[FIRSecureTokenService alloc] + initWithRequestConfiguration:requestConfiguration + accessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken]; + [self internalGetTokenWithCallback:^(NSString *_Nullable accessToken, + NSError *_Nullable error) { + if (error) { + completeWithError(nil, error); + return; + } + FIRGetAccountInfoRequest *getAccountInfoRequest = + [[FIRGetAccountInfoRequest alloc] + initWithAccessToken:accessToken + requestConfiguration:requestConfiguration]; + [FIRAuthBackend + getAccountInfo:getAccountInfoRequest + callback:^(FIRGetAccountInfoResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + completeWithError(nil, error); + return; + } + self.anonymous = NO; + [self updateWithGetAccountInfoResponse:response]; + if (![self updateKeychain:&error]) { + completeWithError(nil, error); + return; + } + completeWithError(result, nil); + }]; + }]; + }]; + }]; + }]; + }); +} + +- (void)linkWithProvider:(id)provider + UIDelegate:(nullable id)UIDelegate + completion:(nullable FIRAuthDataResultCallback)completion { +#if TARGET_OS_IOS + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [provider getCredentialWithUIDelegate:UIDelegate + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) { + [self linkWithCredential:credential completion:completion]; + }]; + }); +#endif // TARGET_OS_IOS +} + +- (void)unlinkFromProvider:(NSString *)provider + completion:(nullable FIRAuthResultCallback)completion { + [_taskQueue enqueueTask:^(FIRAuthSerialTaskCompletionBlock _Nonnull complete) { + CallbackWithError completeAndCallbackWithError = ^(NSError *error) { + complete(); + callInMainThreadWithUserAndError(completion, self, error); + }; + [self + internalGetTokenWithCallback:^(NSString *_Nullable accessToken, NSError *_Nullable error) { + if (error) { + completeAndCallbackWithError(error); + return; + } + FIRAuthRequestConfiguration *requestConfiguration = self->_auth.requestConfiguration; + FIRSetAccountInfoRequest *setAccountInfoRequest = + [[FIRSetAccountInfoRequest alloc] initWithRequestConfiguration:requestConfiguration]; + setAccountInfoRequest.accessToken = accessToken; + + if (!self->_providerData[provider]) { + completeAndCallbackWithError([FIRAuthErrorUtils noSuchProviderError]); + return; + } + setAccountInfoRequest.deleteProviders = @[ provider ]; + + [FIRAuthBackend + setAccountInfo:setAccountInfoRequest + callback:^(FIRSetAccountInfoResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + [self signOutIfTokenIsInvalidWithError:error]; + completeAndCallbackWithError(error); + return; + } + + // We can't just use the provider info objects in FIRSetAccountInfoResponse + // because they don't have localID and email fields. Remove the specific + // provider manually. + NSMutableDictionary *mutableProviderData = [self->_providerData mutableCopy]; + [mutableProviderData removeObjectForKey:provider]; + self->_providerData = [mutableProviderData copy]; + + if ([provider isEqualToString:FIREmailAuthProviderID]) { + self->_hasEmailPasswordCredential = NO; + } +#if TARGET_OS_IOS + // After successfully unlinking a phone auth provider, remove the phone number + // from the cached user info. + if ([provider isEqualToString:FIRPhoneAuthProviderID]) { + self->_phoneNumber = nil; + } +#endif + + if (response.IDToken && response.refreshToken) { + FIRSecureTokenService *tokenService = [[FIRSecureTokenService alloc] + initWithRequestConfiguration:requestConfiguration + accessToken:response.IDToken + accessTokenExpirationDate:response.approximateExpirationDate + refreshToken:response.refreshToken]; + [self setTokenService:tokenService + callback:^(NSError *_Nullable error) { + completeAndCallbackWithError(error); + }]; + return; + } + if (![self updateKeychain:&error]) { + completeAndCallbackWithError(error); + return; + } + completeAndCallbackWithError(nil); + }]; + }]; + }]; +} + +- (void)sendEmailVerificationWithCompletion:(nullable FIRSendEmailVerificationCallback)completion { + [self sendEmailVerificationWithNullableActionCodeSettings:nil completion:completion]; +} + +- (void)sendEmailVerificationWithActionCodeSettings:(FIRActionCodeSettings *)actionCodeSettings + completion: + (nullable FIRSendEmailVerificationCallback)completion { + [self sendEmailVerificationWithNullableActionCodeSettings:actionCodeSettings + completion:completion]; +} + +/** @fn sendEmailVerificationWithNullableActionCodeSettings:completion: + @brief Initiates email verification for the user. + + @param actionCodeSettings Optionally, a @c FIRActionCodeSettings object containing settings + related to the handling action codes. + */ +- (void)sendEmailVerificationWithNullableActionCodeSettings: + (nullable FIRActionCodeSettings *)actionCodeSettings + completion: + (nullable FIRSendEmailVerificationCallback) + completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self + internalGetTokenWithCallback:^(NSString *_Nullable accessToken, NSError *_Nullable error) { + if (error) { + callInMainThreadWithError(completion, error); + return; + } + FIRAuthRequestConfiguration *configuration = self->_auth.requestConfiguration; + FIRGetOOBConfirmationCodeRequest *request = + [FIRGetOOBConfirmationCodeRequest verifyEmailRequestWithAccessToken:accessToken + actionCodeSettings:actionCodeSettings + requestConfiguration:configuration]; + [FIRAuthBackend + getOOBConfirmationCode:request + callback:^(FIRGetOOBConfirmationCodeResponse *_Nullable response, + NSError *_Nullable error) { + [self signOutIfTokenIsInvalidWithError:error]; + callInMainThreadWithError(completion, error); + }]; + }]; + }); +} + +- (void)deleteWithCompletion:(nullable FIRUserProfileChangeCallback)completion { + dispatch_async(FIRAuthGlobalWorkQueue(), ^{ + [self + internalGetTokenWithCallback:^(NSString *_Nullable accessToken, NSError *_Nullable error) { + if (error) { + callInMainThreadWithError(completion, error); + return; + } + FIRDeleteAccountRequest *deleteUserRequest = + [[FIRDeleteAccountRequest alloc] initWitLocalID:self->_userID + accessToken:accessToken + requestConfiguration:self->_auth.requestConfiguration]; + [FIRAuthBackend deleteAccount:deleteUserRequest + callback:^(NSError *_Nullable error) { + if (error) { + callInMainThreadWithError(completion, error); + return; + } + if (![self->_auth signOutByForceWithUserID:self->_userID + error:&error]) { + callInMainThreadWithError(completion, error); + return; + } + callInMainThreadWithError(completion, error); + }]; + }]; + }); +} + +/** @fn signOutIfTokenIsInvalidWithError: + @brief Signs out this user if the user or the token is invalid. + @param error The error from the server. + */ +- (void)signOutIfTokenIsInvalidWithError:(nullable NSError *)error { + NSInteger errorCode = error.code; + if (errorCode == FIRAuthErrorCodeUserNotFound || errorCode == FIRAuthErrorCodeUserDisabled || + errorCode == FIRAuthErrorCodeInvalidUserToken || + errorCode == FIRAuthErrorCodeUserTokenExpired) { + FIRLogNotice(kFIRLoggerAuth, @"I-AUT000016", + @"Invalid user token detected, user is automatically signed out."); + [_auth signOutByForceWithUserID:_userID error:NULL]; + } +} + +@end + +@implementation FIRUserProfileChangeRequest { + /** @var _user + @brief The user associated with the change request. + */ + FIRUser *_user; + + /** @var _displayName + @brief The display name value to set if @c _displayNameSet is YES. + */ + NSString *_displayName; + + /** @var _displayNameSet + @brief Indicates the display name should be part of the change request. + */ + BOOL _displayNameSet; + + /** @var _photoURL + @brief The photo URL value to set if @c _displayNameSet is YES. + */ + NSURL *_photoURL; + + /** @var _photoURLSet + @brief Indicates the photo URL should be part of the change request. + */ + BOOL _photoURLSet; + + /** @var _consumed + @brief Indicates the @c commitChangesWithCallback: method has already been invoked. + */ + BOOL _consumed; +} + +- (nullable instancetype)initWithUser:(FIRUser *)user { + self = [super init]; + if (self) { + _user = user; + } + return self; +} + +- (nullable NSString *)displayName { + return _displayName; +} + +- (void)setDisplayName:(nullable NSString *)displayName { + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + if (self->_consumed) { + [NSException + raise:NSInternalInconsistencyException + format:@"%@", @"Invalid call to setDisplayName: after commitChangesWithCallback:."]; + return; + } + self->_displayNameSet = YES; + self->_displayName = [displayName copy]; + }); +} + +- (nullable NSURL *)photoURL { + return _photoURL; +} + +- (void)setPhotoURL:(nullable NSURL *)photoURL { + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + if (self->_consumed) { + [NSException raise:NSInternalInconsistencyException + format:@"%@", @"Invalid call to setPhotoURL: after commitChangesWithCallback:."]; + return; + } + self->_photoURLSet = YES; + self->_photoURL = [photoURL copy]; + }); +} + +/** @fn hasUpdates + @brief Indicates at least one field has a value which needs to be committed. + */ +- (BOOL)hasUpdates { + return _displayNameSet || _photoURLSet; +} + +- (void)commitChangesWithCompletion:(nullable FIRUserProfileChangeCallback)completion { + dispatch_sync(FIRAuthGlobalWorkQueue(), ^{ + if (self->_consumed) { + [NSException raise:NSInternalInconsistencyException + format:@"%@", @"commitChangesWithCallback: should only be called once."]; + return; + } + self->_consumed = YES; + // Return fast if there is nothing to update: + if (![self hasUpdates]) { + callInMainThreadWithError(completion, nil); + return; + } + NSString *displayName = [self->_displayName copy]; + BOOL displayNameWasSet = self->_displayNameSet; + NSURL *photoURL = [self->_photoURL copy]; + BOOL photoURLWasSet = self->_photoURLSet; + [self->_user + executeUserUpdateWithChanges:^(FIRGetAccountInfoResponseUser *user, + FIRSetAccountInfoRequest *request) { + if (photoURLWasSet) { + request.photoURL = photoURL; + } + if (displayNameWasSet) { + request.displayName = displayName; + } + } + callback:^(NSError *_Nullable error) { + if (error) { + callInMainThreadWithError(completion, error); + return; + } + if (displayNameWasSet) { + [self->_user setDisplayName:displayName]; + } + if (photoURLWasSet) { + [self->_user setPhotoURL:photoURL]; + } + if (![self->_user updateKeychain:&error]) { + callInMainThreadWithError(completion, error); + return; + } + callInMainThreadWithError(completion, nil); + }]; + }); +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserInfoImpl.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserInfoImpl.h new file mode 100644 index 00000000..45b9f038 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserInfoImpl.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +@class FIRGetAccountInfoResponseProviderUserInfo; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRUserInfoImpl : NSObject + +/** @fn userInfoWithGetAccountInfoResponseProviderUserInfo: + @brief A convenience factory method for constructing a @c FIRUserInfo instance from data + returned by the getAccountInfo endpoint. + @param providerUserInfo Data returned by the getAccountInfo endpoint. + @return A new instance of @c FIRUserInfo using data from the getAccountInfo endpoint. + */ ++ (nullable instancetype)userInfoWithGetAccountInfoResponseProviderUserInfo: + (FIRGetAccountInfoResponseProviderUserInfo *)providerUserInfo; + +/** @fn init + @brief This class should not be initialized manually. + @see FIRUser.providerData + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithProviderID:userID:displayName:photoURL:email: + @brief Designated initializer. + @param providerID The provider identifier. + @param userID The unique user ID for the user (the value of the @c uid field in the token.) + @param displayName The name of the user. + @param photoURL The URL of the user's profile photo. + @param email The user's email address. + @param phoneNumber The user's phone number. + */ +- (nullable instancetype)initWithProviderID:(NSString *)providerID + userID:(NSString *)userID + displayName:(nullable NSString *)displayName + photoURL:(nullable NSURL *)photoURL + email:(nullable NSString *)email + phoneNumber:(nullable NSString *)phoneNumber + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserInfoImpl.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserInfoImpl.m new file mode 100644 index 00000000..50926067 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserInfoImpl.m @@ -0,0 +1,131 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/User/FIRUserInfoImpl.h" + +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetAccountInfoResponse.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kProviderIDCodingKey + @brief The key used to encode the providerID property for NSSecureCoding. + */ +static NSString *const kProviderIDCodingKey = @"providerID"; + +/** @var kUserIDCodingKey + @brief The key used to encode the userID property for NSSecureCoding. + */ +static NSString *const kUserIDCodingKey = @"userID"; + +/** @var kDisplayNameCodingKey + @brief The key used to encode the displayName property for NSSecureCoding. + */ +static NSString *const kDisplayNameCodingKey = @"displayName"; + +/** @var kProfileURLCodingKey + @brief The key used to encode the profileURL property for NSSecureCoding. + */ +static NSString *const kProfileURLCodingKey = @"profileURL"; + +/** @var kPhotoURLCodingKey + @brief The key used to encode the photoURL property for NSSecureCoding. + */ +static NSString *const kPhotoURLCodingKey = @"photoURL"; + +/** @var kEmailCodingKey + @brief The key used to encode the email property for NSSecureCoding. + */ +static NSString *const kEmailCodingKey = @"email"; + +/** @var kPhoneNumberCodingKey + @brief The key used to encode the phoneNumber property for NSSecureCoding. + */ +static NSString *const kPhoneNumberCodingKey = @"phoneNumber"; + +@implementation FIRUserInfoImpl + +@synthesize providerID = _providerID; +@synthesize uid = _userID; +@synthesize displayName = _displayName; +@synthesize photoURL = _photoURL; +@synthesize email = _email; +@synthesize phoneNumber = _phoneNumber; + ++ (nullable instancetype)userInfoWithGetAccountInfoResponseProviderUserInfo: + (FIRGetAccountInfoResponseProviderUserInfo *)providerUserInfo { + return [[self alloc] initWithProviderID:providerUserInfo.providerID + userID:providerUserInfo.federatedID + displayName:providerUserInfo.displayName + photoURL:providerUserInfo.photoURL + email:providerUserInfo.email + phoneNumber:providerUserInfo.phoneNumber]; +} + +- (nullable instancetype)initWithProviderID:(NSString *)providerID + userID:(NSString *)userID + displayName:(nullable NSString *)displayName + photoURL:(nullable NSURL *)photoURL + email:(nullable NSString *)email + phoneNumber:(nullable NSString *)phoneNumber { + self = [super init]; + if (self) { + _providerID = [providerID copy]; + _userID = [userID copy]; + _displayName = [displayName copy]; + _photoURL = [photoURL copy]; + _email = [email copy]; + _phoneNumber = [phoneNumber copy]; + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *providerID = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kProviderIDCodingKey]; + NSString *userID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kUserIDCodingKey]; + NSString *displayName = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kDisplayNameCodingKey]; + NSURL *photoURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:kPhotoURLCodingKey]; + NSString *email = [aDecoder decodeObjectOfClass:[NSString class] forKey:kEmailCodingKey]; + NSString *phoneNumber = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kPhoneNumberCodingKey]; + + return [self initWithProviderID:providerID + userID:userID + displayName:displayName + photoURL:photoURL + email:email + phoneNumber:phoneNumber]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_providerID forKey:kProviderIDCodingKey]; + [aCoder encodeObject:_userID forKey:kUserIDCodingKey]; + [aCoder encodeObject:_displayName forKey:kDisplayNameCodingKey]; + [aCoder encodeObject:_photoURL forKey:kPhotoURLCodingKey]; + [aCoder encodeObject:_email forKey:kEmailCodingKey]; + [aCoder encodeObject:_phoneNumber forKey:kPhoneNumberCodingKey]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserMetadata.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserMetadata.m new file mode 100644 index 00000000..ba46ebd4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserMetadata.m @@ -0,0 +1,64 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/User/FIRUserMetadata_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRUserMetadata + +/** @var kCreationDateCodingKey + @brief The key used to encode the creationDate property for NSSecureCoding. + */ +static NSString *const kCreationDateCodingKey = @"creationDate"; + +/** @var kLastSignInDateCodingKey + @brief The key used to encode the lastSignInDate property for NSSecureCoding. + */ +static NSString *const kLastSignInDateCodingKey = @"lastSignInDate"; + +- (instancetype)initWithCreationDate:(nullable NSDate *)creationDate + lastSignInDate:(nullable NSDate *)lastSignInDate { + self = [super init]; + if (self) { + _creationDate = [creationDate copy]; + _lastSignInDate = [lastSignInDate copy]; + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSDate *creationDate = [aDecoder decodeObjectOfClass:[NSDate class] + forKey:kCreationDateCodingKey]; + NSDate *lastSignInDate = [aDecoder decodeObjectOfClass:[NSDate class] + forKey:kLastSignInDateCodingKey]; + return [self initWithCreationDate:creationDate lastSignInDate:lastSignInDate]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_creationDate forKey:kCreationDateCodingKey]; + [aCoder encodeObject:_lastSignInDate forKey:kLastSignInDateCodingKey]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserMetadata_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserMetadata_Internal.h new file mode 100644 index 00000000..7348bf2d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUserMetadata_Internal.h @@ -0,0 +1,37 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @extension FIRUserMetadata + @brief An internal class used to expose internal methods of FIRUserMetadata. + */ +@interface FIRUserMetadata () + +/** @fn initWithCreationDate:lastSignInDate: + @brief Designated initializer. + @param creationDate The creation date of the corresponding user. + @param lastSignInDate The date of the last recorded sign-in of the corresponding user. + */ +- (instancetype)initWithCreationDate:(nullable NSDate *)creationDate + lastSignInDate:(nullable NSDate *)lastSignInDate NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUser_Internal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUser_Internal.h new file mode 100644 index 00000000..99a1197e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/User/FIRUser_Internal.h @@ -0,0 +1,107 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuth; +@class FIRAuthRequestConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRRetrieveUserCallback + @brief The type of block that is invoked when the construction of a user succeeds or fails. + @param user The user that was constructed, or nil if user construction failed. + @param error The error which occurred, or nil if the request was successful. + */ +typedef void (^FIRRetrieveUserCallback)(FIRUser *_Nullable user, NSError *_Nullable error); + +/** @typedef FIRVerifyBeforeUpdateEmailCallback + @brief The type of block called when a request to verify before update email has finished. + @param error Optionally; the error which occurred - or nil if the request was successful. + */ +typedef void (^FIRVerifyBeforeUpdateEmailCallback)(NSError *_Nullable error); + +@interface FIRUser () + +/** @property rawAccessToken + @brief The cached access token. + @remarks This method is specifically for providing the access token to internal clients during + deserialization and sign-in events, and should not be used to retrieve the access token by + anyone else. + */ +@property(nonatomic, copy, readonly) NSString *rawAccessToken; + +/** @property auth + @brief A weak reference to a FIRAuth instance associated with this instance. + */ +@property(nonatomic, weak) FIRAuth *auth; + +/** @property auth + @brief A strong reference to a requestConfiguration instance associated with this user instance. + */ +@property(nonatomic, strong) FIRAuthRequestConfiguration *requestConfiguration; + +/** @var accessTokenExpirationDate + @brief The expiration date of the cached access token. + */ +@property(nonatomic, copy, readonly) NSDate *accessTokenExpirationDate; + +/** @fn retrieveUserWithAuth:accessToken:accessTokenExpirationDate:refreshToken:callback: + @brief Constructs a user with Secure Token Service tokens, and obtains user details from the + getAccountInfo endpoint. + @param auth The associated FIRAuth instance. + @param accessToken The Secure Token Service access token. + @param accessTokenExpirationDate The approximate expiration date of the access token. + @param refreshToken The Secure Token Service refresh token. + @param anonymous Whether or not the user is anonymous. + @param callback A block which is invoked when the construction succeeds or fails. Invoked + asynchronously on the auth global work queue in the future. + */ ++ (void)retrieveUserWithAuth:(FIRAuth *)auth + accessToken:(nullable NSString *)accessToken + accessTokenExpirationDate:(nullable NSDate *)accessTokenExpirationDate + refreshToken:(nullable NSString *)refreshToken + anonymous:(BOOL)anonymous + callback:(FIRRetrieveUserCallback)callback; + +/** @fn internalGetTokenForcingRefresh:callback: + @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. + @param forceRefresh Forces a token refresh. Useful if the token becomes invalid for some reason + other than an expiration. + @param callback The block to invoke when the token is available. Invoked asynchronously on the + global work thread in the future. + */ +- (void)internalGetTokenForcingRefresh:(BOOL)forceRefresh + callback:(nonnull FIRAuthTokenCallback)callback; + +/** @fn internalVerifyBeforeUpdateEmailWithNewEmail:actionCodeSettings:callback: + @brief Sends a verification email to newEmail. Upon redemption of the link in the email, + this user's email will be changed to newEmail and that email will be marked verified. + @param newEmail the user's new email. + @param actionCodeSettings the optional FIRActionCodeSettings object to allow linking back + to your app in the email. + @param completion The block to invoke when the call succeeds or fails. Invoked asynchronously on + the global work thread in the future. + + */ +- (void)internalVerifyBeforeUpdateEmailWithNewEmail:(NSString *)newEmail + actionCodeSettings: + (nullable FIRActionCodeSettings *)actionCodeSettings + completion:(FIRVerifyBeforeUpdateEmailCallback)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.h new file mode 100644 index 00000000..57131c15 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.h @@ -0,0 +1,47 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthDefaultUIDelegate + @brief Class responsible for providing a default FIRAuthUIDelegte. + @remarks This class should be used in the case that a UIDelegate was expected and necessary to + continue a given flow, but none was provided. + */ +@interface FIRAuthDefaultUIDelegate : NSObject + +/** @fn defaultUIDelegate + @brief Unavailable. Please use @c +defaultUIDelegate: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn defaultUIDelegate + @brief Returns a default FIRAuthUIDelegate object. + @return The default FIRAuthUIDelegate object. + */ ++ (id)defaultUIDelegate; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.m new file mode 100644 index 00000000..2ba27a5a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.m @@ -0,0 +1,126 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if !TARGET_OS_OSX + +#import +#import + +#import "FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthDefaultUIDelegate () + +/** @fn initWithViewController: + @brief Initializes the instance with a view controller. + @param viewController The view controller as the presenting view controller in @c + FIRAuthUIDelegate. + @return The initialized instance. + */ +- (instancetype)initWithViewController:(nullable UIViewController *)viewController + NS_DESIGNATED_INITIALIZER; + +@end + +@implementation FIRAuthDefaultUIDelegate { + /** @var _viewController + @brief The presenting view controller. + */ + UIViewController *_viewController; +} + +- (instancetype)initWithViewController:(nullable UIViewController *)viewController { + self = [super init]; + if (self) { + _viewController = viewController; + } + return self; +} + +- (void)presentViewController:(UIViewController *)viewControllerToPresent + animated:(BOOL)flag + completion:(nullable void (^)(void))completion { + [_viewController presentViewController:viewControllerToPresent + animated:flag + completion:completion]; +} + +- (void)dismissViewControllerAnimated:(BOOL)flag completion:(nullable void (^)(void))completion { + [_viewController dismissViewControllerAnimated:flag completion:completion]; +} + ++ (id)defaultUIDelegate { + // iOS App extensions should not call [UIApplication sharedApplication], even if UIApplication + // responds to it. + static Class applicationClass = nil; + if (![GULAppEnvironmentUtil isAppExtension]) { + Class cls = NSClassFromString(@"UIApplication"); + if (cls && [cls respondsToSelector:NSSelectorFromString(@"sharedApplication")]) { + applicationClass = cls; + } + } + + UIViewController *topViewController; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + if (@available(iOS 13.0, tvOS 13.0, *)) { + UIApplication *application = [applicationClass sharedApplication]; + NSSet *connectedScenes = application.connectedScenes; + for (UIScene *scene in connectedScenes) { + if ([scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow) { + topViewController = window.rootViewController; + } + } + } + } + } else { + UIApplication *application = [applicationClass sharedApplication]; +// iOS 13 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + topViewController = application.keyWindow.rootViewController; +#pragma clang diagnostic pop + } +#else + UIApplication *application = [applicationClass sharedApplication]; + topViewController = application.keyWindow.rootViewController; +#endif + + while (true) { + if (topViewController.presentedViewController) { + topViewController = topViewController.presentedViewController; + } else if ([topViewController isKindOfClass:[UINavigationController class]]) { + UINavigationController *nav = (UINavigationController *)topViewController; + topViewController = nav.topViewController; + } else if ([topViewController isKindOfClass:[UITabBarController class]]) { + UITabBarController *tab = (UITabBarController *)topViewController; + topViewController = tab.selectedViewController; + } else { + break; + } + } + return [[FIRAuthDefaultUIDelegate alloc] initWithViewController:topViewController]; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h new file mode 100644 index 00000000..1ee020c7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h @@ -0,0 +1,585 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +#import "FirebaseAuth/Sources/Utilities/FIRAuthInternalErrors.h" + +@class FIRAuthCredential; + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthErrorUtils + @brief Utility class used to construct @c NSError instances. + */ +@interface FIRAuthErrorUtils : NSObject + ++ (NSError *)errorWithCode:(FIRAuthInternalErrorCode)code message:(nullable NSString *)message; + +/** @fn RPCRequestEncodingErrorWithUnderlyingError + @brief Constructs an @c NSError with the @c FIRAuthInternalErrorCodeRPCRequestEncodingError + code and a populated @c NSUnderlyingErrorKey in the @c NSError.userInfo dictionary. + @param underlyingError The value of the @c NSUnderlyingErrorKey key. + @remarks This error is used when an @c FIRAuthRPCRequest.unencodedHTTPRequestBodyWithError: + invocation returns an error. The error returned is wrapped in this internal error code. + */ ++ (NSError *)RPCRequestEncodingErrorWithUnderlyingError:(NSError *)underlyingError; + +/** @fn JSONSerializationErrorForUnencodableType + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeJSONSerializationError code. + @remarks This error is used when an @c NSJSONSerialization.isValidJSONObject: check fails, not + for when an error is returned from @c NSJSONSerialization.dataWithJSONObject:options:error:. + */ ++ (NSError *)JSONSerializationErrorForUnencodableType; + +/** @fn JSONSerializationErrorWithUnderlyingError: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeJSONSerializationError code, and the + @c underlyingError as the @c NSUnderlyingErrorKey value in the @c NSError.userInfo + dictionary. + @param underlyingError The value of the @c NSUnderlyingErrorKey key. + @remarks This error is used when an invocation of + @c NSJSONSerialization.dataWithJSONObject:options:error: returns an error. + */ ++ (NSError *)JSONSerializationErrorWithUnderlyingError:(NSError *)underlyingError; + +/** @fn networkErrorWithUnderlyingError: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeNetworkError code, and the + @c underlyingError as the @c NSUnderlyingErrorKey value in the @c NSError.userInfo + dictionary. + @param underlyingError The value of the @c NSUnderlyingErrorKey key. Should be the error from + GTM. + @remarks This error is used when a network request results in an error, and no body data was + returned. + */ ++ (NSError *)networkErrorWithUnderlyingError:(NSError *)underlyingError; + +/** @fn unexpectedErrorResponseWithUnderlyingError: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeNetworkError code, and the + @c underlyingError as the @c NSUnderlyingErrorKey value. + @param data The value of the @c FIRAuthErrorUserInfoDataKey key in the @c NSError.userInfo + dictionary. + @param underlyingError The value of the @c NSUnderlyingErrorKey key in the @c NSError.userInfo + dictionary. + @remarks This error is used when a network request results in an error, and unserializable body + data was returned. + */ ++ (NSError *)unexpectedErrorResponseWithData:(NSData *)data + underlyingError:(NSError *)underlyingError; + +/** @fn unexpectedErrorResponseWithDeserializedResponse: + @brief Constructs an @c NSError with the @c FIRAuthInternalErrorCodeUnexpectedErrorResponse + code, and a populated @c FIRAuthErrorUserInfoDeserializedResponseKey key in the + @c NSError.userInfo dictionary. + @param deserializedResponse The value of the @c FIRAuthErrorUserInfoDeserializedResponseKey key. + @remarks This error is used when a network request results in an error, and the body data was + deserializable as JSON, but couldn't be decoded as an error. + */ ++ (NSError *)unexpectedErrorResponseWithDeserializedResponse:(id)deserializedResponse; + +/** @fn malformedJWTErrorWithToken:underlyingError: + @brief Constructs an @c NSError with the code set to @c FIRAuthErrorCodeMalformedJWT and + populates the userInfo dictionary with an error message, the bad token, and an underlying + error that may have occurred when parsing. + @param token The token that failed to parse. + @param underlyingError The error that caused this error. If this parameter is nil, the + NSUnderlyingErrorKey value will not be set. + @remarks This error is returned when JWT parsing fails. + @returns An @c FIRAuthErrorCodeMalformedJWT error wrapping an underlying error, if available. + */ ++ (NSError *)malformedJWTErrorWithToken:(NSString *)token + underlyingError:(NSError *_Nullable)underlyingError; + +/** @fn unexpectedResponseWithData:underlyingError: + @brief Constructs an @c NSError with the @c FIRAuthInternalErrorCodeUnexpectedResponse + code, and a populated @c FIRAuthErrorUserInfoDataKey key in the @c NSError.userInfo + dictionary. + @param data The value of the @c FIRAuthErrorUserInfoDataKey key in the @c NSError.userInfo + dictionary. + @param underlyingError The value of the @c NSUnderlyingErrorKey key in the @c NSError.userInfo + dictionary. + @remarks This error is used when a network request is apparently successful, but the body data + couldn't be deserialized as JSON. + */ ++ (NSError *)unexpectedResponseWithData:(NSData *)data underlyingError:(NSError *)underlyingError; +; + +/** @fn unexpectedResponseWithDeserializedResponse: + @brief Constructs an @c NSError with the @c FIRAuthInternalErrorCodeUnexpectedResponse + code, and a populated @c FIRAuthErrorUserInfoDeserializedResponseKey key in the + @c NSError.userInfo dictionary. + @param deserializedResponse The value of the @c FIRAuthErrorUserInfoDeserializedResponseKey key. + @remarks This error is used when a network request is apparently successful, the body data was + successfully deserialized as JSON, but the JSON wasn't a dictionary. + */ ++ (NSError *)unexpectedResponseWithDeserializedResponse:(id)deserializedResponse; + +/** @fn unexpectedResponseWithDeserializedResponse:underlyingError: + @brief Constructs an @c NSError with the @c FIRAuthInternalErrorCodeUnexpectedResponse + code, and populated @c FIRAuthErrorUserInfoDeserializedResponseKey and + @c NSUnderlyingErrorKey keys in the @c NSError.userInfo dictionary. + @param deserializedResponse The value of the @c FIRAuthErrorUserInfoDeserializedResponseKey key. + @param underlyingError The value of the @c NSUnderlyingErrorKey key. + @remarks This error is used when a network request was apparently successful, the body data was + successfully deserialized as JSON, but the data type of the response was unexpected. + */ ++ (NSError *)unexpectedResponseWithDeserializedResponse:(nullable id)deserializedResponse + underlyingError:(NSError *)underlyingError; + +/** @fn RPCResponseDecodingErrorWithDeserializedResponse:underlyingError: + @brief Constructs an @c NSError with the @c FIRAuthInternalErrorCodeRPCResponseDecodingError + code, and populated @c FIRAuthErrorUserInfoDeserializedResponseKey and + @c NSUnderlyingErrorKey keys in the @c NSError.userInfo dictionary. + @param deserializedResponse The value of the @c FIRAuthErrorUserInfoDeserializedResponseKey key. + @param underlyingError The value of the @c NSUnderlyingErrorKey key. + @remarks This error is used when an invocation of @c FIRAuthRPCResponse.setWithDictionary:error: + resulted in an error. + */ ++ (NSError *)RPCResponseDecodingErrorWithDeserializedResponse:(id)deserializedResponse + underlyingError:(NSError *)underlyingError; + +/** @fn emailAlreadyInUseErrorWithEmail: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeEmailExists code. + @param email The email address that is already in use. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)emailAlreadyInUseErrorWithEmail:(nullable NSString *)email; + +/** @fn userDisabledErrorWithMessageWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeUserDisabled code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)userDisabledErrorWithMessage:(nullable NSString *)message; + +/** @fn wrongPasswordErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeWrongPassword code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)wrongPasswordErrorWithMessage:(nullable NSString *)message; + +/** @fn tooManyRequestsErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeTooManyRequests Code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)tooManyRequestsErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidCustomTokenErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidCustomToken code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidCustomTokenErrorWithMessage:(nullable NSString *)message; + +/** @fn customTokenMistmatchErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeCustomTokenMismatch code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)customTokenMistmatchErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidCredentialErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidCredential code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidCredentialErrorWithMessage:(nullable NSString *)message; + +/** @fn requiresRecentLoginError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeRequiresRecentLogin code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)requiresRecentLoginErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidUserTokenErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidUserToken code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidUserTokenErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidEmailErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidEmail code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidEmailErrorWithMessage:(nullable NSString *)message; + +/** @fn accountExistsWithDifferentCredentialErrorWithEmail: + @brief Constructs an @c NSError with the @c FIRAuthErrorAccountExistsWithDifferentCredential + code. + @param email The email address that is already associated with an existing account + @param updatedCredential The updated credential for the existing account + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)accountExistsWithDifferentCredentialErrorWithEmail:(nullable NSString *)email + updatedCredential: + (nullable FIRAuthCredential *)updatedCredential; + +/** @fn providerAlreadyLinkedErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeProviderAlreadyLinked code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)providerAlreadyLinkedError; + +/** @fn noSuchProviderError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeNoSuchProvider code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)noSuchProviderError; + +/** @fn userTokenExpiredErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeUserTokenExpired code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)userTokenExpiredErrorWithMessage:(nullable NSString *)message; + +/** @fn userNotFoundErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeUserNotFound code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)userNotFoundErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidLocalAPIKeyErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidAPIKey code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidAPIKeyError; + +/** @fn userMismatchError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeUserMismatch code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)userMismatchError; + +/** @fn credentialAlreadyInUseErrorWithMessage:email: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeCredentialAlreadyInUse code. + @param message Error message from the backend, if any. + @param credential Auth credential to be added to the Error User Info dictionary. + @param email Email to be added to the Error User Info dictionary. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)credentialAlreadyInUseErrorWithMessage:(nullable NSString *)message + credential:(nullable FIRAuthCredential *)credential + email:(nullable NSString *)email; +/** @fn operationNotAllowedErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeOperationNotAllowed code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)operationNotAllowedErrorWithMessage:(nullable NSString *)message; + +/** @fn weakPasswordErrorWithServerResponseReason: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeWeakPassword code. + @param serverResponseReason A more detailed explanation string from server response. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)weakPasswordErrorWithServerResponseReason:(nullable NSString *)serverResponseReason; + +/** @fn appNotAuthorizedError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeAppNotAuthorized code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)appNotAuthorizedError; + +/** @fn expiredActionCodeErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeExpiredActionCode code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)expiredActionCodeErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidActionCodeErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidActionCode code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidActionCodeErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidMessagePayloadError: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidMessagePayload code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidMessagePayloadErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidSenderErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidSender code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidSenderErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidRecipientEmailError: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidRecipientEmail code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidRecipientEmailErrorWithMessage:(nullable NSString *)message; + +/** @fn missingIosBundleIDErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingIosBundleID code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingIosBundleIDErrorWithMessage:(nullable NSString *)message; + +/** @fn missingAndroidPackageNameErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingAndroidPackageName code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingAndroidPackageNameErrorWithMessage:(nullable NSString *)message; + +/** @fn unauthorizedDomainErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeUnauthorizedDomain code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)unauthorizedDomainErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidContinueURIErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidContinueURI code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidContinueURIErrorWithMessage:(nullable NSString *)message; + +/** @fn missingContinueURIErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingContinueURI code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingContinueURIErrorWithMessage:(nullable NSString *)message; + +/** @fn missingEmailErrorWithMessage + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingEmail code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingEmailErrorWithMessage:(nullable NSString *)message; + +/** @fn missingPhoneNumberErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingPhoneNumber code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingPhoneNumberErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidPhoneNumberErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidPhoneNumber code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidPhoneNumberErrorWithMessage:(nullable NSString *)message; + +/** @fn missingVerificationCodeErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingVerificationCode code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingVerificationCodeErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidVerificationCodeErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidVerificationCode code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidVerificationCodeErrorWithMessage:(nullable NSString *)message; + +/** @fn missingVerificationIDErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingVerificationID code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingVerificationIDErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidVerificationIDErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidVerificationID code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidVerificationIDErrorWithMessage:(nullable NSString *)message; + +/** @fn sessionExpiredErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeSessionExpired code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)sessionExpiredErrorWithMessage:(nullable NSString *)message; + +/** @fn missingAppCredentialWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorMissingCredential code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingAppCredentialWithMessage:(nullable NSString *)message; + +/** @fn invalidAppCredentialWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorInvalidCredential code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)invalidAppCredentialWithMessage:(nullable NSString *)message; + +/** @fn quotaExceededErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeQuotaExceeded code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)quotaExceededErrorWithMessage:(nullable NSString *)message; + +/** @fn missingAppTokenErrorWithUnderlyingError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingAppToken code. + @param underlyingError The underlying error, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingAppTokenErrorWithUnderlyingError:(nullable NSError *)underlyingError; + +/** @fn localPlayerNotAuthenticatedError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeLocalPlayerNotAuthenticated code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)localPlayerNotAuthenticatedError; + +/** @fn gameKitNotLinkedError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeGameKitNotLinked code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)gameKitNotLinkedError; + +/** @fn notificationNotForwardedError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeNotificationNotForwarded code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)notificationNotForwardedError; + +#if TARGET_OS_IOS +/** @fn secondFactorRequiredError + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeSecondFactorRequired code. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)secondFactorRequiredErrorWithPendingCredential:(NSString *)MFAPendingCredential + hints:(NSArray *) + multiFactorInfo; +#endif + +/** @fn appNotVerifiedErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeAppNotVerified code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)appNotVerifiedErrorWithMessage:(nullable NSString *)message; + +/** @fn missingClientIdentifierErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeMissingClientIdentifier code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)missingClientIdentifierErrorWithMessage:(nullable NSString *)message; + +/** @fn captchaCheckFailedErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCaptchaCheckFailed code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)captchaCheckFailedErrorWithMessage:(nullable NSString *)message; + +/** @fn webContextAlreadyPresentedErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeWebContextAlreadyPresented code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)webContextAlreadyPresentedErrorWithMessage:(nullable NSString *)message; + +/** @fn webContextCancelledErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeWebContextCancelled code. + @param message Error message from the backend, if any. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)webContextCancelledErrorWithMessage:(nullable NSString *)message; + +/** @fn appVerificationUserInteractionFailureWithReason: + @brief Constructs an @c NSError with the @c + FIRAuthErrorCodeAppVerificationUserInteractionFailure code. + @param reason Reason for error, returned via URL response. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)appVerificationUserInteractionFailureWithReason:(NSString *)reason; + +/** @fn webSignInUserInteractionFailureWithReason: + @brief Constructs an @c NSError with the @c + FIRAuthErrorCodeWebSignInUserInteractionFailure code. + @param reason Reason for error, returned via URL response. + @return The NSError instance associated with the given FIRAuthError. + */ ++ (NSError *)webSignInUserInteractionFailureWithReason:(nullable NSString *)reason; + +/** @fn URLResponseErrorWithCode:message: + @brief Constructs an @c NSError with the code and message provided. + @param message Error message from the backend, if any. + @return The nullable NSError instance associated with the given error message, if one is found. + */ ++ (nullable NSError *)URLResponseErrorWithCode:(NSString *)code + message:(nullable NSString *)message; + +/** @fn nullUserErrorWithMessage: + @brief Constructs an @c NSError with the code and message provided. + @param message Error message from the backend, if any. + @return The nullable NSError instance associated with the given error message, if one is found. + */ ++ (NSError *)nullUserErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidProviderIDErrorWithMessage: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeInvalidProviderID code. + @param message Error message from the backend, if any. + @remarks This error indicates that the provider id given for the web operation is invalid. + */ ++ (NSError *)invalidProviderIDErrorWithMessage:(nullable NSString *)message; + +/** @fn invalidDynamicLinkDomainErrorWithMessage: + @brief Constructs an @c NSError with the code and message provided. + @param message Error message from the backend, if any. + @return The nullable NSError instance associated with the given error message, if one is found. + */ ++ (NSError *)invalidDynamicLinkDomainErrorWithMessage:(nullable NSString *)message; + +/** @fn keychainErrorWithFunction:status: + @brief Constructs an @c NSError with the @c FIRAuthErrorCodeKeychainError code. + @param keychainFunction The keychain function which was invoked and yielded an unexpected + response. The @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo + dictionary will contain a string partially comprised of this value. + @param status The response status from the invoked keychain function. The + @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo dictionary will contain + a string partially comprised of this value. + */ ++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status; + +/** @fn missingOrInvalidNonceErrorWithMessage: + @brief Constructs an @c NSError with the code and message provided. + @param message Error message from the backend, if any. + @return The nullable NSError instance associated with the given error message, if one is found. +*/ ++ (NSError *)missingOrInvalidNonceErrorWithMessage:(nullable NSString *)message; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.m new file mode 100644 index 00000000..142c36b3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.m @@ -0,0 +1,1368 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +#import + +#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver+Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +NSString *const FIRAuthErrorDomain = @"FIRAuthErrorDomain"; + +NSString *const FIRAuthInternalErrorDomain = @"FIRAuthInternalErrorDomain"; + +NSString *const FIRAuthErrorUserInfoDeserializedResponseKey = + @"FIRAuthErrorUserInfoDeserializedResponseKey"; + +NSString *const FIRAuthErrorUserInfoDataKey = @"FIRAuthErrorUserInfoDataKey"; + +NSString *const FIRAuthErrorUserInfoEmailKey = @"FIRAuthErrorUserInfoEmailKey"; + +NSString *const FIRAuthErrorUserInfoUpdatedCredentialKey = + @"FIRAuthErrorUserInfoUpdatedCredentialKey"; + +NSString *const FIRAuthErrorUserInfoNameKey = @"FIRAuthErrorUserInfoNameKey"; + +NSString *const FIRAuthErrorUserInfoMultiFactorResolverKey = + @"FIRAuthErrorUserInfoMultiFactorResolverKey"; + +/** @var kServerErrorDetailMarker + @brief This marker indicates that the server error message contains a detail error message which + should be used instead of the hardcoded client error message. + */ +static NSString *const kServerErrorDetailMarker = @" : "; + +#pragma mark - URL response error codes + +/** @var kURLResponseErrorCodeInvalidClientID + @brief Error code that indicates that the client ID provided was invalid. + */ +static NSString *const kURLResponseErrorCodeInvalidClientID = @"auth/invalid-oauth-client-id"; + +/** @var kURLResponseErrorCodeNetworkRequestFailed + @brief Error code that indicates that a network request within the SFSafariViewController or + WKWebView failed. + */ +static NSString *const kURLResponseErrorCodeNetworkRequestFailed = @"auth/network-request-failed"; + +/** @var kURLResponseErrorCodeInternalError + @brief Error code that indicates that an internal error occurred within the + SFSafariViewController or WKWebView failed. + */ +static NSString *const kURLResponseErrorCodeInternalError = @"auth/internal-error"; + +#pragma mark - Standard Error Messages + +/** @var kFIRAuthErrorMessageInvalidCustomToken + @brief Message for @c FIRAuthErrorCodeInvalidCustomToken error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidCustomToken = + @"The custom token format is " + "incorrect. Please check the documentation."; + +/** @var kFIRAuthErrorMessageCustomTokenMismatch + @brief Message for @c FIRAuthErrorCodeCustomTokenMismatch error code. + */ +static NSString *const kFIRAuthErrorMessageCustomTokenMismatch = @"The custom token corresponds to " + "a different audience."; + +/** @var kFIRAuthErrorMessageInvalidEmail + @brief Message for @c FIRAuthErrorCodeInvalidEmail error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidEmail = @"The email address is badly formatted."; + +/** @var kFIRAuthErrorMessageInvalidCredential + @brief Message for @c FIRAuthErrorCodeInvalidCredential error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidCredential = @"The supplied auth credential is " + "malformed or has expired."; + +/** @var kFIRAuthErrorMessageUserDisabled + @brief Message for @c FIRAuthErrorCodeUserDisabled error code. + */ +static NSString *const kFIRAuthErrorMessageUserDisabled = @"The user account has been disabled by " + "an administrator."; + +/** @var kFIRAuthErrorMessageEmailAlreadyInUse + @brief Message for @c FIRAuthErrorCodeEmailAlreadyInUse error code. + */ +static NSString *const kFIRAuthErrorMessageEmailAlreadyInUse = @"The email address is already in " + "use by another account."; + +/** @var kFIRAuthErrorMessageWrongPassword + @brief Message for @c FIRAuthErrorCodeWrongPassword error code. + */ +static NSString *const kFIRAuthErrorMessageWrongPassword = @"The password is invalid or the user " + "does not have a password."; + +/** @var kFIRAuthErrorMessageTooManyRequests + @brief Message for @c FIRAuthErrorCodeTooManyRequests error code. + */ +static NSString *const kFIRAuthErrorMessageTooManyRequests = + @"We have blocked all requests from " + "this device due to unusual activity. Try again later."; + +/** @var kFIRAuthErrorMessageAccountExistsWithDifferentCredential + @brief Message for @c FIRAuthErrorCodeAccountExistsWithDifferentCredential error code. + */ +static NSString *const kFIRAuthErrorMessageAccountExistsWithDifferentCredential = + @"An account " + "already exists with the same email address but different sign-in credentials. Sign in using " + "a " + "provider associated with this email address."; + +/** @var kFIRAuthErrorMessageRequiresRecentLogin + @brief Message for @c FIRAuthErrorCodeRequiresRecentLogin error code. + */ +static NSString *const kFIRAuthErrorMessageRequiresRecentLogin = + @"This operation is sensitive and " + "requires recent authentication. Log in again before retrying this request."; + +/** @var kFIRAuthErrorMessageProviderAlreadyLinked + @brief Message for @c FIRAuthErrorCodeProviderAlreadyExists error code. + */ +static NSString *const kFIRAuthErrorMessageProviderAlreadyLinked = + @"[ERROR_PROVIDER_ALREADY_LINKED] - User can only be linked to one identity for the given " + "provider."; + +/** @var kFIRAuthErrorMessageNoSuchProvider + @brief Message for @c FIRAuthErrorCodeNoSuchProvider error code. + */ +static NSString *const kFIRAuthErrorMessageNoSuchProvider = @"User was not linked to an account " + "with the given provider."; + +/** @var kFIRAuthErrorMessageInvalidUserToken + @brief Message for @c FIRAuthErrorCodeInvalidUserToken error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidUserToken = + @"This user's credential isn't valid " + "for this project. This can happen if the user's token has been tampered with, or if the user " + "doesn’t belong to the project associated with the API key used in your request."; + +/** @var kFIRAuthErrorMessageNetworkError + @brief Message for @c FIRAuthErrorCodeNetworkError error code. + */ +static NSString *const kFIRAuthErrorMessageNetworkError = + @"Network error (such as timeout, " + "interrupted connection or unreachable host) has occurred."; + +/** @var kFIRAuthErrorMessageKeychainError + @brief Message for @c FIRAuthErrorCodeKeychainError error code. + */ +static NSString *const kFIRAuthErrorMessageKeychainError = + @"An error occurred when accessing the " + "keychain. The @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo " + "dictionary " + "will contain more information about the error encountered"; + +/** @var kFIRAuthErrorMessageMissingClientIdentifier + @brief Message for @c FIRAuthErrorCodeMissingClientIdentifier error code. + */ +static NSString *const kFIRAuthErrorMessageMissingClientIdentifier = + @"The request does not contain " + "any client identifier."; + +/** @var kFIRAuthErrorMessageUserTokenExpired + @brief Message for @c FIRAuthErrorCodeTokenExpired error code. + */ +static NSString *const kFIRAuthErrorMessageUserTokenExpired = + @"The user's credential is no longer " + "valid. The user must sign in again."; + +/** @var kFIRAuthErrorMessageUserNotFound + @brief Message for @c FIRAuthErrorCodeUserNotFound error code. + */ +static NSString *const kFIRAuthErrorMessageUserNotFound = + @"There is no user record corresponding " + "to this identifier. The user may have been deleted."; + +/** @var kFIRAuthErrorMessageInvalidAPIKey + @brief Message for @c FIRAuthErrorCodeInvalidAPIKey error code. + @remarks This error is not thrown by the server. + */ +static NSString *const kFIRAuthErrorMessageInvalidAPIKey = @"An invalid API Key was supplied in " + "the request."; + +/** @var kFIRAuthErrorMessageUserMismatch. + @brief Message for @c FIRAuthErrorCodeInvalidAPIKey error code. + */ +static NSString *const FIRAuthErrorMessageUserMismatch = + @"The supplied credentials do not " + "correspond to the previously signed in user."; + +/** @var kFIRAuthErrorMessageCredentialAlreadyInUse + @brief Message for @c FIRAuthErrorCodeCredentialAlreadyInUse error code. + */ +static NSString *const kFIRAuthErrorMessageCredentialAlreadyInUse = + @"This credential is already " + "associated with a different user account."; + +/** @var kFIRAuthErrorMessageOperationNotAllowed + @brief Message for @c FIRAuthErrorCodeOperationNotAllowed error code. + */ +static NSString *const kFIRAuthErrorMessageOperationNotAllowed = + @"The given sign-in provider is " + "disabled for this Firebase project. Enable it in the Firebase console, under the sign-in " + "method tab of the Auth section."; + +/** @var kFIRAuthErrorMessageWeakPassword + @brief Message for @c FIRAuthErrorCodeWeakPassword error code. + */ +static NSString *const kFIRAuthErrorMessageWeakPassword = @"The password must be 6 characters long " + "or more."; + +/** @var kFIRAuthErrorMessageAppNotAuthorized + @brief Message for @c FIRAuthErrorCodeAppNotAuthorized error code. + */ +static NSString *const kFIRAuthErrorMessageAppNotAuthorized = + @"This app is not authorized to use " + "Firebase Authentication with the provided API key. Review your key configuration in the " + "Google API console and ensure that it accepts requests from your app's bundle ID."; + +/** @var kFIRAuthErrorMessageExpiredActionCode + @brief Message for @c FIRAuthErrorCodeExpiredActionCode error code. + */ +static NSString *const kFIRAuthErrorMessageExpiredActionCode = @"The action code has expired."; + +/** @var kFIRAuthErrorMessageInvalidActionCode + @brief Message for @c FIRAuthErrorCodeInvalidActionCode error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidActionCode = + @"The action code is invalid. This " + "can happen if the code is malformed, expired, or has already been used."; + +/** @var kFIRAuthErrorMessageInvalidMessagePayload + @brief Message for @c FIRAuthErrorCodeInvalidMessagePayload error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidMessagePayload = + @"The action code is invalid. " + "This can happen if the code is malformed, expired, or has already been used."; + +/** @var kFIRAuthErrorMessageInvalidSender + @brief Message for @c FIRAuthErrorCodeInvalidSender error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidSender = + @"The email template corresponding to " + "this action contains invalid characters in its message. Please fix by going to the Auth " + "email " + "templates section in the Firebase Console."; + +/** @var kFIRAuthErrorMessageInvalidRecipientEmail + @brief Message for @c FIRAuthErrorCodeInvalidRecipient error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidRecipientEmail = + @"The action code is invalid. " + "This can happen if the code is malformed, expired, or has already been used."; + +/** @var kFIRAuthErrorMessageMissingIosBundleID + @brief Message for @c FIRAuthErrorCodeMissingIosbundleID error code. + */ +static NSString *const kFIRAuthErrorMessageMissingIosBundleID = + @"An iOS Bundle ID must be provided if an App Store ID is provided."; + +/** @var kFIRAuthErrorMessageMissingAndroidPackageName + @brief Message for @c FIRAuthErrorCodeMissingAndroidPackageName error code. + */ +static NSString *const kFIRAuthErrorMessageMissingAndroidPackageName = + @"An Android Package Name must be provided if the Android App is required to be installed."; + +/** @var kFIRAuthErrorMessageUnauthorizedDomain + @brief Message for @c FIRAuthErrorCodeUnauthorizedDomain error code. + */ +static NSString *const kFIRAuthErrorMessageUnauthorizedDomain = + @"The domain of the continue URL " + "is not whitelisted. Please whitelist the domain in the Firebase console."; + +/** @var kFIRAuthErrorMessageInvalidContinueURI + @brief Message for @c FIRAuthErrorCodeInvalidContinueURI error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidContinueURI = + @"The continue URL provided in the request is invalid."; + +/** @var kFIRAuthErrorMessageMissingEmail + @brief Message for @c FIRAuthErrorCodeMissingEmail error code. + */ +static NSString *const kFIRAuthErrorMessageMissingEmail = @"An email address must be provided."; + +/** @var kFIRAuthErrorMessageMissingContinueURI + @brief Message for @c FIRAuthErrorCodeMissingContinueURI error code. + */ +static NSString *const kFIRAuthErrorMessageMissingContinueURI = + @"A continue URL must be provided in the request."; + +/** @var kFIRAuthErrorMessageMissingPhoneNumber + @brief Message for @c FIRAuthErrorCodeMissingPhoneNumber error code. + */ +static NSString *const kFIRAuthErrorMessageMissingPhoneNumber = + @"To send verification codes, provide a phone number for the recipient."; + +/** @var kFIRAuthErrorMessageInvalidPhoneNumber + @brief Message for @c FIRAuthErrorCodeInvalidPhoneNumber error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidPhoneNumber = + @"The format of the phone number provided is incorrect. Please enter the phone number in a " + "format that can be parsed into E.164 format. E.164 phone numbers are written in the format " + "[+][country code][subscriber number including area code]."; + +/** @var kFIRAuthErrorMessageMissingVerificationCode + @brief Message for @c FIRAuthErrorCodeMissingVerificationCode error code. + */ +static NSString *const kFIRAuthErrorMessageMissingVerificationCode = + @"The phone auth credential was created with an empty SMS verification Code."; + +/** @var kFIRAuthErrorMessageInvalidVerificationCode + @brief Message for @c FIRAuthErrorCodeInvalidVerificationCode error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidVerificationCode = + @"The SMS verification code used to create the phone auth credential is invalid. Please resend " + "the verification code SMS and be sure to use the verification code provided by the user."; + +/** @var kFIRAuthErrorMessageMissingVerificationID + @brief Message for @c FIRAuthErrorCodeInvalidVerificationID error code. + */ +static NSString *const kFIRAuthErrorMessageMissingVerificationID = + @"The phone auth credential was created with an empty verification ID."; + +/** @var kFIRAuthErrorMessageInvalidVerificationID + @brief Message for @c FIRAuthErrorCodeInvalidVerificationID error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidVerificationID = + @"The verification ID used to create the phone auth credential is invalid."; + +/** @var kFIRAuthErrorMessageLocalPlayerNotAuthenticated + @brief Message for @c FIRAuthErrorCodeLocalPlayerNotAuthenticated error code. + */ +static NSString *const kFIRAuthErrorMessageLocalPlayerNotAuthenticated = + @"The local player is not authenticated. Please log the local player in to Game Center."; + +/** @var kFIRAuthErrorMessageGameKitNotLinked + @brief Message for @c kFIRAuthErrorMessageGameKitNotLinked error code. + */ +static NSString *const kFIRAuthErrorMessageGameKitNotLinked = + @"The GameKit framework is not linked. Please turn on the Game Center capability."; + +/** @var kFIRAuthErrorMessageSessionExpired + @brief Message for @c FIRAuthErrorCodeSessionExpired error code. + */ +static NSString *const kFIRAuthErrorMessageSessionExpired = + @"The SMS code has expired. Please " + @"re-send the verification code to try again."; + +/** @var kFIRAuthErrorMessageMissingAppCredential + @brief Message for @c FIRAuthErrorCodeMissingAppCredential error code. + */ +static NSString *const kFIRAuthErrorMessageMissingAppCredential = + @"The phone verification request " + "is missing an APNs Device token. Firebase Auth automatically detects APNs Device Tokens, " + "however, if method swizzling is disabled, the APNs token must be set via the APNSToken " + "property on FIRAuth or by calling setAPNSToken:type on FIRAuth."; + +/** @var kFIRAuthErrorMessageInvalidAppCredential + @brief Message for @c FIRAuthErrorCodeInvalidAppCredential error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidAppCredential = + @"The APNs device token provided " + "is either incorrect or does not match the private certificate uploaded to the Firebase " + "Console."; + +/** @var kFIRAuthErrorMessageQuotaExceeded + @brief Message for @c FIRAuthErrorCodeQuotaExceeded error code. + */ +static NSString *const kFIRAuthErrorMessageQuotaExceeded = @"The quota for this operation " + "has been exceeded."; + +/** @var kFIRAuthErrorMessageMissingAppToken + @brief Message for @c FIRAuthErrorCodeMissingAppToken error code. + */ +static NSString *const kFIRAuthErrorMessageMissingAppToken = + @"There seems to be a problem with " + "your project's Firebase phone number authentication set-up, please make sure to follow the " + "instructions found at https://firebase.google.com/docs/auth/ios/phone-auth"; + +/** @var kFIRAuthErrorMessageMissingAppToken + @brief Message for @c FIRAuthErrorCodeMissingAppToken error code. + */ +static NSString *const kFIRAuthErrorMessageNotificationNotForwarded = + @"If app delegate swizzling " + "is disabled, remote notifications received by UIApplicationDelegate need to be forwarded to " + "FIRAuth's canHandleNotificaton: method."; + +/** @var kFIRAuthErrorMessageAppNotVerified + @brief Message for @c FIRAuthErrorCodeMissingAppToken error code. + */ +static NSString *const kFIRAuthErrorMessageAppNotVerified = + @"Firebase could not retrieve the " + "silent push notification and therefore could not verify your app. Ensure that you configured " + "your app correctly to receive push notifications."; + +/** @var kFIRAuthErrorMessageCaptchaCheckFailed + @brief Message for @c FIRAuthErrorCodeCaptchaCheckFailed error code. + */ +static NSString *const kFIRAuthErrorMessageCaptchaCheckFailed = + @"The reCAPTCHA response token " + "provided is either invalid, expired or already"; + +/** @var kFIRAuthErrorMessageWebContextAlreadyPresented + @brief Message for @c FIRAuthErrorCodeWebContextAlreadyPresented error code. + */ +static NSString *const kFIRAuthErrorMessageWebContextAlreadyPresented = + @"User interaction is " + "still ongoing, another view cannot be presented."; + +/** @var kFIRAuthErrorMessageWebContextCancelled + @brief Message for @c FIRAuthErrorCodeWebContextCancelled error code. + */ +static NSString *const kFIRAuthErrorMessageWebContextCancelled = @"The interaction was cancelled " + "by the user."; + +/** @var kFIRAuthErrorMessageInvalidClientID + @brief Message for @c FIRAuthErrorCodeInvalidClientID error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidClientID = + @"The OAuth client ID provided is " + "either invalid or does not match the specified API key."; + +/** @var kFIRAuthErrorMessageWebRequestFailed + @brief Message for @c FIRAuthErrorCodeWebRequestFailed error code. + */ +static NSString *const kFIRAuthErrorMessageWebRequestFailed = + @"A network error (such as timeout, " + "interrupted connection, or unreachable host) has occurred within the web context."; + +/** @var kFIRAuthErrorMessageWebInternalError + @brief Message for @c FIRAuthErrorCodeWebInternalError error code. + */ +static NSString *const kFIRAuthErrorMessageWebInternalError = + @"An internal error has occurred " + "within the SFSafariViewController or WKWebView."; + +/** @var kFIRAuthErrorMessageAppVerificationUserInteractionFailure + @brief Message for @c FIRAuthErrorCodeInvalidClientID error code. + */ +static NSString *const kFIRAuthErrorMessageAppVerificationUserInteractionFailure = + @"The app " + "verification process has failed, print and inspect the error details for more information"; + +/** @var kFIRAuthErrorMessageNullUser + @brief Message for @c FIRAuthErrorCodeNullUser error code. + */ +static NSString *const kFIRAuthErrorMessageNullUser = + @"A null user object was provided as the " + "argument for an operation which requires a non-null user object."; + +/** @var kFIRAuthErrorMessageInvalidProviderID + @brief Message for @c FIRAuthErrorCodeInvalidProviderID error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidProviderID = + @"The provider ID provided for the " + "attempted web operation is invalid."; + +/** @var kFIRAuthErrorMessageInvalidDynamicLinkDomain + @brief Message for @c kFIRAuthErrorMessageInvalidDynamicLinkDomain error code. + */ +static NSString *const kFIRAuthErrorMessageInvalidDynamicLinkDomain = + @"The " + "Firebase Dynamic Link domain used is either not configured or is unauthorized " + "for the current project."; + +/** @var kFIRAuthErrorMessageInternalError + @brief Message for @c FIRAuthErrorCodeInternalError error code. + */ +static NSString *const kFIRAuthErrorMessageInternalError = + @"An internal error has occurred, " + "print and inspect the error details for more information."; + +/** @var kFIRAuthErrorMessageMalformedJWT + @brief Error message constant describing @c FIRAuthErrorCodeMalformedJWT errors. + */ +static NSString *const kFIRAuthErrorMessageMalformedJWT = + @"Failed to parse JWT. Check the userInfo dictionary for the full token."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const kFIRAuthErrorMessageSecondFactorRequired = + @"Please complete a second factor challenge to finish signing into this account."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageMissingMultiFactorSession = + @"The request is missing proof of first factor successful sign-in."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageMissingMultiFactorInfo = + @"No second factor identifier is provided."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageInvalidMultiFactorSession = + @"The request does not contain a valid proof of first factor successful sign-in."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageMultiFactorInfoNotFound = + @"The user does not have a second factor matching the identifier provided."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageAdminRestrictedOperation = + @"This operation is restricted to administrators only."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageUnverifiedEmail = + @"The operation requires a verified email."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageSecondFactorAlreadyEnrolled = + @"The second factor is already enrolled on this account."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageMaximumSecondFactorCountExceeded = + @"The maximum allowed number of second factors on a user has been exceeded."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageUnsupportedFirstFactor = + @"Enrolling a second factor or signing in with a multi-factor account requires sign-in with a " + @"supported first factor."; + +/** @var kFIRAuthErrorMessageSecondFactorRequired + @brief Message for @c kFIRAuthErrorMessageSecondFactorRequired error code. + */ +static NSString *const FIRAuthErrorMessageEmailChangeNeedsVerification = + @"Multi-factor users must always have a verified email."; + +/** @var kFIRAuthErrorMessageDynamicLinkNotActivated + @brief Error message constant describing @c FIRAuthErrorCodeDynamicLinkNotActivated errors. + */ +static NSString *const kFIRAuthErrorMessageDynamicLinkNotActivated = + @"Please activate Dynamic Links in the Firebase Console and agree to the terms and conditions."; + +/** @var kFIRAuthErrorMessageRejectedCredential + @brief Error message constant describing @c FIRAuthErrorCodeRejectedCredential errors. + */ +static NSString *const kFIRAuthErrorMessageRejectedCredential = + @"The request contains malformed or mismatching credentials."; + +/** @var kFIRAuthErrorMessageMissingOrInvalidNonce + @brief Error message constant describing @c FIRAuthErrorCodeMissingOrInvalidNonce errors. + */ +static NSString *const kFIRAuthErrorMessageMissingOrInvalidNonce = + @"The request contains malformed or mismatched credentials."; + +/** @var FIRAuthErrorDescription + @brief The error descrioption, based on the error code. + @remarks No default case so that we get a compiler warning if a new value was added to the enum. + */ +static NSString *FIRAuthErrorDescription(FIRAuthErrorCode code) { + switch (code) { + case FIRAuthErrorCodeInvalidCustomToken: + return kFIRAuthErrorMessageInvalidCustomToken; + case FIRAuthErrorCodeCustomTokenMismatch: + return kFIRAuthErrorMessageCustomTokenMismatch; + case FIRAuthErrorCodeInvalidEmail: + return kFIRAuthErrorMessageInvalidEmail; + case FIRAuthErrorCodeInvalidCredential: + return kFIRAuthErrorMessageInvalidCredential; + case FIRAuthErrorCodeUserDisabled: + return kFIRAuthErrorMessageUserDisabled; + case FIRAuthErrorCodeEmailAlreadyInUse: + return kFIRAuthErrorMessageEmailAlreadyInUse; + case FIRAuthErrorCodeWrongPassword: + return kFIRAuthErrorMessageWrongPassword; + case FIRAuthErrorCodeTooManyRequests: + return kFIRAuthErrorMessageTooManyRequests; + case FIRAuthErrorCodeAccountExistsWithDifferentCredential: + return kFIRAuthErrorMessageAccountExistsWithDifferentCredential; + case FIRAuthErrorCodeRequiresRecentLogin: + return kFIRAuthErrorMessageRequiresRecentLogin; + case FIRAuthErrorCodeProviderAlreadyLinked: + return kFIRAuthErrorMessageProviderAlreadyLinked; + case FIRAuthErrorCodeNoSuchProvider: + return kFIRAuthErrorMessageNoSuchProvider; + case FIRAuthErrorCodeInvalidUserToken: + return kFIRAuthErrorMessageInvalidUserToken; + case FIRAuthErrorCodeNetworkError: + return kFIRAuthErrorMessageNetworkError; + case FIRAuthErrorCodeKeychainError: + return kFIRAuthErrorMessageKeychainError; + case FIRAuthErrorCodeMissingClientIdentifier: + return kFIRAuthErrorMessageMissingClientIdentifier; + case FIRAuthErrorCodeUserTokenExpired: + return kFIRAuthErrorMessageUserTokenExpired; + case FIRAuthErrorCodeUserNotFound: + return kFIRAuthErrorMessageUserNotFound; + case FIRAuthErrorCodeInvalidAPIKey: + return kFIRAuthErrorMessageInvalidAPIKey; + case FIRAuthErrorCodeCredentialAlreadyInUse: + return kFIRAuthErrorMessageCredentialAlreadyInUse; + case FIRAuthErrorCodeInternalError: + return kFIRAuthErrorMessageInternalError; + case FIRAuthErrorCodeUserMismatch: + return FIRAuthErrorMessageUserMismatch; + case FIRAuthErrorCodeOperationNotAllowed: + return kFIRAuthErrorMessageOperationNotAllowed; + case FIRAuthErrorCodeWeakPassword: + return kFIRAuthErrorMessageWeakPassword; + case FIRAuthErrorCodeAppNotAuthorized: + return kFIRAuthErrorMessageAppNotAuthorized; + case FIRAuthErrorCodeExpiredActionCode: + return kFIRAuthErrorMessageExpiredActionCode; + case FIRAuthErrorCodeInvalidActionCode: + return kFIRAuthErrorMessageInvalidActionCode; + case FIRAuthErrorCodeInvalidSender: + return kFIRAuthErrorMessageInvalidSender; + case FIRAuthErrorCodeInvalidMessagePayload: + return kFIRAuthErrorMessageInvalidMessagePayload; + case FIRAuthErrorCodeInvalidRecipientEmail: + return kFIRAuthErrorMessageInvalidRecipientEmail; + case FIRAuthErrorCodeMissingIosBundleID: + return kFIRAuthErrorMessageMissingIosBundleID; + case FIRAuthErrorCodeMissingAndroidPackageName: + return kFIRAuthErrorMessageMissingAndroidPackageName; + case FIRAuthErrorCodeUnauthorizedDomain: + return kFIRAuthErrorMessageUnauthorizedDomain; + case FIRAuthErrorCodeInvalidContinueURI: + return kFIRAuthErrorMessageInvalidContinueURI; + case FIRAuthErrorCodeMissingContinueURI: + return kFIRAuthErrorMessageMissingContinueURI; + case FIRAuthErrorCodeMissingEmail: + return kFIRAuthErrorMessageMissingEmail; + case FIRAuthErrorCodeMissingPhoneNumber: + return kFIRAuthErrorMessageMissingPhoneNumber; + case FIRAuthErrorCodeInvalidPhoneNumber: + return kFIRAuthErrorMessageInvalidPhoneNumber; + case FIRAuthErrorCodeMissingVerificationCode: + return kFIRAuthErrorMessageMissingVerificationCode; + case FIRAuthErrorCodeInvalidVerificationCode: + return kFIRAuthErrorMessageInvalidVerificationCode; + case FIRAuthErrorCodeMissingVerificationID: + return kFIRAuthErrorMessageMissingVerificationID; + case FIRAuthErrorCodeInvalidVerificationID: + return kFIRAuthErrorMessageInvalidVerificationID; + case FIRAuthErrorCodeSessionExpired: + return kFIRAuthErrorMessageSessionExpired; + case FIRAuthErrorCodeMissingAppCredential: + return kFIRAuthErrorMessageMissingAppCredential; + case FIRAuthErrorCodeInvalidAppCredential: + return kFIRAuthErrorMessageInvalidAppCredential; + case FIRAuthErrorCodeQuotaExceeded: + return kFIRAuthErrorMessageQuotaExceeded; + case FIRAuthErrorCodeMissingAppToken: + return kFIRAuthErrorMessageMissingAppToken; + case FIRAuthErrorCodeNotificationNotForwarded: + return kFIRAuthErrorMessageNotificationNotForwarded; + case FIRAuthErrorCodeAppNotVerified: + return kFIRAuthErrorMessageAppNotVerified; + case FIRAuthErrorCodeCaptchaCheckFailed: + return kFIRAuthErrorMessageCaptchaCheckFailed; + case FIRAuthErrorCodeWebContextAlreadyPresented: + return kFIRAuthErrorMessageWebContextAlreadyPresented; + case FIRAuthErrorCodeWebContextCancelled: + return kFIRAuthErrorMessageWebContextCancelled; + case FIRAuthErrorCodeInvalidClientID: + return kFIRAuthErrorMessageInvalidClientID; + case FIRAuthErrorCodeAppVerificationUserInteractionFailure: + return kFIRAuthErrorMessageAppVerificationUserInteractionFailure; + case FIRAuthErrorCodeWebNetworkRequestFailed: + return kFIRAuthErrorMessageWebRequestFailed; + case FIRAuthErrorCodeNullUser: + return kFIRAuthErrorMessageNullUser; + case FIRAuthErrorCodeInvalidProviderID: + return kFIRAuthErrorMessageInvalidProviderID; + case FIRAuthErrorCodeInvalidDynamicLinkDomain: + return kFIRAuthErrorMessageInvalidDynamicLinkDomain; + case FIRAuthErrorCodeWebInternalError: + return kFIRAuthErrorMessageWebInternalError; + case FIRAuthErrorCodeWebSignInUserInteractionFailure: + return kFIRAuthErrorMessageAppVerificationUserInteractionFailure; + case FIRAuthErrorCodeMalformedJWT: + return kFIRAuthErrorMessageMalformedJWT; + case FIRAuthErrorCodeLocalPlayerNotAuthenticated: + return kFIRAuthErrorMessageLocalPlayerNotAuthenticated; + case FIRAuthErrorCodeGameKitNotLinked: + return kFIRAuthErrorMessageGameKitNotLinked; + case FIRAuthErrorCodeSecondFactorRequired: + return kFIRAuthErrorMessageSecondFactorRequired; + case FIRAuthErrorCodeMissingMultiFactorSession: + return FIRAuthErrorMessageMissingMultiFactorSession; + case FIRAuthErrorCodeMissingMultiFactorInfo: + return FIRAuthErrorMessageMissingMultiFactorInfo; + case FIRAuthErrorCodeInvalidMultiFactorSession: + return FIRAuthErrorMessageInvalidMultiFactorSession; + case FIRAuthErrorCodeMultiFactorInfoNotFound: + return FIRAuthErrorMessageMultiFactorInfoNotFound; + case FIRAuthErrorCodeAdminRestrictedOperation: + return FIRAuthErrorMessageAdminRestrictedOperation; + case FIRAuthErrorCodeUnverifiedEmail: + return FIRAuthErrorMessageUnverifiedEmail; + case FIRAuthErrorCodeSecondFactorAlreadyEnrolled: + return FIRAuthErrorMessageSecondFactorAlreadyEnrolled; + case FIRAuthErrorCodeMaximumSecondFactorCountExceeded: + return FIRAuthErrorMessageMaximumSecondFactorCountExceeded; + case FIRAuthErrorCodeUnsupportedFirstFactor: + return FIRAuthErrorMessageUnsupportedFirstFactor; + case FIRAuthErrorCodeEmailChangeNeedsVerification: + return FIRAuthErrorMessageEmailChangeNeedsVerification; + case FIRAuthErrorCodeDynamicLinkNotActivated: + return kFIRAuthErrorMessageDynamicLinkNotActivated; + case FIRAuthErrorCodeRejectedCredential: + return kFIRAuthErrorMessageRejectedCredential; + case FIRAuthErrorCodeMissingOrInvalidNonce: + return kFIRAuthErrorMessageMissingOrInvalidNonce; + } +} + +/** @var FIRAuthErrorCodeString + @brief The the error short string, based on the error code. + @remarks No default case so that we get a compiler warning if a new value was added to the enum. + */ +static NSString *const FIRAuthErrorCodeString(FIRAuthErrorCode code) { + switch (code) { + case FIRAuthErrorCodeInvalidCustomToken: + return @"ERROR_INVALID_CUSTOM_TOKEN"; + case FIRAuthErrorCodeCustomTokenMismatch: + return @"ERROR_CUSTOM_TOKEN_MISMATCH"; + case FIRAuthErrorCodeInvalidEmail: + return @"ERROR_INVALID_EMAIL"; + case FIRAuthErrorCodeInvalidCredential: + return @"ERROR_INVALID_CREDENTIAL"; + case FIRAuthErrorCodeUserDisabled: + return @"ERROR_USER_DISABLED"; + case FIRAuthErrorCodeEmailAlreadyInUse: + return @"ERROR_EMAIL_ALREADY_IN_USE"; + case FIRAuthErrorCodeWrongPassword: + return @"ERROR_WRONG_PASSWORD"; + case FIRAuthErrorCodeTooManyRequests: + return @"ERROR_TOO_MANY_REQUESTS"; + case FIRAuthErrorCodeAccountExistsWithDifferentCredential: + return @"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"; + case FIRAuthErrorCodeRequiresRecentLogin: + return @"ERROR_REQUIRES_RECENT_LOGIN"; + case FIRAuthErrorCodeProviderAlreadyLinked: + return @"ERROR_PROVIDER_ALREADY_LINKED"; + case FIRAuthErrorCodeNoSuchProvider: + return @"ERROR_NO_SUCH_PROVIDER"; + case FIRAuthErrorCodeInvalidUserToken: + return @"ERROR_INVALID_USER_TOKEN"; + case FIRAuthErrorCodeNetworkError: + return @"ERROR_NETWORK_REQUEST_FAILED"; + case FIRAuthErrorCodeKeychainError: + return @"ERROR_KEYCHAIN_ERROR"; + case FIRAuthErrorCodeMissingClientIdentifier: + return @"ERROR_MISSING_CLIENT_IDENTIFIER"; + case FIRAuthErrorCodeUserTokenExpired: + return @"ERROR_USER_TOKEN_EXPIRED"; + case FIRAuthErrorCodeUserNotFound: + return @"ERROR_USER_NOT_FOUND"; + case FIRAuthErrorCodeInvalidAPIKey: + return @"ERROR_INVALID_API_KEY"; + case FIRAuthErrorCodeCredentialAlreadyInUse: + return @"ERROR_CREDENTIAL_ALREADY_IN_USE"; + case FIRAuthErrorCodeInternalError: + return @"ERROR_INTERNAL_ERROR"; + case FIRAuthErrorCodeUserMismatch: + return @"ERROR_USER_MISMATCH"; + case FIRAuthErrorCodeOperationNotAllowed: + return @"ERROR_OPERATION_NOT_ALLOWED"; + case FIRAuthErrorCodeWeakPassword: + return @"ERROR_WEAK_PASSWORD"; + case FIRAuthErrorCodeAppNotAuthorized: + return @"ERROR_APP_NOT_AUTHORIZED"; + case FIRAuthErrorCodeExpiredActionCode: + return @"ERROR_EXPIRED_ACTION_CODE"; + case FIRAuthErrorCodeInvalidActionCode: + return @"ERROR_INVALID_ACTION_CODE"; + case FIRAuthErrorCodeInvalidMessagePayload: + return @"ERROR_INVALID_MESSAGE_PAYLOAD"; + case FIRAuthErrorCodeInvalidSender: + return @"ERROR_INVALID_SENDER"; + case FIRAuthErrorCodeInvalidRecipientEmail: + return @"ERROR_INVALID_RECIPIENT_EMAIL"; + case FIRAuthErrorCodeMissingIosBundleID: + return @"ERROR_MISSING_IOS_BUNDLE_ID"; + case FIRAuthErrorCodeMissingAndroidPackageName: + return @"ERROR_MISSING_ANDROID_PKG_NAME"; + case FIRAuthErrorCodeUnauthorizedDomain: + return @"ERROR_UNAUTHORIZED_DOMAIN"; + case FIRAuthErrorCodeInvalidContinueURI: + return @"ERROR_INVALID_CONTINUE_URI"; + case FIRAuthErrorCodeMissingContinueURI: + return @"ERROR_MISSING_CONTINUE_URI"; + case FIRAuthErrorCodeMissingEmail: + return @"ERROR_MISSING_EMAIL"; + case FIRAuthErrorCodeMissingPhoneNumber: + return @"ERROR_MISSING_PHONE_NUMBER"; + case FIRAuthErrorCodeInvalidPhoneNumber: + return @"ERROR_INVALID_PHONE_NUMBER"; + case FIRAuthErrorCodeMissingVerificationCode: + return @"ERROR_MISSING_VERIFICATION_CODE"; + case FIRAuthErrorCodeInvalidVerificationCode: + return @"ERROR_INVALID_VERIFICATION_CODE"; + case FIRAuthErrorCodeMissingVerificationID: + return @"ERROR_MISSING_VERIFICATION_ID"; + case FIRAuthErrorCodeInvalidVerificationID: + return @"ERROR_INVALID_VERIFICATION_ID"; + case FIRAuthErrorCodeSessionExpired: + return @"ERROR_SESSION_EXPIRED"; + case FIRAuthErrorCodeMissingAppCredential: + return @"MISSING_APP_CREDENTIAL"; + case FIRAuthErrorCodeInvalidAppCredential: + return @"INVALID_APP_CREDENTIAL"; + case FIRAuthErrorCodeQuotaExceeded: + return @"ERROR_QUOTA_EXCEEDED"; + case FIRAuthErrorCodeMissingAppToken: + return @"ERROR_MISSING_APP_TOKEN"; + case FIRAuthErrorCodeNotificationNotForwarded: + return @"ERROR_NOTIFICATION_NOT_FORWARDED"; + case FIRAuthErrorCodeAppNotVerified: + return @"ERROR_APP_NOT_VERIFIED"; + case FIRAuthErrorCodeCaptchaCheckFailed: + return @"ERROR_CAPTCHA_CHECK_FAILED"; + case FIRAuthErrorCodeWebContextAlreadyPresented: + return @"ERROR_WEB_CONTEXT_ALREADY_PRESENTED"; + case FIRAuthErrorCodeWebContextCancelled: + return @"ERROR_WEB_CONTEXT_CANCELLED"; + case FIRAuthErrorCodeInvalidClientID: + return @"ERROR_INVALID_CLIENT_ID"; + case FIRAuthErrorCodeAppVerificationUserInteractionFailure: + return @"ERROR_APP_VERIFICATION_FAILED"; + case FIRAuthErrorCodeWebNetworkRequestFailed: + return @"ERROR_WEB_NETWORK_REQUEST_FAILED"; + case FIRAuthErrorCodeNullUser: + return @"ERROR_NULL_USER"; + case FIRAuthErrorCodeInvalidProviderID: + return @"ERROR_INVALID_PROVIDER_ID"; + case FIRAuthErrorCodeInvalidDynamicLinkDomain: + return @"ERROR_INVALID_DYNAMIC_LINK_DOMAIN"; + case FIRAuthErrorCodeWebInternalError: + return @"ERROR_WEB_INTERNAL_ERROR"; + case FIRAuthErrorCodeWebSignInUserInteractionFailure: + return @"ERROR_WEB_USER_INTERACTION_FAILURE"; + case FIRAuthErrorCodeMalformedJWT: + return @"ERROR_MALFORMED_JWT"; + case FIRAuthErrorCodeLocalPlayerNotAuthenticated: + return @"ERROR_LOCAL_PLAYER_NOT_AUTHENTICATED"; + case FIRAuthErrorCodeGameKitNotLinked: + return @"ERROR_GAME_KIT_NOT_LINKED"; + case FIRAuthErrorCodeSecondFactorRequired: + return @"ERROR_SECOND_FACTOR_REQUIRED"; + case FIRAuthErrorCodeMissingMultiFactorSession: + return @"ERROR_MISSING_MULTI_FACTOR_SESSION"; + case FIRAuthErrorCodeMissingMultiFactorInfo: + return @"ERROR_MISSING_MULTI_FACTOR_INFO"; + case FIRAuthErrorCodeInvalidMultiFactorSession: + return @"ERROR_INVALID_MULTI_FACTOR_SESSION"; + case FIRAuthErrorCodeMultiFactorInfoNotFound: + return @"ERROR_MULTI_FACTOR_INFO_NOT_FOUND"; + case FIRAuthErrorCodeAdminRestrictedOperation: + return @"ERROR_ADMIN_RESTRICTED_OPERATION"; + case FIRAuthErrorCodeUnverifiedEmail: + return @"ERROR_UNVERIFIED_EMAIL"; + case FIRAuthErrorCodeSecondFactorAlreadyEnrolled: + return @"ERROR_SECOND_FACTOR_ALREADY_ENROLLED"; + case FIRAuthErrorCodeMaximumSecondFactorCountExceeded: + return @"ERROR_MAXIMUM_SECOND_FACTOR_COUNT_EXCEEDED"; + case FIRAuthErrorCodeUnsupportedFirstFactor: + return @"ERROR_UNSUPPORTED_FIRST_FACTOR"; + case FIRAuthErrorCodeEmailChangeNeedsVerification: + return @"ERROR_EMAIL_CHANGE_NEEDS_VERIFICATION"; + case FIRAuthErrorCodeDynamicLinkNotActivated: + return @"ERROR_DYNAMIC_LINK_NOT_ACTIVATED"; + case FIRAuthErrorCodeRejectedCredential: + return @"ERROR_REJECTED_CREDENTIAL"; + case FIRAuthErrorCodeMissingOrInvalidNonce: + return @"ERROR_MISSING_OR_INVALID_NONCE"; + } +} + +@implementation FIRAuthErrorUtils + ++ (NSError *)errorWithCode:(FIRAuthInternalErrorCode)code { + return [self errorWithCode:code message:nil]; +} + ++ (NSError *)errorWithCode:(FIRAuthInternalErrorCode)code message:(nullable NSString *)message { + NSDictionary *userInfo = nil; + if (message.length) { + userInfo = @{NSLocalizedDescriptionKey : message}; + } + return [self errorWithCode:code userInfo:userInfo]; +} + ++ (NSError *)errorWithCode:(FIRAuthInternalErrorCode)code + underlyingError:(nullable NSError *)underlyingError { + NSDictionary *errorUserInfo; + if (underlyingError) { + errorUserInfo = @{NSUnderlyingErrorKey : underlyingError}; + } + return [self errorWithCode:code userInfo:errorUserInfo]; +} + ++ (NSError *)errorWithCode:(FIRAuthInternalErrorCode)code + userInfo:(nullable NSDictionary *)userInfo { + BOOL isPublic = (code & FIRAuthPublicErrorCodeFlag) == FIRAuthPublicErrorCodeFlag; + if (isPublic) { + // This is a public error. Return it as a public error and add a description. + NSInteger errorCode = code & ~FIRAuthPublicErrorCodeFlag; + NSMutableDictionary *errorUserInfo = [NSMutableDictionary dictionary]; + if (userInfo) { + [errorUserInfo addEntriesFromDictionary:userInfo]; + } + if (!errorUserInfo[NSLocalizedDescriptionKey]) { + errorUserInfo[NSLocalizedDescriptionKey] = FIRAuthErrorDescription(errorCode); + } + errorUserInfo[FIRAuthErrorUserInfoNameKey] = FIRAuthErrorCodeString(errorCode); + return [NSError errorWithDomain:FIRAuthErrorDomain code:errorCode userInfo:errorUserInfo]; + } else { + // This is an internal error. Wrap it in an internal error. + NSError *error = [NSError errorWithDomain:FIRAuthInternalErrorDomain + code:code + userInfo:userInfo]; + return [self errorWithCode:FIRAuthInternalErrorCodeInternalError underlyingError:error]; + } +} + ++ (NSError *)RPCRequestEncodingErrorWithUnderlyingError:(NSError *)underlyingError { + return [self errorWithCode:FIRAuthInternalErrorCodeRPCRequestEncodingError + underlyingError:underlyingError]; +} + ++ (NSError *)JSONSerializationErrorForUnencodableType { + return [self errorWithCode:FIRAuthInternalErrorCodeJSONSerializationError]; +} + ++ (NSError *)JSONSerializationErrorWithUnderlyingError:(NSError *)underlyingError { + return [self errorWithCode:FIRAuthInternalErrorCodeJSONSerializationError + underlyingError:underlyingError]; +} + ++ (NSError *)networkErrorWithUnderlyingError:(NSError *)underlyingError { + return [self errorWithCode:FIRAuthInternalErrorCodeNetworkError underlyingError:underlyingError]; +} + ++ (NSError *)unexpectedErrorResponseWithData:(NSData *)data + underlyingError:(NSError *)underlyingError { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (data) { + userInfo[FIRAuthErrorUserInfoDataKey] = data; + } + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + return [self errorWithCode:FIRAuthInternalErrorCodeUnexpectedErrorResponse + userInfo:[userInfo copy]]; +} + ++ (NSError *)unexpectedErrorResponseWithDeserializedResponse:(id)deserializedResponse { + NSDictionary *userInfo; + if (deserializedResponse) { + userInfo = @{ + FIRAuthErrorUserInfoDeserializedResponseKey : deserializedResponse, + }; + } + return [self errorWithCode:FIRAuthInternalErrorCodeUnexpectedErrorResponse userInfo:userInfo]; +} + ++ (NSError *)malformedJWTErrorWithToken:(NSString *)token + underlyingError:(NSError *_Nullable)underlyingError { + NSMutableDictionary *userInfo = + [NSMutableDictionary dictionaryWithObject:kFIRAuthErrorMessageMalformedJWT + forKey:NSLocalizedDescriptionKey]; + [userInfo setObject:token forKey:FIRAuthErrorUserInfoDataKey]; + if (underlyingError != nil) { + [userInfo setObject:underlyingError forKey:NSUnderlyingErrorKey]; + } + return [self errorWithCode:FIRAuthInternalErrorCodeMalformedJWT userInfo:[userInfo copy]]; +} + ++ (NSError *)unexpectedResponseWithData:(NSData *)data underlyingError:(NSError *)underlyingError { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (data) { + userInfo[FIRAuthErrorUserInfoDataKey] = data; + } + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + return [self errorWithCode:FIRAuthInternalErrorCodeUnexpectedResponse userInfo:[userInfo copy]]; +} + ++ (NSError *)unexpectedResponseWithDeserializedResponse:(id)deserializedResponse { + NSDictionary *userInfo; + if (deserializedResponse) { + userInfo = @{ + FIRAuthErrorUserInfoDeserializedResponseKey : deserializedResponse, + }; + } + return [self errorWithCode:FIRAuthInternalErrorCodeUnexpectedResponse userInfo:userInfo]; +} + ++ (NSError *)unexpectedResponseWithDeserializedResponse:(nullable id)deserializedResponse + underlyingError:(NSError *)underlyingError { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (deserializedResponse) { + userInfo[FIRAuthErrorUserInfoDeserializedResponseKey] = deserializedResponse; + } + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + return [self errorWithCode:FIRAuthInternalErrorCodeUnexpectedResponse userInfo:[userInfo copy]]; +} + ++ (NSError *)RPCResponseDecodingErrorWithDeserializedResponse:(id)deserializedResponse + underlyingError:(NSError *)underlyingError { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (deserializedResponse) { + userInfo[FIRAuthErrorUserInfoDeserializedResponseKey] = deserializedResponse; + } + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + return [self errorWithCode:FIRAuthInternalErrorCodeRPCResponseDecodingError + userInfo:[userInfo copy]]; +} + ++ (NSError *)emailAlreadyInUseErrorWithEmail:(nullable NSString *)email { + NSDictionary *userInfo; + if (email.length) { + userInfo = @{ + FIRAuthErrorUserInfoEmailKey : email, + }; + } + return [self errorWithCode:FIRAuthInternalErrorCodeEmailAlreadyInUse userInfo:userInfo]; +} + ++ (NSError *)userDisabledErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeUserDisabled message:message]; +} + ++ (NSError *)wrongPasswordErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeWrongPassword message:message]; +} + ++ (NSError *)tooManyRequestsErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeTooManyRequests message:message]; +} + ++ (NSError *)invalidCustomTokenErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidCustomToken message:message]; +} + ++ (NSError *)customTokenMistmatchErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeCustomTokenMismatch message:message]; +} + ++ (NSError *)invalidCredentialErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidCredential message:message]; +} + ++ (NSError *)requiresRecentLoginErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeRequiresRecentLogin message:message]; +} + ++ (NSError *)invalidUserTokenErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidUserToken message:message]; +} + ++ (NSError *)invalidEmailErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidEmail message:message]; +} + ++ (NSError *)accountExistsWithDifferentCredentialErrorWithEmail:(nullable NSString *)email + updatedCredential: + (nullable FIRAuthCredential *)updatedCredential { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (email) { + userInfo[FIRAuthErrorUserInfoEmailKey] = email; + } + if (updatedCredential) { + userInfo[FIRAuthErrorUserInfoUpdatedCredentialKey] = updatedCredential; + } + return [self errorWithCode:FIRAuthInternalErrorCodeAccountExistsWithDifferentCredential + userInfo:userInfo]; +} + ++ (NSError *)providerAlreadyLinkedError { + return [self errorWithCode:FIRAuthInternalErrorCodeProviderAlreadyLinked]; +} + ++ (NSError *)noSuchProviderError { + return [self errorWithCode:FIRAuthInternalErrorCodeNoSuchProvider]; +} + ++ (NSError *)userTokenExpiredErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeUserTokenExpired message:message]; +} + ++ (NSError *)userNotFoundErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeUserNotFound message:message]; +} + ++ (NSError *)invalidAPIKeyError { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidAPIKey]; +} + ++ (NSError *)userMismatchError { + return [self errorWithCode:FIRAuthInternalErrorCodeUserMismatch]; +} + ++ (NSError *)credentialAlreadyInUseErrorWithMessage:(nullable NSString *)message + credential:(nullable FIRAuthCredential *)credential + email:(nullable NSString *)email { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (credential) { + userInfo[FIRAuthErrorUserInfoUpdatedCredentialKey] = credential; + } + if (email.length) { + userInfo[FIRAuthErrorUserInfoEmailKey] = email; + } + if (userInfo.count) { + return [self errorWithCode:FIRAuthInternalErrorCodeCredentialAlreadyInUse userInfo:userInfo]; + } + return [self errorWithCode:FIRAuthInternalErrorCodeCredentialAlreadyInUse message:message]; +} + ++ (NSError *)operationNotAllowedErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeOperationNotAllowed message:message]; +} + ++ (NSError *)weakPasswordErrorWithServerResponseReason:(nullable NSString *)reason { + NSDictionary *userInfo; + if (reason.length) { + userInfo = @{ + NSLocalizedFailureReasonErrorKey : reason, + }; + } + return [self errorWithCode:FIRAuthInternalErrorCodeWeakPassword userInfo:userInfo]; +} + ++ (NSError *)appNotAuthorizedError { + return [self errorWithCode:FIRAuthInternalErrorCodeAppNotAuthorized]; +} + ++ (NSError *)expiredActionCodeErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeExpiredActionCode message:message]; +} + ++ (NSError *)invalidActionCodeErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidActionCode message:message]; +} + ++ (NSError *)invalidMessagePayloadErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidMessagePayload message:message]; +} + ++ (NSError *)invalidSenderErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidSender message:message]; +} + ++ (NSError *)invalidRecipientEmailErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidRecipientEmail message:message]; +} + ++ (NSError *)missingIosBundleIDErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthinternalErrorCodeMissingIosBundleID message:message]; +} + ++ (NSError *)missingAndroidPackageNameErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingAndroidPackageName message:message]; +} + ++ (NSError *)unauthorizedDomainErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeUnauthorizedDomain message:message]; +} + ++ (NSError *)invalidContinueURIErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidContinueURI message:message]; +} + ++ (NSError *)missingContinueURIErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingContinueURI message:message]; +} + ++ (NSError *)missingEmailErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingEmail message:message]; +} + ++ (NSError *)missingPhoneNumberErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingPhoneNumber message:message]; +} + ++ (NSError *)invalidPhoneNumberErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidPhoneNumber message:message]; +} + ++ (NSError *)missingVerificationCodeErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingVerificationCode message:message]; +} + ++ (NSError *)invalidVerificationCodeErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidVerificationCode message:message]; +} + ++ (NSError *)missingVerificationIDErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingVerificationID message:message]; +} + ++ (NSError *)invalidVerificationIDErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidVerificationID message:message]; +} + ++ (NSError *)sessionExpiredErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeSessionExpired message:message]; +} + ++ (NSError *)missingAppCredentialWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingAppCredential message:message]; +} + ++ (NSError *)invalidAppCredentialWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidAppCredential message:message]; +} + ++ (NSError *)quotaExceededErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeQuotaExceeded message:message]; +} + ++ (NSError *)missingAppTokenErrorWithUnderlyingError:(nullable NSError *)underlyingError { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingAppToken + underlyingError:underlyingError]; +} + ++ (NSError *)localPlayerNotAuthenticatedError { + return [self errorWithCode:FIRAuthInternalErrorCodeLocalPlayerNotAuthenticated]; +} + ++ (NSError *)gameKitNotLinkedError { + return [self errorWithCode:FIRAuthInternalErrorCodeGameKitNotLinked]; +} + +#if TARGET_OS_IOS ++ (NSError *)secondFactorRequiredErrorWithPendingCredential:(NSString *)MFAPendingCredential + hints:(NSArray *)hints { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (MFAPendingCredential && hints) { + FIRMultiFactorResolver *resolver = + [[FIRMultiFactorResolver alloc] initWithMFAPendingCredential:MFAPendingCredential + hints:hints]; + userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey] = resolver; + } + return [self errorWithCode:FIRAuthInternalErrorCodeSecondFactorRequired userInfo:userInfo]; +} +#endif + ++ (NSError *)notificationNotForwardedError { + return [self errorWithCode:FIRAuthInternalErrorCodeNotificationNotForwarded]; +} + ++ (NSError *)appNotVerifiedErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeAppNotVerified message:message]; +} + ++ (NSError *)missingClientIdentifierErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingClientIdentifier message:message]; +} + ++ (NSError *)captchaCheckFailedErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeCaptchaCheckFailed message:message]; +} + ++ (NSError *)webContextAlreadyPresentedErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeWebContextAlreadyPresented message:message]; +} + ++ (NSError *)webContextCancelledErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeWebContextCancelled message:message]; +} + ++ (NSError *)appVerificationUserInteractionFailureWithReason:(NSString *)reason { + NSDictionary *userInfo; + if (reason.length) { + userInfo = @{ + NSLocalizedFailureReasonErrorKey : reason, + }; + } + return [self errorWithCode:FIRAuthInternalErrorCodeAppVerificationUserInteractionFailure + userInfo:userInfo]; +} + ++ (NSError *)webSignInUserInteractionFailureWithReason:(nullable NSString *)reason { + NSDictionary *userInfo; + if (reason.length) { + userInfo = @{ + NSLocalizedFailureReasonErrorKey : reason, + }; + } + return [self errorWithCode:FIRAuthInternalErrorCodeWebSignInUserInteractionFailure + userInfo:userInfo]; +} + ++ (nullable NSError *)URLResponseErrorWithCode:(NSString *)code + message:(nullable NSString *)message { + if ([code isEqualToString:kURLResponseErrorCodeInvalidClientID]) { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidClientID message:message]; + } + if ([code isEqualToString:kURLResponseErrorCodeNetworkRequestFailed]) { + return [self errorWithCode:FIRAuthInternalErrorCodeWebNetworkRequestFailed message:message]; + } + if ([code isEqualToString:kURLResponseErrorCodeInternalError]) { + return [self errorWithCode:FIRAuthInternalErrorCodeWebInternalError message:message]; + } + return nil; +} + ++ (NSError *)nullUserErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeNullUser message:message]; +} + ++ (NSError *)invalidProviderIDErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidProviderID message:message]; +} + ++ (NSError *)invalidDynamicLinkDomainErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeInvalidDynamicLinkDomain message:message]; +} + ++ (NSError *)missingOrInvalidNonceErrorWithMessage:(nullable NSString *)message { + return [self errorWithCode:FIRAuthInternalErrorCodeMissingOrInvalidNonce message:message]; +} + ++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status { + NSString *failureReason = [NSString stringWithFormat:@"%@ (%li)", keychainFunction, (long)status]; + return [self errorWithCode:FIRAuthInternalErrorCodeKeychainError + userInfo:@{ + NSLocalizedFailureReasonErrorKey : failureReason, + }]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h new file mode 100644 index 00000000..3ae9159d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthExceptionUtils + @brief Utility class used to raise standardized Auth related exceptions. +*/ +@interface FIRAuthExceptionUtils : NSObject + +/** @fn raiseInvalidParameterExceptionWithReason: + @brief raises the "invalid parameter" exception + @param reason string will contain a description of the error. + */ ++ (void)raiseInvalidParameterExceptionWithReason:(nullable NSString *)reason; + +/** @fn raiseMethodNotImplementedExceptionWithReason: + @brief raises the "method not implemented" exception + @param reason string will contain a description of the error. + @see FIRMethodNotImplementedException + */ ++ (void)raiseMethodNotImplementedExceptionWithReason:(nullable NSString *)reason; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.m new file mode 100644 index 00000000..783d4a41 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.m @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var FIRMethodNotImplementedException + @brief The name of the "Method Not Implemented" exception. + */ +static NSString *const FIRMethodNotImplementedException = @"FIRMethodNotImplementedException"; + +@implementation FIRAuthExceptionUtils + ++ (void)raiseInvalidParameterExceptionWithReason:(nullable NSString *)reason { + [NSException raise:NSInvalidArgumentException format:@"%@", reason]; +} + ++ (void)raiseMethodNotImplementedExceptionWithReason:(nullable NSString *)reason { + NSException *exception = [NSException exceptionWithName:FIRMethodNotImplementedException + reason:reason + userInfo:nil]; + [exception raise]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthInternalErrors.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthInternalErrors.h new file mode 100644 index 00000000..75415c61 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthInternalErrors.h @@ -0,0 +1,530 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @var FIRAuthPublicErrorCodeFlag + @brief Bitmask value indicating the error represents a public error code when this bit is + zeroed. Error codes which don't contain this flag will be wrapped in an @c NSError whose + code is @c FIRAuthErrorCodeInternalError. + */ +static const NSInteger FIRAuthPublicErrorCodeFlag = 1 << 20; + +/** @var FIRAuthInternalErrorDomain + @brief The Firebase Auth error domain for internal errors. + */ +extern NSString *const FIRAuthInternalErrorDomain; + +/** @var FIRAuthErrorUserInfoDeserializedResponseKey + @brief Errors with the code @c FIRAuthErrorCodeUnexpectedResponseError, + @c FIRAuthErrorCodeUnexpectedErrorResponseError, and + @c FIRAuthInternalErrorCodeRPCResponseDecodingError may contain an @c NSError.userInfo + dictionary which contains this key. The value associated with this key is an object of + unspecified contents containing the deserialized server response. + */ +extern NSString *const FIRAuthErrorUserInfoDeserializedResponseKey; + +/** @var FIRAuthErrorUserInfoDataKey + @brief Errors with the code @c FIRAuthErrorCodeUnexpectedResponseError or + @c FIRAuthErrorCodeUnexpectedErrorResponseError may contain an @c NSError.userInfo + dictionary which contains this key. The value associated with this key is an @c NSString + which represents the response from a server to an RPC which could not be deserialized. + */ +extern NSString *const FIRAuthErrorUserInfoDataKey; + +/** @var FIRAuthInternalErrorCode + @brief Error codes used internally by Firebase Auth. + @remarks All errors are generated using an internal error code. These errors are automatically + converted to the appropriate public version of the @c NSError by the methods in + @c FIRAuthErrorUtils + */ +typedef NS_ENUM(NSInteger, FIRAuthInternalErrorCode) { + /** @var FIRAuthInternalErrorCodeNetworkError + @brief Indicates a network error occurred (such as a timeout, interrupted connection, or + unreachable host.) + @remarks These types of errors are often recoverable with a retry. + + See the @c NSUnderlyingError value in the @c NSError.userInfo dictionary for details about + the network error which occurred. + */ + FIRAuthInternalErrorCodeNetworkError = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeNetworkError, + + /** @var FIRAuthInternalErrorCodeEmailAlreadyInUse + @brief The email used to attempt a sign-up already exists. + */ + FIRAuthInternalErrorCodeEmailAlreadyInUse = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeEmailAlreadyInUse, + + /** @var FIRAuthInternalErrorCodeUserDisabled + @brief Indicates the user's account is disabled on the server side. + */ + FIRAuthInternalErrorCodeUserDisabled = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeUserDisabled, + + /** @var FIRAuthInternalErrorCodeWrongPassword + @brief Indicates the user attempted sign in with a wrong password + */ + FIRAuthInternalErrorCodeWrongPassword = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeWrongPassword, + + /** @var FIRAuthInternalErrorCodeKeychainError + @brief Indicates an error occurred accessing the keychain. + @remarks The @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo dictionary + will contain more information about the error encountered. + */ + FIRAuthInternalErrorCodeKeychainError = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeKeychainError, + + /** @var FIRAuthInternalErrorCodeMissingClientIdentifier + @brief Indicates an error for when the client identifier is missing. + */ + FIRAuthInternalErrorCodeMissingClientIdentifier = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingClientIdentifier, + + /** @var FIRAuthInternalErrorCodeInternalError + @brief An internal error occurred. + @remarks This value is here for consistency. It's also used to make the implementation of + wrapping internal errors simpler. + */ + FIRAuthInternalErrorCodeInternalError = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInternalError, + + /** @var FIRAuthInternalErrorCodeTooManyRequests + @brief Indicates that too many requests were made to a server method. + */ + FIRAuthInternalErrorCodeTooManyRequests = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeTooManyRequests, + + /** @var FIRAuthInternalErrorCodeInvalidCustomToken + @brief Indicates a validation error with the custom token. + */ + FIRAuthInternalErrorCodeInvalidCustomToken = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidCustomToken, + + /** @var FIRAuthInternalErrorCodeCredentialMismatch + @brief Indicates the service account and the API key belong to different projects. + */ + FIRAuthInternalErrorCodeCustomTokenMismatch = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeCustomTokenMismatch, + + /** @var FIRAuthInternalErrorCodeInvalidCredential + @brief Indicates the IDP token or requestUri is invalid. + */ + FIRAuthInternalErrorCodeInvalidCredential = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidCredential, + + /** @var FIRAuthInternalErrorCodeRequiresRecentLogin + @brief Indicates the user has attemped to change email or password more than 5 minutes after + signing in. + */ + FIRAuthInternalErrorCodeRequiresRecentLogin = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeRequiresRecentLogin, + + /** @var FIRAuthInternalErrorCodeInvalidUserToken + @brief Indicates user's saved auth credential is invalid, the user needs to sign in again. + */ + FIRAuthInternalErrorCodeInvalidUserToken = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidUserToken, + + /** @var FIRAuthInternalErrorCodeInvalidEmail + @brief Indicates the email identifier is invalid. + */ + FIRAuthInternalErrorCodeInvalidEmail = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeInvalidEmail, + + /** @var FIRAuthInternalErrorCodeAccountExistsWithDifferentCredential + @brief Indicates account linking is needed. + */ + FIRAuthInternalErrorCodeAccountExistsWithDifferentCredential = + FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeAccountExistsWithDifferentCredential, + + /** @var FIRAuthInternalErrorCodeProviderAlreadyLinked + @brief Indicates an attempt to link a provider to which we are already linked. + */ + FIRAuthInternalErrorCodeProviderAlreadyLinked = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeProviderAlreadyLinked, + + /** @var FIRAuthInternalErrorCodeNoSuchProvider + @brief Indicates an attempt to unlink a provider that is not is not linked. + */ + FIRAuthInternalErrorCodeNoSuchProvider = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeNoSuchProvider, + + /** @var FIRAuthInternalErrorCodeUserTokenExpired + @brief Indicates the token issue time is older than account's valid_since time. + */ + FIRAuthInternalErrorCodeUserTokenExpired = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeUserTokenExpired, + + /** @var FIRAuthInternalErrorCodeUserNotFound + @brief Indicates the user account was been found. + */ + FIRAuthInternalErrorCodeUserNotFound = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeUserNotFound, + + /** @var FIRAuthInternalErrorCodeInvalidAPIKey + @brief Indicates an invalid API Key was supplied in the request. + */ + FIRAuthInternalErrorCodeInvalidAPIKey = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidAPIKey, + + /** @var FIRAuthInternalErrorCodeOperationNotAllowed + @brief Indicates that admin disabled sign-in with the specified IDP. + */ + FIRAuthInternalErrorCodeOperationNotAllowed = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeOperationNotAllowed, + + /** @var FIRAuthInternalErrorCodeUserMismatch + @brief Indicates that user attempted to reauthenticate with a user other than the current + user. + */ + FIRAuthInternalErrorCodeUserMismatch = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeUserMismatch, + + /** @var FIRAuthInternalErrorCodeCredentialAlreadyInUse + @brief Indicates an attempt to link with a credential that has already been linked with a + different Firebase account. + */ + FIRAuthInternalErrorCodeCredentialAlreadyInUse = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeCredentialAlreadyInUse, + + /** @var FIRAuthInternalErrorCodeWeakPassword + @brief Indicates an attempt to set a password that is considered too weak. + */ + FIRAuthInternalErrorCodeWeakPassword = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeWeakPassword, + + /** @var FIRAuthInternalErrorCodeAppNotAuthorized + @brief Indicates the App is not authorized to use Firebase Authentication with the + provided API Key. + */ + FIRAuthInternalErrorCodeAppNotAuthorized = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeAppNotAuthorized, + + /** @var FIRAuthInternalErrorCodeExpiredActionCode + @brief Indicates the OOB code is expired. + */ + FIRAuthInternalErrorCodeExpiredActionCode = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeExpiredActionCode, + + /** @var FIRAuthInternalErrorCodeInvalidActionCode + @brief Indicates the OOB code is invalid. + */ + FIRAuthInternalErrorCodeInvalidActionCode = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidActionCode, + + /** Indicates that there are invalid parameters in the payload during a "send password reset email + * " attempt. + */ + FIRAuthInternalErrorCodeInvalidMessagePayload = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidMessagePayload, + + /** Indicates that the sender email is invalid during a "send password reset email" attempt. + */ + FIRAuthInternalErrorCodeInvalidSender = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidSender, + + /** Indicates that the recipient email is invalid. + */ + FIRAuthInternalErrorCodeInvalidRecipientEmail = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidRecipientEmail, + + /** Indicates that the iOS bundle ID is missing when a iOS App Store ID is provided. + */ + FIRAuthinternalErrorCodeMissingIosBundleID = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingIosBundleID, + + /** Indicates that the android package name is missing when the @c androidInstallApp flag is set + to true. + */ + FIRAuthInternalErrorCodeMissingAndroidPackageName = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingAndroidPackageName, + + /** Indicates that the domain specified in the continue URL is not whitelisted in the Firebase + console. + */ + FIRAuthInternalErrorCodeUnauthorizedDomain = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeUnauthorizedDomain, + + /** Indicates that the domain specified in the continue URI is not valid. + */ + FIRAuthInternalErrorCodeInvalidContinueURI = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidContinueURI, + + /** Indicates that a continue URI was not provided in a request to the backend which requires + one. + */ + FIRAuthInternalErrorCodeMissingContinueURI = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingContinueURI, + + /** Indicates that an email address was expected but one was not provided. + */ + FIRAuthInternalErrorCodeMissingEmail = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeMissingEmail, + + /** Indicates that a phone number was not provided in a call to @c verifyPhoneNumber:completion:. + */ + FIRAuthInternalErrorCodeMissingPhoneNumber = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingPhoneNumber, + + /** Indicates that an invalid phone number was provided in a call to @c + verifyPhoneNumber:completion:. + */ + FIRAuthInternalErrorCodeInvalidPhoneNumber = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidPhoneNumber, + + /** Indicates that the phone auth credential was created with an empty verification code. + */ + FIRAuthInternalErrorCodeMissingVerificationCode = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingVerificationCode, + + /** Indicates that an invalid verification code was used in the verifyPhoneNumber request. + */ + FIRAuthInternalErrorCodeInvalidVerificationCode = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidVerificationCode, + + /** Indicates that the phone auth credential was created with an empty verification ID. + */ + FIRAuthInternalErrorCodeMissingVerificationID = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingVerificationID, + + /** Indicates that the APNS device token is missing in the verifyClient request. + */ + FIRAuthInternalErrorCodeMissingAppCredential = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingAppCredential, + + /** Indicates that an invalid APNS device token was used in the verifyClient request. + */ + FIRAuthInternalErrorCodeInvalidAppCredential = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidAppCredential, + + /** Indicates that the reCAPTCHA token is not valid. + */ + FIRAuthInternalErrorCodeCaptchaCheckFailed = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeCaptchaCheckFailed, + + /** Indicates that an invalid verification ID was used in the verifyPhoneNumber request. + */ + FIRAuthInternalErrorCodeInvalidVerificationID = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidVerificationID, + + /** Indicates that the quota of SMS messages for a given project has been exceeded. + */ + FIRAuthInternalErrorCodeQuotaExceeded = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeQuotaExceeded, + + /** Indicates that an attempt was made to present a new web context while one was already being + presented. + */ + FIRAuthInternalErrorCodeWebContextAlreadyPresented = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeWebContextAlreadyPresented, + + /** Indicates that the URL presentation was cancelled prematurely by the user. + */ + FIRAuthInternalErrorCodeWebContextCancelled = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeWebContextCancelled, + + /** Indicates a general failure during the app verification flow. + */ + FIRAuthInternalErrorCodeAppVerificationUserInteractionFailure = + FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeAppVerificationUserInteractionFailure, + + /** Indicates that the clientID used to invoke a web flow is invalid. + */ + FIRAuthInternalErrorCodeInvalidClientID = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidClientID, + + /** Indicates that a network request within a SFSafariViewController or WKWebView failed. + */ + FIRAuthInternalErrorCodeWebNetworkRequestFailed = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeWebNetworkRequestFailed, + + /** Indicates that an internal error occurred within a SFSafariViewController or WKWebView. + */ + FIRAuthInternalErrorCodeWebInternalError = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeWebInternalError, + + /** Indicates that an internal error occurred within a SFSafariViewController or WKWebView. + */ + FIRAuthInternalErrorCodeWebSignInUserInteractionFailure = + FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeWebSignInUserInteractionFailure, + + // The enum values between 17046 and 17051 are reserved and should NOT be used for new error + // codes. + + /** Indicates that the SMS code has expired + */ + FIRAuthInternalErrorCodeSessionExpired = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeSessionExpired, + + FIRAuthInternalErrorCodeMissingAppToken = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingAppToken, + + FIRAuthInternalErrorCodeNotificationNotForwarded = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeNotificationNotForwarded, + + FIRAuthInternalErrorCodeAppNotVerified = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeAppNotVerified, + + /** Indicates that the Game Center local player was not authenticated. + */ + FIRAuthInternalErrorCodeLocalPlayerNotAuthenticated = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeLocalPlayerNotAuthenticated, + + /** Indicates that the Game Center local player was not authenticated. + */ + FIRAuthInternalErrorCodeGameKitNotLinked = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeGameKitNotLinked, + + /** Indicates that the second factor is required for sign in. + */ + FIRAuthInternalErrorCodeSecondFactorRequired = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeSecondFactorRequired, + + /** Indicates that the multi factor session is missing. + */ + FIRAuthInternalErrorCodeMissingMultiFactorSession = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingMultiFactorSession, + + /** Indicates that the multi factor info is missing. + */ + FIRAuthInternalErrorCodeMissingMultiFactorInfo = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingMultiFactorInfo, + + /** Indicates that the multi factor session is invalid. + */ + FIRAuthInternalErrorCodeInvalidMultiFactorSession = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidMultiFactorSession, + + /** Indicates that the multi factor info is not found. + */ + FIRAuthInternalErrorCodeMultiFactorInfoNotFound = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMultiFactorInfoNotFound, + + /** Indicates that the operation is admin only. + */ + FIRAuthInternalErrorCodeAdminRestrictedOperation = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeAdminRestrictedOperation, + + /** Indicates that the email is unverified. + */ + FIRAuthInternalErrorCodeUnverifiedEmail = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeUnverifiedEmail, + + /** Indicates that the second factor is already enrolled. + */ + FIRAuthInternalErrorCodeSecondFactorAlreadyEnrolled = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeSecondFactorAlreadyEnrolled, + + /** Indicates that the number of multi factors reached the limit. + */ + FIRAuthInternalErrorCodeMaximumSecondFactorCountExceeded = + FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeMaximumSecondFactorCountExceeded, + + /** Indicates that the first factor is not supportted. + */ + FIRAuthInternalErrorCodeUnsupportedFirstFactor = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeUnsupportedFirstFactor, + + /** Indicates that the email needs to be verified before changed. + */ + FIRAuthInternalErrorCodeEmailChangeNeedsVerification = + FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeEmailChangeNeedsVerification, + + /** Indicates that the nonce is missing or invalid. + */ + FIRAuthInternalErrorCodeMissingOrInvalidNonce = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeMissingOrInvalidNonce, + + /** Indicates that a non-null user was expected as an argmument to the operation but a null + user was provided. + */ + FIRAuthInternalErrorCodeNullUser = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeNullUser, + + /** Indicates that the provider id given for the web operation is invalid. + */ + FIRAuthInternalErrorCodeInvalidProviderID = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidProviderID, + + /** Indicates that the Firebase Dynamic Link domain used is either not configured or is + unauthorized for the current project. + */ + FIRAuthInternalErrorCodeInvalidDynamicLinkDomain = FIRAuthPublicErrorCodeFlag | + FIRAuthErrorCodeInvalidDynamicLinkDomain, + + FIRAuthInternalErrorCodeMalformedJWT = FIRAuthPublicErrorCodeFlag | FIRAuthErrorCodeMalformedJWT, + + /** @var FIRAuthInternalErrorCodeRPCRequestEncodingError + @brief Indicates an error encoding the RPC request. + @remarks This is typically due to some sort of unexpected input value. + + See the @c NSUnderlyingError value in the @c NSError.userInfo dictionary for details. + */ + FIRAuthInternalErrorCodeRPCRequestEncodingError = 1, + + /** @var FIRAuthInternalErrorCodeJSONSerializationError + @brief Indicates an error serializing an RPC request. + @remarks This is typically due to some sort of unexpected input value. + + If an @c NSJSONSerialization.isValidJSONObject: check fails, the error will contain no + @c NSUnderlyingError key in the @c NSError.userInfo dictionary. If an error was + encountered calling @c NSJSONSerialization.dataWithJSONObject:options:error:, the + resulting error will be associated with the @c NSUnderlyingError key in the + @c NSError.userInfo dictionary. + */ + FIRAuthInternalErrorCodeJSONSerializationError = 2, + + /** @var FIRAuthInternalErrorCodeUnexpectedErrorResponse + @brief Indicates an HTTP error occurred and the data returned either couldn't be deserialized + or couldn't be decoded. + @remarks See the @c NSUnderlyingError value in the @c NSError.userInfo dictionary for details + about the HTTP error which occurred. + + If the response could be deserialized as JSON then the @c NSError.userInfo dictionary will + contain a value for the key @c FIRAuthErrorUserInfoDeserializedResponseKey which is the + deserialized response value. + + If the response could not be deserialized as JSON then the @c NSError.userInfo dictionary + will contain values for the @c NSUnderlyingErrorKey and @c FIRAuthErrorUserInfoDataKey + keys. + */ + FIRAuthInternalErrorCodeUnexpectedErrorResponse = 3, + + /** @var FIRAuthInternalErrorCodeUnexpectedResponse + @brief Indicates the HTTP response indicated the request was a successes, but the response + contains something other than a JSON-encoded dictionary, or the data type of the response + indicated it is different from the type of response we expected. + @remarks See the @c NSUnderlyingError value in the @c NSError.userInfo dictionary. + If this key is present in the dictionary, it may contain an error from + @c NSJSONSerialization error (indicating the response received was of the wrong data + type). + + See the @c FIRAuthErrorUserInfoDeserializedResponseKey value in the @c NSError.userInfo + dictionary. If the response could be deserialized, it's deserialized representation will + be associated with this key. If the @c NSUnderlyingError value in the @c NSError.userInfo + dictionary is @c nil, this indicates the JSON didn't represent a dictionary. + */ + FIRAuthInternalErrorCodeUnexpectedResponse = 4, + + /** @var FIRAuthInternalErrorCodeRPCResponseDecodingError + @brief Indicates an error decoding the RPC response. + This is typically due to some sort of unexpected response value from the server. + @remarks See the @c NSUnderlyingError value in the @c NSError.userInfo dictionary for details. + + See the @c FIRErrorUserInfoDecodedResponseKey value in the @c NSError.userInfo dictionary. + The deserialized representation of the response will be associated with this key. + */ + FIRAuthInternalErrorCodeRPCResponseDecodingError = 5, +}; + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.h new file mode 100644 index 00000000..f7b6b21c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.h @@ -0,0 +1,69 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol FIRAuthUIDelegate; + +/** @typedef FIRAuthURLPresentationCompletion + @brief The type of block invoked when the URLPresentation completes. + @param callbackURL The callback URL if the presentation ends with a matching callback. + @param error The error if the presentation fails to start or ends with an error. + */ +typedef void (^FIRAuthURLPresentationCompletion)(NSURL *_Nullable callbackURL, + NSError *_Nullable error); + +/** @typedef FIRAuthCallbackMatcher + @brief The type of block invoked for checking whether a callback URL matches. + @param callbackURL The callback URL to check for match. + @return Whether or not the specific callback URL matches or not. + */ +typedef BOOL (^FIRAuthURLCallbackMatcher)(NSURL *_Nullable callbackURL); + +/** @class FIRAuthURLPresenter + @brief A Class responsible for presenting URL via SFSafariViewController or WKWebView. + */ +@interface FIRAuthURLPresenter : NSObject + +/** @fn presentURL:UIDelegate:callbackMatcher:completion: + @brief Presents an URL to interact with user. + @param URL The URL to present. + @param UIDelegate The UI delegate to present view controller. + @param completion A block to be called either synchronously if the presentation fails to start, + or asynchronously in future on an unspecified thread once the presentation finishes. + */ +- (void)presentURL:(NSURL *)URL + UIDelegate:(nullable id)UIDelegate + callbackMatcher:(FIRAuthURLCallbackMatcher)callbackMatcher + completion:(FIRAuthURLPresentationCompletion)completion; + +/** @fn canHandleURL: + @brief Determines if a URL was produced by the currently presented URL. + @param URL The URL to handle. + @return Whether the URL could be handled or not. + */ +- (BOOL)canHandleURL:(NSURL *)URL; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.m new file mode 100644 index 00000000..5765f368 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.m @@ -0,0 +1,193 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import +#import + +#import "FirebaseAuth/Sources/Auth/FIRAuthGlobalWorkQueue.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthDefaultUIDelegate.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthURLPresenter.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthURLPresenter () +@end + +// Disable unguarded availability warnings because SFSafariViewController is been used throughout +// the code, including as an iVar, which cannot be simply excluded by @available check. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + +@implementation FIRAuthURLPresenter { + /** @var _isPresenting + @brief Whether or not some web-based content is being presented. + */ + BOOL _isPresenting; + + /** @var _callbackMatcher + @brief The callback URL matcher for the current presentation, if one is active. + */ + FIRAuthURLCallbackMatcher _Nullable _callbackMatcher; + + /** @var _safariViewController + @brief The SFSafariViewController used for the current presentation, if any. + */ + SFSafariViewController *_Nullable _safariViewController; + + /** @var _webViewController + @brief The FIRAuthWebViewController used for the current presentation, if any. + */ + FIRAuthWebViewController *_Nullable _webViewController; + + /** @var _UIDelegate + @brief The UIDelegate used to present the SFSafariViewController. + */ + id _UIDelegate; + + /** @var _completion + @brief The completion handler for the current presentaion, if one is active. + @remarks This variable is also used as a flag to indicate a presentation is active. + */ + FIRAuthURLPresentationCompletion _Nullable _completion; +} + +- (void)presentURL:(NSURL *)URL + UIDelegate:(nullable id)UIDelegate + callbackMatcher:(FIRAuthURLCallbackMatcher)callbackMatcher + completion:(FIRAuthURLPresentationCompletion)completion { + if (_isPresenting) { + // Unable to start a new presentation on top of another. + _completion(nil, [FIRAuthErrorUtils webContextAlreadyPresentedErrorWithMessage:nil]); + return; + } + _isPresenting = YES; + _callbackMatcher = callbackMatcher; + _completion = completion; + dispatch_async(dispatch_get_main_queue(), ^() { + self->_UIDelegate = UIDelegate ?: [FIRAuthDefaultUIDelegate defaultUIDelegate]; + if ([SFSafariViewController class]) { + self->_safariViewController = [[SFSafariViewController alloc] initWithURL:URL]; + self->_safariViewController.delegate = self; + [self->_UIDelegate presentViewController:self->_safariViewController + animated:YES + completion:nil]; + return; + } else { + self->_webViewController = [[FIRAuthWebViewController alloc] initWithURL:URL delegate:self]; + UINavigationController *navController = + [[UINavigationController alloc] initWithRootViewController:self->_webViewController]; + [self->_UIDelegate presentViewController:navController animated:YES completion:nil]; + } + }); +} + +- (BOOL)canHandleURL:(NSURL *)URL { + if (_isPresenting && _callbackMatcher && _callbackMatcher(URL)) { + [self finishPresentationWithURL:URL error:nil]; + return YES; + } + return NO; +} + +#pragma mark - SFSafariViewControllerDelegate + +- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller { + dispatch_async(FIRAuthGlobalWorkQueue(), ^() { + if (controller == self->_safariViewController) { + self->_safariViewController = nil; + // TODO:Ensure that the SFSafariViewController is actually removed from the screen before + // invoking finishPresentationWithURL:error: + [self finishPresentationWithURL:nil + error:[FIRAuthErrorUtils webContextCancelledErrorWithMessage:nil]]; + } + }); +} + +#pragma mark - FIRAuthwebViewControllerDelegate + +- (BOOL)webViewController:(FIRAuthWebViewController *)webViewController canHandleURL:(NSURL *)URL { + __block BOOL result = NO; + dispatch_sync(FIRAuthGlobalWorkQueue(), ^() { + if (webViewController == self->_webViewController) { + result = [self canHandleURL:URL]; + } + }); + return result; +} + +- (void)webViewControllerDidCancel:(FIRAuthWebViewController *)webViewController { + dispatch_async(FIRAuthGlobalWorkQueue(), ^() { + if (webViewController == self->_webViewController) { + [self finishPresentationWithURL:nil + error:[FIRAuthErrorUtils webContextCancelledErrorWithMessage:nil]]; + } + }); +} + +- (void)webViewController:(FIRAuthWebViewController *)webViewController + didFailWithError:(NSError *)error { + dispatch_async(FIRAuthGlobalWorkQueue(), ^() { + if (webViewController == self->_webViewController) { + [self finishPresentationWithURL:nil error:error]; + } + }); +} + +#pragma mark - Private methods + +/** @fn finishPresentationWithURL:error: + @brief Finishes the presentation for a given URL, if any. + @param URL The URL to finish presenting. + @param error The error with which to finish presenting, if any. + */ +- (void)finishPresentationWithURL:(nullable NSURL *)URL error:(nullable NSError *)error { + _callbackMatcher = nil; + id UIDelegate = _UIDelegate; + _UIDelegate = nil; + FIRAuthURLPresentationCompletion completion = _completion; + _completion = nil; + void (^finishBlock)(void) = ^() { + self->_isPresenting = NO; + completion(URL, error); + }; + SFSafariViewController *safariViewController = _safariViewController; + _safariViewController = nil; + FIRAuthWebViewController *webViewController = _webViewController; + _webViewController = nil; + if (safariViewController || webViewController) { + dispatch_async(dispatch_get_main_queue(), ^() { + [UIDelegate dismissViewControllerAnimated:YES + completion:^() { + dispatch_async(FIRAuthGlobalWorkQueue(), finishBlock); + }]; + }); + } else { + finishBlock(); + } +} + +#pragma clang diagnostic pop // ignored "-Wunguarded-availability" + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h new file mode 100644 index 00000000..7a3d080b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h @@ -0,0 +1,102 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRAuthRequestConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRFetchAuthDomainCallback + @brief The callback invoked at the end of the flow to fetch the Auth domain. + @param authDomain The Auth domain. + @param error The error that occurred while fetching the auth domain, if any. + */ +typedef void (^FIRFetchAuthDomainCallback)(NSString *_Nullable authDomain, + NSError *_Nullable error); + +/** @class FIRAuthURLUtils + @brief A utility class used to facilitate the creation of auth related URLs. + */ +@interface FIRAuthWebUtils : NSObject + +/** @fn randomStringWithLength: + @brief Generates a random string of a specified length. + */ ++ (NSString *)randomStringWithLength:(NSUInteger)length; + +/** @fn isCallbackSchemeRegisteredForCustomURLScheme: + @brief Checks whether or not the provided custom URL scheme has been registered by the app. + @param URLScheme The custom URL scheme to be checked against all custom URL schemes registered + by the app. + @return whether or not the provided custom URL scheme has been registered by the app. + */ ++ (BOOL)isCallbackSchemeRegisteredForCustomURLScheme:(NSString *)URLScheme; + +/** @fn isExpectedCallbackURL:eventID:authType + @brief Parses a URL into all available query items. + @param URL The actual callback URL. + @param eventID The expected event ID. + @param authType The expected auth type. + @param callbackScheme The expected callback custom scheme. + @return Whether or not the actual callback URL matches the expected callback URL. + */ ++ (BOOL)isExpectedCallbackURL:(nullable NSURL *)URL + eventID:(NSString *)eventID + authType:(NSString *)authType + callbackScheme:(NSString *)callbackScheme; + +/** @fn fetchAuthDomainWithCompletion:completion: + @brief Fetches the auth domain associated with the Firebase Project. + @param completion The callback invoked after the auth domain has been constructed or an error + has been encountered. + */ ++ (void)fetchAuthDomainWithRequestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + completion:(FIRFetchAuthDomainCallback)completion; + +/** @fn queryItemValue:from: + @brief Utility function to get a value from a NSURLQueryItem array. + @param name The key. + @param queryList The NSURLQueryItem array. + @return The value for the key. + */ + ++ (nullable NSString *)queryItemValue:(NSString *)name from:(NSArray *)queryList; + +/** @fn dictionaryWithHttpArgumentsString: + @brief Utility function to get a dictionary from a http argument string. + @param argString The http argument string. + @return The resulting dictionary of query arguments. + */ ++ (NSDictionary *)dictionaryWithHttpArgumentsString:(NSString *)argString; + +/** @fn stringByUnescapingFromURLArgument:from: + @brief Utility function to get a string by unescapting URL arguments. + @param argument The argument string. + @return The resulting string after unescaping URL argument. + */ ++ (NSString *)stringByUnescapingFromURLArgument:(NSString *)argument; + +/** @fn parseURL: + @brief Parses an incoming URL into all available query items. + @param urlString The url to be parsed. + @return A dictionary of available query items in the target URL. + */ ++ (NSDictionary *)parseURL:(NSString *)urlString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.m new file mode 100644 index 00000000..f117bb18 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.m @@ -0,0 +1,205 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebUtils.h" + +#import "FirebaseAuth/Sources/Backend/FIRAuthBackend.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigRequest.h" +#import "FirebaseAuth/Sources/Backend/RPC/FIRGetProjectConfigResponse.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthWebUtils + ++ (NSArray *)supportedAuthDomains { + return @[ @"firebaseapp.com", @"web.app" ]; +} + ++ (NSString *)randomStringWithLength:(NSUInteger)length { + NSMutableString *randomString = [[NSMutableString alloc] init]; + for (int i = 0; i < length; i++) { + [randomString + appendString:[NSString stringWithFormat:@"%c", 'a' + arc4random_uniform('z' - 'a' + 1)]]; + } + return randomString; +} + ++ (BOOL)isCallbackSchemeRegisteredForCustomURLScheme:(NSString *)URLScheme { + NSString *expectedCustomScheme = [URLScheme lowercaseString]; + NSArray *urlTypes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"]; + for (NSDictionary *urlType in urlTypes) { + NSArray *urlTypeSchemes = urlType[@"CFBundleURLSchemes"]; + for (NSString *urlTypeScheme in urlTypeSchemes) { + if ([urlTypeScheme.lowercaseString isEqualToString:expectedCustomScheme]) { + return YES; + } + } + } + return NO; +} + ++ (BOOL)isExpectedCallbackURL:(nullable NSURL *)URL + eventID:(NSString *)eventID + authType:(NSString *)authType + callbackScheme:(NSString *)callbackScheme { + if (!URL) { + return NO; + } + NSURLComponents *actualURLComponents = [NSURLComponents componentsWithURL:URL + resolvingAgainstBaseURL:NO]; + actualURLComponents.query = nil; + actualURLComponents.fragment = nil; + + NSURLComponents *expectedURLComponents = [[NSURLComponents alloc] init]; + expectedURLComponents.scheme = callbackScheme; + expectedURLComponents.host = @"firebaseauth"; + expectedURLComponents.path = @"/link"; + + if (![expectedURLComponents.URL isEqual:actualURLComponents.URL]) { + return NO; + } + NSDictionary *URLQueryItems = + [self dictionaryWithHttpArgumentsString:URL.query]; + NSURL *deeplinkURL = [NSURL URLWithString:URLQueryItems[@"deep_link_id"]]; + NSDictionary *deeplinkQueryItems = + [self dictionaryWithHttpArgumentsString:deeplinkURL.query]; + if ([deeplinkQueryItems[@"authType"] isEqualToString:authType] && + [deeplinkQueryItems[@"eventId"] isEqualToString:eventID]) { + return YES; + } + return NO; +} + ++ (void)fetchAuthDomainWithRequestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration + completion:(FIRFetchAuthDomainCallback)completion { + FIRGetProjectConfigRequest *request = + [[FIRGetProjectConfigRequest alloc] initWithRequestConfiguration:requestConfiguration]; + + [FIRAuthBackend + getProjectConfig:request + callback:^(FIRGetProjectConfigResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + completion(nil, error); + return; + } + // Look up an authorized domain ends with one of the supportedAuthDomains. + // The sequence of supportedAuthDomains matters. ("firebaseapp.com", "web.app") + // The searching ends once the first valid suportedAuthDomain is found. + NSString *authDomain; + for (NSString *domain in response.authorizedDomains) { + for (NSString *suportedAuthDomain in [self supportedAuthDomains]) { + NSInteger index = domain.length - suportedAuthDomain.length; + if (index >= 2) { + if ([domain hasSuffix:suportedAuthDomain] && + domain.length >= suportedAuthDomain.length + 2) { + authDomain = domain; + break; + } + } + } + if (authDomain != nil) { + break; + } + } + if (!authDomain.length) { + completion(nil, [FIRAuthErrorUtils + unexpectedErrorResponseWithDeserializedResponse:response]); + return; + } + completion(authDomain, nil); + }]; +} + +/** @fn queryItemValue:from: + @brief Utility function to get a value from a NSURLQueryItem array. + @param name The key. + @param queryList The NSURLQueryItem array. + @return The value for the key. + */ ++ (nullable NSString *)queryItemValue:(NSString *)name from:(NSArray *)queryList { + for (NSURLQueryItem *item in queryList) { + if ([item.name isEqualToString:name]) { + return item.value; + } + } + return nil; +} + ++ (NSDictionary *)dictionaryWithHttpArgumentsString:(NSString *)argString { + NSMutableDictionary *ret = [NSMutableDictionary dictionary]; + NSArray *components = [argString componentsSeparatedByString:@"&"]; + NSString *component; + // Use reverse order so that the first occurrence of a key replaces + // those subsequent. + for (component in [components reverseObjectEnumerator]) { + if (component.length == 0) continue; + NSRange pos = [component rangeOfString:@"="]; + NSString *key; + NSString *val; + if (pos.location == NSNotFound) { + key = [self stringByUnescapingFromURLArgument:component]; + val = @""; + } else { + key = [self stringByUnescapingFromURLArgument:[component substringToIndex:pos.location]]; + val = [self stringByUnescapingFromURLArgument:[component substringFromIndex:pos.location + + pos.length]]; + } + // returns nil on invalid UTF8 and NSMutableDictionary raises an exception when passed nil + // values. + if (!key) key = @""; + if (!val) val = @""; + [ret setObject:val forKey:key]; + } + return ret; +} + ++ (NSString *)stringByUnescapingFromURLArgument:(NSString *)argument { + NSMutableString *resultString = [NSMutableString stringWithString:argument]; + [resultString replaceOccurrencesOfString:@"+" + withString:@" " + options:NSLiteralSearch + range:NSMakeRange(0, [resultString length])]; + return [resultString stringByRemovingPercentEncoding]; +} + ++ (NSDictionary *)parseURL:(NSString *)urlString { + NSString *linkURL = [NSURLComponents componentsWithString:urlString].query; + if (!linkURL) { + return @{}; + } + NSArray *URLComponents = [linkURL componentsSeparatedByString:@"&"]; + NSMutableDictionary *queryItems = + [[NSMutableDictionary alloc] initWithCapacity:URLComponents.count]; + for (NSString *component in URLComponents) { + NSRange equalRange = [component rangeOfString:@"="]; + if (equalRange.location != NSNotFound) { + NSString *queryItemKey = + [[component substringToIndex:equalRange.location] stringByRemovingPercentEncoding]; + NSString *queryItemValue = + [[component substringFromIndex:equalRange.location + 1] stringByRemovingPercentEncoding]; + if (queryItemKey && queryItemValue) { + queryItems[queryItemKey] = queryItemValue; + } + } + } + return queryItems; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebView.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebView.h new file mode 100644 index 00000000..bd50309b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebView.h @@ -0,0 +1,44 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FIRAuthWebView + @brief A class reponsible for creating a WKWebView for use within Firebase Auth. + */ +@interface FIRAuthWebView : UIView + +/** @property webView + * @brief The web view. + */ +@property(nonatomic, weak) WKWebView *webView; + +/** @property spinner + * @brief The spinner that indicates web view loading. + */ +@property(nonatomic, weak) UIActivityIndicatorView *spinner; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebView.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebView.m new file mode 100644 index 00000000..6807dbff --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebView.m @@ -0,0 +1,104 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebView.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRAuthWebView + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + self.backgroundColor = [UIColor whiteColor]; + [self initializeSubviews]; + } + return self; +} + +/** @fn initializeSubviews + @brief Initializes the subviews of this view. + */ +- (void)initializeSubviews { + WKWebView *webView = [self createWebView]; + UIActivityIndicatorView *spinner = [self createSpinner]; + + // The order of the following controls z-order. + [self addSubview:webView]; + [self addSubview:spinner]; + + [self layoutSubviews]; + _webView = webView; + _spinner = spinner; +} + +- (void)layoutSubviews { + CGFloat height = self.bounds.size.height; + CGFloat width = self.bounds.size.width; + _webView.frame = CGRectMake(0, 0, width, height); + _spinner.center = _webView.center; +} + +/** @fn createWebView + @brief Creates a web view to be used by this view. + @return The newly created web view. + */ +- (WKWebView *)createWebView { + WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero]; + // Trickery to make the web view not do weird things (like showing a black background when + // the prompt in the navigation bar animates changes.) + webView.opaque = NO; + webView.backgroundColor = [UIColor clearColor]; + webView.scrollView.opaque = NO; + webView.scrollView.backgroundColor = [UIColor clearColor]; + webView.scrollView.bounces = NO; + webView.scrollView.alwaysBounceVertical = NO; + webView.scrollView.alwaysBounceHorizontal = NO; + return webView; +} + +/** @fn createSpinner + @brief Creates a spinner to be used by this view. + @return The newly created spinner. + */ +- (UIActivityIndicatorView *)createSpinner { + UIActivityIndicatorViewStyle spinnerStyle; +#if defined(TARGET_OS_MACCATALYST) + if (@available(iOS 13.0, *)) { + spinnerStyle = UIActivityIndicatorViewStyleMedium; + } else { +// iOS 13 deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + spinnerStyle = UIActivityIndicatorViewStyleGray; +#pragma clang diagnostic pop + } +#else + spinnerStyle = UIActivityIndicatorViewStyleGray; +#endif + UIActivityIndicatorView *spinner = + [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:spinnerStyle]; + return spinner; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.h new file mode 100644 index 00000000..8c75b467 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.h @@ -0,0 +1,78 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import + +@class FIRAuthWebViewController; + +NS_ASSUME_NONNULL_BEGIN + +/** @protocol FIRAuthWebViewControllerDelegate + @brief Defines a delegate for FIRAuthWebViewController + */ +@protocol FIRAuthWebViewControllerDelegate + +/** @fn webViewController:canHandleURL: + @brief Determines if a URL should be handled by the delegate. + @param URL The URL to handle. + @return Whether the URL could be handled or not. + */ +- (BOOL)webViewController:(FIRAuthWebViewController *)webViewController canHandleURL:(NSURL *)URL; + +/** @fn webViewControllerDidCancel: + @brief Notifies the delegate that the web view controller is being cancelled by the user. + @param webViewController The web view controller in question. + */ +- (void)webViewControllerDidCancel:(FIRAuthWebViewController *)webViewController; + +/** @fn webViewController:didFailWithError: + @brief Notifies the delegate that the web view controller failed to load a page. + @param webViewController The web view controller in question. + @param error The error that has occurred. + */ +- (void)webViewController:(FIRAuthWebViewController *)webViewController + didFailWithError:(NSError *)error; + +@end + +/** @class FIRAuthWebViewController + @brief Reponsible for creating a UIViewController for presenting a FIRAutWebView. + */ +@interface FIRAuthWebViewController : UIViewController + +/** @fn initWithNibName:bundle: + * @brief Please call initWithURL:delegate: + */ +- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil + bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE; + +/** @fn initWithCoder: + * @brief Please call initWithURL:delegate: + */ +- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE; + +- (instancetype)initWithURL:(NSURL *)URL + delegate:(__weak id)delegate + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.m new file mode 100644 index 00000000..65d67a65 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.m @@ -0,0 +1,118 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#if TARGET_OS_IOS + +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebView.h" +#import "FirebaseAuth/Sources/Utilities/FIRAuthWebViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRAuthWebViewController () +@end + +@implementation FIRAuthWebViewController { + /** @var _URL + @brief The initial URL to display. + */ + NSURL *_URL; + + /** @var _delegate + @brief The delegate to call. + */ + __weak id _delegate; + + /** @var _webView; + @brief The web view instance for easier access. + */ + __weak FIRAuthWebView *_webView; +} + +- (instancetype)initWithURL:(NSURL *)URL + delegate:(__weak id)delegate { + self = [super initWithNibName:nil bundle:nil]; + if (self) { + _URL = URL; + _delegate = delegate; + } + return self; +} + +#pragma mark - Lifecycle + +- (void)loadView { + FIRAuthWebView *webView = [[FIRAuthWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; + webView.webView.navigationDelegate = self; + self.view = webView; + _webView = webView; + self.navigationItem.leftBarButtonItem = + [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel + target:self + action:@selector(cancel)]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + // Loads the requested URL in the web view. + [_webView.webView loadRequest:[NSURLRequest requestWithURL:_URL]]; +} + +#pragma mark - UI Targets + +- (void)cancel { + [_delegate webViewControllerDidCancel:self]; +} + +#pragma mark - WKNavigationDelegate + +- (void)webView:(WKWebView *)webView + decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction + decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { + [_delegate webViewController:self canHandleURL:navigationAction.request.URL]; + decisionHandler(WKNavigationActionPolicyAllow); +} + +- (void)webView:(WKWebView *)webView + didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation { + _webView.spinner.hidden = NO; + [_webView.spinner startAnimating]; +} + +- (void)webView:(WKWebView *)webView + didFinishNavigation:(null_unspecified WKNavigation *)navigation { + _webView.spinner.hidden = YES; + [_webView.spinner stopAnimating]; +} + +- (void)webView:(WKWebView *)webView + didFailNavigation:(null_unspecified WKNavigation *)navigation + withError:(NSError *)error { + if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) { + // It's okay for the page to be redirected before it is completely loaded. See b/32028062 . + return; + } + // Forward notification to our delegate. + [self webView:webView didFinishNavigation:navigation]; + [_delegate webViewController:self didFailWithError:error]; +} + +@end + +NS_ASSUME_NONNULL_END + +#endif diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/NSData+FIRBase64.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/NSData+FIRBase64.h new file mode 100644 index 00000000..114cbfd9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/NSData+FIRBase64.h @@ -0,0 +1,31 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSData (FIRBase64) + +/** @fn fir_base64URLEncodedStringWithOptions: + @brief Get a web safe base64 encoded string + @param options The base64 encoding options + */ +- (NSString *)fir_base64URLEncodedStringWithOptions:(NSDataBase64EncodingOptions)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/NSData+FIRBase64.m b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/NSData+FIRBase64.m new file mode 100644 index 00000000..0afc53b8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseAuth/Sources/Utilities/NSData+FIRBase64.m @@ -0,0 +1,33 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseAuth/Sources/Utilities/NSData+FIRBase64.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation NSData (FIRBase64) + +- (NSString *)fir_base64URLEncodedStringWithOptions:(NSDataBase64EncodingOptions)options { + NSString *string = [self base64EncodedStringWithOptions:options]; + string = [string stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; + string = [string stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; + string = [string stringByReplacingOccurrencesOfString:@"=" withString:@""]; + return string; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRAppInternal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRAppInternal.h new file mode 100644 index 00000000..9a0c943d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRAppInternal.h @@ -0,0 +1,173 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRApp.h" +#else +#import +#endif + +// The has_include is a workaround so the old IID needed for the FIS tests can find FIRErrors.h +#if __has_include("FirebaseCore/Sources/Private/FIRErrors.h") +#import "FirebaseCore/Sources/Private/FIRErrors.h" +#else +#import +#endif + +@class FIRComponentContainer; +@protocol FIRLibrary; + +/** + * The internal interface to FIRApp. This is meant for first-party integrators, who need to receive + * FIRApp notifications, log info about the success or failure of their configuration, and access + * other internal functionality of FIRApp. + * + * TODO(b/28296561): Restructure this header. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; + +/** + * The format string for the User Defaults key used for storing the data collection enabled flag. + * This includes formatting to append the Firebase App's name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** + * A notification fired containing diagnostic information when SDK errors occur. + */ +extern NSString *const kFIRAppDiagnosticsNotification; + +/** @var FIRAuthStateDidChangeInternalNotification + @brief The name of the @c NSNotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FIRAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FIRAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FIRAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FIRApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FIRAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/* + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * Creates an error for failing to configure a subspec service. This method is called by each + * FIRApp notification listener. + */ ++ (NSError *)errorForSubspecConfigurationFailureWithDomain:(NSString *)domain + errorCode:(FIRErrorCode)code + service:(NSString *)service + reason:(NSString *)reason; +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Used by each SDK to send logs about SDK configuration status to Clearcut. + * + * @note This API is a no-op, please remove calls to it. + */ +- (void)sendLogsWithServiceName:(NSString *)serviceName + version:(NSString *)version + error:(NSError *)error; + +/** + * Can be used by the unit tests in eack SDK to reset FIRApp. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponent.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponent.h new file mode 100644 index 00000000..cb51ee70 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponent.h @@ -0,0 +1,91 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +@class FIRDependency; + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the Component. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// An array of dependencies for the component. +@property(nonatomic, copy, readonly) NSArray *dependencies; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param dependencies - Any dependencies the `implementingClass` has, optional or required. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:dependencies:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponentContainer.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponentContainer.h new file mode 100644 index 00000000..db2bafef --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponentContainer.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponentType.h") +#import "FirebaseCore/Sources/Private/FIRComponentType.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#else +#import +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant:` call. These classes should conform to `FIRComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Unavailable. Use the `container` property on `FIRApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponentType.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponentType.h new file mode 100644 index 00000000..6f2aca7b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRComponentType.h @@ -0,0 +1,34 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (T)instanceForProtocol:(Protocol *)protocol inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h new file mode 100644 index 00000000..76c0c05f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRDiagnosticsData; +@class FIROptions; + +NS_ASSUME_NONNULL_BEGIN + +/** Connects FIRCore with the CoreDiagnostics library. */ +@interface FIRCoreDiagnosticsConnector : NSObject + +/** Logs FirebaseCore related data. + * + * @param options The options object containing data to log. + */ ++ (void)logCoreTelemetryWithOptions:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRDependency.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRDependency.h new file mode 100644 index 00000000..46e9b7ea --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRDependency.h @@ -0,0 +1,45 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A dependency on a specific protocol's functionality. +NS_SWIFT_NAME(Dependency) +@interface FIRDependency : NSObject + +/// The protocol describing functionality being depended on. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// A flag to specify if the dependency is required or not. +@property(nonatomic, readonly) BOOL isRequired; + +/// Initializes a dependency that is required. Calls `initWithProtocol:isRequired` with `YES` for +/// the required parameter. +/// Creates a required dependency on the specified protocol's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol; + +/// Creates a dependency on the specified protocol's functionality and specify if it's required for +/// the class's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol isRequired:(BOOL)required; + +/// Use `dependencyWithProtocol:isRequired:` instead. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRErrorCode.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRErrorCode.h new file mode 100644 index 00000000..c90d9eec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRErrorCode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** Error codes in Firebase error domain. */ +typedef NS_ENUM(NSInteger, FIRErrorCode) { + /** + * Unknown error. + */ + FIRErrorCodeUnknown = 0, + /** + * Loading data from the GoogleService-Info.plist file failed. This is a fatal error and should + * not be ignored. Further calls to the API will fail and/or possibly cause crashes. + */ + FIRErrorCodeInvalidPlistFile = -100, + + /** + * Validating the Google App ID format failed. + */ + FIRErrorCodeInvalidAppID = -101, + + /** + * Error code for failing to configure a specific service. It's deprecated, but + * still used after copybara. + */ + FIRErrorCodeConfigFailed = -114, +}; diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRErrors.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRErrors.h new file mode 100644 index 00000000..19e47328 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRErrors.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#include "FIRErrorCode.h" + +extern NSString *const kFirebaseErrorDomain; +extern NSString *const kFirebaseConfigErrorDomain; +extern NSString *const kFirebaseCoreErrorDomain; +extern NSString *const kFirebasePerfErrorDomain; diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h new file mode 100644 index 00000000..bfff73e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h @@ -0,0 +1,39 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRHeartbeatInfo : NSObject + +// Enum representing the different heartbeat codes. +typedef NS_ENUM(NSInteger, FIRHeartbeatInfoCode) { + FIRHeartbeatInfoCodeNone = 0, + FIRHeartbeatInfoCodeSDK = 1, + FIRHeartbeatInfoCodeGlobal = 2, + FIRHeartbeatInfoCodeCombined = 3, +}; + +/** + * Get heartbeat code requred for the sdk. + * @param heartbeatTag String representing the sdk heartbeat tag. + * @return Heartbeat code indicating whether or not an sdk/global heartbeat + * needs to be sent + */ ++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRLibrary.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRLibrary.h new file mode 100644 index 00000000..e7a9e077 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRLibrary.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponent.h") +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#else +#import +#endif + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more FIRComponents that will be registered in +/// FIRApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@optional +/// Implement this method if the library needs notifications for lifecycle events. This method is +/// called when the developer calls `FirebaseApp.configure()`. ++ (void)configureWithApp:(FIRApp *)app; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRLogger.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRLogger.h new file mode 100644 index 00000000..6fd77844 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIRLogger.h @@ -0,0 +1,156 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRLoggerLevel.h" +#else +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern FIRLoggerService kFIRLoggerABTesting; +extern FIRLoggerService kFIRLoggerAdMob; +extern FIRLoggerService kFIRLoggerAnalytics; +extern FIRLoggerService kFIRLoggerAuth; +extern FIRLoggerService kFIRLoggerCrash; +extern FIRLoggerService kFIRLoggerCore; +extern FIRLoggerService kFIRLoggerMLKit; +extern FIRLoggerService kFIRLoggerPerf; +extern FIRLoggerService kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to YES, the logging level for Analytics will be set to FIRLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Changes the default logging level of FIRLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FIRLoggerLevelNotice if the app is running from App Store. + * (required) log level (one of the FIRLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FIRLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + FIRLoggerService service, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FIRLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +@interface FIRLoggerWrapper : NSObject + +/** + * Objective-C wrapper for FIRLogBasic to allow weak linking to FIRLogger + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ + ++ (void)logWithLevel:(FIRLoggerLevel)level + withService:(FIRLoggerService)service + withCode:(NSString *)messageCode + withMessage:(NSString *)message + withArgs:(va_list)args; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIROptionsInternal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIROptionsInternal.h new file mode 100644 index 00000000..acaf4586 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FIROptionsInternal.h @@ -0,0 +1,119 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIROptions.h" +#else +#import +#endif + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * This header file exposes the initialization of FIROptions to internal use. + */ +@interface FIROptions () + +/** + * resetDefaultOptions and initInternalWithOptionsDictionary: are exposed only for unit tests. + */ ++ (void)resetDefaultOptions; + +/** + * Initializes the options with dictionary. The above strings are the keys of the dictionary. + * This is the designated initializer. + */ +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)serviceInfoDictionary; + +/** + * defaultOptions and defaultOptionsDictionary are exposed in order to be used in FIRApp and + * other first party services. + */ ++ (FIROptions *)defaultOptions; + ++ (NSDictionary *)defaultOptionsDictionary; + +/** + * Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at + * runtime. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet; + +/** + * Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless + * explicitly disabled in GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionEnabled; + +/** + * Whether or not Analytics Collection was completely disabled. If YES, then + * isAnalyticsCollectionEnabled will be NO. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionDeactivated; + +/** + * The version ID of the client library, e.g. @"1100000". + */ +@property(nonatomic, readonly, copy) NSString *libraryVersionID; + +/** + * The flag indicating whether this object was constructed with the values in the default plist + * file. + */ +@property(nonatomic) BOOL usingOptionsFromDefaultPlist; + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isMeasurementEnabled; + +/** + * Whether or not Analytics was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isAnalyticsEnabled; + +/** + * Whether or not SignIn was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isSignInEnabled; + +/** + * Whether or not editing is locked. This should occur after FIROptions has been set on a FIRApp. + */ +@property(nonatomic, getter=isEditingLocked) BOOL editingLocked; + +@end diff --git a/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FirebaseCoreInternal.h b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FirebaseCoreInternal.h new file mode 100644 index 00000000..93af6cb8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/FirebaseCore/Sources/Private/FirebaseCoreInternal.h @@ -0,0 +1,31 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An umbrella header, for any other libraries in this repo to access Firebase Public and Private +// headers. Any package manager complexity should be handled here. + +#if SWIFT_PACKAGE +@import FirebaseCore; +#else +#import +#endif + +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" +#import "FirebaseCore/Sources/Private/FIRDependency.h" +#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" diff --git a/MyExperiences copy/Pods/FirebaseAuth/Interop/Auth/Public/FIRAuthInterop.h b/MyExperiences copy/Pods/FirebaseAuth/Interop/Auth/Public/FIRAuthInterop.h new file mode 100644 index 00000000..a33da7c9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/Interop/Auth/Public/FIRAuthInterop.h @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRAuthInterop_h +#define FIRAuthInterop_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRTokenCallback + @brief The type of block which gets called when a token is ready. + */ +typedef void (^FIRTokenCallback)(NSString *_Nullable token, NSError *_Nullable error) + NS_SWIFT_NAME(TokenCallback); + +/// Common methods for Auth interoperability. +NS_SWIFT_NAME(AuthInterop) +@protocol FIRAuthInterop + +/// Retrieves the Firebase authentication token, possibly refreshing it if it has expired. +- (void)getTokenForcingRefresh:(BOOL)forceRefresh withCallback:(FIRTokenCallback)callback; + +/// Get the current Auth user's UID. Returns nil if there is no user signed in. +- (nullable NSString *)getUserID; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRAuthInterop_h */ diff --git a/MyExperiences copy/Pods/FirebaseAuth/LICENSE b/MyExperiences copy/Pods/FirebaseAuth/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/FirebaseAuth/README.md b/MyExperiences copy/Pods/FirebaseAuth/README.md new file mode 100644 index 00000000..d778205f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseAuth/README.md @@ -0,0 +1,311 @@ +[![Version](https://img.shields.io/cocoapods/v/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) + +[![Actions Status][gh-abtesting-badge]][gh-actions] +[![Actions Status][gh-auth-badge]][gh-actions] +[![Actions Status][gh-core-badge]][gh-actions] +[![Actions Status][gh-crashlytics-badge]][gh-actions] +[![Actions Status][gh-database-badge]][gh-actions] +[![Actions Status][gh-datatransport-badge]][gh-actions] +[![Actions Status][gh-dynamiclinks-badge]][gh-actions] +[![Actions Status][gh-firebasepod-badge]][gh-actions] +[![Actions Status][gh-firestore-badge]][gh-actions] +[![Actions Status][gh-functions-badge]][gh-actions] +[![Actions Status][gh-inappmessaging-badge]][gh-actions] +[![Actions Status][gh-interop-badge]][gh-actions] +[![Actions Status][gh-messaging-badge]][gh-actions] +[![Actions Status][gh-remoteconfig-badge]][gh-actions] +[![Actions Status][gh-storage-badge]][gh-actions] +[![Actions Status][gh-symbolcollision-badge]][gh-actions] +[![Actions Status][gh-zip-badge]][gh-actions] +[![Travis](https://travis-ci.org/firebase/firebase-ios-sdk.svg?branch=master)](https://travis-ci.org/firebase/firebase-ios-sdk) + +# Firebase Apple Open Source Development + +This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics, +FirebasePerformance, and FirebaseML. + +The repository also includes GoogleUtilities source. The +[GoogleUtilities](GoogleUtilities/README.md) pod is +a set of utilities used by Firebase and other Google products. + +Firebase is an app development platform with tools to help you build, grow and +monetize your app. More information about Firebase can be found at +[https://firebase.google.com](https://firebase.google.com). + +## Installation + +See the three subsections for details about three different installation methods. +1. [Standard pod install](README.md#standard-pod-install) +1. [Installing from the GitHub repo](README.md#installing-from-github) +1. [Experimental Carthage](README.md#carthage-ios-only) + +### Standard pod install + +Go to +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Installing from GitHub + +For releases starting with 5.0.0, the source for each release is also deployed +to CocoaPods master and available via standard +[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod). + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See +[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All of the official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +``` +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +``` + +To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do: + +``` +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution are at +[Carthage](Carthage.md). + +### Rome + +Instructions for installing binary frameworks via +[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md). + +### Using Firebase from a Framework or a library + +[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md) + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + + * Xcode 10.3 (or later) + * CocoaPods 1.7.2 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self contained Xcode project. See +[Firestore/README.md](Firestore/README.md). + +### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +### Adding a New Firebase Pod + +See [AddNewPod.md](AddNewPod.md). + +### Managing Headers and Imports + +See [HeadersImports.md](HeadersImports.md). + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh) +before creating a PR. + +Travis will verify that any code changes are done in a style compliant way. Install +`clang-format` and `swiftformat`. +These commands will get the right versions: + +``` +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb +``` + +Note: if you already have a newer version of these installed you may need to +`brew switch` to this version. + +To update this section, find the versions of clang-format and swiftformat.rb to +match the versions in the CI failure logs +[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula). + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +#### Viewing Code Coverage (Deprecated) + +First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`. + +After running the `AllUnitTests_iOS` scheme in Xcode, execute +`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output` +at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results. + +### Running Sample Apps +In order to run the sample apps and integration tests, you'll need valid +`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist +files without real values, but can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g. `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file +(e.g. in [Example/Database/App/](Example/Database/App/)); + +Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require +special Apple capabilities, and you will have to change the sample app to use a unique bundle +identifier that you can control in your own Apple Developer account. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase Auth + +If you're doing specific Firebase Auth development, see +[the Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to +`Example/Database/App/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[FIRStorageIntegrationTests.m](FirebaseStorage/Tests/Integration/FIRStorageIntegrationTests.m). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to actually test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account, and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications, and will not receive push notifications. +In order to receive push notifications, you'll have to follow the steps above and run the app on a +physical device. + +## Community Supported Efforts + +We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are +very grateful! We'd like to empower as many developers as we can to be able to use Firebase and +participate in the Firebase community. + +### tvOS, macOS, watchOS and Catalyst +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on +tvOS, macOS, watchOS and Catalyst. + +For tvOS, checkout the [Sample](Example/tvOSSample). +For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the +[Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this +repository is actively developed primarily for iOS. While we can catch basic unit test issues with +Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you +encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the app +has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +To install, add a subset of the following to the Podfile: + +``` +pod 'Firebase/ABTesting' # No watchOS support yet +pod 'Firebase/Auth' # No watchOS support yet +pod 'Firebase/Crashlytics' # No watchOS support yet +pod 'Firebase/Database' # No watchOS support yet +pod 'Firebase/Firestore' # No watchOS support yet +pod 'Firebase/Functions' # No watchOS support yet +pod 'Firebase/Messaging' +pod 'Firebase/RemoteConfig' # No watchOS support yet +pod 'Firebase/Storage' +``` + +#### Additional Catalyst Notes + +* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability` +to Build Settings. +* FirebaseFirestore requires signing the +[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +iOS SDK. + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg +[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg +[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg +[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg +[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg +[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg +[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg +[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg +[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg +[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg +[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg +[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg +[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg +[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg +[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg +[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.h new file mode 100644 index 00000000..6429ac70 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.h @@ -0,0 +1,56 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/// Values stored in analyticsEnabledState. Never alter these constants since they must match with +/// values persisted to disk. +typedef NS_ENUM(int64_t, FIRAnalyticsEnabledState) { + // 0 is the default value for keys not found stored in persisted config, so it cannot represent + // kFIRAnalyticsEnabledStateSetNo. It must represent kFIRAnalyticsEnabledStateNotSet. + kFIRAnalyticsEnabledStateNotSet = 0, + kFIRAnalyticsEnabledStateSetYes = 1, + kFIRAnalyticsEnabledStateSetNo = 2, +}; + +/// The user defaults key for the persisted measurementEnabledState value. FIRAPersistedConfig reads +/// measurementEnabledState using this same key. +static NSString *const kFIRAPersistedConfigMeasurementEnabledStateKey = + @"/google/measurement/measurement_enabled_state"; + +static NSString *const kFIRAnalyticsConfigurationSetEnabledNotification = + @"FIRAnalyticsConfigurationSetEnabledNotification"; +static NSString *const kFIRAnalyticsConfigurationSetMinimumSessionIntervalNotification = + @"FIRAnalyticsConfigurationSetMinimumSessionIntervalNotification"; +static NSString *const kFIRAnalyticsConfigurationSetSessionTimeoutIntervalNotification = + @"FIRAnalyticsConfigurationSetSessionTimeoutIntervalNotification"; + +@interface FIRAnalyticsConfiguration : NSObject + +/// Returns the shared instance of FIRAnalyticsConfiguration. ++ (FIRAnalyticsConfiguration *)sharedInstance; + +// Sets whether analytics collection is enabled for this app on this device. This setting is +// persisted across app sessions. By default it is enabled. +- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; + +/// Sets whether analytics collection is enabled for this app on this device, and a flag to persist +/// the value or not. The setting should not be persisted if being set by the global data collection +/// flag. +- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled + persistSetting:(BOOL)shouldPersist; + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m new file mode 100644 index 00000000..07c786cb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m @@ -0,0 +1,62 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h" + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +@implementation FIRAnalyticsConfiguration +#pragma clang diagnostic pop + ++ (FIRAnalyticsConfiguration *)sharedInstance { + static FIRAnalyticsConfiguration *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[FIRAnalyticsConfiguration alloc] init]; + }); + return sharedInstance; +} + +- (void)postNotificationName:(NSString *)name value:(id)value { + if (!name.length || !value) { + return; + } + [[NSNotificationCenter defaultCenter] postNotificationName:name + object:self + userInfo:@{name : value}]; +} + +- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled { + [self setAnalyticsCollectionEnabled:analyticsCollectionEnabled persistSetting:YES]; +} + +- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled + persistSetting:(BOOL)shouldPersist { + // Persist the measurementEnabledState. Use FIRAnalyticsEnabledState values instead of YES/NO. + FIRAnalyticsEnabledState analyticsEnabledState = + analyticsCollectionEnabled ? kFIRAnalyticsEnabledStateSetYes : kFIRAnalyticsEnabledStateSetNo; + if (shouldPersist) { + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + [userDefaults setObject:@(analyticsEnabledState) + forKey:kFIRAPersistedConfigMeasurementEnabledStateKey]; + [userDefaults synchronize]; + } + + [self postNotificationName:kFIRAnalyticsConfigurationSetEnabledNotification + value:@(analyticsCollectionEnabled)]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m new file mode 100644 index 00000000..4dfbfa83 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m @@ -0,0 +1,938 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#if __has_include() +#import +#endif + +#if __has_include() +#import +#endif + +#import "FirebaseCore/Sources/Public/FIRApp.h" + +#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h" +#import "FirebaseCore/Sources/FIRBundleUtil.h" +#import "FirebaseCore/Sources/FIRComponentContainerInternal.h" +#import "FirebaseCore/Sources/FIRConfigurationInternal.h" +#import "FirebaseCore/Sources/FIRVersion.h" +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" + +#import + +#import + +// The kFIRService strings are only here while transitioning CoreDiagnostics from the Analytics +// pod to a Core dependency. These symbols are not used and should be deleted after the transition. +NSString *const kFIRServiceAdMob; +NSString *const kFIRServiceAuth; +NSString *const kFIRServiceAuthUI; +NSString *const kFIRServiceCrash; +NSString *const kFIRServiceDatabase; +NSString *const kFIRServiceDynamicLinks; +NSString *const kFIRServiceFirestore; +NSString *const kFIRServiceFunctions; +NSString *const kFIRServiceInstanceID; +NSString *const kFIRServiceInvites; +NSString *const kFIRServiceMessaging; +NSString *const kFIRServiceMeasurement; +NSString *const kFIRServicePerformance; +NSString *const kFIRServiceRemoteConfig; +NSString *const kFIRServiceStorage; +NSString *const kGGLServiceAnalytics; +NSString *const kGGLServiceSignIn; + +NSString *const kFIRDefaultAppName = @"__FIRAPP_DEFAULT"; +NSString *const kFIRAppReadyToConfigureSDKNotification = @"FIRAppReadyToConfigureSDKNotification"; +NSString *const kFIRAppDeleteNotification = @"FIRAppDeleteNotification"; +NSString *const kFIRAppIsDefaultAppKey = @"FIRAppIsDefaultAppKey"; +NSString *const kFIRAppNameKey = @"FIRAppNameKey"; +NSString *const kFIRGoogleAppIDKey = @"FIRGoogleAppIDKey"; + +NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat = + @"/google/firebase/global_data_collection_enabled:%@"; +NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey = + @"FirebaseDataCollectionDefaultEnabled"; + +NSString *const kFIRAppDiagnosticsNotification = @"FIRAppDiagnosticsNotification"; + +NSString *const kFIRAppDiagnosticsConfigurationTypeKey = @"ConfigType"; +NSString *const kFIRAppDiagnosticsErrorKey = @"Error"; +NSString *const kFIRAppDiagnosticsFIRAppKey = @"FIRApp"; +NSString *const kFIRAppDiagnosticsSDKNameKey = @"SDKName"; +NSString *const kFIRAppDiagnosticsSDKVersionKey = @"SDKVersion"; +NSString *const kFIRAppDiagnosticsApplePlatformPrefix = @"apple-platform"; + +// Auth internal notification notification and key. +NSString *const FIRAuthStateDidChangeInternalNotification = + @"FIRAuthStateDidChangeInternalNotification"; +NSString *const FIRAuthStateDidChangeInternalNotificationAppKey = + @"FIRAuthStateDidChangeInternalNotificationAppKey"; +NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey = + @"FIRAuthStateDidChangeInternalNotificationTokenKey"; +NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey = + @"FIRAuthStateDidChangeInternalNotificationUIDKey"; + +/** + * The URL to download plist files. + */ +static NSString *const kPlistURL = @"https://console.firebase.google.com/"; + +/** + * An array of all classes that registered as `FIRCoreConfigurable` in order to receive lifecycle + * events from Core. + */ +static NSMutableArray> *sRegisteredAsConfigurable; + +@interface FIRApp () + +#ifdef DEBUG +@property(nonatomic) BOOL alreadyOutputDataCollectionFlag; +#endif // DEBUG + +@end + +@implementation FIRApp + +// This is necessary since our custom getter prevents `_options` from being created. +@synthesize options = _options; + +static NSMutableDictionary *sAllApps; +static FIRApp *sDefaultApp; +static NSMutableDictionary *sLibraryVersions; +static dispatch_once_t sFirebaseUserAgentOnceToken; + ++ (void)configure { + FIROptions *options = [FIROptions defaultOptions]; + if (!options) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"`[FIRApp configure];` (`FirebaseApp.configure()` in Swift) could not find " + @"a valid GoogleService-Info.plist in your project. Please download one " + @"from %@.", + kPlistURL]; + } + [FIRApp configureWithOptions:options]; +#if TARGET_OS_OSX || TARGET_OS_TV + FIRLogNotice(kFIRLoggerCore, @"I-COR000028", + @"tvOS and macOS SDK support is not part of the official Firebase product. " + @"Instead they are community supported. Details at " + @"https://github.com/firebase/firebase-ios-sdk/blob/master/README.md."); +#endif +} + ++ (void)configureWithOptions:(FIROptions *)options { + if (!options) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"Options is nil. Please pass a valid options."]; + } + [FIRApp configureWithName:kFIRDefaultAppName options:options]; +} + ++ (NSCharacterSet *)applicationNameAllowedCharacters { + static NSCharacterSet *applicationNameAllowedCharacters; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableCharacterSet *allowedNameCharacters = [NSMutableCharacterSet alphanumericCharacterSet]; + [allowedNameCharacters addCharactersInString:@"-_"]; + applicationNameAllowedCharacters = [allowedNameCharacters copy]; + }); + return applicationNameAllowedCharacters; +} + ++ (void)configureWithName:(NSString *)name options:(FIROptions *)options { + if (!name || !options) { + [NSException raise:kFirebaseCoreErrorDomain format:@"Neither name nor options can be nil."]; + } + if (name.length == 0) { + [NSException raise:kFirebaseCoreErrorDomain format:@"Name cannot be empty."]; + } + + if ([name isEqualToString:kFIRDefaultAppName]) { + if (sDefaultApp) { + // The default app already exists. Handle duplicate `configure` calls and return. + [self appWasConfiguredTwice:sDefaultApp usingOptions:options]; + return; + } + + FIRLogDebug(kFIRLoggerCore, @"I-COR000001", @"Configuring the default app."); + } else { + // Validate the app name and ensure it hasn't been configured already. + NSCharacterSet *nameCharacters = [NSCharacterSet characterSetWithCharactersInString:name]; + + if (![[self applicationNameAllowedCharacters] isSupersetOfSet:nameCharacters]) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"App name can only contain alphanumeric, " + @"hyphen (-), and underscore (_) characters"]; + } + + @synchronized(self) { + if (sAllApps && sAllApps[name]) { + // The app already exists. Handle a duplicate `configure` call and return. + [self appWasConfiguredTwice:sAllApps[name] usingOptions:options]; + return; + } + } + + FIRLogDebug(kFIRLoggerCore, @"I-COR000002", @"Configuring app named %@", name); + } + + @synchronized(self) { + FIRApp *app = [[FIRApp alloc] initInstanceWithName:name options:options]; + if (app.isDefaultApp) { + sDefaultApp = app; + } + + [FIRApp addAppToAppDictionary:app]; + + // The FIRApp instance is ready to go, `sDefaultApp` is assigned, other SDKs are now ready to be + // instantiated. + [app.container instantiateEagerComponents]; + [FIRApp sendNotificationsToSDKs:app]; + } +} + +/// Called when `configure` has been called multiple times for the same app. This can either throw +/// an exception (most cases) or ignore the duplicate configuration in situations where it's allowed +/// like an extension. ++ (void)appWasConfiguredTwice:(FIRApp *)app usingOptions:(FIROptions *)options { + // Only extensions should potentially be able to call `configure` more than once. + if (![GULAppEnvironmentUtil isAppExtension]) { + // Throw an exception since this is now an invalid state. + if (app.isDefaultApp) { + [NSException raise:kFirebaseCoreErrorDomain + format:@"Default app has already been configured."]; + } else { + [NSException raise:kFirebaseCoreErrorDomain + format:@"App named %@ has already been configured.", app.name]; + } + } + + // In an extension, the entry point could be called multiple times. As long as the options are + // identical we should allow multiple `configure` calls. + if ([options isEqual:app.options]) { + // Everything is identical but the extension's lifecycle triggered `configure` twice. + // Ignore duplicate calls and return since everything should still be in a valid state. + FIRLogDebug(kFIRLoggerCore, @"I-COR000035", + @"Ignoring second `configure` call in an extension."); + return; + } else { + [NSException raise:kFirebaseCoreErrorDomain + format:@"App named %@ has already been configured.", app.name]; + } +} + ++ (FIRApp *)defaultApp { + if (sDefaultApp) { + return sDefaultApp; + } + FIRLogError(kFIRLoggerCore, @"I-COR000003", + @"The default Firebase app has not yet been " + @"configured. Add `[FIRApp configure];` (`FirebaseApp.configure()` in Swift) to your " + @"application initialization. Read more: https://goo.gl/ctyzm8."); + return nil; +} + ++ (FIRApp *)appNamed:(NSString *)name { + @synchronized(self) { + if (sAllApps) { + FIRApp *app = sAllApps[name]; + if (app) { + return app; + } + } + FIRLogError(kFIRLoggerCore, @"I-COR000004", @"App with name %@ does not exist.", name); + return nil; + } +} + ++ (NSDictionary *)allApps { + @synchronized(self) { + if (!sAllApps) { + FIRLogError(kFIRLoggerCore, @"I-COR000005", @"No app has been configured yet."); + } + return [sAllApps copy]; + } +} + +// Public only for tests ++ (void)resetApps { + @synchronized(self) { + sDefaultApp = nil; + [sAllApps removeAllObjects]; + sAllApps = nil; + [sLibraryVersions removeAllObjects]; + sLibraryVersions = nil; + sFirebaseUserAgentOnceToken = 0; + } +} + +- (void)deleteApp:(FIRAppVoidBoolCallback)completion { + @synchronized([self class]) { + if (sAllApps && sAllApps[self.name]) { + FIRLogDebug(kFIRLoggerCore, @"I-COR000006", @"Deleting app named %@", self.name); + + // Remove all registered libraries from the container to avoid creating new instances. + [self.container removeAllComponents]; + // Remove all cached instances from the container before deleting the app. + [self.container removeAllCachedInstances]; + + [sAllApps removeObjectForKey:self.name]; + [self clearDataCollectionSwitchFromUserDefaults]; + if ([self.name isEqualToString:kFIRDefaultAppName]) { + sDefaultApp = nil; + } + NSDictionary *appInfoDict = @{kFIRAppNameKey : self.name}; + [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppDeleteNotification + object:[self class] + userInfo:appInfoDict]; + completion(YES); + } else { + FIRLogError(kFIRLoggerCore, @"I-COR000007", @"App does not exist."); + completion(NO); + } + } +} + ++ (void)addAppToAppDictionary:(FIRApp *)app { + if (!sAllApps) { + sAllApps = [NSMutableDictionary dictionary]; + } + if ([app configureCore]) { + sAllApps[app.name] = app; + } else { + [NSException raise:kFirebaseCoreErrorDomain + format:@"Configuration fails. It may be caused by an invalid GOOGLE_APP_ID in " + @"GoogleService-Info.plist or set in the customized options."]; + } +} + +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options { + self = [super init]; + if (self) { + _name = [name copy]; + _options = [options copy]; + _options.editingLocked = YES; + _isDefaultApp = [name isEqualToString:kFIRDefaultAppName]; + _container = [[FIRComponentContainer alloc] initWithApp:self]; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (BOOL)configureCore { + [self checkExpectedBundleID]; + if (![self isAppIDValid]) { + return NO; + } + + [self logCoreTelemetryIfEnabled]; + +#if TARGET_OS_IOS + // Initialize the Analytics once there is a valid options under default app. Analytics should + // always initialize first by itself before the other SDKs. + if ([self.name isEqualToString:kFIRDefaultAppName]) { + Class firAnalyticsClass = NSClassFromString(@"FIRAnalytics"); + if (firAnalyticsClass) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundeclared-selector" + SEL startWithConfigurationSelector = @selector(startWithConfiguration:options:); +#pragma clang diagnostic pop + if ([firAnalyticsClass respondsToSelector:startWithConfigurationSelector]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [firAnalyticsClass performSelector:startWithConfigurationSelector + withObject:[FIRConfiguration sharedInstance].analyticsConfiguration + withObject:_options]; +#pragma clang diagnostic pop + } + } + } +#endif + + [self subscribeForAppDidBecomeActiveNotifications]; + + return YES; +} + +- (FIROptions *)options { + return [_options copy]; +} + +- (void)setDataCollectionDefaultEnabled:(BOOL)dataCollectionDefaultEnabled { +#ifdef DEBUG + FIRLogDebug(kFIRLoggerCore, @"I-COR000034", @"Explicitly %@ data collection flag.", + dataCollectionDefaultEnabled ? @"enabled" : @"disabled"); + self.alreadyOutputDataCollectionFlag = YES; +#endif // DEBUG + + NSString *key = + [NSString stringWithFormat:kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat, self.name]; + [[NSUserDefaults standardUserDefaults] setBool:dataCollectionDefaultEnabled forKey:key]; + + // Core also controls the FirebaseAnalytics flag, so check if the Analytics flags are set + // within FIROptions and change the Analytics value if necessary. Analytics only works with the + // default app, so return if this isn't the default app. + if (!self.isDefaultApp) { + return; + } + + // Check if the Analytics flag is explicitly set. If so, no further actions are necessary. + if ([self.options isAnalyticsCollectionExplicitlySet]) { + return; + } + + // The Analytics flag has not been explicitly set, so update with the value being set. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [[FIRAnalyticsConfiguration sharedInstance] + setAnalyticsCollectionEnabled:dataCollectionDefaultEnabled + persistSetting:NO]; +#pragma clang diagnostic pop +} + +- (BOOL)isDataCollectionDefaultEnabled { + // Check if it's been manually set before in code, and use that as the higher priority value. + NSNumber *defaultsObject = [[self class] readDataCollectionSwitchFromUserDefaultsForApp:self]; + if (defaultsObject != nil) { +#ifdef DEBUG + if (!self.alreadyOutputDataCollectionFlag) { + FIRLogDebug(kFIRLoggerCore, @"I-COR000031", @"Data Collection flag is %@ in user defaults.", + [defaultsObject boolValue] ? @"enabled" : @"disabled"); + self.alreadyOutputDataCollectionFlag = YES; + } +#endif // DEBUG + return [defaultsObject boolValue]; + } + + // Read the Info.plist to see if the flag is set. If it's not set, it should default to `YES`. + // As per the implementation of `readDataCollectionSwitchFromPlist`, it's a cached value and has + // no performance impact calling multiple times. + NSNumber *collectionEnabledPlistValue = [[self class] readDataCollectionSwitchFromPlist]; + if (collectionEnabledPlistValue != nil) { +#ifdef DEBUG + if (!self.alreadyOutputDataCollectionFlag) { + FIRLogDebug(kFIRLoggerCore, @"I-COR000032", @"Data Collection flag is %@ in plist.", + [collectionEnabledPlistValue boolValue] ? @"enabled" : @"disabled"); + self.alreadyOutputDataCollectionFlag = YES; + } +#endif // DEBUG + return [collectionEnabledPlistValue boolValue]; + } + +#ifdef DEBUG + if (!self.alreadyOutputDataCollectionFlag) { + FIRLogDebug(kFIRLoggerCore, @"I-COR000033", @"Data Collection flag is not set."); + self.alreadyOutputDataCollectionFlag = YES; + } +#endif // DEBUG + return YES; +} + +#pragma mark - private + ++ (void)sendNotificationsToSDKs:(FIRApp *)app { + // TODO: Remove this notification once all SDKs are registered with `FIRCoreConfigurable`. + NSNumber *isDefaultApp = [NSNumber numberWithBool:app.isDefaultApp]; + NSDictionary *appInfoDict = @{ + kFIRAppNameKey : app.name, + kFIRAppIsDefaultAppKey : isDefaultApp, + kFIRGoogleAppIDKey : app.options.googleAppID + }; + [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppReadyToConfigureSDKNotification + object:self + userInfo:appInfoDict]; + + // This is the new way of sending information to SDKs. + // TODO: Do we want this on a background thread, maybe? + @synchronized(self) { + for (Class library in sRegisteredAsConfigurable) { + [library configureWithApp:app]; + } + } +} + ++ (NSError *)errorForMissingOptions { + NSDictionary *errorDict = @{ + NSLocalizedDescriptionKey : + @"Unable to parse GoogleService-Info.plist in order to configure services.", + NSLocalizedRecoverySuggestionErrorKey : + @"Check formatting and location of GoogleService-Info.plist." + }; + return [NSError errorWithDomain:kFirebaseCoreErrorDomain + code:FIRErrorCodeInvalidPlistFile + userInfo:errorDict]; +} + ++ (NSError *)errorForSubspecConfigurationFailureWithDomain:(NSString *)domain + errorCode:(FIRErrorCode)code + service:(NSString *)service + reason:(NSString *)reason { + NSString *description = + [NSString stringWithFormat:@"Configuration failed for service %@.", service]; + NSDictionary *errorDict = + @{NSLocalizedDescriptionKey : description, NSLocalizedFailureReasonErrorKey : reason}; + return [NSError errorWithDomain:domain code:code userInfo:errorDict]; +} + ++ (NSError *)errorForInvalidAppID { + NSDictionary *errorDict = @{ + NSLocalizedDescriptionKey : @"Unable to validate Google App ID", + NSLocalizedRecoverySuggestionErrorKey : + @"Check formatting and location of GoogleService-Info.plist or GoogleAppID set in the " + @"customized options." + }; + return [NSError errorWithDomain:kFirebaseCoreErrorDomain + code:FIRErrorCodeInvalidAppID + userInfo:errorDict]; +} + ++ (BOOL)isDefaultAppConfigured { + return (sDefaultApp != nil); +} + ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version { + // Create the set of characters which aren't allowed, only if this feature is used. + NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet alphanumericCharacterSet]; + [allowedSet addCharactersInString:@"-_."]; + NSCharacterSet *disallowedSet = [allowedSet invertedSet]; + // Make sure the library name and version strings do not contain unexpected characters, and + // add the name/version pair to the dictionary. + if ([name rangeOfCharacterFromSet:disallowedSet].location == NSNotFound && + [version rangeOfCharacterFromSet:disallowedSet].location == NSNotFound) { + @synchronized(self) { + if (!sLibraryVersions) { + sLibraryVersions = [[NSMutableDictionary alloc] init]; + } + sLibraryVersions[name] = version; + } + } else { + FIRLogError(kFIRLoggerCore, @"I-COR000027", + @"The library name (%@) or version number (%@) contain invalid characters. " + @"Only alphanumeric, dash, underscore and period characters are allowed.", + name, version); + } +} + ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version { + // This is called at +load time, keep the work to a minimum. + + // Ensure the class given conforms to the proper protocol. + if (![(Class)library conformsToProtocol:@protocol(FIRLibrary)] || + ![(Class)library respondsToSelector:@selector(componentsToRegister)]) { + [NSException raise:NSInvalidArgumentException + format:@"Class %@ attempted to register components, but it does not conform to " + @"`FIRLibrary or provide a `componentsToRegister:` method.", + library]; + } + + [FIRComponentContainer registerAsComponentRegistrant:library]; + if ([(Class)library respondsToSelector:@selector(configureWithApp:)]) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sRegisteredAsConfigurable = [[NSMutableArray alloc] init]; + }); + @synchronized(self) { + [sRegisteredAsConfigurable addObject:library]; + } + } + [self registerLibrary:name withVersion:version]; +} + ++ (NSString *)firebaseUserAgent { + @synchronized(self) { + dispatch_once(&sFirebaseUserAgentOnceToken, ^{ + // Report FirebaseCore version for useragent string + [FIRApp registerLibrary:@"fire-ios" + withVersion:[NSString stringWithUTF8String:FIRCoreVersionString]]; + + NSDictionary *info = [[NSBundle mainBundle] infoDictionary]; + NSString *xcodeVersion = info[@"DTXcodeBuild"]; + NSString *sdkVersion = info[@"DTSDKBuild"]; + if (xcodeVersion) { + [FIRApp registerLibrary:@"xcode" withVersion:xcodeVersion]; + } + if (sdkVersion) { + [FIRApp registerLibrary:@"apple-sdk" withVersion:sdkVersion]; + } + + NSString *swiftFlagValue = [self hasSwiftRuntime] ? @"true" : @"false"; + [FIRApp registerLibrary:@"swift" withVersion:swiftFlagValue]; + + [FIRApp registerLibrary:kFIRAppDiagnosticsApplePlatformPrefix + withVersion:[self applePlatform]]; + }); + + NSMutableArray *libraries = + [[NSMutableArray alloc] initWithCapacity:sLibraryVersions.count]; + for (NSString *libraryName in sLibraryVersions) { + [libraries addObject:[NSString stringWithFormat:@"%@/%@", libraryName, + sLibraryVersions[libraryName]]]; + } + [libraries sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; + return [libraries componentsJoinedByString:@" "]; + } +} + ++ (BOOL)hasSwiftRuntime { + // The class + // [Swift._SwiftObject](https://github.com/apple/swift/blob/5eac3e2818eb340b11232aff83edfbd1c307fa03/stdlib/public/runtime/SwiftObject.h#L35) + // is a part of Swift runtime, so it should be present if Swift runtime is available. + + BOOL hasSwiftRuntime = + objc_lookUpClass("Swift._SwiftObject") != nil || + // Swift object class name before + // https://github.com/apple/swift/commit/9637b4a6e11ddca72f5f6dbe528efc7c92f14d01 + objc_getClass("_TtCs12_SwiftObject") != nil; + + return hasSwiftRuntime; +} + ++ (NSString *)applePlatform { + NSString *applePlatform = @"unknown"; + + // When a Catalyst app is run on macOS then both `TARGET_OS_MACCATALYST` and `TARGET_OS_IOS` are + // `true`, which means the condition list is order-sensitive. +#if TARGET_OS_MACCATALYST + applePlatform = @"maccatalyst"; +#elif TARGET_OS_IOS + applePlatform = @"ios"; +#elif TARGET_OS_TV + applePlatform = @"tvos"; +#elif TARGET_OS_OSX + applePlatform = @"macos"; +#elif TARGET_OS_WATCH + applePlatform = @"watchos"; +#endif + + return applePlatform; +} + +- (void)checkExpectedBundleID { + NSArray *bundles = [FIRBundleUtil relevantBundles]; + NSString *expectedBundleID = [self expectedBundleID]; + // The checking is only done when the bundle ID is provided in the serviceInfo dictionary for + // backward compatibility. + if (expectedBundleID != nil && ![FIRBundleUtil hasBundleIdentifierPrefix:expectedBundleID + inBundles:bundles]) { + FIRLogError(kFIRLoggerCore, @"I-COR000008", + @"The project's Bundle ID is inconsistent with " + @"either the Bundle ID in '%@.%@', or the Bundle ID in the options if you are " + @"using a customized options. To ensure that everything can be configured " + @"correctly, you may need to make the Bundle IDs consistent. To continue with this " + @"plist file, you may change your app's bundle identifier to '%@'. Or you can " + @"download a new configuration file that matches your bundle identifier from %@ " + @"and replace the current one.", + kServiceInfoFileName, kServiceInfoFileType, expectedBundleID, kPlistURL); + } +} + +#pragma mark - private - App ID Validation + +/** + * Validates the format and fingerprint of the app ID contained in GOOGLE_APP_ID in the plist file. + * This is the main method for validating app ID. + * + * @return YES if the app ID fulfills the expected format and fingerprint, NO otherwise. + */ +- (BOOL)isAppIDValid { + NSString *appID = _options.googleAppID; + BOOL isValid = [FIRApp validateAppID:appID]; + if (!isValid) { + NSString *expectedBundleID = [self expectedBundleID]; + FIRLogError(kFIRLoggerCore, @"I-COR000009", + @"The GOOGLE_APP_ID either in the plist file " + @"'%@.%@' or the one set in the customized options is invalid. If you are using " + @"the plist file, use the iOS version of bundle identifier to download the file, " + @"and do not manually edit the GOOGLE_APP_ID. You may change your app's bundle " + @"identifier to '%@'. Or you can download a new configuration file that matches " + @"your bundle identifier from %@ and replace the current one.", + kServiceInfoFileName, kServiceInfoFileType, expectedBundleID, kPlistURL); + }; + return isValid; +} + ++ (BOOL)validateAppID:(NSString *)appID { + // Failing validation only occurs when we are sure we are looking at a V2 app ID and it does not + // have a valid fingerprint, otherwise we just warn about the potential issue. + if (!appID.length) { + return NO; + } + + NSScanner *stringScanner = [NSScanner scannerWithString:appID]; + stringScanner.charactersToBeSkipped = nil; + + NSString *appIDVersion; + if (![stringScanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] + intoString:&appIDVersion]) { + return NO; + } + + if (![stringScanner scanString:@":" intoString:NULL]) { + // appIDVersion must be separated by ":" + return NO; + } + + NSArray *knownVersions = @[ @"1" ]; + if (![knownVersions containsObject:appIDVersion]) { + // Permit unknown yet properly formatted app ID versions. + FIRLogInfo(kFIRLoggerCore, @"I-COR000010", @"Unknown GOOGLE_APP_ID version: %@", appIDVersion); + return YES; + } + + if (![self validateAppIDFormat:appID withVersion:appIDVersion]) { + return NO; + } + + if (![self validateAppIDFingerprint:appID withVersion:appIDVersion]) { + return NO; + } + + return YES; +} + ++ (NSString *)actualBundleID { + return [[NSBundle mainBundle] bundleIdentifier]; +} + +/** + * Validates that the format of the app ID string is what is expected based on the supplied version. + * The version must end in ":". + * + * For v1 app ids the format is expected to be + * '::ios:'. + * + * This method does not verify that the contents of the app id are correct, just that they fulfill + * the expected format. + * + * @param appID Contents of GOOGLE_APP_ID from the plist file. + * @param version Indicates what version of the app id format this string should be. + * @return YES if provided string fufills the expected format, NO otherwise. + */ ++ (BOOL)validateAppIDFormat:(NSString *)appID withVersion:(NSString *)version { + if (!appID.length || !version.length) { + return NO; + } + + NSScanner *stringScanner = [NSScanner scannerWithString:appID]; + stringScanner.charactersToBeSkipped = nil; + + // Skip version part + // '**::ios:' + if (![stringScanner scanString:version intoString:NULL]) { + // The version part is missing or mismatched + return NO; + } + + // Validate version part (see part between '*' symbols below) + // '*:*:ios:' + if (![stringScanner scanString:@":" intoString:NULL]) { + // appIDVersion must be separated by ":" + return NO; + } + + // Validate version part (see part between '*' symbols below) + // ':**:ios:'. + NSInteger projectNumber = NSNotFound; + if (![stringScanner scanInteger:&projectNumber]) { + // NO project number found. + return NO; + } + + // Validate version part (see part between '*' symbols below) + // ':*:*ios:'. + if (![stringScanner scanString:@":" intoString:NULL]) { + // The project number must be separated by ":" + return NO; + } + + // Validate version part (see part between '*' symbols below) + // '::*ios*:'. + NSString *platform; + if (![stringScanner scanUpToString:@":" intoString:&platform]) { + return NO; + } + + if (![platform isEqualToString:@"ios"]) { + // The platform must be @"ios" + return NO; + } + + // Validate version part (see part between '*' symbols below) + // '::ios*:*'. + if (![stringScanner scanString:@":" intoString:NULL]) { + // The platform must be separated by ":" + return NO; + } + + // Validate version part (see part between '*' symbols below) + // '::ios:**'. + unsigned long long fingerprint = NSNotFound; + if (![stringScanner scanHexLongLong:&fingerprint]) { + // Fingerprint part is missing + return NO; + } + + if (!stringScanner.isAtEnd) { + // There are not allowed characters in the fingerprint part + return NO; + } + + return YES; +} + +/** + * Validates that the fingerprint of the app ID string is what is expected based on the supplied + * version. + * + * Note that the v1 hash algorithm is not permitted on the client and cannot be fully validated. + * + * @param appID Contents of GOOGLE_APP_ID from the plist file. + * @param version Indicates what version of the app id format this string should be. + * @return YES if provided string fufills the expected fingerprint and the version is known, NO + * otherwise. + */ ++ (BOOL)validateAppIDFingerprint:(NSString *)appID withVersion:(NSString *)version { + // Extract the supplied fingerprint from the supplied app ID. + // This assumes the app ID format is the same for all known versions below. If the app ID format + // changes in future versions, the tokenizing of the app ID format will need to take into account + // the version of the app ID. + NSArray *components = [appID componentsSeparatedByString:@":"]; + if (components.count != 4) { + return NO; + } + + NSString *suppliedFingerprintString = components[3]; + if (!suppliedFingerprintString.length) { + return NO; + } + + uint64_t suppliedFingerprint; + NSScanner *scanner = [NSScanner scannerWithString:suppliedFingerprintString]; + if (![scanner scanHexLongLong:&suppliedFingerprint]) { + return NO; + } + + if ([version isEqual:@"1"]) { + // The v1 hash algorithm is not permitted on the client so the actual hash cannot be validated. + return YES; + } + + // Unknown version. + return NO; +} + +- (NSString *)expectedBundleID { + return _options.bundleID; +} + +// end App ID validation + +#pragma mark - Reading From Plist & User Defaults + +/** + * Clears the data collection switch from the standard NSUserDefaults for easier testing and + * readability. + */ +- (void)clearDataCollectionSwitchFromUserDefaults { + NSString *key = + [NSString stringWithFormat:kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat, self.name]; + [[NSUserDefaults standardUserDefaults] removeObjectForKey:key]; +} + +/** + * Reads the data collection switch from the standard NSUserDefaults for easier testing and + * readability. + */ ++ (nullable NSNumber *)readDataCollectionSwitchFromUserDefaultsForApp:(FIRApp *)app { + // Read the object in user defaults, and only return if it's an NSNumber. + NSString *key = + [NSString stringWithFormat:kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat, app.name]; + id collectionEnabledDefaultsObject = [[NSUserDefaults standardUserDefaults] objectForKey:key]; + if ([collectionEnabledDefaultsObject isKindOfClass:[NSNumber class]]) { + return collectionEnabledDefaultsObject; + } + + return nil; +} + +/** + * Reads the data collection switch from the Info.plist for easier testing and readability. Will + * only read once from the plist and return the cached value. + */ ++ (nullable NSNumber *)readDataCollectionSwitchFromPlist { + static NSNumber *collectionEnabledPlistObject; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // Read the data from the `Info.plist`, only assign it if it's there and an NSNumber. + id plistValue = [[NSBundle mainBundle] + objectForInfoDictionaryKey:kFIRGlobalAppDataCollectionEnabledPlistKey]; + if (plistValue && [plistValue isKindOfClass:[NSNumber class]]) { + collectionEnabledPlistObject = (NSNumber *)plistValue; + } + }); + + return collectionEnabledPlistObject; +} + +#pragma mark - Sending Logs + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-parameter" +- (void)sendLogsWithServiceName:(NSString *)serviceName + version:(NSString *)version + error:(NSError *)error { + // Do nothing. Please remove calls to this method. +} +#pragma clang diagnostic pop + +#pragma mark - App Life Cycle + +- (void)subscribeForAppDidBecomeActiveNotifications { +#if TARGET_OS_IOS || TARGET_OS_TV + NSNotificationName notificationName = UIApplicationDidBecomeActiveNotification; +#elif TARGET_OS_OSX + NSNotificationName notificationName = NSApplicationDidBecomeActiveNotification; +#endif + +#if !TARGET_OS_WATCH + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(appDidBecomeActive:) + name:notificationName + object:nil]; +#endif +} + +- (void)appDidBecomeActive:(NSNotification *)notification { + [self logCoreTelemetryIfEnabled]; +} + +- (void)logCoreTelemetryIfEnabled { + if ([self isDataCollectionDefaultEnabled]) { + [FIRCoreDiagnosticsConnector logCoreTelemetryWithOptions:_options]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.h new file mode 100644 index 00000000..3fc69c6c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.h @@ -0,0 +1,49 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +// TODO: Remove this once Auth moves over to Core's instance registration system. +/** @class FIRAppAssociationRegistration + @brief Manages object associations as a singleton-dependent: At most one object is + registered for any given host/key pair, and the object shall be created on-the-fly when + asked for. + */ +@interface FIRAppAssociationRegistration : NSObject + +/** @fn registeredObjectWithHost:key:creationBlock: + @brief Retrieves the registered object with a particular host and key. + @param host The host object. + @param key The key to specify the registered object on the host. + @param creationBlock The block to return the object to be registered if not already. + The block is executed immediately before this method returns if it is executed at all. + It can also be executed multiple times across different method invocations if previous + execution of the block returns @c nil. + @return The registered object for the host/key pair, or @c nil if no object is registered + and @c creationBlock returns @c nil. + @remarks The method is thread-safe but non-reentrant in the sense that attempting to call this + method again within the @c creationBlock with the same host/key pair raises an exception. + The registered object is retained by the host. + */ ++ (nullable ObjectType)registeredObjectWithHost:(id)host + key:(NSString *)key + creationBlock:(ObjectType _Nullable (^)(void))creationBlock; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.m new file mode 100644 index 00000000..f3f812c7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.m @@ -0,0 +1,47 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/FIRAppAssociationRegistration.h" + +#import + +@implementation FIRAppAssociationRegistration + ++ (nullable id)registeredObjectWithHost:(id)host + key:(NSString *)key + creationBlock:(id _Nullable (^)(void))creationBlock { + @synchronized(self) { + SEL dictKey = @selector(registeredObjectWithHost:key:creationBlock:); + NSMutableDictionary *objectsByKey = objc_getAssociatedObject(host, dictKey); + if (!objectsByKey) { + objectsByKey = [[NSMutableDictionary alloc] init]; + objc_setAssociatedObject(host, dictKey, objectsByKey, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + id obj = objectsByKey[key]; + NSValue *creationBlockBeingCalled = [NSValue valueWithPointer:dictKey]; + if (obj) { + if ([creationBlockBeingCalled isEqual:obj]) { + [NSException raise:@"Reentering registeredObjectWithHost:key:creationBlock: not allowed" + format:@"host: %@ key: %@", host, key]; + } + return obj; + } + objectsByKey[key] = creationBlockBeingCalled; + obj = creationBlock(); + objectsByKey[key] = obj; + return obj; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h new file mode 100644 index 00000000..d9475dd2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h @@ -0,0 +1,53 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** + * This class provides utilities for accessing resources in bundles. + */ +@interface FIRBundleUtil : NSObject + +/** + * Finds all relevant bundles, starting with [NSBundle mainBundle]. + */ ++ (NSArray *)relevantBundles; + +/** + * Reads the options dictionary from one of the provided bundles. + * + * @param resourceName The resource name, e.g. @"GoogleService-Info". + * @param fileType The file type (extension), e.g. @"plist". + * @param bundles The bundles to expect, in priority order. See also + * +[FIRBundleUtil relevantBundles]. + */ ++ (NSString *)optionsDictionaryPathWithResourceName:(NSString *)resourceName + andFileType:(NSString *)fileType + inBundles:(NSArray *)bundles; + +/** + * Finds URL schemes defined in all relevant bundles, starting with those from + * [NSBundle mainBundle]. + */ ++ (NSArray *)relevantURLSchemes; + +/** + * Checks if any of the given bundles have a matching bundle identifier prefix (removing extension + * suffixes). + */ ++ (BOOL)hasBundleIdentifierPrefix:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles; + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m new file mode 100644 index 00000000..de2c2954 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m @@ -0,0 +1,79 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/FIRBundleUtil.h" + +#import + +@implementation FIRBundleUtil + ++ (NSArray *)relevantBundles { + return @[ [NSBundle mainBundle], [NSBundle bundleForClass:[self class]] ]; +} + ++ (NSString *)optionsDictionaryPathWithResourceName:(NSString *)resourceName + andFileType:(NSString *)fileType + inBundles:(NSArray *)bundles { + // Loop through all bundles to find the config dict. + for (NSBundle *bundle in bundles) { + NSString *path = [bundle pathForResource:resourceName ofType:fileType]; + // Use the first one we find. + if (path) { + return path; + } + } + return nil; +} + ++ (NSArray *)relevantURLSchemes { + NSMutableArray *result = [[NSMutableArray alloc] init]; + for (NSBundle *bundle in [[self class] relevantBundles]) { + NSArray *urlTypes = [bundle objectForInfoDictionaryKey:@"CFBundleURLTypes"]; + for (NSDictionary *urlType in urlTypes) { + [result addObjectsFromArray:urlType[@"CFBundleURLSchemes"]]; + } + } + return result; +} + ++ (BOOL)hasBundleIdentifierPrefix:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles { + for (NSBundle *bundle in bundles) { + if ([bundle.bundleIdentifier isEqualToString:bundleIdentifier]) { + return YES; + } + + if ([GULAppEnvironmentUtil isAppExtension]) { + // A developer could be using the same `FIROptions` for both their app and extension. Since + // extensions have a suffix added to the bundleID, we consider a matching prefix as valid. + NSString *appBundleIDFromExtension = + [self bundleIdentifierByRemovingLastPartFrom:bundle.bundleIdentifier]; + if ([appBundleIDFromExtension isEqualToString:bundleIdentifier]) { + return YES; + } + } + } + return NO; +} + ++ (NSString *)bundleIdentifierByRemovingLastPartFrom:(NSString *)bundleIdentifier { + NSString *bundleIDComponentsSeparator = @"."; + + NSMutableArray *bundleIDComponents = + [[bundleIdentifier componentsSeparatedByString:bundleIDComponentsSeparator] mutableCopy]; + [bundleIDComponents removeLastObject]; + + return [bundleIDComponents componentsJoinedByString:bundleIDComponentsSeparator]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m new file mode 100644 index 00000000..9c1fbed3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m @@ -0,0 +1,65 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Private/FIRComponent.h" + +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" +#import "FirebaseCore/Sources/Private/FIRDependency.h" + +@interface FIRComponent () + +- (instancetype)initWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock; + +@end + +@implementation FIRComponent + ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock { + return [[FIRComponent alloc] initWithProtocol:protocol + instantiationTiming:FIRInstantiationTimingLazy + dependencies:@[] + creationBlock:creationBlock]; +} + ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock { + return [[FIRComponent alloc] initWithProtocol:protocol + instantiationTiming:instantiationTiming + dependencies:dependencies + creationBlock:creationBlock]; +} + +- (instancetype)initWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock { + self = [super init]; + if (self) { + _protocol = protocol; + _instantiationTiming = instantiationTiming; + _dependencies = [dependencies copy]; + _creationBlock = creationBlock; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m new file mode 100644 index 00000000..bbe88782 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m @@ -0,0 +1,214 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" + +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRComponentContainer () + +/// The dictionary of components that are registered for a particular app. The key is an `NSString` +/// of the protocol. +@property(nonatomic, strong) NSMutableDictionary *components; + +/// Cached instances of components that requested to be cached. +@property(nonatomic, strong) NSMutableDictionary *cachedInstances; + +/// Protocols of components that have requested to be eagerly instantiated. +@property(nonatomic, strong, nullable) NSMutableArray *eagerProtocolsToInstantiate; + +@end + +@implementation FIRComponentContainer + +// Collection of all classes that register to provide components. +static NSMutableSet *sFIRComponentRegistrants; + +#pragma mark - Public Registration + ++ (void)registerAsComponentRegistrant:(Class)klass { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sFIRComponentRegistrants = [[NSMutableSet alloc] init]; + }); + + [self registerAsComponentRegistrant:klass inSet:sFIRComponentRegistrants]; +} + ++ (void)registerAsComponentRegistrant:(Class)klass + inSet:(NSMutableSet *)allRegistrants { + [allRegistrants addObject:klass]; +} + +#pragma mark - Internal Initialization + +- (instancetype)initWithApp:(FIRApp *)app { + return [self initWithApp:app registrants:sFIRComponentRegistrants]; +} + +- (instancetype)initWithApp:(FIRApp *)app registrants:(NSMutableSet *)allRegistrants { + self = [super init]; + if (self) { + _app = app; + _cachedInstances = [NSMutableDictionary dictionary]; + _components = [NSMutableDictionary dictionary]; + + [self populateComponentsFromRegisteredClasses:allRegistrants forApp:app]; + } + return self; +} + +- (void)populateComponentsFromRegisteredClasses:(NSSet *)classes forApp:(FIRApp *)app { + // Keep track of any components that need to eagerly instantiate after all components are added. + self.eagerProtocolsToInstantiate = [[NSMutableArray alloc] init]; + + // Loop through the verified component registrants and populate the components array. + for (Class klass in classes) { + // Loop through all the components being registered and store them as appropriate. + // Classes which do not provide functionality should use a dummy FIRComponentRegistrant + // protocol. + for (FIRComponent *component in [klass componentsToRegister]) { + // Check if the component has been registered before, and error out if so. + NSString *protocolName = NSStringFromProtocol(component.protocol); + if (self.components[protocolName]) { + FIRLogError(kFIRLoggerCore, @"I-COR000029", + @"Attempted to register protocol %@, but it already has an implementation.", + protocolName); + continue; + } + + // Store the creation block for later usage. + self.components[protocolName] = component.creationBlock; + + // Queue any protocols that should be eagerly instantiated. Don't instantiate them yet + // because they could depend on other components that haven't been added to the components + // array yet. + BOOL shouldInstantiateEager = + (component.instantiationTiming == FIRInstantiationTimingAlwaysEager); + BOOL shouldInstantiateDefaultEager = + (component.instantiationTiming == FIRInstantiationTimingEagerInDefaultApp && + [app isDefaultApp]); + if (shouldInstantiateEager || shouldInstantiateDefaultEager) { + [self.eagerProtocolsToInstantiate addObject:component.protocol]; + } + } + } +} + +#pragma mark - Instance Creation + +- (void)instantiateEagerComponents { + // After all components are registered, instantiate the ones that are requesting eager + // instantiation. + @synchronized(self) { + for (Protocol *protocol in self.eagerProtocolsToInstantiate) { + // Get an instance for the protocol, which will instantiate it since it couldn't have been + // cached yet. Ignore the instance coming back since we don't need it. + __unused id unusedInstance = [self instanceForProtocol:protocol]; + } + + // All eager instantiation is complete, clear the stored property now. + self.eagerProtocolsToInstantiate = nil; + } +} + +/// Instantiate an instance of a class that conforms to the specified protocol. +/// This will: +/// - Call the block to create an instance if possible, +/// - Validate that the instance returned conforms to the protocol it claims to, +/// - Cache the instance if the block requests it +/// +/// Note that this method assumes the caller already has @sychronized on self. +- (nullable id)instantiateInstanceForProtocol:(Protocol *)protocol + withBlock:(FIRComponentCreationBlock)creationBlock { + if (!creationBlock) { + return nil; + } + + // Create an instance using the creation block. + BOOL shouldCache = NO; + id instance = creationBlock(self, &shouldCache); + if (!instance) { + return nil; + } + + // An instance was created, validate that it conforms to the protocol it claims to. + NSString *protocolName = NSStringFromProtocol(protocol); + if (![instance conformsToProtocol:protocol]) { + FIRLogError(kFIRLoggerCore, @"I-COR000030", + @"An instance conforming to %@ was requested, but the instance provided does not " + @"conform to the protocol", + protocolName); + } + + // The instance is ready to be returned, but check if it should be cached first before returning. + if (shouldCache) { + self.cachedInstances[protocolName] = instance; + } + + return instance; +} + +#pragma mark - Internal Retrieval + +- (nullable id)instanceForProtocol:(Protocol *)protocol { + // Check if there is a cached instance, and return it if so. + NSString *protocolName = NSStringFromProtocol(protocol); + + id cachedInstance; + @synchronized(self) { + cachedInstance = self.cachedInstances[protocolName]; + if (!cachedInstance) { + // Use the creation block to instantiate an instance and return it. + FIRComponentCreationBlock creationBlock = self.components[protocolName]; + cachedInstance = [self instantiateInstanceForProtocol:protocol withBlock:creationBlock]; + } + } + return cachedInstance; +} + +#pragma mark - Lifecycle + +- (void)removeAllCachedInstances { + @synchronized(self) { + // Loop through the cache and notify each instance that is a maintainer to clean up after + // itself. + for (id instance in self.cachedInstances.allValues) { + if ([instance conformsToProtocol:@protocol(FIRComponentLifecycleMaintainer)] && + [instance respondsToSelector:@selector(appWillBeDeleted:)]) { + [instance appWillBeDeleted:self.app]; + } + } + + // Empty the cache. + [self.cachedInstances removeAllObjects]; + } +} + +- (void)removeAllComponents { + @synchronized(self) { + [self.components removeAllObjects]; + } +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainerInternal.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainerInternal.h new file mode 100644 index 00000000..82356060 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainerInternal.h @@ -0,0 +1,49 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRComponentContainer (Private) + +/// Initializes a container for a given app. This should only be called by the app itself. +- (instancetype)initWithApp:(FIRApp *)app; + +/// Retrieves an instance that conforms to the specified protocol. This will return `nil` if the +/// protocol wasn't registered, or if the instance couldn't be instantiated for the provided app. +- (nullable id)instanceForProtocol:(Protocol *)protocol NS_SWIFT_NAME(instance(for:)); + +/// Instantiates all the components that have registered as "eager" after initialization. +- (void)instantiateEagerComponents; + +/// Remove all of the cached instances stored and allow them to clean up after themselves. +- (void)removeAllCachedInstances; + +/// Removes all the components. After calling this method no new instances will be created. +- (void)removeAllComponents; + +/// Register a class to provide components for the interoperability system. The class should conform +/// to `FIRComponentRegistrant` and provide an array of `FIRComponent` objects. ++ (void)registerAsComponentRegistrant:(Class)klass; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m new file mode 100644 index 00000000..9051336a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m @@ -0,0 +1,28 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Private/FIRComponentType.h" + +#import "FirebaseCore/Sources/FIRComponentContainerInternal.h" + +@implementation FIRComponentType + ++ (id)instanceForProtocol:(Protocol *)protocol inContainer:(FIRComponentContainer *)container { + // Forward the call to the container. + return [container instanceForProtocol:protocol]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m new file mode 100644 index 00000000..83b3248c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m @@ -0,0 +1,46 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/FIRConfigurationInternal.h" + +#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h" + +extern void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +@implementation FIRConfiguration + ++ (instancetype)sharedInstance { + static FIRConfiguration *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[FIRConfiguration alloc] init]; + }); + return sharedInstance; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _analyticsConfiguration = [FIRAnalyticsConfiguration sharedInstance]; + } + return self; +} + +- (void)setLoggerLevel:(FIRLoggerLevel)loggerLevel { + NSAssert(loggerLevel <= FIRLoggerLevelMax && loggerLevel >= FIRLoggerLevelMin, + @"Invalid logger level, %ld", (long)loggerLevel); + FIRSetLoggerLevel(loggerLevel); +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfigurationInternal.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfigurationInternal.h new file mode 100644 index 00000000..ee168867 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfigurationInternal.h @@ -0,0 +1,29 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRConfiguration.h" + +@class FIRAnalyticsConfiguration; + +@interface FIRConfiguration () + +/** + * The configuration class for Firebase Analytics. This should be removed once the logic for + * enabling and disabling Analytics is moved to Analytics. + */ +@property(nonatomic, readwrite) FIRAnalyticsConfiguration *analyticsConfiguration; + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRCoreDiagnosticsConnector.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRCoreDiagnosticsConnector.m new file mode 100644 index 00000000..730dd6ef --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRCoreDiagnosticsConnector.m @@ -0,0 +1,61 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h" + +#import "Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h" + +#import "FirebaseCore/Sources/Public/FIROptions.h" + +#import "FirebaseCore/Sources/FIRDiagnosticsData.h" +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" + +// Define the interop class symbol declared as an extern in FIRCoreDiagnosticsInterop. +Class FIRCoreDiagnosticsImplementation; + +@implementation FIRCoreDiagnosticsConnector + ++ (void)initialize { + if (!FIRCoreDiagnosticsImplementation) { + FIRCoreDiagnosticsImplementation = NSClassFromString(@"FIRCoreDiagnostics"); + if (FIRCoreDiagnosticsImplementation) { + NSAssert([FIRCoreDiagnosticsImplementation + conformsToProtocol:@protocol(FIRCoreDiagnosticsInterop)], + @"If FIRCoreDiagnostics is implemented, it must conform to the interop protocol."); + NSAssert( + [FIRCoreDiagnosticsImplementation respondsToSelector:@selector(sendDiagnosticsData:)], + @"If FIRCoreDiagnostics is implemented, it must implement +sendDiagnosticsData."); + } + } +} + ++ (void)logCoreTelemetryWithOptions:(FIROptions *)options { + if (FIRCoreDiagnosticsImplementation) { + FIRDiagnosticsData *diagnosticsData = [[FIRDiagnosticsData alloc] init]; + [diagnosticsData insertValue:@(YES) forKey:kFIRCDIsDataCollectionDefaultEnabledKey]; + [diagnosticsData insertValue:[FIRApp firebaseUserAgent] forKey:kFIRCDFirebaseUserAgentKey]; + [diagnosticsData insertValue:@(FIRConfigTypeCore) forKey:kFIRCDConfigurationTypeKey]; + [diagnosticsData insertValue:options.googleAppID forKey:kFIRCDGoogleAppIDKey]; + [diagnosticsData insertValue:options.bundleID forKey:kFIRCDBundleIDKey]; + [diagnosticsData insertValue:@(options.usingOptionsFromDefaultPlist) + forKey:kFIRCDUsingOptionsFromDefaultPlistKey]; + [diagnosticsData insertValue:options.libraryVersionID forKey:kFIRCDLibraryVersionIDKey]; + [FIRCoreDiagnosticsImplementation sendDiagnosticsData:diagnosticsData]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDependency.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDependency.m new file mode 100644 index 00000000..e1e25783 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDependency.m @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Private/FIRDependency.h" + +@interface FIRDependency () + +- (instancetype)initWithProtocol:(Protocol *)protocol isRequired:(BOOL)required; + +@end + +@implementation FIRDependency + ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol { + return [[self alloc] initWithProtocol:protocol isRequired:YES]; +} + ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol isRequired:(BOOL)required { + return [[self alloc] initWithProtocol:protocol isRequired:required]; +} + +- (instancetype)initWithProtocol:(Protocol *)protocol isRequired:(BOOL)required { + self = [super init]; + if (self) { + _protocol = protocol; + _isRequired = required; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.h new file mode 100644 index 00000000..5b5ff8ad --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h" + +NS_ASSUME_NONNULL_BEGIN + +/** Implements the FIRCoreDiagnosticsData protocol to log diagnostics data. */ +@interface FIRDiagnosticsData : NSObject + +/** Inserts values into the diagnosticObjects dictionary if the value isn't nil. + * + * @param value The value to insert if it's not nil. + * @param key The key to associate it with. + */ +- (void)insertValue:(nullable id)value forKey:(NSString *)key; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.m new file mode 100644 index 00000000..da9489d9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.m @@ -0,0 +1,66 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/FIRDiagnosticsData.h" + +#import "FirebaseCore/Sources/Public/FIRApp.h" + +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" + +@implementation FIRDiagnosticsData { + /** Backing ivar for the diagnosticObjects property. */ + NSMutableDictionary *_diagnosticObjects; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _diagnosticObjects = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (void)insertValue:(nullable id)value forKey:(NSString *)key { + if (key) { + _diagnosticObjects[key] = value; + } +} + +#pragma mark - FIRCoreDiagnosticsData + +- (NSDictionary *)diagnosticObjects { + if (!_diagnosticObjects[kFIRCDllAppsCountKey]) { + _diagnosticObjects[kFIRCDllAppsCountKey] = @([FIRApp allApps].count); + } + if (!_diagnosticObjects[kFIRCDIsDataCollectionDefaultEnabledKey]) { + _diagnosticObjects[kFIRCDIsDataCollectionDefaultEnabledKey] = + @([[FIRApp defaultApp] isDataCollectionDefaultEnabled]); + } + if (!_diagnosticObjects[kFIRCDFirebaseUserAgentKey]) { + _diagnosticObjects[kFIRCDFirebaseUserAgentKey] = [FIRApp firebaseUserAgent]; + } + return _diagnosticObjects; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-parameter" +- (void)setDiagnosticObjects:(NSDictionary *)diagnosticObjects { + NSAssert(NO, @"Please use -insertValue:forKey:"); +} +#pragma clang diagnostic pop + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRErrors.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRErrors.m new file mode 100644 index 00000000..104eeb82 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRErrors.m @@ -0,0 +1,21 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/Private/FIRErrors.h" + +NSString *const kFirebaseErrorDomain = @"com.firebase"; +NSString *const kFirebaseConfigErrorDomain = @"com.firebase.config"; +NSString *const kFirebaseCoreErrorDomain = @"com.firebase.core"; +NSString *const kFirebasePerfErrorDomain = @"com.firebase.perf"; +NSString *const kFirebaseStorageErrorDomain = @"com.firebase.storage"; diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatInfo.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatInfo.m new file mode 100644 index 00000000..277b0f71 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatInfo.m @@ -0,0 +1,61 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h" +#import +#import + +const static long secondsInDay = 86400; +@implementation FIRHeartbeatInfo : NSObject + +/** Updates the storage with the heartbeat information corresponding to this tag. + * @param heartbeatTag Tag which could either be sdk specific tag or the global tag. + * @return Boolean representing whether the heartbeat needs to be sent for this tag or not. + */ ++ (BOOL)updateIfNeededHeartbeatDateForTag:(NSString *)heartbeatTag { + @synchronized(self) { + NSString *const kHeartbeatStorageFile = @"HEARTBEAT_INFO_STORAGE"; + GULHeartbeatDateStorage *dataStorage = + [[GULHeartbeatDateStorage alloc] initWithFileName:kHeartbeatStorageFile]; + NSDate *heartbeatTime = [dataStorage heartbeatDateForTag:heartbeatTag]; + NSDate *currentDate = [NSDate date]; + if (heartbeatTime != nil) { + NSTimeInterval secondsBetween = [currentDate timeIntervalSinceDate:heartbeatTime]; + if (secondsBetween < secondsInDay) { + return false; + } + } + return [dataStorage setHearbeatDate:currentDate forTag:heartbeatTag]; + } +} + ++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag { + NSString *globalTag = @"GLOBAL"; + BOOL isSdkHeartbeatNeeded = [FIRHeartbeatInfo updateIfNeededHeartbeatDateForTag:heartbeatTag]; + BOOL isGlobalHeartbeatNeeded = [FIRHeartbeatInfo updateIfNeededHeartbeatDateForTag:globalTag]; + if (!isSdkHeartbeatNeeded && !isGlobalHeartbeatNeeded) { + // Both sdk and global heartbeat not needed. + return FIRHeartbeatInfoCodeNone; + } else if (isSdkHeartbeatNeeded && !isGlobalHeartbeatNeeded) { + // Only SDK heartbeat needed. + return FIRHeartbeatInfoCodeSDK; + } else if (!isSdkHeartbeatNeeded && isGlobalHeartbeatNeeded) { + // Only global heartbeat needed. + return FIRHeartbeatInfoCodeGlobal; + } else { + // Both sdk and global heartbeat are needed. + return FIRHeartbeatInfoCodeCombined; + } +} +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m new file mode 100644 index 00000000..a749cbd9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m @@ -0,0 +1,179 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/Private/FIRLogger.h" + +#import +#import +#import "FirebaseCore/Sources/Public/FIRLoggerLevel.h" + +#import "FirebaseCore/Sources/FIRVersion.h" + +FIRLoggerService kFIRLoggerCore = @"[Firebase/Core]"; + +// All the FIRLoggerService definitions should be migrated to clients. Do not add new ones! +FIRLoggerService kFIRLoggerABTesting = @"[Firebase/ABTesting]"; +FIRLoggerService kFIRLoggerAdMob = @"[Firebase/AdMob]"; +FIRLoggerService kFIRLoggerAnalytics = @"[Firebase/Analytics]"; +FIRLoggerService kFIRLoggerAuth = @"[Firebase/Auth]"; +FIRLoggerService kFIRLoggerCrash = @"[Firebase/Crash]"; +FIRLoggerService kFIRLoggerMLKit = @"[Firebase/MLKit]"; +FIRLoggerService kFIRLoggerPerf = @"[Firebase/Performance]"; +FIRLoggerService kFIRLoggerRemoteConfig = @"[Firebase/RemoteConfig]"; + +/// Arguments passed on launch. +NSString *const kFIRDisableDebugModeApplicationArgument = @"-FIRDebugDisabled"; +NSString *const kFIREnableDebugModeApplicationArgument = @"-FIRDebugEnabled"; +NSString *const kFIRLoggerForceSDTERRApplicationArgument = @"-FIRLoggerForceSTDERR"; + +/// Key for the debug mode bit in NSUserDefaults. +NSString *const kFIRPersistedDebugModeKey = @"/google/firebase/debug_mode"; + +/// NSUserDefaults that should be used to store and read variables. If nil, `standardUserDefaults` +/// will be used. +static NSUserDefaults *sFIRLoggerUserDefaults; + +static dispatch_once_t sFIRLoggerOnceToken; + +// The sFIRAnalyticsDebugMode flag is here to support the -FIRDebugEnabled/-FIRDebugDisabled +// flags used by Analytics. Users who use those flags expect Analytics to log verbosely, +// while the rest of Firebase logs at the default level. This flag is introduced to support +// that behavior. +static BOOL sFIRAnalyticsDebugMode; + +#ifdef DEBUG +/// The regex pattern for the message code. +static NSString *const kMessageCodePattern = @"^I-[A-Z]{3}[0-9]{6}$"; +static NSRegularExpression *sMessageCodeRegex; +#endif + +void FIRLoggerInitializeASL() { + dispatch_once(&sFIRLoggerOnceToken, ^{ + // Register Firebase Version with GULLogger. + GULLoggerRegisterVersion(FIRVersionString); + + // Override the aslOptions to ASL_OPT_STDERR if the override argument is passed in. + NSArray *arguments = [NSProcessInfo processInfo].arguments; + BOOL overrideSTDERR = [arguments containsObject:kFIRLoggerForceSDTERRApplicationArgument]; + + // Use the standard NSUserDefaults if it hasn't been explicitly set. + if (sFIRLoggerUserDefaults == nil) { + sFIRLoggerUserDefaults = [NSUserDefaults standardUserDefaults]; + } + + BOOL forceDebugMode = NO; + BOOL debugMode = [sFIRLoggerUserDefaults boolForKey:kFIRPersistedDebugModeKey]; + if ([arguments containsObject:kFIRDisableDebugModeApplicationArgument]) { // Default mode + [sFIRLoggerUserDefaults removeObjectForKey:kFIRPersistedDebugModeKey]; + } else if ([arguments containsObject:kFIREnableDebugModeApplicationArgument] || + debugMode) { // Debug mode + [sFIRLoggerUserDefaults setBool:YES forKey:kFIRPersistedDebugModeKey]; + forceDebugMode = YES; + } + GULLoggerInitializeASL(); + if (overrideSTDERR) { + GULLoggerEnableSTDERR(); + } + if (forceDebugMode) { + GULLoggerForceDebug(); + } + }); +} + +__attribute__((no_sanitize("thread"))) void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode) { + sFIRAnalyticsDebugMode = analyticsDebugMode; +} + +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel) { + FIRLoggerInitializeASL(); + GULSetLoggerLevel((GULLoggerLevel)loggerLevel); +} + +#ifdef DEBUG +void FIRResetLogger() { + extern void GULResetLogger(void); + sFIRLoggerOnceToken = 0; + [sFIRLoggerUserDefaults removeObjectForKey:kFIRPersistedDebugModeKey]; + sFIRLoggerUserDefaults = nil; + GULResetLogger(); +} + +void FIRSetLoggerUserDefaults(NSUserDefaults *defaults) { + sFIRLoggerUserDefaults = defaults; +} +#endif + +/** + * Check if the level is high enough to be loggable. + * + * Analytics can override the log level with an intentional race condition. + * Add the attribute to get a clean thread sanitizer run. + */ +__attribute__((no_sanitize("thread"))) BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, + BOOL analyticsComponent) { + FIRLoggerInitializeASL(); + if (sFIRAnalyticsDebugMode && analyticsComponent) { + return YES; + } + return GULIsLoggableLevel((GULLoggerLevel)loggerLevel); +} + +void FIRLogBasic(FIRLoggerLevel level, + FIRLoggerService service, + NSString *messageCode, + NSString *message, + va_list args_ptr) { + FIRLoggerInitializeASL(); + GULLogBasic((GULLoggerLevel)level, service, + sFIRAnalyticsDebugMode && [kFIRLoggerAnalytics isEqualToString:service], messageCode, + message, args_ptr); +} + +/** + * Generates the logging functions using macros. + * + * Calling FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configure %@ failed.", @"blah") shows: + * yyyy-mm-dd hh:mm:ss.SSS sender[PID] [Firebase/Core][I-COR000001] Configure blah failed. + * Calling FIRLogDebug(kFIRLoggerCore, @"I-COR000001", @"Configure succeed.") shows: + * yyyy-mm-dd hh:mm:ss.SSS sender[PID] [Firebase/Core][I-COR000001] Configure succeed. + */ +#define FIR_LOGGING_FUNCTION(level) \ + void FIRLog##level(FIRLoggerService service, NSString *messageCode, NSString *message, ...) { \ + va_list args_ptr; \ + va_start(args_ptr, message); \ + FIRLogBasic(FIRLoggerLevel##level, service, messageCode, message, args_ptr); \ + va_end(args_ptr); \ + } + +FIR_LOGGING_FUNCTION(Error) +FIR_LOGGING_FUNCTION(Warning) +FIR_LOGGING_FUNCTION(Notice) +FIR_LOGGING_FUNCTION(Info) +FIR_LOGGING_FUNCTION(Debug) + +#undef FIR_MAKE_LOGGER + +#pragma mark - FIRLoggerWrapper + +@implementation FIRLoggerWrapper + ++ (void)logWithLevel:(FIRLoggerLevel)level + withService:(FIRLoggerService)service + withCode:(NSString *)messageCode + withMessage:(NSString *)message + withArgs:(va_list)args { + FIRLogBasic(level, service, messageCode, message, args); +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m new file mode 100644 index 00000000..d1853309 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m @@ -0,0 +1,490 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseCore/Sources/FIRBundleUtil.h" +#import "FirebaseCore/Sources/FIRVersion.h" +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" + +// Keys for the strings in the plist file. +NSString *const kFIRAPIKey = @"API_KEY"; +NSString *const kFIRTrackingID = @"TRACKING_ID"; +NSString *const kFIRGoogleAppID = @"GOOGLE_APP_ID"; +NSString *const kFIRClientID = @"CLIENT_ID"; +NSString *const kFIRGCMSenderID = @"GCM_SENDER_ID"; +NSString *const kFIRAndroidClientID = @"ANDROID_CLIENT_ID"; +NSString *const kFIRDatabaseURL = @"DATABASE_URL"; +NSString *const kFIRStorageBucket = @"STORAGE_BUCKET"; +// The key to locate the expected bundle identifier in the plist file. +NSString *const kFIRBundleID = @"BUNDLE_ID"; +// The key to locate the project identifier in the plist file. +NSString *const kFIRProjectID = @"PROJECT_ID"; + +NSString *const kFIRIsMeasurementEnabled = @"IS_MEASUREMENT_ENABLED"; +NSString *const kFIRIsAnalyticsCollectionEnabled = @"FIREBASE_ANALYTICS_COLLECTION_ENABLED"; +NSString *const kFIRIsAnalyticsCollectionDeactivated = @"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED"; + +NSString *const kFIRIsAnalyticsEnabled = @"IS_ANALYTICS_ENABLED"; +NSString *const kFIRIsSignInEnabled = @"IS_SIGNIN_ENABLED"; + +// Library version ID formatted like: +// @"5" // Major version (one or more digits) +// @"04" // Minor version (exactly 2 digits) +// @"01" // Build number (exactly 2 digits) +// @"000"; // Fixed "000" +NSString *kFIRLibraryVersionID; + +// Plist file name. +NSString *const kServiceInfoFileName = @"GoogleService-Info"; +// Plist file type. +NSString *const kServiceInfoFileType = @"plist"; + +// Exception raised from attempting to modify a FIROptions after it's been copied to a FIRApp. +NSString *const kFIRExceptionBadModification = + @"Attempted to modify options after it's set on FIRApp. Please modify all properties before " + @"initializing FIRApp."; + +@interface FIROptions () + +/** + * This property maintains the actual configuration key-value pairs. + */ +@property(nonatomic, readwrite) NSMutableDictionary *optionsDictionary; + +/** + * Calls `analyticsOptionsDictionaryWithInfoDictionary:` using [NSBundle mainBundle].infoDictionary. + * It combines analytics options from both the infoDictionary and the GoogleService-Info.plist. + * Values which are present in the main plist override values from the GoogleService-Info.plist. + */ +@property(nonatomic, readonly) NSDictionary *analyticsOptionsDictionary; + +/** + * Combination of analytics options from both the infoDictionary and the GoogleService-Info.plist. + * Values which are present in the infoDictionary override values from the GoogleService-Info.plist. + */ +- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary; + +/** + * Throw exception if editing is locked when attempting to modify an option. + */ +- (void)checkEditingLocked; + +@end + +@implementation FIROptions { + /// Backing variable for self.analyticsOptionsDictionary. + NSDictionary *_analyticsOptionsDictionary; +} + +static FIROptions *sDefaultOptions = nil; +static NSDictionary *sDefaultOptionsDictionary = nil; + +#pragma mark - Public only for internal class methods + ++ (FIROptions *)defaultOptions { + if (sDefaultOptions != nil) { + return sDefaultOptions; + } + + NSDictionary *defaultOptionsDictionary = [self defaultOptionsDictionary]; + if (defaultOptionsDictionary == nil) { + return nil; + } + + sDefaultOptions = [[FIROptions alloc] initInternalWithOptionsDictionary:defaultOptionsDictionary]; + return sDefaultOptions; +} + +#pragma mark - Private class methods + ++ (NSDictionary *)defaultOptionsDictionary { + if (sDefaultOptionsDictionary != nil) { + return sDefaultOptionsDictionary; + } + NSString *plistFilePath = [FIROptions plistFilePathWithName:kServiceInfoFileName]; + if (plistFilePath == nil) { + return nil; + } + sDefaultOptionsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistFilePath]; + if (sDefaultOptionsDictionary == nil) { + FIRLogError(kFIRLoggerCore, @"I-COR000011", + @"The configuration file is not a dictionary: " + @"'%@.%@'.", + kServiceInfoFileName, kServiceInfoFileType); + } + return sDefaultOptionsDictionary; +} + +// Returns the path of the plist file with a given file name. ++ (NSString *)plistFilePathWithName:(NSString *)fileName { + NSArray *bundles = [FIRBundleUtil relevantBundles]; + NSString *plistFilePath = + [FIRBundleUtil optionsDictionaryPathWithResourceName:fileName + andFileType:kServiceInfoFileType + inBundles:bundles]; + if (plistFilePath == nil) { + FIRLogError(kFIRLoggerCore, @"I-COR000012", @"Could not locate configuration file: '%@.%@'.", + fileName, kServiceInfoFileType); + } + return plistFilePath; +} + ++ (void)resetDefaultOptions { + sDefaultOptions = nil; + sDefaultOptionsDictionary = nil; +} + +#pragma mark - Private instance methods + +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)optionsDictionary { + self = [super init]; + if (self) { + _optionsDictionary = [optionsDictionary mutableCopy]; + _usingOptionsFromDefaultPlist = YES; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + FIROptions *newOptions = [[[self class] allocWithZone:zone] init]; + if (newOptions) { + newOptions.optionsDictionary = self.optionsDictionary; + newOptions.deepLinkURLScheme = self.deepLinkURLScheme; + newOptions.appGroupID = self.appGroupID; + newOptions.editingLocked = self.isEditingLocked; + newOptions.usingOptionsFromDefaultPlist = self.usingOptionsFromDefaultPlist; + } + return newOptions; +} + +#pragma mark - Public instance methods + +- (instancetype)initWithContentsOfFile:(NSString *)plistPath { + self = [super init]; + if (self) { + if (plistPath == nil) { + FIRLogError(kFIRLoggerCore, @"I-COR000013", @"The plist file path is nil."); + return nil; + } + _optionsDictionary = [[NSDictionary dictionaryWithContentsOfFile:plistPath] mutableCopy]; + if (_optionsDictionary == nil) { + FIRLogError(kFIRLoggerCore, @"I-COR000014", + @"The configuration file at %@ does not exist or " + @"is not a well-formed plist file.", + plistPath); + return nil; + } + // TODO: Do we want to validate the dictionary here? It says we do that already in + // the public header. + } + return self; +} + +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID GCMSenderID:(NSString *)GCMSenderID { + self = [super init]; + if (self) { + NSMutableDictionary *mutableOptionsDict = [NSMutableDictionary dictionary]; + [mutableOptionsDict setValue:googleAppID forKey:kFIRGoogleAppID]; + [mutableOptionsDict setValue:GCMSenderID forKey:kFIRGCMSenderID]; + [mutableOptionsDict setValue:[[NSBundle mainBundle] bundleIdentifier] forKey:kFIRBundleID]; + self.optionsDictionary = mutableOptionsDict; + } + return self; +} + +- (NSString *)APIKey { + return self.optionsDictionary[kFIRAPIKey]; +} + +- (void)checkEditingLocked { + if (self.isEditingLocked) { + [NSException raise:kFirebaseCoreErrorDomain format:kFIRExceptionBadModification]; + } +} + +- (void)setAPIKey:(NSString *)APIKey { + [self checkEditingLocked]; + _optionsDictionary[kFIRAPIKey] = [APIKey copy]; +} + +- (NSString *)clientID { + return self.optionsDictionary[kFIRClientID]; +} + +- (void)setClientID:(NSString *)clientID { + [self checkEditingLocked]; + _optionsDictionary[kFIRClientID] = [clientID copy]; +} + +- (NSString *)trackingID { + return self.optionsDictionary[kFIRTrackingID]; +} + +- (void)setTrackingID:(NSString *)trackingID { + [self checkEditingLocked]; + _optionsDictionary[kFIRTrackingID] = [trackingID copy]; +} + +- (NSString *)GCMSenderID { + return self.optionsDictionary[kFIRGCMSenderID]; +} + +- (void)setGCMSenderID:(NSString *)GCMSenderID { + [self checkEditingLocked]; + _optionsDictionary[kFIRGCMSenderID] = [GCMSenderID copy]; +} + +- (NSString *)projectID { + return self.optionsDictionary[kFIRProjectID]; +} + +- (void)setProjectID:(NSString *)projectID { + [self checkEditingLocked]; + _optionsDictionary[kFIRProjectID] = [projectID copy]; +} + +- (NSString *)androidClientID { + return self.optionsDictionary[kFIRAndroidClientID]; +} + +- (void)setAndroidClientID:(NSString *)androidClientID { + [self checkEditingLocked]; + _optionsDictionary[kFIRAndroidClientID] = [androidClientID copy]; +} + +- (NSString *)googleAppID { + return self.optionsDictionary[kFIRGoogleAppID]; +} + +- (void)setGoogleAppID:(NSString *)googleAppID { + [self checkEditingLocked]; + _optionsDictionary[kFIRGoogleAppID] = [googleAppID copy]; +} + +- (NSString *)libraryVersionID { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // The unit tests are set up to catch anything that does not properly convert. + NSString *version = [NSString stringWithUTF8String:FIRCoreVersionString]; + NSArray *components = [version componentsSeparatedByString:@"."]; + NSString *major = [components objectAtIndex:0]; + NSString *minor = [NSString stringWithFormat:@"%02d", [[components objectAtIndex:1] intValue]]; + NSString *patch = [NSString stringWithFormat:@"%02d", [[components objectAtIndex:2] intValue]]; + kFIRLibraryVersionID = [NSString stringWithFormat:@"%@%@%@000", major, minor, patch]; + }); + return kFIRLibraryVersionID; +} + +- (void)setLibraryVersionID:(NSString *)libraryVersionID { + _optionsDictionary[kFIRLibraryVersionID] = [libraryVersionID copy]; +} + +- (NSString *)databaseURL { + return self.optionsDictionary[kFIRDatabaseURL]; +} + +- (void)setDatabaseURL:(NSString *)databaseURL { + [self checkEditingLocked]; + + _optionsDictionary[kFIRDatabaseURL] = [databaseURL copy]; +} + +- (NSString *)storageBucket { + return self.optionsDictionary[kFIRStorageBucket]; +} + +- (void)setStorageBucket:(NSString *)storageBucket { + [self checkEditingLocked]; + _optionsDictionary[kFIRStorageBucket] = [storageBucket copy]; +} + +- (void)setDeepLinkURLScheme:(NSString *)deepLinkURLScheme { + [self checkEditingLocked]; + _deepLinkURLScheme = [deepLinkURLScheme copy]; +} + +- (NSString *)bundleID { + return self.optionsDictionary[kFIRBundleID]; +} + +- (void)setBundleID:(NSString *)bundleID { + [self checkEditingLocked]; + _optionsDictionary[kFIRBundleID] = [bundleID copy]; +} + +- (void)setAppGroupID:(NSString *)appGroupID { + [self checkEditingLocked]; + _appGroupID = [appGroupID copy]; +} + +#pragma mark - Equality + +- (BOOL)isEqual:(id)object { + if (!object || ![object isKindOfClass:[FIROptions class]]) { + return NO; + } + + return [self isEqualToOptions:(FIROptions *)object]; +} + +- (BOOL)isEqualToOptions:(FIROptions *)options { + // Skip any non-FIROptions classes. + if (![options isKindOfClass:[FIROptions class]]) { + return NO; + } + + // Check the internal dictionary and custom properties for differences. + if (![options.optionsDictionary isEqualToDictionary:self.optionsDictionary]) { + return NO; + } + + // Validate extra properties not contained in the dictionary. Only validate it if one of the + // objects has the property set. + if ((options.deepLinkURLScheme != nil || self.deepLinkURLScheme != nil) && + ![options.deepLinkURLScheme isEqualToString:self.deepLinkURLScheme]) { + return NO; + } + + if ((options.appGroupID != nil || self.appGroupID != nil) && + ![options.appGroupID isEqualToString:self.appGroupID]) { + return NO; + } + + // Validate the Analytics options haven't changed with the Info.plist. + if (![options.analyticsOptionsDictionary isEqualToDictionary:self.analyticsOptionsDictionary]) { + return NO; + } + + // We don't care about the `editingLocked` or `usingOptionsFromDefaultPlist` properties since + // those relate to lifecycle and construction, we only care if the contents of the options + // themselves are equal. + return YES; +} + +- (NSUInteger)hash { + // This is strongly recommended for any object that implements a custom `isEqual:` method to + // ensure that dictionary and set behavior matches other `isEqual:` checks. + // Note: `self.analyticsOptionsDictionary` was left out here since it solely relies on the + // contents of the main bundle's `Info.plist`. We should avoid reading that file and the contents + // should be identical. + return self.optionsDictionary.hash ^ self.deepLinkURLScheme.hash ^ self.appGroupID.hash; +} + +#pragma mark - Internal instance methods + +- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary { + if (_analyticsOptionsDictionary == nil) { + NSMutableDictionary *tempAnalyticsOptions = [[NSMutableDictionary alloc] init]; + NSArray *measurementKeys = @[ + kFIRIsMeasurementEnabled, kFIRIsAnalyticsCollectionEnabled, + kFIRIsAnalyticsCollectionDeactivated + ]; + for (NSString *key in measurementKeys) { + id value = infoDictionary[key] ?: self.optionsDictionary[key] ?: nil; + if (!value) { + continue; + } + tempAnalyticsOptions[key] = value; + } + _analyticsOptionsDictionary = tempAnalyticsOptions; + } + return _analyticsOptionsDictionary; +} + +- (NSDictionary *)analyticsOptionsDictionary { + return [self analyticsOptionsDictionaryWithInfoDictionary:[NSBundle mainBundle].infoDictionary]; +} + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. This uses the old plist flag IS_MEASUREMENT_ENABLED, which should still + * be supported. + */ +- (BOOL)isMeasurementEnabled { + if (self.isAnalyticsCollectionDeactivated) { + return NO; + } + NSNumber *value = self.analyticsOptionsDictionary[kFIRIsMeasurementEnabled]; + if (value == nil) { + // TODO: This could probably be cleaned up since FIROptions shouldn't know about FIRApp or have + // to check if it's the default app. The FIROptions instance can't be modified after + // `+configure` is called, so it's not a good place to copy it either in case the flag is + // changed at runtime. + + // If no values are set for Analytics, fall back to the global collection switch in FIRApp. + // Analytics only supports the default FIRApp, so check that first. + if (![FIRApp isDefaultAppConfigured]) { + return NO; + } + + // Fall back to the default app's collection switch when the key is not in the dictionary. + return [FIRApp defaultApp].isDataCollectionDefaultEnabled; + } + return [value boolValue]; +} + +- (BOOL)isAnalyticsCollectionExplicitlySet { + // If it's de-activated, it classifies as explicity set. If not, it's not a good enough indication + // that the developer wants FirebaseAnalytics enabled so continue checking. + if (self.isAnalyticsCollectionDeactivated) { + return YES; + } + + // Check if the current Analytics flag is set. + id collectionEnabledObject = self.analyticsOptionsDictionary[kFIRIsAnalyticsCollectionEnabled]; + if (collectionEnabledObject && [collectionEnabledObject isKindOfClass:[NSNumber class]]) { + // It doesn't matter what the value is, it's explicitly set. + return YES; + } + + // Check if the old measurement flag is set. + id measurementEnabledObject = self.analyticsOptionsDictionary[kFIRIsMeasurementEnabled]; + if (measurementEnabledObject && [measurementEnabledObject isKindOfClass:[NSNumber class]]) { + // It doesn't matter what the value is, it's explicitly set. + return YES; + } + + // No flags are set to explicitly enable or disable FirebaseAnalytics. + return NO; +} + +- (BOOL)isAnalyticsCollectionEnabled { + if (self.isAnalyticsCollectionDeactivated) { + return NO; + } + NSNumber *value = self.analyticsOptionsDictionary[kFIRIsAnalyticsCollectionEnabled]; + if (value == nil) { + return self.isMeasurementEnabled; // Fall back to older plist flag. + } + return [value boolValue]; +} + +- (BOOL)isAnalyticsCollectionDeactivated { + NSNumber *value = self.analyticsOptionsDictionary[kFIRIsAnalyticsCollectionDeactivated]; + if (value == nil) { + return NO; // Analytics Collection is not deactivated when the key is not in the dictionary. + } + return [value boolValue]; +} + +- (BOOL)isAnalyticsEnabled { + return [self.optionsDictionary[kFIRIsAnalyticsEnabled] boolValue]; +} + +- (BOOL)isSignInEnabled { + return [self.optionsDictionary[kFIRIsSignInEnabled] boolValue]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.h new file mode 100644 index 00000000..226efb1a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.h @@ -0,0 +1,23 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** The version of the Firebase SDK. */ +FOUNDATION_EXPORT const char *const FIRVersionString; + +/** The version of the FirebaseCore Component. */ +FOUNDATION_EXPORT const char *const FIRCoreVersionString; diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m new file mode 100644 index 00000000..ec0f6ba6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m @@ -0,0 +1,33 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef Firebase_VERSION +#error "Firebase_VERSION is not defined: add -DFirebase_VERSION=... to the build invocation" +#endif + +#ifndef FIRCore_VERSION +#error "FIRCore_VERSION is not defined: add -DFIRCore_VERSION=... to the build invocation" +#endif + +// The following two macros supply the incantation so that the C +// preprocessor does not try to parse the version as a floating +// point number. See +// https://www.guyrutenberg.com/2008/12/20/expanding-macros-into-string-constants-in-c/ +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x + +const char *const FIRVersionString = (const char *const)STR(Firebase_VERSION); +const char *const FIRCoreVersionString = (const char *const)STR(FIRCore_VERSION); diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppInternal.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppInternal.h new file mode 100644 index 00000000..9a0c943d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppInternal.h @@ -0,0 +1,173 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRApp.h" +#else +#import +#endif + +// The has_include is a workaround so the old IID needed for the FIS tests can find FIRErrors.h +#if __has_include("FirebaseCore/Sources/Private/FIRErrors.h") +#import "FirebaseCore/Sources/Private/FIRErrors.h" +#else +#import +#endif + +@class FIRComponentContainer; +@protocol FIRLibrary; + +/** + * The internal interface to FIRApp. This is meant for first-party integrators, who need to receive + * FIRApp notifications, log info about the success or failure of their configuration, and access + * other internal functionality of FIRApp. + * + * TODO(b/28296561): Restructure this header. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; + +/** + * The format string for the User Defaults key used for storing the data collection enabled flag. + * This includes formatting to append the Firebase App's name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** + * A notification fired containing diagnostic information when SDK errors occur. + */ +extern NSString *const kFIRAppDiagnosticsNotification; + +/** @var FIRAuthStateDidChangeInternalNotification + @brief The name of the @c NSNotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FIRAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FIRAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FIRAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FIRApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FIRAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/* + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * Creates an error for failing to configure a subspec service. This method is called by each + * FIRApp notification listener. + */ ++ (NSError *)errorForSubspecConfigurationFailureWithDomain:(NSString *)domain + errorCode:(FIRErrorCode)code + service:(NSString *)service + reason:(NSString *)reason; +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Used by each SDK to send logs about SDK configuration status to Clearcut. + * + * @note This API is a no-op, please remove calls to it. + */ +- (void)sendLogsWithServiceName:(NSString *)serviceName + version:(NSString *)version + error:(NSError *)error; + +/** + * Can be used by the unit tests in eack SDK to reset FIRApp. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponent.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponent.h new file mode 100644 index 00000000..cb51ee70 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponent.h @@ -0,0 +1,91 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +@class FIRDependency; + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the Component. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// An array of dependencies for the component. +@property(nonatomic, copy, readonly) NSArray *dependencies; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param dependencies - Any dependencies the `implementingClass` has, optional or required. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:dependencies:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainer.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainer.h new file mode 100644 index 00000000..db2bafef --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainer.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponentType.h") +#import "FirebaseCore/Sources/Private/FIRComponentType.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#else +#import +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant:` call. These classes should conform to `FIRComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Unavailable. Use the `container` property on `FIRApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentType.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentType.h new file mode 100644 index 00000000..6f2aca7b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentType.h @@ -0,0 +1,34 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (T)instanceForProtocol:(Protocol *)protocol inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h new file mode 100644 index 00000000..76c0c05f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRDiagnosticsData; +@class FIROptions; + +NS_ASSUME_NONNULL_BEGIN + +/** Connects FIRCore with the CoreDiagnostics library. */ +@interface FIRCoreDiagnosticsConnector : NSObject + +/** Logs FirebaseCore related data. + * + * @param options The options object containing data to log. + */ ++ (void)logCoreTelemetryWithOptions:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDependency.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDependency.h new file mode 100644 index 00000000..46e9b7ea --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDependency.h @@ -0,0 +1,45 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A dependency on a specific protocol's functionality. +NS_SWIFT_NAME(Dependency) +@interface FIRDependency : NSObject + +/// The protocol describing functionality being depended on. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// A flag to specify if the dependency is required or not. +@property(nonatomic, readonly) BOOL isRequired; + +/// Initializes a dependency that is required. Calls `initWithProtocol:isRequired` with `YES` for +/// the required parameter. +/// Creates a required dependency on the specified protocol's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol; + +/// Creates a dependency on the specified protocol's functionality and specify if it's required for +/// the class's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol isRequired:(BOOL)required; + +/// Use `dependencyWithProtocol:isRequired:` instead. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrorCode.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrorCode.h new file mode 100644 index 00000000..c90d9eec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrorCode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** Error codes in Firebase error domain. */ +typedef NS_ENUM(NSInteger, FIRErrorCode) { + /** + * Unknown error. + */ + FIRErrorCodeUnknown = 0, + /** + * Loading data from the GoogleService-Info.plist file failed. This is a fatal error and should + * not be ignored. Further calls to the API will fail and/or possibly cause crashes. + */ + FIRErrorCodeInvalidPlistFile = -100, + + /** + * Validating the Google App ID format failed. + */ + FIRErrorCodeInvalidAppID = -101, + + /** + * Error code for failing to configure a specific service. It's deprecated, but + * still used after copybara. + */ + FIRErrorCodeConfigFailed = -114, +}; diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrors.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrors.h new file mode 100644 index 00000000..19e47328 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrors.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#include "FIRErrorCode.h" + +extern NSString *const kFirebaseErrorDomain; +extern NSString *const kFirebaseConfigErrorDomain; +extern NSString *const kFirebaseCoreErrorDomain; +extern NSString *const kFirebasePerfErrorDomain; diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h new file mode 100644 index 00000000..bfff73e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h @@ -0,0 +1,39 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRHeartbeatInfo : NSObject + +// Enum representing the different heartbeat codes. +typedef NS_ENUM(NSInteger, FIRHeartbeatInfoCode) { + FIRHeartbeatInfoCodeNone = 0, + FIRHeartbeatInfoCodeSDK = 1, + FIRHeartbeatInfoCodeGlobal = 2, + FIRHeartbeatInfoCodeCombined = 3, +}; + +/** + * Get heartbeat code requred for the sdk. + * @param heartbeatTag String representing the sdk heartbeat tag. + * @return Heartbeat code indicating whether or not an sdk/global heartbeat + * needs to be sent + */ ++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLibrary.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLibrary.h new file mode 100644 index 00000000..e7a9e077 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLibrary.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponent.h") +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#else +#import +#endif + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more FIRComponents that will be registered in +/// FIRApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@optional +/// Implement this method if the library needs notifications for lifecycle events. This method is +/// called when the developer calls `FirebaseApp.configure()`. ++ (void)configureWithApp:(FIRApp *)app; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLogger.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLogger.h new file mode 100644 index 00000000..6fd77844 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLogger.h @@ -0,0 +1,156 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRLoggerLevel.h" +#else +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern FIRLoggerService kFIRLoggerABTesting; +extern FIRLoggerService kFIRLoggerAdMob; +extern FIRLoggerService kFIRLoggerAnalytics; +extern FIRLoggerService kFIRLoggerAuth; +extern FIRLoggerService kFIRLoggerCrash; +extern FIRLoggerService kFIRLoggerCore; +extern FIRLoggerService kFIRLoggerMLKit; +extern FIRLoggerService kFIRLoggerPerf; +extern FIRLoggerService kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to YES, the logging level for Analytics will be set to FIRLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Changes the default logging level of FIRLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FIRLoggerLevelNotice if the app is running from App Store. + * (required) log level (one of the FIRLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FIRLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + FIRLoggerService service, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FIRLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +@interface FIRLoggerWrapper : NSObject + +/** + * Objective-C wrapper for FIRLogBasic to allow weak linking to FIRLogger + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ + ++ (void)logWithLevel:(FIRLoggerLevel)level + withService:(FIRLoggerService)service + withCode:(NSString *)messageCode + withMessage:(NSString *)message + withArgs:(va_list)args; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIROptionsInternal.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIROptionsInternal.h new file mode 100644 index 00000000..acaf4586 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIROptionsInternal.h @@ -0,0 +1,119 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIROptions.h" +#else +#import +#endif + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * This header file exposes the initialization of FIROptions to internal use. + */ +@interface FIROptions () + +/** + * resetDefaultOptions and initInternalWithOptionsDictionary: are exposed only for unit tests. + */ ++ (void)resetDefaultOptions; + +/** + * Initializes the options with dictionary. The above strings are the keys of the dictionary. + * This is the designated initializer. + */ +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)serviceInfoDictionary; + +/** + * defaultOptions and defaultOptionsDictionary are exposed in order to be used in FIRApp and + * other first party services. + */ ++ (FIROptions *)defaultOptions; + ++ (NSDictionary *)defaultOptionsDictionary; + +/** + * Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at + * runtime. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet; + +/** + * Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless + * explicitly disabled in GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionEnabled; + +/** + * Whether or not Analytics Collection was completely disabled. If YES, then + * isAnalyticsCollectionEnabled will be NO. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionDeactivated; + +/** + * The version ID of the client library, e.g. @"1100000". + */ +@property(nonatomic, readonly, copy) NSString *libraryVersionID; + +/** + * The flag indicating whether this object was constructed with the values in the default plist + * file. + */ +@property(nonatomic) BOOL usingOptionsFromDefaultPlist; + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isMeasurementEnabled; + +/** + * Whether or not Analytics was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isAnalyticsEnabled; + +/** + * Whether or not SignIn was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isSignInEnabled; + +/** + * Whether or not editing is locked. This should occur after FIROptions has been set on a FIRApp. + */ +@property(nonatomic, getter=isEditingLocked) BOOL editingLocked; + +@end diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FirebaseCoreInternal.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FirebaseCoreInternal.h new file mode 100644 index 00000000..93af6cb8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Private/FirebaseCoreInternal.h @@ -0,0 +1,31 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An umbrella header, for any other libraries in this repo to access Firebase Public and Private +// headers. Any package manager complexity should be handled here. + +#if SWIFT_PACKAGE +@import FirebaseCore; +#else +#import +#endif + +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" +#import "FirebaseCore/Sources/Private/FIRDependency.h" +#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRApp.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRApp.h new file mode 100644 index 00000000..f5578c6a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRApp.h @@ -0,0 +1,127 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIROptions; + +NS_ASSUME_NONNULL_BEGIN + +/** A block that takes a BOOL and has no return value. */ +typedef void (^FIRAppVoidBoolCallback)(BOOL success) NS_SWIFT_NAME(FirebaseAppVoidBoolCallback); + +/** + * The entry point of Firebase SDKs. + * + * Initialize and configure FIRApp using +[FIRApp configure] + * or other customized ways as shown below. + * + * The logging system has two modes: default mode and debug mode. In default mode, only logs with + * log level Notice, Warning and Error will be sent to device. In debug mode, all logs will be sent + * to device. The log levels that Firebase uses are consistent with the ASL log levels. + * + * Enable debug mode by passing the -FIRDebugEnabled argument to the application. You can add this + * argument in the application's Xcode scheme. When debug mode is enabled via -FIRDebugEnabled, + * further executions of the application will also be in debug mode. In order to return to default + * mode, you must explicitly disable the debug mode with the application argument -FIRDebugDisabled. + * + * It is also possible to change the default logging level in code by calling setLoggerLevel: on + * the FIRConfiguration interface. + */ +NS_SWIFT_NAME(FirebaseApp) +@interface FIRApp : NSObject + +/** + * Configures a default Firebase app. Raises an exception if any configuration step fails. The + * default app is named "__FIRAPP_DEFAULT". This method should be called after the app is launched + * and before using Firebase services. This method should be called from the main thread and + * contains synchronous file I/O (reading GoogleService-Info.plist from disk). + */ ++ (void)configure; + +/** + * Configures the default Firebase app with the provided options. The default app is named + * "__FIRAPP_DEFAULT". Raises an exception if any configuration step fails. This method should be + * called from the main thread. + * + * @param options The Firebase application options used to configure the service. + */ ++ (void)configureWithOptions:(FIROptions *)options NS_SWIFT_NAME(configure(options:)); + +/** + * Configures a Firebase app with the given name and options. Raises an exception if any + * configuration step fails. This method should be called from the main thread. + * + * @param name The application's name given by the developer. The name should should only contain + Letters, Numbers and Underscore. + * @param options The Firebase application options used to configure the services. + */ +// clang-format off ++ (void)configureWithName:(NSString *)name + options:(FIROptions *)options NS_SWIFT_NAME(configure(name:options:)); +// clang-format on + +/** + * Returns the default app, or nil if the default app does not exist. + */ ++ (nullable FIRApp *)defaultApp NS_SWIFT_NAME(app()); + +/** + * Returns a previously created FIRApp instance with the given name, or nil if no such app exists. + * This method is thread safe. + */ ++ (nullable FIRApp *)appNamed:(NSString *)name NS_SWIFT_NAME(app(name:)); + +/** + * Returns the set of all extant FIRApp instances, or nil if there are no FIRApp instances. This + * method is thread safe. + */ +@property(class, readonly, nullable) NSDictionary *allApps; + +/** + * Cleans up the current FIRApp, freeing associated data and returning its name to the pool for + * future use. This method is thread safe. + */ +- (void)deleteApp:(FIRAppVoidBoolCallback)completion; + +/** + * FIRApp instances should not be initialized directly. Call +[FIRApp configure], + * +[FIRApp configureWithOptions:], or +[FIRApp configureWithNames:options:] directly. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Gets the name of this app. + */ +@property(nonatomic, copy, readonly) NSString *name; + +/** + * Gets a copy of the options for this app. These are non-modifiable. + */ +@property(nonatomic, copy, readonly) FIROptions *options; + +/** + * Gets or sets whether automatic data collection is enabled for all products. Defaults to `YES` + * unless `FirebaseDataCollectionDefaultEnabled` is set to `NO` in your app's Info.plist. This value + * is persisted across runs of the app so that it can be set once when users have consented to + * collection. + */ +@property(nonatomic, readwrite, getter=isDataCollectionDefaultEnabled) + BOOL dataCollectionDefaultEnabled; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRConfiguration.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRConfiguration.h new file mode 100644 index 00000000..2b8e678c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRConfiguration.h @@ -0,0 +1,45 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRLoggerLevel.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * This interface provides global level properties that the developer can tweak. + */ +NS_SWIFT_NAME(FirebaseConfiguration) +@interface FIRConfiguration : NSObject + +/** Returns the shared configuration object. */ +@property(class, nonatomic, readonly) FIRConfiguration *sharedInstance NS_SWIFT_NAME(shared); + +/** + * Sets the logging level for internal Firebase logging. Firebase will only log messages + * that are logged at or below loggerLevel. The messages are logged both to the Xcode + * console and to the device's log. Note that if an app is running from AppStore, it will + * never log above FIRLoggerLevelNotice even if loggerLevel is set to a higher (more verbose) + * setting. + * + * @param loggerLevel The maximum logging level. The default level is set to FIRLoggerLevelNotice. + */ +- (void)setLoggerLevel:(FIRLoggerLevel)loggerLevel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRLoggerLevel.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRLoggerLevel.h new file mode 100644 index 00000000..dca3aa0b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRLoggerLevel.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Note that importing GULLoggerLevel.h will lead to a non-modular header +// import error. + +/** + * The log levels used by internal logging. + */ +typedef NS_ENUM(NSInteger, FIRLoggerLevel) { + /** Error level, matches ASL_LEVEL_ERR. */ + FIRLoggerLevelError = 3, + /** Warning level, matches ASL_LEVEL_WARNING. */ + FIRLoggerLevelWarning = 4, + /** Notice level, matches ASL_LEVEL_NOTICE. */ + FIRLoggerLevelNotice = 5, + /** Info level, matches ASL_LEVEL_INFO. */ + FIRLoggerLevelInfo = 6, + /** Debug level, matches ASL_LEVEL_DEBUG. */ + FIRLoggerLevelDebug = 7, + /** Minimum log level. */ + FIRLoggerLevelMin = FIRLoggerLevelError, + /** Maximum log level. */ + FIRLoggerLevelMax = FIRLoggerLevelDebug +} NS_SWIFT_NAME(FirebaseLoggerLevel); diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIROptions.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIROptions.h new file mode 100644 index 00000000..67fbe5ba --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIROptions.h @@ -0,0 +1,123 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class provides constant fields of Google APIs. + */ +NS_SWIFT_NAME(FirebaseOptions) +@interface FIROptions : NSObject + +/** + * Returns the default options. The first time this is called it synchronously reads + * GoogleService-Info.plist from disk. + */ ++ (nullable FIROptions *)defaultOptions NS_SWIFT_NAME(defaultOptions()); + +/** + * An iOS API key used for authenticating requests from your app, e.g. + * @"AIzaSyDdVgKwhZl0sTTTLZ7iTmt1r3N2cJLnaDk", used to identify your app to Google servers. + */ +@property(nonatomic, copy, nullable) NSString *APIKey NS_SWIFT_NAME(apiKey); + +/** + * The bundle ID for the application. Defaults to `[[NSBundle mainBundle] bundleID]` when not set + * manually or in a plist. + */ +@property(nonatomic, copy) NSString *bundleID; + +/** + * The OAuth2 client ID for iOS application used to authenticate Google users, for example + * @"12345.apps.googleusercontent.com", used for signing in with Google. + */ +@property(nonatomic, copy, nullable) NSString *clientID; + +/** + * The tracking ID for Google Analytics, e.g. @"UA-12345678-1", used to configure Google Analytics. + */ +@property(nonatomic, copy, nullable) NSString *trackingID; + +/** + * The Project Number from the Google Developer's console, for example @"012345678901", used to + * configure Google Cloud Messaging. + */ +@property(nonatomic, copy) NSString *GCMSenderID NS_SWIFT_NAME(gcmSenderID); + +/** + * The Project ID from the Firebase console, for example @"abc-xyz-123". + */ +@property(nonatomic, copy, nullable) NSString *projectID; + +/** + * The Android client ID used in Google AppInvite when an iOS app has its Android version, for + * example @"12345.apps.googleusercontent.com". + */ +@property(nonatomic, copy, nullable) NSString *androidClientID; + +/** + * The Google App ID that is used to uniquely identify an instance of an app. + */ +@property(nonatomic, copy) NSString *googleAppID; + +/** + * The database root URL, e.g. @"http://abc-xyz-123.firebaseio.com". + */ +@property(nonatomic, copy, nullable) NSString *databaseURL; + +/** + * The URL scheme used to set up Durable Deep Link service. + */ +@property(nonatomic, copy, nullable) NSString *deepLinkURLScheme; + +/** + * The Google Cloud Storage bucket name, e.g. @"abc-xyz-123.storage.firebase.com". + */ +@property(nonatomic, copy, nullable) NSString *storageBucket; + +/** + * The App Group identifier to share data between the application and the application extensions. + * The App Group must be configured in the application and on the Apple Developer Portal. Default + * value `nil`. + */ +@property(nonatomic, copy, nullable) NSString *appGroupID; + +/** + * Initializes a customized instance of FIROptions from the file at the given plist file path. This + * will read the file synchronously from disk. + * For example, + * NSString *filePath = + * [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"]; + * FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath]; + * Returns nil if the plist file does not exist or is invalid. + */ +- (nullable instancetype)initWithContentsOfFile:(NSString *)plistPath; + +/** + * Initializes a customized instance of FIROptions with required fields. Use the mutable properties + * to modify fields for configuring specific services. + */ +// clang-format off +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + GCMSenderID:(NSString *)GCMSenderID + NS_SWIFT_NAME(init(googleAppID:gcmSenderID:)); +// clang-format on + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore.h b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore.h new file mode 100644 index 00000000..95119aed --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore.h @@ -0,0 +1,20 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRApp.h" +#import "FIRConfiguration.h" +#import "FIRLoggerLevel.h" +#import "FIROptions.h" diff --git a/MyExperiences copy/Pods/FirebaseCore/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h b/MyExperiences copy/Pods/FirebaseCore/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h new file mode 100644 index 00000000..69c40721 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h @@ -0,0 +1,61 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** If present, is a BOOL wrapped in an NSNumber. */ +#define kFIRCDIsDataCollectionDefaultEnabledKey @"FIRCDIsDataCollectionDefaultEnabledKey" + +/** If present, is an int32_t wrapped in an NSNumber. */ +#define kFIRCDConfigurationTypeKey @"FIRCDConfigurationTypeKey" + +/** If present, is an NSString. */ +#define kFIRCDSdkNameKey @"FIRCDSdkNameKey" + +/** If present, is an NSString. */ +#define kFIRCDSdkVersionKey @"FIRCDSdkVersionKey" + +/** If present, is an int32_t wrapped in an NSNumber. */ +#define kFIRCDllAppsCountKey @"FIRCDllAppsCountKey" + +/** If present, is an NSString. */ +#define kFIRCDGoogleAppIDKey @"FIRCDGoogleAppIDKey" + +/** If present, is an NSString. */ +#define kFIRCDBundleIDKey @"FIRCDBundleID" + +/** If present, is a BOOL wrapped in an NSNumber. */ +#define kFIRCDUsingOptionsFromDefaultPlistKey @"FIRCDUsingOptionsFromDefaultPlistKey" + +/** If present, is an NSString. */ +#define kFIRCDLibraryVersionIDKey @"FIRCDLibraryVersionIDKey" + +/** If present, is an NSString. */ +#define kFIRCDFirebaseUserAgentKey @"FIRCDFirebaseUserAgentKey" + +/** Defines the interface of a data object needed to log diagnostics data. */ +@protocol FIRCoreDiagnosticsData + +@required + +/** A dictionary containing data (non-exhaustive) to be logged in diagnostics. */ +@property(nonatomic) NSDictionary *diagnosticObjects; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h b/MyExperiences copy/Pods/FirebaseCore/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h new file mode 100644 index 00000000..2b0eb710 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h @@ -0,0 +1,34 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRCoreDiagnosticsData.h" + +NS_ASSUME_NONNULL_BEGIN + +/** Allows the interoperation of FirebaseCore and FirebaseCoreDiagnostics. */ +@protocol FIRCoreDiagnosticsInterop + +/** Sends the given diagnostics data. + * + * @param diagnosticsData The diagnostics data object to send. + */ ++ (void)sendDiagnosticsData:(id)diagnosticsData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCore/LICENSE b/MyExperiences copy/Pods/FirebaseCore/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/FirebaseCore/README.md b/MyExperiences copy/Pods/FirebaseCore/README.md new file mode 100644 index 00000000..d778205f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCore/README.md @@ -0,0 +1,311 @@ +[![Version](https://img.shields.io/cocoapods/v/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) + +[![Actions Status][gh-abtesting-badge]][gh-actions] +[![Actions Status][gh-auth-badge]][gh-actions] +[![Actions Status][gh-core-badge]][gh-actions] +[![Actions Status][gh-crashlytics-badge]][gh-actions] +[![Actions Status][gh-database-badge]][gh-actions] +[![Actions Status][gh-datatransport-badge]][gh-actions] +[![Actions Status][gh-dynamiclinks-badge]][gh-actions] +[![Actions Status][gh-firebasepod-badge]][gh-actions] +[![Actions Status][gh-firestore-badge]][gh-actions] +[![Actions Status][gh-functions-badge]][gh-actions] +[![Actions Status][gh-inappmessaging-badge]][gh-actions] +[![Actions Status][gh-interop-badge]][gh-actions] +[![Actions Status][gh-messaging-badge]][gh-actions] +[![Actions Status][gh-remoteconfig-badge]][gh-actions] +[![Actions Status][gh-storage-badge]][gh-actions] +[![Actions Status][gh-symbolcollision-badge]][gh-actions] +[![Actions Status][gh-zip-badge]][gh-actions] +[![Travis](https://travis-ci.org/firebase/firebase-ios-sdk.svg?branch=master)](https://travis-ci.org/firebase/firebase-ios-sdk) + +# Firebase Apple Open Source Development + +This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics, +FirebasePerformance, and FirebaseML. + +The repository also includes GoogleUtilities source. The +[GoogleUtilities](GoogleUtilities/README.md) pod is +a set of utilities used by Firebase and other Google products. + +Firebase is an app development platform with tools to help you build, grow and +monetize your app. More information about Firebase can be found at +[https://firebase.google.com](https://firebase.google.com). + +## Installation + +See the three subsections for details about three different installation methods. +1. [Standard pod install](README.md#standard-pod-install) +1. [Installing from the GitHub repo](README.md#installing-from-github) +1. [Experimental Carthage](README.md#carthage-ios-only) + +### Standard pod install + +Go to +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Installing from GitHub + +For releases starting with 5.0.0, the source for each release is also deployed +to CocoaPods master and available via standard +[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod). + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See +[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All of the official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +``` +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +``` + +To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do: + +``` +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution are at +[Carthage](Carthage.md). + +### Rome + +Instructions for installing binary frameworks via +[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md). + +### Using Firebase from a Framework or a library + +[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md) + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + + * Xcode 10.3 (or later) + * CocoaPods 1.7.2 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self contained Xcode project. See +[Firestore/README.md](Firestore/README.md). + +### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +### Adding a New Firebase Pod + +See [AddNewPod.md](AddNewPod.md). + +### Managing Headers and Imports + +See [HeadersImports.md](HeadersImports.md). + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh) +before creating a PR. + +Travis will verify that any code changes are done in a style compliant way. Install +`clang-format` and `swiftformat`. +These commands will get the right versions: + +``` +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb +``` + +Note: if you already have a newer version of these installed you may need to +`brew switch` to this version. + +To update this section, find the versions of clang-format and swiftformat.rb to +match the versions in the CI failure logs +[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula). + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +#### Viewing Code Coverage (Deprecated) + +First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`. + +After running the `AllUnitTests_iOS` scheme in Xcode, execute +`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output` +at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results. + +### Running Sample Apps +In order to run the sample apps and integration tests, you'll need valid +`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist +files without real values, but can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g. `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file +(e.g. in [Example/Database/App/](Example/Database/App/)); + +Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require +special Apple capabilities, and you will have to change the sample app to use a unique bundle +identifier that you can control in your own Apple Developer account. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase Auth + +If you're doing specific Firebase Auth development, see +[the Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to +`Example/Database/App/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[FIRStorageIntegrationTests.m](FirebaseStorage/Tests/Integration/FIRStorageIntegrationTests.m). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to actually test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account, and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications, and will not receive push notifications. +In order to receive push notifications, you'll have to follow the steps above and run the app on a +physical device. + +## Community Supported Efforts + +We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are +very grateful! We'd like to empower as many developers as we can to be able to use Firebase and +participate in the Firebase community. + +### tvOS, macOS, watchOS and Catalyst +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on +tvOS, macOS, watchOS and Catalyst. + +For tvOS, checkout the [Sample](Example/tvOSSample). +For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the +[Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this +repository is actively developed primarily for iOS. While we can catch basic unit test issues with +Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you +encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the app +has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +To install, add a subset of the following to the Podfile: + +``` +pod 'Firebase/ABTesting' # No watchOS support yet +pod 'Firebase/Auth' # No watchOS support yet +pod 'Firebase/Crashlytics' # No watchOS support yet +pod 'Firebase/Database' # No watchOS support yet +pod 'Firebase/Firestore' # No watchOS support yet +pod 'Firebase/Functions' # No watchOS support yet +pod 'Firebase/Messaging' +pod 'Firebase/RemoteConfig' # No watchOS support yet +pod 'Firebase/Storage' +``` + +#### Additional Catalyst Notes + +* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability` +to Build Settings. +* FirebaseFirestore requires signing the +[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +iOS SDK. + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg +[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg +[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg +[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg +[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg +[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg +[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg +[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg +[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg +[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg +[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg +[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg +[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg +[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg +[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg +[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg diff --git a/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/FIRCoreDiagnostics.m b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/FIRCoreDiagnostics.m new file mode 100644 index 00000000..2db7db83 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/FIRCoreDiagnostics.m @@ -0,0 +1,647 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#include + +#import +#import +#import +#import + +#import +#import +#import + +#import "Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h" +#import "Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h" + +#import +#import +#import + +#import "FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h" + +/** The logger service string to use when printing to the console. */ +static GULLoggerService kFIRCoreDiagnostics = @"[FirebaseCoreDiagnostics/FIRCoreDiagnostics]"; + +#ifdef FIREBASE_BUILD_ZIP_FILE +static BOOL kUsingZipFile = YES; +#else // FIREBASE_BUILD_ZIP_FILE +static BOOL kUsingZipFile = NO; +#endif // FIREBASE_BUILD_ZIP_FILE + +#ifdef FIREBASE_BUILD_CARTHAGE +#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_CARTHAGE +#elif FIREBASE_BUILD_ZIP_FILE +#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ZIP_FILE +#else +#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_COCOAPODS +#endif + +static NSString *const kFIRServiceMLVisionOnDeviceAutoML = @"MLVisionOnDeviceAutoML"; +static NSString *const kFIRServiceMLVisionOnDeviceFace = @"MLVisionOnDeviceFace"; +static NSString *const kFIRServiceMLVisionOnDeviceBarcode = @"MLVisionOnDeviceBarcode"; +static NSString *const kFIRServiceMLVisionOnDeviceText = @"MLVisionOnDeviceText"; +static NSString *const kFIRServiceMLVisionOnDeviceLabel = @"MLVisionOnDeviceLabel"; +static NSString *const kFIRServiceMLVisionOnDeviceObjectDetection = + @"MLVisionOnDeviceObjectDetection"; +static NSString *const kFIRServiceMLModelInterpreter = @"MLModelInterpreter"; + +static NSString *const kFIRServiceAdMob = @"AdMob"; +static NSString *const kFIRServiceAuth = @"Auth"; +static NSString *const kFIRServiceAuthUI = @"AuthUI"; +static NSString *const kFIRServiceCrash = @"Crash"; +static NSString *const kFIRServiceDatabase = @"Database"; +static NSString *const kFIRServiceDynamicLinks = @"DynamicLinks"; +static NSString *const kFIRServiceFirestore = @"Firestore"; +static NSString *const kFIRServiceFunctions = @"Functions"; +static NSString *const kFIRServiceIAM = @"InAppMessaging"; +static NSString *const kFIRServiceInstanceID = @"InstanceID"; +static NSString *const kFIRServiceInvites = @"Invites"; +static NSString *const kFIRServiceMessaging = @"Messaging"; +static NSString *const kFIRServiceMeasurement = @"Measurement"; +static NSString *const kFIRServicePerformance = @"Performance"; +static NSString *const kFIRServiceRemoteConfig = @"RemoteConfig"; +static NSString *const kFIRServiceStorage = @"Storage"; +static NSString *const kGGLServiceAnalytics = @"Analytics"; +static NSString *const kGGLServiceSignIn = @"SignIn"; +static NSString *const kFIRAppDiagnosticsConfigurationTypeKey = + @"FIRAppDiagnosticsConfigurationTypeKey"; +static NSString *const kFIRAppDiagnosticsFIRAppKey = @"FIRAppDiagnosticsFIRAppKey"; +static NSString *const kFIRAppDiagnosticsSDKNameKey = @"FIRAppDiagnosticsSDKNameKey"; +static NSString *const kFIRAppDiagnosticsSDKVersionKey = @"FIRAppDiagnosticsSDKVersionKey"; +static NSString *const kFIRCoreDiagnosticsHeartbeatTag = @"FIRCoreDiagnostics"; + +/** + * The file name to the recent heartbeat date. + */ +NSString *const kFIRCoreDiagnosticsHeartbeatDateFileName = @"FIREBASE_DIAGNOSTICS_HEARTBEAT_DATE"; + +/** + * @note This should implement the GDTCOREventDataObject protocol, but can't because of + * weak-linking. + */ +@interface FIRCoreDiagnosticsLog : NSObject + +/** The config that will be converted to proto bytes. */ +@property(nonatomic) logs_proto_mobilesdk_ios_ICoreConfiguration config; + +@end + +@implementation FIRCoreDiagnosticsLog + +- (instancetype)initWithConfig:(logs_proto_mobilesdk_ios_ICoreConfiguration)config { + self = [super init]; + if (self) { + _config = config; + } + return self; +} + +// Provided and required by the GDTCOREventDataObject protocol. +- (NSData *)transportBytes { + pb_ostream_t sizestream = PB_OSTREAM_SIZING; + + // Encode 1 time to determine the size. + if (!pb_encode(&sizestream, logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config)) { + GDTCORLogError(GDTCORMCETransportBytesError, @"Error in nanopb encoding for size: %s", + PB_GET_ERROR(&sizestream)); + } + + // Encode a 2nd time to actually get the bytes from it. + size_t bufferSize = sizestream.bytes_written; + CFMutableDataRef dataRef = CFDataCreateMutable(CFAllocatorGetDefault(), bufferSize); + CFDataSetLength(dataRef, bufferSize); + pb_ostream_t ostream = pb_ostream_from_buffer((void *)CFDataGetBytePtr(dataRef), bufferSize); + if (!pb_encode(&ostream, logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config)) { + GDTCORLogError(GDTCORMCETransportBytesError, @"Error in nanopb encoding for bytes: %s", + PB_GET_ERROR(&ostream)); + } + CFDataSetLength(dataRef, ostream.bytes_written); + + return CFBridgingRelease(dataRef); +} + +- (void)dealloc { + pb_release(logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config); +} + +@end + +NS_ASSUME_NONNULL_BEGIN + +/** This class produces a protobuf containing diagnostics and usage data to be logged. */ +@interface FIRCoreDiagnostics : NSObject + +/** The queue on which all diagnostics collection will occur. */ +@property(nonatomic, readonly) dispatch_queue_t diagnosticsQueue; + +/** The transport object used to send data. */ +@property(nonatomic, readonly) GDTCORTransport *transport; + +/** The storage to store the date of the last sent heartbeat. */ +@property(nonatomic, readonly) GULHeartbeatDateStorage *heartbeatDateStorage; + +@end + +NS_ASSUME_NONNULL_END + +@implementation FIRCoreDiagnostics + ++ (instancetype)sharedInstance { + static FIRCoreDiagnostics *sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[FIRCoreDiagnostics alloc] init]; + }); + return sharedInstance; +} + +- (instancetype)init { + GDTCORTransport *transport = [[GDTCORTransport alloc] initWithMappingID:@"137" + transformers:nil + target:kGDTCORTargetFLL]; + + GULHeartbeatDateStorage *dateStorage = + [[GULHeartbeatDateStorage alloc] initWithFileName:kFIRCoreDiagnosticsHeartbeatDateFileName]; + + return [self initWithTransport:transport heartbeatDateStorage:dateStorage]; +} + +/** Initializer for unit tests. + * + * @param transport A `GDTCORTransport` instance which that be used to send event. + * @param heartbeatDateStorage An instanse of date storage to track heartbeat sending. + * @return Returns the initialized `FIRCoreDiagnostics` instance. + */ +- (instancetype)initWithTransport:(GDTCORTransport *)transport + heartbeatDateStorage:(GULHeartbeatDateStorage *)heartbeatDateStorage { + self = [super init]; + if (self) { + _diagnosticsQueue = + dispatch_queue_create("com.google.FIRCoreDiagnostics", DISPATCH_QUEUE_SERIAL); + _transport = transport; + _heartbeatDateStorage = heartbeatDateStorage; + } + return self; +} + +#pragma mark - Metadata helpers + +/** Returns the model of iOS device. Sample platform strings are @"iPhone7,1" for iPhone 6 Plus, + * @"iPhone7,2" for iPhone 6, etc. Refer to the Hardware strings at + * https://en.wikipedia.org/wiki/List_of_iOS_devices + * + * @return The device model as an NSString. + */ ++ (NSString *)deviceModel { + static NSString *deviceModel = nil; + if (deviceModel == nil) { + struct utsname systemInfo; + uname(&systemInfo); + deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; + } + return deviceModel; +} + +#pragma mark - nanopb helper functions + +/** Callocs a pb_bytes_array and copies the given NSString's bytes into the bytes array. + * + * @note Memory needs to be free manually, through pb_free or pb_release. + * @param string The string to encode as pb_bytes. + */ +pb_bytes_array_t *FIREncodeString(NSString *string) { + NSData *stringBytes = [string dataUsingEncoding:NSUTF8StringEncoding]; + return FIREncodeData(stringBytes); +} + +/** Callocs a pb_bytes_array and copies the given NSData bytes into the bytes array. + * + * @note Memory needs to be free manually, through pb_free or pb_release. + * @param data The data to copy into the new bytes array. + */ +pb_bytes_array_t *FIREncodeData(NSData *data) { + pb_bytes_array_t *pbBytesArray = calloc(1, PB_BYTES_ARRAY_T_ALLOCSIZE(data.length)); + if (pbBytesArray != NULL) { + [data getBytes:pbBytesArray->bytes length:data.length]; + pbBytesArray->size = (pb_size_t)data.length; + } + return pbBytesArray; +} + +/** Maps a service string to the representative nanopb enum. + * + * @param serviceString The SDK service string to convert. + * @return The representative nanopb enum. + */ +logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType FIRMapFromServiceStringToTypeEnum( + NSString *serviceString) { + static NSDictionary *serviceStringToTypeEnum; + if (serviceStringToTypeEnum == nil) { + serviceStringToTypeEnum = @{ + kFIRServiceAdMob : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ADMOB), + kFIRServiceMessaging : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MESSAGING), + kFIRServiceMeasurement : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MEASUREMENT), + kFIRServiceRemoteConfig : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_REMOTE_CONFIG), + kFIRServiceDatabase : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DATABASE), + kFIRServiceDynamicLinks : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DYNAMIC_LINKS), + kFIRServiceAuth : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH), + kFIRServiceAuthUI : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH_UI), + kFIRServiceFirestore : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FIRESTORE), + kFIRServiceFunctions : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FUNCTIONS), + kFIRServicePerformance : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_PERFORMANCE), + kFIRServiceStorage : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_STORAGE), + kFIRServiceMLVisionOnDeviceAutoML : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_AUTOML), + kFIRServiceMLVisionOnDeviceFace : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_FACE), + kFIRServiceMLVisionOnDeviceBarcode : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_BARCODE), + kFIRServiceMLVisionOnDeviceText : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_TEXT), + kFIRServiceMLVisionOnDeviceLabel : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_LABEL), + kFIRServiceMLVisionOnDeviceObjectDetection : @( + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION), + kFIRServiceMLModelInterpreter : + @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_MODEL_INTERPRETER), + kGGLServiceAnalytics : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ANALYTICS), + kGGLServiceSignIn : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SIGN_IN), + kFIRServiceIAM : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_IN_APP_MESSAGING), + }; + } + if (serviceStringToTypeEnum[serviceString] != nil) { + return (int32_t)serviceStringToTypeEnum[serviceString].longLongValue; + } + return logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE; +} + +#pragma mark - Proto population functions + +/** Populates the given proto with data related to an SDK logDiagnostics call from the + * diagnosticObjects dictionary. + * + * @param config The proto to populate + * @param diagnosticObjects The dictionary of diagnostics objects. + */ +void FIRPopulateProtoWithInfoFromUserInfoParams(logs_proto_mobilesdk_ios_ICoreConfiguration *config, + NSDictionary *diagnosticObjects) { + NSNumber *configurationType = diagnosticObjects[kFIRCDConfigurationTypeKey]; + if (configurationType != nil) { + switch (configurationType.integerValue) { + case logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE: + config->configuration_type = + logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE; + config->has_configuration_type = 1; + break; + case logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK: + config->configuration_type = + logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK; + config->has_configuration_type = 1; + break; + default: + break; + } + } + + NSString *sdkName = diagnosticObjects[kFIRCDSdkNameKey]; + if (sdkName) { + config->sdk_name = FIRMapFromServiceStringToTypeEnum(sdkName); + config->has_sdk_name = 1; + } + + NSString *version = diagnosticObjects[kFIRCDSdkVersionKey]; + if (version) { + config->sdk_version = FIREncodeString(version); + } +} + +/** Populates the given proto with data from the calling FIRApp using the given + * diagnosticObjects dictionary. + * + * @param config The proto to populate + * @param diagnosticObjects The dictionary of diagnostics objects. + */ +void FIRPopulateProtoWithCommonInfoFromApp(logs_proto_mobilesdk_ios_ICoreConfiguration *config, + NSDictionary *diagnosticObjects) { + config->pod_name = logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE; + config->has_pod_name = 1; + + if (!diagnosticObjects[kFIRCDllAppsCountKey]) { + GDTCORLogError(GDTCORMCEGeneralError, @"%@", + @"App count is a required value in the data dict."); + } + config->app_count = (int32_t)[diagnosticObjects[kFIRCDllAppsCountKey] integerValue]; + config->has_app_count = 1; + + NSString *googleAppID = diagnosticObjects[kFIRCDGoogleAppIDKey]; + if (googleAppID.length) { + config->app_id = FIREncodeString(googleAppID); + } + + NSString *bundleID = diagnosticObjects[kFIRCDBundleIDKey]; + if (bundleID.length) { + config->bundle_id = FIREncodeString(bundleID); + } + + NSString *firebaseUserAgent = diagnosticObjects[kFIRCDFirebaseUserAgentKey]; + if (firebaseUserAgent.length) { + config->platform_info = FIREncodeString(firebaseUserAgent); + } + + NSNumber *usingOptionsFromDefaultPlist = diagnosticObjects[kFIRCDUsingOptionsFromDefaultPlistKey]; + if (usingOptionsFromDefaultPlist != nil) { + config->use_default_app = [usingOptionsFromDefaultPlist boolValue]; + config->has_use_default_app = 1; + } + + NSString *libraryVersionID = diagnosticObjects[kFIRCDLibraryVersionIDKey]; + if (libraryVersionID) { + config->icore_version = FIREncodeString(libraryVersionID); + } + + NSString *deviceModel = [FIRCoreDiagnostics deviceModel]; + if (deviceModel.length) { + config->device_model = FIREncodeString(deviceModel); + } + + NSString *osVersion = [GULAppEnvironmentUtil systemVersion]; + if (osVersion.length) { + config->os_version = FIREncodeString(osVersion); + } + + config->using_zip_file = kUsingZipFile; + config->has_using_zip_file = 1; + config->deployment_type = kDeploymentType; + config->has_deployment_type = 1; + config->deployed_in_app_store = [GULAppEnvironmentUtil isFromAppStore]; + config->has_deployed_in_app_store = 1; +} + +/** Populates the given proto with installed services data. + * + * @param config The proto to populate + */ +void FIRPopulateProtoWithInstalledServices(logs_proto_mobilesdk_ios_ICoreConfiguration *config) { + NSMutableArray *sdkServiceInstalledArray = [NSMutableArray array]; + + // AdMob + if (NSClassFromString(@"GADBannerView") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAdMob))]; + } + // CloudMessaging + if (NSClassFromString(@"FIRMessaging") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMessaging))]; + } + // RemoteConfig + if (NSClassFromString(@"FIRRemoteConfig") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceRemoteConfig))]; + } + // Measurement/Analtyics + if (NSClassFromString(@"FIRAnalytics") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMeasurement))]; + } + // ML Vision On Device AutoML. + if (NSClassFromString(@"FIRVisionOnDeviceAutoMLImageLabelerOptions") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceAutoML))]; + } + // ML Vision On Device Face. + if (NSClassFromString(@"FIRVisionFaceDetector") != nil && + NSClassFromString(@"GMVFaceDetector") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceFace))]; + } + // ML Vision On Device Barcode. + if (NSClassFromString(@"FIRVisionBarcodeDetector") != nil && + NSClassFromString(@"GMVBarcodeDetector") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceBarcode))]; + } + // ML Vision On Device Text. + if (NSClassFromString(@"FIRVisionTextDetector") != nil && + NSClassFromString(@"GMVTextDetector") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceText))]; + } + // ML Vision On Device Image Label. + if (NSClassFromString(@"FIRVisionLabelDetector") != nil && + NSClassFromString(@"GMVLabelDetector") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceLabel))]; + } + // ML Vision On Device Object. + if (NSClassFromString(@"FIRVisionObjectDetector") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceObjectDetection))]; + } + // ML Model Interpreter + if (NSClassFromString(@"FIRCustomModelInterpreter") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLModelInterpreter))]; + } + // Database + if (NSClassFromString(@"FIRDatabase") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceDatabase))]; + } + // DynamicDeepLink + if (NSClassFromString(@"FIRDynamicLinks") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceDynamicLinks))]; + } + // Auth + if (NSClassFromString(@"FIRAuth") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAuth))]; + } + // AuthUI + if (NSClassFromString(@"FUIAuth") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAuthUI))]; + } + // Firestore + if (NSClassFromString(@"FIRFirestore") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceFirestore))]; + } + // Functions + if (NSClassFromString(@"FIRFunctions") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceFunctions))]; + } + // Performance + if (NSClassFromString(@"FIRPerformance") != nil) { + [sdkServiceInstalledArray + addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServicePerformance))]; + } + // Storage + if (NSClassFromString(@"FIRStorage") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceStorage))]; + } + // SignIn via Google pod + if (NSClassFromString(@"GIDSignIn") != nil && NSClassFromString(@"GGLContext") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kGGLServiceSignIn))]; + } + // Analytics via Google pod + if (NSClassFromString(@"GAI") != nil && NSClassFromString(@"GGLContext") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kGGLServiceAnalytics))]; + } + + // In-App Messaging + if (NSClassFromString(@"FIRInAppMessaging") != nil) { + [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceIAM))]; + } + + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType *servicesInstalled = + calloc(sdkServiceInstalledArray.count, + sizeof(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType)); + if (servicesInstalled == NULL) { + return; + } + for (NSUInteger i = 0; i < sdkServiceInstalledArray.count; i++) { + NSNumber *typeEnum = sdkServiceInstalledArray[i]; + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType serviceType = + (int32_t)typeEnum.integerValue; + servicesInstalled[i] = serviceType; + } + + config->sdk_service_installed = servicesInstalled; + config->sdk_service_installed_count = (int32_t)sdkServiceInstalledArray.count; +} + +/** Populates the proto with the number of linked frameworks. + * + * @param config The proto to populate. + */ +void FIRPopulateProtoWithNumberOfLinkedFrameworks( + logs_proto_mobilesdk_ios_ICoreConfiguration *config) { + int numFrameworks = -1; // Subtract the app binary itself. + unsigned int numImages; + const char **imageNames = objc_copyImageNames(&numImages); + for (unsigned int i = 0; i < numImages; i++) { + NSString *imageName = [NSString stringWithUTF8String:imageNames[i]]; + if ([imageName rangeOfString:@"System/Library"].length != 0 // Apple .frameworks + || [imageName rangeOfString:@"Developer/Library"].length != 0 // Xcode debug .frameworks + || [imageName rangeOfString:@"usr/lib"].length != 0) { // Public .dylibs + continue; + } + numFrameworks++; + } + free(imageNames); + config->dynamic_framework_count = numFrameworks; + config->has_dynamic_framework_count = 1; +} + +/** Populates the proto with Info.plist values. + * + * @param config The proto to populate. + */ +void FIRPopulateProtoWithInfoPlistValues(logs_proto_mobilesdk_ios_ICoreConfiguration *config) { + NSDictionary *info = [[NSBundle mainBundle] infoDictionary]; + + NSString *xcodeVersion = info[@"DTXcodeBuild"] ?: @""; + NSString *sdkVersion = info[@"DTSDKBuild"] ?: @""; + NSString *combinedVersions = [NSString stringWithFormat:@"%@-%@", xcodeVersion, sdkVersion]; + config->apple_framework_version = FIREncodeString(combinedVersions); + + NSString *minVersion = info[@"MinimumOSVersion"]; + if (minVersion) { + config->min_supported_ios_version = FIREncodeString(minVersion); + } + + // Apps can turn off swizzling in the Info.plist, check if they've explicitly set the value and + // report it. It's enabled by default. + NSNumber *appDelegateSwizzledNum = info[@"FirebaseAppDelegateProxyEnabled"]; + BOOL appDelegateSwizzled = YES; + if ([appDelegateSwizzledNum isKindOfClass:[NSNumber class]]) { + appDelegateSwizzled = [appDelegateSwizzledNum boolValue]; + } + config->swizzling_enabled = appDelegateSwizzled; + config->has_swizzling_enabled = 1; +} + +#pragma mark - FIRCoreDiagnosticsInterop + ++ (void)sendDiagnosticsData:(nonnull id)diagnosticsData { + FIRCoreDiagnostics *diagnostics = [FIRCoreDiagnostics sharedInstance]; + [diagnostics sendDiagnosticsData:diagnosticsData]; +} + +- (void)sendDiagnosticsData:(nonnull id)diagnosticsData { + dispatch_async(self.diagnosticsQueue, ^{ + NSDictionary *diagnosticObjects = diagnosticsData.diagnosticObjects; + NSNumber *isDataCollectionDefaultEnabled = + diagnosticObjects[kFIRCDIsDataCollectionDefaultEnabledKey]; + if (isDataCollectionDefaultEnabled && ![isDataCollectionDefaultEnabled boolValue]) { + return; + } + + // Create the proto. + logs_proto_mobilesdk_ios_ICoreConfiguration icore_config = + logs_proto_mobilesdk_ios_ICoreConfiguration_init_default; + + icore_config.using_gdt = 1; + icore_config.has_using_gdt = 1; + + // Populate the proto with information. + FIRPopulateProtoWithInfoFromUserInfoParams(&icore_config, diagnosticObjects); + FIRPopulateProtoWithCommonInfoFromApp(&icore_config, diagnosticObjects); + FIRPopulateProtoWithInstalledServices(&icore_config); + FIRPopulateProtoWithNumberOfLinkedFrameworks(&icore_config); + FIRPopulateProtoWithInfoPlistValues(&icore_config); + [self setHeartbeatFlagIfNeededToConfig:&icore_config]; + + // This log object is capable of converting the proto to bytes. + FIRCoreDiagnosticsLog *log = [[FIRCoreDiagnosticsLog alloc] initWithConfig:icore_config]; + + // Send the log as a telemetry event. + GDTCOREvent *event = [self.transport eventForTransport]; + event.dataObject = (id)log; + [self.transport sendTelemetryEvent:event]; + }); +} + +#pragma mark - Heartbeat + +- (void)setHeartbeatFlagIfNeededToConfig:(logs_proto_mobilesdk_ios_ICoreConfiguration *)config { + // Check if need to send a heartbeat. + NSDate *currentDate = [NSDate date]; + NSDate *lastCheckin = + [self.heartbeatDateStorage heartbeatDateForTag:kFIRCoreDiagnosticsHeartbeatTag]; + if (lastCheckin) { + // Ensure the previous checkin was on a different date in the past. + if ([self isDate:currentDate inSameDayOrBeforeThan:lastCheckin]) { + return; + } + } + + // Update heartbeat sent date. + [self.heartbeatDateStorage setHearbeatDate:currentDate forTag:kFIRCoreDiagnosticsHeartbeatTag]; + // Set the flag. + config->sdk_name = logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ICORE; + config->has_sdk_name = 1; +} + +- (BOOL)isDate:(NSDate *)date1 inSameDayOrBeforeThan:(NSDate *)date2 { + return [[NSCalendar currentCalendar] isDate:date1 inSameDayAsDate:date2] || + [date1 compare:date2] == NSOrderedAscending; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.c b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.c new file mode 100644 index 00000000..0bdb27e2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.c @@ -0,0 +1,60 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.9.5 */ + +#include "firebasecore.nanopb.h" + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t logs_proto_mobilesdk_ios_ICoreConfiguration_fields[22] = { + PB_FIELD( 1, UENUM , OPTIONAL, STATIC , FIRST, logs_proto_mobilesdk_ios_ICoreConfiguration, configuration_type, configuration_type, 0), + PB_FIELD( 7, UENUM , REPEATED, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_service_installed, configuration_type, 0), + PB_FIELD( 9, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, device_model, sdk_service_installed, 0), + PB_FIELD( 10, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, app_id, device_model, 0), + PB_FIELD( 12, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, bundle_id, app_id, 0), + PB_FIELD( 16, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, pod_name, bundle_id, 0), + PB_FIELD( 18, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, icore_version, pod_name, 0), + PB_FIELD( 19, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_version, icore_version, 0), + PB_FIELD( 20, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_name, sdk_version, 0), + PB_FIELD( 21, INT32 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, app_count, sdk_name, 0), + PB_FIELD( 22, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, os_version, app_count, 0), + PB_FIELD( 24, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, min_supported_ios_version, os_version, 0), + PB_FIELD( 25, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, use_default_app, min_supported_ios_version, 0), + PB_FIELD( 26, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, deployed_in_app_store, use_default_app, 0), + PB_FIELD( 27, INT32 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, dynamic_framework_count, deployed_in_app_store, 0), + PB_FIELD( 28, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, apple_framework_version, dynamic_framework_count, 0), + PB_FIELD( 29, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, using_zip_file, apple_framework_version, 0), + PB_FIELD( 30, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, deployment_type, using_zip_file, 0), + PB_FIELD( 31, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, platform_info, deployment_type, 0), + PB_FIELD( 33, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, swizzling_enabled, platform_info, 0), + PB_FIELD( 36, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, using_gdt, swizzling_enabled, 0), + PB_LAST_FIELD +}; + + + + + + + +/* @@protoc_insertion_point(eof) */ diff --git a/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h new file mode 100644 index 00000000..59d1b3b0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h @@ -0,0 +1,193 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.9.5 */ + +#ifndef PB_LOGS_PROTO_MOBILESDK_IOS_FIREBASECORE_NANOPB_H_INCLUDED +#define PB_LOGS_PROTO_MOBILESDK_IOS_FIREBASECORE_NANOPB_H_INCLUDED +#include + +/* @@protoc_insertion_point(includes) */ +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + +/* Enum definitions */ +typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType { + logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_UNKNOWN_CONFIGURATION_TYPE = 0, + logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE = 1, + logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK = 2 +} logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType; +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_UNKNOWN_CONFIGURATION_TYPE +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType)(logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK+1)) + +typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType { + logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_UNKNOWN_BUILD_TYPE = 0, + logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_INTERNAL = 1, + logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_EAP = 2, + logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD = 3 +} logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType; +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_UNKNOWN_BUILD_TYPE +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType)(logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD+1)) + +typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType { + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE = 0, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ICORE = 1, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ADMOB = 2, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_APP_INVITE = 3, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SIGN_IN = 5, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_GCM = 6, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MAPS = 7, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SCION = 8, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ANALYTICS = 9, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_APP_INDEXING = 10, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_CONFIG = 11, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DURABLE_DEEP_LINKS = 12, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_CRASH = 13, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH = 14, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DATABASE = 15, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_STORAGE = 16, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MESSAGING = 17, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MEASUREMENT = 18, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_REMOTE_CONFIG = 19, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DYNAMIC_LINKS = 20, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_INVITES = 21, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH_UI = 22, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FIRESTORE = 23, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_PERFORMANCE = 24, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_FACE = 26, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_BARCODE = 27, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_TEXT = 28, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_LABEL = 29, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_MODEL_INTERPRETER = 30, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_IN_APP_MESSAGING = 31, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FUNCTIONS = 32, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_NATURAL_LANGUAGE = 33, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_AUTOML = 34, + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION = 35 +} logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType; +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType)(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION+1)) + +typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName { + logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_UNKNOWN_POD_NAME = 0, + logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_GOOGLE = 1, + logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE = 2 +} logs_proto_mobilesdk_ios_ICoreConfiguration_PodName; +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_UNKNOWN_POD_NAME +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_PodName)(logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE+1)) + +typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType { + logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_UNKNOWN = 0, + logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_COCOAPODS = 1, + logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ZIP_FILE = 2, + logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_CARTHAGE = 3, + logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM = 4 +} logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType; +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_UNKNOWN +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM +#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType)(logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM+1)) + +/* Struct definitions */ +typedef struct _logs_proto_mobilesdk_ios_ICoreConfiguration { + bool has_configuration_type; + logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType configuration_type; + pb_size_t sdk_service_installed_count; + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType *sdk_service_installed; + pb_bytes_array_t *device_model; + pb_bytes_array_t *app_id; + pb_bytes_array_t *bundle_id; + bool has_pod_name; + logs_proto_mobilesdk_ios_ICoreConfiguration_PodName pod_name; + pb_bytes_array_t *icore_version; + pb_bytes_array_t *sdk_version; + bool has_sdk_name; + logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType sdk_name; + bool has_app_count; + int32_t app_count; + pb_bytes_array_t *os_version; + pb_bytes_array_t *min_supported_ios_version; + bool has_use_default_app; + bool use_default_app; + bool has_deployed_in_app_store; + bool deployed_in_app_store; + bool has_dynamic_framework_count; + int32_t dynamic_framework_count; + pb_bytes_array_t *apple_framework_version; + bool has_using_zip_file; + bool using_zip_file; + bool has_deployment_type; + logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType deployment_type; + pb_bytes_array_t *platform_info; + bool has_swizzling_enabled; + bool swizzling_enabled; + bool has_using_gdt; + bool using_gdt; +/* @@protoc_insertion_point(struct:logs_proto_mobilesdk_ios_ICoreConfiguration) */ +} logs_proto_mobilesdk_ios_ICoreConfiguration; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define logs_proto_mobilesdk_ios_ICoreConfiguration_init_default {false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN, 0, NULL, NULL, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN, false, 0, NULL, NULL, false, 0, false, 0, false, 0, NULL, false, 0, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN, NULL, false, 0, false, 0} +#define logs_proto_mobilesdk_ios_ICoreConfiguration_init_zero {false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN, 0, NULL, NULL, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN, false, 0, NULL, NULL, false, 0, false, 0, false, 0, NULL, false, 0, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN, NULL, false, 0, false, 0} + +/* Field tags (for use in manual encoding/decoding) */ +#define logs_proto_mobilesdk_ios_ICoreConfiguration_pod_name_tag 16 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_configuration_type_tag 1 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_icore_version_tag 18 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_version_tag 19 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_service_installed_tag 7 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_name_tag 20 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_device_model_tag 9 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_os_version_tag 22 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_app_id_tag 10 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_bundle_id_tag 12 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_min_supported_ios_version_tag 24 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_use_default_app_tag 25 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_app_count_tag 21 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_deployed_in_app_store_tag 26 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_dynamic_framework_count_tag 27 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_apple_framework_version_tag 28 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_using_zip_file_tag 29 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_deployment_type_tag 30 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_platform_info_tag 31 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_swizzling_enabled_tag 33 +#define logs_proto_mobilesdk_ios_ICoreConfiguration_using_gdt_tag 36 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t logs_proto_mobilesdk_ios_ICoreConfiguration_fields[22]; + +/* Maximum encoded size of messages (where known) */ +/* logs_proto_mobilesdk_ios_ICoreConfiguration_size depends on runtime parameters */ + +/* Message IDs (where set with "msgid" option) */ +#ifdef PB_MSGID + +#define FIREBASECORE_MESSAGES \ + + +#endif + +/* @@protoc_insertion_point(eof) */ + +#endif diff --git a/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h new file mode 100644 index 00000000..69c40721 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h @@ -0,0 +1,61 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** If present, is a BOOL wrapped in an NSNumber. */ +#define kFIRCDIsDataCollectionDefaultEnabledKey @"FIRCDIsDataCollectionDefaultEnabledKey" + +/** If present, is an int32_t wrapped in an NSNumber. */ +#define kFIRCDConfigurationTypeKey @"FIRCDConfigurationTypeKey" + +/** If present, is an NSString. */ +#define kFIRCDSdkNameKey @"FIRCDSdkNameKey" + +/** If present, is an NSString. */ +#define kFIRCDSdkVersionKey @"FIRCDSdkVersionKey" + +/** If present, is an int32_t wrapped in an NSNumber. */ +#define kFIRCDllAppsCountKey @"FIRCDllAppsCountKey" + +/** If present, is an NSString. */ +#define kFIRCDGoogleAppIDKey @"FIRCDGoogleAppIDKey" + +/** If present, is an NSString. */ +#define kFIRCDBundleIDKey @"FIRCDBundleID" + +/** If present, is a BOOL wrapped in an NSNumber. */ +#define kFIRCDUsingOptionsFromDefaultPlistKey @"FIRCDUsingOptionsFromDefaultPlistKey" + +/** If present, is an NSString. */ +#define kFIRCDLibraryVersionIDKey @"FIRCDLibraryVersionIDKey" + +/** If present, is an NSString. */ +#define kFIRCDFirebaseUserAgentKey @"FIRCDFirebaseUserAgentKey" + +/** Defines the interface of a data object needed to log diagnostics data. */ +@protocol FIRCoreDiagnosticsData + +@required + +/** A dictionary containing data (non-exhaustive) to be logged in diagnostics. */ +@property(nonatomic) NSDictionary *diagnosticObjects; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h new file mode 100644 index 00000000..2b0eb710 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h @@ -0,0 +1,34 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRCoreDiagnosticsData.h" + +NS_ASSUME_NONNULL_BEGIN + +/** Allows the interoperation of FirebaseCore and FirebaseCoreDiagnostics. */ +@protocol FIRCoreDiagnosticsInterop + +/** Sends the given diagnostics data. + * + * @param diagnosticsData The diagnostics data object to send. + */ ++ (void)sendDiagnosticsData:(id)diagnosticsData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseCoreDiagnostics/LICENSE b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/FirebaseCoreDiagnostics/README.md b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/README.md new file mode 100644 index 00000000..d778205f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseCoreDiagnostics/README.md @@ -0,0 +1,311 @@ +[![Version](https://img.shields.io/cocoapods/v/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) + +[![Actions Status][gh-abtesting-badge]][gh-actions] +[![Actions Status][gh-auth-badge]][gh-actions] +[![Actions Status][gh-core-badge]][gh-actions] +[![Actions Status][gh-crashlytics-badge]][gh-actions] +[![Actions Status][gh-database-badge]][gh-actions] +[![Actions Status][gh-datatransport-badge]][gh-actions] +[![Actions Status][gh-dynamiclinks-badge]][gh-actions] +[![Actions Status][gh-firebasepod-badge]][gh-actions] +[![Actions Status][gh-firestore-badge]][gh-actions] +[![Actions Status][gh-functions-badge]][gh-actions] +[![Actions Status][gh-inappmessaging-badge]][gh-actions] +[![Actions Status][gh-interop-badge]][gh-actions] +[![Actions Status][gh-messaging-badge]][gh-actions] +[![Actions Status][gh-remoteconfig-badge]][gh-actions] +[![Actions Status][gh-storage-badge]][gh-actions] +[![Actions Status][gh-symbolcollision-badge]][gh-actions] +[![Actions Status][gh-zip-badge]][gh-actions] +[![Travis](https://travis-ci.org/firebase/firebase-ios-sdk.svg?branch=master)](https://travis-ci.org/firebase/firebase-ios-sdk) + +# Firebase Apple Open Source Development + +This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics, +FirebasePerformance, and FirebaseML. + +The repository also includes GoogleUtilities source. The +[GoogleUtilities](GoogleUtilities/README.md) pod is +a set of utilities used by Firebase and other Google products. + +Firebase is an app development platform with tools to help you build, grow and +monetize your app. More information about Firebase can be found at +[https://firebase.google.com](https://firebase.google.com). + +## Installation + +See the three subsections for details about three different installation methods. +1. [Standard pod install](README.md#standard-pod-install) +1. [Installing from the GitHub repo](README.md#installing-from-github) +1. [Experimental Carthage](README.md#carthage-ios-only) + +### Standard pod install + +Go to +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Installing from GitHub + +For releases starting with 5.0.0, the source for each release is also deployed +to CocoaPods master and available via standard +[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod). + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See +[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All of the official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +``` +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +``` + +To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do: + +``` +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution are at +[Carthage](Carthage.md). + +### Rome + +Instructions for installing binary frameworks via +[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md). + +### Using Firebase from a Framework or a library + +[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md) + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + + * Xcode 10.3 (or later) + * CocoaPods 1.7.2 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self contained Xcode project. See +[Firestore/README.md](Firestore/README.md). + +### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +### Adding a New Firebase Pod + +See [AddNewPod.md](AddNewPod.md). + +### Managing Headers and Imports + +See [HeadersImports.md](HeadersImports.md). + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh) +before creating a PR. + +Travis will verify that any code changes are done in a style compliant way. Install +`clang-format` and `swiftformat`. +These commands will get the right versions: + +``` +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb +``` + +Note: if you already have a newer version of these installed you may need to +`brew switch` to this version. + +To update this section, find the versions of clang-format and swiftformat.rb to +match the versions in the CI failure logs +[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula). + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +#### Viewing Code Coverage (Deprecated) + +First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`. + +After running the `AllUnitTests_iOS` scheme in Xcode, execute +`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output` +at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results. + +### Running Sample Apps +In order to run the sample apps and integration tests, you'll need valid +`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist +files without real values, but can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g. `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file +(e.g. in [Example/Database/App/](Example/Database/App/)); + +Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require +special Apple capabilities, and you will have to change the sample app to use a unique bundle +identifier that you can control in your own Apple Developer account. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase Auth + +If you're doing specific Firebase Auth development, see +[the Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to +`Example/Database/App/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[FIRStorageIntegrationTests.m](FirebaseStorage/Tests/Integration/FIRStorageIntegrationTests.m). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to actually test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account, and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications, and will not receive push notifications. +In order to receive push notifications, you'll have to follow the steps above and run the app on a +physical device. + +## Community Supported Efforts + +We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are +very grateful! We'd like to empower as many developers as we can to be able to use Firebase and +participate in the Firebase community. + +### tvOS, macOS, watchOS and Catalyst +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on +tvOS, macOS, watchOS and Catalyst. + +For tvOS, checkout the [Sample](Example/tvOSSample). +For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the +[Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this +repository is actively developed primarily for iOS. While we can catch basic unit test issues with +Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you +encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the app +has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +To install, add a subset of the following to the Podfile: + +``` +pod 'Firebase/ABTesting' # No watchOS support yet +pod 'Firebase/Auth' # No watchOS support yet +pod 'Firebase/Crashlytics' # No watchOS support yet +pod 'Firebase/Database' # No watchOS support yet +pod 'Firebase/Firestore' # No watchOS support yet +pod 'Firebase/Functions' # No watchOS support yet +pod 'Firebase/Messaging' +pod 'Firebase/RemoteConfig' # No watchOS support yet +pod 'Firebase/Storage' +``` + +#### Additional Catalyst Notes + +* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability` +to Build Settings. +* FirebaseFirestore requires signing the +[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +iOS SDK. + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg +[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg +[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg +[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg +[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg +[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg +[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg +[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg +[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg +[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg +[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg +[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg +[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg +[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg +[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg +[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDataSnapshot.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDataSnapshot.m new file mode 100644 index 00000000..c1d48ecd --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDataSnapshot.m @@ -0,0 +1,105 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDataSnapshot.h" +#import "FChildrenNode.h" +#import "FIRDataSnapshot_Private.h" +#import "FIRDatabaseReference.h" +#import "FTransformedEnumerator.h" +#import "FValidation.h" + +@interface FIRDataSnapshot () +@property(nonatomic, strong) FIRDatabaseReference *ref; +@end + +@implementation FIRDataSnapshot + +- (id)initWithRef:(FIRDatabaseReference *)ref indexedNode:(FIndexedNode *)node { + self = [super init]; + if (self != nil) { + self->_ref = ref; + self->_node = node; + } + return self; +} + +- (id)value { + return [self.node.node val]; +} + +- (id)valueInExportFormat { + return [self.node.node valForExport:YES]; +} + +- (FIRDataSnapshot *)childSnapshotForPath:(NSString *)childPathString { + [FValidation validateFrom:@"child:" validPathString:childPathString]; + FPath *childPath = [[FPath alloc] initWith:childPathString]; + FIRDatabaseReference *childRef = [self.ref child:childPathString]; + + id childNode = [self.node.node getChild:childPath]; + return [[FIRDataSnapshot alloc] + initWithRef:childRef + indexedNode:[FIndexedNode indexedNodeWithNode:childNode]]; +} + +- (BOOL)hasChild:(NSString *)childPathString { + [FValidation validateFrom:@"hasChild:" validPathString:childPathString]; + FPath *childPath = [[FPath alloc] initWith:childPathString]; + return ![[self.node.node getChild:childPath] isEmpty]; +} + +- (id)priority { + id priority = [self.node.node getPriority]; + return priority.val; +} + +- (BOOL)hasChildren { + if ([self.node.node isLeafNode]) { + return false; + } else { + return ![self.node.node isEmpty]; + } +} + +- (BOOL)exists { + return ![self.node.node isEmpty]; +} + +- (NSString *)key { + return [self.ref key]; +} + +- (NSUInteger)childrenCount { + return [self.node.node numChildren]; +} + +- (NSEnumerator *)children { + return [[FTransformedEnumerator alloc] + initWithEnumerator:self.node.childEnumerator + andTransform:^id(FNamedNode *node) { + FIRDatabaseReference *childRef = [self.ref child:node.name]; + return [[FIRDataSnapshot alloc] + initWithRef:childRef + indexedNode:[FIndexedNode indexedNodeWithNode:node.node]]; + }]; +} + +- (NSString *)description { + return + [NSString stringWithFormat:@"Snap (%@) %@", self.key, self.node.node]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabase.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabase.m new file mode 100644 index 00000000..01561e9c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabase.m @@ -0,0 +1,229 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import "Interop/Auth/Public/FIRAuthInterop.h" + +#import "FIRDatabase.h" +#import "FIRDatabaseComponent.h" +#import "FIRDatabaseConfig_Private.h" +#import "FIRDatabaseQuery_Private.h" +#import "FIRDatabaseReference_Private.h" +#import "FIRDatabase_Private.h" +#import "FRepoInfo.h" +#import "FValidation.h" + +@implementation FIRDatabase + +// The STR and STR_EXPAND macro allow a numeric version passed to he compiler +// driver with a -D to be treated as a string instead of an invalid floating +// point value. +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x +static const char *FIREBASE_SEMVER = (const char *)STR(FIRDatabase_VERSION); + ++ (FIRDatabase *)database { + if (![FIRApp isDefaultAppConfigured]) { + [NSException raise:@"FIRAppNotConfigured" + format:@"Failed to get default Firebase Database instance. " + @"Must call `[FIRApp " + @"configure]` (`FirebaseApp.configure()` in Swift) " + @"before using " + @"Firebase Database."]; + } + return [FIRDatabase databaseForApp:[FIRApp defaultApp]]; +} + ++ (FIRDatabase *)databaseWithURL:(NSString *)url { + FIRApp *app = [FIRApp defaultApp]; + if (app == nil) { + [NSException + raise:@"FIRAppNotConfigured" + format: + @"Failed to get default Firebase Database instance. " + @"Must call `[FIRApp configure]` (`FirebaseApp.configure()` in " + @"Swift) before using Firebase Database."]; + } + return [FIRDatabase databaseForApp:app URL:url]; +} + ++ (FIRDatabase *)databaseForApp:(FIRApp *)app { + if (app == nil) { + [NSException raise:@"InvalidFIRApp" + format:@"nil FIRApp instance passed to databaseForApp."]; + } + return [FIRDatabase databaseForApp:app URL:app.options.databaseURL]; +} + ++ (FIRDatabase *)databaseForApp:(FIRApp *)app URL:(NSString *)url { + if (app == nil) { + [NSException raise:@"InvalidFIRApp" + format:@"nil FIRApp instance passed to databaseForApp."]; + } + if (url == nil) { + [NSException raise:@"MissingDatabaseURL" + format:@"Failed to get FirebaseDatabase instance: " + @"Specify DatabaseURL within FIRApp or from your " + @"databaseForApp:URL: call."]; + } + id provider = + FIR_COMPONENT(FIRDatabaseProvider, app.container); + return [provider databaseForApp:app URL:url]; +} + ++ (NSString *)buildVersion { + // TODO: Restore git hash when build moves back to git + return [NSString stringWithFormat:@"%s_%s", FIREBASE_SEMVER, __DATE__]; +} + ++ (FIRDatabase *)createDatabaseForTests:(FRepoInfo *)repoInfo + config:(FIRDatabaseConfig *)config { + FIRDatabase *db = [[FIRDatabase alloc] initWithApp:nil + repoInfo:repoInfo + config:config]; + [db ensureRepo]; + return db; +} + ++ (NSString *)sdkVersion { + return [NSString stringWithUTF8String:FIREBASE_SEMVER]; +} + ++ (void)setLoggingEnabled:(BOOL)enabled { + [FUtilities setLoggingEnabled:enabled]; + FFLog(@"I-RDB024001", @"BUILD Version: %@", [FIRDatabase buildVersion]); +} + +- (id)initWithApp:(FIRApp *)app + repoInfo:(FRepoInfo *)info + config:(FIRDatabaseConfig *)config { + self = [super init]; + if (self != nil) { + self->_repoInfo = info; + self->_config = config; + self->_app = app; + } + return self; +} + +- (FIRDatabaseReference *)reference { + [self ensureRepo]; + + return [[FIRDatabaseReference alloc] initWithRepo:self.repo + path:[FPath empty]]; +} + +- (FIRDatabaseReference *)referenceWithPath:(NSString *)path { + [self ensureRepo]; + + [FValidation validateFrom:@"referenceWithPath" validRootPathString:path]; + FPath *childPath = [[FPath alloc] initWith:path]; + return [[FIRDatabaseReference alloc] initWithRepo:self.repo path:childPath]; +} + +- (FIRDatabaseReference *)referenceFromURL:(NSString *)databaseUrl { + [self ensureRepo]; + + if (databaseUrl == nil) { + [NSException raise:@"InvalidDatabaseURL" + format:@"Invalid nil url passed to referenceFromURL:"]; + } + FParsedUrl *parsedUrl = [FUtilities parseUrl:databaseUrl]; + [FValidation validateFrom:@"referenceFromURL:" validURL:parsedUrl]; + if (![parsedUrl.repoInfo.host isEqualToString:_repoInfo.host]) { + [NSException + raise:@"InvalidDatabaseURL" + format: + @"Invalid URL (%@) passed to getReference(). URL was expected " + "to match configured Database URL: %@", + databaseUrl, [self reference].URL]; + } + return [[FIRDatabaseReference alloc] initWithRepo:self.repo + path:parsedUrl.path]; +} + +- (void)purgeOutstandingWrites { + [self ensureRepo]; + + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo purgeOutstandingWrites]; + }); +} + +- (void)goOnline { + [self ensureRepo]; + + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo resume]; + }); +} + +- (void)goOffline { + [self ensureRepo]; + + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo interrupt]; + }); +} + +- (void)setPersistenceEnabled:(BOOL)persistenceEnabled { + [self assertUnfrozen:@"setPersistenceEnabled"]; + self->_config.persistenceEnabled = persistenceEnabled; +} + +- (BOOL)persistenceEnabled { + return self->_config.persistenceEnabled; +} + +- (void)setPersistenceCacheSizeBytes:(NSUInteger)persistenceCacheSizeBytes { + [self assertUnfrozen:@"setPersistenceCacheSizeBytes"]; + self->_config.persistenceCacheSizeBytes = persistenceCacheSizeBytes; +} + +- (NSUInteger)persistenceCacheSizeBytes { + return self->_config.persistenceCacheSizeBytes; +} + +- (void)setCallbackQueue:(dispatch_queue_t)callbackQueue { + [self assertUnfrozen:@"setCallbackQueue"]; + self->_config.callbackQueue = callbackQueue; +} + +- (dispatch_queue_t)callbackQueue { + return self->_config.callbackQueue; +} + +- (void)assertUnfrozen:(NSString *)methodName { + if (self.repo != nil) { + [NSException + raise:@"FIRDatabaseAlreadyInUse" + format:@"Calls to %@ must be made before any other usage of " + "FIRDatabase instance.", + methodName]; + } +} + +- (void)ensureRepo { + if (self.repo == nil) { + self.repo = [FRepoManager createRepo:self.repoInfo + config:self.config + database:self]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseComponent.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseComponent.h new file mode 100644 index 00000000..9d8bdb2c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseComponent.h @@ -0,0 +1,46 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRApp; +@class FIRDatabase; + +NS_ASSUME_NONNULL_BEGIN + +/// This protocol is used in the interop registration process to register an +/// instance provider for individual FIRApps. +@protocol FIRDatabaseProvider + +/// Gets a FirebaseDatabase instance for the specified URL, using the specified +/// FirebaseApp. +- (FIRDatabase *)databaseForApp:(FIRApp *)app URL:(NSString *)url; + +@end + +/// A concrete implementation for FIRDatabaseProvider to create Database +/// instances. +@interface FIRDatabaseComponent : NSObject + +/// The FIRApp that instances will be set up with. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Unavailable, use `databaseForApp:URL:` instead. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseComponent.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseComponent.m new file mode 100644 index 00000000..59f89d54 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseComponent.m @@ -0,0 +1,169 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseComponent.h" + +#import "FIRDatabaseConfig_Private.h" +#import "FIRDatabase_Private.h" +#import "FRepoManager.h" + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import "Interop/Auth/Public/FIRAuthInterop.h" + +NS_ASSUME_NONNULL_BEGIN + +/** A NSMutableDictionary of FirebaseApp name and FRepoInfo to FirebaseDatabase + * instance. */ +typedef NSMutableDictionary FIRDatabaseDictionary; + +@interface FIRDatabaseComponent () +@property(nonatomic) FIRDatabaseDictionary *instances; +/// Internal intializer. +- (instancetype)initWithApp:(FIRApp *)app; +@end + +@implementation FIRDatabaseComponent + +#pragma mark - Initialization + +- (instancetype)initWithApp:(FIRApp *)app { + self = [super init]; + if (self) { + _app = app; + _instances = [NSMutableDictionary dictionary]; + } + return self; +} + +#pragma mark - Lifecycle + ++ (void)load { + [FIRApp registerInternalLibrary:(Class)self + withName:@"fire-db" + withVersion:[FIRDatabase sdkVersion]]; +} + +#pragma mark - FIRComponentRegistrant + ++ (NSArray *)componentsToRegister { + FIRDependency *authDep = + [FIRDependency dependencyWithProtocol:@protocol(FIRAuthInterop) + isRequired:NO]; + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + *isCacheable = YES; + return [[FIRDatabaseComponent alloc] initWithApp:container.app]; + }; + FIRComponent *databaseProvider = + [FIRComponent componentWithProtocol:@protocol(FIRDatabaseProvider) + instantiationTiming:FIRInstantiationTimingLazy + dependencies:@[ authDep ] + creationBlock:creationBlock]; + return @[ databaseProvider ]; +} + +#pragma mark - Instance management. + +- (void)appWillBeDeleted:(FIRApp *)app { + NSString *appName = app.name; + if (appName == nil) { + return; + } + FIRDatabaseDictionary *instances = [self instances]; + @synchronized(instances) { + // Clean up the deleted instance in an effort to remove any resources + // still in use. Note: Any leftover instances of this exact database + // will be invalid. + for (FIRDatabase *database in [instances allValues]) { + [FRepoManager disposeRepos:database.config]; + } + [instances removeAllObjects]; + } +} + +#pragma mark - FIRDatabaseProvider Conformance + +- (FIRDatabase *)databaseForApp:(FIRApp *)app URL:(NSString *)url { + if (app == nil) { + [NSException raise:@"InvalidFIRApp" + format:@"nil FIRApp instance passed to databaseForApp."]; + } + + if (url == nil) { + [NSException raise:@"MissingDatabaseURL" + format:@"Failed to get FirebaseDatabase instance: " + "Specify DatabaseURL within FIRApp or from your " + "databaseForApp:URL: call."]; + } + + NSURL *databaseUrl = [NSURL URLWithString:url]; + + if (databaseUrl == nil) { + [NSException raise:@"InvalidDatabaseURL" + format:@"The Database URL '%@' cannot be parsed. " + "Specify a valid DatabaseURL within FIRApp or from " + "your databaseForApp:URL: call.", + databaseUrl]; + } else if (![databaseUrl.path isEqualToString:@""] && + ![databaseUrl.path isEqualToString:@"/"]) { + [NSException + raise:@"InvalidDatabaseURL" + format:@"Configured Database URL '%@' is invalid. It should point " + "to the root of a Firebase Database but it includes a " + "path: %@", + databaseUrl, databaseUrl.path]; + } + + FIRDatabaseDictionary *instances = [self instances]; + @synchronized(instances) { + FParsedUrl *parsedUrl = + [FUtilities parseUrl:databaseUrl.absoluteString]; + NSString *urlIndex = + [NSString stringWithFormat:@"%@:%@", parsedUrl.repoInfo.host, + [parsedUrl.path toString]]; + FIRDatabase *database = instances[urlIndex]; + if (!database) { + id authTokenProvider = [FAuthTokenProvider + authTokenProviderWithAuth:FIR_COMPONENT(FIRAuthInterop, + app.container)]; + + // If this is the default app, don't set the session persistence key + // so that we use our default ("default") instead of the FIRApp + // default ("[DEFAULT]") so that we preserve the default location + // used by the legacy Firebase SDK. + NSString *sessionIdentifier = @"default"; + if (![FIRApp isDefaultAppConfigured] || + app != [FIRApp defaultApp]) { + sessionIdentifier = app.name; + } + + FIRDatabaseConfig *config = [[FIRDatabaseConfig alloc] + initWithSessionIdentifier:sessionIdentifier + googleAppID:app.options.googleAppID + authTokenProvider:authTokenProvider]; + database = [[FIRDatabase alloc] initWithApp:app + repoInfo:parsedUrl.repoInfo + config:config]; + instances[urlIndex] = database; + } + + return database; + } +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseConfig.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseConfig.h new file mode 100644 index 00000000..16e4465b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseConfig.h @@ -0,0 +1,71 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FAuthTokenProvider; + +NS_ASSUME_NONNULL_BEGIN + +/** + * TODO: Merge FIRDatabaseConfig into FIRDatabase. + */ +@interface FIRDatabaseConfig : NSObject + +- (id)initWithSessionIdentifier:(NSString *)identifier + googleAppID:(NSString *)googleAppID + authTokenProvider:(id)authTokenProvider; + +/** + * By default the Firebase Database client will keep data in memory while your + * application is running, but not when it is restarted. By setting this value + * to YES, the data will be persisted to on-device (disk) storage and will thus + * be available again when the app is restarted (even when there is no network + * connectivity at that time). Note that this property must be set before + * creating your first FIRDatabaseReference and only needs to be called once per + * application. + * + * If your app uses Firebase Authentication, the client will automatically + * persist the user's authentication token across restarts, even without + * persistence enabled. But if the auth token expired while offline and you've + * enabled persistence, the client will pause write operations until you + * successfully re-authenticate (or explicitly unauthenticate) to prevent your + * writes from being sent unauthenticated and failing due to security rules. + */ +@property(nonatomic) BOOL persistenceEnabled; + +/** + * By default the Firebase Database client will use up to 10MB of disk space to + * cache data. If the cache grows beyond this size, the client will start + * removing data that hasn't been recently used. If you find that your + * application caches too little or too much data, call this method to change + * the cache size. This property must be set before creating your first + * FIRDatabaseReference and only needs to be called once per application. + * + * Note that the specified cache size is only an approximation and the size on + * disk may temporarily exceed it at times. + */ +@property(nonatomic) NSUInteger persistenceCacheSizeBytes; + +/** + * Sets the dispatch queue on which all events are raised. The default queue is + * the main queue. + */ +@property(nonatomic, strong) dispatch_queue_t callbackQueue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseConfig.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseConfig.m new file mode 100644 index 00000000..8db9b74c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseConfig.m @@ -0,0 +1,95 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseConfig.h" + +#import "FAuthTokenProvider.h" +#import "FIRDatabaseConfig_Private.h" +#import "FIRNoopAuthTokenProvider.h" + +@interface FIRDatabaseConfig (Private) + +@property(nonatomic, strong, readwrite) NSString *sessionIdentifier; +@property(nonatomic, strong, readwrite) NSString *googleAppID; + +@end + +@implementation FIRDatabaseConfig + +- (id)init { + [NSException raise:NSInvalidArgumentException + format:@"Can't create config objects!"]; + return nil; +} + +- (id)initWithSessionIdentifier:(NSString *)identifier + googleAppID:(NSString *)googleAppID + authTokenProvider:(id)authTokenProvider { + self = [super init]; + if (self != nil) { + self->_sessionIdentifier = identifier; + self->_callbackQueue = dispatch_get_main_queue(); + self->_googleAppID = googleAppID; + self->_persistenceCacheSizeBytes = + 10 * 1024 * 1024; // Default cache size is 10MB + self->_authTokenProvider = authTokenProvider; + } + return self; +} + +- (void)assertUnfrozen { + if (self.isFrozen) { + [NSException raise:NSGenericException + format:@"Can't modify config objects after they are in use " + @"for FIRDatabaseReferences."]; + } +} + +- (void)setAuthTokenProvider:(id)authTokenProvider { + [self assertUnfrozen]; + self->_authTokenProvider = authTokenProvider; +} + +- (void)setPersistenceEnabled:(BOOL)persistenceEnabled { + [self assertUnfrozen]; + self->_persistenceEnabled = persistenceEnabled; +} + +- (void)setPersistenceCacheSizeBytes:(NSUInteger)persistenceCacheSizeBytes { + [self assertUnfrozen]; + // Can't be less than 1MB + if (persistenceCacheSizeBytes < 1024 * 1024) { + [NSException raise:NSInvalidArgumentException + format:@"The minimum cache size must be at least 1MB"]; + } + if (persistenceCacheSizeBytes > 100 * 1024 * 1024) { + [NSException raise:NSInvalidArgumentException + format:@"Firebase Database currently doesn't support a " + @"cache size larger than 100MB"]; + } + self->_persistenceCacheSizeBytes = persistenceCacheSizeBytes; +} + +- (void)setCallbackQueue:(dispatch_queue_t)callbackQueue { + [self assertUnfrozen]; + self->_callbackQueue = callbackQueue; +} + +- (void)freeze { + self->_isFrozen = YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseQuery.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseQuery.m new file mode 100644 index 00000000..cd62979c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRDatabaseQuery.m @@ -0,0 +1,677 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseQuery.h" +#import "FChildEventRegistration.h" +#import "FConstants.h" +#import "FIRDatabaseQuery_Private.h" +#import "FKeyIndex.h" +#import "FLeafNode.h" +#import "FPath.h" +#import "FPathIndex.h" +#import "FPriorityIndex.h" +#import "FQueryParams.h" +#import "FQuerySpec.h" +#import "FSnapshotUtilities.h" +#import "FValidation.h" +#import "FValueEventRegistration.h" +#import "FValueIndex.h" + +@implementation FIRDatabaseQuery + +@synthesize repo; +@synthesize path; +@synthesize queryParams; + +#define INVALID_QUERY_PARAM_ERROR @"InvalidQueryParameter" + ++ (dispatch_queue_t)sharedQueue { + // We use this shared queue across all of the FQueries so things happen FIFO + // (as opposed to dispatch_get_global_queue(0, 0) which is concurrent) + static dispatch_once_t pred; + static dispatch_queue_t sharedDispatchQueue; + + dispatch_once(&pred, ^{ + sharedDispatchQueue = dispatch_queue_create("FirebaseWorker", NULL); + }); + + return sharedDispatchQueue; +} + +- (id)initWithRepo:(FRepo *)theRepo path:(FPath *)thePath { + return [self initWithRepo:theRepo + path:thePath + params:nil + orderByCalled:NO + priorityMethodCalled:NO]; +} + +- (id)initWithRepo:(FRepo *)theRepo + path:(FPath *)thePath + params:(FQueryParams *)theParams + orderByCalled:(BOOL)orderByCalled + priorityMethodCalled:(BOOL)priorityMethodCalled { + self = [super init]; + if (self) { + self.repo = theRepo; + self.path = thePath; + if (!theParams) { + theParams = [FQueryParams defaultInstance]; + } + if (![theParams isValid]) { + @throw [[NSException alloc] + initWithName:@"InvalidArgumentError" + reason:@"Queries are limited to two constraints" + userInfo:nil]; + } + self.queryParams = theParams; + self.orderByCalled = orderByCalled; + self.priorityMethodCalled = priorityMethodCalled; + } + return self; +} + +- (FQuerySpec *)querySpec { + return [[FQuerySpec alloc] initWithPath:self.path params:self.queryParams]; +} + +- (void)validateQueryEndpointsForParams:(FQueryParams *)params { + if ([params.index isEqual:[FKeyIndex keyIndex]]) { + if ([params hasStart]) { + if (params.indexStartKey != [FUtilities minName]) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Can't use queryStartingAtValue:childKey: " + @"or queryEqualTo:andChildKey: in " + @"combination with queryOrderedByKey"]; + } + if (![params.indexStartValue.val isKindOfClass:[NSString class]]) { + [NSException + raise:INVALID_QUERY_PARAM_ERROR + format: + @"Can't use queryStartingAtValue: with other types " + @"than string in combination with queryOrderedByKey"]; + } + } + if ([params hasEnd]) { + if (params.indexEndKey != [FUtilities maxName]) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Can't use queryEndingAtValue:childKey: or " + @"queryEqualToValue:childKey: in " + @"combination with queryOrderedByKey"]; + } + if (![params.indexEndValue.val isKindOfClass:[NSString class]]) { + [NSException + raise:INVALID_QUERY_PARAM_ERROR + format: + @"Can't use queryEndingAtValue: with other types than " + @"string in combination with queryOrderedByKey"]; + } + } + } else if ([params.index isEqual:[FPriorityIndex priorityIndex]]) { + if (([params hasStart] && + ![FValidation validatePriorityValue:params.indexStartValue.val]) || + ([params hasEnd] && + ![FValidation validatePriorityValue:params.indexEndValue.val])) { + [NSException + raise:INVALID_QUERY_PARAM_ERROR + format:@"When using queryOrderedByPriority, values provided to " + @"queryStartingAtValue:, queryEndingAtValue:, or " + @"queryEqualToValue: must be valid priorities."]; + } + } +} + +- (void)validateEqualToCall { + if ([self.queryParams hasStart]) { + [NSException + raise:INVALID_QUERY_PARAM_ERROR + format: + @"Cannot combine queryEqualToValue: and queryStartingAtValue:"]; + } + if ([self.queryParams hasEnd]) { + [NSException + raise:INVALID_QUERY_PARAM_ERROR + format: + @"Cannot combine queryEqualToValue: and queryEndingAtValue:"]; + } +} + +- (void)validateNoPreviousOrderByCalled { + if (self.orderByCalled) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Cannot use multiple queryOrderedBy calls!"]; + } +} + +- (void)validateIndexValueType:(id)type fromMethod:(NSString *)method { + if (type != nil && ![type isKindOfClass:[NSNumber class]] && + ![type isKindOfClass:[NSString class]] && + ![type isKindOfClass:[NSNull class]]) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"You can only pass nil, NSString or NSNumber to %@", + method]; + } +} + +- (FIRDatabaseQuery *)queryStartingAtValue:(id)startValue { + return [self queryStartingAtInternal:startValue + childKey:nil + from:@"queryStartingAtValue:" + priorityMethod:NO]; +} + +- (FIRDatabaseQuery *)queryStartingAtValue:(id)startValue + childKey:(NSString *)childKey { + if ([self.queryParams.index isEqual:[FKeyIndex keyIndex]]) { + @throw [[NSException alloc] + initWithName:INVALID_QUERY_PARAM_ERROR + reason:@"You must use queryStartingAtValue: instead of " + @"queryStartingAtValue:childKey: when using " + @"queryOrderedByKey:" + userInfo:nil]; + } + return [self queryStartingAtInternal:startValue + childKey:childKey + from:@"queryStartingAtValue:childKey:" + priorityMethod:NO]; +} + +- (FIRDatabaseQuery *)queryStartingAtInternal:(id)startValue + childKey:(NSString *)childKey + from:(NSString *)methodName + priorityMethod:(BOOL)priorityMethod { + [self validateIndexValueType:startValue fromMethod:methodName]; + if (childKey != nil) { + [FValidation validateFrom:methodName validKey:childKey]; + } + if ([self.queryParams hasStart]) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Can't call %@ after queryStartingAtValue or " + @"queryEqualToValue was previously called", + methodName]; + } + id startNode = [FSnapshotUtilities nodeFrom:startValue]; + FQueryParams *params = [self.queryParams startAt:startNode + childKey:childKey]; + [self validateQueryEndpointsForParams:params]; + return [[FIRDatabaseQuery alloc] + initWithRepo:self.repo + path:self.path + params:params + orderByCalled:self.orderByCalled + priorityMethodCalled:priorityMethod || self.priorityMethodCalled]; +} + +- (FIRDatabaseQuery *)queryEndingAtValue:(id)endValue { + return [self queryEndingAtInternal:endValue + childKey:nil + from:@"queryEndingAtValue:" + priorityMethod:NO]; +} + +- (FIRDatabaseQuery *)queryEndingAtValue:(id)endValue + childKey:(NSString *)childKey { + if ([self.queryParams.index isEqual:[FKeyIndex keyIndex]]) { + @throw [[NSException alloc] + initWithName:INVALID_QUERY_PARAM_ERROR + reason:@"You must use queryEndingAtValue: instead of " + @"queryEndingAtValue:childKey: when using " + @"queryOrderedByKey:" + userInfo:nil]; + } + + return [self queryEndingAtInternal:endValue + childKey:childKey + from:@"queryEndingAtValue:childKey:" + priorityMethod:NO]; +} + +- (FIRDatabaseQuery *)queryEndingAtInternal:(id)endValue + childKey:(NSString *)childKey + from:(NSString *)methodName + priorityMethod:(BOOL)priorityMethod { + [self validateIndexValueType:endValue fromMethod:methodName]; + if (childKey != nil) { + [FValidation validateFrom:methodName validKey:childKey]; + } + if ([self.queryParams hasEnd]) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Can't call %@ after queryEndingAtValue or " + @"queryEqualToValue was previously called", + methodName]; + } + id endNode = [FSnapshotUtilities nodeFrom:endValue]; + FQueryParams *params = [self.queryParams endAt:endNode childKey:childKey]; + [self validateQueryEndpointsForParams:params]; + return [[FIRDatabaseQuery alloc] + initWithRepo:self.repo + path:self.path + params:params + orderByCalled:self.orderByCalled + priorityMethodCalled:priorityMethod || self.priorityMethodCalled]; +} + +- (FIRDatabaseQuery *)queryEqualToValue:(id)value { + return [self queryEqualToInternal:value + childKey:nil + from:@"queryEqualToValue:" + priorityMethod:NO]; +} + +- (FIRDatabaseQuery *)queryEqualToValue:(id)value + childKey:(NSString *)childKey { + if ([self.queryParams.index isEqual:[FKeyIndex keyIndex]]) { + @throw [[NSException alloc] + initWithName:INVALID_QUERY_PARAM_ERROR + reason:@"You must use queryEqualToValue: instead of " + @"queryEqualTo:childKey: when using queryOrderedByKey:" + userInfo:nil]; + } + return [self queryEqualToInternal:value + childKey:childKey + from:@"queryEqualToValue:childKey:" + priorityMethod:NO]; +} + +- (FIRDatabaseQuery *)queryEqualToInternal:(id)value + childKey:(NSString *)childKey + from:(NSString *)methodName + priorityMethod:(BOOL)priorityMethod { + [self validateIndexValueType:value fromMethod:methodName]; + if (childKey != nil) { + [FValidation validateFrom:methodName validKey:childKey]; + } + if ([self.queryParams hasEnd] || [self.queryParams hasStart]) { + [NSException + raise:INVALID_QUERY_PARAM_ERROR + format: + @"Can't call %@ after queryStartingAtValue, queryEndingAtValue " + @"or queryEqualToValue was previously called", + methodName]; + } + id node = [FSnapshotUtilities nodeFrom:value]; + FQueryParams *params = [[self.queryParams startAt:node + childKey:childKey] endAt:node + childKey:childKey]; + [self validateQueryEndpointsForParams:params]; + return [[FIRDatabaseQuery alloc] + initWithRepo:self.repo + path:self.path + params:params + orderByCalled:self.orderByCalled + priorityMethodCalled:priorityMethod || self.priorityMethodCalled]; +} + +- (void)validateLimitRange:(NSUInteger)limit { + // No need to check for negative ranges, since limit is unsigned + if (limit == 0) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Limit can't be zero"]; + } + if (limit >= 1ul << 31) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Limit must be less than 2,147,483,648"]; + } +} + +- (FIRDatabaseQuery *)queryLimitedToFirst:(NSUInteger)limit { + if (self.queryParams.limitSet) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Can't call queryLimitedToFirst: if a limit was " + @"previously set"]; + } + [self validateLimitRange:limit]; + FQueryParams *params = [self.queryParams limitToFirst:limit]; + return [[FIRDatabaseQuery alloc] initWithRepo:self.repo + path:self.path + params:params + orderByCalled:self.orderByCalled + priorityMethodCalled:self.priorityMethodCalled]; +} + +- (FIRDatabaseQuery *)queryLimitedToLast:(NSUInteger)limit { + if (self.queryParams.limitSet) { + [NSException raise:INVALID_QUERY_PARAM_ERROR + format:@"Can't call queryLimitedToLast: if a limit was " + @"previously set"]; + } + [self validateLimitRange:limit]; + FQueryParams *params = [self.queryParams limitToLast:limit]; + return [[FIRDatabaseQuery alloc] initWithRepo:self.repo + path:self.path + params:params + orderByCalled:self.orderByCalled + priorityMethodCalled:self.priorityMethodCalled]; +} + +- (FIRDatabaseQuery *)queryOrderedByChild:(NSString *)indexPathString { + if ([indexPathString isEqualToString:@"$key"] || + [indexPathString isEqualToString:@".key"]) { + @throw [[NSException alloc] + initWithName:INVALID_QUERY_PARAM_ERROR + reason:[NSString stringWithFormat: + @"(queryOrderedByChild:) %@ is invalid. " + @" Use queryOrderedByKey: instead.", + indexPathString] + userInfo:nil]; + } else if ([indexPathString isEqualToString:@"$priority"] || + [indexPathString isEqualToString:@".priority"]) { + @throw [[NSException alloc] + initWithName:INVALID_QUERY_PARAM_ERROR + reason:[NSString stringWithFormat: + @"(queryOrderedByChild:) %@ is invalid. " + @" Use queryOrderedByPriority: instead.", + indexPathString] + userInfo:nil]; + } else if ([indexPathString isEqualToString:@"$value"] || + [indexPathString isEqualToString:@".value"]) { + @throw [[NSException alloc] + initWithName:INVALID_QUERY_PARAM_ERROR + reason:[NSString stringWithFormat: + @"(queryOrderedByChild:) %@ is invalid. " + @" Use queryOrderedByValue: instead.", + indexPathString] + userInfo:nil]; + } + [self validateNoPreviousOrderByCalled]; + + [FValidation validateFrom:@"queryOrderedByChild:" + validPathString:indexPathString]; + FPath *indexPath = [FPath pathWithString:indexPathString]; + if (indexPath.isEmpty) { + @throw [[NSException alloc] + initWithName:INVALID_QUERY_PARAM_ERROR + reason:[NSString + stringWithFormat:@"(queryOrderedByChild:) with an " + @"empty path is invalid. Use " + @"queryOrderedByValue: instead."] + userInfo:nil]; + } + id index = [[FPathIndex alloc] initWithPath:indexPath]; + + FQueryParams *params = [self.queryParams orderBy:index]; + [self validateQueryEndpointsForParams:params]; + return [[FIRDatabaseQuery alloc] initWithRepo:self.repo + path:self.path + params:params + orderByCalled:YES + priorityMethodCalled:self.priorityMethodCalled]; +} + +- (FIRDatabaseQuery *)queryOrderedByKey { + [self validateNoPreviousOrderByCalled]; + FQueryParams *params = [self.queryParams orderBy:[FKeyIndex keyIndex]]; + [self validateQueryEndpointsForParams:params]; + return [[FIRDatabaseQuery alloc] initWithRepo:self.repo + path:self.path + params:params + orderByCalled:YES + priorityMethodCalled:self.priorityMethodCalled]; +} + +- (FIRDatabaseQuery *)queryOrderedByValue { + [self validateNoPreviousOrderByCalled]; + FQueryParams *params = [self.queryParams orderBy:[FValueIndex valueIndex]]; + return [[FIRDatabaseQuery alloc] initWithRepo:self.repo + path:self.path + params:params + orderByCalled:YES + priorityMethodCalled:self.priorityMethodCalled]; +} + +- (FIRDatabaseQuery *)queryOrderedByPriority { + [self validateNoPreviousOrderByCalled]; + FQueryParams *params = + [self.queryParams orderBy:[FPriorityIndex priorityIndex]]; + return [[FIRDatabaseQuery alloc] initWithRepo:self.repo + path:self.path + params:params + orderByCalled:YES + priorityMethodCalled:self.priorityMethodCalled]; +} + +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + withBlock:(void (^)(FIRDataSnapshot *))block { + [FValidation validateFrom:@"observeEventType:withBlock:" + knownEventType:eventType]; + return [self observeEventType:eventType + withBlock:block + withCancelBlock:nil]; +} + +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(fbt_void_datasnapshot_nsstring)block { + [FValidation + validateFrom:@"observeEventType:andPreviousSiblingKeyWithBlock:" + knownEventType:eventType]; + return [self observeEventType:eventType + andPreviousSiblingKeyWithBlock:block + withCancelBlock:nil]; +} + +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + withBlock:(fbt_void_datasnapshot)block + withCancelBlock:(fbt_void_nserror)cancelBlock { + [FValidation validateFrom:@"observeEventType:withBlock:withCancelBlock:" + knownEventType:eventType]; + + if (eventType == FIRDataEventTypeValue) { + // Handle FIRDataEventTypeValue specially because they shouldn't have + // prevName callbacks + NSUInteger handle = [[FUtilities LUIDGenerator] integerValue]; + [self observeValueEventWithHandle:handle + withBlock:block + cancelCallback:cancelBlock]; + return handle; + } else { + // Wrap up the userCallback so we can treat everything as a callback + // that has a prevName + fbt_void_datasnapshot userCallback = [block copy]; + return [self observeEventType:eventType + andPreviousSiblingKeyWithBlock:^(FIRDataSnapshot *snapshot, + NSString *prevName) { + if (userCallback != nil) { + userCallback(snapshot); + } + } + withCancelBlock:cancelBlock]; + } +} + +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(fbt_void_datasnapshot_nsstring)block + withCancelBlock:(fbt_void_nserror)cancelBlock { + [FValidation validateFrom:@"observeEventType:" + @"andPreviousSiblingKeyWithBlock:withCancelBlock:" + knownEventType:eventType]; + + if (eventType == FIRDataEventTypeValue) { + // TODO: This gets hit by observeSingleEventOfType. Need to fix. + /* + @throw [[NSException alloc] initWithName:@"InvalidEventTypeForObserver" + reason:@"(observeEventType:andPreviousSiblingKeyWithBlock:withCancelBlock:) + Cannot use + observeEventType:andPreviousSiblingKeyWithBlock:withCancelBlock: with + FIRDataEventTypeValue. Use observeEventType:withBlock:withCancelBlock: + instead." userInfo:nil]; + */ + } + + NSUInteger handle = [[FUtilities LUIDGenerator] integerValue]; + NSDictionary *callbacks = + @{[NSNumber numberWithInteger:eventType] : [block copy]}; + [self observeChildEventWithHandle:handle + withCallbacks:callbacks + cancelCallback:cancelBlock]; + + return handle; +} + +// If we want to distinguish between value event listeners and child event +// listeners, like in the Java client, we can consider exporting this. If we do, +// add argument validation. Otherwise, arguments are validated in the +// public-facing portions of the API. Also, move the FIRDatabaseHandle logic. +- (void)observeValueEventWithHandle:(FIRDatabaseHandle)handle + withBlock:(fbt_void_datasnapshot)block + cancelCallback:(fbt_void_nserror)cancelBlock { + // Note that we don't need to copy the callbacks here, FEventRegistration + // callback properties set to copy + FValueEventRegistration *registration = + [[FValueEventRegistration alloc] initWithRepo:self.repo + handle:handle + callback:block + cancelCallback:cancelBlock]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo addEventRegistration:registration forQuery:self.querySpec]; + }); +} + +// Note: as with the above method, we may wish to expose this at some point. +- (void)observeChildEventWithHandle:(FIRDatabaseHandle)handle + withCallbacks:(NSDictionary *)callbacks + cancelCallback:(fbt_void_nserror)cancelBlock { + // Note that we don't need to copy the callbacks here, FEventRegistration + // callback properties set to copy + FChildEventRegistration *registration = + [[FChildEventRegistration alloc] initWithRepo:self.repo + handle:handle + callbacks:callbacks + cancelCallback:cancelBlock]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo addEventRegistration:registration forQuery:self.querySpec]; + }); +} + +- (void)removeObserverWithHandle:(FIRDatabaseHandle)handle { + FValueEventRegistration *event = + [[FValueEventRegistration alloc] initWithRepo:self.repo + handle:handle + callback:nil + cancelCallback:nil]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo removeEventRegistration:event forQuery:self.querySpec]; + }); +} + +- (void)removeAllObservers { + [self removeObserverWithHandle:NSNotFound]; +} + +- (void)keepSynced:(BOOL)keepSynced { + if ([self.path.getFront isEqualToString:kDotInfoPrefix]) { + [NSException raise:NSInvalidArgumentException + format:@"Can't keep query on .info tree synced (this " + @"already is the case)."]; + } + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo keepQuery:self.querySpec synced:keepSynced]; + }); +} + +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + withBlock:(fbt_void_datasnapshot)block { + + [self observeSingleEventOfType:eventType + withBlock:block + withCancelBlock:nil]; +} + +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(fbt_void_datasnapshot_nsstring)block { + + [self observeSingleEventOfType:eventType + andPreviousSiblingKeyWithBlock:block + withCancelBlock:nil]; +} + +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + withBlock:(fbt_void_datasnapshot)block + withCancelBlock:(fbt_void_nserror)cancelBlock { + + // XXX: user reported memory leak in method + + // "When you copy a block, any references to other blocks from within that + // block are copied if necessary—an entire tree may be copied (from the + // top). If you have block variables and you reference a block from within + // the block, that block will be copied." + // http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1 + // So... we don't need to do this since inside the on: we copy this block + // off the stack to the heap. + // __block fbt_void_datasnapshot userCallback = [callback copy]; + + [self observeSingleEventOfType:eventType + andPreviousSiblingKeyWithBlock:^(FIRDataSnapshot *snapshot, + NSString *prevName) { + if (block != nil) { + block(snapshot); + } + } + withCancelBlock:cancelBlock]; +} + +/** + * Attaches a listener, waits for the first event, and then removes the listener + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(fbt_void_datasnapshot_nsstring)block + withCancelBlock:(fbt_void_nserror)cancelBlock { + + // XXX: user reported memory leak in method + + // "When you copy a block, any references to other blocks from within that + // block are copied if necessary—an entire tree may be copied (from the + // top). If you have block variables and you reference a block from within + // the block, that block will be copied." + // http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1 + // So... we don't need to do this since inside the on: we copy this block + // off the stack to the heap. + // __block fbt_void_datasnapshot userCallback = [callback copy]; + + __block FIRDatabaseHandle handle; + __block BOOL firstCall = YES; + + fbt_void_datasnapshot_nsstring callback = [block copy]; + fbt_void_datasnapshot_nsstring wrappedCallback = + ^(FIRDataSnapshot *snap, NSString *prevName) { + if (firstCall) { + firstCall = NO; + [self removeObserverWithHandle:handle]; + callback(snap, prevName); + } + }; + + fbt_void_nserror cancelCallback = [cancelBlock copy]; + handle = [self observeEventType:eventType + andPreviousSiblingKeyWithBlock:wrappedCallback + withCancelBlock:^(NSError *error) { + [self removeObserverWithHandle:handle]; + + if (cancelCallback) { + cancelCallback(error); + } + }]; +} + +- (NSString *)description { + return [NSString + stringWithFormat:@"(%@ %@)", self.path, self.queryParams.description]; +} + +- (FIRDatabaseReference *)ref { + return [[FIRDatabaseReference alloc] initWithRepo:self.repo path:self.path]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRMutableData.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRMutableData.m new file mode 100644 index 00000000..5da7fae5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRMutableData.m @@ -0,0 +1,149 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRMutableData.h" +#import "FChildrenNode.h" +#import "FIRMutableData_Private.h" +#import "FIndexedNode.h" +#import "FNamedNode.h" +#import "FSnapshotHolder.h" +#import "FSnapshotUtilities.h" +#import "FTransformedEnumerator.h" + +@interface FIRMutableData () + +- (id)initWithPrefixPath:(FPath *)path + andSnapshotHolder:(FSnapshotHolder *)snapshotHolder; + +@property(strong, nonatomic) FSnapshotHolder *data; +@property(strong, nonatomic) FPath *prefixPath; + +@end + +@implementation FIRMutableData + +@synthesize data; +@synthesize prefixPath; + +- (id)initWithNode:(id)node { + FSnapshotHolder *holder = [[FSnapshotHolder alloc] init]; + FPath *path = [FPath empty]; + [holder updateSnapshot:path withNewSnapshot:node]; + return [self initWithPrefixPath:path andSnapshotHolder:holder]; +} + +- (id)initWithPrefixPath:(FPath *)path + andSnapshotHolder:(FSnapshotHolder *)snapshotHolder { + self = [super init]; + if (self) { + self.prefixPath = path; + self.data = snapshotHolder; + } + return self; +} + +- (FIRMutableData *)childDataByAppendingPath:(NSString *)path { + FPath *wholePath = [self.prefixPath childFromString:path]; + return [[FIRMutableData alloc] initWithPrefixPath:wholePath + andSnapshotHolder:self.data]; +} + +- (FIRMutableData *)parent { + if ([self.prefixPath isEmpty]) { + return nil; + } else { + FPath *path = [self.prefixPath parent]; + return [[FIRMutableData alloc] initWithPrefixPath:path + andSnapshotHolder:self.data]; + } +} + +- (void)setValue:(id)aValue { + id node = [FSnapshotUtilities nodeFrom:aValue + withValidationFrom:@"setValue:"]; + [self.data updateSnapshot:self.prefixPath withNewSnapshot:node]; +} + +- (void)setPriority:(id)aPriority { + id node = [self.data getNode:self.prefixPath]; + id pri = [FSnapshotUtilities nodeFrom:aPriority]; + node = [node updatePriority:pri]; + [self.data updateSnapshot:self.prefixPath withNewSnapshot:node]; +} + +- (id)value { + return [[self.data getNode:self.prefixPath] val]; +} + +- (id)priority { + return [[[self.data getNode:self.prefixPath] getPriority] val]; +} + +- (BOOL)hasChildren { + id node = [self.data getNode:self.prefixPath]; + return ![node isLeafNode] && ![(FChildrenNode *)node isEmpty]; +} + +- (BOOL)hasChildAtPath:(NSString *)path { + id node = [self.data getNode:self.prefixPath]; + FPath *childPath = [[FPath alloc] initWith:path]; + return ![[node getChild:childPath] isEmpty]; +} + +- (NSUInteger)childrenCount { + return [[self.data getNode:self.prefixPath] numChildren]; +} + +- (NSString *)key { + return [self.prefixPath getBack]; +} + +- (id)nodeValue { + return [self.data getNode:self.prefixPath]; +} + +- (NSEnumerator *)children { + FIndexedNode *indexedNode = + [FIndexedNode indexedNodeWithNode:self.nodeValue]; + return [[FTransformedEnumerator alloc] + initWithEnumerator:[indexedNode childEnumerator] + andTransform:^id(FNamedNode *node) { + FPath *childPath = [self.prefixPath childFromString:node.name]; + FIRMutableData *childData = + [[FIRMutableData alloc] initWithPrefixPath:childPath + andSnapshotHolder:self.data]; + return childData; + }]; +} + +- (BOOL)isEqualToData:(FIRMutableData *)other { + return self.data == other.data && + [[self.prefixPath description] + isEqualToString:[other.prefixPath description]]; +} + +- (NSString *)description { + if (self.key == nil) { + return [NSString + stringWithFormat:@"FIRMutableData (top-most transaction) %@ %@", + self.key, self.value]; + } else { + return [NSString + stringWithFormat:@"FIRMutableData (%@) %@", self.key, self.value]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRServerValue.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRServerValue.m new file mode 100644 index 00000000..928dae09 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRServerValue.m @@ -0,0 +1,33 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRServerValue.h" + +@implementation FIRServerValue + ++ (NSDictionary *)timestamp { + static NSDictionary *timestamp = nil; + if (timestamp == nil) { + timestamp = @{@".sv" : @"timestamp"}; + } + return timestamp; +} + ++ (NSDictionary *)increment:(NSNumber *)delta { + return @{@".sv" : @{@"increment" : delta}}; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRTransactionResult.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRTransactionResult.m new file mode 100644 index 00000000..9fec8626 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/FIRTransactionResult.m @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRTransactionResult.h" +#import "FIRTransactionResult_Private.h" + +@implementation FIRTransactionResult + +@synthesize update; +@synthesize isSuccess; + ++ (FIRTransactionResult *)successWithValue:(FIRMutableData *)value { + FIRTransactionResult *result = [[FIRTransactionResult alloc] init]; + result.isSuccess = YES; + result.update = value; + return result; +} + ++ (FIRTransactionResult *)abort { + FIRTransactionResult *result = [[FIRTransactionResult alloc] init]; + result.isSuccess = NO; + result.update = nil; + return result; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDataSnapshot_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDataSnapshot_Private.h new file mode 100644 index 00000000..ac23045b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDataSnapshot_Private.h @@ -0,0 +1,28 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDataSnapshot.h" +#import "FIndexedNode.h" +#import "FTypedefs_Private.h" + +@interface FIRDataSnapshot () + +// in _Private for testing purposes +@property(nonatomic, strong) FIndexedNode *node; + +- (id)initWithRef:(FIRDatabaseReference *)ref indexedNode:(FIndexedNode *)node; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabaseQuery_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabaseQuery_Private.h new file mode 100644 index 00000000..30f19f02 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabaseQuery_Private.h @@ -0,0 +1,43 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseQuery.h" +#import "FPath.h" +#import "FQueryParams.h" +#import "FRepo.h" +#import "FRepoManager.h" +#import "FTypedefs_Private.h" + +@interface FIRDatabaseQuery () + ++ (dispatch_queue_t)sharedQueue; + +- (id)initWithRepo:(FRepo *)repo path:(FPath *)path; +- (id)initWithRepo:(FRepo *)repo + path:(FPath *)path + params:(FQueryParams *)params + orderByCalled:(BOOL)orderByCalled + priorityMethodCalled:(BOOL)priorityMethodCalled; + +@property(nonatomic, strong) FRepo *repo; +@property(nonatomic, strong) FPath *path; +@property(nonatomic, strong) FQueryParams *queryParams; +@property(nonatomic) BOOL orderByCalled; +@property(nonatomic) BOOL priorityMethodCalled; + +- (FQuerySpec *)querySpec; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabaseReference_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabaseReference_Private.h new file mode 100644 index 00000000..1d7e37c7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabaseReference_Private.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseConfig.h" +#import "FIRDatabaseReference.h" +#import "FRepo.h" +#import "FTypedefs_Private.h" + +@interface FIRDatabaseReference () + +- (id)initWithConfig:(FIRDatabaseConfig *)config; +- (id)initWithRepo:(FRepo *)repo path:(FPath *)path; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabase_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabase_Private.h new file mode 100644 index 00000000..0ff3e70f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRDatabase_Private.h @@ -0,0 +1,37 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabase.h" + +@class FRepo; +@class FRepoInfo; +@class FIRDatabaseConfig; + +@interface FIRDatabase () + +@property(nonatomic, strong) FRepoInfo *repoInfo; +@property(nonatomic, strong) FIRDatabaseConfig *config; +@property(nonatomic, strong) FRepo *repo; + +- (id)initWithApp:(FIRApp *)app + repoInfo:(FRepoInfo *)info + config:(FIRDatabaseConfig *)config; + ++ (NSString *)buildVersion; ++ (FIRDatabase *)createDatabaseForTests:(FRepoInfo *)repoInfo + config:(FIRDatabaseConfig *)config; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRMutableData_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRMutableData_Private.h new file mode 100644 index 00000000..fded102f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRMutableData_Private.h @@ -0,0 +1,26 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRMutableData.h" +#import "FNode.h" + +@interface FIRMutableData () + +- (id)initWithNode:(id)node; +- (id)nodeValue; +- (BOOL)isEqualToData:(FIRMutableData *)other; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRTransactionResult_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRTransactionResult_Private.h new file mode 100644 index 00000000..bdf250ac --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FIRTransactionResult_Private.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRMutableData.h" +#import "FIRTransactionResult.h" + +@interface FIRTransactionResult () + +@property(nonatomic) BOOL isSuccess; +@property(nonatomic, strong) FIRMutableData *update; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FTypedefs_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FTypedefs_Private.h new file mode 100644 index 00000000..dac55bcc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Api/Private/FTypedefs_Private.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __FTYPEDEFS_PRIVATE__ +#define __FTYPEDEFS_PRIVATE__ + +#import + +typedef NS_ENUM(NSInteger, FTransactionStatus) { + FTransactionInitializing, // 0 + FTransactionRun, // 1 + FTransactionSent, // 2 + FTransactionCompleted, // 3 + FTransactionSentNeedsAbort, // 4 + FTransactionNeedsAbort // 5 +}; + +@protocol FNode; +@class FPath; +@class FIRTransactionResult; +@class FIRMutableData; +@class FIRDataSnapshot; +@class FCompoundHash; + +typedef void (^fbt_void_nserror_bool_datasnapshot)(NSError *error, + BOOL committed, + FIRDataSnapshot *snapshot); +typedef FIRTransactionResult * (^fbt_transactionresult_mutabledata)( + FIRMutableData *currentData); +typedef void (^fbt_void_path_node)(FPath *, id); +typedef void (^fbt_void_nsstring)(NSString *); +typedef BOOL (^fbt_bool_nsstring_node)(NSString *, id); +typedef void (^fbt_void_path_node_marray)(FPath *, id, NSMutableArray *); +typedef BOOL (^fbt_bool_void)(void); +typedef void (^fbt_void_nsstring_nsstring)(NSString *str1, NSString *str2); +typedef void (^fbt_void_nsstring_nserror)(NSString *str, NSError *error); +typedef BOOL (^fbt_bool_path)(FPath *str); +typedef void (^fbt_void_id)(id data); +typedef NSString * (^fbt_nsstring_void)(void); +typedef FCompoundHash * (^fbt_compoundhash_void)(void); +typedef NSArray * (^fbt_nsarray_nsstring_id)(NSString *status, id Data); +typedef NSArray * (^fbt_nsarray_nsstring)(NSString *status); + +// WWDC 2012 session 712 starting in page 83 for saving blocks in properties +// (use @property (strong) type name). + +#endif diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Constants/FConstants.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Constants/FConstants.h new file mode 100644 index 00000000..ae237a6c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Constants/FConstants.h @@ -0,0 +1,195 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef Firebase_FConstants_h +#define Firebase_FConstants_h + +#import + +#pragma mark - +#pragma mark Wire Protocol Envelope Constants + +FOUNDATION_EXPORT NSString *const kFWPRequestType; +FOUNDATION_EXPORT NSString *const kFWPRequestTypeData; +FOUNDATION_EXPORT NSString *const kFWPRequestDataPayload; +FOUNDATION_EXPORT NSString *const kFWPRequestNumber; +FOUNDATION_EXPORT NSString *const kFWPRequestPayloadBody; +FOUNDATION_EXPORT NSString *const kFWPRequestError; +FOUNDATION_EXPORT NSString *const kFWPRequestAction; +FOUNDATION_EXPORT NSString *const kFWPResponseForRNData; +FOUNDATION_EXPORT NSString *const kFWPResponseForActionStatus; +FOUNDATION_EXPORT NSString *const kFWPResponseForActionStatusOk; +FOUNDATION_EXPORT NSString *const kFWPResponseForActionStatusDataStale; +FOUNDATION_EXPORT NSString *const kFWPResponseForActionData; +FOUNDATION_EXPORT NSString *const kFWPResponseDataWarnings; + +FOUNDATION_EXPORT NSString *const kFWPAsyncServerAction; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerPayloadBody; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataUpdate; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataMerge; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataRangeMerge; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerAuthRevoked; +FOUNDATION_EXPORT NSString *const kFWPASyncServerListenCancelled; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerSecurityDebug; +FOUNDATION_EXPORT NSString + *const kFWPAsyncServerDataUpdateBodyPath; // {"a": "d", "b": {"p": "/", "d": + // """}} +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataUpdateBodyData; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataUpdateStartPath; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataUpdateEndPath; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataUpdateRangeMerge; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataUpdateBodyTag; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataQueries; + +FOUNDATION_EXPORT NSString *const kFWPAsyncServerEnvelopeType; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerEnvelopeData; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerControlMessage; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerControlMessageType; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerControlMessageData; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerDataMessage; + +FOUNDATION_EXPORT NSString *const kFWPAsyncServerHello; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerHelloTimestamp; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerHelloVersion; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerHelloConnectedHost; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerHelloSession; + +FOUNDATION_EXPORT NSString *const kFWPAsyncServerControlMessageShutdown; +FOUNDATION_EXPORT NSString *const kFWPAsyncServerControlMessageReset; + +#pragma mark - +#pragma mark Wire Protocol Payload Constants + +FOUNDATION_EXPORT NSString *const kFWPRequestActionPut; +FOUNDATION_EXPORT NSString *const kFWPRequestActionMerge; +FOUNDATION_EXPORT NSString *const kFWPRequestActionTaggedListen; +FOUNDATION_EXPORT NSString *const kFWPRequestActionTaggedUnlisten; +FOUNDATION_EXPORT NSString + *const kFWPRequestActionListen; // {"t": "d", "d": {"r": 1, "a": "l", "b": { + // "p": "/" } } } +FOUNDATION_EXPORT NSString *const kFWPRequestActionUnlisten; +FOUNDATION_EXPORT NSString *const kFWPRequestActionStats; +FOUNDATION_EXPORT NSString *const kFWPRequestActionDisconnectPut; +FOUNDATION_EXPORT NSString *const kFWPRequestActionDisconnectMerge; +FOUNDATION_EXPORT NSString *const kFWPRequestActionDisconnectCancel; +FOUNDATION_EXPORT NSString *const kFWPRequestActionAuth; +FOUNDATION_EXPORT NSString *const kFWPRequestActionUnauth; +FOUNDATION_EXPORT NSString *const kFWPRequestCredential; +FOUNDATION_EXPORT NSString *const kFWPRequestPath; +FOUNDATION_EXPORT NSString *const kFWPRequestCounters; +FOUNDATION_EXPORT NSString *const kFWPRequestQueries; +FOUNDATION_EXPORT NSString *const kFWPRequestTag; +FOUNDATION_EXPORT NSString *const kFWPRequestData; +FOUNDATION_EXPORT NSString *const kFWPRequestHash; +FOUNDATION_EXPORT NSString *const kFWPRequestCompoundHash; +FOUNDATION_EXPORT NSString *const kFWPRequestCompoundHashPaths; +FOUNDATION_EXPORT NSString *const kFWPRequestCompoundHashHashes; +FOUNDATION_EXPORT NSString *const kFWPRequestStatus; + +#pragma mark - +#pragma mark Websock Transport Constants + +FOUNDATION_EXPORT NSString *const kWireProtocolVersionParam; +FOUNDATION_EXPORT NSString *const kWebsocketProtocolVersion; +FOUNDATION_EXPORT NSString *const kWebsocketServerKillPacket; +FOUNDATION_EXPORT const int kWebsocketMaxFrameSize; +FOUNDATION_EXPORT NSUInteger const kWebsocketKeepaliveInterval; +FOUNDATION_EXPORT NSUInteger const kWebsocketConnectTimeout; + +FOUNDATION_EXPORT float const kPersistentConnReconnectMinDelay; +FOUNDATION_EXPORT float const kPersistentConnReconnectMaxDelay; +FOUNDATION_EXPORT float const kPersistentConnReconnectMultiplier; +FOUNDATION_EXPORT float const + kPersistentConnSuccessfulConnectionEstablishedDelay; + +#pragma mark - +#pragma mark Query / QueryParams constants + +FOUNDATION_EXPORT NSString *const kQueryDefault; +FOUNDATION_EXPORT NSString *const kQueryDefaultObject; +FOUNDATION_EXPORT NSString *const kViewManagerDictConstView; +FOUNDATION_EXPORT NSString *const kFQPIndexStartValue; +FOUNDATION_EXPORT NSString *const kFQPIndexStartName; +FOUNDATION_EXPORT NSString *const kFQPIndexEndValue; +FOUNDATION_EXPORT NSString *const kFQPIndexEndName; +FOUNDATION_EXPORT NSString *const kFQPLimit; +FOUNDATION_EXPORT NSString *const kFQPViewFrom; +FOUNDATION_EXPORT NSString *const kFQPViewFromLeft; +FOUNDATION_EXPORT NSString *const kFQPViewFromRight; +FOUNDATION_EXPORT NSString *const kFQPIndex; + +#pragma mark - +#pragma mark Interrupt Reasons + +FOUNDATION_EXPORT NSString *const kFInterruptReasonServerKill; +FOUNDATION_EXPORT NSString *const kFInterruptReasonWaitingForOpen; +FOUNDATION_EXPORT NSString *const kFInterruptReasonRepoInterrupt; +FOUNDATION_EXPORT NSString *const kFInterruptReasonAuthExpired; + +#pragma mark - +#pragma mark Payload constants + +FOUNDATION_EXPORT NSString *const kPayloadPriority; +FOUNDATION_EXPORT NSString *const kPayloadValue; +FOUNDATION_EXPORT NSString *const kPayloadMetadataPrefix; + +#pragma mark - +#pragma mark ServerValue constants + +FOUNDATION_EXPORT NSString *const kServerValueSubKey; +FOUNDATION_EXPORT NSString *const kServerValuePriority; + +#pragma mark - +#pragma mark.info/ constants + +FOUNDATION_EXPORT NSString *const kDotInfoPrefix; +FOUNDATION_EXPORT NSString *const kDotInfoConnected; +FOUNDATION_EXPORT NSString *const kDotInfoServerTimeOffset; + +#pragma mark - +#pragma mark ObjectiveC to JavaScript type constants + +FOUNDATION_EXPORT NSString *const kJavaScriptObject; +FOUNDATION_EXPORT NSString *const kJavaScriptString; +FOUNDATION_EXPORT NSString *const kJavaScriptBoolean; +FOUNDATION_EXPORT NSString *const kJavaScriptNumber; +FOUNDATION_EXPORT NSString *const kJavaScriptNull; +FOUNDATION_EXPORT NSString *const kJavaScriptTrue; +FOUNDATION_EXPORT NSString *const kJavaScriptFalse; + +#pragma mark - +#pragma mark Error handling constants + +FOUNDATION_EXPORT NSString *const kFErrorDomain; +FOUNDATION_EXPORT NSUInteger const kFAuthError; +FOUNDATION_EXPORT NSString *const kFErrorWriteCanceled; + +#pragma mark - +#pragma mark Validation Constants + +FOUNDATION_EXPORT NSUInteger const kFirebaseMaxObjectDepth; +FOUNDATION_EXPORT const unsigned int kFirebaseMaxLeafSize; + +#pragma mark - +#pragma mark Transaction Constants + +FOUNDATION_EXPORT NSUInteger const kFTransactionMaxRetries; +FOUNDATION_EXPORT NSString *const kFTransactionTooManyRetries; +FOUNDATION_EXPORT NSString *const kFTransactionNoData; +FOUNDATION_EXPORT NSString *const kFTransactionSet; +FOUNDATION_EXPORT NSString *const kFTransactionDisconnect; + +#endif diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Constants/FConstants.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Constants/FConstants.m new file mode 100644 index 00000000..23439917 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Constants/FConstants.m @@ -0,0 +1,185 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FConstants.h" + +#pragma mark - +#pragma mark Wire Protocol Envelope Constants + +NSString *const kFWPRequestType = @"t"; +NSString *const kFWPRequestTypeData = @"d"; +NSString *const kFWPRequestDataPayload = @"d"; +NSString *const kFWPRequestNumber = @"r"; +NSString *const kFWPRequestPayloadBody = @"b"; +NSString *const kFWPRequestError = @"error"; +NSString *const kFWPRequestAction = @"a"; +NSString *const kFWPResponseForRNData = @"b"; +NSString *const kFWPResponseForActionStatus = @"s"; +NSString *const kFWPResponseForActionStatusOk = @"ok"; +NSString *const kFWPResponseForActionStatusDataStale = @"datastale"; +NSString *const kFWPResponseForActionData = @"d"; +NSString *const kFWPResponseDataWarnings = @"w"; +NSString *const kFWPAsyncServerAction = @"a"; +NSString *const kFWPAsyncServerPayloadBody = @"b"; +NSString *const kFWPAsyncServerDataUpdate = @"d"; +NSString *const kFWPAsyncServerDataMerge = @"m"; +NSString *const kFWPAsyncServerDataRangeMerge = @"rm"; +NSString *const kFWPAsyncServerAuthRevoked = @"ac"; +NSString *const kFWPASyncServerListenCancelled = @"c"; +NSString *const kFWPAsyncServerSecurityDebug = @"sd"; +NSString *const kFWPAsyncServerDataUpdateBodyPath = + @"p"; // {"a": "d", "b": {"p": "/", "d": ""}} +NSString *const kFWPAsyncServerDataUpdateBodyData = @"d"; +NSString *const kFWPAsyncServerDataUpdateStartPath = @"s"; +NSString *const kFWPAsyncServerDataUpdateEndPath = @"e"; +NSString *const kFWPAsyncServerDataUpdateRangeMerge = @"m"; +NSString *const kFWPAsyncServerDataUpdateBodyTag = @"t"; +NSString *const kFWPAsyncServerDataQueries = @"q"; + +NSString *const kFWPAsyncServerEnvelopeType = @"t"; +NSString *const kFWPAsyncServerEnvelopeData = @"d"; +NSString *const kFWPAsyncServerControlMessage = @"c"; +NSString *const kFWPAsyncServerControlMessageType = @"t"; +NSString *const kFWPAsyncServerControlMessageData = @"d"; +NSString *const kFWPAsyncServerDataMessage = @"d"; + +NSString *const kFWPAsyncServerHello = @"h"; +NSString *const kFWPAsyncServerHelloTimestamp = @"ts"; +NSString *const kFWPAsyncServerHelloVersion = @"v"; +NSString *const kFWPAsyncServerHelloConnectedHost = @"h"; +NSString *const kFWPAsyncServerHelloSession = @"s"; + +NSString *const kFWPAsyncServerControlMessageShutdown = @"s"; +NSString *const kFWPAsyncServerControlMessageReset = @"r"; + +#pragma mark - +#pragma mark Wire Protocol Payload Constants + +NSString *const kFWPRequestActionPut = @"p"; +NSString *const kFWPRequestActionMerge = @"m"; +NSString *const kFWPRequestActionListen = + @"l"; // {"t": "d", "d": {"r": 1, "a": "l", "b": { "p": "/" } } } +NSString *const kFWPRequestActionUnlisten = @"u"; +NSString *const kFWPRequestActionStats = @"s"; +NSString *const kFWPRequestActionTaggedListen = @"q"; +NSString *const kFWPRequestActionTaggedUnlisten = @"n"; +NSString *const kFWPRequestActionDisconnectPut = @"o"; +NSString *const kFWPRequestActionDisconnectMerge = @"om"; +NSString *const kFWPRequestActionDisconnectCancel = @"oc"; +NSString *const kFWPRequestActionAuth = @"auth"; +NSString *const kFWPRequestActionUnauth = @"unauth"; +NSString *const kFWPRequestCredential = @"cred"; +NSString *const kFWPRequestPath = @"p"; +NSString *const kFWPRequestCounters = @"c"; +NSString *const kFWPRequestQueries = @"q"; +NSString *const kFWPRequestTag = @"t"; +NSString *const kFWPRequestData = @"d"; +NSString *const kFWPRequestHash = @"h"; +NSString *const kFWPRequestCompoundHash = @"ch"; +NSString *const kFWPRequestCompoundHashPaths = @"ps"; +NSString *const kFWPRequestCompoundHashHashes = @"hs"; +NSString *const kFWPRequestStatus = @"s"; + +#pragma mark - +#pragma mark Websock Transport Constants + +NSString *const kWireProtocolVersionParam = @"v"; +NSString *const kWebsocketProtocolVersion = @"5"; +NSString *const kWebsocketServerKillPacket = @"kill"; +const int kWebsocketMaxFrameSize = 16384; +NSUInteger const kWebsocketKeepaliveInterval = 45; +NSUInteger const kWebsocketConnectTimeout = 30; + +float const kPersistentConnReconnectMinDelay = 1.0; +float const kPersistentConnReconnectMaxDelay = 30.0; +float const kPersistentConnReconnectMultiplier = 1.3f; +float const kPersistentConnSuccessfulConnectionEstablishedDelay = 30.0; + +#pragma mark - +#pragma mark Query constants + +NSString *const kQueryDefault = @"default"; +NSString *const kQueryDefaultObject = @"{}"; +NSString *const kViewManagerDictConstView = @"view"; +NSString *const kFQPIndexStartValue = @"sp"; +NSString *const kFQPIndexStartName = @"sn"; +NSString *const kFQPIndexEndValue = @"ep"; +NSString *const kFQPIndexEndName = @"en"; +NSString *const kFQPLimit = @"l"; +NSString *const kFQPViewFrom = @"vf"; +NSString *const kFQPViewFromLeft = @"l"; +NSString *const kFQPViewFromRight = @"r"; +NSString *const kFQPIndex = @"i"; + +#pragma mark - +#pragma mark Interrupt Reasons + +NSString *const kFInterruptReasonServerKill = @"server_kill"; +NSString *const kFInterruptReasonWaitingForOpen = @"waiting_for_open"; +NSString *const kFInterruptReasonRepoInterrupt = @"repo_interrupt"; + +#pragma mark - +#pragma mark Payload constants + +NSString *const kPayloadPriority = @".priority"; +NSString *const kPayloadValue = @".value"; +NSString *const kPayloadMetadataPrefix = @"."; + +#pragma mark - +#pragma mark ServerValue constants + +NSString *const kServerValueSubKey = @".sv"; +NSString *const kServerValuePriority = @"timestamp"; + +#pragma mark - +#pragma mark.info/ constants + +NSString *const kDotInfoPrefix = @".info"; +NSString *const kDotInfoConnected = @"connected"; +NSString *const kDotInfoServerTimeOffset = @"serverTimeOffset"; + +#pragma mark - +#pragma mark ObjectiveC to JavaScript type constants + +NSString *const kJavaScriptObject = @"object"; +NSString *const kJavaScriptString = @"string"; +NSString *const kJavaScriptBoolean = @"boolean"; +NSString *const kJavaScriptNumber = @"number"; +NSString *const kJavaScriptNull = @"null"; +NSString *const kJavaScriptTrue = @"true"; +NSString *const kJavaScriptFalse = @"false"; + +#pragma mark - +#pragma mark Error handling constants + +NSString *const kFErrorDomain = @"com.firebase"; +NSUInteger const kFAuthError = 1; +NSString *const kFErrorWriteCanceled = @"write_canceled"; + +#pragma mark - +#pragma mark Validation Constants + +NSUInteger const kFirebaseMaxObjectDepth = 1000; +const unsigned int kFirebaseMaxLeafSize = 1024 * 1024 * 10; // 10 MB + +#pragma mark - +#pragma mark Transaction Constants + +NSUInteger const kFTransactionMaxRetries = 25; +NSString *const kFTransactionTooManyRetries = @"maxretry"; +NSString *const kFTransactionNoData = @"nodata"; +NSString *const kFTransactionSet = @"set"; +NSString *const kFTransactionDisconnect = @"disconnect"; diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FCompoundHash.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FCompoundHash.h new file mode 100644 index 00000000..2453a81a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FCompoundHash.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FNode.h" + +@interface FCompoundHashBuilder : NSObject + +- (FPath *)currentPath; + +@end + +typedef BOOL (^FCompoundHashSplitStrategy)(FCompoundHashBuilder *builder); + +@interface FCompoundHash : NSObject + +@property(nonatomic, strong, readonly) NSArray *posts; +@property(nonatomic, strong, readonly) NSArray *hashes; + ++ (FCompoundHash *)fromNode:(id)node; ++ (FCompoundHash *)fromNode:(id)node + splitStrategy:(FCompoundHashSplitStrategy)strategy; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FCompoundHash.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FCompoundHash.m new file mode 100644 index 00000000..ced79cd6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FCompoundHash.m @@ -0,0 +1,259 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FCompoundHash.h" +#import "FChildrenNode.h" +#import "FLeafNode.h" +#import "FSnapshotUtilities.h" +#import "FStringUtilities.h" + +@interface FCompoundHashBuilder () + +@property(nonatomic, strong) FCompoundHashSplitStrategy splitStrategy; + +@property(nonatomic, strong) NSMutableArray *currentPaths; +@property(nonatomic, strong) NSMutableArray *currentHashes; + +@end + +@implementation FCompoundHashBuilder { + + // NOTE: We use the existence of this to know if we've started building a + // range (i.e. encountered a leaf node). + NSMutableString *optHashValueBuilder; + + // The current path as a stack. This is used in combination with + // currentPathDepth to simultaneously store the last leaf node path. The + // depth is changed when descending and ascending, at the same time the + // current key is set for the current depth. Because the keys are left + // unchanged for ascending the path will also contain the path of the last + // visited leaf node (using lastLeafDepth elements) + NSMutableArray *currentPath; + NSInteger lastLeafDepth; + NSInteger currentPathDepth; + + BOOL needsComma; +} + +- (instancetype)initWithSplitStrategy:(FCompoundHashSplitStrategy)strategy { + self = [super init]; + if (self != nil) { + self->_splitStrategy = strategy; + self->optHashValueBuilder = nil; + self->currentPath = [NSMutableArray array]; + self->lastLeafDepth = -1; + self->currentPathDepth = 0; + self->needsComma = YES; + self->_currentPaths = [NSMutableArray array]; + self->_currentHashes = [NSMutableArray array]; + } + return self; +} + +- (BOOL)isBuildingRange { + return self->optHashValueBuilder != nil; +} + +- (NSUInteger)currentHashLength { + return self->optHashValueBuilder.length; +} + +- (FPath *)currentPath { + return [self currentPathWithDepth:self->currentPathDepth]; +} + +- (FPath *)currentPathWithDepth:(NSInteger)depth { + NSArray *pieces = + [self->currentPath subarrayWithRange:NSMakeRange(0, depth)]; + return [[FPath alloc] initWithPieces:pieces andPieceNum:0]; +} + +- (void)enumerateCurrentPathToDepth:(NSInteger)depth + withBlock:(void (^)(NSString *key))block { + for (NSInteger i = 0; i < depth; i++) { + block(self->currentPath[i]); + } +} + +- (void)appendKey:(NSString *)key toString:(NSMutableString *)string { + [FSnapshotUtilities appendHashV2RepresentationForString:key + toString:string]; +} + +- (void)ensureRange { + if (![self isBuildingRange]) { + optHashValueBuilder = [NSMutableString string]; + [optHashValueBuilder appendString:@"("]; + [self + enumerateCurrentPathToDepth:self->currentPathDepth + withBlock:^(NSString *key) { + [self appendKey:key + toString:self->optHashValueBuilder]; + [self->optHashValueBuilder appendString:@":("]; + }]; + self->needsComma = NO; + } +} + +- (void)processLeaf:(FLeafNode *)leafNode { + [self ensureRange]; + + self->lastLeafDepth = self->currentPathDepth; + [FSnapshotUtilities + appendHashRepresentationForLeafNode:leafNode + toString:self->optHashValueBuilder + hashVersion:FDataHashVersionV2]; + self->needsComma = YES; + if (self.splitStrategy(self)) { + [self endRange]; + } +} + +- (void)startChild:(NSString *)key { + [self ensureRange]; + + if (self->needsComma) { + [self->optHashValueBuilder appendString:@","]; + } + [self appendKey:key toString:self->optHashValueBuilder]; + [self->optHashValueBuilder appendString:@":("]; + if (self->currentPathDepth == currentPath.count) { + [self->currentPath addObject:key]; + } else { + self->currentPath[self->currentPathDepth] = key; + } + self->currentPathDepth++; + self->needsComma = NO; +} + +- (void)endChild { + self->currentPathDepth--; + if ([self isBuildingRange]) { + [self->optHashValueBuilder appendString:@")"]; + } + self->needsComma = YES; +} + +- (void)finishHashing { + NSAssert(self->currentPathDepth == 0, + @"Can't finish hashing in the middle of processing a child"); + if ([self isBuildingRange]) { + [self endRange]; + } + + // Always close with the empty hash for the remaining range to allow simple + // appending + [self.currentHashes addObject:@""]; +} + +- (void)endRange { + NSAssert([self isBuildingRange], + @"Can't end range without starting a range!"); + // Add closing parenthesis for current depth + for (NSUInteger i = 0; i < currentPathDepth; i++) { + [self->optHashValueBuilder appendString:@")"]; + } + [self->optHashValueBuilder appendString:@")"]; + + FPath *lastLeafPath = [self currentPathWithDepth:self->lastLeafDepth]; + NSString *hash = + [FStringUtilities base64EncodedSha1:self->optHashValueBuilder]; + [self.currentHashes addObject:hash]; + [self.currentPaths addObject:lastLeafPath]; + + self->optHashValueBuilder = nil; +} + +@end + +@interface FCompoundHash () + +@property(nonatomic, strong, readwrite) NSArray *posts; +@property(nonatomic, strong, readwrite) NSArray *hashes; + +@end + +@implementation FCompoundHash + +- (id)initWithPosts:(NSArray *)posts hashes:(NSArray *)hashes { + self = [super init]; + if (self != nil) { + if (posts.count != hashes.count - 1) { + [NSException raise:NSInvalidArgumentException + format:@"Number of posts need to be n-1 for n hashes " + @"in FCompoundHash"]; + } + self.posts = posts; + self.hashes = hashes; + } + return self; +} + ++ (FCompoundHashSplitStrategy)simpleSizeSplitStrategyForNode:(id)node { + NSUInteger estimatedSize = + [FSnapshotUtilities estimateSerializedNodeSize:node]; + + // Splits for + // 1k -> 512 (2 parts) + // 5k -> 715 (7 parts) + // 100k -> 3.2k (32 parts) + // 500k -> 7k (71 parts) + // 5M -> 23k (228 parts) + NSUInteger splitThreshold = MAX(512, (NSUInteger)sqrt(estimatedSize * 100)); + + return ^BOOL(FCompoundHashBuilder *builder) { + // Never split on priorities + return [builder currentHashLength] > splitThreshold && + ![[[builder currentPath] getBack] isEqualToString:@".priority"]; + }; +} + ++ (FCompoundHash *)fromNode:(id)node { + return [FCompoundHash + fromNode:node + splitStrategy:[FCompoundHash simpleSizeSplitStrategyForNode:node]]; +} + ++ (FCompoundHash *)fromNode:(id)node + splitStrategy:(FCompoundHashSplitStrategy)strategy { + if ([node isEmpty]) { + return [[FCompoundHash alloc] initWithPosts:@[] hashes:@[ @"" ]]; + } else { + FCompoundHashBuilder *builder = + [[FCompoundHashBuilder alloc] initWithSplitStrategy:strategy]; + [FCompoundHash processNode:node builder:builder]; + [builder finishHashing]; + return [[FCompoundHash alloc] initWithPosts:builder.currentPaths + hashes:builder.currentHashes]; + } +} + ++ (void)processNode:(id)node builder:(FCompoundHashBuilder *)builder { + if ([node isLeafNode]) { + [builder processLeaf:node]; + } else { + NSAssert(![node isEmpty], @"Can't calculate hash on empty node!"); + FChildrenNode *childrenNode = (FChildrenNode *)node; + [childrenNode enumerateChildrenAndPriorityUsingBlock:^( + NSString *key, id node, BOOL *stop) { + [builder startChild:key]; + [self processNode:node builder:builder]; + [builder endChild]; + }]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FListenProvider.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FListenProvider.h new file mode 100644 index 00000000..8efd803a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FListenProvider.h @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTypedefs_Private.h" + +@class FQuerySpec; +@protocol FSyncTreeHash; + +typedef NSArray * (^fbt_startListeningBlock)(FQuerySpec *query, NSNumber *tagId, + id hash, + fbt_nsarray_nsstring onComplete); +typedef void (^fbt_stopListeningBlock)(FQuerySpec *query, NSNumber *tagId); + +@interface FListenProvider : NSObject + +@property(nonatomic, copy) fbt_startListeningBlock startListening; +@property(nonatomic, copy) fbt_stopListeningBlock stopListening; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FListenProvider.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FListenProvider.m new file mode 100644 index 00000000..27da015c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FListenProvider.m @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FListenProvider.h" +#import "FIRDatabaseQuery.h" + +@implementation FListenProvider + +@synthesize startListening; +@synthesize stopListening; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FPersistentConnection.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FPersistentConnection.h new file mode 100644 index 00000000..81836fd0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FPersistentConnection.h @@ -0,0 +1,99 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FConnection.h" +#import "FRepoInfo.h" +#import "FTypedefs.h" +#import "FTypedefs_Private.h" +#import + +@protocol FPersistentConnectionDelegate; +@protocol FSyncTreeHash; +@class FQuerySpec; +@class FIRDatabaseConfig; + +@interface FPersistentConnection : NSObject + +@property(nonatomic, weak) id delegate; +@property(nonatomic) BOOL pauseWrites; + +- (id)initWithRepoInfo:(FRepoInfo *)repoInfo + dispatchQueue:(dispatch_queue_t)queue + config:(FIRDatabaseConfig *)config; + +- (void)open; + +- (void)putData:(id)data + forPath:(NSString *)pathString + withHash:(NSString *)hash + withCallback:(fbt_void_nsstring_nsstring)onComplete; +- (void)mergeData:(id)data + forPath:(NSString *)pathString + withCallback:(fbt_void_nsstring_nsstring)onComplete; + +- (void)listen:(FQuerySpec *)query + tagId:(NSNumber *)tagId + hash:(id)hash + onComplete:(fbt_void_nsstring)onComplete; + +- (void)unlisten:(FQuerySpec *)query tagId:(NSNumber *)tagId; +- (void)refreshAuthToken:(NSString *)token; +- (void)onDisconnectPutData:(id)data + forPath:(FPath *)path + withCallback:(fbt_void_nsstring_nsstring)callback; +- (void)onDisconnectMergeData:(id)data + forPath:(FPath *)path + withCallback:(fbt_void_nsstring_nsstring)callback; +- (void)onDisconnectCancelPath:(FPath *)path + withCallback:(fbt_void_nsstring_nsstring)callback; +- (void)ackPuts; +- (void)purgeOutstandingWrites; + +- (void)interruptForReason:(NSString *)reason; +- (void)resumeForReason:(NSString *)reason; +- (BOOL)isInterruptedForReason:(NSString *)reason; + +// FConnection delegate methods +- (void)onReady:(FConnection *)fconnection + atTime:(NSNumber *)timestamp + sessionID:(NSString *)sessionID; +- (void)onDataMessage:(FConnection *)fconnection + withMessage:(NSDictionary *)message; +- (void)onDisconnect:(FConnection *)fconnection + withReason:(FDisconnectReason)reason; +- (void)onKill:(FConnection *)fconnection withReason:(NSString *)reason; + +// Testing methods +- (NSDictionary *)dumpListens; + +@end + +@protocol FPersistentConnectionDelegate + +- (void)onDataUpdate:(FPersistentConnection *)fpconnection + forPath:(NSString *)pathString + message:(id)message + isMerge:(BOOL)isMerge + tagId:(NSNumber *)tagId; +- (void)onRangeMerge:(NSArray *)ranges + forPath:(NSString *)path + tagId:(NSNumber *)tag; +- (void)onConnect:(FPersistentConnection *)fpconnection; +- (void)onDisconnect:(FPersistentConnection *)fpconnection; +- (void)onServerInfoUpdate:(FPersistentConnection *)fpconnection + updates:(NSDictionary *)updates; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FPersistentConnection.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FPersistentConnection.m new file mode 100644 index 00000000..4a7b9e3c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FPersistentConnection.m @@ -0,0 +1,1142 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +#import "FAtomicNumber.h" +#import "FAuthTokenProvider.h" +#import "FCompoundHash.h" +#import "FConstants.h" +#import "FIRDatabaseConfig.h" +#import "FIRDatabaseConfig_Private.h" +#import "FIRDatabaseReference.h" +#import "FIRRetryHelper.h" +#import "FIndex.h" +#import "FPersistentConnection.h" +#import "FQueryParams.h" +#import "FQuerySpec.h" +#import "FRangeMerge.h" +#import "FSnapshotUtilities.h" +#import "FSyncTree.h" +#import "FTupleCallbackStatus.h" +#import "FTupleOnDisconnect.h" +#import "FUtilities.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import +#import +#import + +@interface FOutstandingQuery : NSObject + +@property(nonatomic, strong) FQuerySpec *query; +@property(nonatomic, strong) NSNumber *tagId; +@property(nonatomic, strong) id syncTreeHash; +@property(nonatomic, copy) fbt_void_nsstring onComplete; + +@end + +@implementation FOutstandingQuery + +@end + +@interface FOutstandingPut : NSObject + +@property(nonatomic, strong) NSString *action; +@property(nonatomic, strong) NSDictionary *request; +@property(nonatomic, copy) fbt_void_nsstring_nsstring onCompleteBlock; +@property(nonatomic) BOOL sent; + +@end + +@implementation FOutstandingPut + +@end + +typedef enum { + ConnectionStateDisconnected, + ConnectionStateGettingToken, + ConnectionStateConnecting, + ConnectionStateAuthenticating, + ConnectionStateConnected +} ConnectionState; + +@interface FPersistentConnection () { + ConnectionState connectionState; + BOOL firstConnection; + NSTimeInterval reconnectDelay; + NSTimeInterval lastConnectionAttemptTime; + NSTimeInterval lastConnectionEstablishedTime; + SCNetworkReachabilityRef reachability; +} + +- (int)getNextRequestNumber; +- (void)onDataPushWithAction:(NSString *)action andBody:(NSDictionary *)body; +- (void)handleTimestamp:(NSNumber *)timestamp; +- (void)sendOnDisconnectAction:(NSString *)action + forPath:(NSString *)pathString + withData:(id)data + andCallback:(fbt_void_nsstring_nsstring)callback; + +@property(nonatomic, strong) FConnection *realtime; +@property(nonatomic, strong) NSMutableDictionary *listens; +@property(nonatomic, strong) NSMutableDictionary *outstandingPuts; +@property(nonatomic, strong) NSMutableArray *onDisconnectQueue; +@property(nonatomic, strong) FRepoInfo *repoInfo; +@property(nonatomic, strong) FAtomicNumber *putCounter; +@property(nonatomic, strong) FAtomicNumber *requestNumber; +@property(nonatomic, strong) NSMutableDictionary *requestCBHash; +@property(nonatomic, strong) FIRDatabaseConfig *config; +@property(nonatomic) NSUInteger unackedListensCount; +@property(nonatomic, strong) NSMutableArray *putsToAck; +@property(nonatomic, strong) dispatch_queue_t dispatchQueue; +@property(nonatomic, strong) NSString *lastSessionID; +@property(nonatomic, strong) NSMutableSet *interruptReasons; +@property(nonatomic, strong) FIRRetryHelper *retryHelper; +@property(nonatomic, strong) id authTokenProvider; +@property(nonatomic, strong) NSString *authToken; +@property(nonatomic) BOOL forceAuthTokenRefresh; +@property(nonatomic) NSUInteger currentFetchTokenAttempt; + +@end + +@implementation FPersistentConnection + +- (id)initWithRepoInfo:(FRepoInfo *)repoInfo + dispatchQueue:(dispatch_queue_t)dispatchQueue + config:(FIRDatabaseConfig *)config { + self = [super init]; + if (self) { + self->_config = config; + self->_repoInfo = repoInfo; + self->_dispatchQueue = dispatchQueue; + self->_authTokenProvider = config.authTokenProvider; + NSAssert(self->_authTokenProvider != nil, + @"Expected auth token provider"); + self.interruptReasons = [NSMutableSet set]; + + self.listens = [[NSMutableDictionary alloc] init]; + self.outstandingPuts = [[NSMutableDictionary alloc] init]; + self.onDisconnectQueue = [[NSMutableArray alloc] init]; + self.putCounter = [[FAtomicNumber alloc] init]; + self.requestNumber = [[FAtomicNumber alloc] init]; + self.requestCBHash = [[NSMutableDictionary alloc] init]; + self.unackedListensCount = 0; + self.putsToAck = [NSMutableArray array]; + connectionState = ConnectionStateDisconnected; + firstConnection = YES; + reconnectDelay = kPersistentConnReconnectMinDelay; + + self->_retryHelper = [[FIRRetryHelper alloc] + initWithDispatchQueue:dispatchQueue + minRetryDelayAfterFailure:kPersistentConnReconnectMinDelay + maxRetryDelay:kPersistentConnReconnectMaxDelay + retryExponent:kPersistentConnReconnectMultiplier + jitterFactor:0.7]; + + [self setupNotifications]; + // Make sure we don't actually connect until open is called + [self interruptForReason:kFInterruptReasonWaitingForOpen]; + } + // nb: The reason establishConnection isn't called here like the JS version + // is because callers need to set the delegate first. The ctor can be + // modified to accept the delegate but that deviates from normal ios + // conventions. After the delegate has been set, the caller is responsible + // for calling establishConnection: + return self; +} + +- (void)dealloc { + if (reachability) { + // Unschedule the notifications + SCNetworkReachabilitySetDispatchQueue(reachability, NULL); + CFRelease(reachability); + } +} + +#pragma mark - +#pragma mark Public methods + +- (void)open { + [self resumeForReason:kFInterruptReasonWaitingForOpen]; +} + +/** + * Note that the listens dictionary has a type of Map[String (pathString), + * Map[FQueryParams, FOutstandingQuery]] + * + * This means, for each path we care about, there are sets of queryParams that + * correspond to an FOutstandingQuery object. There can be multiple sets at a + * path since we overlap listens for a short time while adding or removing a + * query from a location in the tree. + */ +- (void)listen:(FQuerySpec *)query + tagId:(NSNumber *)tagId + hash:(id)hash + onComplete:(fbt_void_nsstring)onComplete { + FFLog(@"I-RDB034001", @"Listen called for %@", query); + + NSAssert(self.listens[query] == nil, + @"listen() called twice for the same query"); + NSAssert(query.isDefault || !query.loadsAllData, + @"listen called for non-default but complete query"); + FOutstandingQuery *outstanding = [[FOutstandingQuery alloc] init]; + outstanding.query = query; + outstanding.tagId = tagId; + outstanding.syncTreeHash = hash; + outstanding.onComplete = onComplete; + [self.listens setObject:outstanding forKey:query]; + if ([self connected]) { + [self sendListen:outstanding]; + } +} + +- (void)putData:(id)data + forPath:(NSString *)pathString + withHash:(NSString *)hash + withCallback:(fbt_void_nsstring_nsstring)onComplete { + [self putInternal:data + forAction:kFWPRequestActionPut + forPath:pathString + withHash:hash + withCallback:onComplete]; +} + +- (void)mergeData:(id)data + forPath:(NSString *)pathString + withCallback:(fbt_void_nsstring_nsstring)onComplete { + [self putInternal:data + forAction:kFWPRequestActionMerge + forPath:pathString + withHash:nil + withCallback:onComplete]; +} + +- (void)onDisconnectPutData:(id)data + forPath:(FPath *)path + withCallback:(fbt_void_nsstring_nsstring)callback { + if ([self canSendWrites]) { + [self sendOnDisconnectAction:kFWPRequestActionDisconnectPut + forPath:[path description] + withData:data + andCallback:callback]; + } else { + FTupleOnDisconnect *tuple = [[FTupleOnDisconnect alloc] init]; + tuple.pathString = [path description]; + tuple.action = kFWPRequestActionDisconnectPut; + tuple.data = data; + tuple.onComplete = callback; + [self.onDisconnectQueue addObject:tuple]; + } +} + +- (void)onDisconnectMergeData:(id)data + forPath:(FPath *)path + withCallback:(fbt_void_nsstring_nsstring)callback { + if ([self canSendWrites]) { + [self sendOnDisconnectAction:kFWPRequestActionDisconnectMerge + forPath:[path description] + withData:data + andCallback:callback]; + } else { + FTupleOnDisconnect *tuple = [[FTupleOnDisconnect alloc] init]; + tuple.pathString = [path description]; + tuple.action = kFWPRequestActionDisconnectMerge; + tuple.data = data; + tuple.onComplete = callback; + [self.onDisconnectQueue addObject:tuple]; + } +} + +- (void)onDisconnectCancelPath:(FPath *)path + withCallback:(fbt_void_nsstring_nsstring)callback { + if ([self canSendWrites]) { + [self sendOnDisconnectAction:kFWPRequestActionDisconnectCancel + forPath:[path description] + withData:[NSNull null] + andCallback:callback]; + } else { + FTupleOnDisconnect *tuple = [[FTupleOnDisconnect alloc] init]; + tuple.pathString = [path description]; + tuple.action = kFWPRequestActionDisconnectCancel; + tuple.data = [NSNull null]; + tuple.onComplete = callback; + [self.onDisconnectQueue addObject:tuple]; + } +} + +- (void)unlisten:(FQuerySpec *)query tagId:(NSNumber *)tagId { + FPath *path = query.path; + FFLog(@"I-RDB034002", @"Unlistening for %@", query); + + NSArray *outstanding = [self removeListen:query]; + if (outstanding.count > 0 && [self connected]) { + [self sendUnlisten:path queryParams:query.params tagId:tagId]; + } +} + +- (void)refreshAuthToken:(NSString *)token { + self.authToken = token; + if ([self connected]) { + if (token != nil) { + [self sendAuthAndRestoreStateAfterComplete:NO]; + } else { + [self sendUnauth]; + } + } +} + +#pragma mark - +#pragma mark Connection status + +- (BOOL)connected { + return self->connectionState == ConnectionStateAuthenticating || + self->connectionState == ConnectionStateConnected; +} + +- (BOOL)canSendWrites { + return self->connectionState == ConnectionStateConnected; +} + +#pragma mark - +#pragma mark FConnection delegate methods + +- (void)onReady:(FConnection *)fconnection + atTime:(NSNumber *)timestamp + sessionID:(NSString *)sessionID { + FFLog(@"I-RDB034003", @"On ready"); + lastConnectionEstablishedTime = [[NSDate date] timeIntervalSince1970]; + [self handleTimestamp:timestamp]; + + if (firstConnection) { + [self sendConnectStats]; + } + + [self restoreAuth]; + firstConnection = NO; + self.lastSessionID = sessionID; + dispatch_async(self.dispatchQueue, ^{ + [self.delegate onConnect:self]; + }); +} + +- (void)onDataMessage:(FConnection *)fconnection + withMessage:(NSDictionary *)message { + if (message[kFWPRequestNumber] != nil) { + // this is a response to a request we sent + NSNumber *rn = [NSNumber + numberWithInt:[[message objectForKey:kFWPRequestNumber] intValue]]; + if ([self.requestCBHash objectForKey:rn]) { + void (^callback)(NSDictionary *) = + [self.requestCBHash objectForKey:rn]; + [self.requestCBHash removeObjectForKey:rn]; + + if (callback) { + // dispatch_async(self.dispatchQueue, ^{ + callback([message objectForKey:kFWPResponseForRNData]); + //}); + } + } + } else if (message[kFWPRequestError] != nil) { + NSString *error = [message objectForKey:kFWPRequestError]; + @throw [[NSException alloc] initWithName:@"FirebaseDatabaseServerError" + reason:error + userInfo:nil]; + } else if (message[kFWPAsyncServerAction] != nil) { + // this is a server push of some sort + NSString *action = [message objectForKey:kFWPAsyncServerAction]; + NSDictionary *body = [message objectForKey:kFWPAsyncServerPayloadBody]; + [self onDataPushWithAction:action andBody:body]; + } +} + +- (void)onDisconnect:(FConnection *)fconnection + withReason:(FDisconnectReason)reason { + FFLog(@"I-RDB034004", @"Got on disconnect due to %s", + (reason == DISCONNECT_REASON_SERVER_RESET) ? "server_reset" + : "other"); + connectionState = ConnectionStateDisconnected; + // Drop the realtime connection + self.realtime = nil; + [self cancelSentTransactions]; + [self.requestCBHash removeAllObjects]; + self.unackedListensCount = 0; + if ([self shouldReconnect]) { + NSTimeInterval timeSinceLastConnectSucceeded = + [[NSDate date] timeIntervalSince1970] - + lastConnectionEstablishedTime; + BOOL lastConnectionWasSuccessful; + if (lastConnectionEstablishedTime > 0) { + lastConnectionWasSuccessful = + timeSinceLastConnectSucceeded > + kPersistentConnSuccessfulConnectionEstablishedDelay; + } else { + lastConnectionWasSuccessful = NO; + } + + if (reason == DISCONNECT_REASON_SERVER_RESET || + lastConnectionWasSuccessful) { + [self.retryHelper signalSuccess]; + } + [self tryScheduleReconnect]; + } + lastConnectionEstablishedTime = 0; + [self.delegate onDisconnect:self]; +} + +- (void)onKill:(FConnection *)fconnection withReason:(NSString *)reason { + FFWarn(@"I-RDB034005", + @"Firebase Database connection was forcefully killed by the server. " + @" Will not attempt reconnect. Reason: %@", + reason); + [self interruptForReason:kFInterruptReasonServerKill]; +} + +#pragma mark - +#pragma mark Connection handling methods + +- (void)interruptForReason:(NSString *)reason { + FFLog(@"I-RDB034006", @"Connection interrupted for: %@", reason); + + [self.interruptReasons addObject:reason]; + if (self.realtime) { + // Will call onDisconnect and set the connection state to Disconnected + [self.realtime close]; + self.realtime = nil; + } else { + [self.retryHelper cancel]; + self->connectionState = ConnectionStateDisconnected; + } + // Reset timeouts + [self.retryHelper signalSuccess]; +} + +- (void)resumeForReason:(NSString *)reason { + FFLog(@"I-RDB034007", @"Connection no longer interrupted for: %@", reason); + [self.interruptReasons removeObject:reason]; + + if ([self shouldReconnect] && + connectionState == ConnectionStateDisconnected) { + [self tryScheduleReconnect]; + } +} + +- (BOOL)shouldReconnect { + return self.interruptReasons.count == 0; +} + +- (BOOL)isInterruptedForReason:(NSString *)reason { + return [self.interruptReasons containsObject:reason]; +} + +#pragma mark - +#pragma mark Private methods + +- (void)tryScheduleReconnect { + if ([self shouldReconnect]) { + NSAssert(self->connectionState == ConnectionStateDisconnected, + @"Not in disconnected state: %d", self->connectionState); + BOOL forceRefresh = self.forceAuthTokenRefresh; + self.forceAuthTokenRefresh = NO; + FFLog(@"I-RDB034008", @"Scheduling connection attempt"); + [self.retryHelper retry:^{ + FFLog(@"I-RDB034009", @"Trying to fetch auth token"); + NSAssert(self->connectionState == ConnectionStateDisconnected, + @"Not in disconnected state: %d", self->connectionState); + self->connectionState = ConnectionStateGettingToken; + self.currentFetchTokenAttempt++; + NSUInteger thisFetchTokenAttempt = self.currentFetchTokenAttempt; + [self.authTokenProvider + fetchTokenForcingRefresh:forceRefresh + withCallback:^(NSString *token, NSError *error) { + if (thisFetchTokenAttempt == + self.currentFetchTokenAttempt) { + if (error != nil) { + self->connectionState = + ConnectionStateDisconnected; + FFLog(@"I-RDB034010", + @"Error fetching token: %@", error); + [self tryScheduleReconnect]; + } else { + // Someone could have interrupted us while + // fetching the token, marking the + // connection as Disconnected + if (self->connectionState == + ConnectionStateGettingToken) { + FFLog(@"I-RDB034011", + @"Successfully fetched token, " + @"opening connection"); + [self openNetworkConnectionWithToken: + token]; + } else { + NSAssert( + self->connectionState == + ConnectionStateDisconnected, + @"Expected connection state " + @"disconnected, but got %d", + self->connectionState); + FFLog(@"I-RDB034012", + @"Not opening connection after " + @"token refresh, because " + @"connection was set to " + @"disconnected."); + } + } + } else { + FFLog(@"I-RDB034013", + @"Ignoring fetch token result, because " + @"this was not the latest attempt."); + } + }]; + }]; + } +} + +- (void)openNetworkConnectionWithToken:(NSString *)token { + NSAssert(self->connectionState == ConnectionStateGettingToken, + @"Trying to open network connection while in wrong state: %d", + self->connectionState); + self.authToken = token; + self->connectionState = ConnectionStateConnecting; + self.realtime = [[FConnection alloc] initWith:self.repoInfo + andDispatchQueue:self.dispatchQueue + googleAppID:self.config.googleAppID + lastSessionID:self.lastSessionID]; + self.realtime.delegate = self; + [self.realtime open]; +} + +static void reachabilityCallback(SCNetworkReachabilityRef ref, + SCNetworkReachabilityFlags flags, void *info) { + if (flags & kSCNetworkReachabilityFlagsReachable) { + FFLog(@"I-RDB034014", + @"Network became reachable. Trigger a connection attempt"); + FPersistentConnection *self = (__bridge FPersistentConnection *)info; + // Reset reconnect delay + [self.retryHelper signalSuccess]; + if (self->connectionState == ConnectionStateDisconnected) { + [self tryScheduleReconnect]; + } + } else { + FFLog(@"I-RDB034015", @"Network is not reachable"); + } +} + +- (void)enteringForeground { + dispatch_async(self.dispatchQueue, ^{ + // Reset reconnect delay + [self.retryHelper signalSuccess]; + if (self->connectionState == ConnectionStateDisconnected) { + [self tryScheduleReconnect]; + } + }); +} + +- (void)setupNotifications { + + NSString *const *foregroundConstant = (NSString *const *)dlsym( + RTLD_DEFAULT, "UIApplicationWillEnterForegroundNotification"); + if (foregroundConstant) { + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(enteringForeground) + name:*foregroundConstant + object:nil]; + } + // An empty address is interpreted a generic internet access + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + reachability = SCNetworkReachabilityCreateWithAddress( + kCFAllocatorDefault, (const struct sockaddr *)&zeroAddress); + SCNetworkReachabilityContext ctx = {0, (__bridge void *)(self), NULL, NULL, + NULL}; + if (SCNetworkReachabilitySetCallback(reachability, reachabilityCallback, + &ctx)) { + SCNetworkReachabilitySetDispatchQueue(reachability, self.dispatchQueue); + } else { + FFLog(@"I-RDB034016", + @"Failed to set up network reachability monitoring"); + CFRelease(reachability); + reachability = NULL; + } +} + +- (void)sendAuthAndRestoreStateAfterComplete:(BOOL)restoreStateAfterComplete { + NSAssert([self connected], @"Must be connected to send auth"); + NSAssert(self.authToken != nil, + @"Can't send auth if there is no credential"); + + NSDictionary *requestData = @{kFWPRequestCredential : self.authToken}; + [self sendAction:kFWPRequestActionAuth + body:requestData + sensitive:YES + callback:^(NSDictionary *data) { + self->connectionState = ConnectionStateConnected; + NSString *status = + [data objectForKey:kFWPResponseForActionStatus]; + id responseData = [data objectForKey:kFWPResponseForActionData]; + if (responseData == nil) { + responseData = @"error"; + } + + BOOL statusOk = + [status isEqualToString:kFWPResponseForActionStatusOk]; + if (statusOk) { + if (restoreStateAfterComplete) { + [self restoreState]; + } + } else { + self.authToken = nil; + self.forceAuthTokenRefresh = YES; + if ([status isEqualToString:@"expired_token"]) { + FFLog(@"I-RDB034017", @"Authentication failed: %@ (%@)", + status, responseData); + } else { + FFWarn(@"I-RDB034018", @"Authentication failed: %@ (%@)", + status, responseData); + } + [self.realtime close]; + } + }]; +} + +- (void)sendUnauth { + [self sendAction:kFWPRequestActionUnauth + body:@{} + sensitive:NO + callback:nil]; +} + +- (void)onAuthRevokedWithStatus:(NSString *)status + andReason:(NSString *)reason { + // This might be for an earlier token than we just recently sent. But since + // we need to close the connection anyways, we can set it to null here and + // we will refresh the token later on reconnect + if ([status isEqualToString:@"expired_token"]) { + FFLog(@"I-RDB034019", @"Auth token revoked: %@ (%@)", status, reason); + } else { + FFWarn(@"I-RDB034020", @"Auth token revoked: %@ (%@)", status, reason); + } + self.authToken = nil; + self.forceAuthTokenRefresh = YES; + // Try reconnecting on auth revocation + [self.realtime close]; +} + +- (void)onListenRevoked:(FPath *)path { + NSArray *queries = [self removeAllListensAtPath:path]; + for (FOutstandingQuery *query in queries) { + query.onComplete(@"permission_denied"); + } +} + +- (void)sendOnDisconnectAction:(NSString *)action + forPath:(NSString *)pathString + withData:(id)data + andCallback:(fbt_void_nsstring_nsstring)callback { + + NSDictionary *request = + @{kFWPRequestPath : pathString, kFWPRequestData : data}; + FFLog(@"I-RDB034021", @"onDisconnect %@: %@", action, request); + + [self sendAction:action + body:request + sensitive:NO + callback:^(NSDictionary *data) { + NSString *status = + [data objectForKey:kFWPResponseForActionStatus]; + NSString *errorReason = + [data objectForKey:kFWPResponseForActionData]; + callback(status, errorReason); + }]; +} + +- (void)sendPut:(NSNumber *)index { + NSAssert([self canSendWrites], + @"sendPut called when not able to send writes"); + FOutstandingPut *put = self.outstandingPuts[index]; + assert(put != nil); + fbt_void_nsstring_nsstring onComplete = put.onCompleteBlock; + + // Do not async this block; copying the block insinde sendAction: doesn't + // happen in time (or something) so coredumps + put.sent = YES; + [self sendAction:put.action + body:put.request + sensitive:NO + callback:^(NSDictionary *data) { + FOutstandingPut *currentPut = self.outstandingPuts[index]; + if (currentPut == put) { + [self.outstandingPuts removeObjectForKey:index]; + + if (onComplete != nil) { + NSString *status = + [data objectForKey:kFWPResponseForActionStatus]; + NSString *errorReason = + [data objectForKey:kFWPResponseForActionData]; + if (self.unackedListensCount == 0) { + onComplete(status, errorReason); + } else { + FTupleCallbackStatus *putToAck = + [[FTupleCallbackStatus alloc] init]; + putToAck.block = onComplete; + putToAck.status = status; + putToAck.errorReason = errorReason; + [self.putsToAck addObject:putToAck]; + } + } + } else { + FFLog(@"I-RDB034022", + @"Ignoring on complete for put %@ because it was " + @"already removed", + index); + } + }]; +} + +- (void)sendUnlisten:(FPath *)path + queryParams:(FQueryParams *)queryParams + tagId:(NSNumber *)tagId { + FFLog(@"I-RDB034023", @"Unlisten on %@ for %@", path, queryParams); + + NSMutableDictionary *request = [NSMutableDictionary + dictionaryWithObjectsAndKeys:[path toString], kFWPRequestPath, nil]; + if (tagId != nil) { + [request setObject:queryParams.wireProtocolParams + forKey:kFWPRequestQueries]; + [request setObject:tagId forKey:kFWPRequestTag]; + } + + [self sendAction:kFWPRequestActionTaggedUnlisten + body:request + sensitive:NO + callback:nil]; +} + +- (void)putInternal:(id)data + forAction:(NSString *)action + forPath:(NSString *)pathString + withHash:(NSString *)hash + withCallback:(fbt_void_nsstring_nsstring)onComplete { + + NSMutableDictionary *request = [NSMutableDictionary + dictionaryWithObjectsAndKeys:pathString, kFWPRequestPath, data, + kFWPRequestData, nil]; + if (hash) { + [request setObject:hash forKey:kFWPRequestHash]; + } + + FOutstandingPut *put = [[FOutstandingPut alloc] init]; + put.action = action; + put.request = request; + put.onCompleteBlock = onComplete; + put.sent = NO; + + NSNumber *index = [self.putCounter getAndIncrement]; + self.outstandingPuts[index] = put; + + if ([self canSendWrites]) { + FFLog(@"I-RDB034024", @"Was connected, and added as index: %@", index); + [self sendPut:index]; + } else { + FFLog(@"I-RDB034025", + @"Wasn't connected or writes paused, so added to outstanding " + @"puts only. Path: %@", + pathString); + } +} + +- (void)sendListen:(FOutstandingQuery *)listenSpec { + FQuerySpec *query = listenSpec.query; + FFLog(@"I-RDB034026", @"Listen for %@", query); + NSMutableDictionary *request = + [NSMutableDictionary dictionaryWithObject:[query.path toString] + forKey:kFWPRequestPath]; + + // Only bother to send query if it's non-default + if (listenSpec.tagId != nil) { + [request setObject:[query.params wireProtocolParams] + forKey:kFWPRequestQueries]; + [request setObject:listenSpec.tagId forKey:kFWPRequestTag]; + } + + [request setObject:[listenSpec.syncTreeHash simpleHash] + forKey:kFWPRequestHash]; + if ([listenSpec.syncTreeHash includeCompoundHash]) { + FCompoundHash *compoundHash = [listenSpec.syncTreeHash compoundHash]; + NSMutableArray *posts = [NSMutableArray array]; + for (FPath *path in compoundHash.posts) { + [posts addObject:path.wireFormat]; + } + request[kFWPRequestCompoundHash] = @{ + kFWPRequestCompoundHashHashes : compoundHash.hashes, + kFWPRequestCompoundHashPaths : posts + }; + } + + fbt_void_nsdictionary onResponse = ^(NSDictionary *response) { + FFLog(@"I-RDB034027", @"Listen response %@", response); + // warn in any case, even if the listener was removed + [self warnOnListenWarningsForQuery:query + payload:response[kFWPResponseForActionData]]; + + FOutstandingQuery *currentListenSpec = self.listens[query]; + + // only trigger actions if the listen hasn't been removed (and maybe + // readded) + if (currentListenSpec == listenSpec) { + NSString *status = [response objectForKey:kFWPRequestStatus]; + if (![status isEqualToString:@"ok"]) { + [self removeListen:query]; + } + + if (listenSpec.onComplete) { + listenSpec.onComplete(status); + } + } + + self.unackedListensCount--; + NSAssert(self.unackedListensCount >= 0, + @"unackedListensCount decremented to be negative."); + if (self.unackedListensCount == 0) { + [self ackPuts]; + } + }; + + [self sendAction:kFWPRequestActionTaggedListen + body:request + sensitive:NO + callback:onResponse]; + + self.unackedListensCount++; +} + +- (void)warnOnListenWarningsForQuery:(FQuerySpec *)query payload:(id)payload { + if (payload != nil && [payload isKindOfClass:[NSDictionary class]]) { + NSDictionary *payloadDict = payload; + id warnings = payloadDict[kFWPResponseDataWarnings]; + if (warnings != nil && [warnings isKindOfClass:[NSArray class]]) { + NSArray *warningsArr = warnings; + if ([warningsArr containsObject:@"no_index"]) { + NSString *indexSpec = [NSString + stringWithFormat:@"\".indexOn\": \"%@\"", + [query.params.index queryDefinition]]; + NSString *indexPath = [query.path description]; + FFWarn(@"I-RDB034028", + @"Using an unspecified index. Your data will be " + @"downloaded and filtered on the client. " + "Consider adding %@ at %@ to your security rules for " + "better performance", + indexSpec, indexPath); + } + } + } +} + +- (int)getNextRequestNumber { + return [[self.requestNumber getAndIncrement] intValue]; +} + +- (void)sendAction:(NSString *)action + body:(NSDictionary *)message + sensitive:(BOOL)sensitive + callback:(void (^)(NSDictionary *data))onMessage { + // Hold onto the onMessage callback for this request before firing it off + NSNumber *rn = [NSNumber numberWithInt:[self getNextRequestNumber]]; + NSDictionary *msg = [NSDictionary + dictionaryWithObjectsAndKeys:rn, kFWPRequestNumber, action, + kFWPRequestAction, message, + kFWPRequestPayloadBody, nil]; + + [self.realtime sendRequest:msg sensitive:sensitive]; + + if (onMessage) { + // Debug message without a callback; bump the rn, but don't hold onto + // the cb + [self.requestCBHash setObject:[onMessage copy] forKey:rn]; + } +} + +- (void)cancelSentTransactions { + NSMutableDictionary + *cancelledOutstandingPuts = [[NSMutableDictionary alloc] init]; + + for (NSNumber *index in self.outstandingPuts) { + FOutstandingPut *put = self.outstandingPuts[index]; + if (put.request[kFWPRequestHash] && put.sent) { + // This is a sent transaction put. + cancelledOutstandingPuts[index] = put; + } + } + + [cancelledOutstandingPuts + enumerateKeysAndObjectsUsingBlock:^( + NSNumber *index, FOutstandingPut *outstandingPut, BOOL *stop) { + // `onCompleteBlock:` may invoke `rerunTransactionsForPath:` and + // enqueue new writes. We defer calling it until we have finished + // enumerating all existing writes. + outstandingPut.onCompleteBlock( + kFTransactionDisconnect, + @"Client was disconnected while running a transaction"); + [self.outstandingPuts removeObjectForKey:index]; + }]; +} + +- (void)onDataPushWithAction:(NSString *)action andBody:(NSDictionary *)body { + FFLog(@"I-RDB034029", @"handleServerMessage: %@, %@", action, body); + id delegate = self.delegate; + if ([action isEqualToString:kFWPAsyncServerDataUpdate] || + [action isEqualToString:kFWPAsyncServerDataMerge]) { + BOOL isMerge = [action isEqualToString:kFWPAsyncServerDataMerge]; + + if ([body objectForKey:kFWPAsyncServerDataUpdateBodyPath] && + [body objectForKey:kFWPAsyncServerDataUpdateBodyData]) { + NSString *path = + [body objectForKey:kFWPAsyncServerDataUpdateBodyPath]; + id payloadData = + [body objectForKey:kFWPAsyncServerDataUpdateBodyData]; + if (isMerge && [payloadData isKindOfClass:[NSDictionary class]] && + [payloadData count] == 0) { + // ignore empty merge + } else { + [delegate + onDataUpdate:self + forPath:path + message:payloadData + isMerge:isMerge + tagId:[body objectForKey: + kFWPAsyncServerDataUpdateBodyTag]]; + } + } else { + FFLog( + @"I-RDB034030", + @"Malformed data response from server missing path or data: %@", + body); + } + } else if ([action isEqualToString:kFWPAsyncServerDataRangeMerge]) { + NSString *path = body[kFWPAsyncServerDataUpdateBodyPath]; + NSArray *ranges = body[kFWPAsyncServerDataUpdateBodyData]; + NSNumber *tag = body[kFWPAsyncServerDataUpdateBodyTag]; + NSMutableArray *rangeMerges = [NSMutableArray array]; + for (NSDictionary *range in ranges) { + NSString *startString = range[kFWPAsyncServerDataUpdateStartPath]; + NSString *endString = range[kFWPAsyncServerDataUpdateEndPath]; + id updateData = range[kFWPAsyncServerDataUpdateRangeMerge]; + id updates = [FSnapshotUtilities nodeFrom:updateData]; + FPath *start = (startString != nil) + ? [[FPath alloc] initWith:startString] + : nil; + FPath *end = + (endString != nil) ? [[FPath alloc] initWith:endString] : nil; + FRangeMerge *merge = [[FRangeMerge alloc] initWithStart:start + end:end + updates:updates]; + [rangeMerges addObject:merge]; + } + [delegate onRangeMerge:rangeMerges forPath:path tagId:tag]; + } else if ([action isEqualToString:kFWPAsyncServerAuthRevoked]) { + NSString *status = [body objectForKey:kFWPResponseForActionStatus]; + NSString *reason = [body objectForKey:kFWPResponseForActionData]; + [self onAuthRevokedWithStatus:status andReason:reason]; + } else if ([action isEqualToString:kFWPASyncServerListenCancelled]) { + NSString *pathString = + [body objectForKey:kFWPAsyncServerDataUpdateBodyPath]; + [self onListenRevoked:[[FPath alloc] initWith:pathString]]; + } else if ([action isEqualToString:kFWPAsyncServerSecurityDebug]) { + NSString *msg = [body objectForKey:@"msg"]; + if (msg != nil) { + NSArray *msgs = [msg componentsSeparatedByString:@"\n"]; + for (NSString *m in msgs) { + FFWarn(@"I-RDB034031", @"%@", m); + } + } + } else { + // TODO: revoke listens, auth, security debug + FFLog(@"I-RDB034032", @"Unsupported action from server: %@", action); + } +} + +- (void)restoreAuth { + FFLog(@"I-RDB034033", @"Calling restore state"); + + NSAssert(self->connectionState == ConnectionStateConnecting, + @"Wanted to restore auth, but was in wrong state: %d", + self->connectionState); + if (self.authToken == nil) { + FFLog(@"I-RDB034034", @"Not restoring auth because token is nil"); + self->connectionState = ConnectionStateConnected; + [self restoreState]; + } else { + FFLog(@"I-RDB034035", @"Restoring auth"); + self->connectionState = ConnectionStateAuthenticating; + [self sendAuthAndRestoreStateAfterComplete:YES]; + } +} + +- (void)restoreState { + NSAssert(self->connectionState == ConnectionStateConnected, + @"Should be connected if we're restoring state, but we are: %d", + self->connectionState); + + [self.listens enumerateKeysAndObjectsUsingBlock:^( + FQuerySpec *query, FOutstandingQuery *outstandingListen, + BOOL *stop) { + FFLog(@"I-RDB034036", @"Restoring listen for %@", query); + [self sendListen:outstandingListen]; + }]; + + NSArray *keys = [[self.outstandingPuts allKeys] + sortedArrayUsingSelector:@selector(compare:)]; + for (int i = 0; i < [keys count]; i++) { + if ([self.outstandingPuts objectForKey:[keys objectAtIndex:i]] != nil) { + FFLog(@"I-RDB034037", @"Restoring put: %d", i); + [self sendPut:[keys objectAtIndex:i]]; + } else { + FFLog(@"I-RDB034038", @"Restoring put: skipped nil: %d", i); + } + } + + for (FTupleOnDisconnect *tuple in self.onDisconnectQueue) { + [self sendOnDisconnectAction:tuple.action + forPath:tuple.pathString + withData:tuple.data + andCallback:tuple.onComplete]; + } + [self.onDisconnectQueue removeAllObjects]; +} + +- (NSArray *)removeListen:(FQuerySpec *)query { + NSAssert(query.isDefault || !query.loadsAllData, + @"removeListen called for non-default but complete query"); + + FOutstandingQuery *outstanding = self.listens[query]; + if (!outstanding) { + FFLog(@"I-RDB034039", + @"Trying to remove listener for query %@ but no listener exists", + query); + return @[]; + } else { + [self.listens removeObjectForKey:query]; + return @[ outstanding ]; + } +} + +- (NSArray *)removeAllListensAtPath:(FPath *)path { + FFLog(@"I-RDB034040", @"Removing all listens at path %@", path); + NSMutableArray *removed = [NSMutableArray array]; + NSMutableArray *toRemove = [NSMutableArray array]; + [self.listens + enumerateKeysAndObjectsUsingBlock:^( + FQuerySpec *spec, FOutstandingQuery *outstanding, BOOL *stop) { + if ([spec.path isEqual:path]) { + [removed addObject:outstanding]; + [toRemove addObject:spec]; + } + }]; + [self.listens removeObjectsForKeys:toRemove]; + return removed; +} + +- (void)purgeOutstandingWrites { + // We might have unacked puts in our queue that we need to ack now before we + // send out any cancels... + [self ackPuts]; + // Cancel in order + NSArray *keys = [[self.outstandingPuts allKeys] + sortedArrayUsingSelector:@selector(compare:)]; + for (NSNumber *key in keys) { + FOutstandingPut *put = self.outstandingPuts[key]; + if (put.onCompleteBlock != nil) { + put.onCompleteBlock(kFErrorWriteCanceled, nil); + } + } + for (FTupleOnDisconnect *onDisconnect in self.onDisconnectQueue) { + if (onDisconnect.onComplete != nil) { + onDisconnect.onComplete(kFErrorWriteCanceled, nil); + } + } + [self.outstandingPuts removeAllObjects]; + [self.onDisconnectQueue removeAllObjects]; +} + +- (void)ackPuts { + for (FTupleCallbackStatus *put in self.putsToAck) { + put.block(put.status, put.errorReason); + } + [self.putsToAck removeAllObjects]; +} + +- (void)handleTimestamp:(NSNumber *)timestamp { + FFLog(@"I-RDB034041", @"Handling timestamp: %@", timestamp); + double timestampDeltaMs = [timestamp doubleValue] - + ([[NSDate date] timeIntervalSince1970] * 1000); + [self.delegate onServerInfoUpdate:self + updates:@{ + kDotInfoServerTimeOffset : [NSNumber + numberWithDouble:timestampDeltaMs] + }]; +} + +- (void)sendStats:(NSDictionary *)stats { + if ([stats count] > 0) { + NSDictionary *request = @{kFWPRequestCounters : stats}; + [self sendAction:kFWPRequestActionStats + body:request + sensitive:NO + callback:^(NSDictionary *data) { + NSString *status = + [data objectForKey:kFWPResponseForActionStatus]; + NSString *errorReason = + [data objectForKey:kFWPResponseForActionData]; + BOOL statusOk = + [status isEqualToString:kFWPResponseForActionStatusOk]; + if (!statusOk) { + FFLog(@"I-RDB034042", @"Failed to send stats: %@", + errorReason); + } + }]; + } else { + FFLog(@"I-RDB034043", @"Not sending stats because stats are empty"); + } +} + +- (void)sendConnectStats { + NSMutableDictionary *stats = [NSMutableDictionary dictionary]; + +#if TARGET_OS_IOS || TARGET_OS_TV + if (self.config.persistenceEnabled) { + stats[@"persistence.ios.enabled"] = @1; + } +#elif TARGET_OS_OSX + if (self.config.persistenceEnabled) { + stats[@"persistence.osx.enabled"] = @1; + } +#endif + NSString *sdkVersion = + [[FIRDatabase sdkVersion] stringByReplacingOccurrencesOfString:@"." + withString:@"-"]; + NSString *sdkStatName = + [NSString stringWithFormat:@"sdk.objc.%@", sdkVersion]; + stats[sdkStatName] = @1; + FFLog(@"I-RDB034044", @"Sending first connection stats"); + [self sendStats:stats]; +} + +- (NSDictionary *)dumpListens { + return self.listens; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQueryParams.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQueryParams.h new file mode 100644 index 00000000..5d957c57 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQueryParams.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FIndex +, FNodeFilter, FNode; + +@interface FQueryParams : NSObject + +@property(nonatomic, readonly) BOOL limitSet; +@property(nonatomic, readonly) NSInteger limit; + +@property(nonatomic, strong, readonly) NSString *viewFrom; +@property(nonatomic, strong, readonly) id indexStartValue; +@property(nonatomic, strong, readonly) NSString *indexStartKey; +@property(nonatomic, strong, readonly) id indexEndValue; +@property(nonatomic, strong, readonly) NSString *indexEndKey; + +@property(nonatomic, strong, readonly) id index; + +- (BOOL)loadsAllData; +- (BOOL)isDefault; +- (BOOL)isValid; +- (BOOL)hasAnchoredLimit; + +- (FQueryParams *)limitTo:(NSInteger)limit; +- (FQueryParams *)limitToFirst:(NSInteger)newLimit; +- (FQueryParams *)limitToLast:(NSInteger)newLimit; + +- (FQueryParams *)startAt:(id)indexValue childKey:(NSString *)key; +- (FQueryParams *)startAt:(id)indexValue; +- (FQueryParams *)endAt:(id)indexValue childKey:(NSString *)key; +- (FQueryParams *)endAt:(id)indexValue; + +- (FQueryParams *)orderBy:(id)index; + ++ (FQueryParams *)defaultInstance; ++ (FQueryParams *)fromQueryObject:(NSDictionary *)dict; + +- (BOOL)hasStart; +- (BOOL)hasEnd; + +- (NSDictionary *)wireProtocolParams; +- (BOOL)isViewFromLeft; +- (id)nodeFilter; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQueryParams.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQueryParams.m new file mode 100644 index 00000000..c19cfba2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQueryParams.m @@ -0,0 +1,393 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FQueryParams.h" +#import "FConstants.h" +#import "FIndex.h" +#import "FIndexedFilter.h" +#import "FLimitedFilter.h" +#import "FNode.h" +#import "FNodeFilter.h" +#import "FPriorityIndex.h" +#import "FRangedFilter.h" +#import "FSnapshotUtilities.h" +#import "FUtilities.h" +#import "FValidation.h" + +@interface FQueryParams () + +@property(nonatomic, readwrite) BOOL limitSet; +@property(nonatomic, readwrite) NSInteger limit; + +@property(nonatomic, strong, readwrite) NSString *viewFrom; +/** + * indexStartValue is anything you can store as a priority / value. + */ +@property(nonatomic, strong, readwrite) id indexStartValue; +@property(nonatomic, strong, readwrite) NSString *indexStartKey; +/** + * indexStartValue is anything you can store as a priority / value. + */ +@property(nonatomic, strong, readwrite) id indexEndValue; +@property(nonatomic, strong, readwrite) NSString *indexEndKey; + +@property(nonatomic, strong, readwrite) id index; + +@end + +@implementation FQueryParams + ++ (FQueryParams *)defaultInstance { + static FQueryParams *defaultParams = nil; + static dispatch_once_t defaultParamsToken; + dispatch_once(&defaultParamsToken, ^{ + defaultParams = [[FQueryParams alloc] init]; + }); + return defaultParams; +} + +- (id)init { + self = [super init]; + if (self) { + self->_limitSet = NO; + self->_limit = 0; + + self->_viewFrom = nil; + self->_indexStartValue = nil; + self->_indexStartKey = nil; + self->_indexEndValue = nil; + self->_indexEndKey = nil; + + self->_index = [FPriorityIndex priorityIndex]; + } + return self; +} + +/** + * Only valid if hasStart is true + */ +- (id)indexStartValue { + NSAssert([self hasStart], @"Only valid if start has been set"); + return _indexStartValue; +} + +/** + * Only valid if hasStart is true. + * @return The starting key name for the range defined by these query parameters + */ +- (NSString *)indexStartKey { + NSAssert([self hasStart], @"Only valid if start has been set"); + if (_indexStartKey == nil) { + return [FUtilities minName]; + } else { + return _indexStartKey; + } +} + +/** + * Only valid if hasEnd is true. + */ +- (id)indexEndValue { + NSAssert([self hasEnd], @"Only valid if end has been set"); + return _indexEndValue; +} + +/** + * Only valid if hasEnd is true. + * @return The end key name for the range defined by these query parameters + */ +- (NSString *)indexEndKey { + NSAssert([self hasEnd], @"Only valid if end has been set"); + if (_indexEndKey == nil) { + return [FUtilities maxName]; + } else { + return _indexEndKey; + } +} + +/** + * @return true if a limit has been set and has been explicitly anchored + */ +- (BOOL)hasAnchoredLimit { + return self.limitSet && self.viewFrom != nil; +} + +/** + * Only valid to call if limitSet returns true + */ +- (NSInteger)limit { + NSAssert(self.limitSet, @"Only valid if limit has been set"); + return _limit; +} + +- (BOOL)hasStart { + return self->_indexStartValue != nil; +} + +- (BOOL)hasEnd { + return self->_indexEndValue != nil; +} + +- (id)copyWithZone:(NSZone *)zone { + // Immutable + return self; +} + +- (id)mutableCopy { + FQueryParams *other = [[[self class] alloc] init]; + // Maybe need to do extra copying here + other->_limitSet = _limitSet; + other->_limit = _limit; + other->_indexStartValue = _indexStartValue; + other->_indexStartKey = _indexStartKey; + other->_indexEndValue = _indexEndValue; + other->_indexEndKey = _indexEndKey; + other->_viewFrom = _viewFrom; + other->_index = _index; + return other; +} + +- (FQueryParams *)limitTo:(NSInteger)newLimit { + FQueryParams *newParams = [self mutableCopy]; + newParams->_limitSet = YES; + newParams->_limit = newLimit; + newParams->_viewFrom = nil; + return newParams; +} + +- (FQueryParams *)limitToFirst:(NSInteger)newLimit { + FQueryParams *newParams = [self mutableCopy]; + newParams->_limitSet = YES; + newParams->_limit = newLimit; + newParams->_viewFrom = kFQPViewFromLeft; + return newParams; +} + +- (FQueryParams *)limitToLast:(NSInteger)newLimit { + FQueryParams *newParams = [self mutableCopy]; + newParams->_limitSet = YES; + newParams->_limit = newLimit; + newParams->_viewFrom = kFQPViewFromRight; + return newParams; +} + +- (FQueryParams *)startAt:(id)indexValue childKey:(NSString *)key { + NSAssert([indexValue isLeafNode] || [indexValue isEmpty], nil); + FQueryParams *newParams = [self mutableCopy]; + newParams->_indexStartValue = indexValue; + newParams->_indexStartKey = key; + return newParams; +} + +- (FQueryParams *)startAt:(id)indexValue { + return [self startAt:indexValue childKey:nil]; +} + +- (FQueryParams *)endAt:(id)indexValue childKey:(NSString *)key { + NSAssert([indexValue isLeafNode] || [indexValue isEmpty], nil); + FQueryParams *newParams = [self mutableCopy]; + newParams->_indexEndValue = indexValue; + newParams->_indexEndKey = key; + return newParams; +} + +- (FQueryParams *)endAt:(id)indexValue { + return [self endAt:indexValue childKey:nil]; +} + +- (FQueryParams *)orderBy:(id)newIndex { + FQueryParams *newParams = [self mutableCopy]; + newParams->_index = newIndex; + return newParams; +} + +- (NSDictionary *)wireProtocolParams { + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + if ([self hasStart]) { + [dict setObject:[self.indexStartValue valForExport:YES] + forKey:kFQPIndexStartValue]; + + // Don't use property as it will be [MIN-NAME] + if (self->_indexStartKey != nil) { + [dict setObject:self->_indexStartKey forKey:kFQPIndexStartName]; + } + } + + if ([self hasEnd]) { + [dict setObject:[self.indexEndValue valForExport:YES] + forKey:kFQPIndexEndValue]; + + // Don't use property as it will be [MAX-NAME] + if (self->_indexEndKey != nil) { + [dict setObject:self->_indexEndKey forKey:kFQPIndexEndName]; + } + } + + if (self.limitSet) { + [dict setObject:[NSNumber numberWithInteger:self.limit] + forKey:kFQPLimit]; + NSString *vf = self.viewFrom; + if (vf == nil) { + // limit() rather than limitToFirst or limitToLast was called. + // This means that only one of startSet or endSet is true. Use them + // to calculate which side of the view to anchor to. If neither is + // set, Anchor to end + if ([self hasStart]) { + vf = kFQPViewFromLeft; + } else { + vf = kFQPViewFromRight; + } + } + [dict setObject:vf forKey:kFQPViewFrom]; + } + + // For now, priority index is the default, so we only specify if it's some + // other index. + if (![self.index isEqual:[FPriorityIndex priorityIndex]]) { + [dict setObject:[self.index queryDefinition] forKey:kFQPIndex]; + } + + return dict; +} + ++ (FQueryParams *)fromQueryObject:(NSDictionary *)dict { + if (dict.count == 0) { + return [FQueryParams defaultInstance]; + } + + FQueryParams *params = [[FQueryParams alloc] init]; + if (dict[kFQPLimit] != nil) { + params->_limitSet = YES; + params->_limit = [dict[kFQPLimit] integerValue]; + } + + if (dict[kFQPIndexStartValue] != nil) { + params->_indexStartValue = + [FSnapshotUtilities nodeFrom:dict[kFQPIndexStartValue]]; + if (dict[kFQPIndexStartName] != nil) { + params->_indexStartKey = dict[kFQPIndexStartName]; + } + } + + if (dict[kFQPIndexEndValue] != nil) { + params->_indexEndValue = + [FSnapshotUtilities nodeFrom:dict[kFQPIndexEndValue]]; + if (dict[kFQPIndexEndName] != nil) { + params->_indexEndKey = dict[kFQPIndexEndName]; + } + } + + if (dict[kFQPViewFrom] != nil) { + NSString *viewFrom = dict[kFQPViewFrom]; + if (![viewFrom isEqualToString:kFQPViewFromLeft] && + ![viewFrom isEqualToString:kFQPViewFromRight]) { + [NSException raise:NSInvalidArgumentException + format:@"Unknown view from paramter: %@", viewFrom]; + } + params->_viewFrom = viewFrom; + } + + NSString *index = dict[kFQPIndex]; + if (index != nil) { + params->_index = [FIndex indexFromQueryDefinition:index]; + } + + return params; +} + +- (BOOL)isViewFromLeft { + if (self.viewFrom != nil) { + // Not null, we can just check + return [self.viewFrom isEqualToString:kFQPViewFromLeft]; + } else { + // If start is set, it's view from left. Otherwise not. + return self.hasStart; + } +} + +- (id)nodeFilter { + if (self.loadsAllData) { + return [[FIndexedFilter alloc] initWithIndex:self.index]; + } else if (self.limitSet) { + return [[FLimitedFilter alloc] initWithQueryParams:self]; + } else { + return [[FRangedFilter alloc] initWithQueryParams:self]; + } +} + +- (BOOL)isValid { + return !(self.hasStart && self.hasEnd && self.limitSet && + !self.hasAnchoredLimit); +} + +- (BOOL)loadsAllData { + return !(self.hasStart || self.hasEnd || self.limitSet); +} + +- (BOOL)isDefault { + return [self loadsAllData] && + [self.index isEqual:[FPriorityIndex priorityIndex]]; +} + +- (NSString *)description { + return [[self wireProtocolParams] description]; +} + +- (BOOL)isEqual:(id)obj { + if (self == obj) { + return YES; + } + if (![obj isKindOfClass:[self class]]) { + return NO; + } + FQueryParams *other = (FQueryParams *)obj; + if (self->_limitSet != other->_limitSet) + return NO; + if (self->_limit != other->_limit) + return NO; + if ((self->_index != other->_index) && ! + [self->_index isEqual:other->_index]) + return NO; + if ((self->_indexStartKey != other->_indexStartKey) && + ![self->_indexStartKey isEqualToString:other->_indexStartKey]) + return NO; + if ((self->_indexStartValue != other->_indexStartValue) && + ![self->_indexStartValue isEqual:other->_indexStartValue]) + return NO; + if ((self->_indexEndKey != other->_indexEndKey) && + ![self->_indexEndKey isEqualToString:other->_indexEndKey]) + return NO; + if ((self->_indexEndValue != other->_indexEndValue) && + ![self->_indexEndValue isEqual:other->_indexEndValue]) + return NO; + if ([self isViewFromLeft] != [other isViewFromLeft]) + return NO; + + return YES; +} + +- (NSUInteger)hash { + NSUInteger result = _limitSet ? _limit : 0; + result = 31 * result + ([self isViewFromLeft] ? 1231 : 1237); + result = 31 * result + [_indexStartKey hash]; + result = 31 * result + [_indexStartValue hash]; + result = 31 * result + [_indexEndKey hash]; + result = 31 * result + [_indexEndValue hash]; + result = 31 * result + [_index hash]; + return result; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQuerySpec.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQuerySpec.h new file mode 100644 index 00000000..2eece871 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQuerySpec.h @@ -0,0 +1,36 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIndex.h" +#import "FPath.h" +#import "FQueryParams.h" + +@interface FQuerySpec : NSObject + +@property(nonatomic, strong, readonly) FPath *path; +@property(nonatomic, strong, readonly) FQueryParams *params; + +- (id)initWithPath:(FPath *)path params:(FQueryParams *)params; + ++ (FQuerySpec *)defaultQueryAtPath:(FPath *)path; + +- (id)index; +- (BOOL)isDefault; +- (BOOL)loadsAllData; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQuerySpec.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQuerySpec.m new file mode 100644 index 00000000..c408bf8a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FQuerySpec.m @@ -0,0 +1,86 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FQuerySpec.h" + +@interface FQuerySpec () + +@property(nonatomic, strong, readwrite) FPath *path; +@property(nonatomic, strong, readwrite) FQueryParams *params; + +@end + +@implementation FQuerySpec + +- (id)initWithPath:(FPath *)path params:(FQueryParams *)params { + self = [super init]; + if (self != nil) { + self->_path = path; + self->_params = params; + } + return self; +} + ++ (FQuerySpec *)defaultQueryAtPath:(FPath *)path { + return [[FQuerySpec alloc] initWithPath:path + params:[FQueryParams defaultInstance]]; +} + +- (id)copyWithZone:(NSZone *)zone { + // Immutable + return self; +} + +- (id)index { + return self.params.index; +} + +- (BOOL)isDefault { + return self.params.isDefault; +} + +- (BOOL)loadsAllData { + return self.params.loadsAllData; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[FQuerySpec class]]) { + return NO; + } + + FQuerySpec *other = (FQuerySpec *)object; + + if (![self.path isEqual:other.path]) { + return NO; + } + + return [self.params isEqual:other.params]; +} + +- (NSUInteger)hash { + return self.path.hash * 31 + self.params.hash; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"FQuerySpec (path: %@, params: %@)", + self.path, self.params]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRangeMerge.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRangeMerge.h new file mode 100644 index 00000000..5f7938a3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRangeMerge.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FNode.h" + +/** + * Applies a merge of a snap for a given interval of paths. + * Each leaf in the current node which the relative path lies *after* (the + * optional) start and lies *before or at* (the optional) end will be deleted. + * Each leaf in snap that lies in the interval will be added to the resulting + * node. Nodes outside of the range are ignored. nil for start and end are + * sentinel values that represent -infinity and +infinity respectively (aka + * includes any path). Priorities of children nodes are treated as leaf children + * of that node. + */ +@interface FRangeMerge : NSObject + +- (instancetype)initWithStart:(FPath *)start + end:(FPath *)end + updates:(id)updates; + +- (id)applyToNode:(id)node; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRangeMerge.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRangeMerge.m new file mode 100644 index 00000000..3dc1576c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRangeMerge.m @@ -0,0 +1,134 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FRangeMerge.h" + +#import "FEmptyNode.h" + +@interface FRangeMerge () + +@property(nonatomic, strong) FPath *optExclusiveStart; +@property(nonatomic, strong) FPath *optInclusiveEnd; +@property(nonatomic, strong) id updates; + +@end + +@implementation FRangeMerge + +- (instancetype)initWithStart:(FPath *)start + end:(FPath *)end + updates:(id)updates { + self = [super init]; + if (self != nil) { + self->_optExclusiveStart = start; + self->_optInclusiveEnd = end; + self->_updates = updates; + } + return self; +} + +- (id)applyToNode:(id)node { + return [self updateRangeInNode:[FPath empty] + node:node + updates:self.updates]; +} + +- (id)updateRangeInNode:(FPath *)currentPath + node:(id)node + updates:(id)updates { + NSComparisonResult startComparison = + (self.optExclusiveStart == nil) + ? NSOrderedDescending + : [currentPath compare:self.optExclusiveStart]; + NSComparisonResult endComparison = + (self.optInclusiveEnd == nil) + ? NSOrderedAscending + : [currentPath compare:self.optInclusiveEnd]; + BOOL startInNode = self.optExclusiveStart != nil && + [currentPath contains:self.optExclusiveStart]; + BOOL endInNode = self.optInclusiveEnd != nil && + [currentPath contains:self.optInclusiveEnd]; + if (startComparison == NSOrderedDescending && + endComparison == NSOrderedAscending && !endInNode) { + // child is completly contained + return updates; + } else if (startComparison == NSOrderedDescending && endInNode && + [updates isLeafNode]) { + return updates; + } else if (startComparison == NSOrderedDescending && + endComparison == NSOrderedSame) { + NSAssert(endInNode, @"End not in node"); + NSAssert(![updates isLeafNode], @"Found leaf node update, this case " + @"should have been handled above."); + if ([node isLeafNode]) { + // Update node was not a leaf node, so we can delete it + return [FEmptyNode emptyNode]; + } else { + // Unaffected by range, ignore + return node; + } + } else if (startInNode || endInNode) { + // There is a partial update we need to do, so collect all relevant + // children + NSMutableSet *allChildren = [NSMutableSet set]; + [node enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + [allChildren addObject:key]; + }]; + [updates enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + [allChildren addObject:key]; + }]; + + __block id newNode = node; + void (^action)(id, BOOL *) = ^void(NSString *key, BOOL *stop) { + id currentChild = [node getImmediateChild:key]; + id updatedChild = + [self updateRangeInNode:[currentPath childFromString:key] + node:currentChild + updates:[updates getImmediateChild:key]]; + // Only need to update if the node changed + if (updatedChild != currentChild) { + newNode = [newNode updateImmediateChild:key + withNewChild:updatedChild]; + } + }; + + [allChildren enumerateObjectsUsingBlock:action]; + + // Add priority last, so the node is not empty when applying + if (!updates.getPriority.isEmpty || !node.getPriority.isEmpty) { + BOOL stop = NO; + action(@".priority", &stop); + } + return newNode; + } else { + // Unaffected by this range + NSAssert(endComparison == NSOrderedDescending || + startComparison <= NSOrderedSame, + @"Invalid range for update"); + return node; + } +} + +- (NSString *)description { + return [NSString stringWithFormat:@"RangeMerge (optExclusiveStart = %@, " + @"optExclusiveEng = %@, updates = %@)", + self.optExclusiveStart, + self.optInclusiveEnd, self.updates]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo.h new file mode 100644 index 00000000..4e3899a6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo.h @@ -0,0 +1,93 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDataEventType.h" +#import "FPersistentConnection.h" +#import "FRepoInfo.h" +#import "FTupleUserCallback.h" +#import + +@class FQuerySpec; +@class FPersistence; +@class FAuthenticationManager; +@class FIRDatabaseConfig; +@protocol FEventRegistration; +@class FCompoundWrite; +@protocol FClock; +@class FIRDatabase; + +@interface FRepo : NSObject + +@property(nonatomic, strong) FIRDatabaseConfig *config; + +- (id)initWithRepoInfo:(FRepoInfo *)info + config:(FIRDatabaseConfig *)config + database:(FIRDatabase *)database; + +- (void)set:(FPath *)path + withNode:(id)node + withCallback:(fbt_void_nserror_ref)onComplete; +- (void)update:(FPath *)path + withNodes:(FCompoundWrite *)compoundWrite + withCallback:(fbt_void_nserror_ref)callback; +- (void)purgeOutstandingWrites; + +- (void)addEventRegistration:(id)eventRegistration + forQuery:(FQuerySpec *)query; +- (void)removeEventRegistration:(id)eventRegistration + forQuery:(FQuerySpec *)query; +- (void)keepQuery:(FQuerySpec *)query synced:(BOOL)synced; + +- (NSString *)name; +- (NSTimeInterval)serverTime; + +- (void)onDataUpdate:(FPersistentConnection *)fpconnection + forPath:(NSString *)pathString + message:(id)message + isMerge:(BOOL)isMerge + tagId:(NSNumber *)tagId; +- (void)onConnect:(FPersistentConnection *)fpconnection; +- (void)onDisconnect:(FPersistentConnection *)fpconnection; + +// Disconnect methods +- (void)onDisconnectCancel:(FPath *)path + withCallback:(fbt_void_nserror_ref)callback; +- (void)onDisconnectSet:(FPath *)path + withNode:(id)node + withCallback:(fbt_void_nserror_ref)callback; +- (void)onDisconnectUpdate:(FPath *)path + withNodes:(FCompoundWrite *)compoundWrite + withCallback:(fbt_void_nserror_ref)callback; + +// Connection Management. +- (void)interrupt; +- (void)resume; + +// Transactions +- (void)startTransactionOnPath:(FPath *)path + update:(fbt_transactionresult_mutabledata)update + onComplete:(fbt_void_nserror_bool_datasnapshot)onComplete + withLocalEvents:(BOOL)applyLocally; + +// Testing methods +- (NSDictionary *)dumpListens; +- (void)dispose; +- (void)setHijackHash:(BOOL)hijack; + +@property(nonatomic, strong, readonly) FAuthenticationManager *auth; +@property(nonatomic, strong, readonly) FIRDatabase *database; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo.m new file mode 100644 index 00000000..55086173 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo.m @@ -0,0 +1,1467 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FAtomicNumber.h" +#import "FCachePolicy.h" +#import "FClock.h" +#import "FConstants.h" +#import "FEmptyNode.h" +#import "FEventRaiser.h" +#import "FEventRegistration.h" +#import "FIRDataSnapshot.h" +#import "FIRDataSnapshot_Private.h" +#import "FIRDatabaseConfig_Private.h" +#import "FIRDatabaseQuery_Private.h" +#import "FIRDatabase_Private.h" +#import "FIRMutableData.h" +#import "FIRMutableData_Private.h" +#import "FIRTransactionResult.h" +#import "FIRTransactionResult_Private.h" +#import "FLevelDBStorageEngine.h" +#import "FListenProvider.h" +#import "FPersistenceManager.h" +#import "FQuerySpec.h" +#import "FRepo.h" +#import "FRepoManager.h" +#import "FRepo_Private.h" +#import "FServerValues.h" +#import "FSnapshotHolder.h" +#import "FSnapshotUtilities.h" +#import "FSyncTree.h" +#import "FTree.h" +#import "FTupleNodePath.h" +#import "FTupleSetIdPath.h" +#import "FTupleTransaction.h" +#import "FValueEventRegistration.h" +#import "FWriteRecord.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import + +#if TARGET_OS_IOS || TARGET_OS_TV +#import +#endif + +@interface FRepo () + +@property(nonatomic, strong) FOffsetClock *serverClock; +@property(nonatomic, strong) FPersistenceManager *persistenceManager; +@property(nonatomic, strong) FIRDatabase *database; +@property(nonatomic, strong, readwrite) FAuthenticationManager *auth; +@property(nonatomic, strong) FSyncTree *infoSyncTree; +@property(nonatomic) NSInteger writeIdCounter; +@property(nonatomic) BOOL hijackHash; +@property(nonatomic, strong) FTree *transactionQueueTree; +@property(nonatomic) BOOL loggedTransactionPersistenceWarning; + +/** + * Test only. For load testing the server. + */ +@property(nonatomic, strong) id (^interceptServerDataCallback) + (NSString *pathString, id data); +@end + +@implementation FRepo + +- (id)initWithRepoInfo:(FRepoInfo *)info + config:(FIRDatabaseConfig *)config + database:(FIRDatabase *)database { + self = [super init]; + if (self) { + self.repoInfo = info; + self.config = config; + self.database = database; + + // Access can occur outside of shared queue, so the clock needs to be + // initialized here + self.serverClock = + [[FOffsetClock alloc] initWithClock:[FSystemClock clock] offset:0]; + + self.connection = [[FPersistentConnection alloc] + initWithRepoInfo:self.repoInfo + dispatchQueue:[FIRDatabaseQuery sharedQueue] + config:self.config]; + + // Needs to be called before authentication manager is instantiated + self.eventRaiser = + [[FEventRaiser alloc] initWithQueue:self.config.callbackQueue]; + + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self deferredInit]; + }); + } + return self; +} + +- (void)deferredInit { + // TODO: cleanup on dealloc + __weak FRepo *weakSelf = self; + [self.config.authTokenProvider listenForTokenChanges:^(NSString *token) { + [weakSelf.connection refreshAuthToken:token]; + }]; + + // Open connection now so that by the time we are connected the deferred + // init has run This relies on the fact that all callbacks run on repos + // queue + self.connection.delegate = self; + [self.connection open]; + + self.dataUpdateCount = 0; + self.rangeMergeUpdateCount = 0; + self.interceptServerDataCallback = nil; + + if (self.config.persistenceEnabled) { + NSString *repoHashString = + [NSString stringWithFormat:@"%@_%@", self.repoInfo.host, + self.repoInfo.namespace]; + NSString *persistencePrefix = + [NSString stringWithFormat:@"%@/%@", self.config.sessionIdentifier, + repoHashString]; + + id cachePolicy = [[FLRUCachePolicy alloc] + initWithMaxSize:self.config.persistenceCacheSizeBytes]; + + id engine; + if (self.config.forceStorageEngine != nil) { + engine = self.config.forceStorageEngine; + } else { + FLevelDBStorageEngine *levelDBEngine = + [[FLevelDBStorageEngine alloc] initWithPath:persistencePrefix]; + // We need the repo info to run the legacy migration. Future + // migrations will be managed by the database itself Remove this + // once we are confident that no-one is using legacy migration + // anymore... + [levelDBEngine runLegacyMigration:self.repoInfo]; + engine = levelDBEngine; + } + + self.persistenceManager = + [[FPersistenceManager alloc] initWithStorageEngine:engine + cachePolicy:cachePolicy]; + } else { + self.persistenceManager = nil; + } + + [self initTransactions]; + + // A list of data pieces and paths to be set when this client disconnects + self.onDisconnect = [[FSparseSnapshotTree alloc] init]; + self.infoData = [[FSnapshotHolder alloc] init]; + + FListenProvider *infoListenProvider = [[FListenProvider alloc] init]; + infoListenProvider.startListening = + ^(FQuerySpec *query, NSNumber *tagId, id hash, + fbt_nsarray_nsstring onComplete) { + NSArray *infoEvents = @[]; + FRepo *strongSelf = weakSelf; + id node = [strongSelf.infoData getNode:query.path]; + // This is possibly a hack, but we have different semantics for .info + // endpoints. We don't raise null events on initial data... + if (![node isEmpty]) { + infoEvents = + [strongSelf.infoSyncTree applyServerOverwriteAtPath:query.path + newData:node]; + [strongSelf.eventRaiser raiseCallback:^{ + onComplete(kFWPResponseForActionStatusOk); + }]; + } + return infoEvents; + }; + infoListenProvider.stopListening = ^(FQuerySpec *query, NSNumber *tagId) { + }; + self.infoSyncTree = + [[FSyncTree alloc] initWithListenProvider:infoListenProvider]; + + FListenProvider *serverListenProvider = [[FListenProvider alloc] init]; + serverListenProvider.startListening = + ^(FQuerySpec *query, NSNumber *tagId, id hash, + fbt_nsarray_nsstring onComplete) { + [weakSelf.connection listen:query + tagId:tagId + hash:hash + onComplete:^(NSString *status) { + NSArray *events = onComplete(status); + [weakSelf.eventRaiser raiseEvents:events]; + }]; + // No synchronous events for network-backed sync trees + return @[]; + }; + serverListenProvider.stopListening = ^(FQuerySpec *query, NSNumber *tag) { + [weakSelf.connection unlisten:query tagId:tag]; + }; + self.serverSyncTree = + [[FSyncTree alloc] initWithPersistenceManager:self.persistenceManager + listenProvider:serverListenProvider]; + + [self restoreWrites]; + + [self updateInfo:kDotInfoConnected withValue:@NO]; + + [self setupNotifications]; +} + +- (void)restoreWrites { + NSArray *writes = self.persistenceManager.userWrites; + + NSDictionary *serverValues = + [FServerValues generateServerValues:self.serverClock]; + __block NSInteger lastWriteId = NSIntegerMin; + [writes enumerateObjectsUsingBlock:^(FWriteRecord *write, NSUInteger idx, + BOOL *stop) { + NSInteger writeId = write.writeId; + fbt_void_nsstring_nsstring callback = + ^(NSString *status, NSString *errorReason) { + [self warnIfWriteFailedAtPath:write.path + status:status + message:@"Persisted write"]; + [self ackWrite:writeId + rerunTransactionsAtPath:write.path + status:status]; + }; + if (lastWriteId >= writeId) { + [NSException raise:NSInternalInconsistencyException + format:@"Restored writes were not in order!"]; + } + lastWriteId = writeId; + self.writeIdCounter = writeId + 1; + + if ([write isOverwrite]) { + FFLog(@"I-RDB038001", @"Restoring overwrite with id %ld", + (long)write.writeId); + [self.connection putData:[write.overwrite valForExport:YES] + forPath:[write.path toString] + withHash:nil + withCallback:callback]; + id resolved = + [FServerValues resolveDeferredValueSnapshot:write.overwrite + withSyncTree:self.serverSyncTree + atPath:write.path + serverValues:serverValues]; + [self.serverSyncTree applyUserOverwriteAtPath:write.path + newData:resolved + writeId:writeId + isVisible:YES]; + } else { + FFLog(@"I-RDB038002", @"Restoring merge with id %ld", + (long)write.writeId); + [self.connection mergeData:[write.merge valForExport:YES] + forPath:[write.path toString] + withCallback:callback]; + FCompoundWrite *resolved = [FServerValues + resolveDeferredValueCompoundWrite:write.merge + withSyncTree:self.serverSyncTree + atPath:write.path + serverValues:serverValues]; + [self.serverSyncTree applyUserMergeAtPath:write.path + changedChildren:resolved + writeId:writeId]; + } + }]; +} + +- (NSString *)name { + return self.repoInfo.namespace; +} + +- (NSString *)description { + return [self.repoInfo description]; +} + +- (void)interrupt { + [self.connection interruptForReason:kFInterruptReasonRepoInterrupt]; +} + +- (void)resume { + [self.connection resumeForReason:kFInterruptReasonRepoInterrupt]; +} + +// NOTE: Typically if you're calling this, you should be in an @autoreleasepool +// block to make sure that ARC kicks in and cleans up things no longer +// referenced (i.e. pendingPutsDB). +- (void)dispose { + [self.connection interruptForReason:kFInterruptReasonRepoInterrupt]; + + // We need to nil out any references to LevelDB, to make sure the + // LevelDB exclusive locks are released. + [self.persistenceManager close]; +} + +- (NSInteger)nextWriteId { + return self->_writeIdCounter++; +} + +- (NSTimeInterval)serverTime { + return [self.serverClock currentTime]; +} + +- (void)set:(FPath *)path + withNode:(id)node + withCallback:(fbt_void_nserror_ref)onComplete { + id value = [node valForExport:YES]; + FFLog(@"I-RDB038003", @"Setting: %@ with %@ pri: %@", [path toString], + [value description], [[node getPriority] val]); + + // TODO: Optimize this behavior to either (a) store flag to skip resolving + // where possible and / or (b) store unresolved paths on JSON parse + NSDictionary *serverValues = + [FServerValues generateServerValues:self.serverClock]; + id existing = [self.serverSyncTree calcCompleteEventCacheAtPath:path + excludeWriteIds:@[]]; + id newNode = + [FServerValues resolveDeferredValueSnapshot:node + withExisting:existing + serverValues:serverValues]; + + NSInteger writeId = [self nextWriteId]; + [self.persistenceManager saveUserOverwrite:node + atPath:path + writeId:writeId]; + NSArray *events = [self.serverSyncTree applyUserOverwriteAtPath:path + newData:newNode + writeId:writeId + isVisible:YES]; + [self.eventRaiser raiseEvents:events]; + + [self.connection putData:value + forPath:[path toString] + withHash:nil + withCallback:^(NSString *status, NSString *errorReason) { + [self warnIfWriteFailedAtPath:path + status:status + message:@"setValue: or removeValue:"]; + [self ackWrite:writeId + rerunTransactionsAtPath:path + status:status]; + [self callOnComplete:onComplete + withStatus:status + errorReason:errorReason + andPath:path]; + }]; + + FPath *affectedPath = [self abortTransactionsAtPath:path + error:kFTransactionSet]; + [self rerunTransactionsForPath:affectedPath]; +} + +- (void)update:(FPath *)path + withNodes:(FCompoundWrite *)nodes + withCallback:(fbt_void_nserror_ref)callback { + NSDictionary *values = [nodes valForExport:YES]; + + FFLog(@"I-RDB038004", @"Updating: %@ with %@", [path toString], + [values description]); + NSDictionary *serverValues = + [FServerValues generateServerValues:self.serverClock]; + FCompoundWrite *resolved = + [FServerValues resolveDeferredValueCompoundWrite:nodes + withSyncTree:self.serverSyncTree + atPath:path + serverValues:serverValues]; + + if (!resolved.isEmpty) { + NSInteger writeId = [self nextWriteId]; + [self.persistenceManager saveUserMerge:nodes + atPath:path + writeId:writeId]; + NSArray *events = [self.serverSyncTree applyUserMergeAtPath:path + changedChildren:resolved + writeId:writeId]; + [self.eventRaiser raiseEvents:events]; + + [self.connection mergeData:values + forPath:[path description] + withCallback:^(NSString *status, NSString *errorReason) { + [self warnIfWriteFailedAtPath:path + status:status + message:@"updateChildValues:"]; + [self ackWrite:writeId + rerunTransactionsAtPath:path + status:status]; + [self callOnComplete:callback + withStatus:status + errorReason:errorReason + andPath:path]; + }]; + + [nodes enumerateWrites:^(FPath *childPath, id node, BOOL *stop) { + FPath *pathFromRoot = [path child:childPath]; + FFLog(@"I-RDB038005", @"Cancelling transactions at path: %@", + pathFromRoot); + FPath *affectedPath = [self abortTransactionsAtPath:pathFromRoot + error:kFTransactionSet]; + [self rerunTransactionsForPath:affectedPath]; + }]; + } else { + FFLog(@"I-RDB038006", @"update called with empty data. Doing nothing"); + // Do nothing, just call the callback + [self callOnComplete:callback + withStatus:@"ok" + errorReason:nil + andPath:path]; + } +} + +- (void)onDisconnectCancel:(FPath *)path + withCallback:(fbt_void_nserror_ref)callback { + [self.connection + onDisconnectCancelPath:path + withCallback:^(NSString *status, NSString *errorReason) { + BOOL success = + [status isEqualToString:kFWPResponseForActionStatusOk]; + if (success) { + [self.onDisconnect forgetPath:path]; + } else { + FFLog(@"I-RDB038007", + @"cancelDisconnectOperations: at %@ failed: %@", + path, status); + } + + [self callOnComplete:callback + withStatus:status + errorReason:errorReason + andPath:path]; + }]; +} + +- (void)onDisconnectSet:(FPath *)path + withNode:(id)node + withCallback:(fbt_void_nserror_ref)callback { + [self.connection + onDisconnectPutData:[node valForExport:YES] + forPath:path + withCallback:^(NSString *status, NSString *errorReason) { + BOOL success = + [status isEqualToString:kFWPResponseForActionStatusOk]; + if (success) { + [self.onDisconnect rememberData:node onPath:path]; + } else { + FFWarn(@"I-RDB038008", + @"onDisconnectSetValue: or " + @"onDisconnectRemoveValue: at %@ failed: %@", + path, status); + } + + [self callOnComplete:callback + withStatus:status + errorReason:errorReason + andPath:path]; + }]; +} + +- (void)onDisconnectUpdate:(FPath *)path + withNodes:(FCompoundWrite *)nodes + withCallback:(fbt_void_nserror_ref)callback { + if (!nodes.isEmpty) { + NSDictionary *values = [nodes valForExport:YES]; + + [self.connection + onDisconnectMergeData:values + forPath:path + withCallback:^(NSString *status, NSString *errorReason) { + BOOL success = [status + isEqualToString:kFWPResponseForActionStatusOk]; + if (success) { + [nodes enumerateWrites:^(FPath *relativePath, + id nodeUnresolved, + BOOL *stop) { + FPath *childPath = [path child:relativePath]; + [self.onDisconnect rememberData:nodeUnresolved + onPath:childPath]; + }]; + } else { + FFWarn(@"I-RDB038009", + @"onDisconnectUpdateChildValues: at %@ " + @"failed %@", + path, status); + } + + [self callOnComplete:callback + withStatus:status + errorReason:errorReason + andPath:path]; + }]; + } else { + // Do nothing, just call the callback + [self callOnComplete:callback + withStatus:@"ok" + errorReason:nil + andPath:path]; + } +} + +- (void)purgeOutstandingWrites { + FFLog(@"I-RDB038010", @"Purging outstanding writes"); + NSArray *events = [self.serverSyncTree removeAllWrites]; + [self.eventRaiser raiseEvents:events]; + // Abort any transactions + [self abortTransactionsAtPath:[FPath empty] error:kFErrorWriteCanceled]; + // Remove outstanding writes from connection + [self.connection purgeOutstandingWrites]; +} + +- (void)addEventRegistration:(id)eventRegistration + forQuery:(FQuerySpec *)query { + NSArray *events = nil; + if ([[query.path getFront] isEqualToString:kDotInfoPrefix]) { + events = [self.infoSyncTree addEventRegistration:eventRegistration + forQuery:query]; + } else { + events = [self.serverSyncTree addEventRegistration:eventRegistration + forQuery:query]; + } + [self.eventRaiser raiseEvents:events]; +} + +- (void)removeEventRegistration:(id)eventRegistration + forQuery:(FQuerySpec *)query { + // These are guaranteed not to raise events, since we're not passing in a + // cancelError. However we can future-proof a little bit by handling the + // return values anyways. + FFLog(@"I-RDB038011", @"Removing event registration with hande: %lu", + (unsigned long)eventRegistration.handle); + NSArray *events = nil; + if ([[query.path getFront] isEqualToString:kDotInfoPrefix]) { + events = [self.infoSyncTree removeEventRegistration:eventRegistration + forQuery:query + cancelError:nil]; + } else { + events = [self.serverSyncTree removeEventRegistration:eventRegistration + forQuery:query + cancelError:nil]; + } + [self.eventRaiser raiseEvents:events]; +} + +- (void)keepQuery:(FQuerySpec *)query synced:(BOOL)synced { + NSAssert(![[query.path getFront] isEqualToString:kDotInfoPrefix], + @"Can't keep .info tree synced!"); + [self.serverSyncTree keepQuery:query synced:synced]; +} + +- (void)updateInfo:(NSString *)pathString withValue:(id)value { + // hack to make serverTimeOffset available in a threadsafe way. Property is + // marked as atomic + if ([pathString isEqualToString:kDotInfoServerTimeOffset]) { + NSTimeInterval offset = [(NSNumber *)value doubleValue] / 1000.0; + self.serverClock = + [[FOffsetClock alloc] initWithClock:[FSystemClock clock] + offset:offset]; + } + + FPath *path = [[FPath alloc] + initWith:[NSString + stringWithFormat:@"%@/%@", kDotInfoPrefix, pathString]]; + id newNode = [FSnapshotUtilities nodeFrom:value]; + [self.infoData updateSnapshot:path withNewSnapshot:newNode]; + NSArray *events = [self.infoSyncTree applyServerOverwriteAtPath:path + newData:newNode]; + [self.eventRaiser raiseEvents:events]; +} + +- (void)callOnComplete:(fbt_void_nserror_ref)onComplete + withStatus:(NSString *)status + errorReason:(NSString *)errorReason + andPath:(FPath *)path { + if (onComplete) { + FIRDatabaseReference *ref = + [[FIRDatabaseReference alloc] initWithRepo:self path:path]; + BOOL statusOk = [status isEqualToString:kFWPResponseForActionStatusOk]; + NSError *err = nil; + if (!statusOk) { + err = [FUtilities errorForStatus:status andReason:errorReason]; + } + [self.eventRaiser raiseCallback:^{ + onComplete(err, ref); + }]; + } +} + +- (void)ackWrite:(NSInteger)writeId + rerunTransactionsAtPath:(FPath *)path + status:(NSString *)status { + if ([status isEqualToString:kFErrorWriteCanceled]) { + // This write was already removed, we just need to ignore it... + } else { + BOOL success = [status isEqualToString:kFWPResponseForActionStatusOk]; + NSArray *clearEvents = + [self.serverSyncTree ackUserWriteWithWriteId:writeId + revert:!success + persist:YES + clock:self.serverClock]; + if ([clearEvents count] > 0) { + [self rerunTransactionsForPath:path]; + } + [self.eventRaiser raiseEvents:clearEvents]; + } +} + +- (void)warnIfWriteFailedAtPath:(FPath *)path + status:(NSString *)status + message:(NSString *)message { + if (!([status isEqualToString:kFWPResponseForActionStatusOk] || + [status isEqualToString:kFErrorWriteCanceled])) { + FFWarn(@"I-RDB038012", @"%@ at %@ failed: %@", message, path, status); + } +} + +#pragma mark - +#pragma mark FPersistentConnectionDelegate methods + +- (void)onDataUpdate:(FPersistentConnection *)fpconnection + forPath:(NSString *)pathString + message:(id)data + isMerge:(BOOL)isMerge + tagId:(NSNumber *)tagId { + FFLog(@"I-RDB038013", @"onDataUpdateForPath: %@ withMessage: %@", + pathString, data); + + // For testing. + self.dataUpdateCount++; + + FPath *path = [[FPath alloc] initWith:pathString]; + data = self.interceptServerDataCallback + ? self.interceptServerDataCallback(pathString, data) + : data; + NSArray *events = nil; + + if (tagId != nil) { + if (isMerge) { + NSDictionary *message = data; + FCompoundWrite *taggedChildren = + [FCompoundWrite compoundWriteWithValueDictionary:message]; + events = + [self.serverSyncTree applyTaggedQueryMergeAtPath:path + changedChildren:taggedChildren + tagId:tagId]; + } else { + id taggedSnap = [FSnapshotUtilities nodeFrom:data]; + events = + [self.serverSyncTree applyTaggedQueryOverwriteAtPath:path + newData:taggedSnap + tagId:tagId]; + } + } else if (isMerge) { + NSDictionary *message = data; + FCompoundWrite *changedChildren = + [FCompoundWrite compoundWriteWithValueDictionary:message]; + events = [self.serverSyncTree applyServerMergeAtPath:path + changedChildren:changedChildren]; + } else { + id snap = [FSnapshotUtilities nodeFrom:data]; + events = [self.serverSyncTree applyServerOverwriteAtPath:path + newData:snap]; + } + + if ([events count] > 0) { + // Since we have a listener outstanding for each transaction, receiving + // any events is a proxy for some change having occurred. + [self rerunTransactionsForPath:path]; + } + + [self.eventRaiser raiseEvents:events]; +} + +- (void)onRangeMerge:(NSArray *)ranges + forPath:(NSString *)pathString + tagId:(NSNumber *)tag { + FFLog(@"I-RDB038014", @"onRangeMerge: %@ => %@", pathString, ranges); + + // For testing + self.rangeMergeUpdateCount++; + + FPath *path = [[FPath alloc] initWith:pathString]; + NSArray *events; + if (tag != nil) { + events = [self.serverSyncTree applyTaggedServerRangeMergeAtPath:path + updates:ranges + tagId:tag]; + } else { + events = [self.serverSyncTree applyServerRangeMergeAtPath:path + updates:ranges]; + } + if (events.count > 0) { + // Since we have a listener outstanding for each transaction, receiving + // any events is a proxy for some change having occurred. + [self rerunTransactionsForPath:path]; + } + + [self.eventRaiser raiseEvents:events]; +} + +- (void)onConnect:(FPersistentConnection *)fpconnection { + [self updateInfo:kDotInfoConnected withValue:@YES]; +} + +- (void)onDisconnect:(FPersistentConnection *)fpconnection { + [self updateInfo:kDotInfoConnected withValue:@NO]; + [self runOnDisconnectEvents]; +} + +- (void)onServerInfoUpdate:(FPersistentConnection *)fpconnection + updates:(NSDictionary *)updates { + for (NSString *key in updates) { + id val = [updates objectForKey:key]; + [self updateInfo:key withValue:val]; + } +} + +- (void)setupNotifications { + NSString *const *backgroundConstant = (NSString *const *)dlsym( + RTLD_DEFAULT, "UIApplicationDidEnterBackgroundNotification"); + if (backgroundConstant) { + FFLog(@"I-RDB038015", @"Registering for background notification."); + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(didEnterBackground) + name:*backgroundConstant + object:nil]; + } else { + FFLog(@"I-RDB038016", + @"Skipped registering for background notification."); + } +} + +- (void)didEnterBackground { + if (!self.config.persistenceEnabled) + return; + +// Targetted compilation is ONLY for testing. UIKit is weak-linked in actual +// release build. +#if TARGET_OS_IOS || TARGET_OS_TV + // The idea is to wait until any outstanding sets get written to disk. Since + // the sets might still be in our dispatch queue, we wait for the dispatch + // queue to catch up and for persistence to catch up. This may be + // undesirable though. The dispatch queue might just be processing a bunch + // of incoming data or something. We might want to keep track of whether + // there are any unpersisted sets or something. + FFLog(@"I-RDB038017", + @"Entering background. Starting background task to finish work."); + Class uiApplicationClass = NSClassFromString(@"UIApplication"); + assert(uiApplicationClass); // If we are here, we should be on iOS and + // UIApplication should be available. + + UIApplication *application = [uiApplicationClass sharedApplication]; + __block UIBackgroundTaskIdentifier bgTask = + [application beginBackgroundTaskWithExpirationHandler:^{ + [application endBackgroundTask:bgTask]; + }]; + + NSDate *start = [NSDate date]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + NSTimeInterval finishTime = [start timeIntervalSinceNow] * -1; + FFLog(@"I-RDB038018", @"Background task completed. Queue time: %f", + finishTime); + [application endBackgroundTask:bgTask]; + }); +#endif +} + +#pragma mark - +#pragma mark Internal methods + +/** + * Applies all the changes stored up in the onDisconnect tree + */ +- (void)runOnDisconnectEvents { + FFLog(@"I-RDB038019", @"Running onDisconnectEvents"); + NSDictionary *serverValues = + [FServerValues generateServerValues:self.serverClock]; + NSMutableArray *events = [[NSMutableArray alloc] init]; + + [self.onDisconnect + forEachTreeAtPath:[FPath empty] + do:^(FPath *path, id node) { + id existing = [self.serverSyncTree + calcCompleteEventCacheAtPath:path + excludeWriteIds:@[]]; + id resolved = [FServerValues + resolveDeferredValueSnapshot:node + withExisting:existing + serverValues:serverValues]; + [events addObjectsFromArray: + [self.serverSyncTree + applyServerOverwriteAtPath:path + newData:resolved]]; + FPath *affectedPath = + [self abortTransactionsAtPath:path + error:kFTransactionSet]; + [self rerunTransactionsForPath:affectedPath]; + }]; + + self.onDisconnect = [[FSparseSnapshotTree alloc] init]; + [self.eventRaiser raiseEvents:events]; +} + +- (NSDictionary *)dumpListens { + return [self.connection dumpListens]; +} + +#pragma mark - +#pragma mark Transactions + +/** + * Setup the transaction data structures + */ +- (void)initTransactions { + self.transactionQueueTree = [[FTree alloc] init]; + self.hijackHash = NO; + self.loggedTransactionPersistenceWarning = NO; +} + +/** + * Creates a new transaction, add its to the transactions we're tracking, and + * sends it to the server if possible + */ +- (void)startTransactionOnPath:(FPath *)path + update:(fbt_transactionresult_mutabledata)update + onComplete:(fbt_void_nserror_bool_datasnapshot)onComplete + withLocalEvents:(BOOL)applyLocally { + if (self.config.persistenceEnabled && + !self.loggedTransactionPersistenceWarning) { + self.loggedTransactionPersistenceWarning = YES; + FFInfo(@"I-RDB038020", + @"runTransactionBlock: usage detected while persistence is " + @"enabled. Please be aware that transactions " + @"*will not* be persisted across app restarts. " + @"See " + @"https://www.firebase.com/docs/ios/guide/" + @"offline-capabilities.html#section-handling-transactions-" + @"offline for more details."); + } + + FIRDatabaseReference *watchRef = + [[FIRDatabaseReference alloc] initWithRepo:self path:path]; + // make sure we're listening on this node + // Note: we can't do this asynchronously. To preserve event ordering, it has + // to be done in this block. This is ok, this block is guaranteed to be our + // own event loop + NSUInteger handle = [[FUtilities LUIDGenerator] integerValue]; + fbt_void_datasnapshot cb = ^(FIRDataSnapshot *snapshot) { + }; + FValueEventRegistration *registration = + [[FValueEventRegistration alloc] initWithRepo:self + handle:handle + callback:cb + cancelCallback:nil]; + [watchRef.repo addEventRegistration:registration + forQuery:watchRef.querySpec]; + fbt_void_void unwatcher = ^{ + [watchRef removeObserverWithHandle:handle]; + }; + + // Save all the data that represents this transaction + FTupleTransaction *transaction = [[FTupleTransaction alloc] init]; + transaction.path = path; + transaction.update = update; + transaction.onComplete = onComplete; + transaction.status = FTransactionInitializing; + transaction.order = [FUtilities LUIDGenerator]; + transaction.applyLocally = applyLocally; + transaction.retryCount = 0; + transaction.unwatcher = unwatcher; + transaction.currentWriteId = nil; + transaction.currentInputSnapshot = nil; + transaction.currentOutputSnapshotRaw = nil; + transaction.currentOutputSnapshotResolved = nil; + + // Run transaction initially + id currentState = [self latestStateAtPath:path excludeWriteIds:nil]; + transaction.currentInputSnapshot = currentState; + FIRMutableData *mutableCurrent = + [[FIRMutableData alloc] initWithNode:currentState]; + FIRTransactionResult *result = transaction.update(mutableCurrent); + + if (!result.isSuccess) { + // Abort the transaction + transaction.unwatcher(); + transaction.currentOutputSnapshotRaw = nil; + transaction.currentOutputSnapshotResolved = nil; + if (transaction.onComplete) { + FIRDatabaseReference *ref = + [[FIRDatabaseReference alloc] initWithRepo:self + path:transaction.path]; + FIndexedNode *indexedNode = [FIndexedNode + indexedNodeWithNode:transaction.currentInputSnapshot]; + FIRDataSnapshot *snap = + [[FIRDataSnapshot alloc] initWithRef:ref + indexedNode:indexedNode]; + [self.eventRaiser raiseCallback:^{ + transaction.onComplete(nil, NO, snap); + }]; + } + } else { + // Note: different from js. We don't need to validate, FIRMutableData + // does validation. We also don't have to worry about priorities. Just + // mark as run and add to queue. + transaction.status = FTransactionRun; + FTree *queueNode = [self.transactionQueueTree subTree:transaction.path]; + NSMutableArray *nodeQueue = [queueNode getValue]; + if (nodeQueue == nil) { + nodeQueue = [[NSMutableArray alloc] init]; + } + [nodeQueue addObject:transaction]; + [queueNode setValue:nodeQueue]; + + // Update visibleData and raise events + // Note: We intentionally raise events after updating all of our + // transaction state, since the user could start new transactions from + // the event callbacks + NSDictionary *serverValues = + [FServerValues generateServerValues:self.serverClock]; + id newValUnresolved = [result.update nodeValue]; + id newVal = + [FServerValues resolveDeferredValueSnapshot:newValUnresolved + withExisting:currentState + serverValues:serverValues]; + transaction.currentOutputSnapshotRaw = newValUnresolved; + transaction.currentOutputSnapshotResolved = newVal; + transaction.currentWriteId = + [NSNumber numberWithInteger:[self nextWriteId]]; + + NSArray *events = [self.serverSyncTree + applyUserOverwriteAtPath:path + newData:newVal + writeId:[transaction.currentWriteId integerValue] + isVisible:transaction.applyLocally]; + [self.eventRaiser raiseEvents:events]; + + [self sendAllReadyTransactions]; + } +} + +/** + * @param writeIdsToExclude A specific set to exclude + */ +- (id)latestStateAtPath:(FPath *)path + excludeWriteIds:(NSArray *)writeIdsToExclude { + id latestState = + [self.serverSyncTree calcCompleteEventCacheAtPath:path + excludeWriteIds:writeIdsToExclude]; + return latestState ? latestState : [FEmptyNode emptyNode]; +} + +/** + * Sends any already-run transactions that aren't waiting for outstanding + * transactions to complete. + * + * Externally, call the version with no arguments. + * Internally, calls itself recursively with a particular transactionQueueTree + * node to recurse through the tree + */ +- (void)sendAllReadyTransactions { + FTree *node = self.transactionQueueTree; + + [self pruneCompletedTransactionsBelowNode:node]; + [self sendReadyTransactionsForTree:node]; +} + +- (void)sendReadyTransactionsForTree:(FTree *)node { + NSMutableArray *queue = [node getValue]; + if (queue != nil) { + queue = [self buildTransactionQueueAtNode:node]; + NSAssert([queue count] > 0, @"Sending zero length transaction queue"); + + NSUInteger notRunIndex = [queue + indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { + return ((FTupleTransaction *)obj).status != FTransactionRun; + }]; + + // If they're all run (and not sent), we can send them. Else, we must + // wait. + if (notRunIndex == NSNotFound) { + [self sendTransactionQueue:queue atPath:node.path]; + } + } else if ([node hasChildren]) { + [node forEachChild:^(FTree *child) { + [self sendReadyTransactionsForTree:child]; + }]; + } +} + +/** + * Given a list of run transactions, send them to the server and then handle the + * result (success or failure). + */ +- (void)sendTransactionQueue:(NSMutableArray *)queue atPath:(FPath *)path { + // Mark transactions as sent and bump the retry count + NSMutableArray *writeIdsToExclude = [[NSMutableArray alloc] init]; + for (FTupleTransaction *transaction in queue) { + [writeIdsToExclude addObject:transaction.currentWriteId]; + } + id latestState = [self latestStateAtPath:path + excludeWriteIds:writeIdsToExclude]; + id snapToSend = latestState; + NSString *latestHash = [latestState dataHash]; + for (FTupleTransaction *transaction in queue) { + NSAssert( + transaction.status == FTransactionRun, + @"[FRepo sendTransactionQueue:] items in queue should all be run."); + FFLog(@"I-RDB038021", @"Transaction at %@ set to SENT", + transaction.path); + transaction.status = FTransactionSent; + transaction.retryCount++; + FPath *relativePath = [FPath relativePathFrom:path to:transaction.path]; + // If we've gotten to this point, the output snapshot must be defined. + snapToSend = + [snapToSend updateChild:relativePath + withNewChild:transaction.currentOutputSnapshotRaw]; + } + + id dataToSend = [snapToSend valForExport:YES]; + NSString *pathToSend = [path description]; + latestHash = self.hijackHash ? @"badhash" : latestHash; + + // Send the put + [self.connection + putData:dataToSend + forPath:pathToSend + withHash:latestHash + withCallback:^(NSString *status, NSString *errorReason) { + FFLog(@"I-RDB038022", @"Transaction put response: %@ : %@", + pathToSend, status); + + NSMutableArray *events = [[NSMutableArray alloc] init]; + if ([status isEqualToString:kFWPResponseForActionStatusOk]) { + // Queue up the callbacks and fire them after cleaning up all of + // our transaction state, since the callback could trigger more + // transactions or sets. + NSMutableArray *callbacks = [[NSMutableArray alloc] init]; + for (FTupleTransaction *transaction in queue) { + transaction.status = FTransactionCompleted; + [events addObjectsFromArray: + [self.serverSyncTree + ackUserWriteWithWriteId: + [transaction.currentWriteId integerValue] + revert:NO + persist:NO + clock:self.serverClock]]; + if (transaction.onComplete) { + // We never unset the output snapshot, and given that this + // transaction is complete, it should be set + id node = + transaction.currentOutputSnapshotResolved; + FIndexedNode *indexedNode = + [FIndexedNode indexedNodeWithNode:node]; + FIRDatabaseReference *ref = [[FIRDatabaseReference alloc] + initWithRepo:self + path:transaction.path]; + FIRDataSnapshot *snapshot = + [[FIRDataSnapshot alloc] initWithRef:ref + indexedNode:indexedNode]; + fbt_void_void cb = ^{ + transaction.onComplete(nil, YES, snapshot); + }; + [callbacks addObject:[cb copy]]; + } + transaction.unwatcher(); + } + + // Now remove the completed transactions. + [self + pruneCompletedTransactionsBelowNode:[self.transactionQueueTree + subTree:path]]; + // There may be pending transactions that we can now send. + [self sendAllReadyTransactions]; + + // Finally, trigger onComplete callbacks + [self.eventRaiser raiseCallbacks:callbacks]; + } else { + // transactions are no longer sent. Update their status + // appropriately. + if ([status + isEqualToString:kFWPResponseForActionStatusDataStale]) { + for (FTupleTransaction *transaction in queue) { + if (transaction.status == FTransactionSentNeedsAbort) { + transaction.status = FTransactionNeedsAbort; + } else { + transaction.status = FTransactionRun; + } + } + } else { + FFWarn(@"I-RDB038023", + @"runTransactionBlock: at %@ failed: %@", path, + status); + for (FTupleTransaction *transaction in queue) { + transaction.status = FTransactionNeedsAbort; + [transaction setAbortStatus:status reason:errorReason]; + } + } + } + + [self rerunTransactionsForPath:path]; + [self.eventRaiser raiseEvents:events]; + }]; +} + +/** + * Finds all transactions dependent on the data at changed Path and reruns them. + * + * Should be called any time cached data changes. + * + * Return the highest path that was affected by rerunning transactions. This is + * the path at which events need to be raised for. + */ +- (FPath *)rerunTransactionsForPath:(FPath *)changedPath { + // For the common case that there are no transactions going on, skip all + // this! + if ([self.transactionQueueTree isEmpty]) { + return changedPath; + } else { + FTree *rootMostTransactionNode = + [self getAncestorTransactionNodeForPath:changedPath]; + FPath *path = rootMostTransactionNode.path; + + NSArray *queue = + [self buildTransactionQueueAtNode:rootMostTransactionNode]; + [self rerunTransactionQueue:queue atPath:path]; + + return path; + } +} + +/** + * Does all the work of rerunning transactions (as well as cleans up aborted + * transactions and whatnot). + */ +- (void)rerunTransactionQueue:(NSArray *)queue atPath:(FPath *)path { + if (queue.count == 0) { + return; // nothing to do + } + + // Queue up the callbacks and fire them after cleaning up all of our + // transaction state, since the callback could trigger more transactions or + // sets. + NSMutableArray *events = [[NSMutableArray alloc] init]; + NSMutableArray *callbacks = [[NSMutableArray alloc] init]; + + // Ignore, by default, all of the sets in this queue, since we're re-running + // all of them. However, we want to include the results of new sets + // triggered as part of this re-run, so we don't want to ignore a range, + // just these specific sets. + NSMutableArray *writeIdsToExclude = [[NSMutableArray alloc] init]; + for (FTupleTransaction *transaction in queue) { + [writeIdsToExclude addObject:transaction.currentWriteId]; + } + + for (FTupleTransaction *transaction in queue) { + FPath *relativePath __unused = + [FPath relativePathFrom:path to:transaction.path]; + BOOL abortTransaction = NO; + NSAssert(relativePath != nil, @"[FRepo rerunTransactionsQueue:] " + @"relativePath should not be null."); + + if (transaction.status == FTransactionNeedsAbort) { + abortTransaction = YES; + if (![transaction.abortStatus + isEqualToString:kFErrorWriteCanceled]) { + NSArray *ackEvents = [self.serverSyncTree + ackUserWriteWithWriteId:[transaction.currentWriteId + integerValue] + revert:YES + persist:NO + clock:self.serverClock]; + [events addObjectsFromArray:ackEvents]; + } + } else if (transaction.status == FTransactionRun) { + if (transaction.retryCount >= kFTransactionMaxRetries) { + abortTransaction = YES; + [transaction setAbortStatus:kFTransactionTooManyRetries + reason:nil]; + [events + addObjectsFromArray: + [self.serverSyncTree + ackUserWriteWithWriteId:[transaction.currentWriteId + integerValue] + revert:YES + persist:NO + clock:self.serverClock]]; + } else { + // This code reruns a transaction + id currentNode = + [self latestStateAtPath:transaction.path + excludeWriteIds:writeIdsToExclude]; + transaction.currentInputSnapshot = currentNode; + FIRMutableData *mutableCurrent = + [[FIRMutableData alloc] initWithNode:currentNode]; + FIRTransactionResult *result = + transaction.update(mutableCurrent); + if (result.isSuccess) { + NSNumber *oldWriteId = transaction.currentWriteId; + NSDictionary *serverValues = + [FServerValues generateServerValues:self.serverClock]; + + id newVal = [result.update nodeValue]; + id newValResolved = [FServerValues + resolveDeferredValueSnapshot:newVal + withExisting:transaction + .currentInputSnapshot + serverValues:serverValues]; + + transaction.currentOutputSnapshotRaw = newVal; + transaction.currentOutputSnapshotResolved = newValResolved; + + transaction.currentWriteId = + [NSNumber numberWithInteger:[self nextWriteId]]; + // Mutates writeIdsToExclude in place + [writeIdsToExclude removeObject:oldWriteId]; + [events + addObjectsFromArray: + [self.serverSyncTree + applyUserOverwriteAtPath:transaction.path + newData: + transaction + .currentOutputSnapshotResolved + writeId: + [transaction.currentWriteId + integerValue] + isVisible:transaction + .applyLocally]]; + [events addObjectsFromArray: + [self.serverSyncTree + ackUserWriteWithWriteId:[oldWriteId + integerValue] + revert:YES + persist:NO + clock:self.serverClock]]; + } else { + abortTransaction = YES; + // The user aborted the transaction. JS treats ths as a + // "nodata" abort, but it's not an error, so we don't send + // them an error. + [transaction setAbortStatus:nil reason:nil]; + [events + addObjectsFromArray: + [self.serverSyncTree + ackUserWriteWithWriteId: + [transaction.currentWriteId integerValue] + revert:YES + persist:NO + clock:self.serverClock]]; + } + } + } + + [self.eventRaiser raiseEvents:events]; + events = nil; + + if (abortTransaction) { + // Abort + transaction.status = FTransactionCompleted; + transaction.unwatcher(); + if (transaction.onComplete) { + FIRDatabaseReference *ref = [[FIRDatabaseReference alloc] + initWithRepo:self + path:transaction.path]; + FIndexedNode *lastInput = [FIndexedNode + indexedNodeWithNode:transaction.currentInputSnapshot]; + FIRDataSnapshot *snap = + [[FIRDataSnapshot alloc] initWithRef:ref + indexedNode:lastInput]; + fbt_void_void cb = ^{ + // Unlike JS, no need to check for "nodata" because ObjC has + // abortError = nil + transaction.onComplete(transaction.abortError, NO, snap); + }; + [callbacks addObject:[cb copy]]; + } + } + } + + // Note: unlike current js client, we don't need to preserve priority. Users + // can set priority via FIRMutableData + + // Clean up completed transactions. + [self pruneCompletedTransactionsBelowNode:self.transactionQueueTree]; + + // Now fire callbacks, now that we're in a good, known state. + [self.eventRaiser raiseCallbacks:callbacks]; + + // Try to send the transaction result to the server + [self sendAllReadyTransactions]; +} + +- (FTree *)getAncestorTransactionNodeForPath:(FPath *)path { + FTree *transactionNode = self.transactionQueueTree; + + while (![path isEmpty] && [transactionNode getValue] == nil) { + NSString *front = [path getFront]; + transactionNode = + [transactionNode subTree:[[FPath alloc] initWith:front]]; + path = [path popFront]; + } + + return transactionNode; +} + +- (NSMutableArray *)buildTransactionQueueAtNode:(FTree *)node { + NSMutableArray *queue = [[NSMutableArray alloc] init]; + [self aggregateTransactionQueuesForNode:node andQueue:queue]; + + [queue sortUsingComparator:^NSComparisonResult(FTupleTransaction *obj1, + FTupleTransaction *obj2) { + return [obj1.order compare:obj2.order]; + }]; + + return queue; +} + +- (void)aggregateTransactionQueuesForNode:(FTree *)node + andQueue:(NSMutableArray *)queue { + NSArray *nodeQueue = [node getValue]; + [queue addObjectsFromArray:nodeQueue]; + + [node forEachChild:^(FTree *child) { + [self aggregateTransactionQueuesForNode:child andQueue:queue]; + }]; +} + +/** + * Remove COMPLETED transactions at or below this node in the + * transactionQueueTree + */ +- (void)pruneCompletedTransactionsBelowNode:(FTree *)node { + NSMutableArray *queue = [node getValue]; + if (queue != nil) { + int i = 0; + // remove all of the completed transactions from the queue + while (i < queue.count) { + FTupleTransaction *transaction = [queue objectAtIndex:i]; + if (transaction.status == FTransactionCompleted) { + [queue removeObjectAtIndex:i]; + } else { + i++; + } + } + if (queue.count > 0) { + [node setValue:queue]; + } else { + [node setValue:nil]; + } + } + + [node forEachChildMutationSafe:^(FTree *child) { + [self pruneCompletedTransactionsBelowNode:child]; + }]; +} + +/** + * Aborts all transactions on ancestors or descendants of the specified path. + * Called when doing a setValue: or updateChildValues: since we consider them + * incompatible with transactions + * + * @param path path for which we want to abort related transactions. + */ +- (FPath *)abortTransactionsAtPath:(FPath *)path error:(NSString *)error { + // For the common case that there are no transactions going on, skip all + // this! + if ([self.transactionQueueTree isEmpty]) { + return path; + } else { + FPath *affectedPath = + [self getAncestorTransactionNodeForPath:path].path; + + FTree *transactionNode = [self.transactionQueueTree subTree:path]; + [transactionNode forEachAncestor:^BOOL(FTree *ancestor) { + [self abortTransactionsAtNode:ancestor error:error]; + return NO; + }]; + + [self abortTransactionsAtNode:transactionNode error:error]; + + [transactionNode forEachDescendant:^(FTree *child) { + [self abortTransactionsAtNode:child error:error]; + }]; + + return affectedPath; + } +} + +/** + * Abort transactions stored in this transactions queue node. + * + * @param node Node to abort transactions for. + */ +- (void)abortTransactionsAtNode:(FTree *)node error:(NSString *)error { + NSMutableArray *queue = [node getValue]; + if (queue != nil) { + + // Queue up the callbacks and fire them after cleaning up all of our + // transaction state, since can be immediately aborted and removed. + NSMutableArray *callbacks = [[NSMutableArray alloc] init]; + + // Go through queue. Any already-sent transactions must be marked for + // abort, while the unsent ones can be immediately aborted and removed + NSMutableArray *events = [[NSMutableArray alloc] init]; + int lastSent = -1; + // Note: all of the sent transactions will be at the front of the queue, + // so safe to increment lastSent + for (FTupleTransaction *transaction in queue) { + if (transaction.status == FTransactionSentNeedsAbort) { + // No-op. already marked. + } else if (transaction.status == FTransactionSent) { + // Mark this transaction for abort when it returns + lastSent++; + transaction.status = FTransactionSentNeedsAbort; + [transaction setAbortStatus:error reason:nil]; + } else { + // we can abort this immediately + transaction.unwatcher(); + if ([error isEqualToString:kFTransactionSet]) { + [events + addObjectsFromArray: + [self.serverSyncTree + ackUserWriteWithWriteId: + [transaction.currentWriteId integerValue] + revert:YES + persist:NO + clock:self.serverClock]]; + } else { + // If it was cancelled it was already removed from the sync + // tree, no need to ack + NSAssert([error isEqualToString:kFErrorWriteCanceled], nil); + } + + if (transaction.onComplete) { + NSError *abortReason = [FUtilities errorForStatus:error + andReason:nil]; + FIRDataSnapshot *snapshot = nil; + fbt_void_void cb = ^{ + transaction.onComplete(abortReason, NO, snapshot); + }; + [callbacks addObject:[cb copy]]; + } + } + } + if (lastSent == -1) { + // We're not waiting for any sent transactions. We can clear the + // queue. + [node setValue:nil]; + } else { + // Remove the transactions we aborted + NSRange theRange; + theRange.location = lastSent + 1; + theRange.length = queue.count - theRange.location; + [queue removeObjectsInRange:theRange]; + } + + // Now fire the callbacks + [self.eventRaiser raiseEvents:events]; + [self.eventRaiser raiseCallbacks:callbacks]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoInfo.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoInfo.h new file mode 100644 index 00000000..46e9b8b7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoInfo.h @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FRepoInfo : NSObject + +@property(nonatomic, readonly, strong) NSString *host; +@property(nonatomic, readonly, strong) NSString *namespace; +@property(nonatomic, strong) NSString *internalHost; +@property(nonatomic, readonly) bool secure; + +- (id)initWithHost:(NSString *)host + isSecure:(bool)secure + withNamespace:(NSString *)namespace; + +- (NSString *)connectionURLWithLastSessionID:(NSString *)lastSessionID; +- (NSString *)connectionURL; +- (void)clearInternalHostCache; +- (BOOL)isDemoHost; +- (BOOL)isCustomHost; + +- (id)copyWithZone:(NSZone *)zone; +- (NSUInteger)hash; +- (BOOL)isEqual:(id)anObject; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoInfo.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoInfo.m new file mode 100644 index 00000000..b2dd2e26 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoInfo.m @@ -0,0 +1,144 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FRepoInfo.h" +#import "FConstants.h" + +@interface FRepoInfo () + +@property(nonatomic, strong) NSString *domain; + +@end + +@implementation FRepoInfo + +@synthesize namespace; +@synthesize host; +@synthesize internalHost; +@synthesize secure; +@synthesize domain; + +- (id)initWithHost:(NSString *)aHost + isSecure:(bool)isSecure + withNamespace:(NSString *)aNamespace { + self = [super init]; + if (self) { + host = aHost; + domain = + [host containsString:@"."] + ? [host + substringFromIndex:[host rangeOfString:@"."].location + 1] + : host; + secure = isSecure; + namespace = aNamespace; + + // Get cached internal host if it exists + NSString *internalHostKey = + [NSString stringWithFormat:@"firebase:host:%@", self.host]; + NSString *cachedInternalHost = [[NSUserDefaults standardUserDefaults] + stringForKey:internalHostKey]; + if (cachedInternalHost != nil) { + internalHost = cachedInternalHost; + } else { + internalHost = self.host; + } + } + return self; +} + +- (NSString *)description { + // The namespace is encoded in the hostname, so we can just return this. + return [NSString + stringWithFormat:@"http%@://%@", (self.secure ? @"s" : @""), self.host]; +} + +- (void)setInternalHost:(NSString *)newHost { + if (![internalHost isEqualToString:newHost]) { + internalHost = newHost; + + // Cache the internal host so we don't need to redirect later on + NSString *internalHostKey = + [NSString stringWithFormat:@"firebase:host:%@", self.host]; + NSUserDefaults *cache = [NSUserDefaults standardUserDefaults]; + [cache setObject:internalHost forKey:internalHostKey]; + [cache synchronize]; + } +} + +- (void)clearInternalHostCache { + internalHost = self.host; + + // Remove the cached entry + NSString *internalHostKey = + [NSString stringWithFormat:@"firebase:host:%@", self.host]; + NSUserDefaults *cache = [NSUserDefaults standardUserDefaults]; + [cache removeObjectForKey:internalHostKey]; + [cache synchronize]; +} + +- (BOOL)isDemoHost { + return [self.domain isEqualToString:@"firebaseio-demo.com"]; +} + +- (BOOL)isCustomHost { + return ![self.domain isEqualToString:@"firebaseio-demo.com"] && + ![self.domain isEqualToString:@"firebaseio.com"]; +} + +- (NSString *)connectionURL { + return [self connectionURLWithLastSessionID:nil]; +} + +- (NSString *)connectionURLWithLastSessionID:(NSString *)lastSessionID { + NSString *scheme; + if (self.secure) { + scheme = @"wss"; + } else { + scheme = @"ws"; + } + NSString *url = + [NSString stringWithFormat:@"%@://%@/.ws?%@=%@&ns=%@", scheme, + self.internalHost, kWireProtocolVersionParam, + kWebsocketProtocolVersion, self.namespace]; + + if (lastSessionID != nil) { + url = [NSString stringWithFormat:@"%@&ls=%@", url, lastSessionID]; + } + return url; +} + +- (id)copyWithZone:(NSZone *)zone; +{ + return self; // Immutable +} + +- (NSUInteger)hash { + NSUInteger result = host.hash; + result = 31 * result + (secure ? 1 : 0); + result = 31 * result + namespace.hash; + result = 31 * result + host.hash; + return result; +} + +- (BOOL)isEqual:(id)anObject { + if (![anObject isKindOfClass:[FRepoInfo class]]) + return NO; + FRepoInfo *other = (FRepoInfo *)anObject; + return secure == other.secure && [host isEqualToString:other.host] && + [namespace isEqualToString:other.namespace]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoManager.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoManager.h new file mode 100644 index 00000000..ba8d1fc7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoManager.h @@ -0,0 +1,34 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseConfig.h" +#import "FRepo.h" +#import "FRepoInfo.h" +#import + +@interface FRepoManager : NSObject + ++ (FRepo *)getRepo:(FRepoInfo *)repoInfo config:(FIRDatabaseConfig *)config; ++ (FRepo *)createRepo:(FRepoInfo *)repoInfo + config:(FIRDatabaseConfig *)config + database:(FIRDatabase *)database; ++ (void)interruptAll; ++ (void)interrupt:(FIRDatabaseConfig *)config; ++ (void)resumeAll; ++ (void)resume:(FIRDatabaseConfig *)config; ++ (void)disposeRepos:(FIRDatabaseConfig *)config; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoManager.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoManager.m new file mode 100644 index 00000000..d018cdb2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepoManager.m @@ -0,0 +1,148 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FRepoManager.h" +#import "FAtomicNumber.h" +#import "FIRDatabaseConfig_Private.h" +#import "FIRDatabaseQuery_Private.h" +#import "FIRDatabase_Private.h" +#import "FRepo.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +@implementation FRepoManager + +typedef NSMutableDictionary *> + FRepoDictionary; + ++ (FRepoDictionary *)configs { + static dispatch_once_t pred = 0; + static FRepoDictionary *configs; + dispatch_once(&pred, ^{ + configs = [NSMutableDictionary dictionary]; + }); + return configs; +} + +/** + * Used for legacy unit tests. The public API should go through + * FirebaseDatabase which calls createRepo. + */ ++ (FRepo *)getRepo:(FRepoInfo *)repoInfo config:(FIRDatabaseConfig *)config { + [config freeze]; + FRepoDictionary *configs = [FRepoManager configs]; + @synchronized(configs) { + NSMutableDictionary *repos = + configs[config.sessionIdentifier]; + if (!repos || repos[repoInfo] == nil) { + // Calling this should create the repo. + [FIRDatabase createDatabaseForTests:repoInfo config:config]; + } + + return configs[config.sessionIdentifier][repoInfo]; + } +} + ++ (FRepo *)createRepo:(FRepoInfo *)repoInfo + config:(FIRDatabaseConfig *)config + database:(FIRDatabase *)database { + [config freeze]; + FRepoDictionary *configs = [FRepoManager configs]; + @synchronized(configs) { + NSMutableDictionary *repos = + configs[config.sessionIdentifier]; + if (!repos) { + repos = [NSMutableDictionary dictionary]; + configs[config.sessionIdentifier] = repos; + } + FRepo *repo = repos[repoInfo]; + if (repo == nil) { + repo = [[FRepo alloc] initWithRepoInfo:repoInfo + config:config + database:database]; + repos[repoInfo] = repo; + return repo; + } else { + [NSException + raise:@"RepoExists" + format:@"createRepo called for Repo that already exists."]; + return nil; + } + } +} + ++ (void)interrupt:(FIRDatabaseConfig *)config { + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + FRepoDictionary *configs = [FRepoManager configs]; + NSMutableDictionary *repos = + configs[config.sessionIdentifier]; + for (FRepo *repo in [repos allValues]) { + [repo interrupt]; + } + }); +} + ++ (void)interruptAll { + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + FRepoDictionary *configs = [FRepoManager configs]; + for (NSMutableDictionary *repos in + [configs allValues]) { + for (FRepo *repo in [repos allValues]) { + [repo interrupt]; + } + } + }); +} + ++ (void)resume:(FIRDatabaseConfig *)config { + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + FRepoDictionary *configs = [FRepoManager configs]; + NSMutableDictionary *repos = + configs[config.sessionIdentifier]; + for (FRepo *repo in [repos allValues]) { + [repo resume]; + } + }); +} + ++ (void)resumeAll { + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + FRepoDictionary *configs = [FRepoManager configs]; + for (NSMutableDictionary *repos in + [configs allValues]) { + for (FRepo *repo in [repos allValues]) { + [repo resume]; + } + } + }); +} + ++ (void)disposeRepos:(FIRDatabaseConfig *)config { + // Do this synchronously to make sure we release our references to LevelDB + // before returning, allowing LevelDB to close and release its exclusive + // locks. + dispatch_sync([FIRDatabaseQuery sharedQueue], ^{ + FFLog(@"I-RDB040001", @"Disposing all repos for Config with name %@", + config.sessionIdentifier); + NSMutableDictionary *configs = [FRepoManager configs]; + for (FRepo *repo in [configs[config.sessionIdentifier] allValues]) { + [repo dispose]; + } + [configs removeObjectForKey:config.sessionIdentifier]; + }); +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo_Private.h new file mode 100644 index 00000000..8dc13507 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FRepo_Private.h @@ -0,0 +1,42 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FRepo.h" +#import "FSparseSnapshotTree.h" + +@class FSyncTree; +@class FAtomicNumber; +@class FEventRaiser; +@class FSnapshotHolder; + +@interface FRepo () + +- (void)runOnDisconnectEvents; + +@property(nonatomic, strong) FRepoInfo *repoInfo; +@property(nonatomic, strong) FPersistentConnection *connection; +@property(nonatomic, strong) FSnapshotHolder *infoData; +@property(nonatomic, strong) FSparseSnapshotTree *onDisconnect; +@property(nonatomic, strong) FEventRaiser *eventRaiser; +@property(nonatomic, strong) FSyncTree *serverSyncTree; + +// For testing. +@property(nonatomic) long dataUpdateCount; +@property(nonatomic) long rangeMergeUpdateCount; + +- (NSInteger)nextWriteId; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FServerValues.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FServerValues.h new file mode 100644 index 00000000..c4dc7c54 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FServerValues.h @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FClock.h" +#import "FCompoundWrite.h" +#import "FNode.h" +#import "FSparseSnapshotTree.h" +#import "FSyncTree.h" +#import + +@interface FServerValues : NSObject + ++ (NSDictionary *)generateServerValues:(id)clock; + ++ (FCompoundWrite *)resolveDeferredValueCompoundWrite:(FCompoundWrite *)write + withSyncTree:(FSyncTree *)tree + atPath:(FPath *)path + serverValues: + (NSDictionary *)serverValues; ++ (id)resolveDeferredValueSnapshot:(id)node + withSyncTree:(FSyncTree *)existing + atPath:(FPath *)path + serverValues:(NSDictionary *)serverValues; ++ (id)resolveDeferredValueSnapshot:(id)node + withExisting:(id)existing + serverValues:(NSDictionary *)serverValues; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FServerValues.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FServerValues.m new file mode 100644 index 00000000..dfda2d65 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FServerValues.m @@ -0,0 +1,269 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FServerValues.h" +#import "FChildrenNode.h" +#import "FConstants.h" +#import "FLeafNode.h" +#import "FSnapshotUtilities.h" + +const NSString *kTimestamp = @"timestamp"; +const NSString *kIncrement = @"increment"; + +BOOL canBeRepresentedAsLong(NSNumber *num) { + switch (num.objCType[0]) { + case 'f': // float; fallthrough + case 'd': // double + return NO; + case 'L': // unsigned long; fallthrough + case 'Q': // unsigned long long; fallthrough + // Only use ulong(long) if there isn't an overflow. + if (num.unsignedLongLongValue > LONG_MAX) { + return NO; + } + } + return YES; +} + +// Running through CompoundWrites for all update paths has been shown to +// be a 20% pessimization in microbenchmarks. This is because it slows +// down by O(N) of the write queue length. To eliminate the performance +// hit, we wrap around existing data of either snapshot or CompoundWrite +// (allowing us to share code) and read from the CompoundWrite only when/where +// we need to calculate an incremented value's prior state. +@protocol ValueProvider +- (id)getChild:(NSString *)pathSegment; +- (id)value; +@end + +@interface DeferredValueProvider : NSObject +- (instancetype)initWithSyncTree:(FSyncTree *)tree atPath:(FPath *)path; +- (id)getChild:(NSString *)pathSegment; +- (id)value; +@property FPath *path; +@property FSyncTree *tree; +@end + +@interface ExistingValueProvider : NSObject +- (instancetype)initWithSnapshot:(id)snapshot; +- (id)getChild:(NSString *)pathSegment; +- (id)value; +@property id snapshot; +@end + +@implementation DeferredValueProvider +- (instancetype)initWithSyncTree:(FSyncTree *)tree atPath:(FPath *)path { + self.tree = tree; + self.path = path; + return self; +} + +- (id)getChild:(NSString *)pathSegment { + FPath *child = [self.path childFromString:pathSegment]; + return [[DeferredValueProvider alloc] initWithSyncTree:self.tree + atPath:child]; +} + +- (id)value { + return [self.tree calcCompleteEventCacheAtPath:self.path + excludeWriteIds:@[]]; +} +@end + +@implementation ExistingValueProvider +- (instancetype)initWithSnapshot:(id)snapshot { + self.snapshot = snapshot; + return self; +} + +- (id)getChild:(NSString *)pathSegment { + return [[ExistingValueProvider alloc] + initWithSnapshot:[self.snapshot getImmediateChild:pathSegment]]; +} + +- (id)value { + return self.snapshot; +} +@end + +@interface FServerValues () ++ (id)resolveScalarServerOp:(NSString *)op + withServerValues:(NSDictionary *)serverValues; ++ (id)resolveComplexServerOp:(NSDictionary *)op + withValueProvider:(id)existing + serverValues:(NSDictionary *)serverValues; ++ (id)resolveDeferredValueSnapshot:(id)node + withValueProvider:(id)existing + serverValues:(NSDictionary *)serverValues; + +@end + +@implementation FServerValues + ++ (NSDictionary *)generateServerValues:(id)clock { + long long millis = (long long)([clock currentTime] * 1000); + return @{kTimestamp : [NSNumber numberWithLongLong:millis]}; +} + ++ (id)resolveDeferredValue:(id)val + withExisting:(id)existing + serverValues:(NSDictionary *)serverValues { + if (![val isKindOfClass:[NSDictionary class]]) { + return val; + } + NSDictionary *dict = val; + id op = dict[kServerValueSubKey]; + + if (op == nil) { + return val; + } else if ([op isKindOfClass:NSString.class]) { + return [FServerValues resolveScalarServerOp:op + withServerValues:serverValues]; + } else if ([op isKindOfClass:NSDictionary.class]) { + return [FServerValues resolveComplexServerOp:op + withValueProvider:existing + serverValues:serverValues]; + } + return val; +} + ++ (id)resolveScalarServerOp:(NSString *)op + withServerValues:(NSDictionary *)serverValues { + return serverValues[op]; +} + ++ (id)resolveComplexServerOp:(NSDictionary *)op + withValueProvider:(id)jitExisting + serverValues:(NSDictionary *)serverValues { + // Only increment is supported as of now + if (op[kIncrement] == nil) { + return nil; + } + + // Incrementing a non-number sets the value to the incremented amount + NSNumber *delta = op[kIncrement]; + id existing = jitExisting.value; + if (![existing isLeafNode]) { + return delta; + } + FLeafNode *existingLeaf = existing; + if (![existingLeaf.value isKindOfClass:NSNumber.class]) { + return delta; + } + + NSNumber *existingNum = existingLeaf.value; + BOOL incrLong = canBeRepresentedAsLong(delta); + BOOL baseLong = canBeRepresentedAsLong(existingNum); + + if (incrLong && baseLong) { + long x = delta.longValue; + long y = existingNum.longValue; + long r = x + y; + + // See "Hacker's Delight" 2-12: Overflow if both arguments have the + // opposite sign of the result + if (((x ^ r) & (y ^ r)) >= 0) { + return @(r); + } + } + return @(delta.doubleValue + existingNum.doubleValue); +} + ++ (FCompoundWrite *)resolveDeferredValueCompoundWrite:(FCompoundWrite *)write + withSyncTree:(FSyncTree *)tree + atPath:(FPath *)path + serverValues: + (NSDictionary *)serverValues { + __block FCompoundWrite *resolved = write; + [write enumerateWrites:^(FPath *subPath, id node, BOOL *stop) { + id existing = + [[DeferredValueProvider alloc] initWithSyncTree:tree + atPath:[path child:subPath]]; + id resolvedNode = + [FServerValues resolveDeferredValueSnapshot:node + withValueProvider:existing + serverValues:serverValues]; + // Node actually changed, use pointer inequality here + if (resolvedNode != node) { + resolved = [resolved addWrite:resolvedNode atPath:subPath]; + } + }]; + return resolved; +} + ++ (id)resolveDeferredValueSnapshot:(id)node + withSyncTree:(FSyncTree *)tree + atPath:(FPath *)path + serverValues:(NSDictionary *)serverValues { + id jitExisting = + [[DeferredValueProvider alloc] initWithSyncTree:tree atPath:path]; + return [FServerValues resolveDeferredValueSnapshot:node + withValueProvider:jitExisting + serverValues:serverValues]; +} + ++ (id)resolveDeferredValueSnapshot:(id)node + withExisting:(id)existing + serverValues:(NSDictionary *)serverValues { + id jitExisting = + [[ExistingValueProvider alloc] initWithSnapshot:existing]; + return [FServerValues resolveDeferredValueSnapshot:node + withValueProvider:jitExisting + serverValues:serverValues]; +} + ++ (id)resolveDeferredValueSnapshot:(id)node + withValueProvider:(id)existing + serverValues:(NSDictionary *)serverValues { + id priorityVal = + [FServerValues resolveDeferredValue:[[node getPriority] val] + withExisting:[existing getChild:@".priority"] + serverValues:serverValues]; + id priority = [FSnapshotUtilities nodeFrom:priorityVal]; + + if ([node isLeafNode]) { + id value = [self resolveDeferredValue:[node val] + withExisting:existing + serverValues:serverValues]; + if (![value isEqual:[node val]] || + ![priority isEqual:[node getPriority]]) { + return [[FLeafNode alloc] initWithValue:value + withPriority:priority]; + } else { + return node; + } + } else { + __block FChildrenNode *newNode = node; + if (![priority isEqual:[node getPriority]]) { + newNode = [newNode updatePriority:priority]; + } + + [node enumerateChildrenUsingBlock:^(NSString *childKey, + id childNode, BOOL *stop) { + id newChildNode = [FServerValues + resolveDeferredValueSnapshot:childNode + withValueProvider:[existing getChild:childKey] + serverValues:serverValues]; + if (![newChildNode isEqual:childNode]) { + newNode = [newNode updateImmediateChild:childKey + withNewChild:newChildNode]; + } + }]; + return newNode; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSnapshotHolder.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSnapshotHolder.h new file mode 100644 index 00000000..d682a8e2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSnapshotHolder.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import + +@interface FSnapshotHolder : NSObject + +- (id)getNode:(FPath *)path; +- (void)updateSnapshot:(FPath *)path withNewSnapshot:(id)newSnapshotNode; + +@property(nonatomic, strong) id rootNode; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSnapshotHolder.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSnapshotHolder.m new file mode 100644 index 00000000..59a7b521 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSnapshotHolder.m @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FSnapshotHolder.h" +#import "FEmptyNode.h" + +@interface FSnapshotHolder () + +@end + +@implementation FSnapshotHolder + +@synthesize rootNode; + +- (id)init { + self = [super init]; + if (self) { + self.rootNode = [FEmptyNode emptyNode]; + } + return self; +} + +- (id)getNode:(FPath *)path { + return [self.rootNode getChild:path]; +} + +- (void)updateSnapshot:(FPath *)path + withNewSnapshot:(id)newSnapshotNode { + self.rootNode = [self.rootNode updateChild:path + withNewChild:newSnapshotNode]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSparseSnapshotTree.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSparseSnapshotTree.h new file mode 100644 index 00000000..dab5406c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSparseSnapshotTree.h @@ -0,0 +1,34 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import "FPath.h" +#import "FTypedefs_Private.h" +#import + +@class FSparseSnapshotTree; + +typedef void (^fbt_void_nsstring_sstree)(NSString *, FSparseSnapshotTree *); + +@interface FSparseSnapshotTree : NSObject + +- (id)findPath:(FPath *)path; +- (void)rememberData:(id)data onPath:(FPath *)path; +- (BOOL)forgetPath:(FPath *)path; +- (void)forEachTreeAtPath:(FPath *)prefixPath do:(fbt_void_path_node)func; +- (void)forEachChild:(fbt_void_nsstring_sstree)func; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSparseSnapshotTree.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSparseSnapshotTree.m new file mode 100644 index 00000000..6219309f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSparseSnapshotTree.m @@ -0,0 +1,144 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FSparseSnapshotTree.h" +#import "FChildrenNode.h" + +@interface FSparseSnapshotTree () { + id value; + NSMutableDictionary *children; +} + +@end + +@implementation FSparseSnapshotTree + +- (id)init { + self = [super init]; + if (self) { + value = nil; + children = nil; + } + return self; +} + +- (id)findPath:(FPath *)path { + if (value != nil) { + return [value getChild:path]; + } else if (![path isEmpty] && children != nil) { + NSString *childKey = [path getFront]; + path = [path popFront]; + FSparseSnapshotTree *childTree = children[childKey]; + if (childTree != nil) { + return [childTree findPath:path]; + } else { + return nil; + } + } else { + return nil; + } +} + +- (void)rememberData:(id)data onPath:(FPath *)path { + if ([path isEmpty]) { + value = data; + children = nil; + } else if (value != nil) { + value = [value updateChild:path withNewChild:data]; + } else { + if (children == nil) { + children = [[NSMutableDictionary alloc] init]; + } + + NSString *childKey = [path getFront]; + if (children[childKey] == nil) { + children[childKey] = [[FSparseSnapshotTree alloc] init]; + } + + FSparseSnapshotTree *child = children[childKey]; + path = [path popFront]; + [child rememberData:data onPath:path]; + } +} + +- (BOOL)forgetPath:(FPath *)path { + if ([path isEmpty]) { + value = nil; + children = nil; + return YES; + } else { + if (value != nil) { + if ([value isLeafNode]) { + // non-empty path at leaf. the path leads to nowhere + return NO; + } else { + id tmp = value; + value = nil; + + [tmp enumerateChildrenUsingBlock:^(NSString *key, + id node, BOOL *stop) { + [self rememberData:node onPath:[[FPath alloc] initWith:key]]; + }]; + + // we've cleared out the value and set children. Call ourself + // again to hit the next case + return [self forgetPath:path]; + } + } else if (children != nil) { + NSString *childKey = [path getFront]; + path = [path popFront]; + + if (children[childKey] != nil) { + FSparseSnapshotTree *child = children[childKey]; + BOOL safeToRemove = [child forgetPath:path]; + if (safeToRemove) { + [children removeObjectForKey:childKey]; + } + } + + if ([children count] == 0) { + children = nil; + return YES; + } else { + return NO; + } + } else { + return YES; + } + } +} + +- (void)forEachTreeAtPath:(FPath *)prefixPath do:(fbt_void_path_node)func { + if (value != nil) { + func(prefixPath, value); + } else { + [self forEachChild:^(NSString *key, FSparseSnapshotTree *tree) { + FPath *path = [prefixPath childFromString:key]; + [tree forEachTreeAtPath:path do:func]; + }]; + } +} + +- (void)forEachChild:(fbt_void_nsstring_sstree)func { + if (children != nil) { + for (NSString *key in children) { + FSparseSnapshotTree *tree = [children objectForKey:key]; + func(key, tree); + } + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncPoint.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncPoint.h new file mode 100644 index 00000000..a9bd4d94 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncPoint.h @@ -0,0 +1,69 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FOperation; +@class FWriteTreeRef; +@protocol FNode; +@protocol FEventRegistration; +@class FQuerySpec; +@class FChildrenNode; +@class FTupleRemovedQueriesEvents; +@class FView; +@class FPath; +@class FCacheNode; +@class FPersistenceManager; + +@interface FSyncPoint : NSObject + +- (id)initWithPersistenceManager:(FPersistenceManager *)persistence; + +- (BOOL)isEmpty; + +/** + * Returns array of FEvent + */ +- (NSArray *)applyOperation:(id)operation + writesCache:(FWriteTreeRef *)writesCache + serverCache:(id)optCompleteServerCache; + +/** + * Returns array of FEvent + */ +- (NSArray *)addEventRegistration:(id)eventRegistration + forNonExistingViewForQuery:(FQuerySpec *)query + writesCache:(FWriteTreeRef *)writesCache + serverCache:(FCacheNode *)serverCache; + +- (NSArray *)addEventRegistration:(id)eventRegistration + forExistingViewForQuery:(FQuerySpec *)query; + +- (FTupleRemovedQueriesEvents *)removeEventRegistration: + (id)eventRegistration + forQuery:(FQuerySpec *)query + cancelError:(NSError *)cancelError; +/** + * Returns array of FViews + */ +- (NSArray *)queryViews; +- (id)completeServerCacheAtPath:(FPath *)path; +- (FView *)viewForQuery:(FQuerySpec *)query; +- (BOOL)viewExistsForQuery:(FQuerySpec *)query; +- (BOOL)hasCompleteView; +- (FView *)completeView; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncPoint.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncPoint.m new file mode 100644 index 00000000..6496ae84 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncPoint.m @@ -0,0 +1,302 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FSyncPoint.h" +#import "FCacheNode.h" +#import "FChildrenNode.h" +#import "FDataEvent.h" +#import "FEmptyNode.h" +#import "FEventRegistration.h" +#import "FIRDatabaseQuery.h" +#import "FNode.h" +#import "FOperation.h" +#import "FOperationSource.h" +#import "FPath.h" +#import "FPersistenceManager.h" +#import "FQueryParams.h" +#import "FQuerySpec.h" +#import "FTupleRemovedQueriesEvents.h" +#import "FView.h" +#import "FViewCache.h" +#import "FWriteTreeRef.h" + +/** + * SyncPoint represents a single location in a SyncTree with 1 or more event + * registrations, meaning we need to maintain 1 or more Views at this location + * to cache server data and raise appropriate events for server changes and user + * writes (set, transaction, update). + * + * It's responsible for: + * - Maintaining the set of 1 or more views necessary at this location (a + * SyncPoint with 0 views should be removed). + * - Proxying user / server operations to the views as appropriate (i.e. + * applyServerOverwrite, applyUserOverwrite, etc.) + */ +@interface FSyncPoint () +/** + * The Views being tracked at this location in the tree, stored as a map where + * the key is a queryParams and the value is the View for that query. + * + * NOTE: This list will be quite small (usually 1, but perhaps 2 or 3; any more + * is an odd use case). + * + * Maps NSString -> FView + */ +@property(nonatomic, strong) NSMutableDictionary *views; + +@property(nonatomic, strong) FPersistenceManager *persistenceManager; +@end + +@implementation FSyncPoint + +- (id)initWithPersistenceManager:(FPersistenceManager *)persistence { + self = [super init]; + if (self) { + self.persistenceManager = persistence; + self.views = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (BOOL)isEmpty { + return [self.views count] == 0; +} + +- (NSArray *)applyOperation:(id)operation + toView:(FView *)view + writesCache:(FWriteTreeRef *)writesCache + serverCache:(id)optCompleteServerCache { + FViewOperationResult *result = [view applyOperation:operation + writesCache:writesCache + serverCache:optCompleteServerCache]; + if (!view.query.loadsAllData) { + NSMutableSet *removed = [NSMutableSet set]; + NSMutableSet *added = [NSMutableSet set]; + [result.changes enumerateObjectsUsingBlock:^( + FChange *change, NSUInteger idx, BOOL *stop) { + if (change.type == FIRDataEventTypeChildAdded) { + [added addObject:change.childKey]; + } else if (change.type == FIRDataEventTypeChildRemoved) { + [removed addObject:change.childKey]; + } + }]; + if ([removed count] > 0 || [added count] > 0) { + [self.persistenceManager + updateTrackedQueryKeysWithAddedKeys:added + removedKeys:removed + forQuery:view.query]; + } + } + return result.events; +} + +- (NSArray *)applyOperation:(id)operation + writesCache:(FWriteTreeRef *)writesCache + serverCache:(id)optCompleteServerCache { + FQueryParams *queryParams = operation.source.queryParams; + if (queryParams != nil) { + FView *view = [self.views objectForKey:queryParams]; + NSAssert(view != nil, @"SyncTree gave us an op for an invalid query."); + return [self applyOperation:operation + toView:view + writesCache:writesCache + serverCache:optCompleteServerCache]; + } else { + NSMutableArray *events = [[NSMutableArray alloc] init]; + [self.views enumerateKeysAndObjectsUsingBlock:^( + FQueryParams *key, FView *view, BOOL *stop) { + NSArray *eventsForView = [self applyOperation:operation + toView:view + writesCache:writesCache + serverCache:optCompleteServerCache]; + [events addObjectsFromArray:eventsForView]; + }]; + return events; + } +} + +/** + * Add an event callback for the specified query + * Returns Array of FEvent events to raise. + */ +- (NSArray *)addEventRegistration:(id)eventRegistration + forNonExistingViewForQuery:(FQuerySpec *)query + writesCache:(FWriteTreeRef *)writesCache + serverCache:(FCacheNode *)serverCache { + NSAssert(self.views[query.params] == nil, @"Found view for query: %@", + query.params); + // TODO: make writesCache take flag for complete server node + id eventCache = [writesCache + calculateCompleteEventCacheWithCompleteServerCache: + serverCache.isFullyInitialized ? serverCache.node : nil]; + BOOL eventCacheComplete; + if (eventCache != nil) { + eventCacheComplete = YES; + } else { + eventCache = [writesCache + calculateCompleteEventChildrenWithCompleteServerChildren:serverCache + .node]; + eventCacheComplete = NO; + } + + FIndexedNode *indexed = [FIndexedNode indexedNodeWithNode:eventCache + index:query.index]; + FCacheNode *eventCacheNode = + [[FCacheNode alloc] initWithIndexedNode:indexed + isFullyInitialized:eventCacheComplete + isFiltered:NO]; + FViewCache *viewCache = + [[FViewCache alloc] initWithEventCache:eventCacheNode + serverCache:serverCache]; + FView *view = [[FView alloc] initWithQuery:query + initialViewCache:viewCache]; + // If this is a non-default query we need to tell persistence our current + // view of the data + if (!query.loadsAllData) { + NSMutableSet *allKeys = [NSMutableSet set]; + [view.eventCache enumerateChildrenUsingBlock:^( + NSString *key, id node, BOOL *stop) { + [allKeys addObject:key]; + }]; + [self.persistenceManager setTrackedQueryKeys:allKeys forQuery:query]; + } + self.views[query.params] = view; + return [self addEventRegistration:eventRegistration + forExistingViewForQuery:query]; +} + +- (NSArray *)addEventRegistration:(id)eventRegistration + forExistingViewForQuery:(FQuerySpec *)query { + FView *view = self.views[query.params]; + NSAssert(view != nil, @"No view for query: %@", query); + [view addEventRegistration:eventRegistration]; + return [view initialEvents:eventRegistration]; +} + +/** + * Remove event callback(s). Return cancelEvents if a cancelError is specified. + * + * If query is the default query, we'll check all views for the specified + * eventRegistration. If eventRegistration is nil, we'll remove all callbacks + * for the specified view(s). + * + * @return FTupleRemovedQueriesEvents removed queries and any cancel events + */ +- (FTupleRemovedQueriesEvents *)removeEventRegistration: + (id)eventRegistration + forQuery:(FQuerySpec *)query + cancelError:(NSError *)cancelError { + NSMutableArray *removedQueries = [[NSMutableArray alloc] init]; + __block NSMutableArray *cancelEvents = [[NSMutableArray alloc] init]; + BOOL hadCompleteView = [self hasCompleteView]; + if ([query isDefault]) { + // When you do [ref removeObserverWithHandle:], we search all views for + // the registration to remove. + [self.views enumerateKeysAndObjectsUsingBlock:^( + FQueryParams *viewQueryParams, FView *view, + BOOL *stop) { + [cancelEvents + addObjectsFromArray:[view + removeEventRegistration:eventRegistration + cancelError:cancelError]]; + if ([view isEmpty]) { + [self.views removeObjectForKey:viewQueryParams]; + + // We'll deal with complete views later + if (![view.query loadsAllData]) { + [removedQueries addObject:view.query]; + } + } + }]; + } else { + // remove the callback from the specific view + FView *view = [self.views objectForKey:query.params]; + if (view != nil) { + [cancelEvents addObjectsFromArray: + [view removeEventRegistration:eventRegistration + cancelError:cancelError]]; + + if ([view isEmpty]) { + [self.views removeObjectForKey:query.params]; + + // We'll deal with complete views later + if (![view.query loadsAllData]) { + [removedQueries addObject:view.query]; + } + } + } + } + + if (hadCompleteView && ![self hasCompleteView]) { + // We removed our last complete view + [removedQueries addObject:[FQuerySpec defaultQueryAtPath:query.path]]; + } + + return [[FTupleRemovedQueriesEvents alloc] + initWithRemovedQueries:removedQueries + cancelEvents:cancelEvents]; +} + +- (NSArray *)queryViews { + __block NSMutableArray *filteredViews = [[NSMutableArray alloc] init]; + + [self.views enumerateKeysAndObjectsUsingBlock:^(FQueryParams *key, + FView *view, BOOL *stop) { + if (![view.query loadsAllData]) { + [filteredViews addObject:view]; + } + }]; + + return filteredViews; +} + +- (id)completeServerCacheAtPath:(FPath *)path { + __block id serverCache = nil; + [self.views enumerateKeysAndObjectsUsingBlock:^(FQueryParams *key, + FView *view, BOOL *stop) { + serverCache = [view completeServerCacheFor:path]; + *stop = (serverCache != nil); + }]; + return serverCache; +} + +- (FView *)viewForQuery:(FQuerySpec *)query { + return [self.views objectForKey:query.params]; +} + +- (BOOL)viewExistsForQuery:(FQuerySpec *)query { + return [self viewForQuery:query] != nil; +} + +- (BOOL)hasCompleteView { + return [self completeView] != nil; +} + +- (FView *)completeView { + __block FView *completeView = nil; + + [self.views enumerateKeysAndObjectsUsingBlock:^(FQueryParams *key, + FView *view, BOOL *stop) { + if ([view.query loadsAllData]) { + completeView = view; + *stop = YES; + } + }]; + + return completeView; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncTree.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncTree.h new file mode 100644 index 00000000..ef89774f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncTree.h @@ -0,0 +1,82 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FListenProvider; +@protocol FNode; +@class FPath; +@protocol FEventRegistration; +@protocol FPersistedServerCache; +@class FQuerySpec; +@class FCompoundWrite; +@class FPersistenceManager; +@class FCompoundHash; +@protocol FClock; + +@protocol FSyncTreeHash + +- (NSString *)simpleHash; +- (FCompoundHash *)compoundHash; +- (BOOL)includeCompoundHash; + +@end + +@interface FSyncTree : NSObject + +- (id)initWithListenProvider:(FListenProvider *)provider; +- (id)initWithPersistenceManager:(FPersistenceManager *)persistenceManager + listenProvider:(FListenProvider *)provider; + +// These methods all return NSArray of FEvent +- (NSArray *)applyUserOverwriteAtPath:(FPath *)path + newData:(id)newData + writeId:(NSInteger)writeId + isVisible:(BOOL)visible; +- (NSArray *)applyUserMergeAtPath:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren + writeId:(NSInteger)writeId; +- (NSArray *)ackUserWriteWithWriteId:(NSInteger)writeId + revert:(BOOL)revert + persist:(BOOL)persist + clock:(id)clock; +- (NSArray *)applyServerOverwriteAtPath:(FPath *)path + newData:(id)newData; +- (NSArray *)applyServerMergeAtPath:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren; +- (NSArray *)applyServerRangeMergeAtPath:(FPath *)path + updates:(NSArray *)ranges; +- (NSArray *)applyTaggedQueryOverwriteAtPath:(FPath *)path + newData:(id)newData + tagId:(NSNumber *)tagId; +- (NSArray *)applyTaggedQueryMergeAtPath:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren + tagId:(NSNumber *)tagId; +- (NSArray *)applyTaggedServerRangeMergeAtPath:(FPath *)path + updates:(NSArray *)ranges + tagId:(NSNumber *)tagId; +- (NSArray *)addEventRegistration:(id)eventRegistration + forQuery:(FQuerySpec *)query; +- (NSArray *)removeEventRegistration:(id)eventRegistration + forQuery:(FQuerySpec *)query + cancelError:(NSError *)cancelError; +- (void)keepQuery:(FQuerySpec *)query synced:(BOOL)keepSynced; +- (NSArray *)removeAllWrites; + +- (id)calcCompleteEventCacheAtPath:(FPath *)path + excludeWriteIds:(NSArray *)writeIdsToExclude; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncTree.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncTree.m new file mode 100644 index 00000000..1c3e5146 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FSyncTree.m @@ -0,0 +1,1042 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FSyncTree.h" +#import "FAckUserWrite.h" +#import "FAtomicNumber.h" +#import "FCacheNode.h" +#import "FChildrenNode.h" +#import "FCompoundHash.h" +#import "FCompoundWrite.h" +#import "FEmptyNode.h" +#import "FEventRaiser.h" +#import "FEventRegistration.h" +#import "FImmutableTree.h" +#import "FKeepSyncedEventRegistration.h" +#import "FListenComplete.h" +#import "FListenProvider.h" +#import "FMerge.h" +#import "FNode.h" +#import "FOperation.h" +#import "FOperationSource.h" +#import "FOverwrite.h" +#import "FPath.h" +#import "FPersistenceManager.h" +#import "FQueryParams.h" +#import "FQuerySpec.h" +#import "FRangeMerge.h" +#import "FServerValues.h" +#import "FSnapshotHolder.h" +#import "FSnapshotUtilities.h" +#import "FSyncPoint.h" +#import "FTupleRemovedQueriesEvents.h" +#import "FUtilities.h" +#import "FView.h" +#import "FWriteRecord.h" +#import "FWriteTree.h" +#import "FWriteTreeRef.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +// Size after which we start including the compound hash +static const NSUInteger kFSizeThresholdForCompoundHash = 1024; + +@interface FListenContainer : NSObject + +@property(nonatomic, strong) FView *view; +@property(nonatomic, copy) fbt_nsarray_nsstring onComplete; + +@end + +@implementation FListenContainer + +- (instancetype)initWithView:(FView *)view + onComplete:(fbt_nsarray_nsstring)onComplete { + self = [super init]; + if (self != nil) { + self->_view = view; + self->_onComplete = onComplete; + } + return self; +} + +- (id)serverCache { + return self.view.serverCache; +} + +- (FCompoundHash *)compoundHash { + return [FCompoundHash fromNode:[self serverCache]]; +} + +- (NSString *)simpleHash { + return [[self serverCache] dataHash]; +} + +- (BOOL)includeCompoundHash { + return [FSnapshotUtilities estimateSerializedNodeSize:[self serverCache]] > + kFSizeThresholdForCompoundHash; +} + +@end + +@interface FSyncTree () + +/** + * Tree of SyncPoints. There's a SyncPoint at any location that has 1 or more + * views. + */ +@property(nonatomic, strong) FImmutableTree *syncPointTree; + +/** + * A tree of all pending user writes (user-initiated set, transactions, updates, + * etc) + */ +@property(nonatomic, strong) FWriteTree *pendingWriteTree; + +/** + * Maps tagId -> FTuplePathQueryParams + */ +@property(nonatomic, strong) NSMutableDictionary *tagToQueryMap; +@property(nonatomic, strong) NSMutableDictionary *queryToTagMap; +@property(nonatomic, strong) FListenProvider *listenProvider; +@property(nonatomic, strong) FPersistenceManager *persistenceManager; +@property(nonatomic, strong) FAtomicNumber *queryTagCounter; +@property(nonatomic, strong) NSMutableSet *keepSyncedQueries; + +@end + +/** + * SyncTree is the central class for managing event callback registration, data + * caching, views (query processing), and event generation. There are typically + * two SyncTree instances for each Repo, one for the normal Firebase data, and + * one for the .info data. + * + * It has a number of responsibilities, including: + * - Tracking all user event callbacks (registered via addEventRegistration: + * and removeEventRegistration:). + * - Applying and caching data changes for user setValue:, + * runTransactionBlock:, and updateChildValues: calls + * (applyUserOverwriteAtPath:, applyUserMergeAtPath:). + * - Applying and caching data changes for server data changes + * (applyServerOverwriteAtPath:, applyServerMergeAtPath:). + * - Generating user-facing events for server and user changes (all of the + * apply* methods return the set of events that need to be raised as a result). + * - Maintaining the appropriate set of server listens to ensure we are always + * subscribed to the correct set of paths and queries to satisfy the current set + * of user event callbacks (listens are started/stopped using the provided + * listenProvider). + * + * NOTE: Although SyncTree tracks event callbacks and calculates events to + * raise, the actual events are returned to the caller rather than raised + * synchronously. + */ +@implementation FSyncTree + +- (id)initWithListenProvider:(FListenProvider *)provider { + return [self initWithPersistenceManager:nil listenProvider:provider]; +} + +- (id)initWithPersistenceManager:(FPersistenceManager *)persistenceManager + listenProvider:(FListenProvider *)provider { + self = [super init]; + if (self) { + self.syncPointTree = [FImmutableTree empty]; + self.pendingWriteTree = [[FWriteTree alloc] init]; + self.tagToQueryMap = [[NSMutableDictionary alloc] init]; + self.queryToTagMap = [[NSMutableDictionary alloc] init]; + self.listenProvider = provider; + self.persistenceManager = persistenceManager; + self.queryTagCounter = [[FAtomicNumber alloc] init]; + self.keepSyncedQueries = [NSMutableSet set]; + } + return self; +} + +#pragma mark - +#pragma mark Apply Operations + +/** + * Apply data changes for a user-generated setValue: runTransactionBlock: + * updateChildValues:, etc. + * @return NSArray of FEvent to raise. + */ +- (NSArray *)applyUserOverwriteAtPath:(FPath *)path + newData:(id)newData + writeId:(NSInteger)writeId + isVisible:(BOOL)visible { + // Record pending write + [self.pendingWriteTree addOverwriteAtPath:path + newData:newData + writeId:writeId + isVisible:visible]; + if (!visible) { + return @[]; + } else { + FOverwrite *operation = + [[FOverwrite alloc] initWithSource:[FOperationSource userInstance] + path:path + snap:newData]; + return [self applyOperationToSyncPoints:operation]; + } +} + +/** + * Apply the data from a user-generated updateChildValues: call + * @return NSArray of FEvent to raise. + */ +- (NSArray *)applyUserMergeAtPath:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren + writeId:(NSInteger)writeId { + // Record pending merge + [self.pendingWriteTree addMergeAtPath:path + changedChildren:changedChildren + writeId:writeId]; + + FMerge *operation = + [[FMerge alloc] initWithSource:[FOperationSource userInstance] + path:path + children:changedChildren]; + return [self applyOperationToSyncPoints:operation]; +} + +/** + * Acknowledge a pending user write that was previously registered with + * applyUserOverwriteAtPath: or applyUserMergeAtPath: + * TODO[offline]: Taking a serverClock here is awkward, but server values are + * awkward. :-( + * @return NSArray of FEvent to raise. + */ +- (NSArray *)ackUserWriteWithWriteId:(NSInteger)writeId + revert:(BOOL)revert + persist:(BOOL)persist + clock:(id)clock { + FWriteRecord *write = [self.pendingWriteTree writeForId:writeId]; + BOOL needToReevaluate = [self.pendingWriteTree removeWriteId:writeId]; + if (write.visible) { + if (persist) { + [self.persistenceManager removeUserWrite:writeId]; + } + if (!revert) { + NSDictionary *serverValues = + [FServerValues generateServerValues:clock]; + if ([write isOverwrite]) { + id resolvedNode = + [FServerValues resolveDeferredValueSnapshot:write.overwrite + withSyncTree:self + atPath:write.path + serverValues:serverValues]; + [self.persistenceManager applyUserWrite:resolvedNode + toServerCacheAtPath:write.path]; + } else { + FCompoundWrite *resolvedMerge = [FServerValues + resolveDeferredValueCompoundWrite:write.merge + withSyncTree:self + atPath:write.path + serverValues:serverValues]; + [self.persistenceManager applyUserMerge:resolvedMerge + toServerCacheAtPath:write.path]; + } + } + } + if (!needToReevaluate) { + return @[]; + } else { + __block FImmutableTree *affectedTree = [FImmutableTree empty]; + if (write.isOverwrite) { + affectedTree = [affectedTree setValue:@YES atPath:[FPath empty]]; + } else { + [write.merge + enumerateWrites:^(FPath *path, id node, BOOL *stop) { + affectedTree = [affectedTree setValue:@YES atPath:path]; + }]; + } + FAckUserWrite *operation = + [[FAckUserWrite alloc] initWithPath:write.path + affectedTree:affectedTree + revert:revert]; + return [self applyOperationToSyncPoints:operation]; + } +} + +/** + * Apply new server data for the specified path + * @return NSArray of FEvent to raise. + */ +- (NSArray *)applyServerOverwriteAtPath:(FPath *)path + newData:(id)newData { + [self.persistenceManager + updateServerCacheWithNode:newData + forQuery:[FQuerySpec defaultQueryAtPath:path]]; + FOverwrite *operation = + [[FOverwrite alloc] initWithSource:[FOperationSource serverInstance] + path:path + snap:newData]; + return [self applyOperationToSyncPoints:operation]; +} + +/** + * Applied new server data to be merged in at the specified path + * @return NSArray of FEvent to raise. + */ +- (NSArray *)applyServerMergeAtPath:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren { + [self.persistenceManager updateServerCacheWithMerge:changedChildren + atPath:path]; + FMerge *operation = + [[FMerge alloc] initWithSource:[FOperationSource serverInstance] + path:path + children:changedChildren]; + return [self applyOperationToSyncPoints:operation]; +} + +- (NSArray *)applyServerRangeMergeAtPath:(FPath *)path + updates:(NSArray *)ranges { + FSyncPoint *syncPoint = [self.syncPointTree valueAtPath:path]; + if (syncPoint == nil) { + // Removed view, so it's safe to just ignore this update + return @[]; + } else { + // This could be for any "complete" (unfiltered) view, and if there is + // more than one complete view, they should each have the same cache so + // it doesn't matter which one we use. + FView *view = [syncPoint completeView]; + if (view != nil) { + id serverNode = [view serverCache]; + for (FRangeMerge *merge in ranges) { + serverNode = [merge applyToNode:serverNode]; + } + return [self applyServerOverwriteAtPath:path newData:serverNode]; + } else { + // There doesn't exist a view for this update, so it was removed and + // it's safe to just ignore this range merge + return @[]; + } + } +} + +/** + * Apply a listen complete to a path + * @return NSArray of FEvent to raise. + */ +- (NSArray *)applyListenCompleteAtPath:(FPath *)path { + [self.persistenceManager + setQueryComplete:[FQuerySpec defaultQueryAtPath:path]]; + id operation = [[FListenComplete alloc] + initWithSource:[FOperationSource serverInstance] + path:path]; + return [self applyOperationToSyncPoints:operation]; +} + +/** + * Apply a listen complete to a path + * @return NSArray of FEvent to raise. + */ +- (NSArray *)applyTaggedListenCompleteAtPath:(FPath *)path + tagId:(NSNumber *)tagId { + FQuerySpec *query = [self queryForTag:tagId]; + if (query != nil) { + [self.persistenceManager setQueryComplete:query]; + FPath *relativePath = [FPath relativePathFrom:query.path to:path]; + id op = [[FListenComplete alloc] + initWithSource:[FOperationSource forServerTaggedQuery:query.params] + path:relativePath]; + return [self applyTaggedOperation:op atPath:query.path]; + } else { + // We've already removed the query. No big deal, ignore the update. + return @[]; + } +} + +/** + * Internal helper method to apply tagged operation + */ +- (NSArray *)applyTaggedOperation:(id)operation + atPath:(FPath *)path { + FSyncPoint *syncPoint = [self.syncPointTree valueAtPath:path]; + NSAssert(syncPoint != nil, + @"Missing sync point for query tag that we're tracking."); + FWriteTreeRef *writesCache = + [self.pendingWriteTree childWritesForPath:path]; + return [syncPoint applyOperation:operation + writesCache:writesCache + serverCache:nil]; +} + +/** + * Apply new server data for the specified tagged query + * @return NSArray of FEvent to raise. + */ +- (NSArray *)applyTaggedQueryOverwriteAtPath:(FPath *)path + newData:(id)newData + tagId:(NSNumber *)tagId { + FQuerySpec *query = [self queryForTag:tagId]; + if (query != nil) { + FPath *relativePath = [FPath relativePathFrom:query.path to:path]; + FQuerySpec *queryToOverwrite = + relativePath.isEmpty ? query : [FQuerySpec defaultQueryAtPath:path]; + [self.persistenceManager updateServerCacheWithNode:newData + forQuery:queryToOverwrite]; + FOverwrite *operation = [[FOverwrite alloc] + initWithSource:[FOperationSource forServerTaggedQuery:query.params] + path:relativePath + snap:newData]; + return [self applyTaggedOperation:operation atPath:query.path]; + } else { + // Query must have been removed already + return @[]; + } +} + +/** + * Apply server data to be merged in for the specified tagged query + * @return NSArray of FEvent to raise. + */ +- (NSArray *)applyTaggedQueryMergeAtPath:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren + tagId:(NSNumber *)tagId { + FQuerySpec *query = [self queryForTag:tagId]; + if (query != nil) { + FPath *relativePath = [FPath relativePathFrom:query.path to:path]; + [self.persistenceManager updateServerCacheWithMerge:changedChildren + atPath:path]; + FMerge *operation = [[FMerge alloc] + initWithSource:[FOperationSource forServerTaggedQuery:query.params] + path:relativePath + children:changedChildren]; + return [self applyTaggedOperation:operation atPath:query.path]; + } else { + // We've already removed the query. No big deal, ignore the update. + return @[]; + } +} + +- (NSArray *)applyTaggedServerRangeMergeAtPath:(FPath *)path + updates:(NSArray *)ranges + tagId:(NSNumber *)tagId { + FQuerySpec *query = [self queryForTag:tagId]; + if (query != nil) { + NSAssert([path isEqual:query.path], + @"Tagged update path and query path must match"); + FSyncPoint *syncPoint = [self.syncPointTree valueAtPath:path]; + NSAssert(syncPoint != nil, + @"Missing sync point for query tag that we're tracking."); + FView *view = [syncPoint viewForQuery:query]; + NSAssert(view != nil, + @"Missing view for query tag that we're tracking"); + id serverNode = [view serverCache]; + for (FRangeMerge *merge in ranges) { + serverNode = [merge applyToNode:serverNode]; + } + return [self applyTaggedQueryOverwriteAtPath:path + newData:serverNode + tagId:tagId]; + } else { + // We've already removed the query. No big deal, ignore the update. + return @[]; + } +} + +/** + * Add an event callback for the specified query + * @return NSArray of FEvent to raise. + */ +- (NSArray *)addEventRegistration:(id)eventRegistration + forQuery:(FQuerySpec *)query { + FPath *path = query.path; + + __block BOOL foundAncestorDefaultView = NO; + [self.syncPointTree + forEachOnPath:query.path + whileBlock:^BOOL(FPath *pathToSyncPoint, FSyncPoint *syncPoint) { + foundAncestorDefaultView = + foundAncestorDefaultView || [syncPoint hasCompleteView]; + return !foundAncestorDefaultView; + }]; + + [self.persistenceManager setQueryActive:query]; + + FSyncPoint *syncPoint = [self.syncPointTree valueAtPath:path]; + if (syncPoint == nil) { + syncPoint = [[FSyncPoint alloc] + initWithPersistenceManager:self.persistenceManager]; + self.syncPointTree = [self.syncPointTree setValue:syncPoint + atPath:path]; + } + + BOOL viewAlreadyExists = [syncPoint viewExistsForQuery:query]; + NSArray *events; + if (viewAlreadyExists) { + events = [syncPoint addEventRegistration:eventRegistration + forExistingViewForQuery:query]; + } else { + if (![query loadsAllData]) { + // We need to track a tag for this query + NSAssert(self.queryToTagMap[query] == nil, + @"View does not exist, but we have a tag"); + NSNumber *tagId = [self.queryTagCounter getAndIncrement]; + self.queryToTagMap[query] = tagId; + self.tagToQueryMap[tagId] = query; + } + + FWriteTreeRef *writesCache = + [self.pendingWriteTree childWritesForPath:path]; + FCacheNode *serverCache = [self serverCacheForQuery:query]; + events = [syncPoint addEventRegistration:eventRegistration + forNonExistingViewForQuery:query + writesCache:writesCache + serverCache:serverCache]; + + // There was no view and no default listen + if (!foundAncestorDefaultView) { + FView *view = [syncPoint viewForQuery:query]; + NSMutableArray *mutableEvents = [events mutableCopy]; + [mutableEvents + addObjectsFromArray:[self setupListenerOnQuery:query + view:view]]; + events = mutableEvents; + } + } + + return events; +} + +- (FCacheNode *)serverCacheForQuery:(FQuerySpec *)query { + __block id serverCacheNode = nil; + + [self.syncPointTree + forEachOnPath:query.path + whileBlock:^BOOL(FPath *pathToSyncPoint, FSyncPoint *syncPoint) { + FPath *relativePath = [FPath relativePathFrom:pathToSyncPoint + to:query.path]; + serverCacheNode = + [syncPoint completeServerCacheAtPath:relativePath]; + return serverCacheNode == nil; + }]; + + FCacheNode *serverCache; + if (serverCacheNode != nil) { + FIndexedNode *indexed = + [FIndexedNode indexedNodeWithNode:serverCacheNode + index:query.index]; + serverCache = [[FCacheNode alloc] initWithIndexedNode:indexed + isFullyInitialized:YES + isFiltered:NO]; + } else { + FCacheNode *persistenceServerCache = + [self.persistenceManager serverCacheForQuery:query]; + if (persistenceServerCache.isFullyInitialized) { + serverCache = persistenceServerCache; + } else { + serverCacheNode = [FEmptyNode emptyNode]; + + FImmutableTree *subtree = + [self.syncPointTree subtreeAtPath:query.path]; + [subtree + forEachChild:^(NSString *childKey, FSyncPoint *childSyncPoint) { + id completeCache = + [childSyncPoint completeServerCacheAtPath:[FPath empty]]; + if (completeCache) { + serverCacheNode = + [serverCacheNode updateImmediateChild:childKey + withNewChild:completeCache]; + } + }]; + // Fill the node with any available children we have + [persistenceServerCache.node + enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + if (![serverCacheNode hasChild:key]) { + serverCacheNode = + [serverCacheNode updateImmediateChild:key + withNewChild:node]; + } + }]; + FIndexedNode *indexed = + [FIndexedNode indexedNodeWithNode:serverCacheNode + index:query.index]; + serverCache = [[FCacheNode alloc] initWithIndexedNode:indexed + isFullyInitialized:NO + isFiltered:NO]; + } + } + + return serverCache; +} + +/** + * Remove event callback(s). + * + * If query is the default query, we'll check all queries for the specified + * eventRegistration. If eventRegistration is null, we'll remove all callbacks + * for the specified query/queries. + * + * @param eventRegistration if nil, all callbacks are removed + * @param cancelError If provided, appropriate cancel events will be returned + * @return NSArray of FEvent to raise. + */ +- (NSArray *)removeEventRegistration:(id)eventRegistration + forQuery:(FQuerySpec *)query + cancelError:(NSError *)cancelError { + // Find the syncPoint first. Then deal with whether or not it has matching + // listeners + FPath *path = query.path; + FSyncPoint *maybeSyncPoint = [self.syncPointTree valueAtPath:path]; + NSArray *cancelEvents = @[]; + + // A removal on a default query affects all queries at that location. A + // removal on an indexed query, even one without other query constraints, + // does *not* affect all queries at that location. So this check must be for + // 'default', and not loadsAllData: + if (maybeSyncPoint && + ([query isDefault] || [maybeSyncPoint viewExistsForQuery:query])) { + FTupleRemovedQueriesEvents *removedAndEvents = + [maybeSyncPoint removeEventRegistration:eventRegistration + forQuery:query + cancelError:cancelError]; + if ([maybeSyncPoint isEmpty]) { + self.syncPointTree = [self.syncPointTree removeValueAtPath:path]; + } + NSArray *removed = removedAndEvents.removedQueries; + cancelEvents = removedAndEvents.cancelEvents; + + // We may have just removed one of many listeners and can short-circuit + // this whole process We may also not have removed a default listener, + // in which case all of the descendant listeners should already be + // properly set up. + // + // Since indexed queries can shadow if they don't have other query + // constraints, check for loadsAllData: instead of isDefault: + NSUInteger defaultQueryIndex = [removed + indexOfObjectPassingTest:^BOOL(FQuerySpec *q, NSUInteger idx, + BOOL *stop) { + return [q loadsAllData]; + }]; + BOOL removingDefault = defaultQueryIndex != NSNotFound; + [removed enumerateObjectsUsingBlock:^(FQuerySpec *query, NSUInteger idx, + BOOL *stop) { + [self.persistenceManager setQueryInactive:query]; + }]; + NSNumber *covered = [self.syncPointTree + findOnPath:path + andApplyBlock:^id(FPath *relativePath, + FSyncPoint *parentSyncPoint) { + return + [NSNumber numberWithBool:[parentSyncPoint hasCompleteView]]; + }]; + + if (removingDefault && ![covered boolValue]) { + FImmutableTree *subtree = [self.syncPointTree subtreeAtPath:path]; + // There are potentially child listeners. Determine what if any + // listens we need to send before executing the removal + if (![subtree isEmpty]) { + // We need to fold over our subtree and collect the listeners to + // send + NSArray *newViews = + [self collectDistinctViewsForSubTree:subtree]; + + // Ok, we've collected all the listens we need. Set them up. + [newViews enumerateObjectsUsingBlock:^( + FView *view, NSUInteger idx, BOOL *stop) { + FQuerySpec *newQuery = view.query; + FListenContainer *listenContainer = + [self createListenerForView:view]; + self.listenProvider.startListening( + [self queryForListening:newQuery], + [self tagForQuery:newQuery], listenContainer, + listenContainer.onComplete); + }]; + } else { + // There's nothing below us, so nothing we need to start + // listening on + } + } + + // If we removed anything and we're not covered by a higher up listen, + // we need to stop listening on this query. The above block has us + // covered in terms of making sure we're set up on listens lower in the + // tree. Also, note that if we have a cancelError, it's already been + // removed at the provider level. + if (![covered boolValue] && [removed count] > 0 && cancelError == nil) { + // If we removed a default, then we weren't listening on any of the + // other queries here. Just cancel the one default. Otherwise, we + // need to iterate through and cancel each individual query + if (removingDefault) { + // We don't tag default listeners + self.listenProvider.stopListening( + [self queryForListening:query], nil); + } else { + [removed + enumerateObjectsUsingBlock:^(FQuerySpec *queryToRemove, + NSUInteger idx, BOOL *stop) { + NSNumber *tagToRemove = + [self.queryToTagMap objectForKey:queryToRemove]; + self.listenProvider.stopListening( + [self queryForListening:queryToRemove], tagToRemove); + }]; + } + } + // Now, clear all the tags we're tracking for the removed listens. + [self removeTags:removed]; + } else { + // No-op, this listener must've been already removed + } + return cancelEvents; +} + +- (void)keepQuery:(FQuerySpec *)query synced:(BOOL)keepSynced { + // Only do something if we actually need to add/remove an event registration + if (keepSynced && ![self.keepSyncedQueries containsObject:query]) { + [self addEventRegistration:[FKeepSyncedEventRegistration instance] + forQuery:query]; + [self.keepSyncedQueries addObject:query]; + } else if (!keepSynced && [self.keepSyncedQueries containsObject:query]) { + [self removeEventRegistration:[FKeepSyncedEventRegistration instance] + forQuery:query + cancelError:nil]; + [self.keepSyncedQueries removeObject:query]; + } +} + +- (NSArray *)removeAllWrites { + [self.persistenceManager removeAllUserWrites]; + NSArray *removedWrites = [self.pendingWriteTree removeAllWrites]; + if (removedWrites.count > 0) { + FImmutableTree *affectedTree = + [[FImmutableTree empty] setValue:@YES atPath:[FPath empty]]; + return [self applyOperationToSyncPoints:[[FAckUserWrite alloc] + initWithPath:[FPath empty] + affectedTree:affectedTree + revert:YES]]; + } else { + return @[]; + } +} + +/** + * Returns a complete cache, if we have one, of the data at a particular path. + * The location must have a listener above it, but as this is only used by + * transaction code, that should always be the case anyways. + * + * Note: this method will *include* hidden writes from transaction with + * applyLocally set to false. + * @param path The path to the data we want + * @param writeIdsToExclude A specific set to be excluded + */ +- (id)calcCompleteEventCacheAtPath:(FPath *)path + excludeWriteIds:(NSArray *)writeIdsToExclude { + BOOL includeHiddenSets = YES; + FWriteTree *writeTree = self.pendingWriteTree; + id serverCache = [self.syncPointTree + findOnPath:path + andApplyBlock:^id(FPath *pathSoFar, FSyncPoint *syncPoint) { + FPath *relativePath = [FPath relativePathFrom:pathSoFar to:path]; + id serverCache = + [syncPoint completeServerCacheAtPath:relativePath]; + if (serverCache) { + return serverCache; + } else { + return nil; + } + }]; + return [writeTree calculateCompleteEventCacheAtPath:path + completeServerCache:serverCache + excludeWriteIds:writeIdsToExclude + includeHiddenWrites:includeHiddenSets]; +} + +#pragma mark - +#pragma mark Private Methods +/** + * This collapses multiple unfiltered views into a single view, since we only + * need a single listener for them. + * @return NSArray of FView + */ +- (NSArray *)collectDistinctViewsForSubTree:(FImmutableTree *)subtree { + return [subtree foldWithBlock:^NSArray *(FPath *relativePath, + FSyncPoint *maybeChildSyncPoint, + NSDictionary *childMap) { + if (maybeChildSyncPoint && [maybeChildSyncPoint hasCompleteView]) { + FView *completeView = [maybeChildSyncPoint completeView]; + return @[ completeView ]; + } else { + // No complete view here, flatten any deeper listens into an array + NSMutableArray *views = [[NSMutableArray alloc] init]; + if (maybeChildSyncPoint) { + views = [[maybeChildSyncPoint queryViews] mutableCopy]; + } + [childMap enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, NSArray *childViews, BOOL *stop) { + [views addObjectsFromArray:childViews]; + }]; + return views; + } + }]; +} + +/** + * @param queries NSArray of FQuerySpec + */ +- (void)removeTags:(NSArray *)queries { + [queries enumerateObjectsUsingBlock:^(FQuerySpec *removedQuery, + NSUInteger idx, BOOL *stop) { + if (![removedQuery loadsAllData]) { + // We should have a tag for this + NSNumber *removedQueryTag = self.queryToTagMap[removedQuery]; + [self.queryToTagMap removeObjectForKey:removedQuery]; + [self.tagToQueryMap removeObjectForKey:removedQueryTag]; + } + }]; +} + +- (FQuerySpec *)queryForListening:(FQuerySpec *)query { + if (query.loadsAllData && !query.isDefault) { + // We treat queries that load all data as default queries + return [FQuerySpec defaultQueryAtPath:query.path]; + } else { + return query; + } +} + +/** + * For a given new listen, manage the de-duplication of outstanding + * subscriptions. + * @return NSArray of FEvent events to support synchronous data sources + */ +- (NSArray *)setupListenerOnQuery:(FQuerySpec *)query view:(FView *)view { + FPath *path = query.path; + NSNumber *tagId = [self tagForQuery:query]; + FListenContainer *listenContainer = [self createListenerForView:view]; + + NSArray *events = self.listenProvider.startListening( + [self queryForListening:query], tagId, listenContainer, + listenContainer.onComplete); + + FImmutableTree *subtree = [self.syncPointTree subtreeAtPath:path]; + // The root of this subtree has our query. We're here because we definitely + // need to send a listen for that, but we may need to shadow other listens + // as well. + if (tagId != nil) { + NSAssert(![subtree.value hasCompleteView], + @"If we're adding a query, it shouldn't be shadowed"); + } else { + // Shadow everything at or below this location, this is a default + // listener. + NSArray *queriesToStop = + [subtree foldWithBlock:^id(FPath *relativePath, + FSyncPoint *maybeChildSyncPoint, + NSDictionary *childMap) { + if (![relativePath isEmpty] && maybeChildSyncPoint != nil && + [maybeChildSyncPoint hasCompleteView]) { + return @[ [maybeChildSyncPoint completeView].query ]; + } else { + // No default listener here, flatten any deeper queries into + // an array + NSMutableArray *queries = [[NSMutableArray alloc] init]; + if (maybeChildSyncPoint != nil) { + for (FView *view in [maybeChildSyncPoint queryViews]) { + [queries addObject:view.query]; + } + } + [childMap + enumerateKeysAndObjectsUsingBlock:^( + NSString *key, NSArray *childQueries, BOOL *stop) { + [queries addObjectsFromArray:childQueries]; + }]; + return queries; + } + }]; + for (FQuerySpec *queryToStop in queriesToStop) { + self.listenProvider.stopListening( + [self queryForListening:queryToStop], + [self tagForQuery:queryToStop]); + } + } + return events; +} + +- (FListenContainer *)createListenerForView:(FView *)view { + FQuerySpec *query = view.query; + NSNumber *tagId = [self tagForQuery:query]; + + FListenContainer *listenContainer = [[FListenContainer alloc] + initWithView:view + onComplete:^(NSString *status) { + if ([status isEqualToString:@"ok"]) { + if (tagId != nil) { + return [self applyTaggedListenCompleteAtPath:query.path + tagId:tagId]; + } else { + return [self applyListenCompleteAtPath:query.path]; + } + } else { + // If a listen failed, kill all of the listeners here, not just + // the one that triggered the error. Note that this may need to + // be scoped to just this listener if we change permissions on + // filtered children + NSError *error = [FUtilities errorForStatus:status + andReason:nil]; + FFWarn(@"I-RDB038012", @"Listener at %@ failed: %@", query.path, + status); + return [self removeEventRegistration:nil + forQuery:query + cancelError:error]; + } + }]; + + return listenContainer; +} + +/** + * @return The query associated with the given tag, if we have one + */ +- (FQuerySpec *)queryForTag:(NSNumber *)tagId { + return self.tagToQueryMap[tagId]; +} + +/** + * @return The tag associated with the given query + */ +- (NSNumber *)tagForQuery:(FQuerySpec *)query { + return self.queryToTagMap[query]; +} + +#pragma mark - +#pragma mark applyOperation Helpers + +/** +* A helper method that visits all descendant and ancestor SyncPoints, applying +the operation. +* +* NOTES: +* - Descendant SyncPoints will be visited first (since we raise events +depth-first). + +* - We call applyOperation: on each SyncPoint passing three things: +* 1. A version of the Operation that has been made relative to the SyncPoint +location. +* 2. A WriteTreeRef of any writes we have cached at the SyncPoint location. +* 3. A snapshot Node with cached server data, if we have it. + +* - We concatenate all of the events returned by each SyncPoint and return the +result. +* +* @return Array of FEvent +*/ +- (NSArray *)applyOperationToSyncPoints:(id)operation { + return [self applyOperationHelper:operation + syncPointTree:self.syncPointTree + serverCache:nil + writesCache:[self.pendingWriteTree + childWritesForPath:[FPath empty]]]; +} + +/** + * Recursive helper for applyOperationToSyncPoints_ + */ +- (NSArray *)applyOperationHelper:(id)operation + syncPointTree:(FImmutableTree *)syncPointTree + serverCache:(id)serverCache + writesCache:(FWriteTreeRef *)writesCache { + if ([operation.path isEmpty]) { + return [self applyOperationDescendantsHelper:operation + syncPointTree:syncPointTree + serverCache:serverCache + writesCache:writesCache]; + } else { + FSyncPoint *syncPoint = syncPointTree.value; + + // If we don't have cached server data, see if we can get it from this + // SyncPoint + if (serverCache == nil && syncPoint != nil) { + serverCache = [syncPoint completeServerCacheAtPath:[FPath empty]]; + } + + NSMutableArray *events = [[NSMutableArray alloc] init]; + NSString *childKey = [operation.path getFront]; + id childOperation = [operation operationForChild:childKey]; + FImmutableTree *childTree = [syncPointTree.children get:childKey]; + if (childTree != nil && childOperation != nil) { + id childServerCache = + serverCache ? [serverCache getImmediateChild:childKey] : nil; + FWriteTreeRef *childWritesCache = + [writesCache childWriteTreeRef:childKey]; + [events + addObjectsFromArray:[self + applyOperationHelper:childOperation + syncPointTree:childTree + serverCache:childServerCache + writesCache:childWritesCache]]; + } + + if (syncPoint) { + [events addObjectsFromArray:[syncPoint applyOperation:operation + writesCache:writesCache + serverCache:serverCache]]; + } + + return events; + } +} + +/** + * Recursive helper for applyOperationToSyncPoints: + */ +- (NSArray *)applyOperationDescendantsHelper:(id)operation + syncPointTree:(FImmutableTree *)syncPointTree + serverCache:(id)serverCache + writesCache:(FWriteTreeRef *)writesCache { + FSyncPoint *syncPoint = syncPointTree.value; + + // If we don't have cached server data, see if we can get it from this + // SyncPoint + id resolvedServerCache; + if (serverCache == nil & syncPoint != nil) { + resolvedServerCache = + [syncPoint completeServerCacheAtPath:[FPath empty]]; + } else { + resolvedServerCache = serverCache; + } + + NSMutableArray *events = [[NSMutableArray alloc] init]; + [syncPointTree.children enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FImmutableTree *childTree, + BOOL *stop) { + id childServerCache = nil; + if (resolvedServerCache != nil) { + childServerCache = [resolvedServerCache getImmediateChild:childKey]; + } + FWriteTreeRef *childWritesCache = + [writesCache childWriteTreeRef:childKey]; + id childOperation = [operation operationForChild:childKey]; + if (childOperation != nil) { + [events addObjectsFromArray: + [self applyOperationDescendantsHelper:childOperation + syncPointTree:childTree + serverCache:childServerCache + writesCache:childWritesCache]]; + } + }]; + + if (syncPoint) { + [events + addObjectsFromArray:[syncPoint applyOperation:operation + writesCache:writesCache + serverCache:resolvedServerCache]]; + } + + return events; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteRecord.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteRecord.h new file mode 100644 index 00000000..435fb6a1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteRecord.h @@ -0,0 +1,45 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FPath; +@class FCompoundWrite; +@protocol FNode; + +@interface FWriteRecord : NSObject + +- initWithPath:(FPath *)path + overwrite:(id)overwrite + writeId:(NSInteger)writeId + visible:(BOOL)isVisible; +- initWithPath:(FPath *)path + merge:(FCompoundWrite *)merge + writeId:(NSInteger)writeId; + +@property(nonatomic, readonly) NSInteger writeId; +@property(nonatomic, strong, readonly) FPath *path; +@property(nonatomic, strong, readonly) id overwrite; +/** + * Maps NSString -> id + */ +@property(nonatomic, strong, readonly) FCompoundWrite *merge; +@property(nonatomic, readonly) BOOL visible; + +- (BOOL)isMerge; +- (BOOL)isOverwrite; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteRecord.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteRecord.m new file mode 100644 index 00000000..be1816e1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteRecord.m @@ -0,0 +1,139 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FWriteRecord.h" +#import "FCompoundWrite.h" +#import "FNode.h" +#import "FPath.h" + +@interface FWriteRecord () +@property(nonatomic, readwrite) NSInteger writeId; +@property(nonatomic, strong, readwrite) FPath *path; +@property(nonatomic, strong, readwrite) id overwrite; +@property(nonatomic, strong, readwrite) FCompoundWrite *merge; +@property(nonatomic, readwrite) BOOL visible; +@end + +@implementation FWriteRecord + +- (id)initWithPath:(FPath *)path + overwrite:(id)overwrite + writeId:(NSInteger)writeId + visible:(BOOL)isVisible { + self = [super init]; + if (self) { + self.path = path; + if (overwrite == nil) { + [NSException raise:NSInvalidArgumentException + format:@"Can't pass nil as overwrite parameter to an " + @"overwrite write record"]; + } + self.overwrite = overwrite; + self.merge = nil; + self.writeId = writeId; + self.visible = isVisible; + } + return self; +} + +- (id)initWithPath:(FPath *)path + merge:(FCompoundWrite *)merge + writeId:(NSInteger)writeId { + self = [super init]; + if (self) { + self.path = path; + if (merge == nil) { + [NSException raise:NSInvalidArgumentException + format:@"Can't pass nil as merge parameter to an merge " + @"write record"]; + } + self.overwrite = nil; + self.merge = merge; + self.writeId = writeId; + self.visible = YES; + } + return self; +} + +- (id)overwrite { + if (self->_overwrite == nil) { + [NSException raise:NSInvalidArgumentException + format:@"Can't get overwrite for merge write record!"]; + } + return self->_overwrite; +} + +- (FCompoundWrite *)compoundWrite { + if (self->_merge == nil) { + [NSException raise:NSInvalidArgumentException + format:@"Can't get merge for overwrite write record!"]; + } + return self->_merge; +} + +- (BOOL)isMerge { + return self->_merge != nil; +} + +- (BOOL)isOverwrite { + return self->_overwrite != nil; +} + +- (NSString *)description { + if (self.isOverwrite) { + return + [NSString stringWithFormat:@"FWriteRecord { writeId = %lu, path = " + @"%@, overwrite = %@, visible = %d }", + (unsigned long)self.writeId, self.path, + self.overwrite, self.visible]; + } else { + return [NSString + stringWithFormat: + @"FWriteRecord { writeId = %lu, path = %@, merge = %@ }", + (unsigned long)self.writeId, self.path, self.merge]; + } +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[self class]]) { + return NO; + } + FWriteRecord *other = (FWriteRecord *)object; + if (self->_writeId != other->_writeId) + return NO; + if (self->_path != other->_path && ![self->_path isEqual:other->_path]) + return NO; + if (self->_overwrite != other->_overwrite && + ![self->_overwrite isEqual:other->_overwrite]) + return NO; + if (self->_merge != other->_merge && ![self->_merge isEqual:other->_merge]) + return NO; + if (self->_visible != other->_visible) + return NO; + + return YES; +} + +- (NSUInteger)hash { + NSUInteger hash = self->_writeId * 17; + hash = hash * 31 + self->_path.hash; + hash = hash * 31 + self->_overwrite.hash; + hash = hash * 31 + self->_merge.hash; + hash = hash * 31 + ((self->_visible) ? 1 : 0); + return hash; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTree.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTree.h new file mode 100644 index 00000000..178946b2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTree.h @@ -0,0 +1,70 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FPath; +@protocol FNode; +@class FCompoundWrite; +@class FWriteTreeRef; +@class FChildrenNode; +@class FNamedNode; +@class FWriteRecord; +@protocol FIndex; +@class FCacheNode; + +@interface FWriteTree : NSObject + +- (FWriteTreeRef *)childWritesForPath:(FPath *)path; +- (void)addOverwriteAtPath:(FPath *)path + newData:(id)newData + writeId:(NSInteger)writeId + isVisible:(BOOL)visible; +- (void)addMergeAtPath:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren + writeId:(NSInteger)writeId; +- (BOOL)removeWriteId:(NSInteger)writeId; +- (NSArray *)removeAllWrites; +- (FWriteRecord *)writeForId:(NSInteger)writeId; + +- (id)calculateCompleteEventCacheAtPath:(FPath *)treePath + completeServerCache:(id)completeServerCache + excludeWriteIds:(NSArray *)writeIdsToExclude + includeHiddenWrites:(BOOL)includeHiddenWrites; + +- (id)calculateCompleteEventChildrenAtPath:(FPath *)treePath + completeServerChildren: + (id)completeServerChildren; + +- (id) + calculateEventCacheAfterServerOverwriteAtPath:(FPath *)treePath + childPath:(FPath *)childPath + existingEventSnap:(id)existingEventSnap + existingServerSnap:(id)existingServerSnap; + +- (id)calculateCompleteChildAtPath:(FPath *)treePath + childKey:(NSString *)childKey + cache:(FCacheNode *)existingServerCache; + +- (id)shadowingWriteAtPath:(FPath *)path; + +- (FNamedNode *)calculateNextNodeAfterPost:(FNamedNode *)post + atPath:(FPath *)path + completeServerData:(id)completeServerData + reverse:(BOOL)reverse + index:(id)index; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTree.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTree.m new file mode 100644 index 00000000..d8592c04 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTree.m @@ -0,0 +1,577 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FWriteTree.h" +#import "FCacheNode.h" +#import "FChildrenNode.h" +#import "FCompoundWrite.h" +#import "FEmptyNode.h" +#import "FImmutableTree.h" +#import "FIndex.h" +#import "FNamedNode.h" +#import "FNode.h" +#import "FPath.h" +#import "FWriteRecord.h" +#import "FWriteTreeRef.h" + +@interface FWriteTree () +/** + * A tree tracking the results of applying all visible writes. This does not + * include transactions with applyLocally=false or writes that are completely + * shadowed by other writes. Contains id as values. + */ +@property(nonatomic, strong) FCompoundWrite *visibleWrites; +/** + * A list of pending writes, regardless of visibility and shadowed-ness. Used to + * calcuate arbitrary sets of the changed data, such as hidden writes (from + * transactions) or changes with certain writes excluded (also used by + * transactions). Contains FWriteRecords. + */ +@property(nonatomic, strong) NSMutableArray *allWrites; +@property(nonatomic) NSInteger lastWriteId; +@end + +/** + * FWriteTree tracks all pending user-initiated writes and has methods to + * calcuate the result of merging them with underlying server data (to create + * "event cache" data). Pending writes are added with addOverwriteAtPath: and + * addMergeAtPath: and removed with removeWriteId:. + */ +@implementation FWriteTree + +@synthesize allWrites; +@synthesize lastWriteId; + +- (id)init { + self = [super init]; + if (self) { + self.visibleWrites = [FCompoundWrite emptyWrite]; + self.allWrites = [[NSMutableArray alloc] init]; + self.lastWriteId = -1; + } + return self; +} + +/** + * Create a new WriteTreeRef for the given path. For use with a new sync point + * at the given path. + */ +- (FWriteTreeRef *)childWritesForPath:(FPath *)path { + return [[FWriteTreeRef alloc] initWithPath:path writeTree:self]; +} + +/** + * Record a new overwrite from user code. + * @param visible Is set to false by some transactions. It should be excluded + * from event caches. + */ +- (void)addOverwriteAtPath:(FPath *)path + newData:(id)newData + writeId:(NSInteger)writeId + isVisible:(BOOL)visible { + NSAssert(writeId > self.lastWriteId, + @"Stacking an older write on top of a newer one"); + FWriteRecord *record = [[FWriteRecord alloc] initWithPath:path + overwrite:newData + writeId:writeId + visible:visible]; + [self.allWrites addObject:record]; + + if (visible) { + self.visibleWrites = [self.visibleWrites addWrite:newData atPath:path]; + } + + self.lastWriteId = writeId; +} + +/** + * Record a new merge from user code. + * @param changedChildren maps NSString -> id + */ +- (void)addMergeAtPath:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren + writeId:(NSInteger)writeId { + NSAssert(writeId > self.lastWriteId, + @"Stacking an older merge on top of newer one"); + FWriteRecord *record = [[FWriteRecord alloc] initWithPath:path + merge:changedChildren + writeId:writeId]; + [self.allWrites addObject:record]; + + self.visibleWrites = [self.visibleWrites addCompoundWrite:changedChildren + atPath:path]; + self.lastWriteId = writeId; +} + +- (FWriteRecord *)writeForId:(NSInteger)writeId { + NSUInteger index = [self.allWrites + indexOfObjectPassingTest:^BOOL(FWriteRecord *write, NSUInteger idx, + BOOL *stop) { + return write.writeId == writeId; + }]; + return (index == NSNotFound) ? nil : self.allWrites[index]; +} + +/** + * Remove a write (either an overwrite or merge) that has been successfully + * acknowledged by the server. Recalculates the tree if necessary. We return the + * path of the write and whether it may have been visible, meaning views need to + * reevaluate. + * + * @return YES if the write may have been visible (meaning we'll need to + * reevaluate / raise events as a result). + */ +- (BOOL)removeWriteId:(NSInteger)writeId { + NSUInteger index = [self.allWrites + indexOfObjectPassingTest:^BOOL(FWriteRecord *record, NSUInteger idx, + BOOL *stop) { + if (record.writeId == writeId) { + return YES; + } else { + return NO; + } + }]; + NSAssert(index != NSNotFound, + @"[FWriteTree removeWriteId:] called with nonexistent writeId."); + FWriteRecord *writeToRemove = self.allWrites[index]; + [self.allWrites removeObjectAtIndex:index]; + + BOOL removedWriteWasVisible = writeToRemove.visible; + BOOL removedWriteOverlapsWithOtherWrites = NO; + NSInteger i = [self.allWrites count] - 1; + + while (removedWriteWasVisible && i >= 0) { + FWriteRecord *currentWrite = [self.allWrites objectAtIndex:i]; + if (currentWrite.visible) { + if (i >= index && [self record:currentWrite + containsPath:writeToRemove.path]) { + // The removed write was completely shadowed by a subsequent + // write. + removedWriteWasVisible = NO; + } else if ([writeToRemove.path contains:currentWrite.path]) { + // Either we're covering some writes or they're covering part of + // us (depending on which came first). + removedWriteOverlapsWithOtherWrites = YES; + } + } + i--; + } + + if (!removedWriteWasVisible) { + return NO; + } else if (removedWriteOverlapsWithOtherWrites) { + // There's some shadowing going on. Just rebuild the visible writes from + // scratch. + [self resetTree]; + return YES; + } else { + // There's no shadowing. We can safely just remove the write(s) from + // visibleWrites. + if ([writeToRemove isOverwrite]) { + self.visibleWrites = + [self.visibleWrites removeWriteAtPath:writeToRemove.path]; + } else { + FCompoundWrite *merge = writeToRemove.merge; + [merge enumerateWrites:^(FPath *path, id node, BOOL *stop) { + self.visibleWrites = [self.visibleWrites + removeWriteAtPath:[writeToRemove.path child:path]]; + }]; + } + return YES; + } +} + +- (NSArray *)removeAllWrites { + NSArray *writes = self.allWrites; + self.visibleWrites = [FCompoundWrite emptyWrite]; + self.allWrites = [NSMutableArray array]; + return writes; +} + +/** + * @return A complete snapshot for the given path if there's visible write data + * at that path, else nil. No server data is considered. + */ +- (id)completeWriteDataAtPath:(FPath *)path { + return [self.visibleWrites completeNodeAtPath:path]; +} + +/** + * Given optional, underlying server data, and an optional set of constraints + * (exclude some sets, include hidden writes), attempt to calculate a complete + * snapshot for the given path + * @param includeHiddenWrites Defaults to false, whether or not to layer on + * writes with visible set to false + */ +- (id)calculateCompleteEventCacheAtPath:(FPath *)treePath + completeServerCache:(id)completeServerCache + excludeWriteIds:(NSArray *)writeIdsToExclude + includeHiddenWrites:(BOOL)includeHiddenWrites { + if (writeIdsToExclude == nil && !includeHiddenWrites) { + id shadowingNode = + [self.visibleWrites completeNodeAtPath:treePath]; + if (shadowingNode != nil) { + return shadowingNode; + } else { + // No cache here. Can't claim complete knowledge. + FCompoundWrite *subMerge = + [self.visibleWrites childCompoundWriteAtPath:treePath]; + if (subMerge.isEmpty) { + return completeServerCache; + } else if (completeServerCache == nil && + ![subMerge hasCompleteWriteAtPath:[FPath empty]]) { + // We wouldn't have a complete snapshot since there's no + // underlying data and no complete shadow + return nil; + } else { + id layeredCache = completeServerCache != nil + ? completeServerCache + : [FEmptyNode emptyNode]; + return [subMerge applyToNode:layeredCache]; + } + } + } else { + FCompoundWrite *merge = + [self.visibleWrites childCompoundWriteAtPath:treePath]; + if (!includeHiddenWrites && merge.isEmpty) { + return completeServerCache; + } else { + // If the server cache is null and we don't have a complete cache, + // we need to return nil + if (!includeHiddenWrites && completeServerCache == nil && + ![merge hasCompleteWriteAtPath:[FPath empty]]) { + return nil; + } else { + BOOL (^filter)(FWriteRecord *) = ^(FWriteRecord *record) { + return (BOOL)( + (record.visible || includeHiddenWrites) && + (writeIdsToExclude == nil || + ![writeIdsToExclude + containsObject: + [NSNumber numberWithInteger:record.writeId]]) && + ([record.path contains:treePath] || + [treePath contains:record.path])); + }; + FCompoundWrite *mergeAtPath = + [FWriteTree layerTreeFromWrites:self.allWrites + filter:filter + treeRoot:treePath]; + id layeredCache = completeServerCache + ? completeServerCache + : [FEmptyNode emptyNode]; + return [mergeAtPath applyToNode:layeredCache]; + } + } + } +} + +/** + * With optional, underlying server data, attempt to return a children node of + * children that we have complete data for. Used when creating new views, to + * pre-fill their complete event children snapshot. + */ +- (FChildrenNode *)calculateCompleteEventChildrenAtPath:(FPath *)treePath + completeServerChildren: + (id)completeServerChildren { + __block id completeChildren = [FEmptyNode emptyNode]; + id topLevelSet = [self.visibleWrites completeNodeAtPath:treePath]; + if (topLevelSet != nil) { + if (![topLevelSet isLeafNode]) { + // We're shadowing everything. Return the children. + FChildrenNode *topChildrenNode = topLevelSet; + [topChildrenNode enumerateChildrenUsingBlock:^( + NSString *key, id node, BOOL *stop) { + completeChildren = [completeChildren updateImmediateChild:key + withNewChild:node]; + }]; + } + return completeChildren; + } else { + // Layer any children we have on top of this + // We know we don't have a top-level set, so just enumerate existing + // children, and apply any updates + FCompoundWrite *merge = + [self.visibleWrites childCompoundWriteAtPath:treePath]; + [completeServerChildren enumerateChildrenUsingBlock:^( + NSString *key, id node, BOOL *stop) { + FCompoundWrite *childMerge = + [merge childCompoundWriteAtPath:[[FPath alloc] initWith:key]]; + id newChildNode = [childMerge applyToNode:node]; + completeChildren = + [completeChildren updateImmediateChild:key + withNewChild:newChildNode]; + }]; + // Add any complete children we have from the set. + for (FNamedNode *node in merge.completeChildren) { + completeChildren = + [completeChildren updateImmediateChild:node.name + withNewChild:node.node]; + } + return completeChildren; + } +} + +/** + * Given that the underlying server data has updated, determine what, if + * anything, needs to be applied to the event cache. + * + * Possibilities + * + * 1. No write are shadowing. Events should be raised, the snap to be applied + * comes from the server data. + * + * 2. Some write is completely shadowing. No events to be raised. + * + * 3. Is partially shadowed. Events .. + * + * Either existingEventSnap or existingServerSnap must exist. + */ +- (id)calculateEventCacheAfterServerOverwriteAtPath:(FPath *)treePath + childPath:(FPath *)childPath + existingEventSnap: + (id)existingEventSnap + existingServerSnap: + (id)existingServerSnap { + NSAssert(existingEventSnap != nil || existingServerSnap != nil, + @"Either existingEventSnap or existingServerSanp must exist."); + + FPath *path = [treePath child:childPath]; + if ([self.visibleWrites hasCompleteWriteAtPath:path]) { + // At this point we can probably guarantee that we're in case 2, meaning + // no events May need to check visibility while doing the + // findRootMostValueAndPath call + return nil; + } else { + // This could be more efficient if the serverNode + updates doesn't + // change the eventSnap However this is tricky to find out, since user + // updates don't necessary change the server snap, e.g. priority updates + // on empty nodes, or deep deletes. Another special case is if the + // server adds nodes, but doesn't change any existing writes. It is + // therefore not enough to only check if the updates change the + // serverNode. Maybe check if the merge tree contains these special + // cases and only do a full overwrite in that case? + FCompoundWrite *childMerge = + [self.visibleWrites childCompoundWriteAtPath:path]; + if (childMerge.isEmpty) { + // We're not shadowing at all. Case 1 + return [existingServerSnap getChild:childPath]; + } else { + return [childMerge + applyToNode:[existingServerSnap getChild:childPath]]; + } + } +} + +/** + * Returns a complete child for a given server snap after applying all user + * writes or nil if there is no complete child for this child key. + */ +- (id)calculateCompleteChildAtPath:(FPath *)treePath + childKey:(NSString *)childKey + cache:(FCacheNode *)existingServerCache { + FPath *path = [treePath childFromString:childKey]; + id shadowingNode = [self.visibleWrites completeNodeAtPath:path]; + if (shadowingNode != nil) { + return shadowingNode; + } else { + if ([existingServerCache isCompleteForChild:childKey]) { + FCompoundWrite *childMerge = + [self.visibleWrites childCompoundWriteAtPath:path]; + return [childMerge applyToNode:[existingServerCache.node + getImmediateChild:childKey]]; + } else { + return nil; + } + } +} + +/** + * Returns a node if there is a complete overwrite for this path. More + * specifically, if there is a write at a higher path, this will return the + * child of that write relative to the write and this path. Returns null if + * there is no write at this path. + */ +- (id)shadowingWriteAtPath:(FPath *)path { + return [self.visibleWrites completeNodeAtPath:path]; +} + +/** + * This method is used when processing child remove events on a query. If we + * can, we pull in children that were outside the window, but may now be in the + * window. + */ +- (FNamedNode *)calculateNextNodeAfterPost:(FNamedNode *)post + atPath:(FPath *)treePath + completeServerData:(id)completeServerData + reverse:(BOOL)reverse + index:(id)index { + __block id toIterate; + FCompoundWrite *merge = + [self.visibleWrites childCompoundWriteAtPath:treePath]; + id shadowingNode = [merge completeNodeAtPath:[FPath empty]]; + if (shadowingNode != nil) { + toIterate = shadowingNode; + } else if (completeServerData != nil) { + toIterate = [merge applyToNode:completeServerData]; + } else { + return nil; + } + + __block NSString *currentNextKey = nil; + __block id currentNextNode = nil; + [toIterate enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + if ([index compareKey:key + andNode:node + toOtherKey:post.name + andNode:post.node + reverse:reverse] > NSOrderedSame && + (!currentNextKey || [index compareKey:key + andNode:node + toOtherKey:currentNextKey + andNode:currentNextNode + reverse:reverse] < NSOrderedSame)) { + currentNextKey = key; + currentNextNode = node; + } + }]; + + if (currentNextKey != nil) { + return [FNamedNode nodeWithName:currentNextKey node:currentNextNode]; + } else { + return nil; + } +} + +#pragma mark - +#pragma mark Private Methods + +- (BOOL)record:(FWriteRecord *)record containsPath:(FPath *)path { + if ([record isOverwrite]) { + return [record.path contains:path]; + } else { + __block BOOL contains = NO; + [record.merge + enumerateWrites:^(FPath *childPath, id node, BOOL *stop) { + contains = [[record.path child:childPath] contains:path]; + *stop = contains; + }]; + return contains; + } +} + +/** + * Re-layer the writes and merges into a tree so we can efficiently calculate + * event snapshots + */ +- (void)resetTree { + self.visibleWrites = + [FWriteTree layerTreeFromWrites:self.allWrites + filter:[FWriteTree defaultFilter] + treeRoot:[FPath empty]]; + if ([self.allWrites count] > 0) { + FWriteRecord *lastRecord = self.allWrites[[self.allWrites count] - 1]; + self.lastWriteId = lastRecord.writeId; + } else { + self.lastWriteId = -1; + } +} + +/** + * The default filter used when constructing the tree. Keep everything that's + * visible. + */ ++ (BOOL (^)(FWriteRecord *record))defaultFilter { + static BOOL (^filter)(FWriteRecord *); + static dispatch_once_t filterToken; + dispatch_once(&filterToken, ^{ + filter = ^(FWriteRecord *record) { + return YES; + }; + }); + return filter; +} + +/** + * Static method. Given an array of WriteRecords, a filter for which ones to + * include, and a path, construct a merge at that path + * @return An FImmutableTree of ids. + */ ++ (FCompoundWrite *)layerTreeFromWrites:(NSArray *)writes + filter:(BOOL (^)(FWriteRecord *record))filter + treeRoot:(FPath *)treeRoot { + __block FCompoundWrite *compoundWrite = [FCompoundWrite emptyWrite]; + [writes enumerateObjectsUsingBlock:^(FWriteRecord *record, NSUInteger idx, + BOOL *stop) { + // Theory, a later set will either: + // a) abort a relevant transaction, so no need to worry about excluding it + // from calculating that transaction b) not be relevant to a transaction + // (separate branch), so again will not affect the data for that + // transaction + if (filter(record)) { + FPath *writePath = record.path; + if ([record isOverwrite]) { + if ([treeRoot contains:writePath]) { + FPath *relativePath = [FPath relativePathFrom:treeRoot + to:writePath]; + compoundWrite = [compoundWrite addWrite:record.overwrite + atPath:relativePath]; + } else if ([writePath contains:treeRoot]) { + id child = [record.overwrite + getChild:[FPath relativePathFrom:writePath to:treeRoot]]; + compoundWrite = [compoundWrite addWrite:child + atPath:[FPath empty]]; + } else { + // There is no overlap between root path and write path, + // ignore write + } + } else { + if ([treeRoot contains:writePath]) { + FPath *relativePath = [FPath relativePathFrom:treeRoot + to:writePath]; + compoundWrite = [compoundWrite addCompoundWrite:record.merge + atPath:relativePath]; + } else if ([writePath contains:treeRoot]) { + FPath *relativePath = [FPath relativePathFrom:writePath + to:treeRoot]; + if (relativePath.isEmpty) { + compoundWrite = + [compoundWrite addCompoundWrite:record.merge + atPath:[FPath empty]]; + } else { + id child = + [record.merge completeNodeAtPath:relativePath]; + if (child != nil) { + // There exists a child in this node that matches the + // root path + id deepNode = + [child getChild:[relativePath popFront]]; + compoundWrite = + [compoundWrite addWrite:deepNode + atPath:[FPath empty]]; + } + } + } else { + // There is no overlap between root path and write path, + // ignore write + } + } + } + }]; + return compoundWrite; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTreeRef.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTreeRef.h new file mode 100644 index 00000000..962ad5c0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTreeRef.h @@ -0,0 +1,57 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FNode; +@class FChildrenNode; +@class FPath; +@class FNamedNode; +@class FWriteRecord; +@class FWriteTree; +@protocol FIndex; +@class FCacheNode; + +@interface FWriteTreeRef : NSObject + +- (id)initWithPath:(FPath *)aPath writeTree:(FWriteTree *)tree; + +- (id)calculateCompleteEventCacheWithCompleteServerCache: + (id)completeServerCache; + +- (FChildrenNode *)calculateCompleteEventChildrenWithCompleteServerChildren: + (FChildrenNode *)completeServerChildren; + +- (id) + calculateEventCacheAfterServerOverwriteWithChildPath:(FPath *)childPath + existingEventSnap: + (id)existingEventSnap + existingServerSnap: + (id)existingServerSnap; + +- (id)shadowingWriteAtPath:(FPath *)path; + +- (FNamedNode *)calculateNextNodeAfterPost:(FNamedNode *)post + completeServerData:(id)completeServerData + reverse:(BOOL)reverse + index:(id)index; + +- (id)calculateCompleteChild:(NSString *)childKey + cache:(FCacheNode *)existingServerCache; + +- (FWriteTreeRef *)childWriteTreeRef:(NSString *)childKey; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTreeRef.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTreeRef.m new file mode 100644 index 00000000..809d1a98 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/FWriteTreeRef.m @@ -0,0 +1,159 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FWriteTreeRef.h" +#import "FCacheNode.h" +#import "FChildrenNode.h" +#import "FIndex.h" +#import "FNamedNode.h" +#import "FNode.h" +#import "FPath.h" +#import "FWriteRecord.h" +#import "FWriteTree.h" + +@interface FWriteTreeRef () +/** + * The path to this particular FWriteTreeRef. Used for calling methods on + * writeTree while exposing a simpler interface to callers. + */ +@property(nonatomic, strong) FPath *path; +/** + * A reference to the actual tree of the write data. All methods are + * pass-through to the tree, but with the appropriate path prefixed. + * + * This lets us make cheap references to points in the tree for sync points + * without having to copy and maintain all of the data. + */ +@property(nonatomic, strong) FWriteTree *writeTree; +@end + +/** + * A FWriteTreeRef wraps a FWriteTree and a FPath, for convenient access to a + * particular subtree. All the methods just proxy to the underlying FWriteTree. + */ +@implementation FWriteTreeRef +- (id)initWithPath:(FPath *)aPath writeTree:(FWriteTree *)tree { + self = [super init]; + if (self) { + self.path = aPath; + self.writeTree = tree; + } + return self; +} + +/** + * @return If possible, returns a complete event cache, using the underlying + * server data if possible. In addition, can be used to get a cache that + * includes hidden writes, and excludes arbitrary writes. Note that customizing + * the returned node can lead to a more expensive calculation. + */ +- (id)calculateCompleteEventCacheWithCompleteServerCache: + (id)completeServerCache { + return [self.writeTree calculateCompleteEventCacheAtPath:self.path + completeServerCache:completeServerCache + excludeWriteIds:nil + includeHiddenWrites:NO]; +} + +/** + * @return If possible, returns a children node containing all of the complete + * children we have data for. The returned data is a mix of the given server + * data and write data. + */ +- (FChildrenNode *)calculateCompleteEventChildrenWithCompleteServerChildren: + (id)completeServerChildren { + return [self.writeTree + calculateCompleteEventChildrenAtPath:self.path + completeServerChildren:completeServerChildren]; +} + +/** + * Given that either the underlying server data has updated or the outstanding + * writes have been updating, determine what, if anything, needs to be applied + * to the event cache. + * + * Possibilities: + * + * 1. No writes are shadowing. Events should be raised, the snap to be applied + * comes from the server data. + * + * 2. Some writes are completly shadowing. No events to be raised. + * + * 3. Is partially shadowed. Events should be raised. + * + * Either existingEventSnap or existingServerSnap must exist, this is validated + * via an assert. + */ +- (id) + calculateEventCacheAfterServerOverwriteWithChildPath:(FPath *)childPath + existingEventSnap: + (id)existingEventSnap + existingServerSnap: + (id)existingServerSnap { + return [self.writeTree + calculateEventCacheAfterServerOverwriteAtPath:self.path + childPath:childPath + existingEventSnap:existingEventSnap + existingServerSnap:existingServerSnap]; +} + +/** + * Returns a node if there is a complete overwrite for this path. More + * specifically, if there is a write at a higher path, this will return the + * child of that write relative to the write and this path. Returns nil if there + * is no write at this path. + */ +- (id)shadowingWriteAtPath:(FPath *)path { + return [self.writeTree shadowingWriteAtPath:[self.path child:path]]; +} + +/** + * This method is used when processing child remove events on a query. If we + * can, we pull in children that are outside the window, but may now be in the + * window. + */ +- (FNamedNode *)calculateNextNodeAfterPost:(FNamedNode *)post + completeServerData:(id)completeServerData + reverse:(BOOL)reverse + index:(id)index { + return [self.writeTree calculateNextNodeAfterPost:post + atPath:self.path + completeServerData:completeServerData + reverse:reverse + index:index]; +} + +/** + * Returns a complete child for a given server snap after applying all user + * writes or nil if there is no complete child for this child key. + */ +- (id)calculateCompleteChild:(NSString *)childKey + cache:(FCacheNode *)existingServerCache { + return [self.writeTree calculateCompleteChildAtPath:self.path + childKey:childKey + cache:existingServerCache]; +} + +/** + * @return a WriteTreeref for a child. + */ +- (FWriteTreeRef *)childWriteTreeRef:(NSString *)childKey { + return + [[FWriteTreeRef alloc] initWithPath:[self.path childFromString:childKey] + writeTree:self.writeTree]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FAckUserWrite.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FAckUserWrite.h new file mode 100644 index 00000000..97a23bfc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FAckUserWrite.h @@ -0,0 +1,37 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FOperation.h" + +@class FPath; +@class FOperationSource; +@class FImmutableTree; + +@interface FAckUserWrite : NSObject + +- initWithPath:(FPath *)operationPath + affectedTree:(FImmutableTree *)affectedTree + revert:(BOOL)shouldRevert; + +@property(nonatomic, strong, readonly) FOperationSource *source; +@property(nonatomic, readonly) FOperationType type; +@property(nonatomic, strong, readonly) FPath *path; +// A FImmutableTree, containing @YES for each affected path. Affected paths +// can't overlap. +@property(nonatomic, strong, readonly) FImmutableTree *affectedTree; +@property(nonatomic, readonly) BOOL revert; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FAckUserWrite.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FAckUserWrite.m new file mode 100644 index 00000000..2a1f2874 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FAckUserWrite.m @@ -0,0 +1,66 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FAckUserWrite.h" +#import "FImmutableTree.h" +#import "FOperationSource.h" +#import "FPath.h" + +@implementation FAckUserWrite + +- (id)initWithPath:(FPath *)operationPath + affectedTree:(FImmutableTree *)tree + revert:(BOOL)shouldRevert { + self = [super init]; + if (self) { + self->_source = [FOperationSource userInstance]; + self->_type = FOperationTypeAckUserWrite; + self->_path = operationPath; + self->_affectedTree = tree; + self->_revert = shouldRevert; + } + return self; +} + +- (FAckUserWrite *)operationForChild:(NSString *)childKey { + if (![self.path isEmpty]) { + NSAssert([self.path.getFront isEqualToString:childKey], + @"operationForChild called for unrelated child."); + return [[FAckUserWrite alloc] initWithPath:[self.path popFront] + affectedTree:self.affectedTree + revert:self.revert]; + } else if (self.affectedTree.value != nil) { + NSAssert(self.affectedTree.children.isEmpty, + @"affectedTree should not have overlapping affected paths."); + // All child locations are affected as well; just return same operation. + return self; + } else { + FImmutableTree *childTree = + [self.affectedTree subtreeAtPath:[[FPath alloc] initWith:childKey]]; + return [[FAckUserWrite alloc] initWithPath:[FPath empty] + affectedTree:childTree + revert:self.revert]; + } +} + +- (NSString *)description { + return + [NSString stringWithFormat: + @"FAckUserWrite { path=%@, revert=%d, affectedTree=%@ }", + self.path, self.revert, self.affectedTree]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FMerge.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FMerge.h new file mode 100644 index 00000000..56fbec9f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FMerge.h @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FOperation.h" + +@class FCompoundWrite; + +@interface FMerge : NSObject + +- (id)initWithSource:(FOperationSource *)aSource + path:(FPath *)aPath + children:(FCompoundWrite *)children; + +@property(nonatomic, strong, readonly) FOperationSource *source; +@property(nonatomic, readonly) FOperationType type; +@property(nonatomic, strong, readonly) FPath *path; +@property(nonatomic, strong, readonly) FCompoundWrite *children; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FMerge.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FMerge.m new file mode 100644 index 00000000..c3447554 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FMerge.m @@ -0,0 +1,85 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FMerge.h" +#import "FCompoundWrite.h" +#import "FNode.h" +#import "FOperationSource.h" +#import "FOverwrite.h" +#import "FPath.h" + +@interface FMerge () +@property(nonatomic, strong, readwrite) FOperationSource *source; +@property(nonatomic, readwrite) FOperationType type; +@property(nonatomic, strong, readwrite) FPath *path; +@property(nonatomic, strong) FCompoundWrite *children; +@end + +@implementation FMerge + +@synthesize source; +@synthesize type; +@synthesize path; +@synthesize children; + +- (id)initWithSource:(FOperationSource *)aSource + path:(FPath *)aPath + children:(FCompoundWrite *)someChildren { + self = [super init]; + if (self) { + self.source = aSource; + self.type = FOperationTypeMerge; + self.path = aPath; + self.children = someChildren; + } + return self; +} + +- (id)operationForChild:(NSString *)childKey { + if ([self.path isEmpty]) { + FCompoundWrite *childTree = [self.children + childCompoundWriteAtPath:[[FPath alloc] initWith:childKey]]; + if (childTree.isEmpty) { + return nil; + } else if (childTree.rootWrite != nil) { + // We have a snapshot for the child in question. This becomes an + // overwrite of the child. + return [[FOverwrite alloc] initWithSource:self.source + path:[FPath empty] + snap:childTree.rootWrite]; + } else { + // This is a merge at a deeper level + return [[FMerge alloc] initWithSource:self.source + path:[FPath empty] + children:childTree]; + } + } else { + NSAssert( + [self.path.getFront isEqualToString:childKey], + @"Can't get a merge for a child not on the path of the operation"); + return [[FMerge alloc] initWithSource:self.source + path:[self.path popFront] + children:self.children]; + } +} + +- (NSString *)description { + return + [NSString stringWithFormat:@"FMerge { path=%@, soruce=%@ children=%@}", + self.path, self.source, self.children]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperation.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperation.h new file mode 100644 index 00000000..41f60549 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperation.h @@ -0,0 +1,34 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FOperationSource; +@class FPath; + +typedef NS_ENUM(NSInteger, FOperationType) { + FOperationTypeOverwrite = 0, + FOperationTypeMerge = 1, + FOperationTypeAckUserWrite = 2, + FOperationTypeListenComplete = 3 +}; + +@protocol FOperation +@property(nonatomic, strong, readonly) FOperationSource *source; +@property(nonatomic, readonly) FOperationType type; +@property(nonatomic, strong, readonly) FPath *path; +- (id)operationForChild:(NSString *)childKey; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperationSource.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperationSource.h new file mode 100644 index 00000000..747487b5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperationSource.h @@ -0,0 +1,37 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FQueryParams; + +@interface FOperationSource : NSObject + +@property(nonatomic, readonly) BOOL fromUser; +@property(nonatomic, readonly) BOOL fromServer; +@property(nonatomic, readonly) BOOL isTagged; +@property(nonatomic, strong, readonly) FQueryParams *queryParams; + +- initWithFromUser:(BOOL)isFromUser + fromServer:(BOOL)isFromServer + queryParams:(FQueryParams *)params + tagged:(BOOL)isTagged; + ++ (FOperationSource *)userInstance; ++ (FOperationSource *)serverInstance; ++ (FOperationSource *)forServerTaggedQuery:(FQueryParams *)params; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperationSource.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperationSource.m new file mode 100644 index 00000000..92e3db8c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOperationSource.m @@ -0,0 +1,86 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FOperationSource.h" +#import "FPath.h" +#import "FQueryParams.h" + +@interface FOperationSource () +@property(nonatomic, readwrite) BOOL fromUser; +@property(nonatomic, readwrite) BOOL fromServer; +@property(nonatomic, readwrite) BOOL isTagged; +@property(nonatomic, strong, readwrite) FQueryParams *queryParams; +@end + +@implementation FOperationSource + +@synthesize fromUser; +@synthesize fromServer; +@synthesize queryParams; + +- (id)initWithFromUser:(BOOL)isFromUser + fromServer:(BOOL)isFromServer + queryParams:(FQueryParams *)params + tagged:(BOOL)tagged { + self = [super init]; + if (self) { + self.fromUser = isFromUser; + self.fromServer = isFromServer; + self.queryParams = params; + self.isTagged = tagged; + } + return self; +} + ++ (FOperationSource *)userInstance { + static FOperationSource *user = nil; + static dispatch_once_t userToken; + dispatch_once(&userToken, ^{ + user = [[FOperationSource alloc] initWithFromUser:YES + fromServer:NO + queryParams:nil + tagged:NO]; + }); + return user; +} + ++ (FOperationSource *)serverInstance { + static FOperationSource *server = nil; + static dispatch_once_t serverToken; + dispatch_once(&serverToken, ^{ + server = [[FOperationSource alloc] initWithFromUser:NO + fromServer:YES + queryParams:nil + tagged:NO]; + }); + return server; +} + ++ (FOperationSource *)forServerTaggedQuery:(FQueryParams *)params { + return [[FOperationSource alloc] initWithFromUser:NO + fromServer:YES + queryParams:params + tagged:YES]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"FOperationSource { fromUser=%d, " + @"fromServer=%d, queryId=%@, tagged=%d }", + self.fromUser, self.fromServer, + self.queryParams, self.isTagged]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOverwrite.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOverwrite.h new file mode 100644 index 00000000..7d738ac4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOverwrite.h @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FOperation.h" + +@protocol FNode; + +@interface FOverwrite : NSObject + +- (id)initWithSource:(FOperationSource *)aSource + path:(FPath *)aPath + snap:(id)aSnap; + +@property(nonatomic, strong, readonly) FOperationSource *source; +@property(nonatomic, readonly) FOperationType type; +@property(nonatomic, strong, readonly) FPath *path; +@property(nonatomic, strong, readonly) id snap; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOverwrite.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOverwrite.m new file mode 100644 index 00000000..ad4daec9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Operation/FOverwrite.m @@ -0,0 +1,67 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FOverwrite.h" +#import "FNode.h" +#import "FOperationSource.h" + +@interface FOverwrite () +@property(nonatomic, strong, readwrite) FOperationSource *source; +@property(nonatomic, readwrite) FOperationType type; +@property(nonatomic, strong, readwrite) FPath *path; +@property(nonatomic, strong) id snap; +@end + +@implementation FOverwrite + +@synthesize source; +@synthesize type; +@synthesize path; +@synthesize snap; + +- (id)initWithSource:(FOperationSource *)aSource + path:(FPath *)aPath + snap:(id)aSnap { + self = [super init]; + if (self) { + self.source = aSource; + self.type = FOperationTypeOverwrite; + self.path = aPath; + self.snap = aSnap; + } + return self; +} + +- (FOverwrite *)operationForChild:(NSString *)childKey { + if ([self.path isEmpty]) { + return [[FOverwrite alloc] + initWithSource:self.source + path:[FPath empty] + snap:[self.snap getImmediateChild:childKey]]; + } else { + return [[FOverwrite alloc] initWithSource:self.source + path:[self.path popFront] + snap:self.snap]; + } +} + +- (NSString *)description { + return [NSString + stringWithFormat:@"FOverwrite { path=%@, source=%@, snapshot=%@ }", + self.path, self.source, self.snap]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FIRRetryHelper.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FIRRetryHelper.h new file mode 100644 index 00000000..a63d0d83 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FIRRetryHelper.h @@ -0,0 +1,33 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FIRRetryHelper : NSObject + +- (instancetype)initWithDispatchQueue:(dispatch_queue_t)dispatchQueue + minRetryDelayAfterFailure:(NSTimeInterval)minRetryDelayAfterFailure + maxRetryDelay:(NSTimeInterval)maxRetryDelay + retryExponent:(double)retryExponent + jitterFactor:(double)jitterFactor; + +- (void)retry:(void (^)(void))block; + +- (void)cancel; + +- (void)signalSuccess; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FIRRetryHelper.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FIRRetryHelper.m new file mode 100644 index 00000000..f94c5ede --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FIRRetryHelper.m @@ -0,0 +1,140 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRRetryHelper.h" +#import "FUtilities.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +@interface FIRRetryHelperTask : NSObject + +@property(nonatomic, strong) void (^block)(void); + +@end + +@implementation FIRRetryHelperTask + +- (instancetype)initWithBlock:(void (^)(void))block { + self = [super init]; + if (self != nil) { + self->_block = [block copy]; + } + return self; +} + +- (BOOL)isCanceled { + return self.block == nil; +} + +- (void)cancel { + self.block = nil; +} + +- (void)execute { + if (self.block) { + self.block(); + } +} + +@end + +@interface FIRRetryHelper () + +@property(nonatomic, strong) dispatch_queue_t dispatchQueue; +@property(nonatomic) NSTimeInterval minRetryDelayAfterFailure; +@property(nonatomic) NSTimeInterval maxRetryDelay; +@property(nonatomic) double retryExponent; +@property(nonatomic) double jitterFactor; + +@property(nonatomic) BOOL lastWasSuccess; +@property(nonatomic) NSTimeInterval currentRetryDelay; + +@property(nonatomic, strong) FIRRetryHelperTask *scheduledRetry; + +@end + +@implementation FIRRetryHelper + +- (instancetype)initWithDispatchQueue:(dispatch_queue_t)dispatchQueue + minRetryDelayAfterFailure:(NSTimeInterval)minRetryDelayAfterFailure + maxRetryDelay:(NSTimeInterval)maxRetryDelay + retryExponent:(double)retryExponent + jitterFactor:(double)jitterFactor { + self = [super init]; + if (self != nil) { + self->_dispatchQueue = dispatchQueue; + self->_minRetryDelayAfterFailure = minRetryDelayAfterFailure; + self->_maxRetryDelay = maxRetryDelay; + self->_retryExponent = retryExponent; + self->_jitterFactor = jitterFactor; + self->_lastWasSuccess = YES; + } + return self; +} + +- (void)retry:(void (^)(void))block { + if (self.scheduledRetry != nil) { + FFLog(@"I-RDB054001", @"Canceling existing retry attempt"); + [self.scheduledRetry cancel]; + self.scheduledRetry = nil; + } + + NSTimeInterval delay; + if (self.lastWasSuccess) { + delay = 0; + } else { + if (self.currentRetryDelay == 0) { + self.currentRetryDelay = self.minRetryDelayAfterFailure; + } else { + NSTimeInterval newDelay = + (self.currentRetryDelay * self.retryExponent); + self.currentRetryDelay = MIN(newDelay, self.maxRetryDelay); + } + + delay = ((1 - self.jitterFactor) * self.currentRetryDelay) + + (self.jitterFactor * self.currentRetryDelay * + [FUtilities randomDouble]); + FFLog(@"I-RDB054002", @"Scheduling retry in %fs", delay); + } + self.lastWasSuccess = NO; + FIRRetryHelperTask *task = [[FIRRetryHelperTask alloc] initWithBlock:block]; + self.scheduledRetry = task; + dispatch_time_t popTime = + dispatch_time(DISPATCH_TIME_NOW, (long long)(delay * NSEC_PER_SEC)); + dispatch_after(popTime, self.dispatchQueue, ^{ + if (![task isCanceled]) { + self.scheduledRetry = nil; + [task execute]; + } + }); +} + +- (void)signalSuccess { + self.lastWasSuccess = YES; + self.currentRetryDelay = 0; +} + +- (void)cancel { + if (self.scheduledRetry != nil) { + FFLog(@"I-RDB054003", @"Canceling existing retry attempt"); + [self.scheduledRetry cancel]; + self.scheduledRetry = nil; + } else { + FFLog(@"I-RDB054004", @"No existing retry attempt to cancel"); + } + self.currentRetryDelay = 0; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FImmutableTree.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FImmutableTree.h new file mode 100644 index 00000000..e6d49618 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FImmutableTree.h @@ -0,0 +1,59 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FImmutableSortedDictionary.h" +#import "FPath.h" +#import "FTuplePathValue.h" + +@interface FImmutableTree : NSObject + +- (id)initWithValue:(id)aValue; +- (id)initWithValue:(id)aValue + children:(FImmutableSortedDictionary *)childrenMap; + ++ (FImmutableTree *)empty; +- (BOOL)isEmpty; + +- (FTuplePathValue *)findRootMostMatchingPath:(FPath *)relativePath + predicate:(BOOL (^)(id))predicate; +- (FTuplePathValue *)findRootMostValueAndPath:(FPath *)relativePath; +- (FImmutableTree *)subtreeAtPath:(FPath *)relativePath; +- (FImmutableTree *)setValue:(id)newValue atPath:(FPath *)relativePath; +- (FImmutableTree *)removeValueAtPath:(FPath *)relativePath; +- (id)valueAtPath:(FPath *)relativePath; +- (id)rootMostValueOnPath:(FPath *)path; +- (id)rootMostValueOnPath:(FPath *)path matching:(BOOL (^)(id))predicate; +- (id)leafMostValueOnPath:(FPath *)path; +- (id)leafMostValueOnPath:(FPath *)relativePath + matching:(BOOL (^)(id))predicate; +- (BOOL)containsValueMatching:(BOOL (^)(id))predicate; +- (FImmutableTree *)setTree:(FImmutableTree *)newTree + atPath:(FPath *)relativePath; +- (id)foldWithBlock:(id (^)(FPath *path, id value, + NSDictionary *foldedChildren))block; +- (id)findOnPath:(FPath *)path + andApplyBlock:(id (^)(FPath *path, id value))block; +- (FPath *)forEachOnPath:(FPath *)path + whileBlock:(BOOL (^)(FPath *path, id value))block; +- (FImmutableTree *)forEachOnPath:(FPath *)path + performBlock:(void (^)(FPath *path, id value))block; +- (void)forEach:(void (^)(FPath *path, id value))block; +- (void)forEachChild:(void (^)(NSString *childKey, id childValue))block; + +@property(nonatomic, strong, readonly) id value; +@property(nonatomic, strong, readonly) FImmutableSortedDictionary *children; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FImmutableTree.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FImmutableTree.m new file mode 100644 index 00000000..34e62ae6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FImmutableTree.m @@ -0,0 +1,486 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FImmutableTree.h" +#import "FImmutableSortedDictionary.h" +#import "FPath.h" +#import "FUtilities.h" + +@interface FImmutableTree () +@property(nonatomic, strong, readwrite) id value; +/** + * Maps NSString -> FImmutableTree, where is type of value. + */ +@property(nonatomic, strong, readwrite) FImmutableSortedDictionary *children; +@end + +@implementation FImmutableTree +@synthesize value; +@synthesize children; + +- (id)initWithValue:(id)aValue { + self = [super init]; + if (self) { + self.value = aValue; + self.children = [FImmutableTree emptyChildren]; + } + return self; +} + +- (id)initWithValue:(id)aValue + children:(FImmutableSortedDictionary *)childrenMap { + self = [super init]; + if (self) { + self.value = aValue; + self.children = childrenMap; + } + return self; +} + ++ (FImmutableSortedDictionary *)emptyChildren { + static dispatch_once_t emptyChildrenToken; + static FImmutableSortedDictionary *emptyChildren; + dispatch_once(&emptyChildrenToken, ^{ + emptyChildren = [FImmutableSortedDictionary + dictionaryWithComparator:[FUtilities stringComparator]]; + }); + return emptyChildren; +} + ++ (FImmutableTree *)empty { + static dispatch_once_t emptyImmutableTreeToken; + static FImmutableTree *emptyTree = nil; + dispatch_once(&emptyImmutableTreeToken, ^{ + emptyTree = [[FImmutableTree alloc] initWithValue:nil]; + }); + return emptyTree; +} + +- (BOOL)isEmpty { + return self.value == nil && [self.children isEmpty]; +} + +/** + * Given a path and a predicate, return the first node and the path to that node + * where the predicate returns true + * // TODO Do a perf test. If we're creating a bunch of FTuplePathValue objects + * on the way back out, it may be better to pass down a pathSoFar FPath + */ +- (FTuplePathValue *)findRootMostMatchingPath:(FPath *)relativePath + predicate:(BOOL (^)(id value))predicate { + if (self.value != nil && predicate(self.value)) { + return [[FTuplePathValue alloc] initWithPath:[FPath empty] + value:self.value]; + } else { + if ([relativePath isEmpty]) { + return nil; + } else { + NSString *front = [relativePath getFront]; + FImmutableTree *child = [self.children get:front]; + if (child != nil) { + FTuplePathValue *childExistingPathAndValue = + [child findRootMostMatchingPath:[relativePath popFront] + predicate:predicate]; + if (childExistingPathAndValue != nil) { + FPath *fullPath = [[[FPath alloc] initWith:front] + child:childExistingPathAndValue.path]; + return [[FTuplePathValue alloc] + initWithPath:fullPath + value:childExistingPathAndValue.value]; + } else { + return nil; + } + } else { + // No child matching path + return nil; + } + } + } +} + +/** + * Find, if it exists, the shortest subpath of the given path that points a + * defined value in the tree + */ +- (FTuplePathValue *)findRootMostValueAndPath:(FPath *)relativePath { + return [self findRootMostMatchingPath:relativePath + predicate:^BOOL(__unsafe_unretained id value) { + return YES; + }]; +} + +- (id)rootMostValueOnPath:(FPath *)path { + return [self rootMostValueOnPath:path + matching:^BOOL(id value) { + return YES; + }]; +} + +- (id)rootMostValueOnPath:(FPath *)path matching:(BOOL (^)(id))predicate { + if (self.value != nil && predicate(self.value)) { + return self.value; + } else if (path.isEmpty) { + return nil; + } else { + return [[self.children get:path.getFront] + rootMostValueOnPath:[path popFront] + matching:predicate]; + } +} + +- (id)leafMostValueOnPath:(FPath *)path { + return [self leafMostValueOnPath:path + matching:^BOOL(id value) { + return YES; + }]; +} + +- (id)leafMostValueOnPath:(FPath *)relativePath + matching:(BOOL (^)(id))predicate { + __block id currentValue = self.value; + __block FImmutableTree *currentTree = self; + [relativePath enumerateComponentsUsingBlock:^(NSString *key, BOOL *stop) { + currentTree = [currentTree.children get:key]; + if (currentTree == nil) { + *stop = YES; + } else { + id treeValue = currentTree.value; + if (treeValue != nil && predicate(treeValue)) { + currentValue = treeValue; + } + } + }]; + return currentValue; +} + +- (BOOL)containsValueMatching:(BOOL (^)(id))predicate { + if (self.value != nil && predicate(self.value)) { + return YES; + } else { + __block BOOL found = NO; + [self.children enumerateKeysAndObjectsUsingBlock:^( + NSString *key, FImmutableTree *subtree, BOOL *stop) { + found = [subtree containsValueMatching:predicate]; + if (found) + *stop = YES; + }]; + return found; + } +} + +- (FImmutableTree *)subtreeAtPath:(FPath *)relativePath { + if ([relativePath isEmpty]) { + return self; + } else { + NSString *front = [relativePath getFront]; + FImmutableTree *childTree = [self.children get:front]; + if (childTree != nil) { + return [childTree subtreeAtPath:[relativePath popFront]]; + } else { + return [FImmutableTree empty]; + } + } +} + +/** + * Sets a value at the specified path + */ +- (FImmutableTree *)setValue:(id)newValue atPath:(FPath *)relativePath { + if ([relativePath isEmpty]) { + return [[FImmutableTree alloc] initWithValue:newValue + children:self.children]; + } else { + NSString *front = [relativePath getFront]; + FImmutableTree *child = [self.children get:front]; + if (child == nil) { + child = [FImmutableTree empty]; + } + FImmutableTree *newChild = [child setValue:newValue + atPath:[relativePath popFront]]; + FImmutableSortedDictionary *newChildren = + [self.children insertKey:front withValue:newChild]; + return [[FImmutableTree alloc] initWithValue:self.value + children:newChildren]; + } +} + +/** + * Remove the value at the specified path + */ +- (FImmutableTree *)removeValueAtPath:(FPath *)relativePath { + if ([relativePath isEmpty]) { + if ([self.children isEmpty]) { + return [FImmutableTree empty]; + } else { + return [[FImmutableTree alloc] initWithValue:nil + children:self.children]; + } + } else { + NSString *front = [relativePath getFront]; + FImmutableTree *child = [self.children get:front]; + if (child) { + FImmutableTree *newChild = + [child removeValueAtPath:[relativePath popFront]]; + FImmutableSortedDictionary *newChildren; + if ([newChild isEmpty]) { + newChildren = [self.children removeKey:front]; + } else { + newChildren = [self.children insertKey:front + withValue:newChild]; + } + if (self.value == nil && [newChildren isEmpty]) { + return [FImmutableTree empty]; + } else { + return [[FImmutableTree alloc] initWithValue:self.value + children:newChildren]; + } + } else { + return self; + } + } +} + +/** + * Gets a value from the tree + */ +- (id)valueAtPath:(FPath *)relativePath { + if ([relativePath isEmpty]) { + return self.value; + } else { + NSString *front = [relativePath getFront]; + FImmutableTree *child = [self.children get:front]; + if (child) { + return [child valueAtPath:[relativePath popFront]]; + } else { + return nil; + } + } +} + +/** + * Replaces the subtree at the specified path with the given new tree + */ +- (FImmutableTree *)setTree:(FImmutableTree *)newTree + atPath:(FPath *)relativePath { + if ([relativePath isEmpty]) { + return newTree; + } else { + NSString *front = [relativePath getFront]; + FImmutableTree *child = [self.children get:front]; + if (child == nil) { + child = [FImmutableTree empty]; + } + FImmutableTree *newChild = [child setTree:newTree + atPath:[relativePath popFront]]; + FImmutableSortedDictionary *newChildren; + if ([newChild isEmpty]) { + newChildren = [self.children removeKey:front]; + } else { + newChildren = [self.children insertKey:front withValue:newChild]; + } + return [[FImmutableTree alloc] initWithValue:self.value + children:newChildren]; + } +} + +/** + * Performs a depth first fold on this tree. Transforms a tree into a single + * value, given a function that operates on the path to a node, an optional + * current value, and a map of the child names to folded subtrees + */ +- (id)foldWithBlock:(id (^)(FPath *path, id value, + NSDictionary *foldedChildren))block { + return [self foldWithPathSoFar:[FPath empty] withBlock:block]; +} + +/** + * Recursive helper for public facing foldWithBlock: method + */ +- (id)foldWithPathSoFar:(FPath *)pathSoFar + withBlock:(id (^)(FPath *path, id value, + NSDictionary *foldedChildren))block { + __block NSMutableDictionary *accum = [[NSMutableDictionary alloc] init]; + [self.children + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FImmutableTree *childTree, BOOL *stop) { + accum[childKey] = + [childTree foldWithPathSoFar:[pathSoFar childFromString:childKey] + withBlock:block]; + }]; + return block(pathSoFar, self.value, accum); +} + +/** + * Find the first matching value on the given path. Return the result of + * applying block to it. + */ +- (id)findOnPath:(FPath *)path + andApplyBlock:(id (^)(FPath *path, id value))block { + return [self findOnPath:path pathSoFar:[FPath empty] andApplyBlock:block]; +} + +- (id)findOnPath:(FPath *)pathToFollow + pathSoFar:(FPath *)pathSoFar + andApplyBlock:(id (^)(FPath *path, id value))block { + id result = self.value ? block(pathSoFar, self.value) : nil; + if (result != nil) { + return result; + } else { + if ([pathToFollow isEmpty]) { + return nil; + } else { + NSString *front = [pathToFollow getFront]; + FImmutableTree *nextChild = [self.children get:front]; + if (nextChild != nil) { + return [nextChild findOnPath:[pathToFollow popFront] + pathSoFar:[pathSoFar childFromString:front] + andApplyBlock:block]; + } else { + return nil; + } + } + } +} +/** + * Call the block on each value along the path for as long as that function + * returns true + * @return The path to the deepest location inspected + */ +- (FPath *)forEachOnPath:(FPath *)path whileBlock:(BOOL (^)(FPath *, id))block { + return [self forEachOnPath:path pathSoFar:[FPath empty] whileBlock:block]; +} + +- (FPath *)forEachOnPath:(FPath *)pathToFollow + pathSoFar:(FPath *)pathSoFar + whileBlock:(BOOL (^)(FPath *, id))block { + if ([pathToFollow isEmpty]) { + if (self.value) { + block(pathSoFar, self.value); + } + return pathSoFar; + } else { + BOOL shouldContinue = YES; + if (self.value) { + shouldContinue = block(pathSoFar, self.value); + } + if (shouldContinue) { + NSString *front = [pathToFollow getFront]; + FImmutableTree *nextChild = [self.children get:front]; + if (nextChild) { + return + [nextChild forEachOnPath:[pathToFollow popFront] + pathSoFar:[pathSoFar childFromString:front] + whileBlock:block]; + } else { + return pathSoFar; + } + } else { + return pathSoFar; + } + } +} + +- (FImmutableTree *)forEachOnPath:(FPath *)path + performBlock:(void (^)(FPath *path, id value))block { + return [self forEachOnPath:path pathSoFar:[FPath empty] performBlock:block]; +} + +- (FImmutableTree *)forEachOnPath:(FPath *)pathToFollow + pathSoFar:(FPath *)pathSoFar + performBlock:(void (^)(FPath *path, id value))block { + if ([pathToFollow isEmpty]) { + return self; + } else { + if (self.value) { + block(pathSoFar, self.value); + } + NSString *front = [pathToFollow getFront]; + FImmutableTree *nextChild = [self.children get:front]; + if (nextChild) { + return [nextChild forEachOnPath:[pathToFollow popFront] + pathSoFar:[pathSoFar childFromString:front] + performBlock:block]; + } else { + return [FImmutableTree empty]; + } + } +} +/** + * Calls the given block for each node in the tree that has a value. Called in + * depth-first order + */ +- (void)forEach:(void (^)(FPath *path, id value))block { + [self forEachPathSoFar:[FPath empty] withBlock:block]; +} + +- (void)forEachPathSoFar:(FPath *)pathSoFar + withBlock:(void (^)(FPath *path, id value))block { + [self.children + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FImmutableTree *childTree, BOOL *stop) { + [childTree forEachPathSoFar:[pathSoFar childFromString:childKey] + withBlock:block]; + }]; + if (self.value) { + block(pathSoFar, self.value); + } +} + +- (void)forEachChild:(void (^)(NSString *childKey, id childValue))block { + [self.children + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FImmutableTree *childTree, BOOL *stop) { + if (childTree.value) { + block(childKey, childTree.value); + } + }]; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[FImmutableTree class]]) { + return NO; + } + FImmutableTree *other = (FImmutableTree *)object; + return (self.value == other.value || [self.value isEqual:other.value]) && + [self.children isEqual:other.children]; +} + +- (NSUInteger)hash { + return self.children.hash * 31 + [self.value hash]; +} + +- (NSString *)description { + NSMutableString *string = [[NSMutableString alloc] init]; + [string appendString:@"FImmutableTree { value="]; + [string appendString:(self.value ? [self.value description] : @"")]; + [string appendString:@", children={"]; + [self.children + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FImmutableTree *childTree, BOOL *stop) { + [string appendString:@" "]; + [string appendString:childKey]; + [string appendString:@"="]; + [string appendString:[childTree.value description]]; + }]; + [string appendString:@" } }"]; + return [NSString stringWithString:string]; +} + +- (NSString *)debugDescription { + return [self description]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FPath.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FPath.h new file mode 100644 index 00000000..cfa86aac --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FPath.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FPath : NSObject + ++ (FPath *)relativePathFrom:(FPath *)outer to:(FPath *)inner; ++ (FPath *)empty; ++ (FPath *)pathWithString:(NSString *)string; + +- (id)initWith:(NSString *)path; +- (id)initWithPieces:(NSArray *)somePieces andPieceNum:(NSInteger)aPieceNum; + +- (id)copyWithZone:(NSZone *)zone; + +- (void)enumerateComponentsUsingBlock:(void (^)(NSString *key, + BOOL *stop))block; +- (NSString *)getFront; +- (NSUInteger)length; +- (FPath *)popFront; +- (NSString *)getBack; +- (NSString *)toString; +- (NSString *)toStringWithTrailingSlash; +- (NSString *)wireFormat; +- (FPath *)parent; +- (FPath *)child:(FPath *)childPathObj; +- (FPath *)childFromString:(NSString *)childPath; +- (BOOL)isEmpty; +- (BOOL)contains:(FPath *)other; +- (NSComparisonResult)compare:(FPath *)other; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FPath.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FPath.m new file mode 100644 index 00000000..f6552400 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FPath.m @@ -0,0 +1,304 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPath.h" + +#import "FUtilities.h" + +@interface FPath () + +@property(nonatomic, readwrite, assign) NSInteger pieceNum; +@property(nonatomic, strong) NSArray *pieces; + +@end + +@implementation FPath + +#pragma mark - +#pragma mark Initializers + ++ (FPath *)relativePathFrom:(FPath *)outer to:(FPath *)inner { + NSString *outerFront = [outer getFront]; + NSString *innerFront = [inner getFront]; + if (outerFront == nil) { + return inner; + } else if ([outerFront isEqualToString:innerFront]) { + return [self relativePathFrom:[outer popFront] to:[inner popFront]]; + } else { + @throw [[NSException alloc] + initWithName:@"FirebaseDatabaseInternalError" + reason:[NSString + stringWithFormat: + @"innerPath (%@) is not within outerPath (%@)", + inner, outer] + userInfo:nil]; + } +} + ++ (FPath *)pathWithString:(NSString *)string { + return [[FPath alloc] initWith:string]; +} + +- (id)initWith:(NSString *)path { + self = [super init]; + if (self) { + NSArray *pathPieces = [path componentsSeparatedByString:@"/"]; + NSMutableArray *newPieces = [[NSMutableArray alloc] init]; + for (NSInteger i = 0; i < pathPieces.count; i++) { + NSString *piece = [pathPieces objectAtIndex:i]; + if (piece.length > 0) { + [newPieces addObject:piece]; + } + } + + self.pieces = newPieces; + self.pieceNum = 0; + } + return self; +} + +- (id)initWithPieces:(NSArray *)somePieces andPieceNum:(NSInteger)aPieceNum { + self = [super init]; + if (self) { + self.pieceNum = aPieceNum; + self.pieces = somePieces; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + // Immutable, so it's safe to return self + return self; +} + +- (NSString *)description { + return [self toString]; +} + +#pragma mark - +#pragma mark Public methods + +- (NSString *)getFront { + if (self.pieceNum >= self.pieces.count) { + return nil; + } + return [self.pieces objectAtIndex:self.pieceNum]; +} + +/** + * @return The number of segments in this path + */ +- (NSUInteger)length { + return self.pieces.count - self.pieceNum; +} + +- (FPath *)popFront { + NSInteger newPieceNum = self.pieceNum; + if (newPieceNum < self.pieces.count) { + newPieceNum++; + } + return [[FPath alloc] initWithPieces:self.pieces andPieceNum:newPieceNum]; +} + +- (NSString *)getBack { + if (self.pieceNum < self.pieces.count) { + return [self.pieces lastObject]; + } else { + return nil; + } +} + +- (NSString *)toString { + return [self toStringWithTrailingSlash:NO]; +} + +- (NSString *)toStringWithTrailingSlash { + return [self toStringWithTrailingSlash:YES]; +} + +- (NSString *)toStringWithTrailingSlash:(BOOL)trailingSlash { + NSMutableString *pathString = [[NSMutableString alloc] init]; + for (NSInteger i = self.pieceNum; i < self.pieces.count; i++) { + [pathString appendString:@"/"]; + [pathString appendString:[self.pieces objectAtIndex:i]]; + } + if ([pathString length] == 0) { + return @"/"; + } else { + if (trailingSlash) { + [pathString appendString:@"/"]; + } + return pathString; + } +} + +- (NSString *)wireFormat { + if ([self isEmpty]) { + return @"/"; + } else { + NSMutableString *pathString = [[NSMutableString alloc] init]; + for (NSInteger i = self.pieceNum; i < self.pieces.count; i++) { + if (i > self.pieceNum) { + [pathString appendString:@"/"]; + } + [pathString appendString:[self.pieces objectAtIndex:i]]; + } + return pathString; + } +} + +- (FPath *)parent { + if (self.pieceNum >= self.pieces.count) { + return nil; + } else { + NSMutableArray *newPieces = [[NSMutableArray alloc] init]; + for (NSInteger i = self.pieceNum; i < self.pieces.count - 1; i++) { + [newPieces addObject:[self.pieces objectAtIndex:i]]; + } + return [[FPath alloc] initWithPieces:newPieces andPieceNum:0]; + } +} + +- (FPath *)child:(FPath *)childPathObj { + NSMutableArray *newPieces = [[NSMutableArray alloc] init]; + for (NSInteger i = self.pieceNum; i < self.pieces.count; i++) { + [newPieces addObject:[self.pieces objectAtIndex:i]]; + } + + for (NSInteger i = childPathObj.pieceNum; i < childPathObj.pieces.count; + i++) { + [newPieces addObject:[childPathObj.pieces objectAtIndex:i]]; + } + + return [[FPath alloc] initWithPieces:newPieces andPieceNum:0]; +} + +- (FPath *)childFromString:(NSString *)childPath { + NSMutableArray *newPieces = [[NSMutableArray alloc] init]; + for (NSInteger i = self.pieceNum; i < self.pieces.count; i++) { + [newPieces addObject:[self.pieces objectAtIndex:i]]; + } + + NSArray *pathPieces = [childPath componentsSeparatedByString:@"/"]; + for (unsigned int i = 0; i < pathPieces.count; i++) { + NSString *piece = [pathPieces objectAtIndex:i]; + if (piece.length > 0) { + [newPieces addObject:piece]; + } + } + + return [[FPath alloc] initWithPieces:newPieces andPieceNum:0]; +} + +/** + * @return True if there are no segments in this path + */ +- (BOOL)isEmpty { + return self.pieceNum >= self.pieces.count; +} + +/** + * @return Singleton to represent an empty path + */ ++ (FPath *)empty { + static dispatch_once_t oneEmptyPath; + static FPath *emptyPath; + dispatch_once(&oneEmptyPath, ^{ + emptyPath = [[FPath alloc] initWith:@""]; + }); + return emptyPath; +} + +- (BOOL)contains:(FPath *)other { + if (self.length > other.length) { + return NO; + } + + NSInteger i = self.pieceNum; + NSInteger j = other.pieceNum; + while (i < self.pieces.count) { + NSString *thisSeg = [self.pieces objectAtIndex:i]; + NSString *otherSeg = [other.pieces objectAtIndex:j]; + if (![thisSeg isEqualToString:otherSeg]) { + return NO; + } + ++i; + ++j; + } + return YES; +} + +- (void)enumerateComponentsUsingBlock:(void (^)(NSString *, BOOL *))block { + BOOL stop = NO; + for (NSInteger i = self.pieceNum; !stop && i < self.pieces.count; i++) { + block(self.pieces[i], &stop); + } +} + +- (NSComparisonResult)compare:(FPath *)other { + NSInteger myCount = self.pieces.count; + NSInteger otherCount = other.pieces.count; + for (NSInteger i = self.pieceNum, j = other.pieceNum; + i < myCount && j < otherCount; i++, j++) { + NSComparisonResult comparison = [FUtilities compareKey:self.pieces[i] + toKey:other.pieces[j]]; + if (comparison != NSOrderedSame) { + return comparison; + } + } + if (self.length < other.length) { + return NSOrderedAscending; + } else if (other.length < self.length) { + return NSOrderedDescending; + } else { + NSAssert(self.length == other.length, + @"Paths must be the same lengths"); + return NSOrderedSame; + } +} + +/** + * @return YES if paths are the same + */ +- (BOOL)isEqual:(id)other { + if (other == self) { + return YES; + } + if (!other || ![other isKindOfClass:[self class]]) { + return NO; + } + FPath *otherPath = (FPath *)other; + if (self.length != otherPath.length) { + return NO; + } + for (NSUInteger i = self.pieceNum, j = otherPath.pieceNum; + i < self.pieces.count; i++, j++) { + if (![self.pieces[i] isEqualToString:otherPath.pieces[j]]) { + return NO; + } + } + return YES; +} + +- (NSUInteger)hash { + NSUInteger hashCode = 0; + for (NSInteger i = self.pieceNum; i < self.pieces.count; i++) { + hashCode = hashCode * 37 + [self.pieces[i] hash]; + } + return hashCode; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTree.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTree.h new file mode 100644 index 00000000..d5c77ab0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTree.h @@ -0,0 +1,52 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPath.h" +#import "FTreeNode.h" +#import + +@interface FTree : NSObject + +- (id)init; +- (id)initWithName:(NSString *)aName + withParent:(FTree *)aParent + withNode:(FTreeNode *)aNode; + +- (FTree *)subTree:(FPath *)path; +- (id)getValue; +- (void)setValue:(id)value; +- (void)clear; +- (BOOL)hasChildren; +- (BOOL)isEmpty; +- (void)forEachChildMutationSafe:(void (^)(FTree *))action; +- (void)forEachChild:(void (^)(FTree *))action; +- (void)forEachDescendant:(void (^)(FTree *))action; +- (void)forEachDescendant:(void (^)(FTree *))action + includeSelf:(BOOL)incSelf + childrenFirst:(BOOL)childFirst; +- (BOOL)forEachAncestor:(BOOL (^)(FTree *))action; +- (BOOL)forEachAncestor:(BOOL (^)(FTree *))action includeSelf:(BOOL)incSelf; +- (void)forEachImmediateDescendantWithValue:(void (^)(FTree *))action; +- (BOOL)valueExistsAtOrAbove:(FPath *)path; +- (FPath *)path; +- (void)updateParents; +- (void)updateChild:(NSString *)childName withNode:(FTree *)child; + +@property(nonatomic, strong) NSString *name; +@property(nonatomic, strong) FTree *parent; +@property(nonatomic, strong) FTreeNode *node; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTree.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTree.m new file mode 100644 index 00000000..209b59f9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTree.m @@ -0,0 +1,193 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTree.h" +#import "FPath.h" +#import "FTreeNode.h" +#import "FUtilities.h" + +@implementation FTree + +@synthesize name; +@synthesize parent; +@synthesize node; + +- (id)init { + self = [super init]; + if (self) { + self.name = @""; + self.parent = nil; + self.node = [[FTreeNode alloc] init]; + } + return self; +} + +- (id)initWithName:(NSString *)aName + withParent:(FTree *)aParent + withNode:(FTreeNode *)aNode { + self = [super init]; + if (self) { + self.name = aName != nil ? aName : @""; + self.parent = aParent != nil ? aParent : nil; + self.node = aNode != nil ? aNode : [[FTreeNode alloc] init]; + } + return self; +} + +- (FTree *)subTree:(FPath *)path { + FTree *child = self; + NSString *next = [path getFront]; + while (next != nil) { + FTreeNode *childNode = child.node.children[next]; + if (childNode == nil) { + childNode = [[FTreeNode alloc] init]; + } + child = [[FTree alloc] initWithName:next + withParent:child + withNode:childNode]; + path = [path popFront]; + next = [path getFront]; + } + return child; +} + +- (id)getValue { + return self.node.value; +} + +- (void)setValue:(id)value { + self.node.value = value; + [self updateParents]; +} + +- (void)clear { + self.node.value = nil; + [self.node.children removeAllObjects]; + self.node.childCount = 0; + [self updateParents]; +} + +- (BOOL)hasChildren { + return self.node.childCount > 0; +} + +- (BOOL)isEmpty { + return [self getValue] == nil && ![self hasChildren]; +} + +- (void)forEachChild:(void (^)(FTree *))action { + for (NSString *key in self.node.children) { + action([[FTree alloc] + initWithName:key + withParent:self + withNode:[self.node.children objectForKey:key]]); + } +} + +- (void)forEachChildMutationSafe:(void (^)(FTree *))action { + for (NSString *key in [self.node.children copy]) { + action([[FTree alloc] + initWithName:key + withParent:self + withNode:[self.node.children objectForKey:key]]); + } +} + +- (void)forEachDescendant:(void (^)(FTree *))action { + [self forEachDescendant:action includeSelf:NO childrenFirst:NO]; +} + +- (void)forEachDescendant:(void (^)(FTree *))action + includeSelf:(BOOL)incSelf + childrenFirst:(BOOL)childFirst { + if (incSelf && !childFirst) { + action(self); + } + + [self forEachChild:^(FTree *child) { + [child forEachDescendant:action includeSelf:YES childrenFirst:childFirst]; + }]; + + if (incSelf && childFirst) { + action(self); + } +} + +- (BOOL)forEachAncestor:(BOOL (^)(FTree *))action { + return [self forEachAncestor:action includeSelf:NO]; +} + +- (BOOL)forEachAncestor:(BOOL (^)(FTree *))action includeSelf:(BOOL)incSelf { + FTree *aNode = (incSelf) ? self : self.parent; + while (aNode != nil) { + if (action(aNode)) { + return YES; + } + aNode = aNode.parent; + } + return NO; +} + +- (void)forEachImmediateDescendantWithValue:(void (^)(FTree *))action { + [self forEachChild:^(FTree *child) { + if ([child getValue] != nil) { + action(child); + } else { + [child forEachImmediateDescendantWithValue:action]; + } + }]; +} + +- (BOOL)valueExistsAtOrAbove:(FPath *)path { + FTreeNode *aNode = self.node; + while (aNode != nil) { + if (aNode.value != nil) { + return YES; + } + aNode = [aNode.children objectForKey:path.getFront]; + path = [path popFront]; + } + // XXX Check with Michael if this is correct; deviates from JS. + return NO; +} + +- (FPath *)path { + return [[FPath alloc] + initWith:(self.parent == nil) + ? self.name + : [NSString stringWithFormat:@"%@/%@", [self.parent path], + self.name]]; +} + +- (void)updateParents { + [self.parent updateChild:self.name withNode:self]; +} + +- (void)updateChild:(NSString *)childName withNode:(FTree *)child { + BOOL childEmpty = [child isEmpty]; + BOOL childExists = self.node.children[childName] != nil; + if (childEmpty && childExists) { + [self.node.children removeObjectForKey:childName]; + self.node.childCount = self.node.childCount - 1; + [self updateParents]; + } else if (!childEmpty && !childExists) { + [self.node.children setObject:child.node forKey:childName]; + self.node.childCount = self.node.childCount + 1; + [self updateParents]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTreeNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTreeNode.h new file mode 100644 index 00000000..549f3b1e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTreeNode.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FTreeNode : NSObject + +@property(nonatomic, strong) NSMutableDictionary *children; +@property(nonatomic, readwrite, assign) int childCount; +@property(nonatomic, strong) id value; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTreeNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTreeNode.m new file mode 100644 index 00000000..bae6c627 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/Utilities/FTreeNode.m @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTreeNode.h" + +@implementation FTreeNode + +@synthesize children; +@synthesize childCount; +@synthesize value; + +- (id)init { + self = [super init]; + if (self) { + self.children = [[NSMutableDictionary alloc] init]; + self.childCount = 0; + self.value = nil; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCacheNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCacheNode.h new file mode 100644 index 00000000..eff0cb0b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCacheNode.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FNode; +@class FIndexedNode; +@class FPath; + +/** + * A cache node only stores complete children. Additionally it holds a flag + * whether the node can be considered fully initialized in the sense that we + * know at one point in time, this represented a valid state of the world, e.g. + * initialized with data from the server, or a complete overwrite by the client. + * It is not necessarily complete because it may have been from a tagged query. + * The filtered flag also tracks whether a node potentially had children removed + * due to a filter. + */ +@interface FCacheNode : NSObject + +- (id)initWithIndexedNode:(FIndexedNode *)indexedNode + isFullyInitialized:(BOOL)fullyInitialized + isFiltered:(BOOL)filtered; + +- (BOOL)isCompleteForPath:(FPath *)path; +- (BOOL)isCompleteForChild:(NSString *)childKey; + +@property(nonatomic, readonly) BOOL isFullyInitialized; +@property(nonatomic, readonly) BOOL isFiltered; +@property(nonatomic, strong, readonly) FIndexedNode *indexedNode; +@property(nonatomic, strong, readonly) id node; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCacheNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCacheNode.m new file mode 100644 index 00000000..a991d52e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCacheNode.m @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FCacheNode.h" +#import "FEmptyNode.h" +#import "FIndexedNode.h" +#import "FNode.h" +#import "FPath.h" + +@interface FCacheNode () +@property(nonatomic, readwrite) BOOL isFullyInitialized; +@property(nonatomic, readwrite) BOOL isFiltered; +@property(nonatomic, strong, readwrite) FIndexedNode *indexedNode; +@end + +@implementation FCacheNode +- (id)initWithIndexedNode:(FIndexedNode *)indexedNode + isFullyInitialized:(BOOL)fullyInitialized + isFiltered:(BOOL)filtered { + self = [super init]; + if (self) { + self.indexedNode = indexedNode; + self.isFullyInitialized = fullyInitialized; + self.isFiltered = filtered; + } + return self; +} + +- (BOOL)isCompleteForPath:(FPath *)path { + if (path.isEmpty) { + return self.isFullyInitialized && !self.isFiltered; + } else { + NSString *childKey = [path getFront]; + return [self isCompleteForChild:childKey]; + } +} + +- (BOOL)isCompleteForChild:(NSString *)childKey { + return (self.isFullyInitialized && !self.isFiltered) || + [self.node hasChild:childKey]; +} + +- (id)node { + return self.indexedNode.node; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCancelEvent.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCancelEvent.h new file mode 100644 index 00000000..dd586427 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCancelEvent.h @@ -0,0 +1,31 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FEvent.h" +#import + +@protocol FEventRegistration; + +@interface FCancelEvent : NSObject + +- initWithEventRegistration:(id)eventRegistration + error:(NSError *)error + path:(FPath *)path; + +@property(nonatomic, strong, readonly) NSError *error; +@property(nonatomic, strong, readonly) FPath *path; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCancelEvent.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCancelEvent.m new file mode 100644 index 00000000..b069a71e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FCancelEvent.m @@ -0,0 +1,57 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FCancelEvent.h" +#import "FEventRegistration.h" +#import "FPath.h" + +@interface FCancelEvent () +@property(nonatomic, strong) id eventRegistration; +@property(nonatomic, strong, readwrite) NSError *error; +@property(nonatomic, strong, readwrite) FPath *path; +@end + +@implementation FCancelEvent + +@synthesize eventRegistration; +@synthesize error; +@synthesize path; + +- (id)initWithEventRegistration:(id)registration + error:(NSError *)anError + path:(FPath *)aPath { + self = [super init]; + if (self) { + self.eventRegistration = registration; + self.error = anError; + self.path = aPath; + } + return self; +} + +- (void)fireEventOnQueue:(dispatch_queue_t)queue { + [self.eventRegistration fireEvent:self queue:queue]; +} + +- (BOOL)isCancelEvent { + return YES; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@: cancel", self.path]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChange.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChange.h new file mode 100644 index 00000000..101ec8f4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChange.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseReference.h" +#import "FIndexedNode.h" +#import "FNode.h" +#import + +@interface FChange : NSObject + +@property(nonatomic, readonly) FIRDataEventType type; +@property(nonatomic, strong, readonly) FIndexedNode *indexedNode; +@property(nonatomic, strong, readonly) NSString *childKey; +@property(nonatomic, strong, readonly) NSString *prevKey; +@property(nonatomic, strong, readonly) FIndexedNode *oldIndexedNode; + +- (id)initWithType:(FIRDataEventType)type + indexedNode:(FIndexedNode *)indexedNode; +- (id)initWithType:(FIRDataEventType)type + indexedNode:(FIndexedNode *)indexedNode + childKey:(NSString *)childKey; +- (id)initWithType:(FIRDataEventType)type + indexedNode:(FIndexedNode *)indexedNode + childKey:(NSString *)childKey + oldIndexedNode:(FIndexedNode *)oldIndexedNode; + +- (FChange *)changeWithPrevKey:(NSString *)prevKey; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChange.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChange.m new file mode 100644 index 00000000..8ad1cfce --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChange.m @@ -0,0 +1,72 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FChange.h" + +@interface FChange () + +@property(nonatomic, strong, readwrite) NSString *prevKey; + +@end + +@implementation FChange + +- (id)initWithType:(FIRDataEventType)type + indexedNode:(FIndexedNode *)indexedNode { + return [self initWithType:type + indexedNode:indexedNode + childKey:nil + oldIndexedNode:nil]; +} + +- (id)initWithType:(FIRDataEventType)type + indexedNode:(FIndexedNode *)indexedNode + childKey:(NSString *)childKey { + return [self initWithType:type + indexedNode:indexedNode + childKey:childKey + oldIndexedNode:nil]; +} + +- (id)initWithType:(FIRDataEventType)type + indexedNode:(FIndexedNode *)indexedNode + childKey:(NSString *)childKey + oldIndexedNode:(FIndexedNode *)oldIndexedNode { + self = [super init]; + if (self != nil) { + self->_type = type; + self->_indexedNode = indexedNode; + self->_childKey = childKey; + self->_oldIndexedNode = oldIndexedNode; + } + return self; +} + +- (FChange *)changeWithPrevKey:(NSString *)prevKey { + FChange *newChange = [[FChange alloc] initWithType:self.type + indexedNode:self.indexedNode + childKey:self.childKey + oldIndexedNode:self.oldIndexedNode]; + newChange.prevKey = prevKey; + return newChange; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"event: %d, data: %@", (int)self.type, + [self.indexedNode.node val]]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChildEventRegistration.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChildEventRegistration.h new file mode 100644 index 00000000..0b0c6335 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChildEventRegistration.h @@ -0,0 +1,37 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FEventRegistration.h" +#import "FTypedefs.h" +#import + +@class FRepo; + +@interface FChildEventRegistration : NSObject + +- (id)initWithRepo:(FRepo *)repo + handle:(FIRDatabaseHandle)fHandle + callbacks:(NSDictionary *)callbackBlocks + cancelCallback:(fbt_void_nserror)cancelCallbackBlock; + +/** + * Maps FIRDataEventType (as NSNumber) to fbt_void_datasnapshot_nsstring + */ +@property(nonatomic, copy, readonly) NSDictionary *callbacks; +@property(nonatomic, copy, readonly) fbt_void_nserror cancelCallback; +@property(nonatomic, readonly) FIRDatabaseHandle handle; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChildEventRegistration.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChildEventRegistration.m new file mode 100644 index 00000000..fe1fa15b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FChildEventRegistration.m @@ -0,0 +1,112 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FChildEventRegistration.h" +#import "FCancelEvent.h" +#import "FDataEvent.h" +#import "FIRDataSnapshot_Private.h" +#import "FIRDatabaseQuery_Private.h" +#import "FQueryParams.h" +#import "FQuerySpec.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +@interface FChildEventRegistration () +@property(nonatomic, strong) FRepo *repo; +@property(nonatomic, copy, readwrite) NSDictionary *callbacks; +@property(nonatomic, copy, readwrite) fbt_void_nserror cancelCallback; +@property(nonatomic, readwrite) FIRDatabaseHandle handle; +@end + +@implementation FChildEventRegistration + +- (id)initWithRepo:(id)repo + handle:(FIRDatabaseHandle)fHandle + callbacks:(NSDictionary *)callbackBlocks + cancelCallback:(fbt_void_nserror)cancelCallbackBlock { + self = [super init]; + if (self) { + self.repo = repo; + self.handle = fHandle; + self.callbacks = callbackBlocks; + self.cancelCallback = cancelCallbackBlock; + } + return self; +} + +- (BOOL)responseTo:(FIRDataEventType)eventType { + return self.callbacks != nil && + [self.callbacks + objectForKey:[NSNumber numberWithInteger:eventType]] != nil; +} + +- (FDataEvent *)createEventFrom:(FChange *)change query:(FQuerySpec *)query { + FIRDatabaseReference *ref = [[FIRDatabaseReference alloc] + initWithRepo:self.repo + path:[query.path childFromString:change.childKey]]; + FIRDataSnapshot *snapshot = + [[FIRDataSnapshot alloc] initWithRef:ref + indexedNode:change.indexedNode]; + + FDataEvent *eventData = + [[FDataEvent alloc] initWithEventType:change.type + eventRegistration:self + dataSnapshot:snapshot + prevName:change.prevKey]; + return eventData; +} + +- (void)fireEvent:(id)event queue:(dispatch_queue_t)queue { + if ([event isCancelEvent]) { + FCancelEvent *cancelEvent = event; + FFLog(@"I-RDB061001", @"Raising cancel value event on %@", event.path); + NSAssert( + self.cancelCallback != nil, + @"Raising a cancel event on a listener with no cancel callback"); + dispatch_async(queue, ^{ + self.cancelCallback(cancelEvent.error); + }); + } else if (self.callbacks != nil) { + FDataEvent *dataEvent = event; + FFLog(@"I-RDB061002", @"Raising event callback (%ld) on %@", + (long)dataEvent.eventType, dataEvent.path); + fbt_void_datasnapshot_nsstring callback = [self.callbacks + objectForKey:[NSNumber numberWithInteger:dataEvent.eventType]]; + + if (callback != nil) { + dispatch_async(queue, ^{ + callback(dataEvent.snapshot, dataEvent.prevName); + }); + } + } +} + +- (FCancelEvent *)createCancelEventFromError:(NSError *)error + path:(FPath *)path { + if (self.cancelCallback != nil) { + return [[FCancelEvent alloc] initWithEventRegistration:self + error:error + path:path]; + } else { + return nil; + } +} + +- (BOOL)matches:(id)other { + return self.handle == NSNotFound || other.handle == NSNotFound || + self.handle == other.handle; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FDataEvent.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FDataEvent.h new file mode 100644 index 00000000..a0d28f94 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FDataEvent.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FEvent.h" +#import "FIRDataSnapshot.h" +#import "FIRDatabaseReference.h" +#import "FTupleUserCallback.h" +#import + +@protocol FEventRegistration; +@protocol FIndex; + +@interface FDataEvent : NSObject + +- initWithEventType:(FIRDataEventType)type + eventRegistration:(id)eventRegistration + dataSnapshot:(FIRDataSnapshot *)dataSnapshot; +- initWithEventType:(FIRDataEventType)type + eventRegistration:(id)eventRegistration + dataSnapshot:(FIRDataSnapshot *)snapshot + prevName:(NSString *)prevName; + +@property(nonatomic, strong, readonly) id eventRegistration; +@property(nonatomic, strong, readonly) FIRDataSnapshot *snapshot; +@property(nonatomic, strong, readonly) NSString *prevName; +@property(nonatomic, readonly) FIRDataEventType eventType; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FDataEvent.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FDataEvent.m new file mode 100644 index 00000000..886a21e3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FDataEvent.m @@ -0,0 +1,83 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FDataEvent.h" +#import "FEventRegistration.h" +#import "FIRDatabaseQuery_Private.h" +#import "FIndex.h" + +@interface FDataEvent () +@property(nonatomic, strong, readwrite) id + eventRegistration; +@property(nonatomic, strong, readwrite) FIRDataSnapshot *snapshot; +@property(nonatomic, strong, readwrite) NSString *prevName; +@property(nonatomic, readwrite) FIRDataEventType eventType; +@end + +@implementation FDataEvent + +@synthesize eventRegistration; +@synthesize snapshot; +@synthesize prevName; +@synthesize eventType; + +- (id)initWithEventType:(FIRDataEventType)type + eventRegistration:(id)registration + dataSnapshot:(FIRDataSnapshot *)dataSnapshot { + return [self initWithEventType:type + eventRegistration:registration + dataSnapshot:dataSnapshot + prevName:nil]; +} + +- (id)initWithEventType:(FIRDataEventType)type + eventRegistration:(id)registration + dataSnapshot:(FIRDataSnapshot *)dataSnapshot + prevName:(NSString *)previousName { + self = [super init]; + if (self) { + self.eventRegistration = registration; + self.snapshot = dataSnapshot; + self.prevName = previousName; + self.eventType = type; + } + return self; +} + +- (FPath *)path { + // Used for logging, so delay calculation + FIRDatabaseReference *ref = self.snapshot.ref; + if (self.eventType == FIRDataEventTypeValue) { + return ref.path; + } else { + return ref.parent.path; + } +} + +- (void)fireEventOnQueue:(dispatch_queue_t)queue { + [self.eventRegistration fireEvent:self queue:queue]; +} + +- (BOOL)isCancelEvent { + return NO; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"event %d, data: %@", (int)eventType, + [snapshot value]]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEvent.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEvent.h new file mode 100644 index 00000000..cddcf735 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEvent.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDataEventType.h" +#import + +@class FPath; + +@protocol FEvent +- (FPath *)path; +- (void)fireEventOnQueue:(dispatch_queue_t)queue; +- (BOOL)isCancelEvent; +- (NSString *)description; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRaiser.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRaiser.h new file mode 100644 index 00000000..c46bff54 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRaiser.h @@ -0,0 +1,36 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTypedefs.h" + +@class FPath; +@class FRepo; +@class FIRDatabaseConfig; + +/** + * Left as instance methods rather than class methods so that we could + * potentially callback on different queues for different repos. This is + * semi-parallel to JS's FEventQueue + */ +@interface FEventRaiser : NSObject + +- (id)initWithQueue:(dispatch_queue_t)queue; + +- (void)raiseEvents:(NSArray *)eventDataList; +- (void)raiseCallback:(fbt_void_void)callback; +- (void)raiseCallbacks:(NSArray *)callbackList; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRaiser.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRaiser.m new file mode 100644 index 00000000..d745358c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRaiser.m @@ -0,0 +1,74 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FEventRaiser.h" +#import "FDataEvent.h" +#import "FRepo.h" +#import "FRepoManager.h" +#import "FTupleUserCallback.h" +#import "FTypedefs.h" +#import "FUtilities.h" + +@interface FEventRaiser () + +@property(nonatomic, strong) dispatch_queue_t queue; + +@end + +/** + * This class exists for symmetry with other clients, but since events are + * async, we don't need to do the complicated stuff the JS client does to + * preserve event order. + */ +@implementation FEventRaiser + +- (id)init { + [NSException raise:NSInternalInconsistencyException + format:@"Can't use default constructor"]; + return nil; +} + +- (id)initWithQueue:(dispatch_queue_t)queue { + self = [super init]; + if (self != nil) { + self->_queue = queue; + } + return self; +} + +- (void)raiseEvents:(NSArray *)eventDataList { + for (id event in eventDataList) { + [event fireEventOnQueue:self.queue]; + } +} + +- (void)raiseCallback:(fbt_void_void)callback { + dispatch_async(self.queue, callback); +} + +- (void)raiseCallbacks:(NSArray *)callbackList { + for (fbt_void_void callback in callbackList) { + dispatch_async(self.queue, callback); + } +} + ++ (void)raiseCallbacks:(NSArray *)callbackList queue:(dispatch_queue_t)queue { + for (fbt_void_void callback in callbackList) { + dispatch_async(queue, callback); + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRegistration.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRegistration.h new file mode 100644 index 00000000..79a2eb08 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FEventRegistration.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FChange.h" +#import "FIRDataEventType.h" +#import + +@protocol FEvent; +@class FDataEvent; +@class FCancelEvent; +@class FQuerySpec; + +@protocol FEventRegistration +- (BOOL)responseTo:(FIRDataEventType)eventType; +- (FDataEvent *)createEventFrom:(FChange *)change query:(FQuerySpec *)query; +- (void)fireEvent:(id)event queue:(dispatch_queue_t)queue; +- (FCancelEvent *)createCancelEventFromError:(NSError *)error + path:(FPath *)path; +/** + * Used to figure out what event registration match the event registration that + * needs to be removed. + */ +- (BOOL)matches:(id)other; +@property(nonatomic, readonly) FIRDatabaseHandle handle; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FKeepSyncedEventRegistration.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FKeepSyncedEventRegistration.h new file mode 100644 index 00000000..d4dca60d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FKeepSyncedEventRegistration.h @@ -0,0 +1,28 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FEventRegistration.h" + +/** + * A singleton event registration to mark a query as keep synced + */ +@interface FKeepSyncedEventRegistration : NSObject + ++ (FKeepSyncedEventRegistration *)instance; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FKeepSyncedEventRegistration.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FKeepSyncedEventRegistration.m new file mode 100644 index 00000000..1821829f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FKeepSyncedEventRegistration.m @@ -0,0 +1,70 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FKeepSyncedEventRegistration.h" + +@interface FKeepSyncedEventRegistration () + +@end + +@implementation FKeepSyncedEventRegistration + ++ (FKeepSyncedEventRegistration *)instance { + static dispatch_once_t onceToken; + static FKeepSyncedEventRegistration *keepSynced; + dispatch_once(&onceToken, ^{ + keepSynced = [[FKeepSyncedEventRegistration alloc] init]; + }); + return keepSynced; +} + +- (BOOL)responseTo:(FIRDataEventType)eventType { + return NO; +} + +- (FDataEvent *)createEventFrom:(FChange *)change query:(FQuerySpec *)query { + [NSException + raise:NSInternalInconsistencyException + format:@"Should never create event for FKeepSyncedEventRegistration"]; + return nil; +} + +- (void)fireEvent:(id)event queue:(dispatch_queue_t)queue { + [NSException + raise:NSInternalInconsistencyException + format:@"Should never raise event for FKeepSyncedEventRegistration"]; +} + +- (FCancelEvent *)createCancelEventFromError:(NSError *)error + path:(FPath *)path { + // Don't create cancel events.... + return nil; +} + +- (FIRDatabaseHandle)handle { + // TODO[offline]: returning arbitray, can't return NSNotFound since that is + // used to match other event registrations We should really redo this to + // match on different kind of events (single observer, all observers, + // cancelled) rather than on a NSNotFound handle... + return NSNotFound - 1; +} + +- (BOOL)matches:(id)other { + // Only matches singleton instance + return self == other; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FValueEventRegistration.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FValueEventRegistration.h new file mode 100644 index 00000000..819febec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FValueEventRegistration.h @@ -0,0 +1,34 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FEventRegistration.h" +#import "FTypedefs.h" +#import + +@class FRepo; + +@interface FValueEventRegistration : NSObject + +- (id)initWithRepo:(FRepo *)repo + handle:(FIRDatabaseHandle)fHandle + callback:(fbt_void_datasnapshot)callbackBlock + cancelCallback:(fbt_void_nserror)cancelCallbackBlock; + +@property(nonatomic, copy, readonly) fbt_void_datasnapshot callback; +@property(nonatomic, copy, readonly) fbt_void_nserror cancelCallback; +@property(nonatomic, readonly) FIRDatabaseHandle handle; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FValueEventRegistration.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FValueEventRegistration.m new file mode 100644 index 00000000..21cf3155 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FValueEventRegistration.m @@ -0,0 +1,102 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FValueEventRegistration.h" +#import "FCancelEvent.h" +#import "FDataEvent.h" +#import "FIRDataSnapshot_Private.h" +#import "FIRDatabaseQuery_Private.h" +#import "FQueryParams.h" +#import "FQuerySpec.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +@interface FValueEventRegistration () +@property(nonatomic, strong) FRepo *repo; +@property(nonatomic, copy, readwrite) fbt_void_datasnapshot callback; +@property(nonatomic, copy, readwrite) fbt_void_nserror cancelCallback; +@property(nonatomic, readwrite) FIRDatabaseHandle handle; +@end + +@implementation FValueEventRegistration + +- (id)initWithRepo:(FRepo *)repo + handle:(FIRDatabaseHandle)fHandle + callback:(fbt_void_datasnapshot)callbackBlock + cancelCallback:(fbt_void_nserror)cancelCallbackBlock { + self = [super init]; + if (self) { + self.repo = repo; + self.handle = fHandle; + self.callback = callbackBlock; + self.cancelCallback = cancelCallbackBlock; + } + return self; +} + +- (BOOL)responseTo:(FIRDataEventType)eventType { + return eventType == FIRDataEventTypeValue; +} + +- (FDataEvent *)createEventFrom:(FChange *)change query:(FQuerySpec *)query { + FIRDatabaseReference *ref = + [[FIRDatabaseReference alloc] initWithRepo:self.repo path:query.path]; + FIRDataSnapshot *snapshot = + [[FIRDataSnapshot alloc] initWithRef:ref + indexedNode:change.indexedNode]; + FDataEvent *eventData = + [[FDataEvent alloc] initWithEventType:FIRDataEventTypeValue + eventRegistration:self + dataSnapshot:snapshot]; + return eventData; +} + +- (void)fireEvent:(id)event queue:(dispatch_queue_t)queue { + if ([event isCancelEvent]) { + FCancelEvent *cancelEvent = event; + FFLog(@"I-RDB065001", @"Raising cancel value event on %@", event.path); + NSAssert( + self.cancelCallback != nil, + @"Raising a cancel event on a listener with no cancel callback"); + dispatch_async(queue, ^{ + self.cancelCallback(cancelEvent.error); + }); + } else if (self.callback != nil) { + FDataEvent *dataEvent = event; + FFLog(@"I-RDB065002", @"Raising value event on %@", + dataEvent.snapshot.key); + dispatch_async(queue, ^{ + self.callback(dataEvent.snapshot); + }); + } +} + +- (FCancelEvent *)createCancelEventFromError:(NSError *)error + path:(FPath *)path { + if (self.cancelCallback != nil) { + return [[FCancelEvent alloc] initWithEventRegistration:self + error:error + path:path]; + } else { + return nil; + } +} + +- (BOOL)matches:(id)other { + return self.handle == NSNotFound || other.handle == NSNotFound || + self.handle == other.handle; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FView.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FView.h new file mode 100644 index 00000000..0b4b9d89 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FView.h @@ -0,0 +1,56 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FNode; +@protocol FOperation; +@protocol FEventRegistration; +@class FWriteTreeRef; +@class FQuerySpec; +@class FChange; +@class FPath; +@class FViewCache; + +@interface FViewOperationResult : NSObject + +@property(nonatomic, strong, readonly) NSArray *changes; +@property(nonatomic, strong, readonly) NSArray *events; + +@end + +@interface FView : NSObject + +@property(nonatomic, strong, readonly) FQuerySpec *query; + +- (id)initWithQuery:(FQuerySpec *)query + initialViewCache:(FViewCache *)initialViewCache; + +- (id)eventCache; +- (id)serverCache; +- (id)completeServerCacheFor:(FPath *)path; +- (BOOL)isEmpty; + +- (void)addEventRegistration:(id)eventRegistration; +- (NSArray *)removeEventRegistration:(id)eventRegistration + cancelError:(NSError *)cancelError; + +- (FViewOperationResult *)applyOperation:(id)operation + writesCache:(FWriteTreeRef *)writesCache + serverCache:(id)optCompleteServerCache; +- (NSArray *)initialEvents:(id)registration; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FView.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FView.m new file mode 100644 index 00000000..a15e13d9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FView.m @@ -0,0 +1,266 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FView.h" +#import "FCacheNode.h" +#import "FCancelEvent.h" +#import "FEmptyNode.h" +#import "FEventGenerator.h" +#import "FEventRegistration.h" +#import "FIRDatabaseQuery.h" +#import "FIRDatabaseQuery_Private.h" +#import "FIndexedFilter.h" +#import "FIndexedNode.h" +#import "FNode.h" +#import "FOperation.h" +#import "FOperationSource.h" +#import "FPath.h" +#import "FQueryParams.h" +#import "FQuerySpec.h" +#import "FViewCache.h" +#import "FViewProcessor.h" +#import "FViewProcessorResult.h" +#import "FWriteTreeRef.h" + +@interface FViewOperationResult () + +@property(nonatomic, strong, readwrite) NSArray *changes; +@property(nonatomic, strong, readwrite) NSArray *events; + +@end + +@implementation FViewOperationResult + +- (id)initWithChanges:(NSArray *)changes events:(NSArray *)events { + self = [super init]; + if (self != nil) { + self->_changes = changes; + self->_events = events; + } + return self; +} + +@end + +/** + * A view represents a specific location and query that has 1 or more event + * registrations. + * + * It does several things: + * - Maintains the list of event registration for this location/query. + * - Maintains a cache of the data visible for this location/query. + * - Applies new operations (via applyOperation), updates the cache, and based + * on the event registrations returns the set of events to be raised. + */ +@interface FView () + +@property(nonatomic, strong, readwrite) FQuerySpec *query; +@property(nonatomic, strong) FViewProcessor *processor; +@property(nonatomic, strong) FViewCache *viewCache; +@property(nonatomic, strong) NSMutableArray *eventRegistrations; +@property(nonatomic, strong) FEventGenerator *eventGenerator; + +@end + +@implementation FView +- (id)initWithQuery:(FQuerySpec *)query + initialViewCache:(FViewCache *)initialViewCache { + self = [super init]; + if (self) { + self.query = query; + + FIndexedFilter *indexFilter = + [[FIndexedFilter alloc] initWithIndex:query.index]; + id filter = query.params.nodeFilter; + self.processor = [[FViewProcessor alloc] initWithFilter:filter]; + FCacheNode *initialServerCache = initialViewCache.cachedServerSnap; + FCacheNode *initialEventCache = initialViewCache.cachedEventSnap; + + // Don't filter server node with other filter than index, wait for + // tagged listen + FIndexedNode *emptyIndexedNode = + [FIndexedNode indexedNodeWithNode:[FEmptyNode emptyNode] + index:query.index]; + FIndexedNode *serverSnap = + [indexFilter updateFullNode:emptyIndexedNode + withNewNode:initialServerCache.indexedNode + accumulator:nil]; + FIndexedNode *eventSnap = + [filter updateFullNode:emptyIndexedNode + withNewNode:initialEventCache.indexedNode + accumulator:nil]; + FCacheNode *newServerCache = [[FCacheNode alloc] + initWithIndexedNode:serverSnap + isFullyInitialized:initialServerCache.isFullyInitialized + isFiltered:indexFilter.filtersNodes]; + FCacheNode *newEventCache = [[FCacheNode alloc] + initWithIndexedNode:eventSnap + isFullyInitialized:initialEventCache.isFullyInitialized + isFiltered:filter.filtersNodes]; + + self.viewCache = [[FViewCache alloc] initWithEventCache:newEventCache + serverCache:newServerCache]; + + self.eventRegistrations = [[NSMutableArray alloc] init]; + + self.eventGenerator = [[FEventGenerator alloc] initWithQuery:query]; + } + + return self; +} + +- (id)serverCache { + return self.viewCache.cachedServerSnap.node; +} + +- (id)eventCache { + return self.viewCache.cachedEventSnap.node; +} + +- (id)completeServerCacheFor:(FPath *)path { + id cache = self.viewCache.completeServerSnap; + if (cache) { + // If this isn't a "loadsAllData" view, then cache isn't actually a + // complete cache and we need to see if it contains the child we're + // interested in. + if ([self.query loadsAllData] || + (!path.isEmpty && + ![cache getImmediateChild:path.getFront].isEmpty)) { + return [cache getChild:path]; + } + } + return nil; +} + +- (BOOL)isEmpty { + return self.eventRegistrations.count == 0; +} + +- (void)addEventRegistration:(id)eventRegistration { + [self.eventRegistrations addObject:eventRegistration]; +} + +/** + * @param eventRegistration If null, remove all callbacks. + * @param cancelError If a cancelError is provided, appropriate cancel events + * will be returned. + * @return Cancel events, if cancelError was provided. + */ +- (NSArray *)removeEventRegistration:(id)eventRegistration + cancelError:(NSError *)cancelError { + NSMutableArray *cancelEvents = [[NSMutableArray alloc] init]; + if (cancelError != nil) { + NSAssert(eventRegistration == nil, + @"A cancel should cancel all event registrations."); + FPath *path = self.query.path; + for (id registration in self.eventRegistrations) { + FCancelEvent *maybeEvent = + [registration createCancelEventFromError:cancelError path:path]; + if (maybeEvent) { + [cancelEvents addObject:maybeEvent]; + } + } + } + + if (eventRegistration) { + NSUInteger i = 0; + while (i < self.eventRegistrations.count) { + id existing = self.eventRegistrations[i]; + if ([existing matches:eventRegistration]) { + [self.eventRegistrations removeObjectAtIndex:i]; + } else { + i++; + } + } + } else { + [self.eventRegistrations removeAllObjects]; + } + return cancelEvents; +} + +/** + * Applies the given Operation, updates our cache, and returns the appropriate + * events and changes + */ +- (FViewOperationResult *)applyOperation:(id)operation + writesCache:(FWriteTreeRef *)writesCache + serverCache:(id)optCompleteServerCache { + if (operation.type == FOperationTypeMerge && + operation.source.queryParams != nil) { + NSAssert(self.viewCache.completeServerSnap != nil, + @"We should always have a full cache before handling merges"); + NSAssert(self.viewCache.completeEventSnap != nil, + @"Missing event cache, even though we have a server cache"); + } + FViewCache *oldViewCache = self.viewCache; + FViewProcessorResult *result = + [self.processor applyOperationOn:oldViewCache + operation:operation + writesCache:writesCache + completeCache:optCompleteServerCache]; + + NSAssert(result.viewCache.cachedServerSnap.isFullyInitialized || + !oldViewCache.cachedServerSnap.isFullyInitialized, + @"Once a server snap is complete, it should never go back."); + + self.viewCache = result.viewCache; + NSArray *events = [self + generateEventsForChanges:result.changes + eventCache:result.viewCache.cachedEventSnap.indexedNode + registration:nil]; + return [[FViewOperationResult alloc] initWithChanges:result.changes + events:events]; +} + +- (NSArray *)initialEvents:(id)registration { + FCacheNode *eventSnap = self.viewCache.cachedEventSnap; + NSMutableArray *initialChanges = [[NSMutableArray alloc] init]; + [eventSnap.indexedNode.node enumerateChildrenUsingBlock:^( + NSString *key, id node, BOOL *stop) { + FIndexedNode *indexed = [FIndexedNode indexedNodeWithNode:node]; + FChange *change = [[FChange alloc] initWithType:FIRDataEventTypeChildAdded + indexedNode:indexed + childKey:key]; + [initialChanges addObject:change]; + }]; + if (eventSnap.isFullyInitialized) { + FChange *change = [[FChange alloc] initWithType:FIRDataEventTypeValue + indexedNode:eventSnap.indexedNode]; + [initialChanges addObject:change]; + } + return [self generateEventsForChanges:initialChanges + eventCache:eventSnap.indexedNode + registration:registration]; +} + +- (NSArray *)generateEventsForChanges:(NSArray *)changes + eventCache:(FIndexedNode *)eventCache + registration:(id)registration { + NSArray *registrations; + if (registration == nil) { + registrations = [[NSArray alloc] initWithArray:self.eventRegistrations]; + } else { + registrations = [[NSArray alloc] initWithObjects:registration, nil]; + } + return [self.eventGenerator generateEventsForChanges:changes + eventCache:eventCache + eventRegistrations:registrations]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"FView (%@)", self.query]; +} +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FViewCache.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FViewCache.h new file mode 100644 index 00000000..62618d2b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FViewCache.h @@ -0,0 +1,40 @@ +#/* +* Copyright 2017 Google +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#import + +@protocol FNode; +@class FCacheNode; +@class FIndexedNode; + +@interface FViewCache : NSObject + +- (id)initWithEventCache:(FCacheNode *)eventCache + serverCache:(FCacheNode *)serverCache; + +- (FViewCache *)updateEventSnap:(FIndexedNode *)eventSnap + isComplete:(BOOL)complete + isFiltered:(BOOL)filtered; +- (FViewCache *)updateServerSnap:(FIndexedNode *)serverSnap + isComplete:(BOOL)complete + isFiltered:(BOOL)filtered; + +@property(nonatomic, strong, readonly) FCacheNode *cachedEventSnap; +@property(nonatomic, strong, readonly) id completeEventSnap; +@property(nonatomic, strong, readonly) FCacheNode *cachedServerSnap; +@property(nonatomic, strong, readonly) id completeServerSnap; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FViewCache.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FViewCache.m new file mode 100644 index 00000000..13e9283d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/FViewCache.m @@ -0,0 +1,72 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FViewCache.h" +#import "FCacheNode.h" +#import "FEmptyNode.h" +#import "FNode.h" + +@interface FViewCache () +@property(nonatomic, strong, readwrite) FCacheNode *cachedEventSnap; +@property(nonatomic, strong, readwrite) FCacheNode *cachedServerSnap; +@end + +@implementation FViewCache + +- (id)initWithEventCache:(FCacheNode *)eventCache + serverCache:(FCacheNode *)serverCache { + self = [super init]; + if (self) { + self.cachedEventSnap = eventCache; + self.cachedServerSnap = serverCache; + } + return self; +} + +- (FViewCache *)updateEventSnap:(FIndexedNode *)eventSnap + isComplete:(BOOL)complete + isFiltered:(BOOL)filtered { + FCacheNode *updatedEventCache = + [[FCacheNode alloc] initWithIndexedNode:eventSnap + isFullyInitialized:complete + isFiltered:filtered]; + return [[FViewCache alloc] initWithEventCache:updatedEventCache + serverCache:self.cachedServerSnap]; +} + +- (FViewCache *)updateServerSnap:(FIndexedNode *)serverSnap + isComplete:(BOOL)complete + isFiltered:(BOOL)filtered { + FCacheNode *updatedServerCache = + [[FCacheNode alloc] initWithIndexedNode:serverSnap + isFullyInitialized:complete + isFiltered:filtered]; + return [[FViewCache alloc] initWithEventCache:self.cachedEventSnap + serverCache:updatedServerCache]; +} + +- (id)completeEventSnap { + return (self.cachedEventSnap.isFullyInitialized) ? self.cachedEventSnap.node + : nil; +} + +- (id)completeServerSnap { + return (self.cachedServerSnap.isFullyInitialized) + ? self.cachedServerSnap.node + : nil; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FChildChangeAccumulator.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FChildChangeAccumulator.h new file mode 100644 index 00000000..bf25163c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FChildChangeAccumulator.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FChange; + +@interface FChildChangeAccumulator : NSObject + +- (id)init; +- (void)trackChildChange:(FChange *)change; +- (NSArray *)changes; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FChildChangeAccumulator.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FChildChangeAccumulator.m new file mode 100644 index 00000000..e35c2e2d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FChildChangeAccumulator.m @@ -0,0 +1,99 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FChildChangeAccumulator.h" +#import "FChange.h" +#import "FIndex.h" + +@interface FChildChangeAccumulator () +@property(nonatomic, strong) NSMutableDictionary *changeMap; +@end + +@implementation FChildChangeAccumulator + +- (id)init { + self = [super init]; + if (self) { + self.changeMap = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (void)trackChildChange:(FChange *)change { + FIRDataEventType type = change.type; + NSString *childKey = change.childKey; + NSAssert(type == FIRDataEventTypeChildAdded || + type == FIRDataEventTypeChildChanged || + type == FIRDataEventTypeChildRemoved, + @"Only child changes supported for tracking."); + NSAssert(![change.childKey isEqualToString:@".priority"], + @"Changes not tracked on priority"); + if (self.changeMap[childKey] != nil) { + FChange *oldChange = [self.changeMap objectForKey:childKey]; + FIRDataEventType oldType = oldChange.type; + if (type == FIRDataEventTypeChildAdded && + oldType == FIRDataEventTypeChildRemoved) { + FChange *newChange = + [[FChange alloc] initWithType:FIRDataEventTypeChildChanged + indexedNode:change.indexedNode + childKey:childKey + oldIndexedNode:oldChange.indexedNode]; + [self.changeMap setObject:newChange forKey:childKey]; + } else if (type == FIRDataEventTypeChildRemoved && + oldType == FIRDataEventTypeChildAdded) { + [self.changeMap removeObjectForKey:childKey]; + } else if (type == FIRDataEventTypeChildRemoved && + oldType == FIRDataEventTypeChildChanged) { + FChange *newChange = + [[FChange alloc] initWithType:FIRDataEventTypeChildRemoved + indexedNode:oldChange.oldIndexedNode + childKey:childKey]; + [self.changeMap setObject:newChange forKey:childKey]; + } else if (type == FIRDataEventTypeChildChanged && + oldType == FIRDataEventTypeChildAdded) { + FChange *newChange = + [[FChange alloc] initWithType:FIRDataEventTypeChildAdded + indexedNode:change.indexedNode + childKey:childKey]; + [self.changeMap setObject:newChange forKey:childKey]; + } else if (type == FIRDataEventTypeChildChanged && + oldType == FIRDataEventTypeChildChanged) { + FChange *newChange = + [[FChange alloc] initWithType:FIRDataEventTypeChildChanged + indexedNode:change.indexedNode + childKey:childKey + oldIndexedNode:oldChange.oldIndexedNode]; + [self.changeMap setObject:newChange forKey:childKey]; + } else { + NSString *reason = [NSString + stringWithFormat: + @"Illegal combination of changes: %@ occurred after %@", + change, oldChange]; + @throw [[NSException alloc] + initWithName:@"FirebaseDatabaseInternalError" + reason:reason + userInfo:nil]; + } + } else { + [self.changeMap setObject:change forKey:childKey]; + } +} + +- (NSArray *)changes { + return [self.changeMap allValues]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FCompleteChildSource.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FCompleteChildSource.h new file mode 100644 index 00000000..0c04bc14 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FCompleteChildSource.h @@ -0,0 +1,30 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FNode; +@class FNamedNode; +@protocol FIndex; + +@protocol FCompleteChildSource + +- (id)completeChild:(NSString *)childKey; +- (FNamedNode *)childByIndex:(id)index + afterChild:(FNamedNode *)child + isReverse:(BOOL)reverse; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FIndexedFilter.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FIndexedFilter.h new file mode 100644 index 00000000..291e79af --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FIndexedFilter.h @@ -0,0 +1,26 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNodeFilter.h" +#import + +@protocol FIndex; + +@interface FIndexedFilter : NSObject + +- (id)initWithIndex:(id)theIndex; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FIndexedFilter.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FIndexedFilter.m new file mode 100644 index 00000000..f49af79e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FIndexedFilter.m @@ -0,0 +1,164 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIndexedFilter.h" +#import "FChange.h" +#import "FChildChangeAccumulator.h" +#import "FChildrenNode.h" +#import "FEmptyNode.h" +#import "FIndex.h" +#import "FIndexedNode.h" +#import "FKeyIndex.h" +#import "FNode.h" + +@interface FIndexedFilter () +@property(nonatomic, strong, readwrite) id index; +@end + +@implementation FIndexedFilter +- (id)initWithIndex:(id)theIndex { + self = [super init]; + if (self) { + self.index = theIndex; + } + return self; +} + +- (FIndexedNode *)updateChildIn:(FIndexedNode *)indexedNode + forChildKey:(NSString *)childKey + newChild:(id)newChildSnap + affectedPath:(FPath *)affectedPath + fromSource:(id)source + accumulator: + (FChildChangeAccumulator *)optChangeAccumulator { + NSAssert([indexedNode hasIndex:self.index], + @"The index in FIndexedNode must match the index of the filter"); + id node = indexedNode.node; + id oldChildSnap = [node getImmediateChild:childKey]; + + // Check if anything actually changed. + if ([[oldChildSnap getChild:affectedPath] + isEqual:[newChildSnap getChild:affectedPath]]) { + // There's an edge case where a child can enter or leave the view + // because affectedPath was set to null. In this case, affectedPath will + // appear null in both the old and new snapshots. So we need to avoid + // treating these cases as "nothing changed." + if (oldChildSnap.isEmpty == newChildSnap.isEmpty) { +// Nothing changed. +#ifdef DEBUG + NSAssert([oldChildSnap isEqual:newChildSnap], + @"Old and new snapshots should be equal."); +#endif + + return indexedNode; + } + } + if (optChangeAccumulator) { + if (newChildSnap.isEmpty) { + if ([node hasChild:childKey]) { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildRemoved + indexedNode:[FIndexedNode indexedNodeWithNode:oldChildSnap] + childKey:childKey]; + [optChangeAccumulator trackChildChange:change]; + } else { + NSAssert(node.isLeafNode, + @"A child remove without an old child only makes " + @"sense on a leaf node."); + } + } else if (oldChildSnap.isEmpty) { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildAdded + indexedNode:[FIndexedNode indexedNodeWithNode:newChildSnap] + childKey:childKey]; + [optChangeAccumulator trackChildChange:change]; + } else { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildChanged + indexedNode:[FIndexedNode indexedNodeWithNode:newChildSnap] + childKey:childKey + oldIndexedNode:[FIndexedNode indexedNodeWithNode:oldChildSnap]]; + [optChangeAccumulator trackChildChange:change]; + } + } + if (node.isLeafNode && newChildSnap.isEmpty) { + return indexedNode; + } else { + return [indexedNode updateChild:childKey withNewChild:newChildSnap]; + } +} + +- (FIndexedNode *)updateFullNode:(FIndexedNode *)oldSnap + withNewNode:(FIndexedNode *)newSnap + accumulator: + (FChildChangeAccumulator *)optChangeAccumulator { + if (optChangeAccumulator) { + [oldSnap.node enumerateChildrenUsingBlock:^( + NSString *childKey, id childNode, BOOL *stop) { + if (![newSnap.node hasChild:childKey]) { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildRemoved + indexedNode:[FIndexedNode indexedNodeWithNode:childNode] + childKey:childKey]; + [optChangeAccumulator trackChildChange:change]; + } + }]; + + [newSnap.node enumerateChildrenUsingBlock:^( + NSString *childKey, id childNode, BOOL *stop) { + if ([oldSnap.node hasChild:childKey]) { + id oldChildSnap = + [oldSnap.node getImmediateChild:childKey]; + if (![oldChildSnap isEqual:childNode]) { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildChanged + indexedNode:[FIndexedNode + indexedNodeWithNode:childNode] + childKey:childKey + oldIndexedNode:[FIndexedNode + indexedNodeWithNode:oldChildSnap]]; + [optChangeAccumulator trackChildChange:change]; + } + } else { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildAdded + indexedNode:[FIndexedNode indexedNodeWithNode:childNode] + childKey:childKey]; + [optChangeAccumulator trackChildChange:change]; + } + }]; + } + return newSnap; +} + +- (FIndexedNode *)updatePriority:(id)priority + forNode:(FIndexedNode *)oldSnap { + if ([oldSnap.node isEmpty]) { + return oldSnap; + } else { + return [oldSnap updatePriority:priority]; + } +} + +- (BOOL)filtersNodes { + return NO; +} + +- (id)indexedFilter { + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FLimitedFilter.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FLimitedFilter.h new file mode 100644 index 00000000..0642e724 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FLimitedFilter.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNodeFilter.h" +#import + +@class FQueryParams; + +@interface FLimitedFilter : NSObject + +- (id)initWithQueryParams:(FQueryParams *)params; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FLimitedFilter.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FLimitedFilter.m new file mode 100644 index 00000000..fab9aab1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FLimitedFilter.m @@ -0,0 +1,285 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FLimitedFilter.h" +#import "FChange.h" +#import "FChildChangeAccumulator.h" +#import "FChildrenNode.h" +#import "FCompleteChildSource.h" +#import "FEmptyNode.h" +#import "FIndex.h" +#import "FNamedNode.h" +#import "FQueryParams.h" +#import "FRangedFilter.h" +#import "FTreeSortedDictionary.h" + +@interface FLimitedFilter () +@property(nonatomic, strong) FRangedFilter *rangedFilter; +@property(nonatomic, strong, readwrite) id index; +@property(nonatomic) NSInteger limit; +@property(nonatomic) BOOL reverse; + +@end + +@implementation FLimitedFilter +- (id)initWithQueryParams:(FQueryParams *)params { + self = [super init]; + if (self) { + self.rangedFilter = [[FRangedFilter alloc] initWithQueryParams:params]; + self.index = params.index; + self.limit = params.limit; + self.reverse = !params.isViewFromLeft; + } + return self; +} + +- (FIndexedNode *)updateChildIn:(FIndexedNode *)oldSnap + forChildKey:(NSString *)childKey + newChild:(id)newChildSnap + affectedPath:(FPath *)affectedPath + fromSource:(id)source + accumulator: + (FChildChangeAccumulator *)optChangeAccumulator { + if (![self.rangedFilter matchesKey:childKey andNode:newChildSnap]) { + newChildSnap = [FEmptyNode emptyNode]; + } + if ([[oldSnap.node getImmediateChild:childKey] isEqual:newChildSnap]) { + // No change + return oldSnap; + } else if (oldSnap.node.numChildren < self.limit) { + return [[self.rangedFilter indexedFilter] + updateChildIn:oldSnap + forChildKey:childKey + newChild:newChildSnap + affectedPath:affectedPath + fromSource:source + accumulator:optChangeAccumulator]; + } else { + return [self fullLimitUpdateNode:oldSnap + forChildKey:childKey + newChild:newChildSnap + fromSource:source + accumulator:optChangeAccumulator]; + } +} + +- (FIndexedNode *)fullLimitUpdateNode:(FIndexedNode *)oldIndexed + forChildKey:(NSString *)childKey + newChild:(id)newChildSnap + fromSource:(id)source + accumulator: + (FChildChangeAccumulator *)optChangeAccumulator { + NSAssert(oldIndexed.node.numChildren == self.limit, + @"Should have number of children equal to limit."); + + FNamedNode *windowBoundary = + self.reverse ? oldIndexed.firstChild : oldIndexed.lastChild; + + BOOL inRange = [self.rangedFilter matchesKey:childKey andNode:newChildSnap]; + if ([oldIndexed.node hasChild:childKey]) { + // `childKey` was already in `oldSnap`. Figure out if it remains in the + // window or needs to be replaced. + id oldChildSnap = [oldIndexed.node getImmediateChild:childKey]; + + // In case the `newChildSnap` falls outside the window, get the + // `nextChild` that might replace it. + FNamedNode *nextChild = [source childByIndex:self.index + afterChild:windowBoundary + isReverse:(BOOL)self.reverse]; + if (nextChild != nil && ([nextChild.name isEqualToString:childKey] || + [oldIndexed.node hasChild:nextChild.name])) { + // There is a weird edge case where a node is updated as part of a + // merge in the write tree, but hasn't been applied to the limited + // filter yet. Ignore this next child which will be updated later in + // the limited filter... + nextChild = [source childByIndex:self.index + afterChild:nextChild + isReverse:self.reverse]; + } + + // Figure out if `newChildSnap` is in range and ordered before + // `nextChild` + BOOL remainsInWindow = inRange && !newChildSnap.isEmpty; + remainsInWindow = remainsInWindow && + (!nextChild || [self.index compareKey:nextChild.name + andNode:nextChild.node + toOtherKey:childKey + andNode:newChildSnap + reverse:self.reverse] >= + NSOrderedSame); + if (remainsInWindow) { + // `newChildSnap` is ordered before `nextChild`, so it's a child + // changed event + if (optChangeAccumulator != nil) { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildChanged + indexedNode:[FIndexedNode + indexedNodeWithNode:newChildSnap] + childKey:childKey + oldIndexedNode:[FIndexedNode + indexedNodeWithNode:oldChildSnap]]; + [optChangeAccumulator trackChildChange:change]; + } + return [oldIndexed updateChild:childKey withNewChild:newChildSnap]; + } else { + // `newChildSnap` is ordered after `nextChild`, so it's a child + // removed event + if (optChangeAccumulator != nil) { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildRemoved + indexedNode:[FIndexedNode indexedNodeWithNode:oldChildSnap] + childKey:childKey]; + [optChangeAccumulator trackChildChange:change]; + } + FIndexedNode *newIndexed = + [oldIndexed updateChild:childKey + withNewChild:[FEmptyNode emptyNode]]; + + // We need to check if the `nextChild` is actually in range before + // adding it + BOOL nextChildInRange = + (nextChild != nil) && + [self.rangedFilter matchesKey:nextChild.name + andNode:nextChild.node]; + if (nextChildInRange) { + if (optChangeAccumulator != nil) { + FChange *change = [[FChange alloc] + initWithType:FIRDataEventTypeChildAdded + indexedNode:[FIndexedNode + indexedNodeWithNode:nextChild.node] + childKey:nextChild.name]; + [optChangeAccumulator trackChildChange:change]; + } + return [newIndexed updateChild:nextChild.name + withNewChild:nextChild.node]; + } else { + return newIndexed; + } + } + } else if (newChildSnap.isEmpty) { + // We're deleting a node, but it was not in the window, so ignore it. + return oldIndexed; + } else if (inRange) { + // `newChildSnap` is in range, but was ordered after `windowBoundary`. + // If this has changed, we bump out the `windowBoundary` and add the + // `newChildSnap` + if ([self.index compareKey:windowBoundary.name + andNode:windowBoundary.node + toOtherKey:childKey + andNode:newChildSnap + reverse:self.reverse] >= NSOrderedSame) { + if (optChangeAccumulator != nil) { + FChange *removedChange = [[FChange alloc] + initWithType:FIRDataEventTypeChildRemoved + indexedNode:[FIndexedNode + indexedNodeWithNode:windowBoundary.node] + childKey:windowBoundary.name]; + FChange *addedChange = [[FChange alloc] + initWithType:FIRDataEventTypeChildAdded + indexedNode:[FIndexedNode indexedNodeWithNode:newChildSnap] + childKey:childKey]; + [optChangeAccumulator trackChildChange:removedChange]; + [optChangeAccumulator trackChildChange:addedChange]; + } + return [[oldIndexed updateChild:childKey withNewChild:newChildSnap] + updateChild:windowBoundary.name + withNewChild:[FEmptyNode emptyNode]]; + } else { + return oldIndexed; + } + } else { + // `newChildSnap` was not in range and remains not in range, so ignore + // it. + return oldIndexed; + } +} + +- (FIndexedNode *)updateFullNode:(FIndexedNode *)oldSnap + withNewNode:(FIndexedNode *)newSnap + accumulator: + (FChildChangeAccumulator *)optChangeAccumulator { + __block FIndexedNode *filtered; + if (newSnap.node.isLeafNode || newSnap.node.isEmpty) { + // Make sure we have a children node with the correct index, not a leaf + // node + filtered = [FIndexedNode indexedNodeWithNode:[FEmptyNode emptyNode] + index:self.index]; + } else { + filtered = newSnap; + // Don't support priorities on queries. + filtered = [filtered updatePriority:[FEmptyNode emptyNode]]; + FNamedNode *startPost = nil; + FNamedNode *endPost = nil; + if (self.reverse) { + startPost = self.rangedFilter.endPost; + endPost = self.rangedFilter.startPost; + } else { + startPost = self.rangedFilter.startPost; + endPost = self.rangedFilter.endPost; + } + __block BOOL foundStartPost = NO; + __block NSUInteger count = 0; + [newSnap + enumerateChildrenReverse:self.reverse + usingBlock:^(NSString *childKey, id childNode, + BOOL *stop) { + if (!foundStartPost && + [self.index + compareKey:startPost.name + andNode:startPost.node + toOtherKey:childKey + andNode:childNode + reverse:self.reverse] <= NSOrderedSame) { + // Start adding + foundStartPost = YES; + } + BOOL inRange = foundStartPost && count < self.limit; + inRange = inRange && + [self.index compareKey:childKey + andNode:childNode + toOtherKey:endPost.name + andNode:endPost.node + reverse:self.reverse] <= + NSOrderedSame; + if (inRange) { + count++; + } else { + filtered = [filtered + updateChild:childKey + withNewChild:[FEmptyNode emptyNode]]; + } + }]; + } + return [self.indexedFilter updateFullNode:oldSnap + withNewNode:filtered + accumulator:optChangeAccumulator]; +} + +- (FIndexedNode *)updatePriority:(id)priority + forNode:(FIndexedNode *)oldSnap { + // Don't support priorities on queries. + return oldSnap; +} + +- (BOOL)filtersNodes { + return YES; +} + +- (id)indexedFilter { + return self.rangedFilter.indexedFilter; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FNodeFilter.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FNodeFilter.h new file mode 100644 index 00000000..d19c6fb9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Core/View/Filter/FNodeFilter.h @@ -0,0 +1,77 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FNode; +@class FIndexedNode; +@protocol FCompleteChildSource; +@class FChildChangeAccumulator; +@protocol FIndex; +@class FPath; + +/** + * FNodeFilter is used to update nodes and complete children of nodes while + * applying queries on the fly and keeping track of any child changes. This + * class does not track value changes as value changes depend on more than just + * the node itself. Different kind of queries require different kind of + * implementations of this interface. + */ +@protocol FNodeFilter + +/** + * Update a single complete child in the snap. If the child equals the old child + * in the snap, this is a no-op. The method expects an indexed snap. + */ +- (FIndexedNode *)updateChildIn:(FIndexedNode *)oldSnap + forChildKey:(NSString *)childKey + newChild:(id)newChildSnap + affectedPath:(FPath *)affectedPath + fromSource:(id)source + accumulator:(FChildChangeAccumulator *)optChangeAccumulator; + +/** + * Update a node in full and output any resulting change from this complete + * update. + */ +- (FIndexedNode *)updateFullNode:(FIndexedNode *)oldSnap + withNewNode:(FIndexedNode *)newSnap + accumulator: + (FChildChangeAccumulator *)optChangeAccumulator; + +/** + * Update the priority of the root node + */ +- (FIndexedNode *)updatePriority:(id)priority + forNode:(FIndexedNode *)oldSnap; + +/** + * Returns true if children might be filtered due to query critiera + */ +- (BOOL)filtersNodes; + +/** + * Returns the index filter that this filter uses to get a NodeFilter that + * doesn't filter any children. + */ +@property(nonatomic, strong, readonly) id indexedFilter; + +/** + * Returns the index that this filter uses + */ +@property(nonatomic, strong, readonly) id index; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FClock.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FClock.h new file mode 100644 index 00000000..e85cb2a5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FClock.h @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FClock + +- (NSTimeInterval)currentTime; + +@end + +@interface FSystemClock : NSObject + ++ (FSystemClock *)clock; + +@end + +@interface FOffsetClock : NSObject + +- (id)initWithClock:(id)clock offset:(NSTimeInterval)offset; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FClock.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FClock.m new file mode 100644 index 00000000..5d9a9ecd --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FClock.m @@ -0,0 +1,58 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FClock.h" + +@implementation FSystemClock + +- (NSTimeInterval)currentTime { + return [[NSDate date] timeIntervalSince1970]; +} + ++ (FSystemClock *)clock { + static dispatch_once_t onceToken; + static FSystemClock *clock; + dispatch_once(&onceToken, ^{ + clock = [[FSystemClock alloc] init]; + }); + return clock; +} + +@end + +@interface FOffsetClock () + +@property(nonatomic, strong) id clock; +@property(nonatomic) NSTimeInterval offset; + +@end + +@implementation FOffsetClock + +- (NSTimeInterval)currentTime { + return [self.clock currentTime] + self.offset; +} + +- (id)initWithClock:(id)clock offset:(NSTimeInterval)offset { + self = [super init]; + if (self != nil) { + self->_clock = clock; + self->_offset = offset; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FEventGenerator.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FEventGenerator.h new file mode 100644 index 00000000..443664ec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FEventGenerator.h @@ -0,0 +1,28 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FQuerySpec; +@class FIndexedNode; +@protocol FNode; + +@interface FEventGenerator : NSObject +- (id)initWithQuery:(FQuerySpec *)query; +- (NSArray *)generateEventsForChanges:(NSArray *)changes + eventCache:(FIndexedNode *)eventCache + eventRegistrations:(NSArray *)registrations; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FEventGenerator.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FEventGenerator.m new file mode 100644 index 00000000..162b0ac3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FEventGenerator.m @@ -0,0 +1,169 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FEventGenerator.h" +#import "FChange.h" +#import "FDataEvent.h" +#import "FEvent.h" +#import "FEventRegistration.h" +#import "FIRDatabaseQuery_Private.h" +#import "FNamedNode.h" +#import "FNode.h" +#import "FQueryParams.h" +#import "FQuerySpec.h" + +@interface FEventGenerator () +@property(nonatomic, strong) FQuerySpec *query; +@end + +/** + * An EventGenerator is used to convert "raw" changes (fb.core.view.Change) as + * computed by the CacheDiffer into actual events (fb.core.view.Event) that can + * be raised. See generateEventsForChanges() for details. + */ +@implementation FEventGenerator + +- (id)initWithQuery:(FQuerySpec *)query { + self = [super init]; + if (self) { + self.query = query; + } + return self; +} + +/** + * Given a set of raw changes (no moved events, and prevName not specified yet), + * and a set of EventRegistrations that should be notified of these changes, + * generate the actual events to be raised. + * + * Notes: + * - child_moved events will be synthesized at this time for any child_changed + * events that affect our index + * - prevName will be calculated based on the index ordering + * + * @param changes NSArray of FChange, not necessarily in order. + * @param registrations is NSArray of FEventRegistration. + * @return NSArray of FEvent. + */ +- (NSArray *)generateEventsForChanges:(NSArray *)changes + eventCache:(FIndexedNode *)eventCache + eventRegistrations:(NSArray *)registrations { + NSMutableArray *events = [[NSMutableArray alloc] init]; + + // child_moved is index-specific, so check all our child_changed events to + // see if we need to materialize child_moved events with this view's index + NSMutableArray *moves = [[NSMutableArray alloc] init]; + for (FChange *change in changes) { + if (change.type == FIRDataEventTypeChildChanged && + [self.query.index + indexedValueChangedBetween:change.oldIndexedNode.node + and:change.indexedNode.node]) { + FChange *moveChange = + [[FChange alloc] initWithType:FIRDataEventTypeChildMoved + indexedNode:change.indexedNode + childKey:change.childKey + oldIndexedNode:nil]; + [moves addObject:moveChange]; + } + } + + [self generateEvents:events + forType:FIRDataEventTypeChildRemoved + changes:changes + eventCache:eventCache + eventRegistrations:registrations]; + [self generateEvents:events + forType:FIRDataEventTypeChildAdded + changes:changes + eventCache:eventCache + eventRegistrations:registrations]; + [self generateEvents:events + forType:FIRDataEventTypeChildMoved + changes:moves + eventCache:eventCache + eventRegistrations:registrations]; + [self generateEvents:events + forType:FIRDataEventTypeChildChanged + changes:changes + eventCache:eventCache + eventRegistrations:registrations]; + [self generateEvents:events + forType:FIRDataEventTypeValue + changes:changes + eventCache:eventCache + eventRegistrations:registrations]; + + return events; +} + +- (void)generateEvents:(NSMutableArray *)events + forType:(FIRDataEventType)eventType + changes:(NSArray *)changes + eventCache:(FIndexedNode *)eventCache + eventRegistrations:(NSArray *)registrations { + NSMutableArray *filteredChanges = [[NSMutableArray alloc] init]; + for (FChange *change in changes) { + if (change.type == eventType) { + [filteredChanges addObject:change]; + } + } + + id index = self.query.index; + + [filteredChanges + sortUsingComparator:^NSComparisonResult(FChange *one, FChange *two) { + if (one.childKey == nil || two.childKey == nil) { + @throw [[NSException alloc] + initWithName:@"InternalInconsistencyError" + reason:@"Should only compare child_ events" + userInfo:nil]; + } + return [index compareKey:one.childKey + andNode:one.indexedNode.node + toOtherKey:two.childKey + andNode:two.indexedNode.node]; + }]; + + for (FChange *change in filteredChanges) { + for (id registration in registrations) { + if ([registration responseTo:eventType]) { + id event = [self generateEventForChange:change + registration:registration + eventCache:eventCache]; + [events addObject:event]; + } + } + } +} + +- (id)generateEventForChange:(FChange *)change + registration:(id)registration + eventCache:(FIndexedNode *)eventCache { + FChange *materializedChange; + if (change.type == FIRDataEventTypeValue || + change.type == FIRDataEventTypeChildRemoved) { + materializedChange = change; + } else { + NSString *prevChildKey = + [eventCache predecessorForChildKey:change.childKey + childNode:change.indexedNode.node + index:self.query.index]; + materializedChange = [change changeWithPrevKey:prevChildKey]; + } + return [registration createEventFrom:materializedChange query:self.query]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIRDatabaseConfig_Private.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIRDatabaseConfig_Private.h new file mode 100644 index 00000000..6df83424 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIRDatabaseConfig_Private.h @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FAuthTokenProvider.h" +#import "FIRDatabaseConfig.h" + +@protocol FStorageEngine; + +@interface FIRDatabaseConfig () + +@property(nonatomic, readonly) BOOL isFrozen; +@property(nonatomic, strong, readonly) NSString *sessionIdentifier; +@property(nonatomic, strong, readonly) NSString *googleAppID; +@property(nonatomic, strong) id authTokenProvider; +@property(nonatomic, strong) id forceStorageEngine; + +- (void)freeze; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIRDatabaseReference.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIRDatabaseReference.m new file mode 100644 index 00000000..9e557446 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIRDatabaseReference.m @@ -0,0 +1,527 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseReference.h" +#import "FIRDatabase.h" +#import "FIRDatabaseConfig.h" +#import "FIRDatabaseConfig_Private.h" +#import "FIRDatabaseQuery_Private.h" +#import "FIRDatabaseReference_Private.h" +#import "FNextPushId.h" +#import "FQueryParams.h" +#import "FSnapshotUtilities.h" +#import "FStringUtilities.h" +#import "FUtilities.h" +#import "FValidation.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +@implementation FIRDatabaseReference + +#pragma mark - +#pragma mark Constructors + +- (id)initWithConfig:(FIRDatabaseConfig *)config { + FParsedUrl *parsedUrl = + [FUtilities parseUrl:[[FIRApp defaultApp] options].databaseURL]; + [FValidation validateFrom:@"initWithUrl:" validURL:parsedUrl]; + return [self initWithRepo:[FRepoManager getRepo:parsedUrl.repoInfo + config:config] + path:parsedUrl.path]; +} + +- (id)initWithRepo:(FRepo *)repo path:(FPath *)path { + return [super initWithRepo:repo + path:path + params:[FQueryParams defaultInstance] + orderByCalled:NO + priorityMethodCalled:NO]; +} + +#pragma mark - +#pragma mark Ancillary methods + +- (nullable NSString *)key { + if ([self.path isEmpty]) { + return nil; + } else { + return [self.path getBack]; + } +} + +- (FIRDatabase *)database { + return self.repo.database; +} + +- (FIRDatabaseReference *)parent { + FPath *parentPath = [self.path parent]; + FIRDatabaseReference *parent = nil; + if (parentPath != nil) { + parent = [[FIRDatabaseReference alloc] initWithRepo:self.repo + path:parentPath]; + } + return parent; +} + +- (NSString *)URL { + FIRDatabaseReference *parent = [self parent]; + return parent == nil + ? [self.repo description] + : [NSString + stringWithFormat:@"%@/%@", [parent description], + [FStringUtilities urlEncoded:self.key]]; +} + +- (NSString *)description { + return [self URL]; +} + +- (FIRDatabaseReference *)root { + return [[FIRDatabaseReference alloc] + initWithRepo:self.repo + path:[[FPath alloc] initWith:@""]]; +} + +#pragma mark - +#pragma mark Child methods + +- (FIRDatabaseReference *)child:(NSString *)pathString { + if ([self.path getFront] == nil) { + // we're at the root + [FValidation validateFrom:@"child:" validRootPathString:pathString]; + } else { + [FValidation validateFrom:@"child:" validPathString:pathString]; + } + FPath *path = [self.path childFromString:pathString]; + FIRDatabaseReference *firebaseRef = + [[FIRDatabaseReference alloc] initWithRepo:self.repo path:path]; + return firebaseRef; +} + +- (FIRDatabaseReference *)childByAutoId { + [FValidation validateFrom:@"childByAutoId:" writablePath:self.path]; + + NSString *name = [FNextPushId get:self.repo.serverTime]; + return [self child:name]; +} + +#pragma mark - +#pragma mark Basic write methods + +- (void)setValue:(id)value { + [self setValueInternal:value + andPriority:nil + withCompletionBlock:nil + from:@"setValue:"]; +} + +- (void)setValue:(id)value withCompletionBlock:(fbt_void_nserror_ref)block { + [self setValueInternal:value + andPriority:nil + withCompletionBlock:block + from:@"setValue:withCompletionBlock:"]; +} + +- (void)setValue:(id)value andPriority:(id)priority { + [self setValueInternal:value + andPriority:priority + withCompletionBlock:nil + from:@"setValue:andPriority:"]; +} + +- (void)setValue:(id)value + andPriority:(id)priority + withCompletionBlock:(fbt_void_nserror_ref)block { + [self setValueInternal:value + andPriority:priority + withCompletionBlock:block + from:@"setValue:andPriority:withCompletionBlock:"]; +} + +- (void)setValueInternal:(id)value + andPriority:(id)priority + withCompletionBlock:(fbt_void_nserror_ref)block + from:(NSString *)fn { + [FValidation validateFrom:fn writablePath:self.path]; + + fbt_void_nserror_ref userCallback = [block copy]; + id newNode = [FSnapshotUtilities nodeFrom:value + priority:priority + withValidationFrom:fn]; + + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo set:self.path withNode:newNode withCallback:userCallback]; + }); +} + +- (void)removeValue { + [self setValueInternal:nil + andPriority:nil + withCompletionBlock:nil + from:@"removeValue:"]; +} + +- (void)removeValueWithCompletionBlock:(fbt_void_nserror_ref)block { + [self setValueInternal:nil + andPriority:nil + withCompletionBlock:block + from:@"removeValueWithCompletionBlock:"]; +} + +- (void)setPriority:(id)priority { + [self setPriorityInternal:priority + withCompletionBlock:nil + from:@"setPriority:"]; +} + +- (void)setPriority:(id)priority + withCompletionBlock:(fbt_void_nserror_ref)block { + + [self setPriorityInternal:priority + withCompletionBlock:block + from:@"setPriority:withCompletionBlock:"]; +} + +- (void)setPriorityInternal:(id)priority + withCompletionBlock:(fbt_void_nserror_ref)block + from:(NSString *)fn { + [FValidation validateFrom:fn writablePath:self.path]; + + fbt_void_nserror_ref userCallback = [block copy]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo set:[self.path childFromString:@".priority"] + withNode:[FSnapshotUtilities nodeFrom:priority] + withCallback:userCallback]; + }); +} + +- (void)updateChildValues:(NSDictionary *)values { + [self updateChildValuesInternal:values + withCompletionBlock:nil + from:@"updateChildValues:"]; +} + +- (void)updateChildValues:(NSDictionary *)values + withCompletionBlock:(fbt_void_nserror_ref)block { + [self updateChildValuesInternal:values + withCompletionBlock:block + from:@"updateChildValues:withCompletionBlock:"]; +} + +- (void)updateChildValuesInternal:(NSDictionary *)values + withCompletionBlock:(fbt_void_nserror_ref)block + from:(NSString *)fn { + [FValidation validateFrom:fn writablePath:self.path]; + + FCompoundWrite *merge = + [FSnapshotUtilities compoundWriteFromDictionary:values + withValidationFrom:fn]; + + fbt_void_nserror_ref userCallback = [block copy]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo update:self.path withNodes:merge withCallback:userCallback]; + }); +} + +#pragma mark - +#pragma mark Disconnect Operations + +- (void)onDisconnectSetValue:(id)value { + [self onDisconnectSetValueInternal:value + andPriority:nil + withCompletionBlock:nil + from:@"onDisconnectSetValue:"]; +} + +- (void)onDisconnectSetValue:(id)value + withCompletionBlock:(fbt_void_nserror_ref)block { + [self onDisconnectSetValueInternal:value + andPriority:nil + withCompletionBlock:block + from:@"onDisconnectSetValue:" + @"withCompletionBlock:"]; +} + +- (void)onDisconnectSetValue:(id)value andPriority:(id)priority { + [self onDisconnectSetValueInternal:value + andPriority:priority + withCompletionBlock:nil + from:@"onDisconnectSetValue:andPriority:"]; +} + +- (void)onDisconnectSetValue:(id)value + andPriority:(id)priority + withCompletionBlock:(fbt_void_nserror_ref)block { + [self onDisconnectSetValueInternal:value + andPriority:priority + withCompletionBlock:block + from:@"onDisconnectSetValue:andPriority:" + @"withCompletionBlock:"]; +} + +- (void)onDisconnectSetValueInternal:(id)value + andPriority:(id)priority + withCompletionBlock:(fbt_void_nserror_ref)block + from:(NSString *)fn { + [FValidation validateFrom:fn writablePath:self.path]; + + id newNodeUnresolved = [FSnapshotUtilities nodeFrom:value + priority:priority + withValidationFrom:fn]; + + fbt_void_nserror_ref userCallback = [block copy]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo onDisconnectSet:self.path + withNode:newNodeUnresolved + withCallback:userCallback]; + }); +} + +- (void)onDisconnectRemoveValue { + [self onDisconnectSetValueInternal:nil + andPriority:nil + withCompletionBlock:nil + from:@"onDisconnectRemoveValue:"]; +} + +- (void)onDisconnectRemoveValueWithCompletionBlock:(fbt_void_nserror_ref)block { + [self onDisconnectSetValueInternal:nil + andPriority:nil + withCompletionBlock:block + from:@"onDisconnectRemoveValueWithCompletionB" + @"lock:"]; +} + +- (void)onDisconnectUpdateChildValues:(NSDictionary *)values { + [self + onDisconnectUpdateChildValuesInternal:values + withCompletionBlock:nil + from: + @"onDisconnectUpdateChildValues:"]; +} + +- (void)onDisconnectUpdateChildValues:(NSDictionary *)values + withCompletionBlock:(fbt_void_nserror_ref)block { + [self onDisconnectUpdateChildValuesInternal:values + withCompletionBlock:block + from:@"onDisconnectUpdateChildValues" + @":withCompletionBlock:"]; +} + +- (void)onDisconnectUpdateChildValuesInternal:(NSDictionary *)values + withCompletionBlock:(fbt_void_nserror_ref)block + from:(NSString *)fn { + [FValidation validateFrom:fn writablePath:self.path]; + + FCompoundWrite *merge = + [FSnapshotUtilities compoundWriteFromDictionary:values + withValidationFrom:fn]; + + fbt_void_nserror_ref userCallback = [block copy]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo onDisconnectUpdate:self.path + withNodes:merge + withCallback:userCallback]; + }); +} + +- (void)cancelDisconnectOperations { + [self cancelDisconnectOperationsWithCompletionBlock:nil]; +} + +- (void)cancelDisconnectOperationsWithCompletionBlock: + (fbt_void_nserror_ref)block { + fbt_void_nserror_ref callback = nil; + if (block != nil) { + callback = [block copy]; + } + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo onDisconnectCancel:self.path withCallback:callback]; + }); +} + +#pragma mark - +#pragma mark Connection management methods + ++ (void)goOffline { + [FRepoManager interruptAll]; +} + ++ (void)goOnline { + [FRepoManager resumeAll]; +} + +#pragma mark - +#pragma mark Data reading methods deferred to FQuery + +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + withBlock:(fbt_void_datasnapshot)block { + return [self observeEventType:eventType + withBlock:block + withCancelBlock:nil]; +} + +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(fbt_void_datasnapshot_nsstring)block { + return [self observeEventType:eventType + andPreviousSiblingKeyWithBlock:block + withCancelBlock:nil]; +} + +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + withBlock:(fbt_void_datasnapshot)block + withCancelBlock:(fbt_void_nserror)cancelBlock { + return [super observeEventType:eventType + withBlock:block + withCancelBlock:cancelBlock]; +} + +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(fbt_void_datasnapshot_nsstring)block + withCancelBlock:(fbt_void_nserror)cancelBlock { + return [super observeEventType:eventType + andPreviousSiblingKeyWithBlock:block + withCancelBlock:cancelBlock]; +} + +- (void)removeObserverWithHandle:(FIRDatabaseHandle)handle { + [super removeObserverWithHandle:handle]; +} + +- (void)removeAllObservers { + [super removeAllObservers]; +} + +- (void)keepSynced:(BOOL)keepSynced { + [super keepSynced:keepSynced]; +} + +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + withBlock:(fbt_void_datasnapshot)block { + [self observeSingleEventOfType:eventType + withBlock:block + withCancelBlock:nil]; +} + +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(fbt_void_datasnapshot_nsstring)block { + [self observeSingleEventOfType:eventType + andPreviousSiblingKeyWithBlock:block + withCancelBlock:nil]; +} + +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + withBlock:(fbt_void_datasnapshot)block + withCancelBlock:(fbt_void_nserror)cancelBlock { + [super observeSingleEventOfType:eventType + withBlock:block + withCancelBlock:cancelBlock]; +} + +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(fbt_void_datasnapshot_nsstring)block + withCancelBlock:(fbt_void_nserror)cancelBlock { + [super observeSingleEventOfType:eventType + andPreviousSiblingKeyWithBlock:block + withCancelBlock:cancelBlock]; +} + +#pragma mark - +#pragma mark Query methods +// These methods suppress warnings from having method definitions in +// FIRDatabaseReference.h for docs generation. + +- (FIRDatabaseQuery *)queryLimitedToFirst:(NSUInteger)limit { + return [super queryLimitedToFirst:limit]; +} + +- (FIRDatabaseQuery *)queryLimitedToLast:(NSUInteger)limit { + return [super queryLimitedToLast:limit]; +} + +- (FIRDatabaseQuery *)queryOrderedByChild:(NSString *)key { + return [super queryOrderedByChild:key]; +} + +- (FIRDatabaseQuery *)queryOrderedByKey { + return [super queryOrderedByKey]; +} + +- (FIRDatabaseQuery *)queryOrderedByPriority { + return [super queryOrderedByPriority]; +} + +- (FIRDatabaseQuery *)queryStartingAtValue:(id)startValue { + return [super queryStartingAtValue:startValue]; +} + +- (FIRDatabaseQuery *)queryStartingAtValue:(id)startValue + childKey:(NSString *)childKey { + return [super queryStartingAtValue:startValue childKey:childKey]; +} + +- (FIRDatabaseQuery *)queryEndingAtValue:(id)endValue { + return [super queryEndingAtValue:endValue]; +} + +- (FIRDatabaseQuery *)queryEndingAtValue:(id)endValue + childKey:(NSString *)childKey { + return [super queryEndingAtValue:endValue childKey:childKey]; +} + +- (FIRDatabaseQuery *)queryEqualToValue:(id)value { + return [super queryEqualToValue:value]; +} + +- (FIRDatabaseQuery *)queryEqualToValue:(id)value + childKey:(NSString *)childKey { + return [super queryEqualToValue:value childKey:childKey]; +} + +#pragma mark - +#pragma mark Transaction methods + +- (void)runTransactionBlock:(fbt_transactionresult_mutabledata)block { + [FValidation validateFrom:@"runTransactionBlock:" writablePath:self.path]; + [self runTransactionBlock:block andCompletionBlock:nil withLocalEvents:YES]; +} + +- (void)runTransactionBlock:(fbt_transactionresult_mutabledata)update + andCompletionBlock: + (fbt_void_nserror_bool_datasnapshot)completionBlock { + [FValidation validateFrom:@"runTransactionBlock:andCompletionBlock:" + writablePath:self.path]; + [self runTransactionBlock:update + andCompletionBlock:completionBlock + withLocalEvents:YES]; +} + +- (void)runTransactionBlock:(fbt_transactionresult_mutabledata)block + andCompletionBlock:(fbt_void_nserror_bool_datasnapshot)completionBlock + withLocalEvents:(BOOL)localEvents { + [FValidation + validateFrom:@"runTransactionBlock:andCompletionBlock:withLocalEvents:" + writablePath:self.path]; + fbt_transactionresult_mutabledata updateCopy = [block copy]; + fbt_void_nserror_bool_datasnapshot onCompleteCopy = [completionBlock copy]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self.repo startTransactionOnPath:self.path + update:updateCopy + onComplete:onCompleteCopy + withLocalEvents:localEvents]; + }); +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIndex.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIndex.h new file mode 100644 index 00000000..89bec767 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIndex.h @@ -0,0 +1,51 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FImmutableSortedDictionary; +@class FNamedNode; +@protocol FNode; + +@protocol FIndex +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2; + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 + reverse:(BOOL)reverse; + +- (NSComparisonResult)compareNamedNode:(FNamedNode *)namedNode1 + toNamedNode:(FNamedNode *)namedNode2; + +- (BOOL)isDefinedOn:(id)node; +- (BOOL)indexedValueChangedBetween:(id)oldNode and:(id)newNode; +- (FNamedNode *)minPost; +- (FNamedNode *)maxPost; +- (FNamedNode *)makePost:(id)indexValue name:(NSString *)name; +- (NSString *)queryDefinition; + +@end + +@interface FIndex : NSObject + ++ (id)indexFromQueryDefinition:(NSString *)string; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIndex.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIndex.m new file mode 100644 index 00000000..03663994 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FIndex.m @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIndex.h" + +#import "FKeyIndex.h" +#import "FPathIndex.h" +#import "FPriorityIndex.h" +#import "FValueIndex.h" + +@implementation FIndex + ++ (id)indexFromQueryDefinition:(NSString *)string { + if ([string isEqualToString:@".key"]) { + return [FKeyIndex keyIndex]; + } else if ([string isEqualToString:@".value"]) { + return [FValueIndex valueIndex]; + } else if ([string isEqualToString:@".priority"]) { + return [FPriorityIndex priorityIndex]; + } else { + return + [[FPathIndex alloc] initWithPath:[[FPath alloc] initWith:string]]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FKeyIndex.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FKeyIndex.h new file mode 100644 index 00000000..281a5ac4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FKeyIndex.h @@ -0,0 +1,22 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIndex.h" +#import + +@interface FKeyIndex : NSObject ++ (id)keyIndex; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FKeyIndex.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FKeyIndex.m new file mode 100644 index 00000000..ac108299 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FKeyIndex.m @@ -0,0 +1,123 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FKeyIndex.h" +#import "FEmptyNode.h" +#import "FNamedNode.h" +#import "FSnapshotUtilities.h" +#import "FUtilities.h" + +@interface FKeyIndex () + +@property(nonatomic, strong) FNamedNode *maxPost; + +@end + +@implementation FKeyIndex + +- (id)init { + self = [super init]; + if (self) { + self.maxPost = [[FNamedNode alloc] initWithName:[FUtilities maxName] + andNode:[FEmptyNode emptyNode]]; + } + return self; +} + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 { + return [FUtilities compareKey:key1 toKey:key2]; +} + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 + reverse:(BOOL)reverse { + if (reverse) { + return [self compareKey:key2 + andNode:node2 + toOtherKey:key1 + andNode:node1]; + } else { + return [self compareKey:key1 + andNode:node1 + toOtherKey:key2 + andNode:node2]; + } +} + +- (NSComparisonResult)compareNamedNode:(FNamedNode *)namedNode1 + toNamedNode:(FNamedNode *)namedNode2 { + return [self compareKey:namedNode1.name + andNode:namedNode1.node + toOtherKey:namedNode2.name + andNode:namedNode2.node]; +} + +- (BOOL)isDefinedOn:(id)node { + return YES; +} + +- (BOOL)indexedValueChangedBetween:(id)oldNode and:(id)newNode { + return NO; // The key for a node never changes. +} + +- (FNamedNode *)minPost { + return [FNamedNode min]; +} + +- (FNamedNode *)makePost:(id)indexValue name:(NSString *)name { + NSString *key = indexValue.val; + NSAssert([key isKindOfClass:[NSString class]], + @"KeyIndex indexValue must always be a string."); + // We just use empty node, but it'll never be compared, since our comparator + // only looks at name. + return [[FNamedNode alloc] initWithName:key andNode:[FEmptyNode emptyNode]]; +} + +- (NSString *)queryDefinition { + return @".key"; +} + +- (NSString *)description { + return @"FKeyIndex"; +} + +- (id)copyWithZone:(NSZone *)zone { + return self; +} + +- (BOOL)isEqual:(id)other { + // since we're a singleton. + return (other == self); +} + +- (NSUInteger)hash { + return [@".key" hash]; +} + ++ (id)keyIndex { + static id keyIndex; + static dispatch_once_t once; + dispatch_once(&once, ^{ + keyIndex = [[FKeyIndex alloc] init]; + }); + return keyIndex; +} +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FListenComplete.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FListenComplete.h new file mode 100644 index 00000000..99aabf89 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FListenComplete.h @@ -0,0 +1,28 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FOperation.h" +#import + +@interface FListenComplete : NSObject + +- (id)initWithSource:(FOperationSource *)aSource path:(FPath *)aPath; + +@property(nonatomic, strong, readonly) FOperationSource *source; +@property(nonatomic, strong, readonly) FPath *path; +@property(nonatomic, readonly) FOperationType type; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FListenComplete.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FListenComplete.m new file mode 100644 index 00000000..26370c6a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FListenComplete.m @@ -0,0 +1,55 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FListenComplete.h" +#import "FOperationSource.h" +#import "FPath.h" + +@interface FListenComplete () +@property(nonatomic, strong, readwrite) FOperationSource *source; +@property(nonatomic, strong, readwrite) FPath *path; +@property(nonatomic, readwrite) FOperationType type; +@end + +@implementation FListenComplete +- (id)initWithSource:(FOperationSource *)aSource path:(FPath *)aPath { + NSAssert(!aSource.fromUser, + @"Can't have a listen complete from a user source"); + self = [super init]; + if (self) { + self.source = aSource; + self.path = aPath; + self.type = FOperationTypeListenComplete; + } + return self; +} + +- (id)operationForChild:(NSString *)childKey { + if ([self.path isEmpty]) { + return [[FListenComplete alloc] initWithSource:self.source + path:[FPath empty]]; + } else { + return [[FListenComplete alloc] initWithSource:self.source + path:[self.path popFront]]; + } +} + +- (NSString *)description { + return [NSString stringWithFormat:@"FListenComplete { path=%@, source=%@ }", + self.path, self.source]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FMaxNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FMaxNode.h new file mode 100644 index 00000000..c68137e3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FMaxNode.h @@ -0,0 +1,22 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FChildrenNode.h" +#import + +@interface FMaxNode : FChildrenNode ++ (id)maxNode; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FMaxNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FMaxNode.m new file mode 100644 index 00000000..28e7672b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FMaxNode.m @@ -0,0 +1,58 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FMaxNode.h" +#import "FEmptyNode.h" +#import "FUtilities.h" + +@implementation FMaxNode { +} +- (id)init { + self = [super init]; + if (self) { + } + return self; +} + ++ (id)maxNode { + static FMaxNode *maxNode = nil; + static dispatch_once_t once; + dispatch_once(&once, ^{ + maxNode = [[FMaxNode alloc] init]; + }); + return maxNode; +} + +- (NSComparisonResult)compare:(id)other { + if (other == self) { + return NSOrderedSame; + } else { + return NSOrderedDescending; + } +} + +- (BOOL)isEqual:(id)other { + return other == self; +} + +- (id)getImmediateChild:(NSString *)childName { + return [FEmptyNode emptyNode]; +} + +- (BOOL)isEmpty { + return NO; +} +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FNamedNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FNamedNode.h new file mode 100644 index 00000000..4414dfd2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FNamedNode.h @@ -0,0 +1,31 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import + +@interface FNamedNode : NSObject + +@property(nonatomic, strong, readonly) NSString *name; +@property(nonatomic, strong, readonly) id node; + +- (id)initWithName:(NSString *)name andNode:(id)node; + ++ (FNamedNode *)nodeWithName:(NSString *)name node:(id)node; + ++ (FNamedNode *)min; ++ (FNamedNode *)max; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FNamedNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FNamedNode.m new file mode 100644 index 00000000..3b2eaf72 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FNamedNode.m @@ -0,0 +1,102 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNamedNode.h" +#import "FEmptyNode.h" +#import "FIndex.h" +#import "FMaxNode.h" +#import "FUtilities.h" + +@interface FNamedNode () +@property(nonatomic, strong, readwrite) NSString *name; +@property(nonatomic, strong, readwrite) id node; +@end + +@implementation FNamedNode + ++ (FNamedNode *)nodeWithName:(NSString *)name node:(id)node { + return [[FNamedNode alloc] initWithName:name andNode:node]; +} + +- (id)initWithName:(NSString *)name andNode:(id)node { + self = [super init]; + if (self) { + self.name = name; + self.node = node; + } + return self; +} + +- (id)copy { + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + return self; +} + ++ (FNamedNode *)min { + static FNamedNode *min = nil; + static dispatch_once_t once; + dispatch_once(&once, ^{ + min = [[FNamedNode alloc] initWithName:[FUtilities minName] + andNode:[FEmptyNode emptyNode]]; + }); + return min; +} + ++ (FNamedNode *)max { + static FNamedNode *max = nil; + static dispatch_once_t once; + dispatch_once(&once, ^{ + max = [[FNamedNode alloc] initWithName:[FUtilities maxName] + andNode:[FMaxNode maxNode]]; + }); + return max; +} + +- (NSString *)description { + return + [NSString stringWithFormat:@"NamedNode[%@] %@", self.name, self.node]; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (object == nil || ![object isKindOfClass:[FNamedNode class]]) { + return NO; + } + + FNamedNode *namedNode = object; + if (![self.name isEqualToString:namedNode.name]) { + return NO; + } + if (![self.node isEqual:namedNode.node]) { + return NO; + } + + return YES; +} + +- (NSUInteger)hash { + NSUInteger nameHash = [self.name hash]; + NSUInteger nodeHash = [self.node hash]; + NSUInteger result = 31 * nameHash + nodeHash; + return result; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPathIndex.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPathIndex.h new file mode 100644 index 00000000..6ab91519 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPathIndex.h @@ -0,0 +1,23 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIndex.h" +#import "FPath.h" +#import + +@interface FPathIndex : NSObject +- (id)initWithPath:(FPath *)path; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPathIndex.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPathIndex.m new file mode 100644 index 00000000..214eab8e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPathIndex.m @@ -0,0 +1,135 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPathIndex.h" +#import "FEmptyNode.h" +#import "FMaxNode.h" +#import "FNamedNode.h" +#import "FPath.h" +#import "FSnapshotUtilities.h" +#import "FUtilities.h" + +@interface FPathIndex () +@property(nonatomic, strong) FPath *path; +@end + +@implementation FPathIndex + +- (id)initWithPath:(FPath *)path { + self = [super init]; + if (self) { + if (path.isEmpty || [path.getFront isEqualToString:@".priority"]) { + [NSException raise:NSInvalidArgumentException + format:@"Invalid path for PathIndex: %@", path]; + } + _path = path; + } + return self; +} + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 { + id child1 = [node1 getChild:self.path]; + id child2 = [node2 getChild:self.path]; + NSComparisonResult indexCmp = [child1 compare:child2]; + if (indexCmp == NSOrderedSame) { + return [FUtilities compareKey:key1 toKey:key2]; + } else { + return indexCmp; + } +} + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 + reverse:(BOOL)reverse { + if (reverse) { + return [self compareKey:key2 + andNode:node2 + toOtherKey:key1 + andNode:node1]; + } else { + return [self compareKey:key1 + andNode:node1 + toOtherKey:key2 + andNode:node2]; + } +} + +- (NSComparisonResult)compareNamedNode:(FNamedNode *)namedNode1 + toNamedNode:(FNamedNode *)namedNode2 { + return [self compareKey:namedNode1.name + andNode:namedNode1.node + toOtherKey:namedNode2.name + andNode:namedNode2.node]; +} + +- (BOOL)isDefinedOn:(id)node { + return ![node getChild:self.path].isEmpty; +} + +- (BOOL)indexedValueChangedBetween:(id)oldNode and:(id)newNode { + id oldValue = [oldNode getChild:self.path]; + id newValue = [newNode getChild:self.path]; + return [oldValue compare:newValue] != NSOrderedSame; +} + +- (FNamedNode *)minPost { + return FNamedNode.min; +} + +- (FNamedNode *)maxPost { + id maxNode = [[FEmptyNode emptyNode] updateChild:self.path + withNewChild:[FMaxNode maxNode]]; + + return [[FNamedNode alloc] initWithName:[FUtilities maxName] + andNode:maxNode]; +} + +- (FNamedNode *)makePost:(id)indexValue name:(NSString *)name { + id node = [[FEmptyNode emptyNode] updateChild:self.path + withNewChild:indexValue]; + return [[FNamedNode alloc] initWithName:name andNode:node]; +} + +- (NSString *)queryDefinition { + return [self.path wireFormat]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"FPathIndex(%@)", self.path]; +} + +- (id)copyWithZone:(NSZone *)zone { + // Safe since we're immutable. + return self; +} + +- (BOOL)isEqual:(id)other { + if (![other isKindOfClass:[FPathIndex class]]) { + return NO; + } + return ([self.path isEqual:((FPathIndex *)other).path]); +} + +- (NSUInteger)hash { + return [self.path hash]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPriorityIndex.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPriorityIndex.h new file mode 100644 index 00000000..1b4534ea --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPriorityIndex.h @@ -0,0 +1,23 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIndex.h" + +@interface FPriorityIndex : NSObject ++ (id)priorityIndex; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPriorityIndex.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPriorityIndex.m new file mode 100644 index 00000000..0b338374 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FPriorityIndex.m @@ -0,0 +1,126 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPriorityIndex.h" + +#import "FEmptyNode.h" +#import "FLeafNode.h" +#import "FMaxNode.h" +#import "FNamedNode.h" +#import "FNode.h" +#import "FUtilities.h" + +// TODO: Abstract into some common base class? + +@implementation FPriorityIndex + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 { + id child1 = [node1 getPriority]; + id child2 = [node2 getPriority]; + NSComparisonResult indexCmp = [child1 compare:child2]; + if (indexCmp == NSOrderedSame) { + return [FUtilities compareKey:key1 toKey:key2]; + } else { + return indexCmp; + } +} + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 + reverse:(BOOL)reverse { + if (reverse) { + return [self compareKey:key2 + andNode:node2 + toOtherKey:key1 + andNode:node1]; + } else { + return [self compareKey:key1 + andNode:node1 + toOtherKey:key2 + andNode:node2]; + } +} + +- (NSComparisonResult)compareNamedNode:(FNamedNode *)namedNode1 + toNamedNode:(FNamedNode *)namedNode2 { + return [self compareKey:namedNode1.name + andNode:namedNode1.node + toOtherKey:namedNode2.name + andNode:namedNode2.node]; +} + +- (BOOL)isDefinedOn:(id)node { + return !node.getPriority.isEmpty; +} + +- (BOOL)indexedValueChangedBetween:(id)oldNode and:(id)newNode { + id oldValue = [oldNode getPriority]; + id newValue = [newNode getPriority]; + return ![oldValue isEqual:newValue]; +} + +- (FNamedNode *)minPost { + return FNamedNode.min; +} + +- (FNamedNode *)maxPost { + return [self makePost:[FMaxNode maxNode] name:[FUtilities maxName]]; +} + +- (FNamedNode *)makePost:(id)indexValue name:(NSString *)name { + id node = [[FLeafNode alloc] initWithValue:@"[PRIORITY-POST]" + withPriority:indexValue]; + return [[FNamedNode alloc] initWithName:name andNode:node]; +} + +- (NSString *)queryDefinition { + return @".priority"; +} + +- (NSString *)description { + return @"FPriorityIndex"; +} + +- (id)copyWithZone:(NSZone *)zone { + // Safe since we're immutable. + return self; +} + +- (BOOL)isEqual:(id)other { + return [other isKindOfClass:[FPriorityIndex class]]; +} + +- (NSUInteger)hash { + // chosen by a fair dice roll. Guaranteed to be random + return 3155577; +} + ++ (id)priorityIndex { + static id index; + static dispatch_once_t once; + dispatch_once(&once, ^{ + index = [[FPriorityIndex alloc] init]; + }); + + return index; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FRangedFilter.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FRangedFilter.h new file mode 100644 index 00000000..3c1aadd6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FRangedFilter.h @@ -0,0 +1,31 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNodeFilter.h" +#import + +@class FQueryParams; +@class FNamedNode; + +@interface FRangedFilter : NSObject + +- (id)initWithQueryParams:(FQueryParams *)params; +- (BOOL)matchesKey:(NSString *)key andNode:(id)node; + +@property(nonatomic, strong, readonly) FNamedNode *startPost; +@property(nonatomic, strong, readonly) FNamedNode *endPost; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FRangedFilter.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FRangedFilter.m new file mode 100644 index 00000000..bd8ef817 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FRangedFilter.m @@ -0,0 +1,129 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FRangedFilter.h" +#import "FChildChangeAccumulator.h" +#import "FChildrenNode.h" +#import "FEmptyNode.h" +#import "FIndexedFilter.h" +#import "FIndexedNode.h" +#import "FNamedNode.h" +#import "FQueryParams.h" + +@interface FRangedFilter () +@property(nonatomic, strong, readwrite) id indexedFilter; +@property(nonatomic, strong, readwrite) id index; +@property(nonatomic, strong, readwrite) FNamedNode *startPost; +@property(nonatomic, strong, readwrite) FNamedNode *endPost; +@end + +@implementation FRangedFilter +- (id)initWithQueryParams:(FQueryParams *)params { + self = [super init]; + if (self) { + self.indexedFilter = + [[FIndexedFilter alloc] initWithIndex:params.index]; + self.index = params.index; + self.startPost = [FRangedFilter startPostFromQueryParams:params]; + self.endPost = [FRangedFilter endPostFromQueryParams:params]; + } + return self; +} + ++ (FNamedNode *)startPostFromQueryParams:(FQueryParams *)params { + if ([params hasStart]) { + NSString *startKey = params.indexStartKey; + return [params.index makePost:params.indexStartValue name:startKey]; + } else { + return params.index.minPost; + } +} + ++ (FNamedNode *)endPostFromQueryParams:(FQueryParams *)params { + if ([params hasEnd]) { + NSString *endKey = params.indexEndKey; + return [params.index makePost:params.indexEndValue name:endKey]; + } else { + return params.index.maxPost; + } +} + +- (BOOL)matchesKey:(NSString *)key andNode:(id)node { + return ([self.index compareKey:self.startPost.name + andNode:self.startPost.node + toOtherKey:key + andNode:node] <= NSOrderedSame && + [self.index compareKey:key + andNode:node + toOtherKey:self.endPost.name + andNode:self.endPost.node] <= NSOrderedSame); +} + +- (FIndexedNode *)updateChildIn:(FIndexedNode *)oldSnap + forChildKey:(NSString *)childKey + newChild:(id)newChildSnap + affectedPath:(FPath *)affectedPath + fromSource:(id)source + accumulator: + (FChildChangeAccumulator *)optChangeAccumulator { + if (![self matchesKey:childKey andNode:newChildSnap]) { + newChildSnap = [FEmptyNode emptyNode]; + } + return [self.indexedFilter updateChildIn:oldSnap + forChildKey:childKey + newChild:newChildSnap + affectedPath:affectedPath + fromSource:source + accumulator:optChangeAccumulator]; +} + +- (FIndexedNode *)updateFullNode:(FIndexedNode *)oldSnap + withNewNode:(FIndexedNode *)newSnap + accumulator: + (FChildChangeAccumulator *)optChangeAccumulator { + __block FIndexedNode *filtered; + if (newSnap.node.isLeafNode) { + // Make sure we have a children node with the correct index, not a leaf + // node + filtered = [FIndexedNode indexedNodeWithNode:[FEmptyNode emptyNode] + index:self.index]; + } else { + // Dont' support priorities on queries + filtered = [newSnap updatePriority:[FEmptyNode emptyNode]]; + [newSnap.node enumerateChildrenUsingBlock:^( + NSString *key, id node, BOOL *stop) { + if (![self matchesKey:key andNode:node]) { + filtered = [filtered updateChild:key + withNewChild:[FEmptyNode emptyNode]]; + } + }]; + } + return [self.indexedFilter updateFullNode:oldSnap + withNewNode:filtered + accumulator:optChangeAccumulator]; +} + +- (FIndexedNode *)updatePriority:(id)priority + forNode:(FIndexedNode *)oldSnap { + // Don't support priorities on queries + return oldSnap; +} + +- (BOOL)filtersNodes { + return YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FTransformedEnumerator.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FTransformedEnumerator.h new file mode 100644 index 00000000..25a59b4f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FTransformedEnumerator.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FTransformedEnumerator : NSEnumerator +- (id)initWithEnumerator:(NSEnumerator *)enumerator + andTransform:(id (^)(id))transform; +- (id)nextObject; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FTransformedEnumerator.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FTransformedEnumerator.m new file mode 100644 index 00000000..567e1002 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FTransformedEnumerator.m @@ -0,0 +1,44 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTransformedEnumerator.h" + +@interface FTransformedEnumerator () +@property(nonatomic, strong) NSEnumerator *enumerator; +@property(nonatomic, copy) id (^transform)(id); +@end + +@implementation FTransformedEnumerator +- (id)initWithEnumerator:(NSEnumerator *)enumerator + andTransform:(id (^)(id))transform { + self = [super init]; + if (self) { + self.enumerator = enumerator; + self.transform = transform; + } + return self; +} + +- (id)nextObject { + id next = self.enumerator.nextObject; + if (next != nil) { + return self.transform(next); + } else { + return nil; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FValueIndex.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FValueIndex.h new file mode 100644 index 00000000..a79f202f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FValueIndex.h @@ -0,0 +1,22 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIndex.h" +#import + +@interface FValueIndex : NSObject ++ (id)valueIndex; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FValueIndex.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FValueIndex.m new file mode 100644 index 00000000..61021c8b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FValueIndex.m @@ -0,0 +1,112 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FValueIndex.h" +#import "FMaxNode.h" +#import "FNamedNode.h" +#import "FSnapshotUtilities.h" +#import "FUtilities.h" + +@implementation FValueIndex + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 { + NSComparisonResult indexCmp = [node1 compare:node2]; + if (indexCmp == NSOrderedSame) { + return [FUtilities compareKey:key1 toKey:key2]; + } else { + return indexCmp; + } +} + +- (NSComparisonResult)compareKey:(NSString *)key1 + andNode:(id)node1 + toOtherKey:(NSString *)key2 + andNode:(id)node2 + reverse:(BOOL)reverse { + if (reverse) { + return [self compareKey:key2 + andNode:node2 + toOtherKey:key1 + andNode:node1]; + } else { + return [self compareKey:key1 + andNode:node1 + toOtherKey:key2 + andNode:node2]; + } +} + +- (NSComparisonResult)compareNamedNode:(FNamedNode *)namedNode1 + toNamedNode:(FNamedNode *)namedNode2 { + return [self compareKey:namedNode1.name + andNode:namedNode1.node + toOtherKey:namedNode2.name + andNode:namedNode2.node]; +} + +- (BOOL)isDefinedOn:(id)node { + return YES; +} + +- (BOOL)indexedValueChangedBetween:(id)oldNode and:(id)newNode { + return ![oldNode isEqual:newNode]; +} + +- (FNamedNode *)minPost { + return FNamedNode.min; +} + +- (FNamedNode *)maxPost { + return FNamedNode.max; +} + +- (FNamedNode *)makePost:(id)indexValue name:(NSString *)name { + return [[FNamedNode alloc] initWithName:name andNode:indexValue]; +} + +- (NSString *)queryDefinition { + return @".value"; +} + +- (NSString *)description { + return @"FValueIndex"; +} + +- (id)copyWithZone:(NSZone *)zone { + return self; +} + +- (BOOL)isEqual:(id)other { + // since we're a singleton. + return (other == self); +} + +- (NSUInteger)hash { + return [@".value" hash]; +} + ++ (id)valueIndex { + static id valueIndex; + static dispatch_once_t once; + dispatch_once(&once, ^{ + valueIndex = [[FValueIndex alloc] init]; + }); + return valueIndex; +} +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessor.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessor.h new file mode 100644 index 00000000..ea6676e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessor.h @@ -0,0 +1,42 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FViewCache; +@class FViewProcessorResult; +@class FChildChangeAccumulator; +@protocol FNode; +@class FWriteTreeRef; +@class FPath; +@protocol FOperation; +@protocol FNodeFilter; + +@interface FViewProcessor : NSObject + +- (id)initWithFilter:(id)nodeFilter; + +- (FViewProcessorResult *)applyOperationOn:(FViewCache *)oldViewCache + operation:(id)operation + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)optCompleteCache; +- (FViewCache *)revertUserWriteOn:(FViewCache *)viewCache + path:(FPath *)path + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)optCompleteCache + accumulator:(FChildChangeAccumulator *)accumulator; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessor.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessor.m new file mode 100644 index 00000000..55249969 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessor.m @@ -0,0 +1,831 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FViewProcessor.h" +#import "FAckUserWrite.h" +#import "FCacheNode.h" +#import "FChange.h" +#import "FChildChangeAccumulator.h" +#import "FChildrenNode.h" +#import "FCompleteChildSource.h" +#import "FCompoundWrite.h" +#import "FEmptyNode.h" +#import "FIRDataEventType.h" +#import "FImmutableTree.h" +#import "FKeyIndex.h" +#import "FMerge.h" +#import "FNode.h" +#import "FNodeFilter.h" +#import "FOperation.h" +#import "FOperationSource.h" +#import "FOverwrite.h" +#import "FPath.h" +#import "FViewCache.h" +#import "FViewProcessorResult.h" +#import "FWriteTreeRef.h" + +/** + * An implementation of FCompleteChildSource that never returns any additional + * children + */ +@interface FNoCompleteChildSource : NSObject +@end + +@implementation FNoCompleteChildSource ++ (FNoCompleteChildSource *)instance { + static FNoCompleteChildSource *source = nil; + static dispatch_once_t once; + dispatch_once(&once, ^{ + source = [[FNoCompleteChildSource alloc] init]; + }); + return source; +} + +- (id)completeChild:(NSString *)childKey { + return nil; +} + +- (FNamedNode *)childByIndex:(id)index + afterChild:(FNamedNode *)child + isReverse:(BOOL)reverse { + return nil; +} +@end + +/** + * An implementation of FCompleteChildSource that uses a FWriteTree in addition + * to any other server data or old event caches available to calculate complete + * children. + */ +@interface FWriteTreeCompleteChildSource : NSObject +@property(nonatomic, strong) FWriteTreeRef *writes; +@property(nonatomic, strong) FViewCache *viewCache; +@property(nonatomic, strong) id optCompleteServerCache; +@end + +@implementation FWriteTreeCompleteChildSource +- (id)initWithWrites:(FWriteTreeRef *)writes + viewCache:(FViewCache *)viewCache + serverCache:(id)optCompleteServerCache { + self = [super init]; + if (self) { + self.writes = writes; + self.viewCache = viewCache; + self.optCompleteServerCache = optCompleteServerCache; + } + return self; +} + +- (id)completeChild:(NSString *)childKey { + FCacheNode *node = self.viewCache.cachedEventSnap; + if ([node isCompleteForChild:childKey]) { + return [node.node getImmediateChild:childKey]; + } else { + FCacheNode *serverNode; + if (self.optCompleteServerCache) { + // Since we're only ever getting child nodes, we can use the key + // index here + FIndexedNode *indexed = + [FIndexedNode indexedNodeWithNode:self.optCompleteServerCache + index:[FKeyIndex keyIndex]]; + serverNode = [[FCacheNode alloc] initWithIndexedNode:indexed + isFullyInitialized:YES + isFiltered:NO]; + } else { + serverNode = self.viewCache.cachedServerSnap; + } + return [self.writes calculateCompleteChild:childKey cache:serverNode]; + } +} + +- (FNamedNode *)childByIndex:(id)index + afterChild:(FNamedNode *)child + isReverse:(BOOL)reverse { + id completeServerData = self.optCompleteServerCache != nil + ? self.optCompleteServerCache + : self.viewCache.completeServerSnap; + return [self.writes calculateNextNodeAfterPost:child + completeServerData:completeServerData + reverse:reverse + index:index]; +} + +@end + +@interface FViewProcessor () +@property(nonatomic, strong) id filter; +@end + +@implementation FViewProcessor + +- (id)initWithFilter:(id)nodeFilter { + self = [super init]; + if (self) { + self.filter = nodeFilter; + } + return self; +} + +- (FViewProcessorResult *)applyOperationOn:(FViewCache *)oldViewCache + operation:(id)operation + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)optCompleteCache { + FChildChangeAccumulator *accumulator = + [[FChildChangeAccumulator alloc] init]; + FViewCache *newViewCache; + + if (operation.type == FOperationTypeOverwrite) { + FOverwrite *overwrite = (FOverwrite *)operation; + if (operation.source.fromUser) { + newViewCache = [self applyUserOverwriteTo:oldViewCache + changePath:overwrite.path + changedSnap:overwrite.snap + writesCache:writesCache + completeCache:optCompleteCache + accumulator:accumulator]; + } else { + NSAssert(operation.source.fromServer, + @"Unknown source for overwrite."); + // We filter the node if it's a tagged update or the node has been + // previously filtered and the update is not at the root in which + // case it is ok (and necessary) to mark the node unfiltered again + BOOL filterServerNode = overwrite.source.isTagged || + (oldViewCache.cachedServerSnap.isFiltered && + !overwrite.path.isEmpty); + newViewCache = [self applyServerOverwriteTo:oldViewCache + changePath:overwrite.path + snap:overwrite.snap + writesCache:writesCache + completeCache:optCompleteCache + filterServerNode:filterServerNode + accumulator:accumulator]; + } + } else if (operation.type == FOperationTypeMerge) { + FMerge *merge = (FMerge *)operation; + if (operation.source.fromUser) { + newViewCache = [self applyUserMergeTo:oldViewCache + path:merge.path + changedChildren:merge.children + writesCache:writesCache + completeCache:optCompleteCache + accumulator:accumulator]; + } else { + NSAssert(operation.source.fromServer, @"Unknown source for merge."); + // We filter the node if it's a tagged update or the node has been + // previously filtered + BOOL filterServerNode = merge.source.isTagged || + oldViewCache.cachedServerSnap.isFiltered; + newViewCache = [self applyServerMergeTo:oldViewCache + path:merge.path + changedChildren:merge.children + writesCache:writesCache + completeCache:optCompleteCache + filterServerNode:filterServerNode + accumulator:accumulator]; + } + } else if (operation.type == FOperationTypeAckUserWrite) { + FAckUserWrite *ackWrite = (FAckUserWrite *)operation; + if (!ackWrite.revert) { + newViewCache = [self ackUserWriteOn:oldViewCache + ackPath:ackWrite.path + affectedTree:ackWrite.affectedTree + writesCache:writesCache + completeCache:optCompleteCache + accumulator:accumulator]; + } else { + newViewCache = [self revertUserWriteOn:oldViewCache + path:ackWrite.path + writesCache:writesCache + completeCache:optCompleteCache + accumulator:accumulator]; + } + } else if (operation.type == FOperationTypeListenComplete) { + newViewCache = [self listenCompleteOldCache:oldViewCache + path:operation.path + writesCache:writesCache + serverCache:optCompleteCache + accumulator:accumulator]; + } else { + [NSException + raise:NSInternalInconsistencyException + format:@"Unknown operation encountered %ld.", (long)operation.type]; + return nil; + } + + NSArray *changes = [self maybeAddValueFromOldViewCache:oldViewCache + newViewCache:newViewCache + changes:accumulator.changes]; + FViewProcessorResult *results = + [[FViewProcessorResult alloc] initWithViewCache:newViewCache + changes:changes]; + return results; +} + +- (NSArray *)maybeAddValueFromOldViewCache:(FViewCache *)oldViewCache + newViewCache:(FViewCache *)newViewCache + changes:(NSArray *)changes { + NSArray *newChanges = changes; + FCacheNode *eventSnap = newViewCache.cachedEventSnap; + if (eventSnap.isFullyInitialized) { + BOOL isLeafOrEmpty = + eventSnap.node.isLeafNode || eventSnap.node.isEmpty; + if ([changes count] > 0 || + !oldViewCache.cachedEventSnap.isFullyInitialized || + (isLeafOrEmpty && + ![eventSnap.node isEqual:oldViewCache.completeEventSnap]) || + ![eventSnap.node.getPriority + isEqual:oldViewCache.completeEventSnap.getPriority]) { + FChange *valueChange = + [[FChange alloc] initWithType:FIRDataEventTypeValue + indexedNode:eventSnap.indexedNode]; + NSMutableArray *mutableChanges = [changes mutableCopy]; + [mutableChanges addObject:valueChange]; + newChanges = mutableChanges; + } + } + return newChanges; +} + +- (FViewCache *) + generateEventCacheAfterServerEvent:(FViewCache *)viewCache + path:(FPath *)changePath + writesCache:(FWriteTreeRef *)writesCache + source:(id)source + accumulator:(FChildChangeAccumulator *)accumulator { + FCacheNode *oldEventSnap = viewCache.cachedEventSnap; + if ([writesCache shadowingWriteAtPath:changePath] != nil) { + // we have a shadowing write, ignore changes. + return viewCache; + } else { + FIndexedNode *newEventCache; + if (changePath.isEmpty) { + // TODO: figure out how this plays with "sliding ack windows" + NSAssert( + viewCache.cachedServerSnap.isFullyInitialized, + @"If change path is empty, we must have complete server data"); + id nodeWithLocalWrites; + if (viewCache.cachedServerSnap.isFiltered) { + // We need to special case this, because we need to only apply + // writes to complete children, or we might end up raising + // events for incomplete children. If the server data is + // filtered deep writes cannot be guaranteed to be complete + id serverCache = viewCache.completeServerSnap; + FChildrenNode *completeChildren = + ([serverCache isKindOfClass:[FChildrenNode class]]) + ? serverCache + : [FEmptyNode emptyNode]; + nodeWithLocalWrites = [writesCache + calculateCompleteEventChildrenWithCompleteServerChildren: + completeChildren]; + } else { + nodeWithLocalWrites = [writesCache + calculateCompleteEventCacheWithCompleteServerCache: + viewCache.completeServerSnap]; + } + FIndexedNode *indexedNode = + [FIndexedNode indexedNodeWithNode:nodeWithLocalWrites + index:self.filter.index]; + newEventCache = [self.filter + updateFullNode:viewCache.cachedEventSnap.indexedNode + withNewNode:indexedNode + accumulator:accumulator]; + } else { + NSString *childKey = [changePath getFront]; + if ([childKey isEqualToString:@".priority"]) { + NSAssert( + changePath.length == 1, + @"Can't have a priority with additional path components"); + id oldEventNode = oldEventSnap.node; + id serverNode = viewCache.cachedServerSnap.node; + // we might have overwrites for this priority + id updatedPriority = [writesCache + calculateEventCacheAfterServerOverwriteWithChildPath: + changePath + existingEventSnap: + oldEventNode + existingServerSnap: + serverNode]; + if (updatedPriority != nil) { + newEventCache = + [self.filter updatePriority:updatedPriority + forNode:oldEventSnap.indexedNode]; + } else { + // priority didn't change, keep old node + newEventCache = oldEventSnap.indexedNode; + } + } else { + FPath *childChangePath = [changePath popFront]; + id newEventChild; + if ([oldEventSnap isCompleteForChild:childKey]) { + id serverNode = viewCache.cachedServerSnap.node; + id eventChildUpdate = [writesCache + calculateEventCacheAfterServerOverwriteWithChildPath: + changePath + existingEventSnap: + oldEventSnap.node + existingServerSnap: + serverNode]; + if (eventChildUpdate != nil) { + newEventChild = + [[oldEventSnap.node getImmediateChild:childKey] + updateChild:childChangePath + withNewChild:eventChildUpdate]; + } else { + // Nothing changed, just keep the old child + newEventChild = + [oldEventSnap.node getImmediateChild:childKey]; + } + } else { + newEventChild = [writesCache + calculateCompleteChild:childKey + cache:viewCache.cachedServerSnap]; + } + if (newEventChild != nil) { + newEventCache = + [self.filter updateChildIn:oldEventSnap.indexedNode + forChildKey:childKey + newChild:newEventChild + affectedPath:childChangePath + fromSource:source + accumulator:accumulator]; + } else { + // No complete children available or no change + newEventCache = oldEventSnap.indexedNode; + } + } + } + return [viewCache updateEventSnap:newEventCache + isComplete:(oldEventSnap.isFullyInitialized || + changePath.isEmpty) + isFiltered:self.filter.filtersNodes]; + } +} + +- (FViewCache *)applyServerOverwriteTo:(FViewCache *)oldViewCache + changePath:(FPath *)changePath + snap:(id)changedSnap + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)optCompleteCache + filterServerNode:(BOOL)filterServerNode + accumulator:(FChildChangeAccumulator *)accumulator { + FCacheNode *oldServerSnap = oldViewCache.cachedServerSnap; + FIndexedNode *newServerCache; + id serverFilter = + filterServerNode ? self.filter : self.filter.indexedFilter; + + if (changePath.isEmpty) { + FIndexedNode *indexed = + [FIndexedNode indexedNodeWithNode:changedSnap + index:serverFilter.index]; + newServerCache = [serverFilter updateFullNode:oldServerSnap.indexedNode + withNewNode:indexed + accumulator:nil]; + } else if (serverFilter.filtersNodes && !oldServerSnap.isFiltered) { + // We want to filter the server node, but we didn't filter the server + // node yet, so simulate a full update + NSAssert(![changePath isEmpty], + @"An empty path should been caught in the other branch"); + NSString *childKey = [changePath getFront]; + FPath *updatePath = [changePath popFront]; + id newChild = [[oldServerSnap.node getImmediateChild:childKey] + updateChild:updatePath + withNewChild:changedSnap]; + FIndexedNode *indexed = + [oldServerSnap.indexedNode updateChild:childKey + withNewChild:newChild]; + newServerCache = [serverFilter updateFullNode:oldServerSnap.indexedNode + withNewNode:indexed + accumulator:nil]; + } else { + NSString *childKey = [changePath getFront]; + if (![oldServerSnap isCompleteForPath:changePath] && + changePath.length > 1) { + // We don't update incomplete nodes with updates intended for other + // listeners. + return oldViewCache; + } + FPath *childChangePath = [changePath popFront]; + id childNode = [oldServerSnap.node getImmediateChild:childKey]; + id newChildNode = [childNode updateChild:childChangePath + withNewChild:changedSnap]; + if ([childKey isEqualToString:@".priority"]) { + newServerCache = + [serverFilter updatePriority:newChildNode + forNode:oldServerSnap.indexedNode]; + } else { + newServerCache = + [serverFilter updateChildIn:oldServerSnap.indexedNode + forChildKey:childKey + newChild:newChildNode + affectedPath:childChangePath + fromSource:[FNoCompleteChildSource instance] + accumulator:nil]; + } + } + FViewCache *newViewCache = + [oldViewCache updateServerSnap:newServerCache + isComplete:(oldServerSnap.isFullyInitialized || + changePath.isEmpty) + isFiltered:serverFilter.filtersNodes]; + id source = + [[FWriteTreeCompleteChildSource alloc] initWithWrites:writesCache + viewCache:newViewCache + serverCache:optCompleteCache]; + return [self generateEventCacheAfterServerEvent:newViewCache + path:changePath + writesCache:writesCache + source:source + accumulator:accumulator]; +} + +- (FViewCache *)applyUserOverwriteTo:(FViewCache *)oldViewCache + changePath:(FPath *)changePath + changedSnap:(id)changedSnap + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)optCompleteCache + accumulator:(FChildChangeAccumulator *)accumulator { + FCacheNode *oldEventSnap = oldViewCache.cachedEventSnap; + FViewCache *newViewCache; + id source = + [[FWriteTreeCompleteChildSource alloc] initWithWrites:writesCache + viewCache:oldViewCache + serverCache:optCompleteCache]; + if (changePath.isEmpty) { + FIndexedNode *newIndexed = + [FIndexedNode indexedNodeWithNode:changedSnap + index:self.filter.index]; + FIndexedNode *newEventCache = + [self.filter updateFullNode:oldEventSnap.indexedNode + withNewNode:newIndexed + accumulator:accumulator]; + newViewCache = [oldViewCache updateEventSnap:newEventCache + isComplete:YES + isFiltered:self.filter.filtersNodes]; + } else { + NSString *childKey = [changePath getFront]; + if ([childKey isEqualToString:@".priority"]) { + FIndexedNode *newEventCache = [self.filter + updatePriority:changedSnap + forNode:oldViewCache.cachedEventSnap.indexedNode]; + newViewCache = + [oldViewCache updateEventSnap:newEventCache + isComplete:oldEventSnap.isFullyInitialized + isFiltered:oldEventSnap.isFiltered]; + } else { + FPath *childChangePath = [changePath popFront]; + id oldChild = [oldEventSnap.node getImmediateChild:childKey]; + id newChild; + if (childChangePath.isEmpty) { + // Child overwrite, we can replace the child + newChild = changedSnap; + } else { + id childNode = [source completeChild:childKey]; + if (childNode != nil) { + if ([[childChangePath getBack] + isEqualToString:@".priority"] && + [childNode getChild:[childChangePath parent]].isEmpty) { + // This is a priority update on an empty node. If this + // node exists on the server, the server will send down + // the priority in the update, so ignore for now + newChild = childNode; + } else { + newChild = [childNode updateChild:childChangePath + withNewChild:changedSnap]; + } + } else { + newChild = [FEmptyNode emptyNode]; + } + } + if (![oldChild isEqual:newChild]) { + FIndexedNode *newEventSnap = + [self.filter updateChildIn:oldEventSnap.indexedNode + forChildKey:childKey + newChild:newChild + affectedPath:childChangePath + fromSource:source + accumulator:accumulator]; + newViewCache = [oldViewCache + updateEventSnap:newEventSnap + isComplete:oldEventSnap.isFullyInitialized + isFiltered:self.filter.filtersNodes]; + } else { + newViewCache = oldViewCache; + } + } + } + return newViewCache; +} + ++ (BOOL)cache:(FViewCache *)viewCache hasChild:(NSString *)childKey { + return [viewCache.cachedEventSnap isCompleteForChild:childKey]; +} + +/** + * @param changedChildren NSDictionary of child name (NSString*) to child value + * (id) + */ +- (FViewCache *)applyUserMergeTo:(FViewCache *)viewCache + path:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)serverCache + accumulator:(FChildChangeAccumulator *)accumulator { + // HACK: In the case of a limit query, there may be some changes that bump + // things out of the window leaving room for new items. It's important we + // process these changes first, so we iterate the changes twice, first + // processing any that affect items currently in view. + // TODO: I consider an item "in view" if cacheHasChild is true, which checks + // both the server and event snap. I'm not sure if this will result in edge + // cases when a child is in one but not the other. + __block FViewCache *curViewCache = viewCache; + + [changedChildren enumerateWrites:^(FPath *relativePath, id childNode, + BOOL *stop) { + FPath *writePath = [path child:relativePath]; + if ([FViewProcessor cache:viewCache hasChild:[writePath getFront]]) { + curViewCache = [self applyUserOverwriteTo:curViewCache + changePath:writePath + changedSnap:childNode + writesCache:writesCache + completeCache:serverCache + accumulator:accumulator]; + } + }]; + + [changedChildren enumerateWrites:^(FPath *relativePath, id childNode, + BOOL *stop) { + FPath *writePath = [path child:relativePath]; + if (![FViewProcessor cache:viewCache hasChild:[writePath getFront]]) { + curViewCache = [self applyUserOverwriteTo:curViewCache + changePath:writePath + changedSnap:childNode + writesCache:writesCache + completeCache:serverCache + accumulator:accumulator]; + } + }]; + + return curViewCache; +} + +- (FViewCache *)applyServerMergeTo:(FViewCache *)viewCache + path:(FPath *)path + changedChildren:(FCompoundWrite *)changedChildren + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)serverCache + filterServerNode:(BOOL)filterServerNode + accumulator:(FChildChangeAccumulator *)accumulator { + // If we don't have a cache yet, this merge was intended for a previously + // listen in the same location. Ignore it and wait for the complete data + // update coming soon. + if (viewCache.cachedServerSnap.node.isEmpty && + !viewCache.cachedServerSnap.isFullyInitialized) { + return viewCache; + } + + // HACK: In the case of a limit query, there may be some changes that bump + // things out of the window leaving room for new items. It's important we + // process these changes first, so we iterate the changes twice, first + // processing any that affect items currently in view. + // TODO: I consider an item "in view" if cacheHasChild is true, which checks + // both the server and event snap. I'm not sure if this will result in edge + // cases when a child is in one but not the other. + __block FViewCache *curViewCache = viewCache; + FCompoundWrite *actualMerge; + if (path.isEmpty) { + actualMerge = changedChildren; + } else { + actualMerge = + [[FCompoundWrite emptyWrite] addCompoundWrite:changedChildren + atPath:path]; + } + id serverNode = viewCache.cachedServerSnap.node; + + NSDictionary *childCompoundWrites = actualMerge.childCompoundWrites; + [childCompoundWrites + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FCompoundWrite *childMerge, BOOL *stop) { + if ([serverNode hasChild:childKey]) { + id serverChild = + [viewCache.cachedServerSnap.node getImmediateChild:childKey]; + id newChild = [childMerge applyToNode:serverChild]; + curViewCache = + [self applyServerOverwriteTo:curViewCache + changePath:[[FPath alloc] initWith:childKey] + snap:newChild + writesCache:writesCache + completeCache:serverCache + filterServerNode:filterServerNode + accumulator:accumulator]; + } + }]; + + [childCompoundWrites + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FCompoundWrite *childMerge, BOOL *stop) { + bool isUnknownDeepMerge = + ![viewCache.cachedServerSnap isCompleteForChild:childKey] && + childMerge.rootWrite == nil; + if (![serverNode hasChild:childKey] && !isUnknownDeepMerge) { + id serverChild = + [viewCache.cachedServerSnap.node getImmediateChild:childKey]; + id newChild = [childMerge applyToNode:serverChild]; + curViewCache = + [self applyServerOverwriteTo:curViewCache + changePath:[[FPath alloc] initWith:childKey] + snap:newChild + writesCache:writesCache + completeCache:serverCache + filterServerNode:filterServerNode + accumulator:accumulator]; + } + }]; + + return curViewCache; +} + +- (FViewCache *)ackUserWriteOn:(FViewCache *)viewCache + ackPath:(FPath *)ackPath + affectedTree:(FImmutableTree *)affectedTree + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)optCompleteCache + accumulator:(FChildChangeAccumulator *)accumulator { + + if ([writesCache shadowingWriteAtPath:ackPath] != nil) { + return viewCache; + } + + // Only filter server node if it is currently filtered + BOOL filterServerNode = viewCache.cachedServerSnap.isFiltered; + + // Essentially we'll just get our existing server cache for the affected + // paths and re-apply it as a server update now that it won't be shadowed. + FCacheNode *serverCache = viewCache.cachedServerSnap; + if (affectedTree.value != nil) { + // This is an overwrite. + if ((ackPath.isEmpty && serverCache.isFullyInitialized) || + [serverCache isCompleteForPath:ackPath]) { + return + [self applyServerOverwriteTo:viewCache + changePath:ackPath + snap:[serverCache.node getChild:ackPath] + writesCache:writesCache + completeCache:optCompleteCache + filterServerNode:filterServerNode + accumulator:accumulator]; + } else if (ackPath.isEmpty) { + // This is a goofy edge case where we are acking data at this + // location but don't have full data. We should just re-apply + // whatever we have in our cache as a merge. + FCompoundWrite *changedChildren = [FCompoundWrite emptyWrite]; + for (FNamedNode *child in serverCache.node.childEnumerator) { + changedChildren = [changedChildren addWrite:child.node + atKey:child.name]; + } + return [self applyServerMergeTo:viewCache + path:ackPath + changedChildren:changedChildren + writesCache:writesCache + completeCache:optCompleteCache + filterServerNode:filterServerNode + accumulator:accumulator]; + } else { + return viewCache; + } + } else { + // This is a merge. + __block FCompoundWrite *changedChildren = [FCompoundWrite emptyWrite]; + [affectedTree forEach:^(FPath *mergePath, id value) { + FPath *serverCachePath = [ackPath child:mergePath]; + if ([serverCache isCompleteForPath:serverCachePath]) { + changedChildren = [changedChildren + addWrite:[serverCache.node getChild:serverCachePath] + atPath:mergePath]; + } + }]; + return [self applyServerMergeTo:viewCache + path:ackPath + changedChildren:changedChildren + writesCache:writesCache + completeCache:optCompleteCache + filterServerNode:filterServerNode + accumulator:accumulator]; + } +} + +- (FViewCache *)revertUserWriteOn:(FViewCache *)viewCache + path:(FPath *)path + writesCache:(FWriteTreeRef *)writesCache + completeCache:(id)optCompleteCache + accumulator:(FChildChangeAccumulator *)accumulator { + if ([writesCache shadowingWriteAtPath:path] != nil) { + return viewCache; + } else { + id source = [[FWriteTreeCompleteChildSource alloc] + initWithWrites:writesCache + viewCache:viewCache + serverCache:optCompleteCache]; + FIndexedNode *oldEventCache = viewCache.cachedEventSnap.indexedNode; + FIndexedNode *newEventCache; + if (path.isEmpty || [[path getFront] isEqualToString:@".priority"]) { + id newNode; + if (viewCache.cachedServerSnap.isFullyInitialized) { + newNode = [writesCache + calculateCompleteEventCacheWithCompleteServerCache: + viewCache.completeServerSnap]; + } else { + newNode = [writesCache + calculateCompleteEventChildrenWithCompleteServerChildren: + viewCache.cachedServerSnap.node]; + } + FIndexedNode *indexedNode = + [FIndexedNode indexedNodeWithNode:newNode + index:self.filter.index]; + newEventCache = [self.filter updateFullNode:oldEventCache + withNewNode:indexedNode + accumulator:accumulator]; + } else { + NSString *childKey = [path getFront]; + id newChild = + [writesCache calculateCompleteChild:childKey + cache:viewCache.cachedServerSnap]; + if (newChild == nil && + [viewCache.cachedServerSnap isCompleteForChild:childKey]) { + newChild = [oldEventCache.node getImmediateChild:childKey]; + } + if (newChild != nil) { + newEventCache = [self.filter updateChildIn:oldEventCache + forChildKey:childKey + newChild:newChild + affectedPath:[path popFront] + fromSource:source + accumulator:accumulator]; + } else if (newChild == nil && + [viewCache.cachedEventSnap.node hasChild:childKey]) { + // No complete child available, delete the existing one, if any + newEventCache = + [self.filter updateChildIn:oldEventCache + forChildKey:childKey + newChild:[FEmptyNode emptyNode] + affectedPath:[path popFront] + fromSource:source + accumulator:accumulator]; + } else { + newEventCache = oldEventCache; + } + if (newEventCache.node.isEmpty && + viewCache.cachedServerSnap.isFullyInitialized) { + // We might have reverted all child writes. Maybe the old event + // was a leaf node. + id complete = [writesCache + calculateCompleteEventCacheWithCompleteServerCache: + viewCache.completeServerSnap]; + if (complete.isLeafNode) { + FIndexedNode *indexed = + [FIndexedNode indexedNodeWithNode:complete]; + newEventCache = [self.filter updateFullNode:newEventCache + withNewNode:indexed + accumulator:accumulator]; + } + } + } + BOOL complete = viewCache.cachedServerSnap.isFullyInitialized || + [writesCache shadowingWriteAtPath:[FPath empty]] != nil; + return [viewCache updateEventSnap:newEventCache + isComplete:complete + isFiltered:self.filter.filtersNodes]; + } +} + +- (FViewCache *)listenCompleteOldCache:(FViewCache *)viewCache + path:(FPath *)path + writesCache:(FWriteTreeRef *)writesCache + serverCache:(id)servercache + accumulator:(FChildChangeAccumulator *)accumulator { + FCacheNode *oldServerNode = viewCache.cachedServerSnap; + FViewCache *newViewCache = [viewCache + updateServerSnap:oldServerNode.indexedNode + isComplete:(oldServerNode.isFullyInitialized || path.isEmpty) + isFiltered:oldServerNode.isFiltered]; + return [self + generateEventCacheAfterServerEvent:newViewCache + path:path + writesCache:writesCache + source:[FNoCompleteChildSource instance] + accumulator:accumulator]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessorResult.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessorResult.h new file mode 100644 index 00000000..8d3e2ef6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessorResult.h @@ -0,0 +1,29 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FViewCache; + +@interface FViewProcessorResult : NSObject +@property(nonatomic, strong, readonly) FViewCache *viewCache; +/** + * List of FChanges. + */ +@property(nonatomic, strong, readonly) NSArray *changes; + +- (id)initWithViewCache:(FViewCache *)viewCache changes:(NSArray *)changes; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessorResult.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessorResult.m new file mode 100644 index 00000000..0d38947b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/FViewProcessorResult.m @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FViewProcessorResult.h" +#import "FViewCache.h" + +@interface FViewProcessorResult () +@property(nonatomic, strong, readwrite) FViewCache *viewCache; +@property(nonatomic, strong, readwrite) NSArray *changes; +@end + +@implementation FViewProcessorResult +- (id)initWithViewCache:(FViewCache *)viewCache changes:(NSArray *)changes { + self = [super init]; + if (self) { + self.viewCache = viewCache; + self.changes = changes; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FAuthTokenProvider.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FAuthTokenProvider.h new file mode 100644 index 00000000..a4f8b156 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FAuthTokenProvider.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FTypedefs.h" +#import "FTypedefs_Private.h" + +@protocol FIRAuthInterop; + +@protocol FAuthTokenProvider + +- (void)fetchTokenForcingRefresh:(BOOL)forceRefresh + withCallback:(fbt_void_nsstring_nserror)callback; + +- (void)listenForTokenChanges:(fbt_void_nsstring)listener; + +@end + +@interface FAuthTokenProvider : NSObject + ++ (id)authTokenProviderWithAuth:(id)auth; + +- (instancetype)init NS_UNAVAILABLE; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FAuthTokenProvider.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FAuthTokenProvider.m new file mode 100644 index 00000000..61bfb033 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FAuthTokenProvider.m @@ -0,0 +1,121 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FAuthTokenProvider.h" + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import "Interop/Auth/Public/FIRAuthInterop.h" + +#import "FIRDatabaseQuery_Private.h" +#import "FIRNoopAuthTokenProvider.h" +#import "FUtilities.h" + +@interface FAuthStateListenerWrapper : NSObject + +@property(nonatomic, copy) fbt_void_nsstring listener; +@property(nonatomic, weak) id auth; + +@end + +@implementation FAuthStateListenerWrapper + +- (instancetype)initWithListener:(fbt_void_nsstring)listener + auth:(id)auth { + self = [super init]; + if (self != nil) { + self->_listener = listener; + self->_auth = auth; + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(authStateDidChangeNotification:) + name:FIRAuthStateDidChangeInternalNotification + object:nil]; + } + return self; +} + +- (void)authStateDidChangeNotification:(NSNotification *)notification { + NSDictionary *userInfo = notification.userInfo; + if (notification.object == self.auth) { + NSString *token = + userInfo[FIRAuthStateDidChangeInternalNotificationTokenKey]; + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + self.listener(token); + }); + } +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +@end + +@interface FIRFirebaseAuthTokenProvider : NSObject + +@property(nonatomic, strong) id auth; +/** Strong references to the auth listeners as they are only weak in + * FIRFirebaseApp */ +@property(nonatomic, strong) NSMutableArray *authListeners; + +- (instancetype)initWithAuth:(id)auth; + +@end + +@implementation FIRFirebaseAuthTokenProvider + +- (instancetype)initWithAuth:(id)auth { + self = [super init]; + if (self != nil) { + self->_auth = auth; + self->_authListeners = [NSMutableArray array]; + } + return self; +} + +- (void)fetchTokenForcingRefresh:(BOOL)forceRefresh + withCallback:(fbt_void_nsstring_nserror)callback { + if (self.auth == nil) { + // Signal that Auth is not available by returning nil. + callback(nil, nil); + } else { + [self.auth getTokenForcingRefresh:forceRefresh + withCallback:^(NSString *_Nullable token, + NSError *_Nullable error) { + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + callback(token, error); + }); + }]; + } +} + +- (void)listenForTokenChanges:(_Nonnull fbt_void_nsstring)listener { + FAuthStateListenerWrapper *wrapper = + [[FAuthStateListenerWrapper alloc] initWithListener:listener + auth:self.auth]; + [self.authListeners addObject:wrapper]; +} + +@end + +@implementation FAuthTokenProvider + ++ (id)authTokenProviderWithAuth: + (id)authInterop { + return [[FIRFirebaseAuthTokenProvider alloc] initWithAuth:authInterop]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FIRNoopAuthTokenProvider.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FIRNoopAuthTokenProvider.h new file mode 100644 index 00000000..137c0ce7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FIRNoopAuthTokenProvider.h @@ -0,0 +1,22 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FAuthTokenProvider.h" +#import + +@interface FIRNoopAuthTokenProvider : NSObject + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FIRNoopAuthTokenProvider.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FIRNoopAuthTokenProvider.m new file mode 100644 index 00000000..c50d3085 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Login/FIRNoopAuthTokenProvider.m @@ -0,0 +1,34 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRNoopAuthTokenProvider.h" +#import "FAuthTokenProvider.h" +#import "FIRDatabaseQuery_Private.h" + +@implementation FIRNoopAuthTokenProvider + +- (void)fetchTokenForcingRefresh:(BOOL)forceRefresh + withCallback:(fbt_void_nsstring_nserror)callback { + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + callback(nil, nil); + }); +} + +- (void)listenForTokenChanges:(fbt_void_nsstring)listener { + // no-op, because token never changes +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FCachePolicy.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FCachePolicy.h new file mode 100644 index 00000000..6305d34e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FCachePolicy.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FCachePolicy + +- (BOOL)shouldPruneCacheWithSize:(NSUInteger)cacheSize + numberOfTrackedQueries:(NSUInteger)numTrackedQueries; +- (BOOL)shouldCheckCacheSize:(NSUInteger)serverUpdatesSinceLastCheck; +- (float)percentOfQueriesToPruneAtOnce; +- (NSUInteger)maxNumberOfQueriesToKeep; + +@end + +@interface FLRUCachePolicy : NSObject + +@property(nonatomic, readonly) NSUInteger maxSize; + +- (id)initWithMaxSize:(NSUInteger)maxSize; + +@end + +@interface FNoCachePolicy : NSObject + ++ (FNoCachePolicy *)noCachePolicy; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FCachePolicy.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FCachePolicy.m new file mode 100644 index 00000000..c1ecd98e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FCachePolicy.m @@ -0,0 +1,82 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FCachePolicy.h" + +@interface FLRUCachePolicy () + +@property(nonatomic, readwrite) NSUInteger maxSize; + +@end + +static const NSUInteger kFServerUpdatesBetweenCacheSizeChecks = 1000; +static const NSUInteger kFMaxNumberOfPrunableQueriesToKeep = 1000; +static const float kFPercentOfQueriesToPruneAtOnce = 0.2f; + +@implementation FLRUCachePolicy + +- (id)initWithMaxSize:(NSUInteger)maxSize { + self = [super init]; + if (self != nil) { + self->_maxSize = maxSize; + } + return self; +} + +- (BOOL)shouldPruneCacheWithSize:(NSUInteger)cacheSize + numberOfTrackedQueries:(NSUInteger)numTrackedQueries { + return cacheSize > self.maxSize || + numTrackedQueries > kFMaxNumberOfPrunableQueriesToKeep; +} + +- (BOOL)shouldCheckCacheSize:(NSUInteger)serverUpdatesSinceLastCheck { + return serverUpdatesSinceLastCheck > kFServerUpdatesBetweenCacheSizeChecks; +} + +- (float)percentOfQueriesToPruneAtOnce { + return kFPercentOfQueriesToPruneAtOnce; +} + +- (NSUInteger)maxNumberOfQueriesToKeep { + return kFMaxNumberOfPrunableQueriesToKeep; +} + +@end + +@implementation FNoCachePolicy + ++ (FNoCachePolicy *)noCachePolicy { + return [[FNoCachePolicy alloc] init]; +} + +- (BOOL)shouldPruneCacheWithSize:(NSUInteger)cacheSize + numberOfTrackedQueries:(NSUInteger)numTrackedQueries { + return NO; +} + +- (BOOL)shouldCheckCacheSize:(NSUInteger)serverUpdatesSinceLastCheck { + return NO; +} + +- (float)percentOfQueriesToPruneAtOnce { + return 0; +} + +- (NSUInteger)maxNumberOfQueriesToKeep { + return NSUIntegerMax; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FLevelDBStorageEngine.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FLevelDBStorageEngine.h new file mode 100644 index 00000000..6d32b988 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FLevelDBStorageEngine.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FCompoundWrite.h" +#import "FNode.h" +#import "FPath.h" +#import "FQuerySpec.h" +#import "FStorageEngine.h" + +@class FCacheNode; +@class FTrackedQuery; +@class FPruneForest; +@class FRepoInfo; + +@interface FLevelDBStorageEngine : NSObject + ++ (NSString *)firebaseDir; + +- (id)initWithPath:(NSString *)path; + +- (void)runLegacyMigration:(FRepoInfo *)info; +- (void)purgeEverything; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FLevelDBStorageEngine.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FLevelDBStorageEngine.m new file mode 100644 index 00000000..eb1fa59e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FLevelDBStorageEngine.m @@ -0,0 +1,993 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FLevelDBStorageEngine.h" + +#import "APLevelDB.h" +#import "FEmptyNode.h" +#import "FPendingPut.h" // For legacy migration +#import "FPruneForest.h" +#import "FQueryParams.h" +#import "FSnapshotUtilities.h" +#import "FTrackedQuery.h" +#import "FUtilities.h" +#import "FWriteRecord.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +@interface FLevelDBStorageEngine () + +@property(nonatomic, strong) NSString *basePath; +@property(nonatomic, strong) APLevelDB *writesDB; +@property(nonatomic, strong) APLevelDB *serverCacheDB; + +@end + +// WARNING: If you change this, you need to write a migration script +static NSString *const kFPersistenceVersion = @"1"; + +static NSString *const kFServerDBPath = @"server_data"; +static NSString *const kFWritesDBPath = @"writes"; + +static NSString *const kFUserWriteId = @"id"; +static NSString *const kFUserWritePath = @"path"; +static NSString *const kFUserWriteOverwrite = @"o"; +static NSString *const kFUserWriteMerge = @"m"; + +static NSString *const kFTrackedQueryId = @"id"; +static NSString *const kFTrackedQueryPath = @"path"; +static NSString *const kFTrackedQueryParams = @"p"; +static NSString *const kFTrackedQueryLastUse = @"lu"; +static NSString *const kFTrackedQueryIsComplete = @"c"; +static NSString *const kFTrackedQueryIsActive = @"a"; + +static NSString *const kFServerCachePrefix = @"/server_cache/"; +// '~' is the last non-control character in the ASCII table until 127 +// We wan't the entire range of thing stored in the DB +static NSString *const kFServerCacheRangeEnd = @"/server_cache~"; +static NSString *const kFTrackedQueriesPrefix = @"/tracked_queries/"; +static NSString *const kFTrackedQueryKeysPrefix = @"/tracked_query_keys/"; + +// Failed to load JSON because a valid JSON turns out to be NaN while +// deserializing +static const NSInteger kFNanFailureCode = 3840; + +static NSString *writeRecordKey(NSUInteger writeId) { + return [NSString stringWithFormat:@"%lu", (unsigned long)(writeId)]; +} + +static NSString *serverCacheKey(FPath *path) { + return [NSString stringWithFormat:@"%@%@", kFServerCachePrefix, + ([path toStringWithTrailingSlash])]; +} + +static NSString *trackedQueryKey(NSUInteger trackedQueryId) { + return [NSString stringWithFormat:@"%@%lu", kFTrackedQueriesPrefix, + (unsigned long)trackedQueryId]; +} + +static NSString *trackedQueryKeysKeyPrefix(NSUInteger trackedQueryId) { + return [NSString stringWithFormat:@"%@%lu/", kFTrackedQueryKeysPrefix, + (unsigned long)trackedQueryId]; +} + +static NSString *trackedQueryKeysKey(NSUInteger trackedQueryId, NSString *key) { + return [NSString stringWithFormat:@"%@%lu/%@", kFTrackedQueryKeysPrefix, + (unsigned long)trackedQueryId, key]; +} + +@implementation FLevelDBStorageEngine +#pragma mark - Constructors + +- (id)initWithPath:(NSString *)dbPath { + self = [super init]; + if (self) { + self.basePath = [[FLevelDBStorageEngine firebaseDir] + stringByAppendingPathComponent:dbPath]; + /* For reference: + serverDataDB = [aPersistence createDbByName:@"server_data"]; + FPangolinDB *completenessDb = [aPersistence + createDbByName:@"server_complete"]; + */ + [FLevelDBStorageEngine ensureDir:self.basePath markAsDoNotBackup:YES]; + [self runMigration]; + [self openDatabases]; + } + return self; +} + +- (void)runMigration { + // Currently we're at version 1, so all we need to do is write that to a + // file + NSString *versionFile = + [self.basePath stringByAppendingPathComponent:@"version"]; + NSError *error; + NSString *oldVersion = + [NSString stringWithContentsOfFile:versionFile + encoding:NSUTF8StringEncoding + error:&error]; + if (!oldVersion) { + // This is probably fine, we don't have a version file yet + BOOL success = [kFPersistenceVersion writeToFile:versionFile + atomically:NO + encoding:NSUTF8StringEncoding + error:&error]; + if (!success) { + FFWarn(@"I-RDB076001", @"Failed to write version for database: %@", + error); + } + } else if ([oldVersion isEqualToString:kFPersistenceVersion]) { + // Everythings fine no need for migration + } else if ([oldVersion length] == 0) { + FFWarn(@"I-RDB076036", + @"Version file empty. Assuming database version 1."); + } else { + // If we add more versions in the future, we need to run migration here + [NSException raise:NSInternalInconsistencyException + format:@"Unrecognized database version: %@", oldVersion]; + } +} + +- (void)runLegacyMigration:(FRepoInfo *)info { + NSArray *dirPaths = NSSearchPathForDirectoriesInDomains( + NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDir = [dirPaths objectAtIndex:0]; + NSString *firebaseDir = + [documentsDir stringByAppendingPathComponent:@"firebase"]; + NSString *repoHashString = + [NSString stringWithFormat:@"%@_%@", info.host, info.namespace]; + NSString *legacyBaseDir = + [NSString stringWithFormat:@"%@/1/%@/v1", firebaseDir, repoHashString]; + if ([[NSFileManager defaultManager] fileExistsAtPath:legacyBaseDir]) { + FFWarn(@"I-RDB076002", @"Legacy database found, migrating..."); + // We only need to migrate writes + NSError *error = nil; + APLevelDB *writes = [APLevelDB + levelDBWithPath:[legacyBaseDir stringByAppendingPathComponent: + @"outstanding_puts"] + error:&error]; + if (writes != nil) { + __block NSUInteger numberOfWritesRestored = 0; + // Maybe we could use write batches, but what the heck, I'm sure + // it'll go fine :P + [writes enumerateKeysAndValuesAsData:^(NSString *key, NSData *data, + BOOL *stop) { + id pendingPut = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + if ([pendingPut isKindOfClass:[FPendingPut class]]) { + FPendingPut *put = pendingPut; + id newNode = + [FSnapshotUtilities nodeFrom:put.data + priority:put.priority]; + [self saveUserOverwrite:newNode + atPath:put.path + writeId:[key integerValue]]; + numberOfWritesRestored++; + } else if ([pendingPut + isKindOfClass:[FPendingPutPriority class]]) { + // This is for backwards compatibility. Older clients will + // save FPendingPutPriority. New ones will need to read it and + // translate. + FPendingPutPriority *putPriority = pendingPut; + FPath *priorityPath = + [putPriority.path childFromString:@".priority"]; + id newNode = + [FSnapshotUtilities nodeFrom:putPriority.priority + priority:nil]; + [self saveUserOverwrite:newNode + atPath:priorityPath + writeId:[key integerValue]]; + numberOfWritesRestored++; + } else if ([pendingPut isKindOfClass:[FPendingUpdate class]]) { + FPendingUpdate *update = pendingPut; + FCompoundWrite *merge = [FCompoundWrite + compoundWriteWithValueDictionary:update.data]; + [self saveUserMerge:merge + atPath:update.path + writeId:[key integerValue]]; + numberOfWritesRestored++; + } else { + FFWarn(@"I-RDB076003", + @"Failed to migrate legacy write, meh!"); + } + }]; + FFWarn(@"I-RDB076004", @"Migrated %lu writes", + (unsigned long)numberOfWritesRestored); + [writes close]; + FFWarn(@"I-RDB076005", @"Deleting legacy database..."); + BOOL success = + [[NSFileManager defaultManager] removeItemAtPath:legacyBaseDir + error:&error]; + if (!success) { + FFWarn(@"I-RDB076006", @"Failed to delete legacy database: %@", + error); + } else { + FFWarn(@"I-RDB076007", @"Finished migrating legacy database."); + } + } else { + FFWarn(@"I-RDB076008", @"Failed to migrate old database: %@", + error); + } + } +} + +- (void)openDatabases { + self.serverCacheDB = [self createDB:kFServerDBPath]; + self.writesDB = [self createDB:kFWritesDBPath]; +} + +- (void)purgeDatabase:(NSString *)dbPath { + NSString *path = [self.basePath stringByAppendingPathComponent:dbPath]; + NSError *error; + FFWarn(@"I-RDB076009", @"Deleting database at path %@", path); + BOOL success = [[NSFileManager defaultManager] removeItemAtPath:path + error:&error]; + if (!success) { + [NSException raise:NSInternalInconsistencyException + format:@"Failed to delete database files: %@", error]; + } +} + +- (void)purgeEverything { + [self close]; + [@[ kFServerDBPath, kFWritesDBPath ] + enumerateObjectsUsingBlock:^(NSString *dbPath, NSUInteger idx, + BOOL *stop) { + [self purgeDatabase:dbPath]; + }]; + + [self openDatabases]; +} + +- (void)close { + // autoreleasepool will cause deallocation which will close the DB + @autoreleasepool { + [self.serverCacheDB close]; + self.serverCacheDB = nil; + [self.writesDB close]; + self.writesDB = nil; + } +} + ++ (NSString *)firebaseDir { +#if TARGET_OS_IOS || TARGET_OS_TV + NSArray *dirPaths = NSSearchPathForDirectoriesInDomains( + NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDir = [dirPaths objectAtIndex:0]; + return [documentsDir stringByAppendingPathComponent:@"firebase"]; +#elif TARGET_OS_OSX + return [NSHomeDirectory() stringByAppendingPathComponent:@".firebase"]; +#endif +} + +- (APLevelDB *)createDB:(NSString *)dbName { + NSError *err = nil; + NSString *path = [self.basePath stringByAppendingPathComponent:dbName]; + APLevelDB *db = [APLevelDB levelDBWithPath:path error:&err]; + + if (err) { + FFWarn(@"I-RDB076036", + @"Failed to read database persistence file '%@': %@", dbName, + [err localizedDescription]); + err = nil; + + // Delete the database and try again. + [self purgeDatabase:dbName]; + db = [APLevelDB levelDBWithPath:path error:&err]; + + if (err) { + NSString *reason = [NSString + stringWithFormat:@"Error initializing persistence: %@", + [err description]]; + @throw [NSException + exceptionWithName:@"FirebaseDatabasePersistenceFailure" + reason:reason + userInfo:nil]; + } + } + + return db; +} + +- (void)saveUserOverwrite:(id)node + atPath:(FPath *)path + writeId:(NSUInteger)writeId { + NSDictionary *write = @{ + kFUserWriteId : @(writeId), + kFUserWritePath : [path toStringWithTrailingSlash], + kFUserWriteOverwrite : [node valForExport:YES] + }; + NSError *error = nil; + NSData *data = [NSJSONSerialization dataWithJSONObject:write + options:0 + error:&error]; + NSAssert(data, @"Failed to serialize user overwrite: %@, (Error: %@)", + write, error); + [self.writesDB setData:data forKey:writeRecordKey(writeId)]; +} + +- (void)saveUserMerge:(FCompoundWrite *)merge + atPath:(FPath *)path + writeId:(NSUInteger)writeId { + NSDictionary *write = @{ + kFUserWriteId : @(writeId), + kFUserWritePath : [path toStringWithTrailingSlash], + kFUserWriteMerge : [merge valForExport:YES] + }; + NSError *error = nil; + NSData *data = [NSJSONSerialization dataWithJSONObject:write + options:0 + error:&error]; + NSAssert(data, @"Failed to serialize user merge: %@ (Error: %@)", write, + error); + [self.writesDB setData:data forKey:writeRecordKey(writeId)]; +} + +- (void)removeUserWrite:(NSUInteger)writeId { + [self.writesDB removeKey:writeRecordKey(writeId)]; +} + +- (void)removeAllUserWrites { + __block NSUInteger count = 0; + NSDate *start = [NSDate date]; + id batch = [self.writesDB beginWriteBatch]; + [self.writesDB enumerateKeys:^(NSString *key, BOOL *stop) { + [batch removeKey:key]; + count++; + }]; + BOOL success = [batch commit]; + if (!success) { + FFWarn(@"I-RDB076010", @"Failed to remove all users writes on disk!"); + } else { + FFDebug(@"I-RDB076011", @"Removed %lu writes in %fms", + (unsigned long)count, [start timeIntervalSinceNow] * -1000); + } +} + +- (NSArray *)userWrites { + NSDate *date = [NSDate date]; + NSMutableArray *writes = [NSMutableArray array]; + [self.writesDB enumerateKeysAndValuesAsData:^(NSString *key, NSData *data, + BOOL *stop) { + NSError *error = nil; + NSDictionary *writeJSON = [NSJSONSerialization JSONObjectWithData:data + options:0 + error:&error]; + if (writeJSON == nil) { + if (error.code == kFNanFailureCode) { + FFWarn(@"I-RDB076012", + @"Failed to deserialize write (%@), likely because of out " + @"of range doubles (Error: %@)", + [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding], + error); + FFWarn(@"I-RDB076013", @"Removing failed write with key %@", key); + [self.writesDB removeKey:key]; + } else { + [NSException raise:NSInternalInconsistencyException + format:@"Failed to deserialize write: %@", error]; + } + } else { + NSInteger writeId = + ((NSNumber *)writeJSON[kFUserWriteId]).integerValue; + FPath *path = [FPath pathWithString:writeJSON[kFUserWritePath]]; + FWriteRecord *writeRecord; + if (writeJSON[kFUserWriteMerge] != nil) { + // It's a merge + FCompoundWrite *merge = [FCompoundWrite + compoundWriteWithValueDictionary:writeJSON[kFUserWriteMerge]]; + writeRecord = [[FWriteRecord alloc] initWithPath:path + merge:merge + writeId:writeId]; + } else { + // It's an overwrite + NSAssert(writeJSON[kFUserWriteOverwrite] != nil, + @"Persisted write did not contain merge or overwrite!"); + id node = + [FSnapshotUtilities nodeFrom:writeJSON[kFUserWriteOverwrite]]; + writeRecord = [[FWriteRecord alloc] initWithPath:path + overwrite:node + writeId:writeId + visible:YES]; + } + [writes addObject:writeRecord]; + } + }]; + // Make sure writes are sorted + [writes sortUsingComparator:^NSComparisonResult(FWriteRecord *one, + FWriteRecord *two) { + if (one.writeId < two.writeId) { + return NSOrderedAscending; + } else if (one.writeId > two.writeId) { + return NSOrderedDescending; + } else { + return NSOrderedSame; + } + }]; + FFDebug(@"I-RDB076014", @"Loaded %lu writes in %fms", + (unsigned long)writes.count, [date timeIntervalSinceNow] * -1000); + return writes; +} + +- (id)serverCacheAtPath:(FPath *)path { + NSDate *start = [NSDate date]; + id data = [self internalNestedDataForPath:path]; + id node = [FSnapshotUtilities nodeFrom:data]; + FFDebug(@"I-RDB076015", @"Loaded node with %d children at %@ in %fms", + [node numChildren], path, [start timeIntervalSinceNow] * -1000); + return node; +} + +- (id)serverCacheForKeys:(NSSet *)keys atPath:(FPath *)path { + NSDate *start = [NSDate date]; + __block id node = [FEmptyNode emptyNode]; + [keys enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { + id data = [self internalNestedDataForPath:[path childFromString:key]]; + node = [node updateImmediateChild:key + withNewChild:[FSnapshotUtilities nodeFrom:data]]; + }]; + FFDebug(@"I-RDB076016", + @"Loaded node with %d children for %lu keys at %@ in %fms", + [node numChildren], (unsigned long)keys.count, path, + [start timeIntervalSinceNow] * -1000); + return node; +} + +- (void)updateServerCache:(id)node + atPath:(FPath *)path + merge:(BOOL)merge { + NSDate *start = [NSDate date]; + id batch = [self.serverCacheDB beginWriteBatch]; + // Remove any leaf nodes that might be higher up + [self removeAllLeafNodesOnPath:path batch:batch]; + __block NSUInteger counter = 0; + if (merge) { + // remove any children that exist + [node enumerateChildrenUsingBlock:^(NSString *childKey, + id childNode, BOOL *stop) { + FPath *childPath = [path childFromString:childKey]; + [self removeAllWithPrefix:serverCacheKey(childPath) + batch:batch + database:self.serverCacheDB]; + [self saveNodeInternal:childNode + atPath:childPath + batch:batch + counter:&counter]; + }]; + } else { + // remove everything + [self removeAllWithPrefix:serverCacheKey(path) + batch:batch + database:self.serverCacheDB]; + [self saveNodeInternal:node atPath:path batch:batch counter:&counter]; + } + BOOL success = [batch commit]; + if (!success) { + FFWarn(@"I-RDB076017", @"Failed to update server cache on disk!"); + } else { + FFDebug(@"I-RDB076018", @"Saved %lu leaf nodes for overwrite in %fms", + (unsigned long)counter, [start timeIntervalSinceNow] * -1000); + } +} + +- (void)updateServerCacheWithMerge:(FCompoundWrite *)merge + atPath:(FPath *)path { + NSDate *start = [NSDate date]; + __block NSUInteger counter = 0; + id batch = [self.serverCacheDB beginWriteBatch]; + // Remove any leaf nodes that might be higher up + [self removeAllLeafNodesOnPath:path batch:batch]; + [merge enumerateWrites:^(FPath *relativePath, id node, BOOL *stop) { + FPath *childPath = [path child:relativePath]; + [self removeAllWithPrefix:serverCacheKey(childPath) + batch:batch + database:self.serverCacheDB]; + [self saveNodeInternal:node + atPath:childPath + batch:batch + counter:&counter]; + }]; + BOOL success = [batch commit]; + if (!success) { + FFWarn(@"I-RDB076019", @"Failed to update server cache on disk!"); + } else { + FFDebug(@"I-RDB076020", @"Saved %lu leaf nodes for merge in %fms", + (unsigned long)counter, [start timeIntervalSinceNow] * -1000); + } +} + +- (void)saveNodeInternal:(id)node + atPath:(FPath *)path + batch:(id)batch + counter:(NSUInteger *)counter { + id data = [node valForExport:YES]; + if (data != nil && ![data isKindOfClass:[NSNull class]]) { + [self internalSetNestedData:data + forKey:serverCacheKey(path) + withBatch:batch + counter:counter]; + } +} + +- (NSUInteger)serverCacheEstimatedSizeInBytes { + // Use the exact size, because for pruning the approximate size can lead to + // weird situations where we prune everything because no compaction is ever + // run + return [self.serverCacheDB exactSizeFrom:kFServerCachePrefix + to:kFServerCacheRangeEnd]; +} + +- (void)pruneCache:(FPruneForest *)pruneForest atPath:(FPath *)path { + // TODO: be more intelligent, don't scan entire database... + + __block NSUInteger pruned = 0; + __block NSUInteger kept = 0; + NSDate *start = [NSDate date]; + + NSString *prefix = serverCacheKey(path); + id batch = [self.serverCacheDB beginWriteBatch]; + + [self.serverCacheDB + enumerateKeysWithPrefix:prefix + usingBlock:^(NSString *dbKey, BOOL *stop) { + NSString *pathStr = + [dbKey substringFromIndex:prefix.length]; + FPath *relativePath = [[FPath alloc] initWith:pathStr]; + if ([pruneForest shouldPruneUnkeptDescendantsAtPath: + relativePath]) { + pruned++; + [batch removeKey:dbKey]; + } else { + kept++; + } + }]; + BOOL success = [batch commit]; + if (!success) { + FFWarn(@"I-RDB076021", @"Failed to prune cache on disk!"); + } else { + FFDebug(@"I-RDB076022", @"Pruned %lu paths, kept %lu paths in %fms", + (unsigned long)pruned, (unsigned long)kept, + [start timeIntervalSinceNow] * -1000); + } +} + +#pragma mark - Tracked Queries + +- (NSArray *)loadTrackedQueries { + NSDate *date = [NSDate date]; + NSMutableArray *trackedQueries = [NSMutableArray array]; + [self.serverCacheDB + enumerateKeysWithPrefix:kFTrackedQueriesPrefix + asData:^(NSString *key, NSData *data, BOOL *stop) { + NSError *error = nil; + NSDictionary *queryJSON = + [NSJSONSerialization JSONObjectWithData:data + options:0 + error:&error]; + if (queryJSON == nil) { + if (error.code == kFNanFailureCode) { + FFWarn( + @"I-RDB076023", + @"Failed to deserialize tracked query " + @"(%@), likely because of out of range " + @"doubles (Error: %@)", + [[NSString alloc] + initWithData:data + encoding:NSUTF8StringEncoding], + error); + FFWarn(@"I-RDB076024", + @"Removing failed tracked query with " + @"key %@", + key); + [self.serverCacheDB removeKey:key]; + } else { + [NSException + raise:NSInternalInconsistencyException + format:@"Failed to deserialize tracked " + @"query: %@", + error]; + } + } else { + NSUInteger queryId = + ((NSNumber *)queryJSON[kFTrackedQueryId]) + .unsignedIntegerValue; + FPath *path = + [FPath pathWithString: + queryJSON[kFTrackedQueryPath]]; + FQueryParams *params = [FQueryParams + fromQueryObject:queryJSON + [kFTrackedQueryParams]]; + FQuerySpec *query = + [[FQuerySpec alloc] initWithPath:path + params:params]; + BOOL isComplete = + [queryJSON[kFTrackedQueryIsComplete] + boolValue]; + BOOL isActive = + [queryJSON[kFTrackedQueryIsActive] + boolValue]; + NSTimeInterval lastUse = + [queryJSON[kFTrackedQueryLastUse] + doubleValue]; + + FTrackedQuery *trackedQuery = + [[FTrackedQuery alloc] + initWithId:queryId + query:query + lastUse:lastUse + isActive:isActive + isComplete:isComplete]; + + [trackedQueries addObject:trackedQuery]; + } + }]; + FFDebug(@"I-RDB076025", @"Loaded %lu tracked queries in %fms", + (unsigned long)trackedQueries.count, + [date timeIntervalSinceNow] * -1000); + return trackedQueries; +} + +- (void)removeTrackedQuery:(NSUInteger)queryId { + NSDate *start = [NSDate date]; + id batch = [self.serverCacheDB beginWriteBatch]; + [batch removeKey:trackedQueryKey(queryId)]; + __block NSUInteger keyCount = 0; + [self.serverCacheDB + enumerateKeysWithPrefix:trackedQueryKeysKeyPrefix(queryId) + usingBlock:^(NSString *key, BOOL *stop) { + [batch removeKey:key]; + keyCount++; + }]; + + BOOL success = [batch commit]; + if (!success) { + FFWarn(@"I-RDB076026", @"Failed to remove tracked query on disk!"); + } else { + FFDebug(@"I-RDB076027", + @"Removed query with id %lu (and removed %lu keys) in %fms", + (unsigned long)queryId, (unsigned long)keyCount, + [start timeIntervalSinceNow] * -1000); + } +} + +- (void)saveTrackedQuery:(FTrackedQuery *)query { + NSDate *start = [NSDate date]; + NSDictionary *trackedQuery = @{ + kFTrackedQueryId : @(query.queryId), + kFTrackedQueryPath : [query.query.path toStringWithTrailingSlash], + kFTrackedQueryParams : [query.query.params wireProtocolParams], + kFTrackedQueryLastUse : @(query.lastUse), + kFTrackedQueryIsComplete : @(query.isComplete), + kFTrackedQueryIsActive : @(query.isActive) + }; + NSError *error = nil; + NSData *data = [NSJSONSerialization dataWithJSONObject:trackedQuery + options:0 + error:&error]; + NSAssert(data, @"Failed to serialize tracked query (Error: %@)", error); + [self.serverCacheDB setData:data forKey:trackedQueryKey(query.queryId)]; + FFDebug(@"I-RDB076028", @"Saved tracked query %lu in %fms", + (unsigned long)query.queryId, [start timeIntervalSinceNow] * -1000); +} + +- (void)setTrackedQueryKeys:(NSSet *)keys forQueryId:(NSUInteger)queryId { + NSDate *start = [NSDate date]; + __block NSUInteger removed = 0; + __block NSUInteger added = 0; + id batch = [self.serverCacheDB beginWriteBatch]; + NSMutableSet *seenKeys = [NSMutableSet set]; + // First, delete any keys that might be stored and are not part of the + // current keys + [self.serverCacheDB + enumerateKeysWithPrefix:trackedQueryKeysKeyPrefix(queryId) + asStrings:^(NSString *dbKey, NSString *actualKey, + BOOL *stop) { + if ([keys containsObject:actualKey]) { + // Already in DB + [seenKeys addObject:actualKey]; + } else { + // Not part of set, delete key + [batch removeKey:dbKey]; + removed++; + } + }]; + + // Next add any keys that are missing in the database + [keys enumerateObjectsUsingBlock:^(NSString *childKey, BOOL *stop) { + if (![seenKeys containsObject:childKey]) { + [batch setString:childKey + forKey:trackedQueryKeysKey(queryId, childKey)]; + added++; + } + }]; + BOOL success = [batch commit]; + if (!success) { + FFWarn(@"I-RDB076029", @"Failed to set tracked queries on disk!"); + } else { + FFDebug(@"I-RDB076030", + @"Set %lu tracked keys (%lu added, %lu removed) for query %lu " + @"in %fms", + (unsigned long)keys.count, (unsigned long)added, + (unsigned long)removed, (unsigned long)queryId, + [start timeIntervalSinceNow] * -1000); + } +} + +- (void)updateTrackedQueryKeysWithAddedKeys:(NSSet *)added + removedKeys:(NSSet *)removed + forQueryId:(NSUInteger)queryId { + NSDate *start = [NSDate date]; + id batch = [self.serverCacheDB beginWriteBatch]; + [removed enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { + [batch removeKey:trackedQueryKeysKey(queryId, key)]; + }]; + [added enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { + [batch setString:key forKey:trackedQueryKeysKey(queryId, key)]; + }]; + BOOL success = [batch commit]; + if (!success) { + FFWarn(@"I-RDB076031", @"Failed to update tracked queries on disk!"); + } else { + FFDebug(@"I-RDB076032", + @"Added %lu tracked keys, removed %lu for query %lu in %fms", + (unsigned long)added.count, (unsigned long)removed.count, + (unsigned long)queryId, [start timeIntervalSinceNow] * -1000); + } +} + +- (NSSet *)trackedQueryKeysForQuery:(NSUInteger)queryId { + NSDate *start = [NSDate date]; + NSMutableSet *set = [NSMutableSet set]; + [self.serverCacheDB + enumerateKeysWithPrefix:trackedQueryKeysKeyPrefix(queryId) + asStrings:^(NSString *dbKey, NSString *actualKey, + BOOL *stop) { + [set addObject:actualKey]; + }]; + FFDebug(@"I-RDB076033", @"Loaded %lu tracked keys for query %lu in %fms", + (unsigned long)set.count, (unsigned long)queryId, + [start timeIntervalSinceNow] * -1000); + return set; +} + +#pragma mark - Internal methods + +- (void)removeAllLeafNodesOnPath:(FPath *)path + batch:(id)batch { + while (!path.isEmpty) { + [batch removeKey:serverCacheKey(path)]; + path = [path parent]; + } + // Make sure to delete any nodes at the root + [batch removeKey:serverCacheKey([FPath empty])]; +} + +- (void)removeAllWithPrefix:(NSString *)prefix + batch:(id)batch + database:(APLevelDB *)database { + assert(prefix != nil); + + [database enumerateKeysWithPrefix:prefix + usingBlock:^(NSString *key, BOOL *stop) { + [batch removeKey:key]; + }]; +} + +#pragma mark - Internal helper methods + +- (void)internalSetNestedData:(id)value + forKey:(NSString *)key + withBatch:(id)batch + counter:(NSUInteger *)counter { + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictionary = value; + [dictionary enumerateKeysAndObjectsUsingBlock:^(id childKey, id obj, + BOOL *stop) { + assert(obj != nil); + NSString *childPath = + [NSString stringWithFormat:@"%@%@/", key, childKey]; + [self internalSetNestedData:obj + forKey:childPath + withBatch:batch + counter:counter]; + }]; + } else { + NSData *data = [self serializePrimitive:value]; + [batch setData:data forKey:key]; + (*counter)++; + } +} + +- (id)internalNestedDataForPath:(FPath *)path { + NSAssert(path != nil, @"Path was nil!"); + + NSString *baseKey = serverCacheKey(path); + + // HACK to make sure iter is freed now to avoid race conditions (if self.db + // is deleted before iter, you get an access violation). + @autoreleasepool { + APLevelDBIterator *iter = + [APLevelDBIterator iteratorWithLevelDB:self.serverCacheDB]; + + [iter seekToKey:baseKey]; + if (iter.key == nil || ![iter.key hasPrefix:baseKey]) { + // No data. + return nil; + } else { + return [self internalNestedDataFromIterator:iter + andKeyPrefix:baseKey]; + } + } +} + +- (id)internalNestedDataFromIterator:(APLevelDBIterator *)iterator + andKeyPrefix:(NSString *)prefix { + NSString *key = iterator.key; + + if ([key isEqualToString:prefix]) { + id result = [self deserializePrimitive:iterator.valueAsData]; + [iterator nextKey]; + return result; + } else { + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + while (key != nil && [key hasPrefix:prefix]) { + NSString *relativePath = [key substringFromIndex:prefix.length]; + NSArray *pathPieces = + [relativePath componentsSeparatedByString:@"/"]; + assert(pathPieces.count > 0); + NSString *childName = pathPieces[0]; + NSString *childPath = + [NSString stringWithFormat:@"%@%@/", prefix, childName]; + id childValue = [self internalNestedDataFromIterator:iterator + andKeyPrefix:childPath]; + [dict setValue:childValue forKey:childName]; + + key = iterator.key; + } + return dict; + } +} + +- (NSData *)serializePrimitive:(id)value { + // HACK: The built-in serialization only works on dicts and arrays. So we + // create an array and then strip off the leading / trailing byte (the [ and + // ]). + NSError *error = nil; + NSData *data = [NSJSONSerialization dataWithJSONObject:@[ value ] + options:0 + error:&error]; + NSAssert(data, @"Failed to serialize primitive: %@", error); + + return [data subdataWithRange:NSMakeRange(1, data.length - 2)]; +} + +- (id)fixDoubleParsing:(id)value + __attribute__((no_sanitize("float-cast-overflow"))) { + if ([value isKindOfClass:[NSDecimalNumber class]]) { + // In case the value is an NSDecimalNumber, we may be dealing with + // precisions that are higher than what can be represented in a double. + // In this case it does not suffice to check for integral numbers by + // casting the [value doubleValue] to an int64_t, because this will + // cause the compared values to be rounded to double precision. + // Coupled with a bug in [NSDecimalNumber longLongValue] that triggers + // when converting values with high precision, this would cause + // values of high precision, but with an integral 'doubleValue' + // representation to be converted to bogus values. + // A radar for the NSDecimalNumber issue can be found here: + // http://www.openradar.me/radar?id=5007005597040640 + // Consider the NSDecimalNumber value: 999.9999999999999487 + // This number has a 'doubleValue' of 1000. Using the previous version + // of this method would cause the value to be interpreted to be integral + // and then the resulting value would be based on the longLongValue + // which due to the NSDecimalNumber issue would turn out as -844. + // By using NSDecimal logic to test for integral values, + // 999.9999999999999487 will not be considered integral, and instead + // of triggering the 'longLongValue' issue, it will be returned as + // the 'doubleValue' representation (1000). + // Please note, that even without the NSDecimalNumber issue, the + // 'correct' longLongValue of 999.9999999999999487 is 999 and not 1000, + // so the previous code would cause issues even without the bug + // referenced in the radar. + NSDecimal original = [(NSDecimalNumber *)value decimalValue]; + NSDecimal rounded; + NSDecimalRound(&rounded, &original, 0, NSRoundPlain); + if (NSDecimalCompare(&original, &rounded) != NSOrderedSame) { + NSString *doubleString = [value stringValue]; + return [NSNumber numberWithDouble:[doubleString doubleValue]]; + } else { + return [NSNumber numberWithLongLong:[value longLongValue]]; + } + } else if ([value isKindOfClass:[NSNumber class]]) { + // The parser for double values in JSONSerialization at the root takes + // some short-cuts and delivers wrong results (wrong rounding) for some + // double values, including 2.47. Because we use the exact bytes for + // hashing on the server this will lead to hash mismatches. The parser + // of NSNumber seems to be more in line with what the server expects, so + // we use that here + CFNumberType type = CFNumberGetType((CFNumberRef)value); + if (type == kCFNumberDoubleType || type == kCFNumberFloatType) { + // The NSJSON parser returns all numbers as double values, even + // those that contain no exponent. To make sure that the String + // conversion below doesn't unexpectedly reduce precision, we make + // sure that our number is indeed not an integer. + if ((double)(int64_t)[value doubleValue] != [value doubleValue]) { + NSString *doubleString = [value stringValue]; + return [NSNumber numberWithDouble:[doubleString doubleValue]]; + } else { + return [NSNumber numberWithLongLong:[value longLongValue]]; + } + } + } + return value; +} + +- (id)deserializePrimitive:(NSData *)data { + NSError *error = nil; + id result = + [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingAllowFragments + error:&error]; + if (result != nil) { + return [self fixDoubleParsing:result]; + } else { + if (error.code == kFNanFailureCode) { + FFWarn(@"I-RDB076034", + @"Failed to load primitive %@, likely because doubles where " + @"out of range (Error: %@)", + [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding], + error); + return [NSNull null]; + } else { + [NSException raise:NSInternalInconsistencyException + format:@"Failed to deserialiaze primitive: %@", error]; + return nil; + } + } +} + ++ (void)ensureDir:(NSString *)path markAsDoNotBackup:(BOOL)markAsDoNotBackup { + NSError *error; + BOOL success = + [[NSFileManager defaultManager] createDirectoryAtPath:path + withIntermediateDirectories:YES + attributes:nil + error:&error]; + if (!success) { + @throw [NSException + exceptionWithName:@"FailedToCreatePersistenceDir" + reason:@"Failed to create persistence directory." + userInfo:@{@"path" : path}]; + } + + if (markAsDoNotBackup) { + NSURL *firebaseDirURL = [NSURL fileURLWithPath:path]; + success = [firebaseDirURL setResourceValue:@YES + forKey:NSURLIsExcludedFromBackupKey + error:&error]; + if (!success) { + FFWarn( + @"I-RDB076035", + @"Failed to mark firebase database folder as do not backup: %@", + error); + [NSException raise:@"Error marking as do not backup" + format:@"Failed to mark folder %@ as do not backup", + firebaseDirURL]; + } + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPendingPut.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPendingPut.h new file mode 100644 index 00000000..602bf8cc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPendingPut.h @@ -0,0 +1,53 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPath.h" +#import + +// These are all legacy classes and are used to migrate older persistence data +// base to newer ones These classes should not be used in newer code + +@interface FPendingPut : NSObject + +@property(nonatomic, strong) FPath *path; +@property(nonatomic, strong) id data; +@property(nonatomic, strong) id priority; + +- (id)initWithPath:(FPath *)aPath andData:(id)aData andPriority:aPriority; +- (void)encodeWithCoder:(NSCoder *)aCoder; +- (id)initWithCoder:(NSCoder *)aDecoder; +@end + +@interface FPendingPutPriority : NSObject + +@property(nonatomic, strong) FPath *path; +@property(nonatomic, strong) id priority; + +- (id)initWithPath:(FPath *)aPath andPriority:(id)aPriority; +- (void)encodeWithCoder:(NSCoder *)aCoder; +- (id)initWithCoder:(NSCoder *)aDecoder; + +@end + +@interface FPendingUpdate : NSObject + +@property(nonatomic, strong) FPath *path; +@property(nonatomic, strong) NSDictionary *data; + +- (id)initWithPath:(FPath *)aPath andData:(NSDictionary *)aData; +- (void)encodeWithCoder:(NSCoder *)aCoder; +- (id)initWithCoder:(NSCoder *)aDecoder; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPendingPut.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPendingPut.m new file mode 100644 index 00000000..c5195995 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPendingPut.m @@ -0,0 +1,113 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPendingPut.h" + +@implementation FPendingPut + +@synthesize path; +@synthesize data; + +- (id)initWithPath:(FPath *)aPath andData:(id)aData andPriority:(id)aPriority { + self = [super init]; + if (self) { + self.path = aPath; + self.data = aData; + self.priority = aPriority; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:[self.path description] forKey:@"path"]; + [aCoder encodeObject:self.data forKey:@"data"]; + [aCoder encodeObject:self.priority forKey:@"priority"]; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super init]; + if (self) { + self.path = + [[FPath alloc] initWith:[aDecoder decodeObjectForKey:@"path"]]; + self.data = [aDecoder decodeObjectForKey:@"data"]; + self.priority = [aDecoder decodeObjectForKey:@"priority"]; + } + return self; +} + +@end + +@implementation FPendingPutPriority + +@synthesize path; +@synthesize priority; + +- (id)initWithPath:(FPath *)aPath andPriority:(id)aPriority { + self = [super init]; + if (self) { + self.path = aPath; + self.priority = aPriority; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:[self.path description] forKey:@"path"]; + [aCoder encodeObject:self.priority forKey:@"priority"]; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super init]; + if (self) { + self.path = + [[FPath alloc] initWith:[aDecoder decodeObjectForKey:@"path"]]; + self.priority = [aDecoder decodeObjectForKey:@"priority"]; + } + return self; +} + +@end + +@implementation FPendingUpdate + +@synthesize path; +@synthesize data; + +- (id)initWithPath:(FPath *)aPath andData:(id)aData { + self = [super init]; + if (self) { + self.path = aPath; + self.data = aData; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:[self.path description] forKey:@"path"]; + [aCoder encodeObject:self.data forKey:@"data"]; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super init]; + if (self) { + self.path = + [[FPath alloc] initWith:[aDecoder decodeObjectForKey:@"path"]]; + self.data = [aDecoder decodeObjectForKey:@"data"]; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPersistenceManager.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPersistenceManager.h new file mode 100644 index 00000000..681c56d5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPersistenceManager.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FCacheNode.h" +#import "FCachePolicy.h" +#import "FCompoundWrite.h" +#import "FNode.h" +#import "FQuerySpec.h" +#import "FRepoInfo.h" +#import "FStorageEngine.h" + +@interface FPersistenceManager : NSObject + +- (id)initWithStorageEngine:(id)storageEngine + cachePolicy:(id)cachePolicy; +- (void)close; + +- (void)saveUserOverwrite:(id)node + atPath:(FPath *)path + writeId:(NSUInteger)writeId; +- (void)saveUserMerge:(FCompoundWrite *)merge + atPath:(FPath *)path + writeId:(NSUInteger)writeId; +- (void)removeUserWrite:(NSUInteger)writeId; +- (void)removeAllUserWrites; +- (NSArray *)userWrites; + +- (FCacheNode *)serverCacheForQuery:(FQuerySpec *)spec; +- (void)updateServerCacheWithNode:(id)node forQuery:(FQuerySpec *)spec; +- (void)updateServerCacheWithMerge:(FCompoundWrite *)merge atPath:(FPath *)path; + +- (void)applyUserWrite:(id)write toServerCacheAtPath:(FPath *)path; +- (void)applyUserMerge:(FCompoundWrite *)merge + toServerCacheAtPath:(FPath *)path; + +- (void)setQueryComplete:(FQuerySpec *)spec; +- (void)setQueryActive:(FQuerySpec *)spec; +- (void)setQueryInactive:(FQuerySpec *)spec; + +- (void)setTrackedQueryKeys:(NSSet *)keys forQuery:(FQuerySpec *)query; +- (void)updateTrackedQueryKeysWithAddedKeys:(NSSet *)added + removedKeys:(NSSet *)removed + forQuery:(FQuerySpec *)query; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPersistenceManager.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPersistenceManager.m new file mode 100644 index 00000000..4090da95 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPersistenceManager.m @@ -0,0 +1,231 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPersistenceManager.h" +#import "FCacheNode.h" +#import "FClock.h" +#import "FIndexedNode.h" +#import "FLevelDBStorageEngine.h" +#import "FPruneForest.h" +#import "FTrackedQuery.h" +#import "FTrackedQueryManager.h" +#import "FUtilities.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +@interface FPersistenceManager () + +@property(nonatomic, strong) id storageEngine; +@property(nonatomic, strong) id cachePolicy; +@property(nonatomic, strong) FTrackedQueryManager *trackedQueryManager; +@property(nonatomic) NSUInteger serverCacheUpdatesSinceLastPruneCheck; + +@end + +@implementation FPersistenceManager + +- (id)initWithStorageEngine:(id)storageEngine + cachePolicy:(id)cachePolicy { + self = [super init]; + if (self != nil) { + self->_storageEngine = storageEngine; + self->_cachePolicy = cachePolicy; + self->_trackedQueryManager = [[FTrackedQueryManager alloc] + initWithStorageEngine:self.storageEngine + clock:[FSystemClock clock]]; + } + return self; +} + +- (void)close { + [self.storageEngine close]; + self.storageEngine = nil; + self.trackedQueryManager = nil; +} + +- (void)saveUserOverwrite:(id)node + atPath:(FPath *)path + writeId:(NSUInteger)writeId { + [self.storageEngine saveUserOverwrite:node atPath:path writeId:writeId]; +} + +- (void)saveUserMerge:(FCompoundWrite *)merge + atPath:(FPath *)path + writeId:(NSUInteger)writeId { + [self.storageEngine saveUserMerge:merge atPath:path writeId:writeId]; +} + +- (void)removeUserWrite:(NSUInteger)writeId { + [self.storageEngine removeUserWrite:writeId]; +} + +- (void)removeAllUserWrites { + [self.storageEngine removeAllUserWrites]; +} + +- (NSArray *)userWrites { + return [self.storageEngine userWrites]; +} + +- (FCacheNode *)serverCacheForQuery:(FQuerySpec *)query { + NSSet *trackedKeys; + BOOL complete; + // TODO[offline]: Should we use trackedKeys to find out if this location is + // a child of a complete query? + if ([self.trackedQueryManager isQueryComplete:query]) { + complete = YES; + FTrackedQuery *trackedQuery = + [self.trackedQueryManager findTrackedQuery:query]; + if (!query.loadsAllData && trackedQuery.isComplete) { + trackedKeys = [self.storageEngine + trackedQueryKeysForQuery:trackedQuery.queryId]; + } else { + trackedKeys = nil; + } + } else { + complete = NO; + trackedKeys = + [self.trackedQueryManager knownCompleteChildrenAtPath:query.path]; + } + + id node; + if (trackedKeys != nil) { + node = [self.storageEngine serverCacheForKeys:trackedKeys + atPath:query.path]; + } else { + node = [self.storageEngine serverCacheAtPath:query.path]; + } + + FIndexedNode *indexedNode = [FIndexedNode indexedNodeWithNode:node + index:query.index]; + return [[FCacheNode alloc] initWithIndexedNode:indexedNode + isFullyInitialized:complete + isFiltered:(trackedKeys != nil)]; +} + +- (void)updateServerCacheWithNode:(id)node forQuery:(FQuerySpec *)query { + BOOL merge = !query.loadsAllData; + [self.storageEngine updateServerCache:node atPath:query.path merge:merge]; + [self setQueryComplete:query]; + [self doPruneCheckAfterServerUpdate]; +} + +- (void)updateServerCacheWithMerge:(FCompoundWrite *)merge + atPath:(FPath *)path { + [self.storageEngine updateServerCacheWithMerge:merge atPath:path]; + [self doPruneCheckAfterServerUpdate]; +} + +- (void)applyUserMerge:(FCompoundWrite *)merge + toServerCacheAtPath:(FPath *)path { + // TODO[offline]: rework this to be more efficient + [merge enumerateWrites:^(FPath *relativePath, id node, BOOL *stop) { + [self applyUserWrite:node toServerCacheAtPath:[path child:relativePath]]; + }]; +} + +- (void)applyUserWrite:(id)write toServerCacheAtPath:(FPath *)path { + // This is a hack to guess whether we already cached this because we got a + // server data update for this write via an existing active default query. + // If we didn't, then we'll manually cache this and add a tracked query to + // mark it complete and keep it cached. Unfortunately this is just a guess + // and it's possible that we *did* get an update (e.g. via a filtered query) + // and by overwriting the cache here, we'll actually store an incorrect + // value (e.g. in the case that we wrote a ServerValue.TIMESTAMP and the + // server resolved it to a different value). + // TODO[offline]: Consider reworking. + if (![self.trackedQueryManager hasActiveDefaultQueryAtPath:path]) { + [self.storageEngine updateServerCache:write atPath:path merge:NO]; + [self.trackedQueryManager ensureCompleteTrackedQueryAtPath:path]; + } +} + +- (void)setQueryComplete:(FQuerySpec *)query { + if (query.loadsAllData) { + [self.trackedQueryManager setQueriesCompleteAtPath:query.path]; + } else { + [self.trackedQueryManager setQueryComplete:query]; + } +} + +- (void)setQueryActive:(FQuerySpec *)spec { + [self.trackedQueryManager setQueryActive:spec]; +} + +- (void)setQueryInactive:(FQuerySpec *)spec { + [self.trackedQueryManager setQueryInactive:spec]; +} + +- (void)doPruneCheckAfterServerUpdate { + self.serverCacheUpdatesSinceLastPruneCheck++; + if ([self.cachePolicy + shouldCheckCacheSize:self.serverCacheUpdatesSinceLastPruneCheck]) { + FFDebug(@"I-RDB078001", @"Reached prune check threshold. Checking..."); + NSDate *date = [NSDate date]; + self.serverCacheUpdatesSinceLastPruneCheck = 0; + BOOL canPrune = YES; + NSUInteger cacheSize = + [self.storageEngine serverCacheEstimatedSizeInBytes]; + FFDebug(@"I-RDB078002", @"Server cache size: %lu", + (unsigned long)cacheSize); + while (canPrune && + [self.cachePolicy + shouldPruneCacheWithSize:cacheSize + numberOfTrackedQueries:self.trackedQueryManager + .numberOfPrunableQueries]) { + FPruneForest *pruneForest = + [self.trackedQueryManager pruneOldQueries:self.cachePolicy]; + if (pruneForest.prunesAnything) { + [self.storageEngine pruneCache:pruneForest + atPath:[FPath empty]]; + } else { + canPrune = NO; + } + cacheSize = [self.storageEngine serverCacheEstimatedSizeInBytes]; + FFDebug(@"I-RDB078003", @"Cache size after pruning: %lu", + (unsigned long)cacheSize); + } + FFDebug(@"I-RDB078004", @"Pruning round took %fms", + [date timeIntervalSinceNow] * -1000); + } +} + +- (void)setTrackedQueryKeys:(NSSet *)keys forQuery:(FQuerySpec *)query { + NSAssert(!query.loadsAllData, + @"We should only track keys for filtered queries"); + FTrackedQuery *trackedQuery = + [self.trackedQueryManager findTrackedQuery:query]; + NSAssert(trackedQuery.isActive, + @"We only expect tracked keys for currently-active queries."); + [self.storageEngine setTrackedQueryKeys:keys + forQueryId:trackedQuery.queryId]; +} + +- (void)updateTrackedQueryKeysWithAddedKeys:(NSSet *)added + removedKeys:(NSSet *)removed + forQuery:(FQuerySpec *)query { + NSAssert(!query.loadsAllData, + @"We should only track keys for filtered queries"); + FTrackedQuery *trackedQuery = + [self.trackedQueryManager findTrackedQuery:query]; + NSAssert(trackedQuery.isActive, + @"We only expect tracked keys for currently-active queries."); + [self.storageEngine + updateTrackedQueryKeysWithAddedKeys:added + removedKeys:removed + forQueryId:trackedQuery.queryId]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPruneForest.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPruneForest.h new file mode 100644 index 00000000..9e77217a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPruneForest.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FPath; + +@interface FPruneForest : NSObject + ++ (FPruneForest *)empty; + +- (BOOL)prunesAnything; +- (BOOL)shouldPruneUnkeptDescendantsAtPath:(FPath *)path; +- (BOOL)shouldKeepPath:(FPath *)path; +- (BOOL)affectsPath:(FPath *)path; +- (FPruneForest *)child:(NSString *)childKey; +- (FPruneForest *)childAtPath:(FPath *)childKey; +- (FPruneForest *)prunePath:(FPath *)path; +- (FPruneForest *)keepPath:(FPath *)path; +- (FPruneForest *)keepAll:(NSSet *)children atPath:(FPath *)path; +- (FPruneForest *)pruneAll:(NSSet *)children atPath:(FPath *)path; + +- (void)enumarateKeptNodesUsingBlock:(void (^)(FPath *path))block; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPruneForest.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPruneForest.m new file mode 100644 index 00000000..e795c693 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FPruneForest.m @@ -0,0 +1,194 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPruneForest.h" + +#import "FImmutableTree.h" + +@interface FPruneForest () + +@property(nonatomic, strong) FImmutableTree *pruneForest; + +@end + +@implementation FPruneForest + +static BOOL (^kFPrunePredicate)(id) = ^BOOL(NSNumber *pruneValue) { + return [pruneValue boolValue]; +}; + +static BOOL (^kFKeepPredicate)(id) = ^BOOL(NSNumber *pruneValue) { + return ![pruneValue boolValue]; +}; + ++ (FImmutableTree *)pruneTree { + static dispatch_once_t onceToken; + static FImmutableTree *pruneTree; + dispatch_once(&onceToken, ^{ + pruneTree = [[FImmutableTree alloc] initWithValue:@YES]; + }); + return pruneTree; +} + ++ (FImmutableTree *)keepTree { + static dispatch_once_t onceToken; + static FImmutableTree *keepTree; + dispatch_once(&onceToken, ^{ + keepTree = [[FImmutableTree alloc] initWithValue:@NO]; + }); + return keepTree; +} + +- (id)initWithForest:(FImmutableTree *)tree { + self = [super init]; + if (self != nil) { + self->_pruneForest = tree; + } + return self; +} + ++ (FPruneForest *)empty { + static dispatch_once_t onceToken; + static FPruneForest *forest; + dispatch_once(&onceToken, ^{ + forest = [[FPruneForest alloc] initWithForest:[FImmutableTree empty]]; + }); + return forest; +} + +- (BOOL)prunesAnything { + return [self.pruneForest containsValueMatching:kFPrunePredicate]; +} + +- (BOOL)shouldPruneUnkeptDescendantsAtPath:(FPath *)path { + NSNumber *shouldPrune = [self.pruneForest leafMostValueOnPath:path]; + return shouldPrune != nil && [shouldPrune boolValue]; +} + +- (BOOL)shouldKeepPath:(FPath *)path { + NSNumber *shouldPrune = [self.pruneForest leafMostValueOnPath:path]; + return shouldPrune != nil && ![shouldPrune boolValue]; +} + +- (BOOL)affectsPath:(FPath *)path { + return [self.pruneForest rootMostValueOnPath:path] != nil || + ![[self.pruneForest subtreeAtPath:path] isEmpty]; +} + +- (FPruneForest *)child:(NSString *)childKey { + FImmutableTree *childPruneForest = [self.pruneForest.children get:childKey]; + if (childPruneForest == nil) { + if (self.pruneForest.value != nil) { + childPruneForest = [self.pruneForest.value boolValue] + ? [FPruneForest pruneTree] + : [FPruneForest keepTree]; + } else { + childPruneForest = [FImmutableTree empty]; + } + } else { + if (childPruneForest.value == nil && self.pruneForest.value != nil) { + childPruneForest = [childPruneForest setValue:self.pruneForest.value + atPath:[FPath empty]]; + } + } + return [[FPruneForest alloc] initWithForest:childPruneForest]; +} + +- (FPruneForest *)childAtPath:(FPath *)path { + if (path.isEmpty) { + return self; + } else { + return [[self child:path.getFront] childAtPath:[path popFront]]; + } +} + +- (FPruneForest *)prunePath:(FPath *)path { + if ([self.pruneForest rootMostValueOnPath:path matching:kFKeepPredicate]) { + [NSException raise:NSInvalidArgumentException + format:@"Can't prune path that was kept previously!"]; + } + if ([self.pruneForest rootMostValueOnPath:path matching:kFPrunePredicate]) { + // This path will already be pruned + return self; + } else { + FImmutableTree *newPruneForest = + [self.pruneForest setTree:[FPruneForest pruneTree] atPath:path]; + return [[FPruneForest alloc] initWithForest:newPruneForest]; + } +} + +- (FPruneForest *)keepPath:(FPath *)path { + if ([self.pruneForest rootMostValueOnPath:path matching:kFKeepPredicate]) { + // This path will already be kept + return self; + } else { + FImmutableTree *newPruneForest = + [self.pruneForest setTree:[FPruneForest keepTree] atPath:path]; + return [[FPruneForest alloc] initWithForest:newPruneForest]; + } +} + +- (FPruneForest *)keepAll:(NSSet *)children atPath:(FPath *)path { + if ([self.pruneForest rootMostValueOnPath:path matching:kFKeepPredicate]) { + // This path will already be kept + return self; + } else { + return [self setPruneValue:[FPruneForest keepTree] + forAll:children + atPath:path]; + } +} + +- (FPruneForest *)pruneAll:(NSSet *)children atPath:(FPath *)path { + if ([self.pruneForest rootMostValueOnPath:path matching:kFKeepPredicate]) { + [NSException raise:NSInvalidArgumentException + format:@"Can't prune path that was kept previously!"]; + } + if ([self.pruneForest rootMostValueOnPath:path matching:kFPrunePredicate]) { + // This path will already be pruned + return self; + } else { + return [self setPruneValue:[FPruneForest pruneTree] + forAll:children + atPath:path]; + } +} + +- (FPruneForest *)setPruneValue:(FImmutableTree *)pruneValue + forAll:(NSSet *)children + atPath:(FPath *)path { + FImmutableTree *subtree = [self.pruneForest subtreeAtPath:path]; + __block FImmutableSortedDictionary *childrenDictionary = subtree.children; + [children enumerateObjectsUsingBlock:^(NSString *childKey, BOOL *stop) { + childrenDictionary = [childrenDictionary insertKey:childKey + withValue:pruneValue]; + }]; + FImmutableTree *newSubtree = + [[FImmutableTree alloc] initWithValue:subtree.value + children:childrenDictionary]; + return [[FPruneForest alloc] + initWithForest:[self.pruneForest setTree:newSubtree atPath:path]]; +} + +- (void)enumarateKeptNodesUsingBlock:(void (^)(FPath *))block { + [self.pruneForest forEach:^(FPath *path, id value) { + if (value != nil && ![value boolValue]) { + block(path); + } + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FStorageEngine.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FStorageEngine.h new file mode 100644 index 00000000..5f418b80 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FStorageEngine.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FNode; +@class FPruneForest; +@class FPath; +@class FCompoundWrite; +@class FQuerySpec; +@class FTrackedQuery; + +@protocol FStorageEngine + +- (void)close; + +- (void)saveUserOverwrite:(id)node + atPath:(FPath *)path + writeId:(NSUInteger)writeId; +- (void)saveUserMerge:(FCompoundWrite *)merge + atPath:(FPath *)path + writeId:(NSUInteger)writeId; +- (void)removeUserWrite:(NSUInteger)writeId; +- (void)removeAllUserWrites; +- (NSArray *)userWrites; + +- (id)serverCacheAtPath:(FPath *)path; +- (id)serverCacheForKeys:(NSSet *)keys atPath:(FPath *)path; +- (void)updateServerCache:(id)node + atPath:(FPath *)path + merge:(BOOL)merge; +- (void)updateServerCacheWithMerge:(FCompoundWrite *)merge atPath:(FPath *)path; +- (NSUInteger)serverCacheEstimatedSizeInBytes; + +- (void)pruneCache:(FPruneForest *)pruneForest atPath:(FPath *)path; + +- (NSArray *)loadTrackedQueries; +- (void)removeTrackedQuery:(NSUInteger)queryId; +- (void)saveTrackedQuery:(FTrackedQuery *)query; + +- (void)setTrackedQueryKeys:(NSSet *)keys forQueryId:(NSUInteger)queryId; +- (void)updateTrackedQueryKeysWithAddedKeys:(NSSet *)added + removedKeys:(NSSet *)removed + forQueryId:(NSUInteger)queryId; +- (NSSet *)trackedQueryKeysForQuery:(NSUInteger)queryId; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQuery.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQuery.h new file mode 100644 index 00000000..7413816b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQuery.h @@ -0,0 +1,43 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FQuerySpec; + +@interface FTrackedQuery : NSObject + +@property(nonatomic, readonly) NSUInteger queryId; +@property(nonatomic, strong, readonly) FQuerySpec *query; +@property(nonatomic, readonly) NSTimeInterval lastUse; +@property(nonatomic, readonly) BOOL isComplete; +@property(nonatomic, readonly) BOOL isActive; + +- (id)initWithId:(NSUInteger)queryId + query:(FQuerySpec *)query + lastUse:(NSTimeInterval)lastUse + isActive:(BOOL)isActive; +- (id)initWithId:(NSUInteger)queryId + query:(FQuerySpec *)query + lastUse:(NSTimeInterval)lastUse + isActive:(BOOL)isActive + isComplete:(BOOL)isComplete; + +- (FTrackedQuery *)updateLastUse:(NSTimeInterval)lastUse; +- (FTrackedQuery *)setComplete; +- (FTrackedQuery *)setActiveState:(BOOL)isActive; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQuery.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQuery.m new file mode 100644 index 00000000..6ca7ec06 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQuery.m @@ -0,0 +1,113 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTrackedQuery.h" + +#import "FQuerySpec.h" + +@interface FTrackedQuery () + +@property(nonatomic, readwrite) NSUInteger queryId; +@property(nonatomic, strong, readwrite) FQuerySpec *query; +@property(nonatomic, readwrite) NSTimeInterval lastUse; +@property(nonatomic, readwrite) BOOL isComplete; +@property(nonatomic, readwrite) BOOL isActive; + +@end + +@implementation FTrackedQuery + +- (id)initWithId:(NSUInteger)queryId + query:(FQuerySpec *)query + lastUse:(NSTimeInterval)lastUse + isActive:(BOOL)isActive + isComplete:(BOOL)isComplete { + self = [super init]; + if (self != nil) { + self->_queryId = queryId; + self->_query = query; + self->_lastUse = lastUse; + self->_isComplete = isComplete; + self->_isActive = isActive; + } + return self; +} + +- (id)initWithId:(NSUInteger)queryId + query:(FQuerySpec *)query + lastUse:(NSTimeInterval)lastUse + isActive:(BOOL)isActive { + return [self initWithId:queryId + query:query + lastUse:lastUse + isActive:isActive + isComplete:NO]; +} + +- (FTrackedQuery *)updateLastUse:(NSTimeInterval)lastUse { + return [[FTrackedQuery alloc] initWithId:self.queryId + query:self.query + lastUse:lastUse + isActive:self.isActive + isComplete:self.isComplete]; +} + +- (FTrackedQuery *)setComplete { + return [[FTrackedQuery alloc] initWithId:self.queryId + query:self.query + lastUse:self.lastUse + isActive:self.isActive + isComplete:YES]; +} + +- (FTrackedQuery *)setActiveState:(BOOL)isActive { + return [[FTrackedQuery alloc] initWithId:self.queryId + query:self.query + lastUse:self.lastUse + isActive:isActive + isComplete:self.isComplete]; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[FTrackedQuery class]]) { + return NO; + } + FTrackedQuery *other = (FTrackedQuery *)object; + if (self.queryId != other.queryId) + return NO; + if (self.query != other.query && ![self.query isEqual:other.query]) + return NO; + if (self.lastUse != other.lastUse) + return NO; + if (self.isComplete != other.isComplete) + return NO; + if (self.isActive != other.isActive) + return NO; + + return YES; +} + +- (NSUInteger)hash { + NSUInteger hash = self.queryId; + hash = hash * 31 + self.query.hash; + hash = hash * 31 + (self.isActive ? 1 : 0); + hash = hash * 31 + (NSUInteger)self.lastUse; + hash = hash * 31 + (self.isComplete ? 1 : 0); + hash = hash * 31 + (self.isActive ? 1 : 0); + return hash; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQueryManager.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQueryManager.h new file mode 100644 index 00000000..cd7d5a18 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQueryManager.h @@ -0,0 +1,52 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FStorageEngine; +@protocol FClock; +@protocol FCachePolicy; +@class FQuerySpec; +@class FPath; +@class FTrackedQuery; +@class FPruneForest; + +@interface FTrackedQueryManager : NSObject + +- (id)initWithStorageEngine:(id)storageEngine + clock:(id)clock; + +- (FTrackedQuery *)findTrackedQuery:(FQuerySpec *)query; + +- (BOOL)isQueryComplete:(FQuerySpec *)query; + +- (void)removeTrackedQuery:(FQuerySpec *)query; +- (void)setQueryComplete:(FQuerySpec *)query; +- (void)setQueriesCompleteAtPath:(FPath *)path; +- (void)setQueryActive:(FQuerySpec *)query; +- (void)setQueryInactive:(FQuerySpec *)query; + +- (BOOL)hasActiveDefaultQueryAtPath:(FPath *)path; +- (void)ensureCompleteTrackedQueryAtPath:(FPath *)path; + +- (FPruneForest *)pruneOldQueries:(id)cachePolicy; +- (NSUInteger)numberOfPrunableQueries; +- (NSSet *)knownCompleteChildrenAtPath:(FPath *)path; + +// For testing +- (void)verifyCache; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQueryManager.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQueryManager.m new file mode 100644 index 00000000..f0a18e79 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Persistence/FTrackedQueryManager.m @@ -0,0 +1,375 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTrackedQueryManager.h" +#import "FCachePolicy.h" +#import "FClock.h" +#import "FImmutableTree.h" +#import "FLevelDBStorageEngine.h" +#import "FPruneForest.h" +#import "FTrackedQuery.h" +#import "FUtilities.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +@interface FTrackedQueryManager () + +@property(nonatomic, strong) FImmutableTree *trackedQueryTree; +@property(nonatomic, strong) id storageEngine; +@property(nonatomic, strong) id clock; +@property(nonatomic) NSUInteger currentQueryId; + +@end + +@implementation FTrackedQueryManager + +- (id)initWithStorageEngine:(id)storageEngine + clock:(id)clock { + self = [super init]; + if (self != nil) { + self->_storageEngine = storageEngine; + self->_clock = clock; + self->_trackedQueryTree = [FImmutableTree empty]; + + NSTimeInterval lastUse = [clock currentTime]; + + NSArray *trackedQueries = [self.storageEngine loadTrackedQueries]; + [trackedQueries enumerateObjectsUsingBlock:^( + FTrackedQuery *trackedQuery, NSUInteger idx, + BOOL *stop) { + self.currentQueryId = + MAX(trackedQuery.queryId + 1, self.currentQueryId); + if (trackedQuery.isActive) { + trackedQuery = + [[trackedQuery setActiveState:NO] updateLastUse:lastUse]; + FFDebug( + @"I-RDB081001", + @"Setting active query %lu from previous app start inactive", + (unsigned long)trackedQuery.queryId); + [self.storageEngine saveTrackedQuery:trackedQuery]; + } + [self cacheTrackedQuery:trackedQuery]; + }]; + } + return self; +} + ++ (void)assertValidTrackedQuery:(FQuerySpec *)query { + NSAssert(!query.loadsAllData || query.isDefault, + @"Can't have tracked non-default query that loads all data"); +} + ++ (FQuerySpec *)normalizeQuery:(FQuerySpec *)query { + return query.loadsAllData ? [FQuerySpec defaultQueryAtPath:query.path] + : query; +} + +- (FTrackedQuery *)findTrackedQuery:(FQuerySpec *)query { + query = [FTrackedQueryManager normalizeQuery:query]; + NSDictionary *set = [self.trackedQueryTree valueAtPath:query.path]; + return set[query.params]; +} + +- (void)removeTrackedQuery:(FQuerySpec *)query { + query = [FTrackedQueryManager normalizeQuery:query]; + FTrackedQuery *trackedQuery = [self findTrackedQuery:query]; + NSAssert(trackedQuery, @"Tracked query must exist to be removed!"); + + [self.storageEngine removeTrackedQuery:trackedQuery.queryId]; + NSMutableDictionary *trackedQueries = + [self.trackedQueryTree valueAtPath:query.path]; + [trackedQueries removeObjectForKey:query.params]; +} + +- (void)setQueryActive:(FQuerySpec *)query { + [self setQueryActive:YES forQuery:query]; +} + +- (void)setQueryInactive:(FQuerySpec *)query { + [self setQueryActive:NO forQuery:query]; +} + +- (void)setQueryActive:(BOOL)isActive forQuery:(FQuerySpec *)query { + query = [FTrackedQueryManager normalizeQuery:query]; + FTrackedQuery *trackedQuery = [self findTrackedQuery:query]; + + // Regardless of whether it's now active or no langer active, we update the + // lastUse time + NSTimeInterval lastUse = [self.clock currentTime]; + if (trackedQuery != nil) { + trackedQuery = + [[trackedQuery updateLastUse:lastUse] setActiveState:isActive]; + [self.storageEngine saveTrackedQuery:trackedQuery]; + } else { + NSAssert(isActive, @"If we're setting the query to inactive, we should " + @"already be tracking it!"); + trackedQuery = [[FTrackedQuery alloc] initWithId:self.currentQueryId++ + query:query + lastUse:lastUse + isActive:isActive]; + [self.storageEngine saveTrackedQuery:trackedQuery]; + } + + [self cacheTrackedQuery:trackedQuery]; +} + +- (void)setQueryComplete:(FQuerySpec *)query { + query = [FTrackedQueryManager normalizeQuery:query]; + FTrackedQuery *trackedQuery = [self findTrackedQuery:query]; + if (!trackedQuery) { + // We might have removed a query and pruned it before we got the + // complete message from the server... + FFWarn(@"I-RDB081002", + @"Trying to set a query complete that is not tracked!"); + } else if (!trackedQuery.isComplete) { + trackedQuery = [trackedQuery setComplete]; + [self.storageEngine saveTrackedQuery:trackedQuery]; + [self cacheTrackedQuery:trackedQuery]; + } else { + // Nothing to do, already marked complete + } +} + +- (void)setQueriesCompleteAtPath:(FPath *)path { + [[self.trackedQueryTree subtreeAtPath:path] + forEach:^(FPath *childPath, NSDictionary *trackedQueries) { + [trackedQueries enumerateKeysAndObjectsUsingBlock:^( + FQueryParams *parms, FTrackedQuery *trackedQuery, + BOOL *stop) { + if (!trackedQuery.isComplete) { + FTrackedQuery *newTrackedQuery = [trackedQuery setComplete]; + [self.storageEngine saveTrackedQuery:newTrackedQuery]; + [self cacheTrackedQuery:newTrackedQuery]; + } + }]; + }]; +} + +- (BOOL)isQueryComplete:(FQuerySpec *)query { + if ([self isIncludedInDefaultCompleteQuery:query]) { + return YES; + } else if (query.loadsAllData) { + // We didn't find a default complete query, so must not be complete. + return NO; + } else { + NSDictionary *trackedQueries = + [self.trackedQueryTree valueAtPath:query.path]; + return [trackedQueries[query.params] isComplete]; + } +} + +- (BOOL)hasActiveDefaultQueryAtPath:(FPath *)path { + return [self.trackedQueryTree + rootMostValueOnPath:path + matching:^BOOL(NSDictionary *trackedQueries) { + return + [trackedQueries[[FQueryParams defaultInstance]] + isActive]; + }] != nil; +} + +- (void)ensureCompleteTrackedQueryAtPath:(FPath *)path { + FQuerySpec *query = [FQuerySpec defaultQueryAtPath:path]; + if (![self isIncludedInDefaultCompleteQuery:query]) { + FTrackedQuery *trackedQuery = [self findTrackedQuery:query]; + if (trackedQuery == nil) { + trackedQuery = + [[FTrackedQuery alloc] initWithId:self.currentQueryId++ + query:query + lastUse:[self.clock currentTime] + isActive:NO + isComplete:YES]; + } else { + NSAssert(!trackedQuery.isComplete, + @"This should have been handled above!"); + trackedQuery = [trackedQuery setComplete]; + } + [self.storageEngine saveTrackedQuery:trackedQuery]; + [self cacheTrackedQuery:trackedQuery]; + } +} + +- (BOOL)isIncludedInDefaultCompleteQuery:(FQuerySpec *)query { + return + [self.trackedQueryTree + findRootMostMatchingPath:query.path + predicate:^BOOL(NSDictionary *trackedQueries) { + return + [trackedQueries[[FQueryParams defaultInstance]] + isComplete]; + }] != nil; +} + +- (void)cacheTrackedQuery:(FTrackedQuery *)query { + [FTrackedQueryManager assertValidTrackedQuery:query.query]; + NSMutableDictionary *trackedDict = + [self.trackedQueryTree valueAtPath:query.query.path]; + if (trackedDict == nil) { + trackedDict = [NSMutableDictionary dictionary]; + self.trackedQueryTree = + [self.trackedQueryTree setValue:trackedDict + atPath:query.query.path]; + } + trackedDict[query.query.params] = query; +} + +- (NSUInteger)numberOfQueriesToPrune:(id)cachePolicy + prunableCount:(NSUInteger)numPrunable { + NSUInteger numPercent = (NSUInteger)ceilf( + numPrunable * [cachePolicy percentOfQueriesToPruneAtOnce]); + NSUInteger maxToKeep = [cachePolicy maxNumberOfQueriesToKeep]; + NSUInteger numMax = (numPrunable > maxToKeep) ? numPrunable - maxToKeep : 0; + // Make sure we get below number of max queries to prune + return MAX(numMax, numPercent); +} + +- (FPruneForest *)pruneOldQueries:(id)cachePolicy { + NSMutableArray *pruneableQueries = [NSMutableArray array]; + NSMutableArray *unpruneableQueries = [NSMutableArray array]; + [self.trackedQueryTree + forEach:^(FPath *path, NSDictionary *trackedQueries) { + [trackedQueries enumerateKeysAndObjectsUsingBlock:^( + FQueryParams *params, FTrackedQuery *trackedQuery, + BOOL *stop) { + if (!trackedQuery.isActive) { + [pruneableQueries addObject:trackedQuery]; + } else { + [unpruneableQueries addObject:trackedQuery]; + } + }]; + }]; + [pruneableQueries sortUsingComparator:^NSComparisonResult( + FTrackedQuery *q1, FTrackedQuery *q2) { + if (q1.lastUse < q2.lastUse) { + return NSOrderedAscending; + } else if (q1.lastUse > q2.lastUse) { + return NSOrderedDescending; + } else { + return NSOrderedSame; + } + }]; + + __block FPruneForest *pruneForest = [FPruneForest empty]; + NSUInteger numToPrune = + [self numberOfQueriesToPrune:cachePolicy + prunableCount:pruneableQueries.count]; + + // TODO: do in transaction + for (NSUInteger i = 0; i < numToPrune; i++) { + FTrackedQuery *toPrune = pruneableQueries[i]; + pruneForest = [pruneForest prunePath:toPrune.query.path]; + [self removeTrackedQuery:toPrune.query]; + } + + // Keep the rest of the prunable queries + for (NSUInteger i = numToPrune; i < pruneableQueries.count; i++) { + FTrackedQuery *toKeep = pruneableQueries[i]; + pruneForest = [pruneForest keepPath:toKeep.query.path]; + } + + // Also keep unprunable queries + [unpruneableQueries enumerateObjectsUsingBlock:^( + FTrackedQuery *toKeep, NSUInteger idx, BOOL *stop) { + pruneForest = [pruneForest keepPath:toKeep.query.path]; + }]; + + return pruneForest; +} + +- (NSUInteger)numberOfPrunableQueries { + __block NSUInteger count = 0; + [self.trackedQueryTree + forEach:^(FPath *path, NSDictionary *trackedQueries) { + [trackedQueries enumerateKeysAndObjectsUsingBlock:^( + FQueryParams *params, FTrackedQuery *trackedQuery, + BOOL *stop) { + if (!trackedQuery.isActive) { + count++; + } + }]; + }]; + return count; +} + +- (NSSet *)filteredQueryIdsAtPath:(FPath *)path { + NSDictionary *queries = [self.trackedQueryTree valueAtPath:path]; + if (queries) { + NSMutableSet *ids = [NSMutableSet set]; + [queries enumerateKeysAndObjectsUsingBlock:^( + FQueryParams *params, FTrackedQuery *query, BOOL *stop) { + if (!query.query.loadsAllData) { + [ids addObject:@(query.queryId)]; + } + }]; + return ids; + } else { + return [NSSet set]; + } +} + +- (NSSet *)knownCompleteChildrenAtPath:(FPath *)path { + NSAssert(![self isQueryComplete:[FQuerySpec defaultQueryAtPath:path]], + @"Path is fully complete"); + + NSMutableSet *completeChildren = [NSMutableSet set]; + // First, get complete children from any queries at this location. + NSSet *queryIds = [self filteredQueryIdsAtPath:path]; + [queryIds enumerateObjectsUsingBlock:^(NSNumber *queryId, BOOL *stop) { + NSSet *keys = [self.storageEngine + trackedQueryKeysForQuery:[queryId unsignedIntegerValue]]; + [completeChildren unionSet:keys]; + }]; + + // Second, get any complete default queries immediately below us. + [[[self.trackedQueryTree subtreeAtPath:path] children] + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FImmutableTree *childTree, BOOL *stop) { + if ([childTree.value[[FQueryParams defaultInstance]] isComplete]) { + [completeChildren addObject:childKey]; + } + }]; + + return completeChildren; +} + +- (void)verifyCache { + NSArray *storedTrackedQueries = [self.storageEngine loadTrackedQueries]; + NSMutableArray *trackedQueries = [NSMutableArray array]; + + [self.trackedQueryTree forEach:^(FPath *path, NSDictionary *queryDict) { + [trackedQueries addObjectsFromArray:queryDict.allValues]; + }]; + NSComparator comparator = + ^NSComparisonResult(FTrackedQuery *q1, FTrackedQuery *q2) { + if (q1.queryId < q2.queryId) { + return NSOrderedAscending; + } else if (q1.queryId > q2.queryId) { + return NSOrderedDescending; + } else { + return NSOrderedSame; + } + }; + [trackedQueries sortUsingComparator:comparator]; + storedTrackedQueries = + [storedTrackedQueries sortedArrayUsingComparator:comparator]; + + if (![trackedQueries isEqualToArray:storedTrackedQueries]) { + [NSException + raise:NSInternalInconsistencyException + format:@"Tracked queries and queries stored on disk don't match"]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDataEventType.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDataEventType.h new file mode 100644 index 00000000..3aecd818 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDataEventType.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef Firebase_FIRDataEventType_h +#define Firebase_FIRDataEventType_h + +#import + +/** + * This enum is the set of events that you can observe at a Firebase Database + * location. + */ +typedef NS_ENUM(NSInteger, FIRDataEventType) { + /// A new child node is added to a location. + FIRDataEventTypeChildAdded, + /// A child node is removed from a location. + FIRDataEventTypeChildRemoved, + /// A child node at a location changes. + FIRDataEventTypeChildChanged, + /// A child node moves relative to the other child nodes at a location. + FIRDataEventTypeChildMoved, + /// Any data changes at a location or, recursively, at any child node. + FIRDataEventTypeValue +} NS_SWIFT_NAME(DataEventType); + +#endif diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDataSnapshot.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDataSnapshot.h new file mode 100644 index 00000000..e88febb6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDataSnapshot.h @@ -0,0 +1,142 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FIRDatabaseReference; + +/** + * A FIRDataSnapshot contains data from a Firebase Database location. Any time + * you read Firebase data, you receive the data as a FIRDataSnapshot. + * + * FIRDataSnapshots are passed to the blocks you attach with + * observeEventType:withBlock: or observeSingleEvent:withBlock:. They are + * efficiently-generated immutable copies of the data at a Firebase Database + * location. They can't be modified and will never change. To modify data at a + * location, use a FIRDatabaseReference (e.g. with setValue:). + */ +NS_SWIFT_NAME(DataSnapshot) +@interface FIRDataSnapshot : NSObject + +#pragma mark - Navigating and inspecting a snapshot + +/** + * Gets a FIRDataSnapshot for the location at the specified relative path. + * The relative path can either be a simple child key (e.g. 'fred') + * or a deeper slash-separated path (e.g. 'fred/name/first'). If the child + * location has no data, an empty FIRDataSnapshot is returned. + * + * @param childPathString A relative path to the location of child data. + * @return The FIRDataSnapshot for the child location. + */ +- (FIRDataSnapshot *)childSnapshotForPath:(NSString *)childPathString; + +/** + * Return YES if the specified child exists. + * + * @param childPathString A relative path to the location of a potential child. + * @return YES if data exists at the specified childPathString, else NO. + */ +- (BOOL)hasChild:(NSString *)childPathString; + +/** + * Return YES if the DataSnapshot has any children. + * + * @return YES if this snapshot has any children, else NO. + */ +- (BOOL)hasChildren; + +/** + * Return YES if the DataSnapshot contains a non-null value. + * + * @return YES if this snapshot contains a non-null value, else NO. + */ +- (BOOL)exists; + +#pragma mark - Data export + +/** + * Returns the raw value at this location, coupled with any metadata, such as + * priority. + * + * Priorities, where they exist, are accessible under the ".priority" key in + * instances of NSDictionary. For leaf locations with priorities, the value will + * be under the ".value" key. + */ +- (id __nullable)valueInExportFormat; + +#pragma mark - Properties + +/** + * Returns the contents of this data snapshot as native types. + * + * Data types returned: + * + NSDictionary + * + NSArray + * + NSNumber (also includes booleans) + * + NSString + * + * @return The data as a native object. + */ +@property(strong, readonly, nonatomic, nullable) id value; + +/** + * Gets the number of children for this DataSnapshot. + * + * @return An integer indicating the number of children. + */ +@property(readonly, nonatomic) NSUInteger childrenCount; + +/** + * Gets a FIRDatabaseReference for the location that this data came from. + * + * @return A FIRDatabaseReference instance for the location of this data. + */ +@property(nonatomic, readonly, strong) FIRDatabaseReference *ref; + +/** + * The key of the location that generated this FIRDataSnapshot. + * + * @return An NSString containing the key for the location of this + * FIRDataSnapshot. + */ +@property(strong, readonly, nonatomic) NSString *key; + +/** + * An iterator for snapshots of the child nodes in this snapshot. + * You can use the native for..in syntax: + * + * for (FIRDataSnapshot* child in snapshot.children) { + * ... + * } + * + * @return An NSEnumerator of the children. + */ +@property(strong, readonly, nonatomic) + NSEnumerator *children; + +/** + * The priority of the data in this FIRDataSnapshot. + * + * @return The priority as a string, or nil if no priority was set. + */ +@property(strong, readonly, nonatomic, nullable) id priority; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabase.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabase.h new file mode 100644 index 00000000..02af8c77 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabase.h @@ -0,0 +1,182 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseReference.h" +#import + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The entry point for accessing a Firebase Database. You can get an instance + * by calling [FIRDatabase database]. To access a location in the database and + * read or write data, use [FIRDatabase reference]. + */ +NS_SWIFT_NAME(Database) +@interface FIRDatabase : NSObject + +/** + * The NSObject initializer that has been marked as unavailable. Use the + * `database` method instead + * + * @return An instancetype instance + */ +- (instancetype)init + __attribute__((unavailable("use the database method instead"))); + +/** + * Gets the instance of FIRDatabase for the default FIRApp. + * + * @return A FIRDatabase instance. + */ ++ (FIRDatabase *)database NS_SWIFT_NAME(database()); + +/** + * Gets a FirebaseDatabase instance for the specified URL. + * + * @param url The URL to the Firebase Database instance you want to access. + * @return A FIRDatabase instance. + */ ++ (FIRDatabase *)databaseWithURL:(NSString *)url NS_SWIFT_NAME(database(url:)); + +/** + * Gets a FirebaseDatabase instance for the specified URL, using the specified + * FirebaseApp. + * + * @param app The FIRApp to get a FIRDatabase for. + * @param url The URL to the Firebase Database instance you want to access. + * @return A FIRDatabase instance. + */ +// clang-format off ++ (FIRDatabase *)databaseForApp:(FIRApp *)app + URL:(NSString *)url NS_SWIFT_NAME(database(app:url:)); +// clang-format on + +/** + * Gets an instance of FIRDatabase for a specific FIRApp. + * + * @param app The FIRApp to get a FIRDatabase for. + * @return A FIRDatabase instance. + */ ++ (FIRDatabase *)databaseForApp:(FIRApp *)app NS_SWIFT_NAME(database(app:)); + +/** The FIRApp instance to which this FIRDatabase belongs. */ +@property(weak, readonly, nonatomic) FIRApp *app; + +/** + * Gets a FIRDatabaseReference for the root of your Firebase Database. + */ +- (FIRDatabaseReference *)reference; + +/** + * Gets a FIRDatabaseReference for the provided path. + * + * @param path Path to a location in your Firebase Database. + * @return A FIRDatabaseReference pointing to the specified path. + */ +- (FIRDatabaseReference *)referenceWithPath:(NSString *)path; + +/** + * Gets a FIRDatabaseReference for the provided URL. The URL must be a URL to a + * path within this Firebase Database. To create a FIRDatabaseReference to a + * different database, create a FIRApp} with a FIROptions object configured with + * the appropriate database URL. + * + * @param databaseUrl A URL to a path within your database. + * @return A FIRDatabaseReference for the provided URL. + */ +- (FIRDatabaseReference *)referenceFromURL:(NSString *)databaseUrl; + +/** + * The Firebase Database client automatically queues writes and sends them to + * the server at the earliest opportunity, depending on network connectivity. In + * some cases (e.g. offline usage) there may be a large number of writes waiting + * to be sent. Calling this method will purge all outstanding writes so they are + * abandoned. + * + * All writes will be purged, including transactions and onDisconnect writes. + * The writes will be rolled back locally, perhaps triggering events for + * affected event listeners, and the client will not (re-)send them to the + * Firebase Database backend. + */ +- (void)purgeOutstandingWrites; + +/** + * Shuts down our connection to the Firebase Database backend until goOnline is + * called. + */ +- (void)goOffline; + +/** + * Resumes our connection to the Firebase Database backend after a previous + * goOffline call. + */ +- (void)goOnline; + +/** + * The Firebase Database client will cache synchronized data and keep track of + * all writes you've initiated while your application is running. It seamlessly + * handles intermittent network connections and re-sends write operations when + * the network connection is restored. + * + * However by default your write operations and cached data are only stored + * in-memory and will be lost when your app restarts. By setting this value to + * `YES`, the data will be persisted to on-device (disk) storage and will thus + * be available again when the app is restarted (even when there is no network + * connectivity at that time). Note that this property must be set before + * creating your first Database reference and only needs to be called once per + * application. + * + */ +@property(nonatomic) BOOL persistenceEnabled NS_SWIFT_NAME(isPersistenceEnabled) + ; + +/** + * By default the Firebase Database client will use up to 10MB of disk space to + * cache data. If the cache grows beyond this size, the client will start + * removing data that hasn't been recently used. If you find that your + * application caches too little or too much data, call this method to change + * the cache size. This property must be set before creating your first + * FIRDatabaseReference and only needs to be called once per application. + * + * Note that the specified cache size is only an approximation and the size on + * disk may temporarily exceed it at times. Cache sizes smaller than 1 MB or + * greater than 100 MB are not supported. + */ +@property(nonatomic) NSUInteger persistenceCacheSizeBytes; + +/** + * Sets the dispatch queue on which all events are raised. The default queue is + * the main queue. + * + * Note that this must be set before creating your first Database reference. + */ +@property(nonatomic, strong) dispatch_queue_t callbackQueue; + +/** + * Enables verbose diagnostic logging. + * + * @param enabled YES to enable logging, NO to disable. + */ ++ (void)setLoggingEnabled:(BOOL)enabled; + +/** Retrieve the Firebase Database SDK version. */ ++ (NSString *)sdkVersion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabaseQuery.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabaseQuery.h new file mode 100644 index 00000000..82057aae --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabaseQuery.h @@ -0,0 +1,395 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDataEventType.h" +#import "FIRDataSnapshot.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * A FIRDatabaseHandle is used to identify listeners of Firebase Database + * events. These handles are returned by observeEventType: and can later be + * passed to removeObserverWithHandle: to stop receiving updates. + */ +typedef NSUInteger FIRDatabaseHandle NS_SWIFT_NAME(DatabaseHandle); + +/** + * A FIRDatabaseQuery instance represents a query over the data at a particular + * location. + * + * You create one by calling one of the query methods (queryOrderedByChild:, + * queryStartingAtValue:, etc.) on a FIRDatabaseReference. The query methods can + * be chained to further specify the data you are interested in observing + */ +NS_SWIFT_NAME(DatabaseQuery) +@interface FIRDatabaseQuery : NSObject + +#pragma mark - Attach observers to read data + +/** + * observeEventType:withBlock: is used to listen for data changes at a + * particular location. This is the primary way to read data from the Firebase + * Database. Your block will be triggered for the initial data and again + * whenever the data changes. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. + * It is passed the data as a FIRDataSnapshot. + * @return A handle used to unregister this block later using + * removeObserverWithHandle: + */ +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + withBlock: + (void (^)(FIRDataSnapshot *snapshot))block; + +/** + * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data + * changes at a particular location. This is the primary way to read data from + * the Firebase Database. Your block will be triggered for the initial data and + * again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, + * FIRDataEventTypeChildMoved, and FIRDataEventTypeChildChanged events, your + * block will be passed the key of the previous node by priority order. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. + * It is passed the data as a FIRDataSnapshot and the previous child's key. + * @return A handle used to unregister this block later using + * removeObserverWithHandle: + */ +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock: + (void (^)(FIRDataSnapshot *snapshot, + NSString *__nullable prevKey))block; + +/** + * observeEventType:withBlock: is used to listen for data changes at a + * particular location. This is the primary way to read data from the Firebase + * Database. Your block will be triggered for the initial data and again + * whenever the data changes. + * + * The cancelBlock will be called if you will no longer receive new events due + * to no longer having permission. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. + * It is passed the data as a FIRDataSnapshot. + * @param cancelBlock The block that should be called if this client no longer + * has permission to receive these events + * @return A handle used to unregister this block later using + * removeObserverWithHandle: + */ +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + withBlock:(void (^)(FIRDataSnapshot *snapshot))block + withCancelBlock: + (nullable void (^)(NSError *error))cancelBlock; + +/** + * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data + * changes at a particular location. This is the primary way to read data from + * the Firebase Database. Your block will be triggered for the initial data and + * again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, + * FIRDataEventTypeChildMoved, and FIRDataEventTypeChildChanged events, your + * block will be passed the key of the previous node by priority order. + * + * The cancelBlock will be called if you will no longer receive new events due + * to no longer having permission. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. + * It is passed the data as a FIRDataSnapshot and the previous child's key. + * @param cancelBlock The block that should be called if this client no longer + * has permission to receive these events + * @return A handle used to unregister this block later using + * removeObserverWithHandle: + */ +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock: + (void (^)(FIRDataSnapshot *snapshot, + NSString *__nullable prevKey))block + withCancelBlock: + (nullable void (^)(NSError *error))cancelBlock; + +/** + * This is equivalent to observeEventType:withBlock:, except the block is + * immediately canceled after the initial data is returned. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as a + * FIRDataSnapshot. + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + withBlock:(void (^)(FIRDataSnapshot *snapshot))block; + +/** + * This is equivalent to observeEventType:withBlock:, except the block is + * immediately canceled after the initial data is returned. In addition, for + * FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and + * FIRDataEventTypeChildChanged events, your block will be passed the key of the + * previous node by priority order. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as a + * FIRDataSnapshot and the previous child's key. + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock: + (void (^)(FIRDataSnapshot *snapshot, + NSString *__nullable prevKey))block; + +/** + * This is equivalent to observeEventType:withBlock:, except the block is + * immediately canceled after the initial data is returned. + * + * The cancelBlock will be called if you do not have permission to read data at + * this location. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as a + * FIRDataSnapshot. + * @param cancelBlock The block that will be called if you don't have permission + * to access this data + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + withBlock:(void (^)(FIRDataSnapshot *snapshot))block + withCancelBlock:(nullable void (^)(NSError *error))cancelBlock; + +/** + * This is equivalent to observeEventType:withBlock:, except the block is + * immediately canceled after the initial data is returned. In addition, for + * FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and + * FIRDataEventTypeChildChanged events, your block will be passed the key of the + * previous node by priority order. + * + * The cancelBlock will be called if you do not have permission to read data at + * this location. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as a + * FIRDataSnapshot and the previous child's key. + * @param cancelBlock The block that will be called if you don't have permission + * to access this data + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, + NSString *__nullable prevKey))block + withCancelBlock: + (nullable void (^)(NSError *error))cancelBlock; + +#pragma mark - Detaching observers + +/** + * Detach a block previously attached with observeEventType:withBlock:. + * + * @param handle The handle returned by the call to observeEventType:withBlock: + * which we are trying to remove. + */ +- (void)removeObserverWithHandle:(FIRDatabaseHandle)handle; + +/** + * Detach all blocks previously attached to this Firebase Database location with + * observeEventType:withBlock: + */ +- (void)removeAllObservers; + +/** + * By calling `keepSynced:YES` on a location, the data for that location will + * automatically be downloaded and kept in sync, even when no listeners are + * attached for that location. Additionally, while a location is kept synced, it + * will not be evicted from the persistent disk cache. + * + * @param keepSynced Pass YES to keep this location synchronized, pass NO to + * stop synchronization. + */ +- (void)keepSynced:(BOOL)keepSynced; + +#pragma mark - Querying and limiting + +/** + * queryLimitedToFirst: is used to generate a reference to a limited view of the + * data at this location. The FIRDatabaseQuery instance returned by + * queryLimitedToFirst: will respond to at most the first limit child nodes. + * + * @param limit The upper bound, inclusive, for the number of child nodes to + * receive events for + * @return A FIRDatabaseQuery instance, limited to at most limit child nodes. + */ +- (FIRDatabaseQuery *)queryLimitedToFirst:(NSUInteger)limit; + +/** + * queryLimitedToLast: is used to generate a reference to a limited view of the + * data at this location. The FIRDatabaseQuery instance returned by + * queryLimitedToLast: will respond to at most the last limit child nodes. + * + * @param limit The upper bound, inclusive, for the number of child nodes to + * receive events for + * @return A FIRDatabaseQuery instance, limited to at most limit child nodes. + */ +- (FIRDatabaseQuery *)queryLimitedToLast:(NSUInteger)limit; + +/** + * queryOrderBy: is used to generate a reference to a view of the data that's + * been sorted by the values of a particular child key. This method is intended + * to be used in combination with queryStartingAtValue:, queryEndingAtValue:, or + * queryEqualToValue:. + * + * @param key The child key to use in ordering data visible to the returned + * FIRDatabaseQuery + * @return A FIRDatabaseQuery instance, ordered by the values of the specified + * child key. + */ +- (FIRDatabaseQuery *)queryOrderedByChild:(NSString *)key; + +/** + * queryOrderedByKey: is used to generate a reference to a view of the data + * that's been sorted by child key. This method is intended to be used in + * combination with queryStartingAtValue:, queryEndingAtValue:, or + * queryEqualToValue:. + * + * @return A FIRDatabaseQuery instance, ordered by child keys. + */ +- (FIRDatabaseQuery *)queryOrderedByKey; + +/** + * queryOrderedByValue: is used to generate a reference to a view of the data + * that's been sorted by child value. This method is intended to be used in + * combination with queryStartingAtValue:, queryEndingAtValue:, or + * queryEqualToValue:. + * + * @return A FIRDatabaseQuery instance, ordered by child value. + */ +- (FIRDatabaseQuery *)queryOrderedByValue; + +/** + * queryOrderedByPriority: is used to generate a reference to a view of the data + * that's been sorted by child priority. This method is intended to be used in + * combination with queryStartingAtValue:, queryEndingAtValue:, or + * queryEqualToValue:. + * + * @return A FIRDatabaseQuery instance, ordered by child priorities. + */ +- (FIRDatabaseQuery *)queryOrderedByPriority; + +/** + * queryStartingAtValue: is used to generate a reference to a limited view of + * the data at this location. The FIRDatabaseQuery instance returned by + * queryStartingAtValue: will respond to events at nodes with a value greater + * than or equal to startValue. + * + * @param startValue The lower bound, inclusive, for the value of data visible + * to the returned FIRDatabaseQuery + * @return A FIRDatabaseQuery instance, limited to data with value greater than + * or equal to startValue + */ +- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue; + +/** + * queryStartingAtValue:childKey: is used to generate a reference to a limited + * view of the data at this location. The FIRDatabaseQuery instance returned by + * queryStartingAtValue:childKey will respond to events at nodes with a value + * greater than startValue, or equal to startValue and with a key greater than + * or equal to childKey. This is most useful when implementing pagination in a + * case where multiple nodes can match the startValue. + * + * @param startValue The lower bound, inclusive, for the value of data visible + * to the returned FIRDatabaseQuery + * @param childKey The lower bound, inclusive, for the key of nodes with value + * equal to startValue + * @return A FIRDatabaseQuery instance, limited to data with value greater than + * or equal to startValue + */ +- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue + childKey:(nullable NSString *)childKey; + +/** + * queryEndingAtValue: is used to generate a reference to a limited view of the + * data at this location. The FIRDatabaseQuery instance returned by + * queryEndingAtValue: will respond to events at nodes with a value less than or + * equal to endValue. + * + * @param endValue The upper bound, inclusive, for the value of data visible to + * the returned FIRDatabaseQuery + * @return A FIRDatabaseQuery instance, limited to data with value less than or + * equal to endValue + */ +- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue; + +/** + * queryEndingAtValue:childKey: is used to generate a reference to a limited + * view of the data at this location. The FIRDatabaseQuery instance returned by + * queryEndingAtValue:childKey will respond to events at nodes with a value less + * than endValue, or equal to endValue and with a key less than or equal to + * childKey. This is most useful when implementing pagination in a case where + * multiple nodes can match the endValue. + * + * @param endValue The upper bound, inclusive, for the value of data visible to + * the returned FIRDatabaseQuery + * @param childKey The upper bound, inclusive, for the key of nodes with value + * equal to endValue + * @return A FIRDatabaseQuery instance, limited to data with value less than or + * equal to endValue + */ +- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue + childKey:(nullable NSString *)childKey; + +/** + * queryEqualToValue: is used to generate a reference to a limited view of the + * data at this location. The FIRDatabaseQuery instance returned by + * queryEqualToValue: will respond to events at nodes with a value equal to the + * supplied argument. + * + * @param value The value that the data returned by this FIRDatabaseQuery will + * have + * @return A FIRDatabaseQuery instance, limited to data with the supplied value. + */ +- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value; + +/** + * queryEqualToValue:childKey: is used to generate a reference to a limited view + * of the data at this location. The FIRDatabaseQuery instance returned by + * queryEqualToValue:childKey will respond to events at nodes with a value equal + * to the supplied argument and with their key equal to childKey. There will be + * at most one node that matches because child keys are unique. + * + * @param value The value that the data returned by this FIRDatabaseQuery will + * have + * @param childKey The name of nodes with the right value + * @return A FIRDatabaseQuery instance, limited to data with the supplied value + * and the key. + */ +- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value + childKey:(nullable NSString *)childKey; + +#pragma mark - Properties + +/** + * Gets a FIRDatabaseReference for the location of this query. + * + * @return A FIRDatabaseReference for the location of this query. + */ +@property(nonatomic, readonly, strong) FIRDatabaseReference *ref; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabaseReference.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabaseReference.h new file mode 100644 index 00000000..c80b2f8b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRDatabaseReference.h @@ -0,0 +1,861 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDataSnapshot.h" +#import "FIRDatabase.h" +#import "FIRDatabaseQuery.h" +#import "FIRMutableData.h" +#import "FIRServerValue.h" +#import "FIRTransactionResult.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FIRDatabase; + +/** + * A FIRDatabaseReference represents a particular location in your Firebase + * Database and can be used for reading or writing data to that Firebase + * Database location. + * + * This class is the starting point for all Firebase Database operations. After + * you've obtained your first FIRDatabaseReference via [FIRDatabase reference], + * you can use it to read data (ie. observeEventType:withBlock:), write data + * (ie. setValue:), and to create new FIRDatabaseReferences (ie. child:). + */ +NS_SWIFT_NAME(DatabaseReference) +@interface FIRDatabaseReference : FIRDatabaseQuery + +#pragma mark - Getting references to children locations + +/** + * Gets a FIRDatabaseReference for the location at the specified relative path. + * The relative path can either be a simple child key (e.g. 'fred') or a + * deeper slash-separated path (e.g. 'fred/name/first'). + * + * @param pathString A relative path from this location to the desired child + * location. + * @return A FIRDatabaseReference for the specified relative path. + */ +- (FIRDatabaseReference *)child:(NSString *)pathString; + +/** + * childByAutoId generates a new child location using a unique key and returns a + * FIRDatabaseReference to it. This is useful when the children of a Firebase + * Database location represent a list of items. + * + * The unique key generated by childByAutoId: is prefixed with a + * client-generated timestamp so that the resulting list will be + * chronologically-sorted. + * + * @return A FIRDatabaseReference for the generated location. + */ +- (FIRDatabaseReference *)childByAutoId; + +#pragma mark - Writing data + +/** Write data to this Firebase Database location. + +This will overwrite any data at this location and all child locations. + +Data types that can be set are: + +- NSString -- @"Hello World" +- NSNumber (also includes boolean) -- @YES, @43, @4.333 +- NSDictionary -- @{@"key": @"value", @"nested": @{@"another": @"value"} } +- NSArray + +The effect of the write will be visible immediately and the corresponding +events will be triggered. Synchronization of the data to the Firebase Database +servers will also be started. + +Passing null for the new value is equivalent to calling remove:; +all data at this location or any child location will be deleted. + +Note that setValue: will remove any priority stored at this location, so if +priority is meant to be preserved, you should use setValue:andPriority: instead. + +@param value The value to be written. + */ +- (void)setValue:(nullable id)value; + +/** + * The same as setValue: with a block that gets triggered after the write + * operation has been committed to the Firebase Database servers. + * + * @param value The value to be written. + * @param block The block to be called after the write has been committed to the + * Firebase Database servers. + */ +- (void)setValue:(nullable id)value + withCompletionBlock: + (void (^)(NSError *__nullable error, FIRDatabaseReference *ref))block; + +/** + * The same as setValue: with an additional priority to be attached to the data + * being written. Priorities are used to order items. + * + * @param value The value to be written. + * @param priority The priority to be attached to that data. + */ +- (void)setValue:(nullable id)value andPriority:(nullable id)priority; + +/** + * The same as setValue:andPriority: with a block that gets triggered after the + * write operation has been committed to the Firebase Database servers. + * + * @param value The value to be written. + * @param priority The priority to be attached to that data. + * @param block The block to be called after the write has been committed to the + * Firebase Database servers. + */ +- (void)setValue:(nullable id)value + andPriority:(nullable id)priority + withCompletionBlock: + (void (^)(NSError *__nullable error, FIRDatabaseReference *ref))block; + +/** + * Remove the data at this Firebase Database location. Any data at child + * locations will also be deleted. + * + * The effect of the delete will be visible immediately and the corresponding + * events will be triggered. Synchronization of the delete to the Firebase + * Database servers will also be started. + * + * remove: is equivalent to calling setValue:nil + */ +- (void)removeValue; + +/** + * The same as remove: with a block that gets triggered after the remove + * operation has been committed to the Firebase Database servers. + * + * @param block The block to be called after the remove has been committed to + * the Firebase Database servers. + */ +- (void)removeValueWithCompletionBlock: + (void (^)(NSError *__nullable error, FIRDatabaseReference *ref))block; + +/** + * Sets a priority for the data at this Firebase Database location. + * Priorities can be used to provide a custom ordering for the children at a + * location (if no priorities are specified, the children are ordered by key). + * + * You cannot set a priority on an empty location. For this reason + * setValue:andPriority: should be used when setting initial data with a + * specific priority and setPriority: should be used when updating the priority + * of existing data. + * + * Children are sorted based on this priority using the following rules: + * + * Children with no priority come first. + * Children with a number as their priority come next. They are sorted + * numerically by priority (small to large). Children with a string as their + * priority come last. They are sorted lexicographically by priority. Whenever + * two children have the same priority (including no priority), they are sorted + * by key. Numeric keys come first (sorted numerically), followed by the + * remaining keys (sorted lexicographically). + * + * Note that priorities are parsed and ordered as IEEE 754 double-precision + * floating-point numbers. Keys are always stored as strings and are treated as + * numbers only when they can be parsed as a 32-bit integer + * + * @param priority The priority to set at the specified location. + */ +- (void)setPriority:(nullable id)priority; + +/** + * The same as setPriority: with a block that is called once the priority has + * been committed to the Firebase Database servers. + * + * @param priority The priority to set at the specified location. + * @param block The block that is triggered after the priority has been written + * on the servers. + */ +- (void)setPriority:(nullable id)priority + withCompletionBlock: + (void (^)(NSError *__nullable error, FIRDatabaseReference *ref))block; + +/** + * Updates the values at the specified paths in the dictionary without + * overwriting other keys at this location. + * + * @param values A dictionary of the keys to change and their new values + */ +- (void)updateChildValues:(NSDictionary *)values; + +/** + * The same as update: with a block that is called once the update has been + * committed to the Firebase Database servers + * + * @param values A dictionary of the keys to change and their new values + * @param block The block that is triggered after the update has been written on + * the Firebase Database servers + */ +- (void)updateChildValues:(NSDictionary *)values + withCompletionBlock: + (void (^)(NSError *__nullable error, FIRDatabaseReference *ref))block; + +#pragma mark - Attaching observers to read data + +/** + * observeEventType:withBlock: is used to listen for data changes at a + * particular location. This is the primary way to read data from the Firebase + * Database. Your block will be triggered for the initial data and again + * whenever the data changes. + * + * Use removeObserverWithHandle: to stop receiving updates. + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. + * It is passed the data as a FIRDataSnapshot. + * @return A handle used to unregister this block later using + * removeObserverWithHandle: + */ +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + withBlock: + (void (^)(FIRDataSnapshot *snapshot))block; + +/** + * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data + * changes at a particular location. This is the primary way to read data from + * the Firebase Database. Your block will be triggered for the initial data and + * again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, + * FIRDataEventTypeChildMoved, and FIRDataEventTypeChildChanged events, your + * block will be passed the key of the previous node by priority order. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. + * It is passed the data as a FIRDataSnapshot and the previous child's key. + * @return A handle used to unregister this block later using + * removeObserverWithHandle: + */ +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock: + (void (^)(FIRDataSnapshot *snapshot, + NSString *__nullable prevKey))block; + +/** + * observeEventType:withBlock: is used to listen for data changes at a + * particular location. This is the primary way to read data from the Firebase + * Database. Your block will be triggered for the initial data and again + * whenever the data changes. + * + * The cancelBlock will be called if you will no longer receive new events due + * to no longer having permission. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. + * It is passed the data as a FIRDataSnapshot. + * @param cancelBlock The block that should be called if this client no longer + * has permission to receive these events + * @return A handle used to unregister this block later using + * removeObserverWithHandle: + */ +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + withBlock:(void (^)(FIRDataSnapshot *snapshot))block + withCancelBlock: + (nullable void (^)(NSError *error))cancelBlock; + +/** + * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data + * changes at a particular location. This is the primary way to read data from + * the Firebase Database. Your block will be triggered for the initial data and + * again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, + * FIRDataEventTypeChildMoved, and FIRDataEventTypeChildChanged events, your + * block will be passed the key of the previous node by priority order. + * + * The cancelBlock will be called if you will no longer receive new events due + * to no longer having permission. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. + * It is passed the data as a FIRDataSnapshot and the previous child's key. + * @param cancelBlock The block that should be called if this client no longer + * has permission to receive these events + * @return A handle used to unregister this block later using + * removeObserverWithHandle: + */ +- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock: + (void (^)(FIRDataSnapshot *snapshot, + NSString *__nullable prevKey))block + withCancelBlock: + (nullable void (^)(NSError *error))cancelBlock; + +/** + * This is equivalent to observeEventType:withBlock:, except the block is + * immediately canceled after the initial data is returned. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as a + * FIRDataSnapshot. + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + withBlock:(void (^)(FIRDataSnapshot *snapshot))block; + +/** + * This is equivalent to observeEventType:withBlock:, except the block is + * immediately canceled after the initial data is returned. In addition, for + * FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and + * FIRDataEventTypeChildChanged events, your block will be passed the key of the + * previous node by priority order. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as a + * FIRDataSnapshot and the previous child's key. + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock: + (void (^)(FIRDataSnapshot *snapshot, + NSString *__nullable prevKey))block; + +/** + * This is equivalent to observeEventType:withBlock:, except the block is + * immediately canceled after the initial data is returned. + * + * The cancelBlock will be called if you do not have permission to read data at + * this location. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as a + * FIRDataSnapshot. + * @param cancelBlock The block that will be called if you don't have permission + * to access this data + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + withBlock:(void (^)(FIRDataSnapshot *snapshot))block + withCancelBlock:(nullable void (^)(NSError *error))cancelBlock; + +/** + * This is equivalent to observeEventType:withBlock:, except the block is + * immediately canceled after the initial data is returned. In addition, for + * FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and + * FIRDataEventTypeChildChanged events, your block will be passed the key of the + * previous node by priority order. + * + * The cancelBlock will be called if you do not have permission to read data at + * this location. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as a + * FIRDataSnapshot and the previous child's key. + * @param cancelBlock The block that will be called if you don't have permission + * to access this data + */ +- (void)observeSingleEventOfType:(FIRDataEventType)eventType + andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, + NSString *__nullable prevKey))block + withCancelBlock: + (nullable void (^)(NSError *error))cancelBlock; + +#pragma mark - Detaching observers + +/** + * Detach a block previously attached with observeEventType:withBlock:. + * + * @param handle The handle returned by the call to observeEventType:withBlock: + * which we are trying to remove. + */ +- (void)removeObserverWithHandle:(FIRDatabaseHandle)handle; + +/** + * By calling `keepSynced:YES` on a location, the data for that location will + * automatically be downloaded and kept in sync, even when no listeners are + * attached for that location. Additionally, while a location is kept synced, it + * will not be evicted from the persistent disk cache. + * + * @param keepSynced Pass YES to keep this location synchronized, pass NO to + * stop synchronization. + */ +- (void)keepSynced:(BOOL)keepSynced; + +/** + * Removes all observers at the current reference, but does not remove any + * observers at child references. removeAllObservers must be called again for + * each child reference where a listener was established to remove the + * observers. + */ +- (void)removeAllObservers; + +#pragma mark - Querying and limiting + +/** + * queryLimitedToFirst: is used to generate a reference to a limited view of the + * data at this location. The FIRDatabaseQuery instance returned by + * queryLimitedToFirst: will respond to at most the first limit child nodes. + * + * @param limit The upper bound, inclusive, for the number of child nodes to + * receive events for + * @return A FIRDatabaseQuery instance, limited to at most limit child nodes. + */ +- (FIRDatabaseQuery *)queryLimitedToFirst:(NSUInteger)limit; + +/** + * queryLimitedToLast: is used to generate a reference to a limited view of the + * data at this location. The FIRDatabaseQuery instance returned by + * queryLimitedToLast: will respond to at most the last limit child nodes. + * + * @param limit The upper bound, inclusive, for the number of child nodes to + * receive events for + * @return A FIRDatabaseQuery instance, limited to at most limit child nodes. + */ +- (FIRDatabaseQuery *)queryLimitedToLast:(NSUInteger)limit; + +/** + * queryOrderBy: is used to generate a reference to a view of the data that's + * been sorted by the values of a particular child key. This method is intended + * to be used in combination with queryStartingAtValue:, queryEndingAtValue:, or + * queryEqualToValue:. + * + * @param key The child key to use in ordering data visible to the returned + * FIRDatabaseQuery + * @return A FIRDatabaseQuery instance, ordered by the values of the specified + * child key. + */ +- (FIRDatabaseQuery *)queryOrderedByChild:(NSString *)key; + +/** + * queryOrderedByKey: is used to generate a reference to a view of the data + * that's been sorted by child key. This method is intended to be used in + * combination with queryStartingAtValue:, queryEndingAtValue:, or + * queryEqualToValue:. + * + * @return A FIRDatabaseQuery instance, ordered by child keys. + */ +- (FIRDatabaseQuery *)queryOrderedByKey; + +/** + * queryOrderedByPriority: is used to generate a reference to a view of the data + * that's been sorted by child priority. This method is intended to be used in + * combination with queryStartingAtValue:, queryEndingAtValue:, or + * queryEqualToValue:. + * + * @return A FIRDatabaseQuery instance, ordered by child priorities. + */ +- (FIRDatabaseQuery *)queryOrderedByPriority; + +/** + * queryStartingAtValue: is used to generate a reference to a limited view of + * the data at this location. The FIRDatabaseQuery instance returned by + * queryStartingAtValue: will respond to events at nodes with a value greater + * than or equal to startValue. + * + * @param startValue The lower bound, inclusive, for the value of data visible + * to the returned FIRDatabaseQuery + * @return A FIRDatabaseQuery instance, limited to data with value greater than + * or equal to startValue + */ +- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue; + +/** + * queryStartingAtValue:childKey: is used to generate a reference to a limited + * view of the data at this location. The FIRDatabaseQuery instance returned by + * queryStartingAtValue:childKey will respond to events at nodes with a value + * greater than startValue, or equal to startValue and with a key greater than + * or equal to childKey. + * + * @param startValue The lower bound, inclusive, for the value of data visible + * to the returned FIRDatabaseQuery + * @param childKey The lower bound, inclusive, for the key of nodes with value + * equal to startValue + * @return A FIRDatabaseQuery instance, limited to data with value greater than + * or equal to startValue + */ +- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue + childKey:(nullable NSString *)childKey; + +/** + * queryEndingAtValue: is used to generate a reference to a limited view of the + * data at this location. The FIRDatabaseQuery instance returned by + * queryEndingAtValue: will respond to events at nodes with a value less than or + * equal to endValue. + * + * @param endValue The upper bound, inclusive, for the value of data visible to + * the returned FIRDatabaseQuery + * @return A FIRDatabaseQuery instance, limited to data with value less than or + * equal to endValue + */ +- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue; + +/** + * queryEndingAtValue:childKey: is used to generate a reference to a limited + * view of the data at this location. The FIRDatabaseQuery instance returned by + * queryEndingAtValue:childKey will respond to events at nodes with a value less + * than endValue, or equal to endValue and with a key less than or equal to + * childKey. + * + * @param endValue The upper bound, inclusive, for the value of data visible to + * the returned FIRDatabaseQuery + * @param childKey The upper bound, inclusive, for the key of nodes with value + * equal to endValue + * @return A FIRDatabaseQuery instance, limited to data with value less than or + * equal to endValue + */ +- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue + childKey:(nullable NSString *)childKey; + +/** + * queryEqualToValue: is used to generate a reference to a limited view of the + * data at this location. The FIRDatabaseQuery instance returned by + * queryEqualToValue: will respond to events at nodes with a value equal to the + * supplied argument. + * + * @param value The value that the data returned by this FIRDatabaseQuery will + * have + * @return A FIRDatabaseQuery instance, limited to data with the supplied value. + */ +- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value; + +/** + * queryEqualToValue:childKey: is used to generate a reference to a limited view + * of the data at this location. The FIRDatabaseQuery instance returned by + * queryEqualToValue:childKey will respond to events at nodes with a value equal + * to the supplied argument with a key equal to childKey. There will be at most + * one node that matches because child keys are unique. + * + * @param value The value that the data returned by this FIRDatabaseQuery will + * have + * @param childKey The key of nodes with the right value + * @return A FIRDatabaseQuery instance, limited to data with the supplied value + * and the key. + */ +- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value + childKey:(nullable NSString *)childKey; + +#pragma mark - Managing presence + +/** + * Ensure the data at this location is set to the specified value when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * onDisconnectSetValue: is especially useful for implementing "presence" + * systems, where a value should be changed or cleared when a user disconnects + * so that he appears "offline" to other users. + * + * @param value The value to be set after the connection is lost. + */ +- (void)onDisconnectSetValue:(nullable id)value; + +/** + * Ensure the data at this location is set to the specified value when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * The completion block will be triggered when the operation has been + * successfully queued up on the Firebase Database servers + * + * @param value The value to be set after the connection is lost. + * @param block Block to be triggered when the operation has been queued up on + * the Firebase Database servers + */ +- (void)onDisconnectSetValue:(nullable id)value + withCompletionBlock:(void (^)(NSError *__nullable error, + FIRDatabaseReference *ref))block; + +/** + * Ensure the data at this location is set to the specified value and priority + * when the client is disconnected (due to closing the browser, navigating to a + * new page, or network issues). + * + * @param value The value to be set after the connection is lost. + * @param priority The priority to be set after the connection is lost. + */ +- (void)onDisconnectSetValue:(nullable id)value andPriority:(id)priority; + +/** + * Ensure the data at this location is set to the specified value and priority + * when the client is disconnected (due to closing the browser, navigating to a + * new page, or network issues). + * + * The completion block will be triggered when the operation has been + * successfully queued up on the Firebase Database servers + * + * @param value The value to be set after the connection is lost. + * @param priority The priority to be set after the connection is lost. + * @param block Block to be triggered when the operation has been queued up on + * the Firebase Database servers + */ +- (void)onDisconnectSetValue:(nullable id)value + andPriority:(nullable id)priority + withCompletionBlock:(void (^)(NSError *__nullable error, + FIRDatabaseReference *ref))block; + +/** + * Ensure the data at this location is removed when + * the client is disconnected (due to closing the app, navigating + * to a new page, or network issues). + * + * onDisconnectRemoveValue is especially useful for implementing "presence" + * systems. + */ +- (void)onDisconnectRemoveValue; + +/** + * Ensure the data at this location is removed when + * the client is disconnected (due to closing the app, navigating + * to a new page, or network issues). + * + * onDisconnectRemoveValueWithCompletionBlock: is especially useful for + * implementing "presence" systems. + * + * @param block Block to be triggered when the operation has been queued up on + * the Firebase Database servers + */ +- (void)onDisconnectRemoveValueWithCompletionBlock: + (void (^)(NSError *__nullable error, FIRDatabaseReference *ref))block; + +/** + * Ensure the data has the specified child values updated when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * + * @param values A dictionary of child node keys and the values to set them to + * after the connection is lost. + */ +- (void)onDisconnectUpdateChildValues:(NSDictionary *)values; + +/** + * Ensure the data has the specified child values updated when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * + * @param values A dictionary of child node keys and the values to set them to + * after the connection is lost. + * @param block A block that will be called once the operation has been queued + * up on the Firebase Database servers + */ +- (void)onDisconnectUpdateChildValues:(NSDictionary *)values + withCompletionBlock: + (void (^)(NSError *__nullable error, + FIRDatabaseReference *ref))block; + +/** + * Cancel any operations that are set to run on disconnect. If you previously + * called onDisconnectSetValue:, onDisconnectRemoveValue:, or + * onDisconnectUpdateChildValues:, and no longer want the values updated when + * the connection is lost, call cancelDisconnectOperations: + */ +- (void)cancelDisconnectOperations; + +/** + * Cancel any operations that are set to run on disconnect. If you previously + * called onDisconnectSetValue:, onDisconnectRemoveValue:, or + * onDisconnectUpdateChildValues:, and no longer want the values updated when + * the connection is lost, call cancelDisconnectOperations: + * + * @param block A block that will be triggered once the Firebase Database + * servers have acknowledged the cancel request. + */ +- (void)cancelDisconnectOperationsWithCompletionBlock: + (nullable void (^)(NSError *__nullable error, + FIRDatabaseReference *ref))block; + +#pragma mark - Manual Connection Management + +/** + * Manually disconnect the Firebase Database client from the server and disable + * automatic reconnection. + * + * The Firebase Database client automatically maintains a persistent connection + * to the Firebase Database server, which will remain active indefinitely and + * reconnect when disconnected. However, the goOffline( ) and goOnline( ) + * methods may be used to manually control the client connection in cases where + * a persistent connection is undesirable. + * + * While offline, the Firebase Database client will no longer receive data + * updates from the server. However, all database operations performed locally + * will continue to immediately fire events, allowing your application to + * continue behaving normally. Additionally, each operation performed locally + * will automatically be queued and retried upon reconnection to the Firebase + * Database server. + * + * To reconnect to the Firebase Database server and begin receiving remote + * events, see goOnline( ). Once the connection is reestablished, the Firebase + * Database client will transmit the appropriate data and fire the appropriate + * events so that your client "catches up" automatically. + * + * Note: Invoking this method will impact all Firebase Database connections. + */ ++ (void)goOffline; + +/** + * Manually reestablish a connection to the Firebase Database server and enable + * automatic reconnection. + * + * The Firebase Database client automatically maintains a persistent connection + * to the Firebase Database server, which will remain active indefinitely and + * reconnect when disconnected. However, the goOffline( ) and goOnline( ) + * methods may be used to manually control the client connection in cases where + * a persistent connection is undesirable. + * + * This method should be used after invoking goOffline( ) to disable the active + * connection. Once reconnected, the Firebase Database client will automatically + * transmit the proper data and fire the appropriate events so that your client + * "catches up" automatically. + * + * To disconnect from the Firebase Database server, see goOffline( ). + * + * Note: Invoking this method will impact all Firebase Database connections. + */ ++ (void)goOnline; + +#pragma mark - Transactions + +/** + * Performs an optimistic-concurrency transactional update to the data at this + * location. Your block will be called with a FIRMutableData instance that + * contains the current data at this location. Your block should update this + * data to the value you wish to write to this location, and then return an + * instance of FIRTransactionResult with the new data. + * + * If, when the operation reaches the server, it turns out that this client had + * stale data, your block will be run again with the latest data from the + * server. + * + * When your block is run, you may decide to abort the transaction by returning + * [FIRTransactionResult abort]. + * + * @param block This block receives the current data at this location and must + * return an instance of FIRTransactionResult + */ +- (void)runTransactionBlock: + (FIRTransactionResult * (^)(FIRMutableData *currentData))block; + +/** + * Performs an optimistic-concurrency transactional update to the data at this + * location. Your block will be called with a FIRMutableData instance that + * contains the current data at this location. Your block should update this + * data to the value you wish to write to this location, and then return an + * instance of FIRTransactionResult with the new data. + * + * If, when the operation reaches the server, it turns out that this client had + * stale data, your block will be run again with the latest data from the + * server. + * + * When your block is run, you may decide to abort the transaction by returning + * [FIRTransactionResult abort]. + * + * @param block This block receives the current data at this location and must + * return an instance of FIRTransactionResult + * @param completionBlock This block will be triggered once the transaction is + * complete, whether it was successful or not. It will indicate if there was an + * error, whether or not the data was committed, and what the current value of + * the data at this location is. + */ +- (void)runTransactionBlock: + (FIRTransactionResult * (^)(FIRMutableData *currentData))block + andCompletionBlock: + (void (^)(NSError *__nullable error, BOOL committed, + FIRDataSnapshot *__nullable snapshot))completionBlock; + +/** + * Performs an optimistic-concurrency transactional update to the data at this + * location. Your block will be called with a FIRMutableData instance that + * contains the current data at this location. Your block should update this + * data to the value you wish to write to this location, and then return an + * instance of FIRTransactionResult with the new data. + * + * If, when the operation reaches the server, it turns out that this client had + * stale data, your block will be run again with the latest data from the + * server. + * + * When your block is run, you may decide to abort the transaction by return + * [FIRTransactionResult abort]. + * + * Since your block may be run multiple times, this client could see several + * immediate states that don't exist on the server. You can suppress those + * immediate states until the server confirms the final state of the + * transaction. + * + * @param block This block receives the current data at this location and must + * return an instance of FIRTransactionResult + * @param completionBlock This block will be triggered once the transaction is + * complete, whether it was successful or not. It will indicate if there was an + * error, whether or not the data was committed, and what the current value of + * the data at this location is. + * @param localEvents Set this to NO to suppress events raised for intermediate + * states, and only get events based on the final state of the transaction. + */ +- (void)runTransactionBlock: + (FIRTransactionResult * (^)(FIRMutableData *currentData))block + andCompletionBlock: + (nullable void (^)(NSError *__nullable error, BOOL committed, + FIRDataSnapshot *__nullable snapshot)) + completionBlock + withLocalEvents:(BOOL)localEvents; + +#pragma mark - Retrieving String Representation + +/** + * Gets the absolute URL of this Firebase Database location. + * + * @return The absolute URL of the referenced Firebase Database location. + */ +- (NSString *)description; + +#pragma mark - Properties + +/** + * Gets a FIRDatabaseReference for the parent location. + * If this instance refers to the root of your Firebase Database, it has no + * parent, and therefore parent( ) will return null. + * + * @return A FIRDatabaseReference for the parent location. + */ +@property(strong, readonly, nonatomic, nullable) FIRDatabaseReference *parent; + +/** + * Gets a FIRDatabaseReference for the root location + * + * @return A new FIRDatabaseReference to root location. + */ +@property(strong, readonly, nonatomic) FIRDatabaseReference *root; + +/** + * Gets the last token in a Firebase Database location (e.g. 'fred' in + * https://SampleChat.firebaseIO-demo.com/users/fred) + * + * @return The key of the location this reference points to. + */ +@property(strong, readonly, nonatomic, nullable) NSString *key; + +/** + * Gets the URL for the Firebase Database location referenced by this + * FIRDatabaseReference. + * + * @return The url of the location this reference points to. + */ +@property(strong, readonly, nonatomic) NSString *URL; + +/** + * Gets the FIRDatabase instance associated with this reference. + * + * @return The FIRDatabase object for this reference. + */ +@property(strong, readonly, nonatomic) FIRDatabase *database; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRMutableData.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRMutableData.h new file mode 100644 index 00000000..9797a67b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRMutableData.h @@ -0,0 +1,128 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * A FIRMutableData instance is populated with data from a Firebase Database + * location. When you are using runTransactionBlock:, you will be given an + * instance containing the current data at that location. Your block will be + * responsible for updating that instance to the data you wish to save at that + * location, and then returning using [FIRTransactionResult successWithValue:]. + * + * To modify the data, set its value property to any of the native types support + * by Firebase Database: + * + * + NSNumber (includes BOOL) + * + NSDictionary + * + NSArray + * + NSString + * + nil / NSNull to remove the data + * + * Note that changes made to a child FIRMutableData instance will be visible to + * the parent. + */ +NS_SWIFT_NAME(MutableData) +@interface FIRMutableData : NSObject + +#pragma mark - Inspecting and navigating the data + +/** + * Returns boolean indicating whether this mutable data has children. + * + * @return YES if this data contains child nodes. + */ +- (BOOL)hasChildren; + +/** + * Indicates whether this mutable data has a child at the given path. + * + * @param path A path string, consisting either of a single segment, like + * 'child', or multiple segments, 'a/deeper/child' + * @return YES if this data contains a child at the specified relative path + */ +- (BOOL)hasChildAtPath:(NSString *)path; + +/** + * Used to obtain a FIRMutableData instance that encapsulates the data at the + * given relative path. Note that changes made to the child will be visible to + * the parent. + * + * @param path A path string, consisting either of a single segment, like + * 'child', or multiple segments, 'a/deeper/child' + * @return A FIRMutableData instance containing the data at the given path + */ +- (FIRMutableData *)childDataByAppendingPath:(NSString *)path; + +#pragma mark - Properties + +/** + * To modify the data contained by this instance of FIRMutableData, set this to + * any of the native types supported by Firebase Database: + * + * + NSNumber (includes BOOL) + * + NSDictionary + * + NSArray + * + NSString + * + nil / NSNull to remove the data + * + * Note that setting this value will override the priority at this location. + * + * @return The current data at this location as a native object + */ +@property(strong, nonatomic, nullable) id value; + +/** + * Set this property to update the priority of the data at this location. Can be + * set to the following types: + * + * + NSNumber + * + NSString + * + nil / NSNull to remove the priority + * + * @return The priority of the data at this location + */ +@property(strong, nonatomic, nullable) id priority; + +/** + * @return The number of child nodes at this location + */ +@property(readonly, nonatomic) NSUInteger childrenCount; + +/** + * Used to iterate over the children at this location. You can use the native + * for .. in syntax: + * + * for (FIRMutableData* child in data.children) { + * ... + * } + * + * Note that this enumerator operates on an immutable copy of the child list. + * So, you can modify the instance during iteration, but the new additions will + * not be visible until you get a new enumerator. + */ +@property(readonly, nonatomic, strong) NSEnumerator *children; + +/** + * @return The key name of this node, or nil if it is the top-most location + */ +@property(readonly, nonatomic, strong, nullable) NSString *key; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRServerValue.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRServerValue.h new file mode 100644 index 00000000..5f57094f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRServerValue.h @@ -0,0 +1,53 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Placeholder values you may write into Firebase Database as a value or + * priority that will automatically be populated by the Firebase Database + * server. + */ +NS_SWIFT_NAME(ServerValue) +@interface FIRServerValue : NSObject + +/** + * Placeholder value for the number of milliseconds since the Unix epoch + */ ++ (NSDictionary *)timestamp; + +/** + * Returns a placeholder value that can be used to atomically increment the + * current database value by the provided delta. + * + * The delta must be a long or double value. If the current value is not an + * integer or double, or if the data does not yet exist, the transformation will + * set the data to the delta value. If either of the delta value or the existing + * data are doubles, both values will be interpreted as doubles. Double + * arithmetic and representation of double values follow IEEE 754 semantics. If + * there is positive/negative integer overflow, the sum is calculated as a + * double. + * + * @param delta the amount to modify the current value atomically. + * @return a placeholder value for modifying data atomically server-side. + */ ++ (NSDictionary *)increment:(NSNumber *)delta NS_SWIFT_NAME(increment(_:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRTransactionResult.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRTransactionResult.h new file mode 100644 index 00000000..7f5ccc18 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FIRTransactionResult.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRMutableData.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Used for runTransactionBlock:. An FIRTransactionResult instance is a + * container for the results of the transaction. + */ +NS_SWIFT_NAME(TransactionResult) +@interface FIRTransactionResult : NSObject + +/** + * Used for runTransactionBlock:. Indicates that the new value should be saved + * at this location + * + * @param value A FIRMutableData instance containing the new value to be set + * @return An FIRTransactionResult instance that can be used as a return value + * from the block given to runTransactionBlock: + */ ++ (FIRTransactionResult *)successWithValue:(FIRMutableData *)value; + +/** + * Used for runTransactionBlock:. Indicates that the current transaction should + * no longer proceed. + * + * @return An FIRTransactionResult instance that can be used as a return value + * from the block given to runTransactionBlock: + */ ++ (FIRTransactionResult *)abort; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FirebaseDatabase.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FirebaseDatabase.h new file mode 100644 index 00000000..ae6b9339 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Public/FirebaseDatabase.h @@ -0,0 +1,29 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FirebaseDatabase_h +#define FirebaseDatabase_h + +#import "FIRDataEventType.h" +#import "FIRDataSnapshot.h" +#import "FIRDatabase.h" +#import "FIRDatabaseQuery.h" +#import "FIRDatabaseReference.h" +#import "FIRMutableData.h" +#import "FIRServerValue.h" +#import "FIRTransactionResult.h" + +#endif /* FirebaseDatabase_h */ diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FConnection.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FConnection.h new file mode 100644 index 00000000..01ef28ce --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FConnection.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTypedefs.h" +#import "FWebSocketConnection.h" +#import + +@protocol FConnectionDelegate; + +@interface FConnection : NSObject + +@property(nonatomic, weak) id delegate; + +- (id)initWith:(FRepoInfo *)aRepoInfo + andDispatchQueue:(dispatch_queue_t)queue + googleAppID:(NSString *)googleAppID + lastSessionID:(NSString *)lastSessionID; + +- (void)open; +- (void)close; +- (void)sendRequest:(NSDictionary *)dataMsg sensitive:(BOOL)sensitive; + +// FWebSocketDelegate delegate methods +- (void)onMessage:(FWebSocketConnection *)fwebSocket + withMessage:(NSDictionary *)message; +- (void)onDisconnect:(FWebSocketConnection *)fwebSocket + wasEverConnected:(BOOL)everConnected; + +@end + +typedef enum { + DISCONNECT_REASON_SERVER_RESET = 0, + DISCONNECT_REASON_OTHER = 1 +} FDisconnectReason; + +@protocol FConnectionDelegate + +- (void)onReady:(FConnection *)fconnection + atTime:(NSNumber *)timestamp + sessionID:(NSString *)sessionID; +- (void)onDataMessage:(FConnection *)fconnection + withMessage:(NSDictionary *)message; +- (void)onDisconnect:(FConnection *)fconnection + withReason:(FDisconnectReason)reason; +- (void)onKill:(FConnection *)fconnection withReason:(NSString *)reason; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FConnection.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FConnection.m new file mode 100644 index 00000000..8969173e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FConnection.m @@ -0,0 +1,236 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FConnection.h" +#import "FConstants.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +typedef enum { + REALTIME_STATE_CONNECTING = 0, + REALTIME_STATE_CONNECTED = 1, + REALTIME_STATE_DISCONNECTED = 2, +} FConnectionState; + +@interface FConnection () { + FConnectionState state; +} + +@property(nonatomic, strong) FWebSocketConnection *conn; +@property(nonatomic, strong) FRepoInfo *repoInfo; + +@end + +#pragma mark - +#pragma mark FConnection implementation + +@implementation FConnection + +@synthesize delegate; +@synthesize conn; +@synthesize repoInfo; + +#pragma mark - +#pragma mark Initializers + +- (id)initWith:(FRepoInfo *)aRepoInfo + andDispatchQueue:(dispatch_queue_t)queue + googleAppID:googleAppID + lastSessionID:(NSString *)lastSessionID { + self = [super init]; + if (self) { + state = REALTIME_STATE_CONNECTING; + self.repoInfo = aRepoInfo; + self.conn = [[FWebSocketConnection alloc] initWith:self.repoInfo + andQueue:queue + googleAppID:googleAppID + lastSessionID:lastSessionID]; + self.conn.delegate = self; + } + return self; +} + +#pragma mark - +#pragma mark Public method implementation + +- (void)open { + FFLog(@"I-RDB082001", @"Calling open in FConnection"); + [self.conn open]; +} + +- (void)closeWithReason:(FDisconnectReason)reason { + if (state != REALTIME_STATE_DISCONNECTED) { + FFLog(@"I-RDB082002", @"Closing realtime connection."); + state = REALTIME_STATE_DISCONNECTED; + + if (self.conn) { + FFLog(@"I-RDB082003", @"Calling close again."); + [self.conn close]; + self.conn = nil; + } + + [self.delegate onDisconnect:self withReason:reason]; + } +} + +- (void)close { + [self closeWithReason:DISCONNECT_REASON_OTHER]; +} + +- (void)sendRequest:(NSDictionary *)dataMsg sensitive:(BOOL)sensitive { + // since this came from the persistent connection, wrap it in a data message + // envelope + NSDictionary *msg = @{ + kFWPRequestType : kFWPRequestTypeData, + kFWPRequestDataPayload : dataMsg + }; + [self sendData:msg sensitive:sensitive]; +} + +#pragma mark - +#pragma mark Helpers + +- (void)sendData:(NSDictionary *)data sensitive:(BOOL)sensitive { + if (state != REALTIME_STATE_CONNECTED) { + @throw [[NSException alloc] + initWithName:@"InvalidConnectionState" + reason:@"Tried to send data on an unconnected FConnection" + userInfo:nil]; + } else { + if (sensitive) { + FFLog(@"I-RDB082004", @"Sending data (contents hidden)"); + } else { + FFLog(@"I-RDB082005", @"Sending: %@", data); + } + [self.conn send:data]; + } +} + +#pragma mark - +#pragma mark FWebSocketConnectinDelegate implementation + +// Corresponds to onConnectionLost in JS +- (void)onDisconnect:(FWebSocketConnection *)fwebSocket + wasEverConnected:(BOOL)everConnected { + + self.conn = nil; + if (!everConnected && state == REALTIME_STATE_CONNECTING) { + FFLog(@"I-RDB082006", @"Realtime connection failed."); + + // Since we failed to connect at all, clear any cached entry for this + // namespace in case the machine went away + [self.repoInfo clearInternalHostCache]; + } else if (state == REALTIME_STATE_CONNECTED) { + FFLog(@"I-RDB082007", @"Realtime connection lost."); + } + + [self close]; +} + +// Corresponds to onMessageReceived in JS +- (void)onMessage:(FWebSocketConnection *)fwebSocket + withMessage:(NSDictionary *)message { + NSString *rawMessageType = + [message objectForKey:kFWPAsyncServerEnvelopeType]; + if (rawMessageType != nil) { + if ([rawMessageType isEqualToString:kFWPAsyncServerDataMessage]) { + [self onDataMessage:[message + objectForKey:kFWPAsyncServerEnvelopeData]]; + } else if ([rawMessageType + isEqualToString:kFWPAsyncServerControlMessage]) { + [self onControl:[message objectForKey:kFWPAsyncServerEnvelopeData]]; + } else { + FFLog(@"I-RDB082008", @"Unrecognized server packet type: %@", + rawMessageType); + } + } else { + FFLog(@"I-RDB082009", @"Unrecognized raw server packet received: %@", + message); + } +} + +- (void)onDataMessage:(NSDictionary *)message { + // we don't do anything with data messages, just kick them up a level + FFLog(@"I-RDB082010", @"Got data message: %@", message); + [self.delegate onDataMessage:self withMessage:message]; +} + +- (void)onControl:(NSDictionary *)message { + FFLog(@"I-RDB082011", @"Got control message: %@", message); + NSString *type = [message objectForKey:kFWPAsyncServerControlMessageType]; + if ([type isEqualToString:kFWPAsyncServerControlMessageShutdown]) { + NSString *reason = + [message objectForKey:kFWPAsyncServerControlMessageData]; + [self onConnectionShutdownWithReason:reason]; + } else if ([type isEqualToString:kFWPAsyncServerControlMessageReset]) { + NSString *host = + [message objectForKey:kFWPAsyncServerControlMessageData]; + [self onReset:host]; + } else if ([type isEqualToString:kFWPAsyncServerHello]) { + NSDictionary *handshakeData = + [message objectForKey:kFWPAsyncServerControlMessageData]; + [self onHandshake:handshakeData]; + } else { + FFLog(@"I-RDB082012", + @"Unknown control message returned from server: %@", message); + } +} + +- (void)onConnectionShutdownWithReason:(NSString *)reason { + FFLog(@"I-RDB082013", + @"Connection shutdown command received. Shutting down..."); + + [self.delegate onKill:self withReason:reason]; + [self close]; +} + +- (void)onHandshake:(NSDictionary *)handshake { + NSNumber *timestamp = + [handshake objectForKey:kFWPAsyncServerHelloTimestamp]; + // NSString* version = [handshake + // objectForKey:kFWPAsyncServerHelloVersion]; + NSString *host = [handshake objectForKey:kFWPAsyncServerHelloConnectedHost]; + NSString *sessionID = [handshake objectForKey:kFWPAsyncServerHelloSession]; + + self.repoInfo.internalHost = host; + + if (state == REALTIME_STATE_CONNECTING) { + [self.conn start]; + [self onConnection:self.conn readyAtTime:timestamp sessionID:sessionID]; + } +} + +- (void)onConnection:(FWebSocketConnection *)conn + readyAtTime:(NSNumber *)timestamp + sessionID:(NSString *)sessionID { + FFLog(@"I-RDB082014", @"Realtime connection established"); + state = REALTIME_STATE_CONNECTED; + + [self.delegate onReady:self atTime:timestamp sessionID:sessionID]; +} + +- (void)onReset:(NSString *)host { + FFLog( + @"I-RDB082015", + @"Got a reset; killing connection to: %@; Updating internalHost to: %@", + repoInfo.internalHost, host); + self.repoInfo.internalHost = host; + + // Explicitly close the connection with SERVER_RESET so calling code knows + // to reconnect immediately. + [self closeWithReason:DISCONNECT_REASON_SERVER_RESET]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FWebSocketConnection.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FWebSocketConnection.h new file mode 100644 index 00000000..999c3944 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FWebSocketConnection.h @@ -0,0 +1,54 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FSRWebSocket.h" +#import "FUtilities.h" +#import + +@protocol FWebSocketDelegate; + +@interface FWebSocketConnection : NSObject + +@property(nonatomic, weak) id delegate; + +- (id)initWith:(FRepoInfo *)repoInfo + andQueue:(dispatch_queue_t)queue + googleAppID:(NSString *)googleAppID + lastSessionID:(NSString *)lastSessionID; + +- (void)open; +- (void)close; +- (void)start; +- (void)send:(NSDictionary *)dictionary; + +- (void)webSocket:(FSRWebSocket *)webSocket didReceiveMessage:(id)message; +- (void)webSocketDidOpen:(FSRWebSocket *)webSocket; +- (void)webSocket:(FSRWebSocket *)webSocket didFailWithError:(NSError *)error; +- (void)webSocket:(FSRWebSocket *)webSocket + didCloseWithCode:(NSInteger)code + reason:(NSString *)reason + wasClean:(BOOL)wasClean; + +@end + +@protocol FWebSocketDelegate + +- (void)onMessage:(FWebSocketConnection *)fwebSocket + withMessage:(NSDictionary *)message; +- (void)onDisconnect:(FWebSocketConnection *)fwebSocket + wasEverConnected:(BOOL)everConnected; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FWebSocketConnection.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FWebSocketConnection.m new file mode 100644 index 00000000..0b964743 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Realtime/FWebSocketConnection.m @@ -0,0 +1,348 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Targetted compilation is ONLY for testing. UIKit is weak-linked in actual +// release build. + +#import + +#import "FConstants.h" +#import "FIRDatabaseReference.h" +#import "FIRDatabase_Private.h" +#import "FStringUtilities.h" +#import "FWebSocketConnection.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#if TARGET_OS_IOS || TARGET_OS_TV +#import +#endif + +@interface FWebSocketConnection () { + NSMutableString *frame; + BOOL everConnected; + BOOL isClosed; + NSTimer *keepAlive; +} + +- (void)shutdown; +- (void)onClosed; +- (void)closeIfNeverConnected; + +@property(nonatomic, strong) FSRWebSocket *webSocket; +@property(nonatomic, strong) NSNumber *connectionId; +@property(nonatomic, readwrite) int totalFrames; +@property(nonatomic, readonly) BOOL buffering; +@property(nonatomic, readonly) NSString *userAgent; +@property(nonatomic) dispatch_queue_t dispatchQueue; + +- (void)nop:(NSTimer *)timer; + +@end + +@implementation FWebSocketConnection + +@synthesize delegate; +@synthesize webSocket; +@synthesize connectionId; + +- (id)initWith:(FRepoInfo *)repoInfo + andQueue:(dispatch_queue_t)queue + googleAppID:(NSString *)googleAppID + lastSessionID:(NSString *)lastSessionID { + self = [super init]; + if (self) { + everConnected = NO; + isClosed = NO; + self.connectionId = [FUtilities LUIDGenerator]; + self.totalFrames = 0; + self.dispatchQueue = queue; + frame = nil; + + NSString *connectionUrl = + [repoInfo connectionURLWithLastSessionID:lastSessionID]; + NSString *ua = [self userAgent]; + FFLog(@"I-RDB083001", @"(wsc:%@) Connecting to: %@ as %@", + self.connectionId, connectionUrl, ua); + + NSURLRequest *req = [[NSURLRequest alloc] + initWithURL:[[NSURL alloc] initWithString:connectionUrl]]; + self.webSocket = [[FSRWebSocket alloc] initWithURLRequest:req + queue:queue + googleAppID:googleAppID + andUserAgent:ua]; + [self.webSocket setDelegateDispatchQueue:queue]; + self.webSocket.delegate = self; + } + return self; +} + +- (NSString *)userAgent { + NSString *systemVersion; + NSString *deviceName; + BOOL hasUiDeviceClass = NO; + +// Targetted compilation is ONLY for testing. UIKit is weak-linked in actual +// release build. +#if TARGET_OS_IOS || TARGET_OS_TV + Class uiDeviceClass = NSClassFromString(@"UIDevice"); + if (uiDeviceClass) { + systemVersion = [uiDeviceClass currentDevice].systemVersion; + deviceName = [uiDeviceClass currentDevice].model; + hasUiDeviceClass = YES; + } +#endif + + if (!hasUiDeviceClass) { + NSDictionary *systemVersionDictionary = [NSDictionary + dictionaryWithContentsOfFile: + @"/System/Library/CoreServices/SystemVersion.plist"]; + systemVersion = + [systemVersionDictionary objectForKey:@"ProductVersion"]; + deviceName = [systemVersionDictionary objectForKey:@"ProductName"]; + } + + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + + // Sanitize '/'s in deviceName and bundleIdentifier for stats + deviceName = [FStringUtilities sanitizedForUserAgent:deviceName]; + bundleIdentifier = + [FStringUtilities sanitizedForUserAgent:bundleIdentifier]; + + // Firebase/5/__//{device model / + // os (Mac OS X, iPhone, etc.}_ + NSString *ua = [NSString + stringWithFormat:@"Firebase/%@/%@/%@/%@_%@", kWebsocketProtocolVersion, + [FIRDatabase buildVersion], systemVersion, deviceName, + bundleIdentifier]; + return ua; +} + +- (BOOL)buffering { + return frame != nil; +} + +#pragma mark - +#pragma mark Public FWebSocketConnection methods + +- (void)open { + FFLog(@"I-RDB083002", @"(wsc:%@) FWebSocketConnection open.", + self.connectionId); + assert(delegate); + everConnected = NO; + // TODO Assert url + [self.webSocket open]; + dispatch_time_t when = dispatch_time( + DISPATCH_TIME_NOW, kWebsocketConnectTimeout * NSEC_PER_SEC); + dispatch_after(when, self.dispatchQueue, ^{ + [self closeIfNeverConnected]; + }); +} + +- (void)close { + FFLog(@"I-RDB083003", @"(wsc:%@) FWebSocketConnection is being closed.", + self.connectionId); + isClosed = YES; + [self.webSocket close]; +} + +- (void)start { + // Start is a no-op for websockets. +} + +- (void)send:(NSDictionary *)dictionary { + + [self resetKeepAlive]; + + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary + options:kNilOptions + error:nil]; + + NSString *data = [[NSString alloc] initWithData:jsonData + encoding:NSUTF8StringEncoding]; + + NSArray *dataSegs = [FUtilities splitString:data + intoMaxSize:kWebsocketMaxFrameSize]; + + // First send the header so the server knows how many segments are + // forthcoming + if (dataSegs.count > 1) { + [self.webSocket + send:[NSString + stringWithFormat:@"%u", (unsigned int)dataSegs.count]]; + } + + // Then, actually send the segments. + for (NSString *segment in dataSegs) { + [self.webSocket send:segment]; + } +} + +- (void)nop:(NSTimer *)timer { + if (!isClosed) { + FFLog(@"I-RDB083004", @"(wsc:%@) nop", self.connectionId); + [self.webSocket send:@"0"]; + } else { + FFLog(@"I-RDB083005", + @"(wsc:%@) No more websocket; invalidating nop timer.", + self.connectionId); + [timer invalidate]; + } +} + +- (void)handleNewFrameCount:(int)numFrames { + self.totalFrames = numFrames; + frame = [[NSMutableString alloc] initWithString:@""]; + FFLog(@"I-RDB083006", @"(wsc:%@) handleNewFrameCount: %d", + self.connectionId, self.totalFrames); +} + +- (NSString *)extractFrameCount:(NSString *)message { + if ([message length] <= 4) { + int frameCount = [message intValue]; + if (frameCount > 0) { + [self handleNewFrameCount:frameCount]; + return nil; + } + } + [self handleNewFrameCount:1]; + return message; +} + +- (void)appendFrame:(NSString *)message { + [frame appendString:message]; + self.totalFrames = self.totalFrames - 1; + + if (self.totalFrames == 0) { + // Call delegate and pass an immutable version of the frame + NSDictionary *json = [NSJSONSerialization + JSONObjectWithData:[frame dataUsingEncoding:NSUTF8StringEncoding] + options:kNilOptions + error:nil]; + frame = nil; + FFLog(@"I-RDB083007", + @"(wsc:%@) handleIncomingFrame sending complete frame: %d", + self.connectionId, self.totalFrames); + + @autoreleasepool { + [self.delegate onMessage:self withMessage:json]; + } + } +} + +- (void)handleIncomingFrame:(NSString *)message { + [self resetKeepAlive]; + if (self.buffering) { + [self appendFrame:message]; + } else { + NSString *remaining = [self extractFrameCount:message]; + if (remaining) { + [self appendFrame:remaining]; + } + } +} + +#pragma mark - +#pragma mark SRWebSocketDelegate implementation +- (void)webSocket:(FSRWebSocket *)webSocket didReceiveMessage:(id)message { + [self handleIncomingFrame:message]; +} + +- (void)webSocketDidOpen:(FSRWebSocket *)webSocket { + FFLog(@"I-RDB083008", @"(wsc:%@) webSocketDidOpen", self.connectionId); + + everConnected = YES; + + dispatch_async(dispatch_get_main_queue(), ^{ + self->keepAlive = + [NSTimer scheduledTimerWithTimeInterval:kWebsocketKeepaliveInterval + target:self + selector:@selector(nop:) + userInfo:nil + repeats:YES]; + FFLog(@"I-RDB083009", @"(wsc:%@) nop timer kicked off", + self.connectionId); + }); +} + +- (void)webSocket:(FSRWebSocket *)webSocket didFailWithError:(NSError *)error { + FFLog(@"I-RDB083010", @"(wsc:%@) didFailWithError didFailWithError: %@", + self.connectionId, [error description]); + [self onClosed]; +} + +- (void)webSocket:(FSRWebSocket *)webSocket + didCloseWithCode:(NSInteger)code + reason:(NSString *)reason + wasClean:(BOOL)wasClean { + FFLog(@"I-RDB083011", @"(wsc:%@) didCloseWithCode: %ld %@", + self.connectionId, (long)code, reason); + [self onClosed]; +} + +#pragma mark - +#pragma mark Private methods + +/** + * Note that the close / onClosed / shutdown cycle here is a little different + * from the javascript client. In order to properly handle deallocation, no + * close-related action is taken at a higher level until we have received + * notification from the websocket itself that it is closed. Otherwise, we end + * up deallocating this class and the FConnection class before the websocket has + * a change to call some of its delegate methods. So, since close is the + * external close handler, we just set a flag saying not to call our own + * delegate method and close the websocket. That will trigger a callback into + * this class that can then do things like clean up the keepalive timer. + */ + +- (void)closeIfNeverConnected { + if (!everConnected) { + FFLog(@"I-RDB083012", @"(wsc:%@) Websocket timed out on connect", + self.connectionId); + [self.webSocket close]; + } +} + +- (void)shutdown { + isClosed = YES; + + // Call delegate methods + [self.delegate onDisconnect:self wasEverConnected:everConnected]; +} + +- (void)onClosed { + if (!isClosed) { + FFLog(@"I-RDB083013", @"Websocket is closing itself"); + [self shutdown]; + } + self.webSocket = nil; + if (keepAlive.isValid) { + [keepAlive invalidate]; + } +} + +- (void)resetKeepAlive { + NSDate *newTime = + [NSDate dateWithTimeIntervalSinceNow:kWebsocketKeepaliveInterval]; + // Calling setFireDate is actually kinda' expensive, so wait at least 5 + // seconds before updating it. + if ([newTime timeIntervalSinceDate:keepAlive.fireDate] > 5) { + FFLog(@"I-RDB083014", @"(wsc:%@) resetting keepalive, to %@ ; old: %@", + self.connectionId, newTime, [keepAlive fireDate]); + [keepAlive setFireDate:newTime]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FChildrenNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FChildrenNode.h new file mode 100644 index 00000000..cc3239e8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FChildrenNode.h @@ -0,0 +1,42 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FImmutableSortedDictionary.h" +#import "FNode.h" +#import "FTypedefs.h" +#import "FTypedefs_Private.h" +#import + +@class FNamedNode; + +@interface FChildrenNode : NSObject + +- (id)initWithChildren:(FImmutableSortedDictionary *)someChildren; +- (id)initWithPriority:(id)aPriority + children:(FImmutableSortedDictionary *)someChildren; + +// FChildrenNode specific methods + +- (void)enumerateChildrenAndPriorityUsingBlock:(void (^)(NSString *, id, + BOOL *))block; + +- (FNamedNode *)firstChild; +- (FNamedNode *)lastChild; + +@property(nonatomic, strong) FImmutableSortedDictionary *children; +@property(nonatomic, strong) id priorityNode; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FChildrenNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FChildrenNode.m new file mode 100644 index 00000000..bd02bf8b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FChildrenNode.m @@ -0,0 +1,418 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FChildrenNode.h" +#import "FConstants.h" +#import "FEmptyNode.h" +#import "FMaxNode.h" +#import "FNamedNode.h" +#import "FPriorityIndex.h" +#import "FSnapshotUtilities.h" +#import "FStringUtilities.h" +#import "FTransformedEnumerator.h" +#import "FUtilities.h" + +@interface FChildrenNode () +@property(nonatomic, strong) NSString *lazyHash; +@end + +@implementation FChildrenNode + +// Note: The only reason we allow nil priority is to for EmptyNode, since we +// can't use EmptyNode as the priority of EmptyNode. We might want to consider +// making EmptyNode its own class instead of an empty ChildrenNode. + +- (id)init { + return [self + initWithPriority:nil + children:[FImmutableSortedDictionary + dictionaryWithComparator:[FUtilities + keyComparator]]]; +} + +- (id)initWithChildren:(FImmutableSortedDictionary *)someChildren { + return [self initWithPriority:nil children:someChildren]; +} + +- (id)initWithPriority:(id)aPriority + children:(FImmutableSortedDictionary *)someChildren { + if (someChildren.isEmpty && aPriority != nil && ![aPriority isEmpty]) { + [NSException raise:NSInvalidArgumentException + format:@"Can't create empty node with priority!"]; + } + self = [super init]; + if (self) { + self.children = someChildren; + self.priorityNode = aPriority; + } + return self; +} + +- (NSString *)description { + return [[self valForExport:YES] description]; +} + +#pragma mark - +#pragma mark FNode methods + +- (BOOL)isLeafNode { + return NO; +} + +- (id)getPriority { + if (self.priorityNode) { + return self.priorityNode; + } else { + return [FEmptyNode emptyNode]; + } +} + +- (id)updatePriority:(id)aPriority { + if ([self.children isEmpty]) { + return [FEmptyNode emptyNode]; + } else { + return [[FChildrenNode alloc] initWithPriority:aPriority + children:self.children]; + } +} + +- (id)getImmediateChild:(NSString *)childName { + if ([childName isEqualToString:@".priority"]) { + return [self getPriority]; + } else { + id child = [self.children objectForKey:childName]; + return (child == nil) ? [FEmptyNode emptyNode] : child; + } +} + +- (id)getChild:(FPath *)path { + NSString *front = [path getFront]; + if (front == nil) { + return self; + } else { + return [[self getImmediateChild:front] getChild:[path popFront]]; + } +} + +- (BOOL)hasChild:(NSString *)childName { + return ![self getImmediateChild:childName].isEmpty; +} + +- (id)updateImmediateChild:(NSString *)childName + withNewChild:(id)newChildNode { + NSAssert(newChildNode != nil, @"Should always be passing nodes."); + + if ([childName isEqualToString:@".priority"]) { + return [self updatePriority:newChildNode]; + } else { + FImmutableSortedDictionary *newChildren; + if (newChildNode.isEmpty) { + newChildren = [self.children removeObjectForKey:childName]; + } else { + newChildren = [self.children setObject:newChildNode + forKey:childName]; + } + if (newChildren.isEmpty) { + return [FEmptyNode emptyNode]; + } else { + return [[FChildrenNode alloc] initWithPriority:self.getPriority + children:newChildren]; + } + } +} + +- (id)updateChild:(FPath *)path withNewChild:(id)newChildNode { + NSString *front = [path getFront]; + if (front == nil) { + return newChildNode; + } else { + NSAssert(![front isEqualToString:@".priority"] || path.length == 1, + @".priority must be the last token in a path."); + id newImmediateChild = + [[self getImmediateChild:front] updateChild:[path popFront] + withNewChild:newChildNode]; + return [self updateImmediateChild:front withNewChild:newImmediateChild]; + } +} + +- (BOOL)isEmpty { + return [self.children isEmpty]; +} + +- (int)numChildren { + return [self.children count]; +} + +- (id)val { + return [self valForExport:NO]; +} + +- (id)valForExport:(BOOL)exp { + if ([self isEmpty]) { + return [NSNull null]; + } + + __block int numKeys = 0; + __block NSInteger maxKey = 0; + __block BOOL allIntegerKeys = YES; + + NSMutableDictionary *obj = + [[NSMutableDictionary alloc] initWithCapacity:[self.children count]]; + [self enumerateChildrenUsingBlock:^(NSString *key, id childNode, + BOOL *stop) { + [obj setObject:[childNode valForExport:exp] forKey:key]; + + numKeys++; + + // If we already found a string key, don't bother with any of this + if (!allIntegerKeys) { + return; + } + + // Treat leading zeroes that are not exactly "0" as strings + NSString *firstChar = [key substringWithRange:NSMakeRange(0, 1)]; + if ([firstChar isEqualToString:@"0"] && [key length] > 1) { + allIntegerKeys = NO; + } else { + NSNumber *keyAsNum = [FUtilities intForString:key]; + if (keyAsNum != nil) { + NSInteger keyAsInt = [keyAsNum integerValue]; + if (keyAsInt > maxKey) { + maxKey = keyAsInt; + } + } else { + allIntegerKeys = NO; + } + } + }]; + + if (!exp && allIntegerKeys && maxKey < 2 * numKeys) { + // convert to an array + NSMutableArray *array = + [[NSMutableArray alloc] initWithCapacity:maxKey + 1]; + for (int i = 0; i <= maxKey; ++i) { + NSString *keyString = [NSString stringWithFormat:@"%i", i]; + id child = obj[keyString]; + if (child != nil) { + [array addObject:child]; + } else { + [array addObject:[NSNull null]]; + } + } + return array; + } else { + + if (exp && [self getPriority] != nil && !self.getPriority.isEmpty) { + obj[kPayloadPriority] = [self.getPriority val]; + } + + return obj; + } +} + +- (NSString *)dataHash { + if (self.lazyHash == nil) { + NSMutableString *toHash = [[NSMutableString alloc] init]; + + if (!self.getPriority.isEmpty) { + [toHash appendString:@"priority:"]; + [FSnapshotUtilities + appendHashRepresentationForLeafNode:(FLeafNode *) + self.getPriority + toString:toHash + hashVersion:FDataHashVersionV1]; + [toHash appendString:@":"]; + } + + __block BOOL sawPriority = NO; + [self enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + sawPriority = sawPriority || [[node getPriority] isEmpty]; + *stop = sawPriority; + }]; + if (sawPriority) { + NSMutableArray *array = [NSMutableArray array]; + [self enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + FNamedNode *namedNode = [[FNamedNode alloc] initWithName:key + andNode:node]; + [array addObject:namedNode]; + }]; + [array sortUsingComparator:^NSComparisonResult( + FNamedNode *namedNode1, FNamedNode *namedNode2) { + return + [[FPriorityIndex priorityIndex] compareNamedNode:namedNode1 + toNamedNode:namedNode2]; + }]; + [array enumerateObjectsUsingBlock:^(FNamedNode *namedNode, + NSUInteger idx, BOOL *stop) { + NSString *childHash = [namedNode.node dataHash]; + if (![childHash isEqualToString:@""]) { + [toHash appendFormat:@":%@:%@", namedNode.name, childHash]; + } + }]; + } else { + [self enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + NSString *childHash = [node dataHash]; + if (![childHash isEqualToString:@""]) { + [toHash appendFormat:@":%@:%@", key, childHash]; + } + }]; + } + self.lazyHash = [toHash isEqualToString:@""] + ? @"" + : [FStringUtilities base64EncodedSha1:toHash]; + } + return self.lazyHash; +} + +- (NSComparisonResult)compare:(id)other { + // children nodes come last, unless this is actually an empty node, then we + // come first. + if (self.isEmpty) { + if (other.isEmpty) { + return NSOrderedSame; + } else { + return NSOrderedAscending; + } + } else if (other.isLeafNode || other.isEmpty) { + return NSOrderedDescending; + } else if (other == [FMaxNode maxNode]) { + return NSOrderedAscending; + } else { + // Must be another node with children. + return NSOrderedSame; + } +} + +- (BOOL)isEqual:(id)other { + if (other == self) { + return YES; + } else if (other == nil) { + return NO; + } else if (other.isLeafNode) { + return NO; + } else if (self.isEmpty && [other isEmpty]) { + // Empty nodes do not have priority + return YES; + } else { + FChildrenNode *otherChildrenNode = other; + if (![self.getPriority isEqual:other.getPriority]) { + return NO; + } else if (self.children.count == otherChildrenNode.children.count) { + __block BOOL equal = YES; + [self enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + id child = [otherChildrenNode getImmediateChild:key]; + if (![child isEqual:node]) { + equal = NO; + *stop = YES; + } + }]; + return equal; + } else { + return NO; + } + } +} + +- (NSUInteger)hash { + __block NSUInteger hashCode = 0; + [self enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + hashCode = 31 * hashCode + key.hash; + hashCode = 17 * hashCode + node.hash; + }]; + return 17 * hashCode + self.priorityNode.hash; +} + +- (void)enumerateChildrenAndPriorityUsingBlock:(void (^)(NSString *, id, + BOOL *))block { + if ([self.getPriority isEmpty]) { + [self enumerateChildrenUsingBlock:block]; + } else { + __block BOOL passedPriorityKey = NO; + [self enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + if (!passedPriorityKey && + [FUtilities compareKey:key + toKey:@".priority"] == NSOrderedDescending) { + passedPriorityKey = YES; + BOOL stopAfterPriority = NO; + block(@".priority", [self getPriority], &stopAfterPriority); + if (stopAfterPriority) + return; + } + block(key, node, stop); + }]; + } +} + +- (void)enumerateChildrenUsingBlock:(void (^)(NSString *, id, + BOOL *))block { + [self.children enumerateKeysAndObjectsUsingBlock:block]; +} + +- (void)enumerateChildrenReverse:(BOOL)reverse + usingBlock: + (void (^)(NSString *, id, BOOL *))block { + [self.children enumerateKeysAndObjectsReverse:reverse usingBlock:block]; +} + +- (NSEnumerator *)childEnumerator { + return [[FTransformedEnumerator alloc] + initWithEnumerator:self.children.keyEnumerator + andTransform:^id(NSString *key) { + return [FNamedNode nodeWithName:key + node:[self getImmediateChild:key]]; + }]; +} + +- (NSString *)predecessorChildKey:(NSString *)childKey { + return [self.children getPredecessorKey:childKey]; +} + +#pragma mark - +#pragma mark FChildrenNode specific methods + +- (id)childrenGetter:(id)key { + return [self.children objectForKey:key]; +} + +- (FNamedNode *)firstChild { + NSString *childKey = self.children.minKey; + if (childKey) { + return + [[FNamedNode alloc] initWithName:childKey + andNode:[self getImmediateChild:childKey]]; + } else { + return nil; + } +} + +- (FNamedNode *)lastChild { + NSString *childKey = self.children.maxKey; + if (childKey) { + return + [[FNamedNode alloc] initWithName:childKey + andNode:[self getImmediateChild:childKey]]; + } else { + return nil; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FCompoundWrite.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FCompoundWrite.h new file mode 100644 index 00000000..47de66f5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FCompoundWrite.h @@ -0,0 +1,64 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FImmutableTree; +@protocol FNode; +@class FPath; + +/** + * This class holds a collection of writes that can be applied to nodes in + * unison. It abstracts away the logic with dealing with priority writes and + * multiple nested writes. At any given path, there is only allowed to be one + * write modifying that path. Any write to an existing path or shadowing an + * existing path will modify that existing write to reflect the write added. + */ +@interface FCompoundWrite : NSObject + +- (id)initWithWriteTree:(FImmutableTree *)tree; + +/** + * Creates a compound write with NSDictionary from path string to object + */ ++ (FCompoundWrite *)compoundWriteWithValueDictionary:(NSDictionary *)dictionary; +/** + * Creates a compound write with NSDictionary from path string to node + */ ++ (FCompoundWrite *)compoundWriteWithNodeDictionary:(NSDictionary *)dictionary; + ++ (FCompoundWrite *)emptyWrite; + +- (FCompoundWrite *)addWrite:(id)node atPath:(FPath *)path; +- (FCompoundWrite *)addWrite:(id)node atKey:(NSString *)key; +- (FCompoundWrite *)addCompoundWrite:(FCompoundWrite *)node + atPath:(FPath *)path; +- (FCompoundWrite *)removeWriteAtPath:(FPath *)path; +- (id)rootWrite; +- (BOOL)hasCompleteWriteAtPath:(FPath *)path; +- (id)completeNodeAtPath:(FPath *)path; +- (NSArray *)completeChildren; +- (NSDictionary *)childCompoundWrites; +- (FCompoundWrite *)childCompoundWriteAtPath:(FPath *)path; +- (id)applyToNode:(id)node; +- (void)enumerateWrites:(void (^)(FPath *path, id node, + BOOL *stop))block; + +- (NSDictionary *)valForExport:(BOOL)exportFormat; + +- (BOOL)isEmpty; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FCompoundWrite.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FCompoundWrite.m new file mode 100644 index 00000000..bc40b2bd --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FCompoundWrite.m @@ -0,0 +1,304 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FCompoundWrite.h" +#import "FImmutableTree.h" +#import "FNamedNode.h" +#import "FNode.h" +#import "FPath.h" +#import "FSnapshotUtilities.h" + +@interface FCompoundWrite () +@property(nonatomic, strong) FImmutableTree *writeTree; +@end + +@implementation FCompoundWrite + +- (id)initWithWriteTree:(FImmutableTree *)tree { + self = [super init]; + if (self) { + self.writeTree = tree; + } + return self; +} + ++ (FCompoundWrite *)compoundWriteWithValueDictionary: + (NSDictionary *)dictionary { + __block FImmutableTree *writeTree = [FImmutableTree empty]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *pathString, + id value, BOOL *stop) { + id node = [FSnapshotUtilities nodeFrom:value]; + FImmutableTree *tree = [[FImmutableTree alloc] initWithValue:node]; + writeTree = [writeTree setTree:tree + atPath:[[FPath alloc] initWith:pathString]]; + }]; + return [[FCompoundWrite alloc] initWithWriteTree:writeTree]; +} + ++ (FCompoundWrite *)compoundWriteWithNodeDictionary:(NSDictionary *)dictionary { + __block FImmutableTree *writeTree = [FImmutableTree empty]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *pathString, + id node, BOOL *stop) { + FImmutableTree *tree = [[FImmutableTree alloc] initWithValue:node]; + writeTree = [writeTree setTree:tree + atPath:[[FPath alloc] initWith:pathString]]; + }]; + return [[FCompoundWrite alloc] initWithWriteTree:writeTree]; +} + ++ (FCompoundWrite *)emptyWrite { + static dispatch_once_t pred = 0; + static FCompoundWrite *empty = nil; + dispatch_once(&pred, ^{ + empty = [[FCompoundWrite alloc] + initWithWriteTree:[[FImmutableTree alloc] initWithValue:nil]]; + }); + return empty; +} + +- (FCompoundWrite *)addWrite:(id)node atPath:(FPath *)path { + if (path.isEmpty) { + return [[FCompoundWrite alloc] + initWithWriteTree:[[FImmutableTree alloc] initWithValue:node]]; + } else { + FTuplePathValue *rootMost = + [self.writeTree findRootMostValueAndPath:path]; + if (rootMost != nil) { + FPath *relativePath = [FPath relativePathFrom:rootMost.path + to:path]; + id value = [rootMost.value updateChild:relativePath + withNewChild:node]; + return [[FCompoundWrite alloc] + initWithWriteTree:[self.writeTree setValue:value + atPath:rootMost.path]]; + } else { + FImmutableTree *subtree = + [[FImmutableTree alloc] initWithValue:node]; + FImmutableTree *newWriteTree = [self.writeTree setTree:subtree + atPath:path]; + return [[FCompoundWrite alloc] initWithWriteTree:newWriteTree]; + } + } +} + +- (FCompoundWrite *)addWrite:(id)node atKey:(NSString *)key { + return [self addWrite:node atPath:[[FPath alloc] initWith:key]]; +} + +- (FCompoundWrite *)addCompoundWrite:(FCompoundWrite *)compoundWrite + atPath:(FPath *)path { + __block FCompoundWrite *newWrite = self; + [compoundWrite.writeTree forEach:^(FPath *childPath, id value) { + newWrite = [newWrite addWrite:value atPath:[path child:childPath]]; + }]; + return newWrite; +} + +/** + * Will remove a write at the given path and deeper paths. This will + * not modify a write at a higher location, which must be removed by + * calling this method with that path. + * @param path The path at which a write and all deeper writes should be + * removed. + * @return The new FWriteCompound with the removed path. + */ +- (FCompoundWrite *)removeWriteAtPath:(FPath *)path { + if (path.isEmpty) { + return [FCompoundWrite emptyWrite]; + } else { + FImmutableTree *newWriteTree = + [self.writeTree setTree:[FImmutableTree empty] atPath:path]; + return [[FCompoundWrite alloc] initWithWriteTree:newWriteTree]; + } +} + +/** + * Returns whether this FCompoundWrite will fully overwrite a node at a given + * location and can therefore be considered "complete". + * @param path The path to check for + * @return Whether there is a complete write at that path. + */ +- (BOOL)hasCompleteWriteAtPath:(FPath *)path { + return [self completeNodeAtPath:path] != nil; +} + +/** + * Returns a node for a path if and only if the node is a "complete" overwrite + * at that path. This will not aggregate writes from depeer paths, but will + * return child nodes from a more shallow path. + * @param path The path to get a complete write + * @return The node if complete at that path, or nil otherwise. + */ +- (id)completeNodeAtPath:(FPath *)path { + FTuplePathValue *rootMost = [self.writeTree findRootMostValueAndPath:path]; + if (rootMost != nil) { + FPath *relativePath = [FPath relativePathFrom:rootMost.path to:path]; + return [rootMost.value getChild:relativePath]; + } else { + return nil; + } +} + +// TODO: change into traversal method... +- (NSArray *)completeChildren { + NSMutableArray *children = [[NSMutableArray alloc] init]; + if (self.writeTree.value != nil) { + id node = self.writeTree.value; + [node enumerateChildrenUsingBlock:^(NSString *key, id node, + BOOL *stop) { + [children addObject:[[FNamedNode alloc] initWithName:key + andNode:node]]; + }]; + } else { + [self.writeTree.children + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FImmutableTree *childTree, BOOL *stop) { + if (childTree.value != nil) { + [children addObject:[[FNamedNode alloc] + initWithName:childKey + andNode:childTree.value]]; + } + }]; + } + return children; +} + +// TODO: change into enumarate method +- (NSDictionary *)childCompoundWrites { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + [self.writeTree.children + enumerateKeysAndObjectsUsingBlock:^( + NSString *key, FImmutableTree *childWrite, BOOL *stop) { + dict[key] = [[FCompoundWrite alloc] initWithWriteTree:childWrite]; + }]; + return dict; +} + +- (FCompoundWrite *)childCompoundWriteAtPath:(FPath *)path { + if (path.isEmpty) { + return self; + } else { + id shadowingNode = [self completeNodeAtPath:path]; + if (shadowingNode != nil) { + return [[FCompoundWrite alloc] + initWithWriteTree:[[FImmutableTree alloc] + initWithValue:shadowingNode]]; + } else { + return [[FCompoundWrite alloc] + initWithWriteTree:[self.writeTree subtreeAtPath:path]]; + } + } +} + +- (id)applySubtreeWrite:(FImmutableTree *)subtreeWrite + atPath:(FPath *)relativePath + toNode:(id)node { + if (subtreeWrite.value != nil) { + // Since a write there is always a leaf, we're done here. + return [node updateChild:relativePath withNewChild:subtreeWrite.value]; + } else { + __block id priorityWrite = nil; + __block id blockNode = node; + [subtreeWrite.children + enumerateKeysAndObjectsUsingBlock:^( + NSString *childKey, FImmutableTree *childTree, BOOL *stop) { + if ([childKey isEqualToString:@".priority"]) { + // Apply priorities at the end so we don't update priorities + // for either empty nodes or forget to apply priorities to + // empty nodes that are later filled. + NSAssert(childTree.value != nil, + @"Priority writes must always be leaf nodes"); + priorityWrite = childTree.value; + } else { + blockNode = [self + applySubtreeWrite:childTree + atPath:[relativePath childFromString:childKey] + toNode:blockNode]; + } + }]; + // If there was a priority write, we only apply it if the node is not + // empty + if (![blockNode getChild:relativePath].isEmpty && + priorityWrite != nil) { + blockNode = [blockNode + updateChild:[relativePath childFromString:@".priority"] + withNewChild:priorityWrite]; + } + return blockNode; + } +} + +- (void)enumerateWrites:(void (^)(FPath *, id, BOOL *))block { + __block BOOL stop = NO; + // TODO: add stop to tree iterator... + [self.writeTree forEach:^(FPath *path, id value) { + if (!stop) { + block(path, value, &stop); + } + }]; +} + +/** + * Applies this FCompoundWrite to a node. The node is returned with all writes + * from this FCompoundWrite applied to the node. + * @param node The node to apply this FCompoundWrite to + * @return The node with all writes applied + */ +- (id)applyToNode:(id)node { + return [self applySubtreeWrite:self.writeTree + atPath:[FPath empty] + toNode:node]; +} + +/** + * Return true if this CompoundWrite is empty and therefore does not modify any + * nodes. + * @return Whether this CompoundWrite is empty + */ +- (BOOL)isEmpty { + return self.writeTree.isEmpty; +} + +- (id)rootWrite { + return self.writeTree.value; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[FCompoundWrite class]]) { + return NO; + } + FCompoundWrite *other = (FCompoundWrite *)object; + return + [[self valForExport:YES] isEqualToDictionary:[other valForExport:YES]]; +} + +- (NSUInteger)hash { + return [[self valForExport:YES] hash]; +} + +- (NSDictionary *)valForExport:(BOOL)exportFormat { + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + [self.writeTree forEach:^(FPath *path, id value) { + dictionary[path.wireFormat] = [value valForExport:exportFormat]; + }]; + return dictionary; +} + +- (NSString *)description { + return [[self valForExport:YES] description]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FEmptyNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FEmptyNode.h new file mode 100644 index 00000000..d002df09 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FEmptyNode.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import + +@interface FEmptyNode : NSObject + ++ (id)emptyNode; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FEmptyNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FEmptyNode.m new file mode 100644 index 00000000..bde3a8ab --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FEmptyNode.m @@ -0,0 +1,30 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FEmptyNode.h" +#import "FChildrenNode.h" + +@implementation FEmptyNode + ++ (id)emptyNode { + static FChildrenNode *empty = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + empty = [[FChildrenNode alloc] init]; + }); + return empty; +} +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FIndexedNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FIndexedNode.h new file mode 100644 index 00000000..b161dea5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FIndexedNode.h @@ -0,0 +1,55 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIndex.h" +#import "FNamedNode.h" +#import "FNode.h" + +/** + * Represents a node together with an index. The index and node are updated in + * unison. In the case where the index does not affect the ordering (i.e. the + * ordering is identical to the key ordering) this class uses a fallback index + * to save memory. Everything operating on the index must special case the + * fallback index. + */ +@interface FIndexedNode : NSObject + +@property(nonatomic, strong, readonly) id node; + ++ (FIndexedNode *)indexedNodeWithNode:(id)node; ++ (FIndexedNode *)indexedNodeWithNode:(id)node index:(id)index; + +- (BOOL)hasIndex:(id)index; +- (FIndexedNode *)updateChild:(NSString *)key + withNewChild:(id)newChildNode; +- (FIndexedNode *)updatePriority:(id)priority; + +- (FNamedNode *)firstChild; +- (FNamedNode *)lastChild; + +- (NSString *)predecessorForChildKey:(NSString *)childKey + childNode:(id)childNode + index:(id)index; + +- (void)enumerateChildrenReverse:(BOOL)reverse + usingBlock:(void (^)(NSString *key, id node, + BOOL *stop))block; + +- (NSEnumerator *)childEnumerator; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FIndexedNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FIndexedNode.m new file mode 100644 index 00000000..dafe9c3a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FIndexedNode.m @@ -0,0 +1,218 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIndexedNode.h" + +#import "FChildrenNode.h" +#import "FImmutableSortedSet.h" +#import "FIndex.h" +#import "FKeyIndex.h" +#import "FPriorityIndex.h" + +static FImmutableSortedSet *FALLBACK_INDEX; + +@interface FIndexedNode () + +@property(nonatomic, strong) id node; +/** + * The indexed set is initialized lazily to prevent creation when it is not + * needed + */ +@property(nonatomic, strong) FImmutableSortedSet *indexed; +@property(nonatomic, strong) id index; + +@end + +@implementation FIndexedNode + ++ (FImmutableSortedSet *)fallbackIndex { + static FImmutableSortedSet *fallbackIndex; + static dispatch_once_t once; + dispatch_once(&once, ^{ + fallbackIndex = [[FImmutableSortedSet alloc] init]; + }); + return fallbackIndex; +} + ++ (FIndexedNode *)indexedNodeWithNode:(id)node { + return [[FIndexedNode alloc] initWithNode:node + index:[FPriorityIndex priorityIndex]]; +} + ++ (FIndexedNode *)indexedNodeWithNode:(id)node index:(id)index { + return [[FIndexedNode alloc] initWithNode:node index:index]; +} + +- (id)initWithNode:(id)node index:(id)index { + // Initialize indexed lazily + return [self initWithNode:node index:index indexed:nil]; +} + +- (id)initWithNode:(id)node + index:(id)index + indexed:(FImmutableSortedSet *)indexed { + self = [super init]; + if (self != nil) { + self->_node = node; + self->_index = index; + self->_indexed = indexed; + } + return self; +} + +- (void)ensureIndexed { + if (!self.indexed) { + if ([self.index isEqual:[FKeyIndex keyIndex]]) { + self.indexed = [FIndexedNode fallbackIndex]; + } else { + __block BOOL sawChild = NO; + [self.node enumerateChildrenUsingBlock:^( + NSString *key, id node, BOOL *stop) { + sawChild = sawChild || [self.index isDefinedOn:node]; + *stop = sawChild; + }]; + if (sawChild) { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + [self.node enumerateChildrenUsingBlock:^( + NSString *key, id node, BOOL *stop) { + FNamedNode *namedNode = + [[FNamedNode alloc] initWithName:key andNode:node]; + dict[namedNode] = [NSNull null]; + }]; + // Make sure to assign index here, because the comparator will + // be retained and using self will cause a cycle + id index = self.index; + self.indexed = [FImmutableSortedSet + setWithKeysFromDictionary:dict + comparator:^NSComparisonResult( + FNamedNode *namedNode1, + FNamedNode *namedNode2) { + return [index compareNamedNode:namedNode1 + toNamedNode:namedNode2]; + }]; + } else { + self.indexed = [FIndexedNode fallbackIndex]; + } + } + } +} + +- (BOOL)hasIndex:(id)index { + return [self.index isEqual:index]; +} + +- (FIndexedNode *)updateChild:(NSString *)key + withNewChild:(id)newChildNode { + id newNode = [self.node updateImmediateChild:key + withNewChild:newChildNode]; + if (self.indexed == [FIndexedNode fallbackIndex] && + ![self.index isDefinedOn:newChildNode]) { + // doesn't affect the index, no need to create an index + return [[FIndexedNode alloc] initWithNode:newNode + index:self.index + indexed:[FIndexedNode fallbackIndex]]; + } else if (!self.indexed || self.indexed == [FIndexedNode fallbackIndex]) { + // No need to index yet, index lazily + return [[FIndexedNode alloc] initWithNode:newNode index:self.index]; + } else { + id oldChild = [self.node getImmediateChild:key]; + FImmutableSortedSet *newIndexed = [self.indexed + removeObject:[FNamedNode nodeWithName:key node:oldChild]]; + if (![newChildNode isEmpty]) { + newIndexed = [newIndexed + addObject:[FNamedNode nodeWithName:key node:newChildNode]]; + } + return [[FIndexedNode alloc] initWithNode:newNode + index:self.index + indexed:newIndexed]; + } +} + +- (FIndexedNode *)updatePriority:(id)priority { + return + [[FIndexedNode alloc] initWithNode:[self.node updatePriority:priority] + index:self.index + indexed:self.indexed]; +} + +- (FNamedNode *)firstChild { + if (![self.node isKindOfClass:[FChildrenNode class]]) { + return nil; + } else { + [self ensureIndexed]; + if (self.indexed == [FIndexedNode fallbackIndex]) { + return [((FChildrenNode *)self.node) firstChild]; + } else { + return self.indexed.firstObject; + } + } +} + +- (FNamedNode *)lastChild { + if (![self.node isKindOfClass:[FChildrenNode class]]) { + return nil; + } else { + [self ensureIndexed]; + if (self.indexed == [FIndexedNode fallbackIndex]) { + return [((FChildrenNode *)self.node) lastChild]; + } else { + return self.indexed.lastObject; + } + } +} + +- (NSString *)predecessorForChildKey:(NSString *)childKey + childNode:(id)childNode + index:(id)index { + if (![self.index isEqual:index]) { + [NSException raise:NSInvalidArgumentException + format:@"Index not available in IndexedNode!"]; + } + [self ensureIndexed]; + if (self.indexed == [FIndexedNode fallbackIndex]) { + return [self.node predecessorChildKey:childKey]; + } else { + FNamedNode *node = [self.indexed + predecessorEntry:[FNamedNode nodeWithName:childKey node:childNode]]; + return node.name; + } +} + +- (void)enumerateChildrenReverse:(BOOL)reverse + usingBlock: + (void (^)(NSString *, id, BOOL *))block { + [self ensureIndexed]; + if (self.indexed == [FIndexedNode fallbackIndex]) { + [self.node enumerateChildrenReverse:reverse usingBlock:block]; + } else { + [self.indexed + enumerateObjectsReverse:reverse + usingBlock:^(FNamedNode *namedNode, BOOL *stop) { + block(namedNode.name, namedNode.node, stop); + }]; + } +} + +- (NSEnumerator *)childEnumerator { + [self ensureIndexed]; + if (self.indexed == [FIndexedNode fallbackIndex]) { + return [self.node childEnumerator]; + } else { + return [self.indexed objectEnumerator]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FLeafNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FLeafNode.h new file mode 100644 index 00000000..6bd2862a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FLeafNode.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import + +@interface FLeafNode : NSObject + +- (id)initWithValue:(id)aValue; +- (id)initWithValue:(id)aValue withPriority:(id)aPriority; + +@property(nonatomic, strong) id value; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FLeafNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FLeafNode.m new file mode 100644 index 00000000..e741fd93 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FLeafNode.m @@ -0,0 +1,266 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FLeafNode.h" +#import "FChildrenNode.h" +#import "FConstants.h" +#import "FEmptyNode.h" +#import "FImmutableSortedDictionary.h" +#import "FSnapshotUtilities.h" +#import "FStringUtilities.h" +#import "FUtilities.h" + +@interface FLeafNode () +@property(nonatomic, strong) id priorityNode; +@property(nonatomic, strong) NSString *lazyHash; + +@end + +@implementation FLeafNode + +@synthesize value; +@synthesize priorityNode; + +- (id)initWithValue:(id)aValue { + self = [super init]; + if (self) { + self.value = aValue; + self.priorityNode = [FEmptyNode emptyNode]; + } + return self; +} + +- (id)initWithValue:(id)aValue withPriority:(id)aPriority { + self = [super init]; + if (self) { + self.value = aValue; + [FSnapshotUtilities validatePriorityNode:aPriority]; + self.priorityNode = aPriority; + } + return self; +} + +#pragma mark - +#pragma mark FNode methods + +- (BOOL)isLeafNode { + return YES; +} + +- (id)getPriority { + return self.priorityNode; +} + +- (id)updatePriority:(id)aPriority { + return [[FLeafNode alloc] initWithValue:self.value withPriority:aPriority]; +} + +- (id)getImmediateChild:(NSString *)childName { + if ([childName isEqualToString:@".priority"]) { + return self.priorityNode; + } else { + return [FEmptyNode emptyNode]; + } +} + +- (id)getChild:(FPath *)path { + if (path.getFront == nil) { + return self; + } else if ([[path getFront] isEqualToString:@".priority"]) { + return [self getPriority]; + } else { + return [FEmptyNode emptyNode]; + } +} + +- (BOOL)hasChild:(NSString *)childName { + return + [childName isEqualToString:@".priority"] && ![self getPriority].isEmpty; +} + +- (NSString *)predecessorChildKey:(NSString *)childKey { + return nil; +} + +- (id)updateImmediateChild:(NSString *)childName + withNewChild:(id)newChildNode { + if ([childName isEqualToString:@".priority"]) { + return [self updatePriority:newChildNode]; + } else if (newChildNode.isEmpty) { + return self; + } else { + FChildrenNode *childrenNode = [[FChildrenNode alloc] init]; + childrenNode = [childrenNode updateImmediateChild:childName + withNewChild:newChildNode]; + childrenNode = [childrenNode updatePriority:self.priorityNode]; + return childrenNode; + } +} + +- (id)updateChild:(FPath *)path withNewChild:(id)newChildNode { + NSString *front = [path getFront]; + if (front == nil) { + return newChildNode; + } else if (newChildNode.isEmpty && ![front isEqualToString:@".priority"]) { + return self; + } else { + NSAssert(![front isEqualToString:@".priority"] || path.length == 1, + @".priority must be the last token in a path."); + return [self updateImmediateChild:front + withNewChild:[[FEmptyNode emptyNode] + updateChild:[path popFront] + withNewChild:newChildNode]]; + } +} + +- (id)val { + return [self valForExport:NO]; +} + +- (id)valForExport:(BOOL)exp { + if (exp && !self.getPriority.isEmpty) { + return @{ + kPayloadValue : self.value, + kPayloadPriority : [[self getPriority] val] + }; + } else { + return self.value; + } +} + +- (BOOL)isEqual:(id)other { + if (other == self) { + return YES; + } else if (other.isLeafNode) { + FLeafNode *otherLeaf = other; + if ([FUtilities getJavascriptType:self.value] != + [FUtilities getJavascriptType:otherLeaf.value]) { + return NO; + } + return [otherLeaf.value isEqual:self.value] && + [otherLeaf.priorityNode isEqual:self.priorityNode]; + } else { + return NO; + } +} + +- (NSUInteger)hash { + return [self.value hash] * 17 + self.priorityNode.hash; +} + +- (id)withIndex:(id)index { + return self; +} + +- (BOOL)isIndexed:(id)index { + return YES; +} + +- (BOOL)isEmpty { + return NO; +} + +- (int)numChildren { + return 0; +} + +- (void)enumerateChildrenUsingBlock:(void (^)(NSString *, id, + BOOL *))block { + // Nothing to iterate over +} + +- (void)enumerateChildrenReverse:(BOOL)reverse + usingBlock: + (void (^)(NSString *, id, BOOL *))block { + // Nothing to iterate over +} + +- (NSEnumerator *)childEnumerator { + // Nothing to iterate over + return [@[] objectEnumerator]; +} + +- (NSString *)dataHash { + if (self.lazyHash == nil) { + NSMutableString *toHash = [[NSMutableString alloc] init]; + [FSnapshotUtilities + appendHashRepresentationForLeafNode:self + toString:toHash + hashVersion:FDataHashVersionV1]; + + self.lazyHash = [FStringUtilities base64EncodedSha1:toHash]; + } + return self.lazyHash; +} + +- (NSComparisonResult)compare:(id)other { + if (other == [FEmptyNode emptyNode]) { + return NSOrderedDescending; + } else if ([other isKindOfClass:[FChildrenNode class]]) { + return NSOrderedAscending; + } else { + NSAssert(other.isLeafNode, @"Compared against unknown type of node."); + return [self compareToLeafNode:(FLeafNode *)other]; + } +} + ++ (NSArray *)valueTypeOrder { + static NSArray *valueOrder = nil; + static dispatch_once_t once; + dispatch_once(&once, ^{ + valueOrder = @[ + kJavaScriptObject, kJavaScriptBoolean, kJavaScriptNumber, + kJavaScriptString + ]; + }); + return valueOrder; +} + +- (NSComparisonResult)compareToLeafNode:(FLeafNode *)other { + NSString *thisLeafType = [FUtilities getJavascriptType:self.value]; + NSString *otherLeafType = [FUtilities getJavascriptType:other.value]; + NSUInteger thisIndex = + [[FLeafNode valueTypeOrder] indexOfObject:thisLeafType]; + NSUInteger otherIndex = + [[FLeafNode valueTypeOrder] indexOfObject:otherLeafType]; + assert(thisIndex >= 0 && otherIndex >= 0); + if (otherIndex == thisIndex) { + // Same type. Compare values. + if (thisLeafType == kJavaScriptObject) { + // Deferred value nodes are all equal, but we should also never get + // to this point... + return NSOrderedSame; + } else if (thisLeafType == kJavaScriptString) { + return [self.value compare:other.value options:NSLiteralSearch]; + } else { + return [self.value compare:other.value]; + } + } else { + return thisIndex > otherIndex ? NSOrderedDescending + : NSOrderedAscending; + } +} + +- (NSString *)description { + return [[self valForExport:YES] description]; +} + +- (void)forEachChildDo:(fbt_bool_nsstring_node)action { + // There are no children, so there is nothing to do. + return; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FNode.h new file mode 100644 index 00000000..ea251b63 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FNode.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPath.h" +#import "FTypedefs_Private.h" +#import + +@protocol FIndex; + +@protocol FNode + +- (BOOL)isLeafNode; +- (id)getPriority; +- (id)updatePriority:(id)priority; +- (id)getImmediateChild:(NSString *)childKey; +- (id)getChild:(FPath *)path; +- (NSString *)predecessorChildKey:(NSString *)childKey; +- (id)updateImmediateChild:(NSString *)childKey + withNewChild:(id)newChildNode; +- (id)updateChild:(FPath *)path withNewChild:(id)newChildNode; +- (BOOL)hasChild:(NSString *)childKey; +- (BOOL)isEmpty; +- (int)numChildren; +- (id)val; +- (id)valForExport:(BOOL)exp; +- (NSString *)dataHash; +- (NSComparisonResult)compare:(id)other; +- (BOOL)isEqual:(id)other; +- (void)enumerateChildrenUsingBlock:(void (^)(NSString *key, id node, + BOOL *stop))block; +- (void)enumerateChildrenReverse:(BOOL)reverse + usingBlock:(void (^)(NSString *key, id node, + BOOL *stop))block; + +- (NSEnumerator *)childEnumerator; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FSnapshotUtilities.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FSnapshotUtilities.h new file mode 100644 index 00000000..bf446605 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FSnapshotUtilities.h @@ -0,0 +1,49 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import + +@class FImmutableSortedDictionary; +@class FCompoundWrite; +@class FLeafNode; +@protocol FNode; + +typedef NS_ENUM(NSInteger, FDataHashVersion) { + FDataHashVersionV1, + FDataHashVersionV2, +}; + +@interface FSnapshotUtilities : NSObject + ++ (id)nodeFrom:(id)val; ++ (id)nodeFrom:(id)val priority:(id)priority; ++ (id)nodeFrom:(id)val withValidationFrom:(NSString *)fn; ++ (id)nodeFrom:(id)val + priority:(id)priority + withValidationFrom:(NSString *)fn; ++ (FCompoundWrite *)compoundWriteFromDictionary:(NSDictionary *)values + withValidationFrom:(NSString *)fn; ++ (void)validatePriorityNode:(id)priorityNode; ++ (void)appendHashRepresentationForLeafNode:(FLeafNode *)val + toString:(NSMutableString *)string + hashVersion:(FDataHashVersion)hashVersion; ++ (void)appendHashV2RepresentationForString:(NSString *)string + toString:(NSMutableString *)mutableString; + ++ (NSUInteger)estimateSerializedNodeSize:(id)node; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FSnapshotUtilities.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FSnapshotUtilities.m new file mode 100644 index 00000000..f3f9ed59 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Snapshot/FSnapshotUtilities.m @@ -0,0 +1,394 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FSnapshotUtilities.h" +#import "FChildrenNode.h" +#import "FCompoundWrite.h" +#import "FConstants.h" +#import "FEmptyNode.h" +#import "FLLRBValueNode.h" +#import "FLeafNode.h" +#import "FMaxNode.h" +#import "FNamedNode.h" +#import "FUtilities.h" +#import "FValidation.h" + +@implementation FSnapshotUtilities + ++ (id)nodeFrom:(id)val { + return [FSnapshotUtilities nodeFrom:val priority:nil]; +} + ++ (id)nodeFrom:(id)val priority:(id)priority { + return [FSnapshotUtilities nodeFrom:val + priority:priority + withValidationFrom:@"nodeFrom:priority:"]; +} + ++ (id)nodeFrom:(id)val withValidationFrom:(NSString *)fn { + return [FSnapshotUtilities nodeFrom:val priority:nil withValidationFrom:fn]; +} + ++ (id)nodeFrom:(id)val + priority:(id)priority + withValidationFrom:(NSString *)fn { + return [FSnapshotUtilities nodeFrom:val + priority:priority + withValidationFrom:fn + atDepth:0 + path:[[NSMutableArray alloc] init]]; +} + ++ (id)nodeFrom:(id)val + priority:(id)aPriority + withValidationFrom:(NSString *)fn + atDepth:(int)depth + path:(NSMutableArray *)path { + @autoreleasepool { + return [FSnapshotUtilities internalNodeFrom:val + priority:aPriority + withValidationFrom:fn + atDepth:depth + path:path]; + } +} + ++ (id)internalNodeFrom:(id)val + priority:(id)aPriority + withValidationFrom:(NSString *)fn + atDepth:(int)depth + path:(NSMutableArray *)path { + + if (depth > kFirebaseMaxObjectDepth) { + NSRange range; + range.location = 0; + range.length = 100; + NSString *pathString = + [[path subarrayWithRange:range] componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString stringWithFormat: + @"(%@) Max object depth exceeded: %@...", + fn, pathString] + userInfo:nil]; + } + + if (val == nil || val == [NSNull null]) { + // Null is a valid type to store + return [FEmptyNode emptyNode]; + } + + [FValidation validateFrom:fn isValidPriorityValue:aPriority withPath:path]; + id priority = [FSnapshotUtilities nodeFrom:aPriority]; + + id value = val; + BOOL isLeafNode = NO; + + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dict = val; + if (dict[kPayloadPriority] != nil) { + id rawPriority = [dict objectForKey:kPayloadPriority]; + [FValidation validateFrom:fn + isValidPriorityValue:rawPriority + withPath:path]; + priority = [FSnapshotUtilities nodeFrom:rawPriority]; + } + + if (dict[kPayloadValue] != nil) { + value = [dict objectForKey:kPayloadValue]; + if ([FValidation validateFrom:fn + isValidLeafValue:value + withPath:path]) { + isLeafNode = YES; + } else { + @throw [[NSException alloc] + initWithName:@"InvalidLeafValueType" + reason:[NSString stringWithFormat: + @"(%@) Invalid data type used " + @"with .value. Can only use " + "NSString and NSNumber or be " + "null. Found %@ instead.", + fn, [[value class] description]] + userInfo:nil]; + } + } + } + + if ([FValidation validateFrom:fn isValidLeafValue:value withPath:path]) { + isLeafNode = YES; + } + + if (isLeafNode) { + return [[FLeafNode alloc] initWithValue:value withPriority:priority]; + } + + // Unlike with JS, we have to handle the dictionary and array cases + // separately. + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dval = (NSDictionary *)value; + NSMutableDictionary *children = + [NSMutableDictionary dictionaryWithCapacity:dval.count]; + + // Avoid creating a million newPaths by appending to old one + for (id keyId in dval) { + [FValidation validateFrom:fn + validDictionaryKey:keyId + withPath:path]; + NSString *key = (NSString *)keyId; + + if (![key hasPrefix:kPayloadMetadataPrefix]) { + [path addObject:key]; + id childNode = [FSnapshotUtilities nodeFrom:dval[key] + priority:nil + withValidationFrom:fn + atDepth:depth + 1 + path:path]; + [path removeLastObject]; + + if (![childNode isEmpty]) { + children[key] = childNode; + } + } + } + + if ([children count] == 0) { + return [FEmptyNode emptyNode]; + } else { + FImmutableSortedDictionary *childrenDict = + [FImmutableSortedDictionary + fromDictionary:children + withComparator:[FUtilities keyComparator]]; + return [[FChildrenNode alloc] initWithPriority:priority + children:childrenDict]; + } + } else if ([value isKindOfClass:[NSArray class]]) { + NSArray *aval = (NSArray *)value; + NSMutableDictionary *children = + [NSMutableDictionary dictionaryWithCapacity:aval.count]; + + for (int i = 0; i < [aval count]; i++) { + NSString *key = [NSString stringWithFormat:@"%i", i]; + [path addObject:key]; + id childNode = + [FSnapshotUtilities nodeFrom:[aval objectAtIndex:i] + priority:nil + withValidationFrom:fn + atDepth:depth + 1 + path:path]; + [path removeLastObject]; + + if (![childNode isEmpty]) { + children[key] = childNode; + } + } + + if ([children count] == 0) { + return [FEmptyNode emptyNode]; + } else { + FImmutableSortedDictionary *childrenDict = + [FImmutableSortedDictionary + fromDictionary:children + withComparator:[FUtilities keyComparator]]; + return [[FChildrenNode alloc] initWithPriority:priority + children:childrenDict]; + } + } else { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = + [[path subarrayWithRange:range] componentsJoinedByString:@"."]; + + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString + stringWithFormat: + @"(%@) Cannot store object of type %@ at %@. " + "Can only store objects of type NSNumber, " + "NSString, NSDictionary, and NSArray.", + fn, [[value class] description], pathString] + userInfo:nil]; + } +} + ++ (FCompoundWrite *)compoundWriteFromDictionary:(NSDictionary *)values + withValidationFrom:(NSString *)fn { + FCompoundWrite *compoundWrite = [FCompoundWrite emptyWrite]; + + NSMutableArray *updatePaths = + [NSMutableArray arrayWithCapacity:values.count]; + for (NSString *keyId in values) { + id value = values[keyId]; + [FValidation validateFrom:fn + validUpdateDictionaryKey:keyId + withValue:value]; + + FPath *path = [FPath pathWithString:keyId]; + id node = [FSnapshotUtilities nodeFrom:value + withValidationFrom:fn]; + + [updatePaths addObject:path]; + compoundWrite = [compoundWrite addWrite:node atPath:path]; + } + + // Check that the update paths are not descendants of each other. + [updatePaths + sortUsingComparator:^NSComparisonResult(FPath *left, FPath *right) { + return [left compare:right]; + }]; + FPath *prevPath = nil; + for (FPath *path in updatePaths) { + if (prevPath != nil && [prevPath contains:path]) { + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString stringWithFormat: + @"(%@) Invalid path in object. Path " + @"(%@) is an ancestor of (%@).", + fn, prevPath, path] + userInfo:nil]; + } + prevPath = path; + } + + return compoundWrite; +} + ++ (void)validatePriorityNode:(id)priorityNode { + assert(priorityNode != nil); + if (priorityNode.isLeafNode) { + id val = priorityNode.val; + if ([val isKindOfClass:[NSDictionary class]]) { + NSDictionary *valDict __unused = (NSDictionary *)val; + NSAssert(valDict[kServerValueSubKey] != nil, + @"Priority can't be object unless it's a deferred value"); + } else { + NSString *jsType __unused = [FUtilities getJavascriptType:val]; + NSAssert(jsType == kJavaScriptString || jsType == kJavaScriptNumber, + @"Priority of unexpected type."); + } + } else { + NSAssert(priorityNode == [FMaxNode maxNode] || priorityNode.isEmpty, + @"Priority of unexpected type."); + } + // Don't call getPriority() on MAX_NODE to avoid hitting assertion. + NSAssert(priorityNode == [FMaxNode maxNode] || + priorityNode.getPriority.isEmpty, + @"Priority nodes can't have a priority of their own."); +} + ++ (void)appendHashRepresentationForLeafNode:(FLeafNode *)leafNode + toString:(NSMutableString *)string + hashVersion:(FDataHashVersion)hashVersion { + NSAssert(hashVersion == FDataHashVersionV1 || + hashVersion == FDataHashVersionV2, + @"Unknown hash version: %lu", (unsigned long)hashVersion); + if (!leafNode.getPriority.isEmpty) { + [string appendString:@"priority:"]; + [FSnapshotUtilities + appendHashRepresentationForLeafNode:leafNode.getPriority + toString:string + hashVersion:hashVersion]; + [string appendString:@":"]; + } + + NSString *jsType = [FUtilities getJavascriptType:leafNode.val]; + [string appendString:jsType]; + [string appendString:@":"]; + + if (jsType == kJavaScriptBoolean) { + NSString *boolString = + [leafNode.val boolValue] ? kJavaScriptTrue : kJavaScriptFalse; + [string appendString:boolString]; + } else if (jsType == kJavaScriptNumber) { + NSString *numberString = + [FUtilities ieee754StringForNumber:leafNode.val]; + [string appendString:numberString]; + } else if (jsType == kJavaScriptString) { + if (hashVersion == FDataHashVersionV1) { + [string appendString:leafNode.val]; + } else { + NSAssert(hashVersion == FDataHashVersionV2, + @"Invalid hash version found"); + [FSnapshotUtilities appendHashV2RepresentationForString:leafNode.val + toString:string]; + } + } else { + [NSException raise:NSInvalidArgumentException + format:@"Unknown value for hashing: %@", leafNode]; + } +} + ++ (void)appendHashV2RepresentationForString:(NSString *)string + toString:(NSMutableString *)mutableString { + string = [string stringByReplacingOccurrencesOfString:@"\\" + withString:@"\\\\"]; + string = [string stringByReplacingOccurrencesOfString:@"\"" + withString:@"\\\""]; + [mutableString appendString:@"\""]; + [mutableString appendString:string]; + [mutableString appendString:@"\""]; +} + ++ (NSUInteger)estimateLeafNodeSize:(FLeafNode *)leafNode { + NSString *jsType = [FUtilities getJavascriptType:leafNode.val]; + // These values are somewhat arbitrary, but we don't need an exact value so + // prefer performance over exact value + NSUInteger valueSize; + if (jsType == kJavaScriptNumber) { + valueSize = 8; // estimate each float with 8 bytes + } else if (jsType == kJavaScriptBoolean) { + valueSize = 4; // true or false need roughly 4 bytes + } else if (jsType == kJavaScriptString) { + valueSize = 2 + [leafNode.val length]; // add 2 for quotes + } else { + [NSException raise:NSInvalidArgumentException + format:@"Unknown leaf type: %@", leafNode]; + return 0; + } + + if (leafNode.getPriority.isEmpty) { + return valueSize; + } else { + // Account for extra overhead due to the extra JSON object and the + // ".value" and ".priority" keys, colons, comma + NSUInteger leafPriorityOverhead = 2 + 8 + 11 + 2 + 1; + return leafPriorityOverhead + valueSize + + [FSnapshotUtilities estimateLeafNodeSize:leafNode.getPriority]; + } +} + ++ (NSUInteger)estimateSerializedNodeSize:(id)node { + if ([node isEmpty]) { + return 4; // null keyword + } else if ([node isLeafNode]) { + return [FSnapshotUtilities estimateLeafNodeSize:node]; + } else { + NSAssert([node isKindOfClass:[FChildrenNode class]], + @"Unexpected node type: %@", [node class]); + __block NSUInteger sum = 1; // opening brackets + [((FChildrenNode *)node) enumerateChildrenAndPriorityUsingBlock:^( + NSString *key, id child, + BOOL *stop) { + sum += key.length; + sum += + 4; // quotes around key and colon and (comma or closing bracket) + sum += [FSnapshotUtilities estimateSerializedNodeSize:child]; + }]; + return sum; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FAtomicNumber.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FAtomicNumber.h new file mode 100644 index 00000000..b8668d2e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FAtomicNumber.h @@ -0,0 +1,23 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FAtomicNumber : NSObject + +- (NSNumber *)getAndIncrement; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FAtomicNumber.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FAtomicNumber.m new file mode 100644 index 00000000..20cfd8df --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FAtomicNumber.m @@ -0,0 +1,55 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FAtomicNumber.h" + +@interface FAtomicNumber () { + unsigned long number; +} + +@property(nonatomic, strong) NSLock *lock; + +@end + +@implementation FAtomicNumber + +@synthesize lock; + +- (id)init { + self = [super init]; + if (self) { + number = 1; + self.lock = [[NSLock alloc] init]; + } + return self; +} + +- (NSNumber *)getAndIncrement { + NSNumber *result; + + // See: + // http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW14 + // to improve, etc. + + [self.lock lock]; + result = [NSNumber numberWithUnsignedLong:number]; + number = number + 1; + [self.lock unlock]; + + return result; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FEventEmitter.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FEventEmitter.h new file mode 100644 index 00000000..fc19ca75 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FEventEmitter.h @@ -0,0 +1,36 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseConfig.h" +#import "FIRDatabaseQuery.h" +#import "FTypedefs_Private.h" + +@interface FEventEmitter : NSObject + +- (id)initWithAllowedEvents:(NSArray *)theAllowedEvents + queue:(dispatch_queue_t)queue; + +- (id)getInitialEventForType:(NSString *)eventType; +- (void)triggerEventType:(NSString *)eventType data:(id)data; + +- (FIRDatabaseHandle)observeEventType:(NSString *)eventType + withBlock:(fbt_void_id)block; +- (void)removeObserverForEventType:(NSString *)eventType + withHandle:(FIRDatabaseHandle)handle; + +- (void)validateEventType:(NSString *)eventType; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FEventEmitter.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FEventEmitter.m new file mode 100644 index 00000000..7d02239c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FEventEmitter.m @@ -0,0 +1,161 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FEventEmitter.h" +#import "FIRDatabaseQuery_Private.h" +#import "FRepoManager.h" +#import "FUtilities.h" + +@interface FEventListener : NSObject + +@property(nonatomic, copy) fbt_void_id userCallback; +@property(nonatomic) FIRDatabaseHandle handle; + +@end + +@implementation FEventListener + +@synthesize userCallback; +@synthesize handle; + +@end + +@interface FEventEmitter () + +@property(nonatomic, strong) NSArray *allowedEvents; +@property(nonatomic, strong) NSMutableDictionary *listeners; +@property(nonatomic, strong) dispatch_queue_t queue; + +@end + +@implementation FEventEmitter + +@synthesize allowedEvents; +@synthesize listeners; + +- (id)initWithAllowedEvents:(NSArray *)theAllowedEvents + queue:(dispatch_queue_t)queue { + if (theAllowedEvents == nil || [theAllowedEvents count] == 0) { + @throw [NSException + exceptionWithName:@"AllowedEventsValidation" + reason:@"FEventEmitters must be initialized with at " + @"least one valid event." + userInfo:nil]; + } + + self = [super init]; + + if (self) { + self.allowedEvents = [theAllowedEvents copy]; + self.listeners = [[NSMutableDictionary alloc] init]; + self.queue = queue; + } + + return self; +} + +- (id)getInitialEventForType:(NSString *)eventType { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"You must override getInitialEvent: " + @"when subclassing FEventEmitter" + userInfo:nil]; +} + +- (void)triggerEventType:(NSString *)eventType data:(id)data { + [self validateEventType:eventType]; + NSMutableDictionary *eventTypeListeners = + [self.listeners objectForKey:eventType]; + for (FEventListener *listener in eventTypeListeners) { + [self triggerListener:listener withData:data]; + } +} + +- (void)triggerListener:(FEventListener *)listener withData:(id)data { + // TODO, should probably get this from FRepo or something although it ends + // up being the same. (Except maybe for testing) + if (listener.userCallback) { + dispatch_async(self.queue, ^{ + listener.userCallback(data); + }); + } +} + +- (FIRDatabaseHandle)observeEventType:(NSString *)eventType + withBlock:(fbt_void_id)block { + [self validateEventType:eventType]; + + // Create listener + FEventListener *listener = [[FEventListener alloc] init]; + listener.handle = [[FUtilities LUIDGenerator] integerValue]; + listener.userCallback = block; // copies block automatically + + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self addEventListener:listener forEventType:eventType]; + }); + + return listener.handle; +} + +- (void)addEventListener:(FEventListener *)listener + forEventType:(NSString *)eventType { + // Get or initializer listeners map [FIRDatabaseHandle -> callback block] + // for eventType + NSMutableArray *eventTypeListeners = + [self.listeners objectForKey:eventType]; + if (eventTypeListeners == nil) { + eventTypeListeners = [[NSMutableArray alloc] init]; + [self.listeners setObject:eventTypeListeners forKey:eventType]; + } + + // Add listener and fire the current event for this listener + [eventTypeListeners addObject:listener]; + id initialData = [self getInitialEventForType:eventType]; + [self triggerListener:listener withData:initialData]; +} + +- (void)removeObserverForEventType:(NSString *)eventType + withHandle:(FIRDatabaseHandle)handle { + [self validateEventType:eventType]; + + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ + [self removeEventListenerWithHandle:handle forEventType:eventType]; + }); +} + +- (void)removeEventListenerWithHandle:(FIRDatabaseHandle)handle + forEventType:(NSString *)eventType { + NSMutableArray *eventTypeListeners = + [self.listeners objectForKey:eventType]; + for (FEventListener *listener in [eventTypeListeners copy]) { + if (handle == NSNotFound || handle == listener.handle) { + [eventTypeListeners removeObject:listener]; + } + } +} + +- (void)validateEventType:(NSString *)eventType { + if ([self.allowedEvents indexOfObject:eventType] == NSNotFound) { + @throw [NSException + exceptionWithName:@"InvalidEventType" + reason:[NSString stringWithFormat: + @"%@ is not a valid event type. %@ " + @"is the list of valid events.", + eventType, self.allowedEvents] + userInfo:nil]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FNextPushId.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FNextPushId.h new file mode 100644 index 00000000..5a661960 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FNextPushId.h @@ -0,0 +1,23 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FNextPushId : NSObject + ++ (NSString *)get:(NSTimeInterval)now; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FNextPushId.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FNextPushId.m new file mode 100644 index 00000000..864e1474 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FNextPushId.m @@ -0,0 +1,62 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNextPushId.h" +#import "FUtilities.h" + +static NSString *const PUSH_CHARS = + @"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"; + +@implementation FNextPushId + ++ (NSString *)get:(NSTimeInterval)currentTime { + static long long lastPushTime = 0; + static int lastRandChars[12]; + + long long now = (long long)(currentTime * 1000); + + BOOL duplicateTime = now == lastPushTime; + lastPushTime = now; + + unichar timeStampChars[8]; + for (int i = 7; i >= 0; i--) { + timeStampChars[i] = [PUSH_CHARS characterAtIndex:(now % 64)]; + now = (long long)floor(now / 64); + } + + NSMutableString *id = [[NSMutableString alloc] init]; + [id appendString:[NSString stringWithCharacters:timeStampChars length:8]]; + + if (!duplicateTime) { + for (int i = 0; i < 12; i++) { + lastRandChars[i] = (int)floor(arc4random() % 64); + } + } else { + int i = 0; + for (i = 11; i >= 0 && lastRandChars[i] == 63; i--) { + lastRandChars[i] = 0; + } + lastRandChars[i]++; + } + + for (int i = 0; i < 12; i++) { + [id appendFormat:@"%C", [PUSH_CHARS characterAtIndex:lastRandChars[i]]]; + } + + return [NSString stringWithString:id]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FParsedUrl.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FParsedUrl.h new file mode 100644 index 00000000..1c072845 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FParsedUrl.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPath.h" +#import "FRepoInfo.h" + +@interface FParsedUrl : NSObject + +@property(nonatomic, strong) FRepoInfo *repoInfo; +@property(nonatomic, strong) FPath *path; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FParsedUrl.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FParsedUrl.m new file mode 100644 index 00000000..eb833309 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FParsedUrl.m @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FParsedUrl.h" + +@implementation FParsedUrl + +@synthesize repoInfo; +@synthesize path; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FStringUtilities.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FStringUtilities.h new file mode 100644 index 00000000..f7d19b6e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FStringUtilities.h @@ -0,0 +1,26 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FStringUtilities : NSObject + ++ (NSString *)base64EncodedSha1:(NSString *)str; ++ (NSString *)urlDecoded:(NSString *)url; ++ (NSString *)urlEncoded:(NSString *)url; ++ (NSString *)sanitizedForUserAgent:(NSString *)str; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FStringUtilities.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FStringUtilities.m new file mode 100644 index 00000000..2515257b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FStringUtilities.m @@ -0,0 +1,72 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FStringUtilities.h" +#import "NSData+SRB64Additions.h" +#import + +@implementation FStringUtilities + +// http://stackoverflow.com/questions/3468268/objective-c-sha1 +// http://stackoverflow.com/questions/7310457/ios-objective-c-sha-1-and-base64-problem ++ (NSString *)base64EncodedSha1:(NSString *)str { + const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding]; + // NSString reports length in characters, but we want it in bytes, which + // strlen will give us. + unsigned long dataLen = strlen(cstr); + NSData *data = [NSData dataWithBytes:cstr length:dataLen]; + uint8_t digest[CC_SHA1_DIGEST_LENGTH]; + CC_SHA1(data.bytes, (unsigned int)data.length, digest); + NSData *output = [[NSData alloc] initWithBytes:digest + length:CC_SHA1_DIGEST_LENGTH]; + return [FSRUtilities base64EncodedStringFromData:output]; +} + ++ (NSString *)urlDecoded:(NSString *)url { + NSString *replaced = [url stringByReplacingOccurrencesOfString:@"+" + withString:@" "]; + NSString *decoded = [replaced stringByRemovingPercentEncoding]; + // This is kind of a hack, but is generally how the js client works. We + // could run into trouble if some piece is a correctly escaped %-sequence, + // and another isn't. But, that's bad input anyways... + if (decoded) { + return decoded; + } else { + return replaced; + } +} + ++ (NSString *)urlEncoded:(NSString *)url { + // Didn't seem like there was an Apple NSCharacterSet that had our version + // of the encoding So I made my own, following RFC 2396 + // https://www.ietf.org/rfc/rfc2396.txt allowedCharacters = alphanum | "-" | + // "_" | "~" + NSCharacterSet *allowedCharacters = [NSCharacterSet + characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGH" + @"IJKLMNOPQRSTUVWXYZ0123456789-_~"]; + return [url + stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters]; +} + ++ (NSString *)sanitizedForUserAgent:(NSString *)str { + return + [str stringByReplacingOccurrencesOfString:@"/|_" + withString:@"|" + options:NSRegularExpressionSearch + range:NSMakeRange(0, [str length])]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FTypedefs.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FTypedefs.h new file mode 100644 index 00000000..56d97fff --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FTypedefs.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#ifndef Firebase_FTypedefs_h +#define Firebase_FTypedefs_h + +/** + * Stub... + */ +@class FIRDataSnapshot; +@class FIRDatabaseReference; +@class FAuthData; +@protocol FNode; + +// fbt = Firebase Block Typedef + +typedef void (^fbt_void_void)(void); +typedef void (^fbt_void_datasnapshot_nsstring)(FIRDataSnapshot *snapshot, + NSString *prevName); +typedef void (^fbt_void_datasnapshot)(FIRDataSnapshot *snapshot); +typedef void (^fbt_void_user)(FAuthData *user); +typedef void (^fbt_void_nsstring_id)(NSString *status, id data); +typedef void (^fbt_void_nserror_id)(NSError *error, id data); +typedef void (^fbt_void_nserror)(NSError *error); +typedef void (^fbt_void_nserror_ref)(NSError *error, FIRDatabaseReference *ref); +typedef void (^fbt_void_nserror_user)(NSError *error, FAuthData *user); +typedef void (^fbt_void_nserror_json)(NSError *error, NSDictionary *json); +typedef void (^fbt_void_nsdictionary)(NSDictionary *data); +typedef id (^fbt_id_node_nsstring)(id node, NSString *childName); + +#endif diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FUtilities.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FUtilities.h new file mode 100644 index 00000000..3a1ca3c1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FUtilities.h @@ -0,0 +1,82 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import + +#import "FParsedUrl.h" + +@interface FUtilities : NSObject + ++ (NSArray *)splitString:(NSString *)str intoMaxSize:(const unsigned int)size; ++ (NSNumber *)LUIDGenerator; ++ (FParsedUrl *)parseUrl:(NSString *)url; ++ (NSString *)getJavascriptType:(id)obj; ++ (NSError *)errorForStatus:(NSString *)status andReason:(NSString *)reason; ++ (NSNumber *)intForString:(NSString *)string; ++ (NSString *)ieee754StringForNumber:(NSNumber *)val; ++ (void)setLoggingEnabled:(BOOL)enabled; ++ (BOOL)getLoggingEnabled; + ++ (NSString *)minName; ++ (NSString *)maxName; ++ (NSComparisonResult)compareKey:(NSString *)a toKey:(NSString *)b; ++ (NSComparator)stringComparator; ++ (NSComparator)keyComparator; + ++ (double)randomDouble; + +@end + +typedef enum { + FLogLevelDebug = 1, + FLogLevelInfo = 2, + FLogLevelWarn = 3, + FLogLevelError = 4, + FLogLevelNone = 5 +} FLogLevel; + +// Log tags +FOUNDATION_EXPORT NSString *const kFPersistenceLogTag; + +#define FFLog(code, format, ...) FFDebug((code), (format), ##__VA_ARGS__) + +#define FFDebug(code, format, ...) \ + do { \ + if (FFIsLoggingEnabled(FLogLevelDebug)) { \ + FIRLogDebug(kFIRLoggerDatabase, (code), (format), ##__VA_ARGS__); \ + } \ + } while (0) + +#define FFInfo(code, format, ...) \ + do { \ + if (FFIsLoggingEnabled(FLogLevelInfo)) { \ + FIRLogError(kFIRLoggerDatabase, (code), (format), ##__VA_ARGS__); \ + } \ + } while (0) + +#define FFWarn(code, format, ...) \ + do { \ + if (FFIsLoggingEnabled(FLogLevelWarn)) { \ + FIRLogWarning(kFIRLoggerDatabase, (code), (format), \ + ##__VA_ARGS__); \ + } \ + } while (0) + +extern FIRLoggerService kFIRLoggerDatabase; +BOOL FFIsLoggingEnabled(FLogLevel logLevel); +void firebaseUncaughtExceptionHandler(NSException *exception); +void firebaseJobsTroll(void); diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FUtilities.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FUtilities.m new file mode 100644 index 00000000..df08a300 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FUtilities.m @@ -0,0 +1,433 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FUtilities.h" +#import "FAtomicNumber.h" +#import "FConstants.h" +#import "FStringUtilities.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#define ARC4RANDOM_MAX 0x100000000 +#define INTEGER_32_MIN (-2147483648) +#define INTEGER_32_MAX 2147483647 + +#pragma mark - +#pragma mark C functions + +FIRLoggerService kFIRLoggerDatabase = @"[Firebase/Database]"; +static FLogLevel logLevel = FLogLevelInfo; // Default log level is info +static NSMutableDictionary *options = nil; + +BOOL FFIsLoggingEnabled(FLogLevel level) { return level >= logLevel; } + +void firebaseJobsTroll(void) { + FFLog(@"I-RDB095001", + @"password super secret; JFK conspiracy; Hello there! Having fun " + @"digging through Firebase? We're always hiring! jobs@firebase.com"); +} + +#pragma mark - +#pragma mark Private property and singleton specification + +@interface FUtilities () { +} + +@property(nonatomic, strong) FAtomicNumber *localUid; + ++ (FUtilities *)singleton; + +@end + +@implementation FUtilities + +@synthesize localUid; + +- (id)init { + self = [super init]; + if (self) { + self.localUid = [[FAtomicNumber alloc] init]; + } + return self; +} + +// TODO: We really want to be able to set the log level ++ (void)setLoggingEnabled:(BOOL)enabled { + logLevel = enabled ? FLogLevelDebug : FLogLevelInfo; +} + ++ (BOOL)getLoggingEnabled { + return logLevel == FLogLevelDebug; +} + ++ (FUtilities *)singleton { + static dispatch_once_t pred = 0; + __strong static id _sharedObject = nil; + dispatch_once(&pred, ^{ + _sharedObject = [[self alloc] init]; // or some other init method + }); + return _sharedObject; +} + +// Refactor as a category of NSString ++ (NSArray *)splitString:(NSString *)str intoMaxSize:(const unsigned int)size { + if (str.length <= size) { + return [NSArray arrayWithObject:str]; + } + + NSMutableArray *dataSegs = [[NSMutableArray alloc] init]; + for (int c = 0; c < str.length; c += size) { + if (c + size > str.length) { + int rangeStart = c; + unsigned long rangeLength = size - ((c + size) - str.length); + [dataSegs + addObject:[str substringWithRange:NSMakeRange(rangeStart, + rangeLength)]]; + } else { + int rangeStart = c; + int rangeLength = size; + [dataSegs + addObject:[str substringWithRange:NSMakeRange(rangeStart, + rangeLength)]]; + } + } + return dataSegs; +} + ++ (NSNumber *)LUIDGenerator { + FUtilities *f = [FUtilities singleton]; + return [f.localUid getAndIncrement]; +} + ++ (NSString *)decodePath:(NSString *)pathString { + NSMutableArray *decodedPieces = [[NSMutableArray alloc] init]; + NSArray *pieces = [pathString componentsSeparatedByString:@"/"]; + for (NSString *piece in pieces) { + if (piece.length > 0) { + [decodedPieces addObject:[FStringUtilities urlDecoded:piece]]; + } + } + return [NSString + stringWithFormat:@"/%@", [decodedPieces componentsJoinedByString:@"/"]]; +} + ++ (NSString *)extractPathFromUrlString:(NSString *)url { + NSString *path = url; + + NSRange schemeIndex = [path rangeOfString:@"//"]; + if (schemeIndex.location != NSNotFound) { + path = [path substringFromIndex:schemeIndex.location + 2]; + } + + NSUInteger pathIndex = [path rangeOfString:@"/"].location; + if (pathIndex != NSNotFound) { + path = [path substringFromIndex:pathIndex + 1]; + } else { + path = @""; + } + + NSUInteger queryParamIndex = [path rangeOfString:@"?"].location; + if (queryParamIndex != NSNotFound) { + path = [path substringToIndex:queryParamIndex]; + } + + return path; +} + ++ (FParsedUrl *)parseUrl:(NSString *)url { + // For backwards compatibility, support URLs without schemes on iOS. + if (![url containsString:@"://"]) { + url = [@"http://" stringByAppendingString:url]; + } + + NSString *originalPathString = [self extractPathFromUrlString:url]; + + // Sanitize the database URL by removing the path component, which may + // contain invalid URL characters. + NSString *sanitizedUrlWithoutPath = + [url stringByReplacingOccurrencesOfString:originalPathString + withString:@""]; + NSURLComponents *urlComponents = + [NSURLComponents componentsWithString:sanitizedUrlWithoutPath]; + if (!urlComponents) { + [NSException raise:@"Failed to parse database URL" + format:@"Failed to parse database URL: %@", url]; + } + + NSString *host = [urlComponents.host lowercaseString]; + NSString *namespace; + bool secure; + + if (urlComponents.port != nil) { + secure = [urlComponents.scheme isEqualToString:@"https"] || + [urlComponents.scheme isEqualToString:@"wss"]; + host = [host stringByAppendingFormat:@":%@", urlComponents.port]; + } else { + secure = YES; + }; + + NSArray *parts = [urlComponents.host componentsSeparatedByString:@"."]; + if ([parts count] == 3) { + namespace = [parts[0] lowercaseString]; + } else { + // Attempt to extract namespace from "ns" query param. + NSArray *queryItems = urlComponents.queryItems; + for (NSURLQueryItem *item in queryItems) { + if ([item.name isEqualToString:@"ns"]) { + namespace = item.value; + break; + } + } + + if (!namespace) { + namespace = [parts[0] lowercaseString]; + } + } + + NSString *pathString = [self + decodePath:[NSString stringWithFormat:@"/%@", originalPathString]]; + FPath *path = [[FPath alloc] initWith:pathString]; + FRepoInfo *repoInfo = [[FRepoInfo alloc] initWithHost:host + isSecure:secure + withNamespace:namespace]; + + FFLog(@"I-RDB095002", @"---> Parsed (%@) to: (%@,%@); ns=(%@); path=(%@)", + url, [repoInfo description], [repoInfo connectionURL], + repoInfo.namespace, [path description]); + + FParsedUrl *parsedUrl = [[FParsedUrl alloc] init]; + parsedUrl.repoInfo = repoInfo; + parsedUrl.path = path; + + return parsedUrl; +} + +/* + case str: JString => priString + "string:" + str.s; + case bool: JBool => priString + "boolean:" + bool.value; + case double: JDouble => priString + "number:" + double.num; + case int: JInt => priString + "number:" + int.num; + case _ => { + error("Leaf node has value '" + data.value + "' of invalid type '" + + data.value.getClass.toString + "'"); + ""; + } + */ + ++ (NSString *)getJavascriptType:(id)obj { + if ([obj isKindOfClass:[NSDictionary class]]) { + return kJavaScriptObject; + } else if ([obj isKindOfClass:[NSString class]]) { + return kJavaScriptString; + } else if ([obj isKindOfClass:[NSNumber class]]) { + // We used to just compare to @encode(BOOL) as suggested at + // http://stackoverflow.com/questions/2518761/get-type-of-nsnumber, but + // on arm64, @encode(BOOL) returns "B" instead of "c" even though + // objCType still returns 'c' (signed char). So check both. + if (strcmp([obj objCType], @encode(BOOL)) == 0 || + strcmp([obj objCType], @encode(signed char)) == 0) { + return kJavaScriptBoolean; + } else { + return kJavaScriptNumber; + } + } else { + return kJavaScriptNull; + } +} + ++ (NSError *)errorForStatus:(NSString *)status andReason:(NSString *)reason { + static dispatch_once_t pred = 0; + __strong static NSDictionary *errorMap = nil; + __strong static NSDictionary *errorCodes = nil; + dispatch_once(&pred, ^{ + errorMap = @{ + @"permission_denied" : @"Permission Denied", + @"unavailable" : @"Service is unavailable", + kFErrorWriteCanceled : @"Write cancelled by user" + }; + errorCodes = @{ + @"permission_denied" : @1, + @"unavailable" : @2, + kFErrorWriteCanceled : @3 + }; + }); + + if ([status isEqualToString:kFWPResponseForActionStatusOk]) { + return nil; + } else { + NSInteger code; + NSString *desc = nil; + if (reason) { + desc = reason; + } else if ([errorMap objectForKey:status] != nil) { + desc = [errorMap objectForKey:status]; + } else { + desc = status; + } + + if ([errorCodes objectForKey:status] != nil) { + NSNumber *num = [errorCodes objectForKey:status]; + code = [num integerValue]; + } else { + // XXX what to do here? + code = 9999; + } + + return [[NSError alloc] + initWithDomain:kFErrorDomain + code:code + userInfo:@{NSLocalizedDescriptionKey : desc}]; + } +} + ++ (NSNumber *)intForString:(NSString *)string { + static NSCharacterSet *notDigits = nil; + if (!notDigits) { + notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; + } + if ([string rangeOfCharacterFromSet:notDigits].length == 0) { + NSInteger num; + NSScanner *scanner = [NSScanner scannerWithString:string]; + if ([scanner scanInteger:&num]) { + return [NSNumber numberWithInteger:num]; + } + } + return nil; +} + ++ (NSString *)ieee754StringForNumber:(NSNumber *)val { + double d = [val doubleValue]; + NSData *data = [NSData dataWithBytes:&d length:sizeof(double)]; + NSMutableString *str = [[NSMutableString alloc] init]; + const unsigned char *buffer = (const unsigned char *)[data bytes]; + for (int i = 0; i < data.length; i++) { + unsigned char byte = buffer[7 - i]; + [str appendFormat:@"%02x", byte]; + } + return str; +} + +static inline BOOL tryParseStringToInt(__unsafe_unretained NSString *str, + NSInteger *integer) { + // First do some cheap checks (NOTE: The below checks are significantly + // faster than an equivalent regex :-( ). + NSUInteger length = str.length; + if (length > 11 || length == 0) { + return NO; + } + long long value = 0; + BOOL negative = NO; + NSUInteger i = 0; + if ([str characterAtIndex:0] == '-') { + if (length == 1) { + return NO; + } + negative = YES; + i = 1; + } + for (; i < length; i++) { + unichar c = [str characterAtIndex:i]; + // Must be a digit, or '-' if it's the first char. + if (c < '0' || c > '9') { + return NO; + } else { + int charValue = c - '0'; + value = value * 10 + charValue; + } + } + + value = (negative) ? -value : value; + + if (value < INTEGER_32_MIN || value > INTEGER_32_MAX) { + return NO; + } else { + *integer = (NSInteger)value; + return YES; + } +} + ++ (NSString *)maxName { + static dispatch_once_t once; + static NSString *maxName; + dispatch_once(&once, ^{ + maxName = [[NSString alloc] initWithFormat:@"[MAX_NAME]"]; + }); + return maxName; +} + ++ (NSString *)minName { + static dispatch_once_t once; + static NSString *minName; + dispatch_once(&once, ^{ + minName = [[NSString alloc] initWithFormat:@"[MIN_NAME]"]; + }); + return minName; +} + ++ (NSComparisonResult)compareKey:(NSString *)a toKey:(NSString *)b { + if (a == b) { + return NSOrderedSame; + } else if (a == [FUtilities minName] || b == [FUtilities maxName]) { + return NSOrderedAscending; + } else if (b == [FUtilities minName] || a == [FUtilities maxName]) { + return NSOrderedDescending; + } else { + NSInteger aAsInt, bAsInt; + if (tryParseStringToInt(a, &aAsInt)) { + if (tryParseStringToInt(b, &bAsInt)) { + if (aAsInt > bAsInt) { + return NSOrderedDescending; + } else if (aAsInt < bAsInt) { + return NSOrderedAscending; + } else if (a.length > b.length) { + return NSOrderedDescending; + } else if (a.length < b.length) { + return NSOrderedAscending; + } else { + return NSOrderedSame; + } + } else { + return (NSComparisonResult)NSOrderedAscending; + } + } else if (tryParseStringToInt(b, &bAsInt)) { + return (NSComparisonResult)NSOrderedDescending; + } else { + // Perform literal character by character search to prevent a > b && + // b > a issues. Note that calling -(NSString + // *)decomposedStringWithCanonicalMapping also works. + return [a compare:b options:NSLiteralSearch]; + } + } +} + ++ (NSComparator)keyComparator { + return ^NSComparisonResult(__unsafe_unretained NSString *a, + __unsafe_unretained NSString *b) { + return [FUtilities compareKey:a toKey:b]; + }; +} + ++ (NSComparator)stringComparator { + return ^NSComparisonResult(__unsafe_unretained NSString *a, + __unsafe_unretained NSString *b) { + return [a compare:b]; + }; +} + ++ (double)randomDouble { + return ((double)arc4random() / ARC4RANDOM_MAX); +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FValidation.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FValidation.h new file mode 100644 index 00000000..276eb267 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FValidation.h @@ -0,0 +1,55 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDataEventType.h" +#import "FParsedUrl.h" +#import "FPath.h" +#import "FTypedefs.h" +#import + +@interface FValidation : NSObject + ++ (void)validateFrom:(NSString *)fn writablePath:(FPath *)path; ++ (void)validateFrom:(NSString *)fn knownEventType:(FIRDataEventType)event; ++ (void)validateFrom:(NSString *)fn validPathString:(NSString *)pathString; ++ (void)validateFrom:(NSString *)fn validRootPathString:(NSString *)pathString; ++ (void)validateFrom:(NSString *)fn validKey:(NSString *)key; ++ (void)validateFrom:(NSString *)fn validURL:(FParsedUrl *)parsedUrl; + ++ (void)validateToken:(NSString *)token; + +// Functions for handling passing errors back ++ (void)handleError:(NSError *)error + withUserCallback:(fbt_void_nserror_id)userCallback; ++ (void)handleError:(NSError *)error + withSuccessCallback:(fbt_void_nserror)userCallback; + +// Functions used for validating while creating snapshots in FSnapshotUtilities ++ (BOOL)validateFrom:(NSString *)fn + isValidLeafValue:(id)value + withPath:(NSArray *)path; ++ (void)validateFrom:(NSString *)fn + validDictionaryKey:(id)keyId + withPath:(NSArray *)path; ++ (void)validateFrom:(NSString *)fn + validUpdateDictionaryKey:(id)keyId + withValue:(id)value; ++ (void)validateFrom:(NSString *)fn + isValidPriorityValue:(id)value + withPath:(NSArray *)path; ++ (BOOL)validatePriorityValue:value; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FValidation.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FValidation.m new file mode 100644 index 00000000..c700b9ce --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/FValidation.m @@ -0,0 +1,461 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FValidation.h" +#import "FConstants.h" +#import "FParsedUrl.h" +#import "FTypedefs.h" + +// Have to escape: * ? + [ ( ) { } ^ $ | \ . / +// See: +// https://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html + +NSString *const kInvalidPathCharacters = @"[].#$"; +NSString *const kInvalidKeyCharacters = @"[].#$/"; + +@implementation FValidation + ++ (void)validateFrom:(NSString *)fn writablePath:(FPath *)path { + if ([[path getFront] isEqualToString:kDotInfoPrefix]) { + @throw [[NSException alloc] + initWithName:@"WritablePathValidation" + reason:[NSString + stringWithFormat:@"(%@) failed to path %@: Can't " + @"modify data under %@", + fn, [path description], + kDotInfoPrefix] + userInfo:nil]; + } +} + ++ (void)validateFrom:(NSString *)fn knownEventType:(FIRDataEventType)event { + switch (event) { + case FIRDataEventTypeValue: + case FIRDataEventTypeChildAdded: + case FIRDataEventTypeChildChanged: + case FIRDataEventTypeChildMoved: + case FIRDataEventTypeChildRemoved: + return; + break; + default: + @throw [[NSException alloc] + initWithName:@"KnownEventTypeValidation" + reason:[NSString + stringWithFormat:@"(%@) Unknown event type: %d", + fn, (int)event] + userInfo:nil]; + break; + } +} + ++ (BOOL)isValidPathString:(NSString *)pathString { + static dispatch_once_t token; + static NSCharacterSet *badPathChars = nil; + dispatch_once(&token, ^{ + badPathChars = [NSCharacterSet + characterSetWithCharactersInString:kInvalidPathCharacters]; + }); + return pathString != nil && [pathString length] != 0 && + [pathString rangeOfCharacterFromSet:badPathChars].location == + NSNotFound; +} + ++ (void)validateFrom:(NSString *)fn validPathString:(NSString *)pathString { + if (![self isValidPathString:pathString]) { + @throw [[NSException alloc] + initWithName:@"InvalidPathValidation" + reason:[NSString stringWithFormat: + @"(%@) Must be a non-empty string and " + @"not contain '.' '#' '$' '[' or ']'", + fn] + userInfo:nil]; + } +} + ++ (void)validateFrom:(NSString *)fn validRootPathString:(NSString *)pathString { + static dispatch_once_t token; + static NSRegularExpression *dotInfoRegex = nil; + dispatch_once(&token, ^{ + dotInfoRegex = [NSRegularExpression + regularExpressionWithPattern:@"^\\/*\\.info(\\/|$)" + options:0 + error:nil]; + }); + + NSString *tempPath = pathString; + // HACK: Obj-C regex are kinda' slow. Do a plain string search first before + // bothering with the regex. + if ([pathString rangeOfString:@".info"].location != NSNotFound) { + tempPath = [dotInfoRegex + stringByReplacingMatchesInString:pathString + options:0 + range:NSMakeRange(0, pathString.length) + withTemplate:@"/"]; + } + [self validateFrom:fn validPathString:tempPath]; +} + ++ (BOOL)isValidKey:(NSString *)key { + static dispatch_once_t token; + static NSCharacterSet *badKeyChars = nil; + dispatch_once(&token, ^{ + badKeyChars = [NSCharacterSet + characterSetWithCharactersInString:kInvalidKeyCharacters]; + }); + return key != nil && key.length > 0 && + [key rangeOfCharacterFromSet:badKeyChars].location == NSNotFound; +} + ++ (void)validateFrom:(NSString *)fn validKey:(NSString *)key { + if (![self isValidKey:key]) { + @throw [[NSException alloc] + initWithName:@"InvalidKeyValidation" + reason:[NSString + stringWithFormat: + @"(%@) Must be a non-empty string and not " + @"contain '/' '.' '#' '$' '[' or ']'", + fn] + userInfo:nil]; + } +} + ++ (void)validateFrom:(NSString *)fn validURL:(FParsedUrl *)parsedUrl { + NSString *pathString = [parsedUrl.path description]; + [self validateFrom:fn validRootPathString:pathString]; +} + +#pragma mark - +#pragma mark Authentication validation + ++ (BOOL)stringNonempty:(NSString *)str { + return str != nil && ![str isKindOfClass:[NSNull class]] && str.length > 0; +} + ++ (void)validateToken:(NSString *)token { + if (![FValidation stringNonempty:token]) { + [NSException raise:NSInvalidArgumentException + format:@"Can't have empty string or nil for custom token"]; + } +} + +#pragma mark - +#pragma mark Handling authentication errors + +/** + * This function immediately calls the callback. + * It assumes that it is not on FirebaseWorker thread. + * It assumes it's on a user-controlled thread. + */ ++ (void)handleError:(NSError *)error + withUserCallback:(fbt_void_nserror_id)userCallback { + if (userCallback) { + userCallback(error, nil); + } +} + +/** + * This function immediately calls the callback. + * It assumes that it is not on FirebaseWorker thread. + * It assumes it's on a user-controlled thread. + */ ++ (void)handleError:(NSError *)error + withSuccessCallback:(fbt_void_nserror)userCallback { + if (userCallback) { + userCallback(error); + } +} + +#pragma mark - +#pragma mark Snapshot validation + ++ (BOOL)validateFrom:(NSString *)fn + isValidLeafValue:(id)value + withPath:(NSArray *)path { + if ([value isKindOfClass:[NSString class]]) { + // Try to avoid conversion to bytes if possible + NSString *theString = value; + if ([theString maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding] > + kFirebaseMaxLeafSize && + [theString lengthOfBytesUsingEncoding:NSUTF8StringEncoding] > + kFirebaseMaxLeafSize) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = + [[path subarrayWithRange:range] componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString + stringWithFormat:@"(%@) String exceeds max " + @"size of %u utf8 bytes: %@", + fn, (int)kFirebaseMaxLeafSize, + pathString] + userInfo:nil]; + } + return YES; + } + + else if ([value isKindOfClass:[NSNumber class]]) { + // Cannot store NaN, but otherwise can store NSNumbers. + if ([[NSDecimalNumber notANumber] isEqualToNumber:value]) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = + [[path subarrayWithRange:range] componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString + stringWithFormat: + @"(%@) Cannot store NaN at path: %@.", fn, + pathString] + userInfo:nil]; + } + return YES; + } + + else if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dval = value; + if (dval[kServerValueSubKey] != nil) { + if ([dval count] > 1) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = [[path subarrayWithRange:range] + componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString stringWithFormat: + @"(%@) Cannot store other keys " + @"with server value keys.%@.", + fn, pathString] + userInfo:nil]; + } + return YES; + } + return NO; + } + + else if (value == [NSNull null] || value == nil) { + // Null is valid type to store at leaf + return YES; + } + + return NO; +} + ++ (NSString *)parseAndValidateKey:(id)keyId + fromFunction:(NSString *)fn + path:(NSArray *)path { + if (![keyId isKindOfClass:[NSString class]]) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = + [[path subarrayWithRange:range] componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString + stringWithFormat:@"(%@) Non-string keys are not " + @"allowed in object at path: %@", + fn, pathString] + userInfo:nil]; + } + return (NSString *)keyId; +} + ++ (void)validateFrom:(NSString *)fn + validDictionaryKey:(id)keyId + withPath:(NSArray *)path { + NSString *key = [self parseAndValidateKey:keyId fromFunction:fn path:path]; + if (![key isEqualToString:kPayloadPriority] && + ![key isEqualToString:kPayloadValue] && + ![key isEqualToString:kServerValueSubKey] && + ![FValidation isValidKey:key]) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = + [[path subarrayWithRange:range] componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString stringWithFormat: + @"(%@) Invalid key in object at path: " + @"%@. Keys must be non-empty and cannot " + @"contain '/' '.' '#' '$' '[' or ']'", + fn, pathString] + userInfo:nil]; + } +} + ++ (void)validateFrom:(NSString *)fn + validUpdateDictionaryKey:(id)keyId + withValue:(id)value { + FPath *path = [FPath pathWithString:[self parseAndValidateKey:keyId + fromFunction:fn + path:@[]]]; + __block NSInteger keyNum = 0; + [path enumerateComponentsUsingBlock:^void(NSString *key, BOOL *stop) { + if ([key isEqualToString:kPayloadPriority] && + keyNum == [path length] - 1) { + [self validateFrom:fn isValidPriorityValue:value withPath:@[]]; + } else { + keyNum++; + + if (![FValidation isValidKey:key]) { + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString + stringWithFormat: + @"(%@) Invalid key in object. Keys must " + @"be non-empty and cannot contain '.' " + @"'#' '$' '[' or ']'", + fn] + userInfo:nil]; + } + } + }]; +} + ++ (void)validateFrom:(NSString *)fn + isValidPriorityValue:(id)value + withPath:(NSArray *)path { + [self validateFrom:fn + isValidPriorityValue:value + withPath:path + throwError:YES]; +} + +/** + * Returns YES if priority is valid. + */ ++ (BOOL)validatePriorityValue:value { + return [self validateFrom:nil + isValidPriorityValue:value + withPath:nil + throwError:NO]; +} + +/** + * Helper for validating priorities. If passed YES for throwError, it'll throw + * descriptive errors on validation problems. Else, it'll just return YES/NO. + */ ++ (BOOL)validateFrom:(NSString *)fn + isValidPriorityValue:(id)value + withPath:(NSArray *)path + throwError:(BOOL)throwError { + if ([value isKindOfClass:[NSNumber class]]) { + if ([[NSDecimalNumber notANumber] isEqualToNumber:value]) { + if (throwError) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = [[path subarrayWithRange:range] + componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString stringWithFormat: + @"(%@) Cannot store NaN as " + @"priority at path: %@.", + fn, pathString] + userInfo:nil]; + } else { + return NO; + } + } else if (value == (id)kCFBooleanFalse || + value == (id)kCFBooleanTrue) { + if (throwError) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = [[path subarrayWithRange:range] + componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString stringWithFormat: + @"(%@) Cannot store true/false " + @"as priority at path: %@.", + fn, pathString] + userInfo:nil]; + } else { + return NO; + } + } + } else if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dval = value; + if (dval[kServerValueSubKey] != nil) { + if ([dval count] > 1) { + if (throwError) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = [[path subarrayWithRange:range] + componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString + stringWithFormat: + @"(%@) Cannot store other keys " + @"with server value keys as " + @"priority at path: %@.", + fn, pathString] + userInfo:nil]; + } else { + return NO; + } + } + } else { + if (throwError) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = [[path subarrayWithRange:range] + componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString + stringWithFormat: + @"(%@) Cannot store an NSDictionary " + @"as priority at path: %@.", + fn, pathString] + userInfo:nil]; + } else { + return NO; + } + } + } else if ([value isKindOfClass:[NSArray class]]) { + if (throwError) { + NSRange range; + range.location = 0; + range.length = MIN(path.count, 50); + NSString *pathString = + [[path subarrayWithRange:range] componentsJoinedByString:@"."]; + @throw [[NSException alloc] + initWithName:@"InvalidFirebaseData" + reason:[NSString stringWithFormat: + @"(%@) Cannot store an NSArray as " + @"priority at path: %@.", + fn, pathString] + userInfo:nil]; + } else { + return NO; + } + } + + // It's valid! + return YES; +} +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleBoolBlock.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleBoolBlock.h new file mode 100644 index 00000000..f5c08597 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleBoolBlock.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTypedefs.h" +#import + +@interface FTupleBoolBlock : NSObject + +@property(nonatomic, readwrite) BOOL boolean; +@property(nonatomic, copy) fbt_void_void block; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleBoolBlock.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleBoolBlock.m new file mode 100644 index 00000000..c4cd8bf2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleBoolBlock.m @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleBoolBlock.h" + +@implementation FTupleBoolBlock + +@synthesize boolean; +@synthesize block; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleCallbackStatus.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleCallbackStatus.h new file mode 100644 index 00000000..bd8c4a96 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleCallbackStatus.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTypedefs_Private.h" +#import + +@interface FTupleCallbackStatus : NSObject +@property(nonatomic, copy) fbt_void_nsstring_nsstring block; +@property(nonatomic) NSString *status; +@property(nonatomic) NSString *errorReason; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleCallbackStatus.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleCallbackStatus.m new file mode 100644 index 00000000..05914bfd --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleCallbackStatus.m @@ -0,0 +1,22 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleCallbackStatus.h" + +@implementation FTupleCallbackStatus +@synthesize block; +@synthesize status; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleFirebase.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleFirebase.h new file mode 100644 index 00000000..5e41f9e3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleFirebase.h @@ -0,0 +1,26 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRDatabaseReference.h" +#import + +@interface FTupleFirebase : NSObject + +@property(nonatomic, strong) FIRDatabaseReference *one; +@property(nonatomic, strong) FIRDatabaseReference *two; +@property(nonatomic, strong) FIRDatabaseReference *three; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleFirebase.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleFirebase.m new file mode 100644 index 00000000..3956f8be --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleFirebase.m @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleFirebase.h" + +@implementation FTupleFirebase + +@synthesize one; +@synthesize two; +@synthesize three; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleNodePath.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleNodePath.h new file mode 100644 index 00000000..19b5217e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleNodePath.h @@ -0,0 +1,28 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import "FPath.h" +#import + +@interface FTupleNodePath : NSObject + +@property(nonatomic, strong) FPath *path; +@property(nonatomic, strong) id node; + +- (id)initWithNode:(id)aNode andPath:(FPath *)aPath; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleNodePath.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleNodePath.m new file mode 100644 index 00000000..620ae766 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleNodePath.m @@ -0,0 +1,33 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleNodePath.h" + +@implementation FTupleNodePath + +@synthesize path; +@synthesize node; + +- (id)initWithNode:(id)aNode andPath:(FPath *)aPath { + self = [super init]; + if (self) { + self.path = aPath; + self.node = aNode; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjectNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjectNode.h new file mode 100644 index 00000000..1717a220 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjectNode.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import + +@interface FTupleObjectNode : NSObject + +- (id)initWithObject:(id)aObj andNode:(id)aNode; + +@property(nonatomic, strong) id node; +@property(nonatomic, strong) id obj; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjectNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjectNode.m new file mode 100644 index 00000000..4c533b02 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjectNode.m @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import "FTupleObjectNode.h" + +@implementation FTupleObjectNode + +@synthesize obj; +@synthesize node; + +- (id)initWithObject:(id)aObj andNode:(id)aNode { + self = [super init]; + if (self) { + self.obj = aObj; + self.node = aNode; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjects.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjects.h new file mode 100644 index 00000000..05b31418 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjects.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FTupleObjects : NSObject + +@property(nonatomic, strong) id objA; +@property(nonatomic, strong) id objB; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjects.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjects.m new file mode 100644 index 00000000..a9e4c886 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleObjects.m @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleObjects.h" + +@implementation FTupleObjects + +@synthesize objA; +@synthesize objB; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleOnDisconnect.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleOnDisconnect.h new file mode 100644 index 00000000..e68ab71b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleOnDisconnect.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTypedefs_Private.h" +#import + +@interface FTupleOnDisconnect : NSObject + +@property(strong, nonatomic) NSString *pathString; +@property(strong, nonatomic) NSString *action; +@property(strong, nonatomic) id data; +@property(strong, nonatomic) fbt_void_nsstring_nsstring onComplete; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleOnDisconnect.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleOnDisconnect.m new file mode 100644 index 00000000..bd458220 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleOnDisconnect.m @@ -0,0 +1,26 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleOnDisconnect.h" + +@implementation FTupleOnDisconnect + +@synthesize pathString; +@synthesize action; +@synthesize data; +@synthesize onComplete; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTuplePathValue.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTuplePathValue.h new file mode 100644 index 00000000..b0a515ce --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTuplePathValue.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FPath; + +@interface FTuplePathValue : NSObject +@property(nonatomic, strong, readonly) FPath *path; +@property(nonatomic, strong, readonly) id value; +- (id)initWithPath:(FPath *)aPath value:(id)aValue; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTuplePathValue.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTuplePathValue.m new file mode 100644 index 00000000..91de8834 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTuplePathValue.m @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTuplePathValue.h" +#import "FPath.h" + +@interface FTuplePathValue () +@property(nonatomic, strong, readwrite) id value; +@property(nonatomic, strong, readwrite) FPath *path; +@end + +@implementation FTuplePathValue +@synthesize path; +@synthesize value; + +- (id)initWithPath:(FPath *)aPath value:(id)aValue { + self = [super init]; + if (self) { + self.value = aValue; + self.path = aPath; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleRemovedQueriesEvents.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleRemovedQueriesEvents.h new file mode 100644 index 00000000..7269c2f1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleRemovedQueriesEvents.h @@ -0,0 +1,30 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface FTupleRemovedQueriesEvents : NSObject +/** + * `FIRDatabaseQuery`s removed with [SyncPoint removeEventRegistration:] + */ +@property(nonatomic, strong, readonly) NSArray *removedQueries; +/** + * cancel events as FEvent + */ +@property(nonatomic, strong, readonly) NSArray *cancelEvents; + +- (id)initWithRemovedQueries:(NSArray *)removed cancelEvents:(NSArray *)events; +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleRemovedQueriesEvents.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleRemovedQueriesEvents.m new file mode 100644 index 00000000..324cfcb2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleRemovedQueriesEvents.m @@ -0,0 +1,37 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleRemovedQueriesEvents.h" + +@interface FTupleRemovedQueriesEvents () +@property(nonatomic, strong, readwrite) NSArray *removedQueries; +@property(nonatomic, strong, readwrite) NSArray *cancelEvents; +@end + +@implementation FTupleRemovedQueriesEvents +@synthesize removedQueries; +@synthesize cancelEvents; + +- (id)initWithRemovedQueries:(NSArray *)removed cancelEvents:(NSArray *)events { + self = [super init]; + if (self) { + self.removedQueries = removed; + self.cancelEvents = events; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleSetIdPath.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleSetIdPath.h new file mode 100644 index 00000000..337f8d61 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleSetIdPath.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPath.h" +#import + +@interface FTupleSetIdPath : NSObject + +- (id)initWithSetId:(NSNumber *)aSetId andPath:(FPath *)aPath; + +@property(strong, nonatomic) NSNumber *setId; +@property(strong, nonatomic) FPath *path; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleSetIdPath.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleSetIdPath.m new file mode 100644 index 00000000..2763c83d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleSetIdPath.m @@ -0,0 +1,33 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleSetIdPath.h" + +@implementation FTupleSetIdPath + +@synthesize path; +@synthesize setId; + +- (id)initWithSetId:(NSNumber *)aSetId andPath:(FPath *)aPath { + self = [super init]; + if (self) { + self.setId = aSetId; + self.path = aPath; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleStringNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleStringNode.h new file mode 100644 index 00000000..0e3d7fa4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleStringNode.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FNode.h" +#import + +@interface FTupleStringNode : NSObject + +- (id)initWithString:(NSString *)aString andNode:(id)aNode; + +@property(nonatomic, strong) id node; +@property(nonatomic, strong) NSString *string; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleStringNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleStringNode.m new file mode 100644 index 00000000..d820ef80 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleStringNode.m @@ -0,0 +1,33 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleStringNode.h" + +@implementation FTupleStringNode + +@synthesize string; +@synthesize node; + +- (id)initWithString:(NSString *)aString andNode:(id)aNode { + self = [super init]; + if (self) { + self.string = aString; + self.node = aNode; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTSN.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTSN.h new file mode 100644 index 00000000..b1052da3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTSN.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleStringNode.h" +#import + +@interface FTupleTSN : NSObject + +@property(nonatomic, strong) FTupleStringNode *from; +@property(nonatomic, strong) FTupleStringNode *to; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTSN.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTSN.m new file mode 100644 index 00000000..348c3197 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTSN.m @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleTSN.h" + +@implementation FTupleTSN + +@synthesize from; +@synthesize to; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTransaction.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTransaction.h new file mode 100644 index 00000000..82f44959 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTransaction.h @@ -0,0 +1,75 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FPath.h" +#import "FTypedefs.h" +#import "FTypedefs_Private.h" +#import + +@interface FTupleTransaction : NSObject + +@property(nonatomic, strong) FPath *path; +@property(nonatomic, copy) fbt_transactionresult_mutabledata update; +@property(nonatomic, copy) fbt_void_nserror_bool_datasnapshot onComplete; +@property(nonatomic) FTransactionStatus status; + +/** + * Used when combining transaction at different locations to figure out which + * one goes first. + */ +@property(nonatomic, strong) NSNumber *order; +/** + * Whether to raise local events for this transaction + */ +@property(nonatomic) BOOL applyLocally; + +/** + * Count how many times we've retried the transaction + */ +@property(nonatomic) int retryCount; + +/** + * Function to call to clean up our listener + */ +@property(nonatomic, copy) fbt_void_void unwatcher; + +/** + * Stores why a transaction was aborted + */ +@property(nonatomic, strong, readonly) NSString *abortStatus; +@property(nonatomic, strong, readonly) NSString *abortReason; + +- (void)setAbortStatus:(NSString *)abortStatus reason:(NSString *)reason; +- (NSError *)abortError; + +@property(nonatomic, strong) NSNumber *currentWriteId; + +/** + * Stores the input snapshot, before the update + */ +@property(nonatomic, strong) id currentInputSnapshot; + +/** + * Stores the unresolved (for server values) output snapshot, after the update + */ +@property(nonatomic, strong) id currentOutputSnapshotRaw; + +/** + * Stores the resolved (for server values) output snapshot, after the update + */ +@property(nonatomic, strong) id currentOutputSnapshotResolved; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTransaction.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTransaction.m new file mode 100644 index 00000000..68977efc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleTransaction.m @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleTransaction.h" +#import "FUtilities.h" + +@interface FTupleTransaction () + +@property(nonatomic, strong) NSString *abortStatus; +@property(nonatomic, strong) NSString *abortReason; + +@end + +@implementation FTupleTransaction + +- (void)setAbortStatus:(NSString *)abortStatus reason:(NSString *)reason { + self.abortStatus = abortStatus; + self.abortReason = reason; +} + +- (NSError *)abortError { + return (self.abortStatus != nil) + ? [FUtilities errorForStatus:self.abortStatus + andReason:self.abortReason] + : nil; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleUserCallback.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleUserCallback.h new file mode 100644 index 00000000..b94eef63 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleUserCallback.h @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FQueryParams.h" +#import "FTypedefs.h" +#import + +@interface FTupleUserCallback : NSObject + +- (id)initWithHandle:(NSUInteger)handle; + +@property(nonatomic, copy) + fbt_void_datasnapshot_nsstring datasnapshotPrevnameCallback; +@property(nonatomic, copy) fbt_void_datasnapshot datasnapshotCallback; +@property(nonatomic, copy) fbt_void_nserror cancelCallback; +@property(nonatomic, copy) FQueryParams *queryParams; +@property(nonatomic) NSUInteger handle; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleUserCallback.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleUserCallback.m new file mode 100644 index 00000000..ba5861fb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/Utilities/Tuples/FTupleUserCallback.m @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FTupleUserCallback.h" + +@implementation FTupleUserCallback + +@synthesize datasnapshotCallback; +@synthesize datasnapshotPrevnameCallback; +@synthesize cancelCallback; +@synthesize queryParams; +@synthesize handle; + +- (id)initWithHandle:(NSUInteger)theHandle { + self = [super init]; + if (self) { + self.handle = theHandle; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FArraySortedDictionary.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FArraySortedDictionary.h new file mode 100644 index 00000000..3ab74762 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FArraySortedDictionary.h @@ -0,0 +1,21 @@ +#import +#import "FImmutableSortedDictionary.h" + +/** + * This is an array backed implementation of FImmutableSortedDictionary. It uses arrays and linear lookups to achieve + * good memory efficiency while maintaining good performance for small collections. It also uses less allocations than + * a comparable red black tree. To avoid degrading performance with increasing collection size it will automatically + * convert to a FTreeSortedDictionary after an insert call above a certain threshold. + */ +@interface FArraySortedDictionary : FImmutableSortedDictionary + ++ (FArraySortedDictionary *)fromDictionary:(NSDictionary *)dictionary withComparator:(NSComparator)comparator; + +- (id)initWithComparator:(NSComparator)comparator; + +#pragma mark - +#pragma mark Properties + +@property (nonatomic, copy, readonly) NSComparator comparator; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FArraySortedDictionary.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FArraySortedDictionary.m new file mode 100644 index 00000000..15d2d8bd --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FArraySortedDictionary.m @@ -0,0 +1,266 @@ +#import "FArraySortedDictionary.h" +#import "FTreeSortedDictionary.h" + +@interface FArraySortedDictionaryEnumerator : NSEnumerator + +- (id)initWithKeys:(NSArray *)keys startPos:(NSInteger)pos isReverse:(BOOL)reverse; +- (id)nextObject; + +@property (nonatomic) NSInteger pos; +@property (nonatomic) BOOL reverse; +@property (nonatomic, strong) NSArray *keys; + +@end + +@implementation FArraySortedDictionaryEnumerator + +- (id)initWithKeys:(NSArray *)keys startPos:(NSInteger)pos isReverse:(BOOL)reverse +{ + self = [super init]; + if (self != nil) { + self->_pos = pos; + self->_reverse = reverse; + self->_keys = keys; + } + return self; +} + +- (id)nextObject +{ + NSInteger pos = self->_pos; + if (pos >= 0 && pos < self.keys.count) { + if (self.reverse) { + self->_pos--; + } else { + self->_pos++; + } + return self.keys[pos]; + } else { + return nil; + } +} + +@end + +@interface FArraySortedDictionary () + +- (id)initWithComparator:(NSComparator)comparator; + +@property (nonatomic, copy, readwrite) NSComparator comparator; +@property (nonatomic, strong) NSArray *keys; +@property (nonatomic, strong) NSArray *values; + +@end + +@implementation FArraySortedDictionary + ++ (FArraySortedDictionary *)fromDictionary:(NSDictionary *)dictionary withComparator:(NSComparator)comparator +{ + NSMutableArray *keys = [NSMutableArray arrayWithCapacity:dictionary.count]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + [keys addObject:key]; + }]; + [keys sortUsingComparator:comparator]; + + [keys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + if (idx > 0) { + if (comparator(keys[idx - 1], obj) != NSOrderedAscending) { + [NSException raise:NSInvalidArgumentException format:@"Can't create FImmutableSortedDictionary with keys with same ordering!"]; + } + } + }]; + + NSMutableArray *values = [NSMutableArray arrayWithCapacity:keys.count]; + NSInteger pos = 0; + for (id key in keys) { + values[pos++] = dictionary[key]; + } + NSAssert(values.count == keys.count, @"We added as many keys as values"); + return [[FArraySortedDictionary alloc] initWithComparator:comparator keys:keys values:values]; +} + +- (id)initWithComparator:(NSComparator)comparator +{ + self = [super init]; + if (self != nil) { + self->_comparator = comparator; + self->_keys = [NSArray array]; + self->_values = [NSArray array]; + } + return self; +} + +- (id)initWithComparator:(NSComparator)comparator keys:(NSArray *)keys values:(NSArray *)values +{ + self = [super init]; + if (self != nil) { + self->_comparator = comparator; + self->_keys = keys; + self->_values = values; + } + return self; +} + +- (NSInteger) findInsertPositionForKey:(id)key +{ + NSInteger newPos = 0; + while (newPos < self.keys.count && self.comparator(self.keys[newPos], key) < NSOrderedSame) { + newPos++; + } + return newPos; +} + +- (NSInteger) findKey:(id)key +{ + if (key == nil) { + return NSNotFound; + } + for (NSInteger pos = 0; pos < self.keys.count; pos++) { + NSComparisonResult result = self.comparator(key, self.keys[pos]); + if (result == NSOrderedSame) { + return pos; + } else if (result == NSOrderedAscending) { + return NSNotFound; + } + } + return NSNotFound; +} + +- (FImmutableSortedDictionary *) insertKey:(id)key withValue:(id)value +{ + NSInteger pos = [self findKey:key]; + + if (pos == NSNotFound) { + /* + * If we're above the threshold we want to convert it to a tree backed implementation to not have + * degrading performance + */ + if (self.count >= SORTED_DICTIONARY_ARRAY_TO_RB_TREE_SIZE_THRESHOLD) { + NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:self.count]; + for (NSInteger i = 0; i < self.keys.count; i++) { + dict[self.keys[i]] = self.values[i]; + } + dict[key] = value; + return [FTreeSortedDictionary fromDictionary:dict withComparator:self.comparator]; + } else { + NSMutableArray *newKeys = [NSMutableArray arrayWithArray:self.keys]; + NSMutableArray *newValues = [NSMutableArray arrayWithArray:self.values]; + NSInteger newPos = [self findInsertPositionForKey:key]; + [newKeys insertObject:key atIndex:newPos]; + [newValues insertObject:value atIndex:newPos]; + return [[FArraySortedDictionary alloc] initWithComparator:self.comparator keys:newKeys values:newValues]; + } + } else { + NSMutableArray *newKeys = [NSMutableArray arrayWithArray:self.keys]; + NSMutableArray *newValues = [NSMutableArray arrayWithArray:self.values]; + newKeys[pos] = key; + newValues[pos] = value; + return [[FArraySortedDictionary alloc] initWithComparator:self.comparator keys:newKeys values:newValues]; + } +} + +- (FImmutableSortedDictionary *) removeKey:(id)key +{ + NSInteger pos = [self findKey:key]; + if (pos == NSNotFound) { + return self; + } else { + NSMutableArray *newKeys = [NSMutableArray arrayWithArray:self.keys]; + NSMutableArray *newValues = [NSMutableArray arrayWithArray:self.values]; + [newKeys removeObjectAtIndex:pos]; + [newValues removeObjectAtIndex:pos]; + return [[FArraySortedDictionary alloc] initWithComparator:self.comparator keys:newKeys values:newValues]; + } +} + +- (id) get:(id)key +{ + NSInteger pos = [self findKey:key]; + if (pos == NSNotFound) { + return nil; + } else { + return self.values[pos]; + } +} + +- (id) getPredecessorKey:(id) key { + NSInteger pos = [self findKey:key]; + if (pos == NSNotFound) { + [NSException raise:NSInternalInconsistencyException format:@"Can't get predecessor key for non-existent key"]; + return nil; + } else if (pos == 0) { + return nil; + } else { + return self.keys[pos - 1]; + } +} + +- (BOOL) isEmpty { + return self.keys.count == 0; +} + +- (int) count +{ + return (int)self.keys.count; +} + +- (id) minKey +{ + return [self.keys firstObject]; +} + +- (id) maxKey +{ + return [self.keys lastObject]; +} + +- (void) enumerateKeysAndObjectsUsingBlock:(void (^)(id, id, BOOL *))block +{ + [self enumerateKeysAndObjectsReverse:NO usingBlock:block]; +} + +- (void) enumerateKeysAndObjectsReverse:(BOOL)reverse usingBlock:(void (^)(id, id, BOOL *))block +{ + if (reverse) { + BOOL stop = NO; + for (NSInteger i = self.keys.count - 1; i >= 0; i--) { + block(self.keys[i], self.values[i], &stop); + if (stop) return; + } + } else { + BOOL stop = NO; + for (NSInteger i = 0; i < self.keys.count; i++) { + block(self.keys[i], self.values[i], &stop); + if (stop) return; + } + } +} + +- (BOOL) contains:(id)key { + return [self findKey:key] != NSNotFound; +} + +- (NSEnumerator *) keyEnumerator { + return [self.keys objectEnumerator]; +} + +- (NSEnumerator *) keyEnumeratorFrom:(id)startKey { + NSInteger startPos = [self findInsertPositionForKey:startKey]; + return [[FArraySortedDictionaryEnumerator alloc] initWithKeys:self.keys startPos:startPos isReverse:NO]; +} + +- (NSEnumerator *) reverseKeyEnumerator { + return [self.keys reverseObjectEnumerator]; +} + +- (NSEnumerator *) reverseKeyEnumeratorFrom:(id)startKey { + NSInteger startPos = [self findInsertPositionForKey:startKey]; + // if there's no exact match, findKeyOrInsertPosition will return the index *after* the closest match, but + // since this is a reverse iterator, we want to start just *before* the closest match. + if (startPos >= self.keys.count || self.comparator(self.keys[startPos], startKey) != NSOrderedSame) { + startPos -= 1; + } + return [[FArraySortedDictionaryEnumerator alloc] initWithKeys:self.keys startPos:startPos isReverse:YES]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedDictionary.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedDictionary.h new file mode 100644 index 00000000..d6687d86 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedDictionary.h @@ -0,0 +1,54 @@ +/** + * @fileoverview Implementation of an immutable SortedMap using a Left-leaning + * Red-Black Tree, adapted from the implementation in Mugs + * (http://mads379.github.com/mugs/) by Mads Hartmann Jensen + * (mads379@gmail.com). + * + * Original paper on Left-leaning Red-Black Trees: + * http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf + * + * Invariant 1: No red node has a red child + * Invariant 2: Every leaf path has the same number of black nodes + * Invariant 3: Only the left child can be red (left leaning) + */ + +#import + +/** + * The size threshold where we use a tree backed sorted map instead of an array backed sorted map. + * This is a more or less arbitrary chosen value, that was chosen to be large enough to fit most of object kind + * of Firebase data, but small enough to not notice degradation in performance for inserting and lookups. + * Feel free to empirically determine this constant, but don't expect much gain in real world performance. + */ +#define SORTED_DICTIONARY_ARRAY_TO_RB_TREE_SIZE_THRESHOLD 25 + +@interface FImmutableSortedDictionary : NSObject + ++ (FImmutableSortedDictionary *)dictionaryWithComparator:(NSComparator)comparator; ++ (FImmutableSortedDictionary *)fromDictionary:(NSDictionary *)dictionary withComparator:(NSComparator)comparator; + +- (FImmutableSortedDictionary *) insertKey:(id)aKey withValue:(id)aValue; +- (FImmutableSortedDictionary *) removeKey:(id)aKey; +- (id) get:(id) key; +- (id) getPredecessorKey:(id) key; +- (BOOL) isEmpty; +- (int) count; +- (id) minKey; +- (id) maxKey; +- (void) enumerateKeysAndObjectsUsingBlock:(void(^)(id key, id value, BOOL *stop))block; +- (void) enumerateKeysAndObjectsReverse:(BOOL)reverse usingBlock:(void(^)(id key, id value, BOOL *stop))block; +- (BOOL) contains:(id)key; +- (NSEnumerator *) keyEnumerator; +- (NSEnumerator *) keyEnumeratorFrom:(id)startKey; +- (NSEnumerator *) reverseKeyEnumerator; +- (NSEnumerator *) reverseKeyEnumeratorFrom:(id)startKey; + +#pragma mark - +#pragma mark Methods similar to NSMutableDictionary + +- (FImmutableSortedDictionary *) setObject:(id)anObject forKey:(id)aKey; +- (id) objectForKey:(id)key; +- (FImmutableSortedDictionary *) removeObjectForKey:(id)aKey; + +@end + diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedDictionary.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedDictionary.m new file mode 100644 index 00000000..659c63b1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedDictionary.m @@ -0,0 +1,142 @@ +#import "FImmutableSortedDictionary.h" +#import "FArraySortedDictionary.h" +#import "FTreeSortedDictionary.h" + +#define THROW_ABSTRACT_METHOD_EXCEPTION(sel) do { \ + @throw [NSException exceptionWithName:NSInternalInconsistencyException \ + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(sel)] \ + userInfo:nil]; \ +} while(0) + +@implementation FImmutableSortedDictionary + ++ (FImmutableSortedDictionary *)dictionaryWithComparator:(NSComparator)comparator +{ + return [[FArraySortedDictionary alloc] initWithComparator:comparator]; +} + ++ (FImmutableSortedDictionary *)fromDictionary:(NSDictionary *)dictionary withComparator:(NSComparator)comparator +{ + if (dictionary.count <= SORTED_DICTIONARY_ARRAY_TO_RB_TREE_SIZE_THRESHOLD) { + return [FArraySortedDictionary fromDictionary:dictionary withComparator:comparator]; + } else { + return [FTreeSortedDictionary fromDictionary:dictionary withComparator:comparator]; + } +} + +- (FImmutableSortedDictionary *) insertKey:(id)aKey withValue:(id)aValue { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(insertKey:withValue:)); +} + +- (FImmutableSortedDictionary *) removeKey:(id)aKey { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(removeKey:)); +} + +- (id) get:(id) key { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(get:)); +} + +- (id) getPredecessorKey:(id) key { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(getPredecessorKey:)); +} + +- (BOOL) isEmpty { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(isEmpty)); +} + +- (int) count { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector((count))); +} + +- (id) minKey { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(minKey)); +} + +- (id) maxKey { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(maxKey)); +} + +- (void) enumerateKeysAndObjectsUsingBlock:(void (^)(id, id, BOOL *))block { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(enumerateKeysAndObjectsUsingBlock:)); +} + +- (void) enumerateKeysAndObjectsReverse:(BOOL)reverse usingBlock:(void (^)(id, id, BOOL *))block { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(enumerateKeysAndObjectsReverse:usingBlock:)); +} + +- (BOOL) contains:(id)key { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(contains:)); +} + +- (NSEnumerator *) keyEnumerator { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(keyEnumerator)); +} + +- (NSEnumerator *) keyEnumeratorFrom:(id)startKey { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(keyEnumeratorFrom:)); +} + +- (NSEnumerator *) reverseKeyEnumerator { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(reverseKeyEnumerator)); +} + +- (NSEnumerator *) reverseKeyEnumeratorFrom:(id)startKey { + THROW_ABSTRACT_METHOD_EXCEPTION(@selector(reverseKeyEnumeratorFrom:)); +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[FImmutableSortedDictionary class]]) { + return NO; + } + FImmutableSortedDictionary *other = (FImmutableSortedDictionary *)object; + if (self.count != other.count) { + return NO; + } + __block BOOL isEqual = YES; + [self enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { + id otherValue = [other objectForKey:key]; + isEqual = isEqual && (value == otherValue || [value isEqual:otherValue]); + *stop = !isEqual; + }]; + return isEqual; +} + +- (NSUInteger)hash { + __block NSUInteger hash = 0; + [self enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { + hash = (hash * 31 + [key hash]) * 17 + [value hash]; + }]; + return hash; +} + +- (NSString *)description { + NSMutableString *str = [[NSMutableString alloc] init]; + __block BOOL first = YES; + [str appendString:@"{ "]; + [self enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { + if (!first) { + [str appendString:@", "]; + } + first = NO; + [str appendString:[NSString stringWithFormat:@"%@: %@", key, value]]; + }]; + [str appendString:@" }"]; + return str; +} + +#pragma mark - +#pragma mark Methods similar to NSMutableDictionary + +- (FImmutableSortedDictionary *) setObject:(__unsafe_unretained id)anObject forKey:(__unsafe_unretained id)aKey { + return [self insertKey:aKey withValue:anObject]; +} + +- (FImmutableSortedDictionary *) removeObjectForKey:(__unsafe_unretained id)aKey { + return [self removeKey:aKey]; +} + +- (id) objectForKey:(__unsafe_unretained id)key { + return [self get:key]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedSet.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedSet.h new file mode 100644 index 00000000..ac15c2f0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedSet.h @@ -0,0 +1,22 @@ +#import + +@interface FImmutableSortedSet : NSObject + ++ (FImmutableSortedSet *)setWithKeysFromDictionary:(NSDictionary *)array comparator:(NSComparator)comparator; + +- (BOOL)containsObject:(id)object; +- (FImmutableSortedSet *)addObject:(id)object; +- (FImmutableSortedSet *)removeObject:(id)object; +- (id)firstObject; +- (id)lastObject; +- (NSUInteger)count; +- (BOOL)isEmpty; + +- (id)predecessorEntry:(id)entry; + +- (void)enumerateObjectsUsingBlock:(void (^)(id obj, BOOL *stop))block; +- (void)enumerateObjectsReverse:(BOOL)reverse usingBlock:(void (^)(id obj, BOOL *stop))block; + +- (NSEnumerator *)objectEnumerator; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedSet.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedSet.m new file mode 100644 index 00000000..1953af1a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FImmutableSortedSet.m @@ -0,0 +1,115 @@ +#import "FImmutableSortedSet.h" +#import "FImmutableSortedDictionary.h" + +@interface FImmutableSortedSet () + +@property (nonatomic, strong) FImmutableSortedDictionary *dictionary; + +@end + +@implementation FImmutableSortedSet + ++ (FImmutableSortedSet *)setWithKeysFromDictionary:(NSDictionary *)dictionary comparator:(NSComparator)comparator +{ + FImmutableSortedDictionary *setDict = [FImmutableSortedDictionary fromDictionary:dictionary withComparator:comparator]; + return [[FImmutableSortedSet alloc] initWithDictionary:setDict]; +} + +- (id)initWithDictionary:(FImmutableSortedDictionary *)dictionary +{ + self = [super init]; + if (self != nil) { + self->_dictionary = dictionary; + } + return self; +} + +- (BOOL)contains:(id)object +{ + return [self.dictionary contains:object]; +} + +- (FImmutableSortedSet *)addObject:(id)object +{ + FImmutableSortedDictionary *newDictionary = [self.dictionary insertKey:object withValue:[NSNull null]]; + if (newDictionary != self.dictionary) { + return [[FImmutableSortedSet alloc] initWithDictionary:newDictionary]; + } else { + return self; + } +} + +- (FImmutableSortedSet *)removeObject:(id)object +{ + FImmutableSortedDictionary *newDictionary = [self.dictionary removeObjectForKey:object]; + if (newDictionary != self.dictionary) { + return [[FImmutableSortedSet alloc] initWithDictionary:newDictionary]; + } else { + return self; + } +} + +- (BOOL)containsObject:(id)object +{ + return [self.dictionary contains:object]; +} + +- (id)firstObject +{ + return [self.dictionary minKey]; +} + +- (id)lastObject +{ + return [self.dictionary maxKey]; +} + +- (id)predecessorEntry:(id)entry +{ + return [self.dictionary getPredecessorKey:entry]; +} + +- (NSUInteger)count +{ + return [self.dictionary count]; +} + +- (BOOL)isEmpty +{ + return [self.dictionary isEmpty]; +} + +- (void)enumerateObjectsUsingBlock:(void (^)(id, BOOL *))block +{ + [self enumerateObjectsReverse:NO usingBlock:block]; +} + +- (void)enumerateObjectsReverse:(BOOL)reverse usingBlock:(void (^)(id, BOOL *))block +{ + [self.dictionary enumerateKeysAndObjectsReverse:reverse usingBlock:^(id key, id value, BOOL *stop) { + block(key, stop); + }]; +} + +- (NSEnumerator *)objectEnumerator +{ + return [self.dictionary keyEnumerator]; +} + +- (NSString *)description +{ + NSMutableString *str = [[NSMutableString alloc] init]; + __block BOOL first = YES; + [str appendString:@"FImmutableSortedSet ( "]; + [self enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { + if (!first) { + [str appendString:@", "]; + } + first = NO; + [str appendString:[NSString stringWithFormat:@"%@", obj]]; + }]; + [str appendString:@" )"]; + return str; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBEmptyNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBEmptyNode.h new file mode 100644 index 00000000..833f2a55 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBEmptyNode.h @@ -0,0 +1,27 @@ +#import +#import "FLLRBNode.h" + +@interface FLLRBEmptyNode : NSObject + ++ (id)emptyNode; + +- (id)copyWith:(id) aKey withValue:(id) aValue withColor:(FLLRBColor*) aColor withLeft:(id)aLeft withRight:(id)aRight; +- (id) insertKey:(id) aKey forValue:(id)aValue withComparator:(NSComparator)aComparator; +- (id) remove:(id) aKey withComparator:(NSComparator)aComparator; +- (int) count; +- (BOOL) isEmpty; +- (BOOL) inorderTraversal:(BOOL (^)(id key, id value))action; +- (BOOL) reverseTraversal:(BOOL (^)(id key, id value))action; +- (id) min; +- (id) minKey; +- (id) maxKey; +- (BOOL) isRed; +- (int) check; + +@property (nonatomic, strong) id key; +@property (nonatomic, strong) id value; +@property (nonatomic, strong) FLLRBColor* color; +@property (nonatomic, strong) id left; +@property (nonatomic, strong) id right; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBEmptyNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBEmptyNode.m new file mode 100644 index 00000000..3ca6f062 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBEmptyNode.m @@ -0,0 +1,72 @@ +#import "FLLRBEmptyNode.h" +#import "FLLRBValueNode.h" + +@implementation FLLRBEmptyNode + +@synthesize key, value, color, left, right; + +- (NSString *) description { + return [NSString stringWithFormat:@"[key=%@ val=%@ color=%@]", key, value, + (color != nil ? @"true" : @"false")]; +} + ++ (id)emptyNode +{ + static dispatch_once_t pred = 0; + __strong static id _sharedObject = nil; + dispatch_once(&pred, ^{ + _sharedObject = [[self alloc] init]; // or some other init method + }); + return _sharedObject; +} + +- (id)copyWith:(id) aKey withValue:(id) aValue withColor:(FLLRBColor*) aColor withLeft:(id)aLeft withRight:(id)aRight { + return self; +} + +- (id) insertKey:(id) aKey forValue:(id)aValue withComparator:(NSComparator)aComparator { + FLLRBValueNode* result = [[FLLRBValueNode alloc] initWithKey:aKey withValue:aValue withColor:nil withLeft:nil withRight:nil]; + return result; +} + +- (id) remove:(id) key withComparator:(NSComparator)aComparator { + return self; +} + +- (int) count { + return 0; +} + +- (BOOL) isEmpty { + return YES; +} + +- (BOOL) inorderTraversal:(BOOL (^)(id key, id value))action { + return NO; +} + +- (BOOL) reverseTraversal:(BOOL (^)(id key, id value))action { + return NO; +} + +- (id) min { + return self; +} + +- (id) minKey { + return nil; +} + +- (id) maxKey { + return nil; +} + +- (BOOL) isRed { + return NO; +} + +- (int) check { + return 0; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBNode.h new file mode 100644 index 00000000..09b234c6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBNode.h @@ -0,0 +1,29 @@ +#import + +#define RED @true +#define BLACK @false + +typedef NSNumber FLLRBColor; + +@protocol FLLRBNode + +- (id)copyWith:(id) aKey withValue:(id) aValue withColor:(FLLRBColor*) aColor withLeft:(id)aLeft withRight:(id)aRight; +- (id) insertKey:(id) aKey forValue:(id)aValue withComparator:(NSComparator)aComparator; +- (id) remove:(id) key withComparator:(NSComparator)aComparator; +- (int) count; +- (BOOL) isEmpty; +- (BOOL) inorderTraversal:(BOOL (^)(id key, id value))action; +- (BOOL) reverseTraversal:(BOOL (^)(id key, id value))action; +- (id) min; +- (id) minKey; +- (id) maxKey; +- (BOOL) isRed; +- (int) check; + +@property (nonatomic, strong) id key; +@property (nonatomic, strong) id value; +@property (nonatomic, strong) FLLRBColor* color; +@property (nonatomic, strong) id left; +@property (nonatomic, strong) id right; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBValueNode.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBValueNode.h new file mode 100644 index 00000000..50438bb3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBValueNode.h @@ -0,0 +1,29 @@ +#import +#import "FLLRBNode.h" + +@interface FLLRBValueNode : NSObject + + +- (id)initWithKey:(id) key withValue:(id) value withColor:(FLLRBColor*) color withLeft:(id)left withRight:(id)right; +- (id)copyWith:(id) aKey withValue:(id) aValue withColor:(FLLRBColor*) aColor withLeft:(id)aLeft withRight:(id)aRight; +- (id) insertKey:(id) aKey forValue:(id)aValue withComparator:(NSComparator)aComparator; +- (id) remove:(id) aKey withComparator:(NSComparator)aComparator; +- (int) count; +- (BOOL) isEmpty; +- (BOOL) inorderTraversal:(BOOL (^)(id key, id value))action; +- (BOOL) reverseTraversal:(BOOL (^)(id key, id value))action; +- (id) min; +- (id) minKey; +- (id) maxKey; +- (BOOL) isRed; +- (int) check; + +- (BOOL) checkMaxDepth; + +@property (nonatomic, strong) id key; +@property (nonatomic, strong) id value; +@property (nonatomic, strong) FLLRBColor* color; +@property (nonatomic, strong) id left; +@property (nonatomic, strong) id right; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBValueNode.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBValueNode.m new file mode 100644 index 00000000..831b97fc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FLLRBValueNode.m @@ -0,0 +1,230 @@ +#import "FLLRBValueNode.h" +#import "FLLRBEmptyNode.h" + +@implementation FLLRBValueNode + +@synthesize key, value, color, left, right; + +- (NSString *) description { + return [NSString stringWithFormat:@"[key=%@ val=%@ color=%@]", key, value, + (color != nil ? @"true" : @"false")]; +} + +- (id)initWithKey:(__unsafe_unretained id) aKey withValue:(__unsafe_unretained id) aValue withColor:(__unsafe_unretained FLLRBColor*) aColor withLeft:(__unsafe_unretained id)aLeft withRight:(__unsafe_unretained id)aRight +{ + self = [super init]; + if (self) { + self.key = aKey; + self.value = aValue; + self.color = aColor != nil ? aColor : RED; + self.left = aLeft != nil ? aLeft : [FLLRBEmptyNode emptyNode]; + self.right = aRight != nil ? aRight : [FLLRBEmptyNode emptyNode]; + } + return self; +} + +- (id)copyWith:(__unsafe_unretained id) aKey withValue:(__unsafe_unretained id) aValue withColor:(__unsafe_unretained FLLRBColor*) aColor withLeft:(__unsafe_unretained id)aLeft withRight:(__unsafe_unretained id)aRight { + return [[FLLRBValueNode alloc] initWithKey:(aKey != nil) ? aKey : self.key + withValue:(aValue != nil) ? aValue : self.value + withColor:(aColor != nil) ? aColor : self.color + withLeft:(aLeft != nil) ? aLeft : self.left + withRight:(aRight != nil) ? aRight : self.right]; +} + +- (int) count { + return [self.left count] + 1 + [self.right count]; +} + +- (BOOL) isEmpty { + return NO; +} + +/** +* Early terminates if aciton returns YES. +* @return The first truthy value returned by action, or the last falsey value returned by action. +*/ +- (BOOL) inorderTraversal:(BOOL (^)(id key, id value))action { + return [self.left inorderTraversal:action] || + action(self.key, self.value) || + [self.right inorderTraversal:action]; +} + +- (BOOL) reverseTraversal:(BOOL (^)(id key, id value))action { + return [self.right reverseTraversal:action] || + action(self.key, self.value) || + [self.left reverseTraversal:action]; +} + +- (id) min { + if([self.left isEmpty]) { + return self; + } + else { + return [self.left min]; + } +} + +- (id) minKey { + return [[self min] key]; +} + +- (id) maxKey { + if([self.right isEmpty]) { + return self.key; + } + else { + return [self.right maxKey]; + } +} + +- (id) insertKey:(__unsafe_unretained id) aKey forValue:(__unsafe_unretained id)aValue withComparator:(NSComparator)aComparator { + NSComparisonResult cmp = aComparator(aKey, self.key); + FLLRBValueNode* n = self; + + if(cmp == NSOrderedAscending) { + n = [n copyWith:nil withValue:nil withColor:nil withLeft:[n.left insertKey:aKey forValue:aValue withComparator:aComparator] withRight:nil]; + } + else if(cmp == NSOrderedSame) { + n = [n copyWith:nil withValue:aValue withColor:nil withLeft:nil withRight:nil]; + } + else { + n = [n copyWith:nil withValue:nil withColor:nil withLeft:nil withRight:[n.right insertKey:aKey forValue:aValue withComparator:aComparator]]; + } + + return [n fixUp]; +} + +- (id) removeMin { + + if([self.left isEmpty]) { + return [FLLRBEmptyNode emptyNode]; + } + + FLLRBValueNode* n = self; + if(! [n.left isRed] && ! [n.left.left isRed]) { + n = [n moveRedLeft]; + } + + n = [n copyWith:nil withValue:nil withColor:nil withLeft:[(FLLRBValueNode*)n.left removeMin] withRight:nil]; + return [n fixUp]; +} + + +- (id) fixUp { + FLLRBValueNode* n = self; + if([n.right isRed] && ! [n.left isRed]) n = [n rotateLeft]; + if([n.left isRed] && [n.left.left isRed]) n = [n rotateRight]; + if([n.left isRed] && [n.right isRed]) n = [n colorFlip]; + return n; +} + +- (FLLRBValueNode*) moveRedLeft { + FLLRBValueNode* n = [self colorFlip]; + if([n.right.left isRed]) { + n = [n copyWith:nil withValue:nil withColor:nil withLeft:nil withRight:[(FLLRBValueNode*)n.right rotateRight]]; + n = [n rotateLeft]; + n = [n colorFlip]; + } + return n; +} + +- (FLLRBValueNode*) moveRedRight { + FLLRBValueNode* n = [self colorFlip]; + if([n.left.left isRed]) { + n = [n rotateRight]; + n = [n colorFlip]; + } + return n; +} + +- (id) rotateLeft { + id nl = [self copyWith:nil withValue:nil withColor:RED withLeft:nil withRight:self.right.left]; + return [self.right copyWith:nil withValue:nil withColor:self.color withLeft:nl withRight:nil];; +} + +- (id) rotateRight { + id nr = [self copyWith:nil withValue:nil withColor:RED withLeft:self.left.right withRight:nil]; + return [self.left copyWith:nil withValue:nil withColor:self.color withLeft:nil withRight:nr]; +} + +- (id) colorFlip { + id nleft = [self.left copyWith:nil withValue:nil withColor:[NSNumber numberWithBool:![self.left.color boolValue]] withLeft:nil withRight:nil]; + id nright = [self.right copyWith:nil withValue:nil withColor:[NSNumber numberWithBool:![self.right.color boolValue]] withLeft:nil withRight:nil]; + + return [self copyWith:nil withValue:nil withColor:[NSNumber numberWithBool:![self.color boolValue]] withLeft:nleft withRight:nright]; +} + +- (id) remove:(__unsafe_unretained id) aKey withComparator:(NSComparator)comparator { + id smallest; + FLLRBValueNode* n = self; + + if(comparator(aKey, n.key) == NSOrderedAscending) { + if(![n.left isEmpty] && ![n.left isRed] && ![n.left.left isRed]) { + n = [n moveRedLeft]; + } + n = [n copyWith:nil withValue:nil withColor:nil withLeft:[n.left remove:aKey withComparator:comparator] withRight:nil]; + } + else { + if([n.left isRed]) { + n = [n rotateRight]; + } + + if(![n.right isEmpty] && ![n.right isRed] && ![n.right.left isRed]) { + n = [n moveRedRight]; + } + + if(comparator(aKey, n.key) == NSOrderedSame) { + if([n.right isEmpty]) { + return [FLLRBEmptyNode emptyNode]; + } + else { + smallest = [n.right min]; + n = [n copyWith:smallest.key withValue:smallest.value withColor:nil withLeft:nil withRight:[(FLLRBValueNode*)n.right removeMin]]; + } + } + n = [n copyWith:nil withValue:nil withColor:nil withLeft:nil withRight:[n.right remove:aKey withComparator:comparator]]; + } + return [n fixUp]; +} + +- (BOOL) isRed { + return [self.color boolValue]; +} + +- (BOOL) checkMaxDepth { + int blackDepth = [self check]; + if(pow(2.0, blackDepth) <= ([self count] + 1)) { + return YES; + } + else { + return NO; + } +} + +- (int) check { + int blackDepth = 0; + + if([self isRed] && [self.left isRed]) { + @throw [[NSException alloc] initWithName:@"check" reason:@"Red node has a red child" userInfo:nil]; + } + + if([self.right isRed]) { + @throw [[NSException alloc] initWithName:@"check" reason:@"Right child is red" userInfo:nil]; + } + + blackDepth = [self.left check]; +// NSLog(err); + if(blackDepth != [self.right check]) { + NSString* err = [NSString stringWithFormat:@"(%@ -> %@)blackDepth: %d ; self.right check: %d", self.value, [self.color boolValue] ? @"red" : @"black", blackDepth, [self.right check]]; +// return 10; + @throw [[NSException alloc] initWithName:@"check" reason:err userInfo:nil]; + } + else { + int ret = blackDepth + ([self isRed] ? 0 : 1); +// NSLog(@"black depth is: %d; other is: %d, ret is: %d", blackDepth, ([self isRed] ? 0 : 1), ret); + return ret; + } +} + + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionary.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionary.h new file mode 100644 index 00000000..934ca8b1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionary.h @@ -0,0 +1,30 @@ +/** + * @fileoverview Implementation of an immutable SortedMap using a Left-leaning + * Red-Black Tree, adapted from the implementation in Mugs + * (http://mads379.github.com/mugs/) by Mads Hartmann Jensen + * (mads379@gmail.com). + * + * Original paper on Left-leaning Red-Black Trees: + * http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf + * + * Invariant 1: No red node has a red child + * Invariant 2: Every leaf path has the same number of black nodes + * Invariant 3: Only the left child can be red (left leaning) + */ + +#import +#import "FImmutableSortedDictionary.h" +#import "FLLRBNode.h" + +@interface FTreeSortedDictionary : FImmutableSortedDictionary + +@property (nonatomic, copy, readonly) NSComparator comparator; +@property (nonatomic, strong, readonly) id root; + +- (id)initWithComparator:(NSComparator)aComparator; + +// Override methods to return subtype +- (FTreeSortedDictionary *) insertKey:(id)aKey withValue:(id)aValue; +- (FTreeSortedDictionary *) removeKey:(id)aKey; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionary.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionary.m new file mode 100644 index 00000000..e9f0683a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionary.m @@ -0,0 +1,326 @@ +#import "FTreeSortedDictionary.h" +#import "FLLRBEmptyNode.h" +#import "FLLRBValueNode.h" +#import "FTreeSortedDictionaryEnumerator.h" + +typedef void (^fbt_void_nsnumber_int)(NSNumber* color, NSUInteger chunkSize); + +@interface FTreeSortedDictionary () + +@property (nonatomic, strong) id root; +@property (nonatomic, copy, readwrite) NSComparator comparator; + +@end + +@implementation FTreeSortedDictionary + +- (id)initWithComparator:(NSComparator)aComparator { + self = [super init]; + if (self) { + self.root = [FLLRBEmptyNode emptyNode]; + self.comparator = aComparator; + } + return self; +} + +- (id)initWithComparator:(NSComparator)aComparator withRoot:(__unsafe_unretained id)aRoot { + self = [super init]; + if (self) { + self.root = aRoot; + self.comparator = aComparator; + } + return self; +} + +/** + * Returns a copy of the map, with the specified key/value added or replaced. + */ +- (FTreeSortedDictionary *) insertKey:(__unsafe_unretained id)aKey withValue:(__unsafe_unretained id)aValue { + return [[FTreeSortedDictionary alloc] initWithComparator:self.comparator + withRoot:[[self.root insertKey:aKey forValue:aValue withComparator:self.comparator] + copyWith:nil + withValue:nil + withColor:BLACK + withLeft:nil + withRight:nil]]; +} + + +- (FTreeSortedDictionary *) removeKey:(__unsafe_unretained id)aKey { + // Remove is somewhat expensive even if the key doesn't exist (the tree does rebalancing and stuff). So avoid it. + if (![self contains:aKey]) { + return self; + } else { + return [[FTreeSortedDictionary alloc] + initWithComparator:self.comparator + withRoot:[[self.root remove:aKey withComparator:self.comparator] + copyWith:nil + withValue:nil + withColor:BLACK + withLeft:nil + withRight:nil]]; + } +} + +- (id) get:(__unsafe_unretained id) key { + if (key == nil) { + return nil; + } + NSComparisonResult cmp; + id node = self.root; + while(![node isEmpty]) { + cmp = self.comparator(key, node.key); + if(cmp == NSOrderedSame) { + return node.value; + } + else if (cmp == NSOrderedAscending) { + node = node.left; + } + else { + node = node.right; + } + } + return nil; +} + +- (id) getPredecessorKey:(__unsafe_unretained id) key { + NSComparisonResult cmp; + id node = self.root; + id rightParent = nil; + while(![node isEmpty]) { + cmp = self.comparator(key, node.key); + if(cmp == NSOrderedSame) { + if(![node.left isEmpty]) { + node = node.left; + while(! [node.right isEmpty]) { + node = node.right; + } + return node.key; + } + else if (rightParent != nil) { + return rightParent.key; + } + else { + return nil; + } + } + else if (cmp == NSOrderedAscending) { + node = node.left; + } + else if (cmp == NSOrderedDescending) { + rightParent = node; + node = node.right; + } + } + @throw [NSException exceptionWithName:@"NonexistentKey" reason:@"getPredecessorKey called with nonexistent key." userInfo:@{@"key": [key description] }]; +} + +- (BOOL) isEmpty { + return [self.root isEmpty]; +} + +- (int) count { + return [self.root count]; +} + +- (id) minKey { + return [self.root minKey]; +} + +- (id) maxKey { + return [self.root maxKey]; +} + +- (void) enumerateKeysAndObjectsUsingBlock:(void (^)(id, id, BOOL *))block +{ + [self enumerateKeysAndObjectsReverse:NO usingBlock:block]; +} + +- (void) enumerateKeysAndObjectsReverse:(BOOL)reverse usingBlock:(void (^)(id, id, BOOL *))block +{ + if (reverse) { + __block BOOL stop = NO; + [self.root reverseTraversal:^BOOL(id key, id value) { + block(key, value, &stop); + return stop; + }]; + } else { + __block BOOL stop = NO; + [self.root inorderTraversal:^BOOL(id key, id value) { + block(key, value, &stop); + return stop; + }]; + } +} + +- (BOOL) contains:(__unsafe_unretained id)key { + return ([self objectForKey:key] != nil); +} + +- (NSEnumerator *) keyEnumerator { + return [[FTreeSortedDictionaryEnumerator alloc] + initWithImmutableSortedDictionary:self startKey:nil isReverse:NO]; +} + +- (NSEnumerator *) keyEnumeratorFrom:(id)startKey { + return [[FTreeSortedDictionaryEnumerator alloc] + initWithImmutableSortedDictionary:self startKey:startKey isReverse:NO]; +} + +- (NSEnumerator *) reverseKeyEnumerator { + return [[FTreeSortedDictionaryEnumerator alloc] + initWithImmutableSortedDictionary:self startKey:nil isReverse:YES]; +} + +- (NSEnumerator *) reverseKeyEnumeratorFrom:(id)startKey { + return [[FTreeSortedDictionaryEnumerator alloc] + initWithImmutableSortedDictionary:self startKey:startKey isReverse:YES]; +} + + +#pragma mark - +#pragma mark Tree Builder + +// Code to efficiently build a RB Tree +typedef struct _base1_2list { + unsigned int bits; + unsigned short count; + unsigned short current; +} Base1_2List; + +Base1_2List *base1_2List_new(unsigned int length); +void base1_2List_free(Base1_2List* list); +unsigned int log_base2(unsigned int num); +BOOL base1_2List_next(Base1_2List* list); + +unsigned int log_base2(unsigned int num) { + return (unsigned int)(log(num) / log(2)); +} + +/** + * Works like an iterator, so it moves to the next bit. Do not call more than list->count times. + * @return whether or not the next bit is a 1 in base {1,2}. + */ +BOOL base1_2List_next(Base1_2List* list) { + BOOL result = !(list->bits & (0x1 << list->current)); + list->current--; + return result; +} + +static inline unsigned bit_mask(int x) { + return (x >= sizeof(unsigned) * CHAR_BIT) ? (unsigned) -1 : (1U << x) - 1; +} + +/** + * We represent the base{1,2} number as the combination of a binary number and a number of bits that we care about + * We iterate backwards, from most significant bit to least, to build up the llrb nodes. 0 base 2 => 1 base {1,2}, 1 base 2 => 2 base {1,2} + */ +Base1_2List *base1_2List_new(unsigned int length) { + size_t sz = sizeof(Base1_2List); + Base1_2List* list = calloc(1, sz); + // Calculate the number of bits that we care about + list->count = (unsigned short)log_base2(length + 1); + unsigned int mask = bit_mask(list->count); + list->bits = (length + 1) & mask; + list->current = list->count - 1; + return list; +} + + +void base1_2List_free(Base1_2List* list) { + free(list); +} + ++ (id) buildBalancedTree:(NSArray *)keys dictionary:(NSDictionary *)dictionary subArrayStartIndex:(NSUInteger)startIndex length:(NSUInteger)length { + length = MIN(keys.count - startIndex, length); // Bound length by the actual length of the array + if (length == 0) { + return nil; + } else if (length == 1) { + id key = keys[startIndex]; + return [[FLLRBValueNode alloc] initWithKey:key withValue:dictionary[key] withColor:BLACK withLeft:nil withRight:nil]; + } else { + NSUInteger middle = length / 2; + id left = [FTreeSortedDictionary buildBalancedTree:keys dictionary:dictionary subArrayStartIndex:startIndex length:middle]; + id right = [FTreeSortedDictionary buildBalancedTree:keys dictionary:dictionary subArrayStartIndex:(startIndex+middle+1) length:middle]; + id key = keys[startIndex + middle]; + return [[FLLRBValueNode alloc] initWithKey:key withValue:dictionary[key] withColor:BLACK withLeft:left withRight:right]; + } +} + ++ (id) rootFrom12List:(Base1_2List *)base1_2List keyList:(NSArray *)keyList dictionary:(NSDictionary *)dictionary { + __block id root = nil; + __block id node = nil; + __block NSUInteger index = keyList.count; + + fbt_void_nsnumber_int buildPennant = ^(NSNumber* color, NSUInteger chunkSize) { + NSUInteger startIndex = index - chunkSize + 1; + index -= chunkSize; + id key = keyList[index]; + id childTree = [self buildBalancedTree:keyList dictionary:dictionary subArrayStartIndex:startIndex length:(chunkSize - 1)]; + id pennant = [[FLLRBValueNode alloc] initWithKey:key withValue:dictionary[key] withColor:color withLeft:nil withRight:childTree]; + //attachPennant(pennant); + if (node) { + node.left = pennant; + node = pennant; + } else { + root = pennant; + node = pennant; + } + }; + + for (int i = 0; i < base1_2List->count; ++i) { + BOOL isOne = base1_2List_next(base1_2List); + NSUInteger chunkSize = (NSUInteger)pow(2.0, base1_2List->count - (i + 1)); + if (isOne) { + buildPennant(BLACK, chunkSize); + } else { + buildPennant(BLACK, chunkSize); + buildPennant(RED, chunkSize); + } + } + return root; +} + +/** + * Uses the algorithm linked here: + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.1458 + */ + ++ (FImmutableSortedDictionary *)fromDictionary:(NSDictionary *)dictionary withComparator:(NSComparator)comparator +{ + // Steps: + // 0. Sort the array + // 1. Calculate the 1-2 number + // 2. Build From 1-2 number + // 0. for each digit in 1-2 number + // 0. calculate chunk size + // 1. build 1 or 2 pennants of that size + // 2. attach pennants and update node pointer + // 1. return root + NSMutableArray *sortedKeyList = [NSMutableArray arrayWithCapacity:dictionary.count]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + [sortedKeyList addObject:key]; + }]; + [sortedKeyList sortUsingComparator:comparator]; + + [sortedKeyList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + if (idx > 0) { + if (comparator(sortedKeyList[idx - 1], obj) != NSOrderedAscending) { + [NSException raise:NSInvalidArgumentException format:@"Can't create FImmutableSortedDictionary with keys with same ordering!"]; + } + } + }]; + + Base1_2List* list = base1_2List_new((unsigned int)sortedKeyList.count); + id root = [self rootFrom12List:list keyList:sortedKeyList dictionary:dictionary]; + base1_2List_free(list); + + if (root != nil) { + return [[FTreeSortedDictionary alloc] initWithComparator:comparator withRoot:root]; + } else { + return [[FTreeSortedDictionary alloc] initWithComparator:comparator]; + } +} + +@end + diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionaryEnumerator.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionaryEnumerator.h new file mode 100644 index 00000000..d79fe8e6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionaryEnumerator.h @@ -0,0 +1,9 @@ +#import +#import "FTreeSortedDictionary.h" + +@interface FTreeSortedDictionaryEnumerator : NSEnumerator + +- (id)initWithImmutableSortedDictionary:(FTreeSortedDictionary *)aDict startKey:(id)startKey isReverse:(BOOL)reverse; +- (id)nextObject; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionaryEnumerator.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionaryEnumerator.m new file mode 100644 index 00000000..2aca86e0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/FImmutableSortedDictionary/FImmutableSortedDictionary/FTreeSortedDictionaryEnumerator.m @@ -0,0 +1,83 @@ +#import "FTreeSortedDictionaryEnumerator.h" + +@interface FTreeSortedDictionaryEnumerator() +@property (nonatomic, strong) FTreeSortedDictionary* immutableSortedDictionary; +@property (nonatomic, strong) NSMutableArray* stack; +@property (nonatomic) BOOL isReverse; + +@end + +@implementation FTreeSortedDictionaryEnumerator + +- (id)initWithImmutableSortedDictionary:(FTreeSortedDictionary *)aDict + startKey:(id)startKey isReverse:(BOOL)reverse { + self = [super init]; + if (self) { + self.immutableSortedDictionary = aDict; + self.stack = [[NSMutableArray alloc] init]; + self.isReverse = reverse; + + NSComparator comparator = aDict.comparator; + id node = self.immutableSortedDictionary.root; + + NSInteger cmp; + while(![node isEmpty]) { + cmp = startKey ? comparator(node.key, startKey) : 1; + // flip the comparison if we're going in reverse + if (self.isReverse) cmp *= -1; + + if (cmp < 0) { + // This node is less than our start key. Ignore it. + if (self.isReverse) { + node = node.left; + } else { + node = node.right; + } + } else if (cmp == 0) { + // This node is exactly equal to our start key. Push it on the stack, but stop iterating: + [self.stack addObject:node]; + break; + } else { + // This node is greater than our start key, add it to the stack and move on to the next one. + [self.stack addObject:node]; + if (self.isReverse) { + node = node.right; + } else { + node = node.left; + } + } + } + } + return self; +} + +- (id)nextObject { + if([self.stack count] == 0) { + return nil; + } + + id node = nil; + @synchronized(self.stack) { + node = [self.stack lastObject]; + [self.stack removeLastObject]; + } + id result = node.key; + + if (self.isReverse) { + node = node.left; + while (![node isEmpty]) { + [self.stack addObject:node]; + node = node.right; + } + } else { + node = node.right; + while (![node isEmpty]) { + [self.stack addObject:node]; + node = node.left; + } + } + + return result; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/FSRWebSocket.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/FSRWebSocket.h new file mode 100644 index 00000000..76f87dea --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/FSRWebSocket.h @@ -0,0 +1,107 @@ +// +// Copyright 2012 Square Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import + +typedef enum { + SR_CONNECTING = 0, + SR_OPEN = 1, + SR_CLOSING = 2, + SR_CLOSED = 3, + +} FSRReadyState; + +@class FSRWebSocket; + +extern NSString *const FSRWebSocketErrorDomain; + +@protocol FSRWebSocketDelegate; + +@interface FSRWebSocket : NSObject + +@property (nonatomic, weak) id delegate; + +@property (nonatomic, readonly) FSRReadyState readyState; +@property (nonatomic, readonly, retain) NSURL *url; + +// This returns the negotiated protocol. +// It will be niluntil after the handshake completes. +@property (nonatomic, readonly, copy) NSString *protocol; + +// Protocols should be an array of strings that turn into Sec-WebSocket-Protocol +- (id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols queue:(dispatch_queue_t)queue googleAppID:(NSString*)googleAppID andUserAgent:(NSString *)userAgent; +- (id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols; +- (id)initWithURLRequest:(NSURLRequest *)request queue:(dispatch_queue_t)queue googleAppID:(NSString*)googleAppID andUserAgent:(NSString *)userAgent; +- (id)initWithURLRequest:(NSURLRequest *)request; + +// Some helper constructors +- (id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols; +- (id)initWithURL:(NSURL *)url; + +// Delegate queue will be dispatch_main_queue by default. +// You cannot set both OperationQueue and dispatch_queue. +- (void)setDelegateOperationQueue:(NSOperationQueue*) queue; +- (void)setDelegateDispatchQueue:(dispatch_queue_t)queue; + +// By default, it will schedule itself on +[NSRunLoop SR_networkRunLoop] using defaultModes. +- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; +- (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; + +// SRWebSockets are intended one-time-use only. Open should be called once and only once +- (void)open; + +- (void)close; +- (void)closeWithCode:(NSInteger)code reason:(NSString *)reason; + +// Send a UTF8 String or Data +- (void)send:(id)data; + +@end + +@protocol FSRWebSocketDelegate + +// message will either be an NSString if the server is using text +// or NSData if the server is using binary +- (void)webSocket:(FSRWebSocket *)webSocket didReceiveMessage:(id)message; + +@optional + +- (void)webSocketDidOpen:(FSRWebSocket *)webSocket; +- (void)webSocket:(FSRWebSocket *)webSocket didFailWithError:(NSError *)error; +- (void)webSocket:(FSRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean; + +@end + + +@interface NSURLRequest (FCertificateAdditions) + +@property (nonatomic, retain, readonly) NSArray *FSR_SSLPinnedCertificates; + +@end + + +@interface NSMutableURLRequest (FCertificateAdditions) + +@property (nonatomic, retain) NSArray *FSR_SSLPinnedCertificates; + +@end + +@interface NSRunLoop (FSRWebSocket) + ++ (NSRunLoop *)FSR_networkRunLoop; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/FSRWebSocket.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/FSRWebSocket.m new file mode 100644 index 00000000..1bdff9a3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/FSRWebSocket.m @@ -0,0 +1,1867 @@ +// +// Copyright 2012 Square Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +#import "FSRWebSocket.h" + +#if __has_include() +#define HAS_ICU +#endif + +#import + +#ifdef HAS_ICU +#import +#endif + +#if __has_include() +#import +#else +#import +#endif + +#import +#import +#import "fbase64.h" +#import "NSData+SRB64Additions.h" + +#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE +#define sr_dispatch_retain(x) +#define sr_dispatch_release(x) +#define maybe_bridge(x) ((__bridge void *) x) +#else +#define sr_dispatch_retain(x) dispatch_retain(x) +#define sr_dispatch_release(x) dispatch_release(x) +#define maybe_bridge(x) (x) +#endif + +typedef enum { + SROpCodeTextFrame = 0x1, + SROpCodeBinaryFrame = 0x2, + //3-7Reserved + SROpCodeConnectionClose = 0x8, + SROpCodePing = 0x9, + SROpCodePong = 0xA, + //B-F reserved +} FSROpCode; + +typedef enum { + SRStatusCodeNormal = 1000, + SRStatusCodeGoingAway = 1001, + SRStatusCodeProtocolError = 1002, + SRStatusCodeUnhandledType = 1003, + // 1004 reserved + SRStatusNoStatusReceived = 1005, + // 1004-1006 reserved + SRStatusCodeInvalidUTF8 = 1007, + SRStatusCodePolicyViolated = 1008, + SRStatusCodeMessageTooBig = 1009, +} FSRStatusCode; + +typedef struct { + BOOL fin; +// BOOL rsv1; +// BOOL rsv2; +// BOOL rsv3; + uint8_t opcode; + BOOL masked; + uint64_t payload_length; +} frame_header; + +static NSString *const SRWebSocketAppendToSecKeyString = @"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + +static inline int32_t validate_dispatch_data_partial_string(NSData *data); +static inline void SRFastLog(NSString *format, ...); + +@interface NSData (FSRWebSocket) + +- (NSString *)stringBySHA1ThenBase64Encoding; + +@end + + +@interface NSString (FSRWebSocket) + +- (NSString *)stringBySHA1ThenBase64Encoding; + +@end + + +@interface NSURL (FSRWebSocket) + +// The origin isn't really applicable for a native application +// So instead, just map ws -> http and wss -> https +- (NSString *)SR_origin; + +@end + +@interface _FSRRunLoopThread : NSThread + +@property (nonatomic, readonly) NSRunLoop *runLoop; + +@end + +static NSString *newSHA1String(const char *bytes, size_t length) { + uint8_t md[CC_SHA1_DIGEST_LENGTH]; + + CC_SHA1(bytes, (int)length, md); + + size_t buffer_size = ((sizeof(md) * 3 + 2) / 2); + + char *buffer = (char *)malloc(buffer_size); + + int len = f_b64_ntop(md, CC_SHA1_DIGEST_LENGTH, buffer, buffer_size); + if (len == -1) { + free(buffer); + return nil; + } else{ + return [[NSString alloc] initWithBytesNoCopy:buffer length:len encoding:NSASCIIStringEncoding freeWhenDone:YES]; + } +} + +@implementation NSData (FSRWebSocket) + +- (NSString *)stringBySHA1ThenBase64Encoding; +{ + return newSHA1String(self.bytes, self.length); +} + +@end + + +@implementation NSString (FSRWebSocket) + +- (NSString *)stringBySHA1ThenBase64Encoding; +{ + return newSHA1String(self.UTF8String, self.length); +} + +@end + +NSString *const FSRWebSocketErrorDomain = @"FSRWebSocketErrorDomain"; + +// Returns number of bytes consumed. returning 0 means you didn't match. +// Sends bytes to callback handler; +typedef size_t (^stream_scanner)(NSData *collected_data); + +typedef void (^data_callback)(FSRWebSocket *webSocket, NSData *data); + +@interface FSRIOConsumer : NSObject { + stream_scanner _scanner; + data_callback _handler; + size_t _bytesNeeded; + BOOL _readToCurrentFrame; + BOOL _unmaskBytes; +} +@property (nonatomic, copy, readonly) stream_scanner consumer; +@property (nonatomic, copy, readonly) data_callback handler; +@property (nonatomic, assign) size_t bytesNeeded; +@property (nonatomic, assign, readonly) BOOL readToCurrentFrame; +@property (nonatomic, assign, readonly) BOOL unmaskBytes; + +@end + +// This class is not thread-safe, and is expected to always be run on the same queue. +@interface FSRIOConsumerPool : NSObject + +- (id)initWithBufferCapacity:(NSUInteger)poolSize; + +- (FSRIOConsumer *)consumerWithScanner:(stream_scanner)scanner handler:(data_callback)handler bytesNeeded:(size_t)bytesNeeded readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes; +- (void)returnConsumer:(FSRIOConsumer *)consumer; + +@end + +@interface FSRWebSocket () + +- (void)_writeData:(NSData *)data; +- (void)_closeWithProtocolError:(NSString *)message; +- (void)_failWithError:(NSError *)error; + +- (void)_disconnect; + +- (void)_readFrameNew; +- (void)_readFrameContinue; + +- (void)_pumpScanner; + +- (void)_pumpWriting; + +- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback; +- (void)_addConsumerWithDataLength:(size_t)dataLength callback:(data_callback)callback readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes; +- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback dataLength:(size_t)dataLength; +- (void)_readUntilBytes:(const void *)bytes length:(size_t)length callback:(data_callback)dataHandler; +- (void)_readUntilHeaderCompleteWithCallback:(data_callback)dataHandler; + +- (void)_sendFrameWithOpcode:(FSROpCode)opcode data:(id)data; + +- (BOOL)_checkHandshake:(CFHTTPMessageRef)httpMessage; +- (void)_SR_commonInit; + +- (void)_initializeStreams; +- (void)_connect; + +@property (nonatomic) FSRReadyState readyState; + +@property (nonatomic) NSOperationQueue *delegateOperationQueue; +@property (nonatomic) dispatch_queue_t delegateDispatchQueue; + +@end + + +@implementation FSRWebSocket { + NSInteger _webSocketVersion; + + NSOperationQueue *_delegateOperationQueue; + dispatch_queue_t _delegateDispatchQueue; + dispatch_queue_t _workQueue; + NSMutableArray *_consumers; + + NSInputStream *_inputStream; + NSOutputStream *_outputStream; + + NSMutableData *_readBuffer; + NSInteger _readBufferOffset; + + NSMutableData *_outputBuffer; + NSInteger _outputBufferOffset; + + uint8_t _currentFrameOpcode; + size_t _currentFrameCount; + size_t _readOpCount; + uint32_t _currentStringScanPosition; + NSMutableData *_currentFrameData; + + NSString *_closeReason; + + NSString *_secKey; + + BOOL _pinnedCertFound; + + uint8_t _currentReadMaskKey[4]; + size_t _currentReadMaskOffset; + + BOOL _consumerStopped; + + BOOL _closeWhenFinishedWriting; + BOOL _failed; + + BOOL _secure; + NSURLRequest *_urlRequest; + NSString *_userAgent; + NSString *_googleAppID; + + CFHTTPMessageRef _receivedHTTPHeaders; + + BOOL _sentClose; + BOOL _didFail; + BOOL _cleanupScheduled; + int _closeCode; + + BOOL _isPumping; + + NSMutableSet *_scheduledRunloops; + + // We use this to retain ourselves. + __strong FSRWebSocket *_selfRetain; + + NSArray *_requestedProtocols; + FSRIOConsumerPool *_consumerPool; +} + +@synthesize delegate = _delegate; +@synthesize url = _url; +@synthesize readyState = _readyState; +@synthesize protocol = _protocol; + +static __strong NSData *CRLFCRLF; + ++ (void)initialize; +{ + CRLFCRLF = [[NSData alloc] initWithBytes:"\r\n\r\n" length:4]; +} + +- (id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols queue:(dispatch_queue_t)queue + googleAppID:(NSString *)googleAppID andUserAgent:(NSString *)userAgent; +{ + self = [super init]; + if (self) { + assert(request.URL); + _url = request.URL; + NSString *scheme = [_url scheme]; + + _requestedProtocols = [protocols copy]; + _googleAppID = googleAppID; + _userAgent = userAgent; + + assert([scheme isEqualToString:@"ws"] || [scheme isEqualToString:@"http"] || [scheme isEqualToString:@"wss"] || [scheme isEqualToString:@"https"]); + _urlRequest = request; + + if ([scheme isEqualToString:@"wss"] || [scheme isEqualToString:@"https"]) { + _secure = YES; + } + + if (!queue) { + _delegateDispatchQueue = dispatch_get_main_queue(); + } else { + _delegateDispatchQueue = queue; + } + + [self _SR_commonInit]; + } + + return self; +} + +- (id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols; +{ + return [self initWithURLRequest:request protocols:nil queue:nil googleAppID:nil andUserAgent:nil]; +} + +- (id)initWithURLRequest:(NSURLRequest *)request queue:(dispatch_queue_t)queue + googleAppID:(NSString *)googleAppID andUserAgent:(NSString *)userAgent; +{ + return [self initWithURLRequest:request protocols:nil queue:queue googleAppID:googleAppID + andUserAgent:userAgent]; +} + +- (id)initWithURLRequest:(NSURLRequest *)request; +{ + return [self initWithURLRequest:request protocols:nil]; +} + +- (id)initWithURL:(NSURL *)url; +{ + return [self initWithURL:url protocols:nil]; +} + +- (id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols; +{ + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; + return [self initWithURLRequest:request protocols:protocols]; +} + +- (void)_SR_commonInit; +{ + _readyState = SR_CONNECTING; + + _consumerStopped = YES; + + _webSocketVersion = 13; + + _workQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL); + + // Going to set a specific on the queue so we can validate we're on the work queue + dispatch_queue_set_specific(_workQueue, (__bridge void *)self, maybe_bridge(_workQueue), NULL); + + sr_dispatch_retain(_delegateDispatchQueue); + + _readBuffer = [[NSMutableData alloc] init]; + _outputBuffer = [[NSMutableData alloc] init]; + + _currentFrameData = [[NSMutableData alloc] init]; + + _consumers = [[NSMutableArray alloc] init]; + + _consumerPool = [[FSRIOConsumerPool alloc] init]; + + _scheduledRunloops = [[NSMutableSet alloc] init]; + + [self _initializeStreams]; + + // default handlers +} + +- (void)assertOnWorkQueue; +{ + assert(dispatch_get_specific((__bridge void *)self) == maybe_bridge(_workQueue)); +} + +- (void)dealloc +{ + _inputStream.delegate = nil; + _outputStream.delegate = nil; + + [_inputStream close]; + [_outputStream close]; + + sr_dispatch_release(_workQueue); + _workQueue = NULL; + + if (_receivedHTTPHeaders) { + CFRelease(_receivedHTTPHeaders); + _receivedHTTPHeaders = NULL; + } + + if (_delegateDispatchQueue) { + sr_dispatch_release(_delegateDispatchQueue); + _delegateDispatchQueue = NULL; + } +} + +#ifndef NDEBUG + +- (void)setReadyState:(FSRReadyState)aReadyState; +{ + [self willChangeValueForKey:@"readyState"]; + assert(aReadyState > _readyState); + _readyState = aReadyState; + [self didChangeValueForKey:@"readyState"]; +} + +#endif + +- (void)open; +{ + assert(_url); + NSAssert(_readyState == SR_CONNECTING, @"Cannot call -(void)open on SRWebSocket more than once"); + + _selfRetain = self; + + [self _connect]; +} + +// Calls block on delegate queue +- (void)_performDelegateBlock:(dispatch_block_t)block; +{ + if (_delegateOperationQueue) { + [_delegateOperationQueue addOperationWithBlock:block]; + } else { + assert(_delegateDispatchQueue); + dispatch_async(_delegateDispatchQueue, block); + } +} + +- (void)setDelegateDispatchQueue:(dispatch_queue_t)queue; +{ + if (queue) { + sr_dispatch_retain(queue); + } + + if (_delegateDispatchQueue) { + sr_dispatch_release(_delegateDispatchQueue); + } + + _delegateDispatchQueue = queue; +} + +- (BOOL)_checkHandshake:(CFHTTPMessageRef)httpMessage; +{ + NSString *acceptHeader = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(httpMessage, CFSTR("Sec-WebSocket-Accept"))); + + if (acceptHeader == nil) { + return NO; + } + + NSString *concattedString = [_secKey stringByAppendingString:SRWebSocketAppendToSecKeyString]; + NSString *expectedAccept = [concattedString stringBySHA1ThenBase64Encoding]; + + return [acceptHeader isEqualToString:expectedAccept]; +} + +- (void)_HTTPHeadersDidFinish; +{ + NSInteger responseCode = CFHTTPMessageGetResponseStatusCode(_receivedHTTPHeaders); + + if (responseCode >= 400) { + SRFastLog(@"Request failed with response code %d", responseCode); + [self _failWithError:[NSError errorWithDomain:@"org.lolrus.SocketRocket" code:2132 userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"received bad response code from server %u", (int)responseCode] forKey:NSLocalizedDescriptionKey]]]; + return; + + } + + if(![self _checkHandshake:_receivedHTTPHeaders]) { + [self _failWithError:[NSError errorWithDomain:FSRWebSocketErrorDomain code:2133 userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"Invalid Sec-WebSocket-Accept response"] forKey:NSLocalizedDescriptionKey]]]; + return; + } + + NSString *negotiatedProtocol = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(_receivedHTTPHeaders, CFSTR("Sec-WebSocket-Protocol"))); + if (negotiatedProtocol) { + // Make sure we requested the protocol + if ([_requestedProtocols indexOfObject:negotiatedProtocol] == NSNotFound) { + [self _failWithError:[NSError errorWithDomain:FSRWebSocketErrorDomain code:2133 userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"Server specified Sec-WebSocket-Protocol that wasn't requested"] forKey:NSLocalizedDescriptionKey]]]; + return; + } + + _protocol = negotiatedProtocol; + } + + self.readyState = SR_OPEN; + + if (!_didFail) { + [self _readFrameNew]; + } + + [self _performDelegateBlock:^{ + if ([self.delegate respondsToSelector:@selector(webSocketDidOpen:)]) { + [self.delegate webSocketDidOpen:self]; + }; + }]; +} + + +- (void)_readHTTPHeader; +{ + if (_receivedHTTPHeaders == NULL) { + _receivedHTTPHeaders = CFHTTPMessageCreateEmpty(NULL, NO); + } + + [self _readUntilHeaderCompleteWithCallback:^(FSRWebSocket *self, NSData *data) { + CFHTTPMessageAppendBytes(self->_receivedHTTPHeaders, (const UInt8 *)data.bytes, data.length); + + if (CFHTTPMessageIsHeaderComplete(self->_receivedHTTPHeaders)) { + SRFastLog(@"Finished reading headers %@", CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(self->_receivedHTTPHeaders))); + [self _HTTPHeadersDidFinish]; + } else { + [self _readHTTPHeader]; + } + }]; +} + +- (void)didConnect +{ + SRFastLog(@"Connected"); + CFHTTPMessageRef request = CFHTTPMessageCreateRequest(NULL, CFSTR("GET"), (__bridge CFURLRef)_url, kCFHTTPVersion1_1); + + // Set host first so it defaults + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Host"), (__bridge CFStringRef) + (_url.port != nil ? [NSString stringWithFormat:@"%@:%@", + _url.host, _url.port] : _url.host)); + + NSMutableData *keyBytes = [[NSMutableData alloc] initWithLength:16]; + int result = SecRandomCopyBytes(kSecRandomDefault, keyBytes.length, keyBytes.mutableBytes); + assert(result == 0); + _secKey = [FSRUtilities base64EncodedStringFromData:keyBytes]; + assert([_secKey length] == 24); + + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Upgrade"), CFSTR("websocket")); + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Connection"), CFSTR("Upgrade")); + if (_userAgent) { + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("User-Agent"), (__bridge CFStringRef)_userAgent); + } + + if (_googleAppID) { + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("X-Firebase-GMPID"), (__bridge CFStringRef)_googleAppID); + } + + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Sec-WebSocket-Key"), (__bridge CFStringRef)_secKey); + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Sec-WebSocket-Version"), (__bridge CFStringRef)[NSString stringWithFormat:@"%u", (int)_webSocketVersion]); + + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Origin"), (__bridge CFStringRef)_url.SR_origin); + + if (_requestedProtocols) { + CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Sec-WebSocket-Protocol"), (__bridge CFStringRef)[_requestedProtocols componentsJoinedByString:@", "]); + } + + [_urlRequest.allHTTPHeaderFields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + CFHTTPMessageSetHeaderFieldValue(request, (__bridge CFStringRef)key, (__bridge CFStringRef)obj); + }]; + + NSData *message = CFBridgingRelease(CFHTTPMessageCopySerializedMessage(request)); + + CFRelease(request); + + [self _writeData:message]; + [self _readHTTPHeader]; +} + +//- (void)_connectToHost:(NSString *)host port:(NSInteger)port; +- (void)_initializeStreams; +{ + NSInteger port = _url.port.integerValue; + if (port == 0) { + if (!_secure) { + port = 80; + } else { + port = 443; + } + } + NSString *host = _url.host; + + CFReadStreamRef readStream = NULL; + CFWriteStreamRef writeStream = NULL; + + CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, (int)port, &readStream, &writeStream); + + // XXX + CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeBackground); + CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeBackground); + + _outputStream = CFBridgingRelease(writeStream); + _inputStream = CFBridgingRelease(readStream); + + + if (_secure) { + NSMutableDictionary *SSLOptions = [[NSMutableDictionary alloc] init]; + + [_outputStream setProperty:(__bridge id)kCFStreamSocketSecurityLevelNegotiatedSSL forKey:(__bridge id)kCFStreamPropertySocketSecurityLevel]; + + // If we're using pinned certs, don't validate the certificate chain + if ([_urlRequest FSR_SSLPinnedCertificates].count) { + [SSLOptions setValue:[NSNumber numberWithBool:NO] forKey:(__bridge id)kCFStreamSSLValidatesCertificateChain]; + } + + [_outputStream setProperty:SSLOptions + forKey:(__bridge id)kCFStreamPropertySSLSettings]; + } + + _inputStream.delegate = self; + _outputStream.delegate = self; + + [_outputStream open]; + [_inputStream open]; +} + +- (void)_connect; +{ + if (!_scheduledRunloops.count) { + [self scheduleInRunLoop:[NSRunLoop FSR_networkRunLoop] forMode:NSDefaultRunLoopMode]; + } + + + [_outputStream open]; + [_inputStream open]; +} + +- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; +{ + [_outputStream scheduleInRunLoop:aRunLoop forMode:mode]; + [_inputStream scheduleInRunLoop:aRunLoop forMode:mode]; + + [_scheduledRunloops addObject:@[aRunLoop, mode]]; +} + +- (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; +{ + [_outputStream removeFromRunLoop:aRunLoop forMode:mode]; + [_inputStream removeFromRunLoop:aRunLoop forMode:mode]; + + [_scheduledRunloops removeObject:@[aRunLoop, mode]]; +} + +- (void)close; +{ + [self closeWithCode:-1 reason:nil]; +} + +- (void)closeWithCode:(NSInteger)code reason:(NSString *)reason; +{ + assert(code); + dispatch_async(_workQueue, ^{ + if (self.readyState == SR_CLOSING || self.readyState == SR_CLOSED) { + return; + } + + BOOL wasConnecting = self.readyState == SR_CONNECTING; + + self.readyState = SR_CLOSING; + + SRFastLog(@"Closing with code %d reason %@", code, reason); + + if (wasConnecting) { + [self _disconnect]; + return; + } + + size_t maxMsgSize = [reason maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSMutableData *mutablePayload = [[NSMutableData alloc] initWithLength:sizeof(uint16_t) + maxMsgSize]; + NSData *payload = mutablePayload; + + ((uint16_t *)mutablePayload.mutableBytes)[0] = EndianU16_BtoN(code); + + if (reason) { + NSRange remainingRange = {0}; + + NSUInteger usedLength = 0; + + BOOL success = [reason getBytes:(char *)mutablePayload.mutableBytes + sizeof(uint16_t) maxLength:payload.length - sizeof(uint16_t) usedLength:&usedLength encoding:NSUTF8StringEncoding options:NSStringEncodingConversionExternalRepresentation range:NSMakeRange(0, reason.length) remainingRange:&remainingRange]; + + assert(success); + assert(remainingRange.length == 0); + + if (usedLength != maxMsgSize) { + payload = [payload subdataWithRange:NSMakeRange(0, usedLength + sizeof(uint16_t))]; + } + } + + + [self _sendFrameWithOpcode:SROpCodeConnectionClose data:payload]; + }); +} + +- (void)_closeWithProtocolError:(NSString *)message; +{ + // Need to shunt this on the _callbackQueue first to see if they received any messages + [self _performDelegateBlock:^{ + [self closeWithCode:SRStatusCodeProtocolError reason:message]; + dispatch_async(self->_workQueue, ^{ + [self _disconnect]; + }); + }]; +} + +- (void)_failWithError:(NSError *)error; +{ + dispatch_async(_workQueue, ^{ + if (self.readyState != SR_CLOSED) { + self->_failed = YES; + [self _performDelegateBlock:^{ + if ([self.delegate respondsToSelector:@selector(webSocket:didFailWithError:)]) { + [self.delegate webSocket:self didFailWithError:error]; + } + }]; + + self.readyState = SR_CLOSED; + + SRFastLog(@"Failing with error %@", error.localizedDescription); + + [self _disconnect]; + [self _scheduleCleanup]; + } + }); +} + +- (void)_writeData:(NSData *)data; +{ + [self assertOnWorkQueue]; + + if (_closeWhenFinishedWriting) { + return; + } + [_outputBuffer appendData:data]; + [self _pumpWriting]; +} +- (void)send:(id)data; +{ + SRFastLog(@"Sending data %@", data); + NSAssert(self.readyState != SR_CONNECTING, @"Invalid State: Cannot call send: until connection is open"); + // TODO: maybe not copy this for performance + data = [data copy]; + dispatch_async(_workQueue, ^{ + if ([data isKindOfClass:[NSString class]]) { + [self _sendFrameWithOpcode:SROpCodeTextFrame data:[(NSString *)data dataUsingEncoding:NSUTF8StringEncoding]]; + } else if ([data isKindOfClass:[NSData class]]) { + [self _sendFrameWithOpcode:SROpCodeBinaryFrame data:data]; + } else if (data == nil) { + [self _sendFrameWithOpcode:SROpCodeTextFrame data:data]; + } else { + assert(NO); + } + }); +} + +- (void)handlePing:(NSData *)pingData; +{ + // Need to pingpong this off _callbackQueue first to make sure messages happen in order + [self _performDelegateBlock:^{ + dispatch_async(self->_workQueue, ^{ + [self _sendFrameWithOpcode:SROpCodePong data:pingData]; + }); + }]; +} + +- (void)handlePong; +{ + // NOOP +} + +- (void)_handleMessage:(id)message +{ + SRFastLog(@"Received message"); + [self _performDelegateBlock:^{ + if ([self.delegate respondsToSelector:@selector(webSocket:didReceiveMessage:)]) { + [self.delegate webSocket:self didReceiveMessage:message]; + } + }]; +} + + +static inline BOOL closeCodeIsValid(int closeCode) { + if (closeCode < 1000) { + return NO; + } + + if (closeCode >= 1000 && closeCode <= 1011) { + if (closeCode == 1004 || + closeCode == 1005 || + closeCode == 1006) { + return NO; + } + return YES; + } + + if (closeCode >= 3000 && closeCode <= 3999) { + return YES; + } + + if (closeCode >= 4000 && closeCode <= 4999) { + return YES; + } + + return NO; +} + +// Note from RFC: +// +// If there is a body, the first two +// bytes of the body MUST be a 2-byte unsigned integer (in network byte +// order) representing a status code with value /code/ defined in +// Section 7.4. Following the 2-byte integer the body MAY contain UTF-8 +// encoded data with value /reason/, the interpretation of which is not +// defined by this specification. + +- (void)handleCloseWithData:(NSData *)data; +{ + size_t dataSize = data.length; + __block uint16_t closeCode = 0; + + SRFastLog(@"Received close frame"); + + if (dataSize == 1) { + // TODO handle error + [self _closeWithProtocolError:@"Payload for close must be larger than 2 bytes"]; + return; + } else if (dataSize >= 2) { + [data getBytes:&closeCode length:sizeof(closeCode)]; + _closeCode = EndianU16_BtoN(closeCode); + if (!closeCodeIsValid(_closeCode)) { + [self _closeWithProtocolError:[NSString stringWithFormat:@"Cannot have close code of %d", _closeCode]]; + return; + } + if (dataSize > 2) { + _closeReason = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(2, dataSize - 2)] encoding:NSUTF8StringEncoding]; + if (!_closeReason) { + [self _closeWithProtocolError:@"Close reason MUST be valid UTF-8"]; + return; + } + } + } else { + _closeCode = SRStatusNoStatusReceived; + } + + [self assertOnWorkQueue]; + + if (self.readyState == SR_OPEN) { + [self closeWithCode:1000 reason:nil]; + } + dispatch_async(_workQueue, ^{ + [self _disconnect]; + }); +} + +- (void)_disconnect; +{ + [self assertOnWorkQueue]; + SRFastLog(@"Trying to disconnect"); + _closeWhenFinishedWriting = YES; + [self _pumpWriting]; +} + +- (void)_handleFrameWithData:(NSData *)frameData opCode:(NSInteger)opcode; +{ + // Check that the current data is valid UTF8 + + BOOL isControlFrame = (opcode == SROpCodePing || opcode == SROpCodePong || opcode == SROpCodeConnectionClose); + if (!isControlFrame) { + [self _readFrameNew]; + } else { + dispatch_async(_workQueue, ^{ + [self _readFrameContinue]; + }); + } + + switch (opcode) { + case SROpCodeTextFrame: { + NSString *str = [[NSString alloc] initWithData:frameData encoding:NSUTF8StringEncoding]; + if (str == nil && frameData) { + [self closeWithCode:SRStatusCodeInvalidUTF8 reason:@"Text frames must be valid UTF-8"]; + dispatch_async(_workQueue, ^{ + [self _disconnect]; + }); + + return; + } + [self _handleMessage:str]; + break; + } + case SROpCodeBinaryFrame: + [self _handleMessage:[frameData copy]]; + break; + case SROpCodeConnectionClose: + [self handleCloseWithData:frameData]; + break; + case SROpCodePing: + [self handlePing:frameData]; + break; + case SROpCodePong: + [self handlePong]; + break; + default: + [self _closeWithProtocolError:[NSString stringWithFormat:@"Unknown opcode %u", (int)opcode]]; + // TODO: Handle invalid opcode + break; + } +} + +- (void)_handleFrameHeader:(frame_header)frame_header curData:(NSData *)curData; +{ + assert(frame_header.opcode != 0); + + if (self.readyState != SR_OPEN) { + return; + } + + + BOOL isControlFrame = (frame_header.opcode == SROpCodePing || frame_header.opcode == SROpCodePong || frame_header.opcode == SROpCodeConnectionClose); + + if (isControlFrame && !frame_header.fin) { + [self _closeWithProtocolError:@"Fragmented control frames not allowed"]; + return; + } + + if (isControlFrame && frame_header.payload_length >= 126) { + [self _closeWithProtocolError:@"Control frames cannot have payloads larger than 126 bytes"]; + return; + } + + if (!isControlFrame) { + _currentFrameOpcode = frame_header.opcode; + _currentFrameCount += 1; + } + + if (frame_header.payload_length == 0) { + if (isControlFrame) { + [self _handleFrameWithData:curData opCode:frame_header.opcode]; + } else { + if (frame_header.fin) { + [self _handleFrameWithData:_currentFrameData opCode:frame_header.opcode]; + } else { + // TODO add assert that opcode is not a control; + [self _readFrameContinue]; + } + } + } else { + [self _addConsumerWithDataLength:(size_t)frame_header.payload_length callback:^(FSRWebSocket *self, NSData *newData) { + if (isControlFrame) { + [self _handleFrameWithData:newData opCode:frame_header.opcode]; + } else { + if (frame_header.fin) { + [self _handleFrameWithData:self->_currentFrameData opCode:frame_header.opcode]; + } else { + // TODO add assert that opcode is not a control; + [self _readFrameContinue]; + } + + } + } readToCurrentFrame:!isControlFrame unmaskBytes:frame_header.masked]; + } +} + +/* From RFC: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-------+-+-------------+-------------------------------+ + |F|R|R|R| opcode|M| Payload len | Extended payload length | + |I|S|S|S| (4) |A| (7) | (16/64) | + |N|V|V|V| |S| | (if payload len==126/127) | + | |1|2|3| |K| | | + +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + + | Extended payload length continued, if payload len == 127 | + + - - - - - - - - - - - - - - - +-------------------------------+ + | |Masking-key, if MASK set to 1 | + +-------------------------------+-------------------------------+ + | Masking-key (continued) | Payload Data | + +-------------------------------- - - - - - - - - - - - - - - - + + : Payload Data continued ... : + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | Payload Data continued ... | + +---------------------------------------------------------------+ + */ + +static const uint8_t SRFinMask = 0x80; +static const uint8_t SROpCodeMask = 0x0F; +static const uint8_t SRRsvMask = 0x70; +static const uint8_t SRMaskMask = 0x80; +static const uint8_t SRPayloadLenMask = 0x7F; + + +- (void)_readFrameContinue; +{ + assert((_currentFrameCount == 0 && _currentFrameOpcode == 0) || (_currentFrameCount > 0 && _currentFrameOpcode > 0)); + + [self _addConsumerWithDataLength:2 callback:^(FSRWebSocket *self, NSData *data) { + __block frame_header header = {0}; + + const uint8_t *headerBuffer = data.bytes; + assert(data.length >= 2); + + if (headerBuffer[0] & SRRsvMask) { + [self _closeWithProtocolError:@"Server used RSV bits"]; + return; + } + + uint8_t receivedOpcode = (SROpCodeMask & headerBuffer[0]); + + BOOL isControlFrame = (receivedOpcode == SROpCodePing || receivedOpcode == SROpCodePong || receivedOpcode == SROpCodeConnectionClose); + + if (!isControlFrame && receivedOpcode != 0 && self->_currentFrameCount > 0) { + [self _closeWithProtocolError:@"all data frames after the initial data frame must have opcode 0"]; + return; + } + + if (receivedOpcode == 0 && self->_currentFrameCount == 0) { + [self _closeWithProtocolError:@"cannot continue a message"]; + return; + } + + header.opcode = receivedOpcode == 0 ? self->_currentFrameOpcode : receivedOpcode; + + header.fin = !!(SRFinMask & headerBuffer[0]); + + + header.masked = !!(SRMaskMask & headerBuffer[1]); + header.payload_length = SRPayloadLenMask & headerBuffer[1]; + + headerBuffer = NULL; + + if (header.masked) { + [self _closeWithProtocolError:@"Client must receive unmasked data"]; + } + + size_t extra_bytes_needed = header.masked ? sizeof(self->_currentReadMaskKey) : 0; + + if (header.payload_length == 126) { + extra_bytes_needed += sizeof(uint16_t); + } else if (header.payload_length == 127) { + extra_bytes_needed += sizeof(uint64_t); + } + + if (extra_bytes_needed == 0) { + [self _handleFrameHeader:header curData:self->_currentFrameData]; + } else { + [self _addConsumerWithDataLength:extra_bytes_needed callback:^(FSRWebSocket *self, NSData *data) { + size_t mapped_size = data.length; + const void *mapped_buffer = data.bytes; + size_t offset = 0; + + if (header.payload_length == 126) { + assert(mapped_size >= sizeof(uint16_t)); + uint16_t newLen = EndianU16_BtoN(*(uint16_t *)(mapped_buffer)); + header.payload_length = newLen; + offset += sizeof(uint16_t); + } else if (header.payload_length == 127) { + assert(mapped_size >= sizeof(uint64_t)); + header.payload_length = EndianU64_BtoN(*(uint64_t *)(mapped_buffer)); + offset += sizeof(uint64_t); + } else { + assert(header.payload_length < 126 && header.payload_length >= 0); + } + + + if (header.masked) { + assert(mapped_size >= sizeof(self->_currentReadMaskOffset) + offset); + memcpy(self->_currentReadMaskKey, ((uint8_t *)mapped_buffer) + offset, sizeof(self->_currentReadMaskKey)); + } + + [self _handleFrameHeader:header curData:self->_currentFrameData]; + } readToCurrentFrame:NO unmaskBytes:NO]; + } + } readToCurrentFrame:NO unmaskBytes:NO]; +} + +- (void)_readFrameNew; +{ + dispatch_async(_workQueue, ^{ + [self->_currentFrameData setLength:0]; + + self->_currentFrameOpcode = 0; + self->_currentFrameCount = 0; + self->_readOpCount = 0; + self->_currentStringScanPosition = 0; + + [self _readFrameContinue]; + }); +} + +- (void)_pumpWriting; +{ + [self assertOnWorkQueue]; + + NSUInteger dataLength = _outputBuffer.length; + if (dataLength - _outputBufferOffset > 0 && _outputStream.hasSpaceAvailable) { + NSUInteger bytesWritten = [_outputStream write:_outputBuffer.bytes + _outputBufferOffset maxLength:dataLength - _outputBufferOffset]; + if (bytesWritten == -1) { + [self _failWithError:[NSError errorWithDomain:@"org.lolrus.SocketRocket" code:2145 userInfo:[NSDictionary dictionaryWithObject:@"Error writing to stream" forKey:NSLocalizedDescriptionKey]]]; + return; + } + + _outputBufferOffset += bytesWritten; + + if (_outputBufferOffset > 4096 && _outputBufferOffset > (_outputBuffer.length >> 1)) { + _outputBuffer = [[NSMutableData alloc] initWithBytes:(char *)_outputBuffer.bytes + _outputBufferOffset length:_outputBuffer.length - _outputBufferOffset]; + _outputBufferOffset = 0; + } + } + + if (_closeWhenFinishedWriting && + _outputBuffer.length - _outputBufferOffset == 0 && + (_inputStream.streamStatus != NSStreamStatusNotOpen && + _inputStream.streamStatus != NSStreamStatusClosed) && + !_sentClose) { + _sentClose = YES; + + @synchronized (self) { + [_outputStream close]; + [_inputStream close]; + + // TODO: Why are we missing the SocketRocket code to call unscheduleFromRunLoop??? + } + + if (!_failed) { + [self _performDelegateBlock:^{ + if ([self.delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)]) { + [self.delegate webSocket:self didCloseWithCode:self->_closeCode reason:self->_closeReason wasClean:YES]; + } + }]; + } + [self _scheduleCleanup]; + } +} + +- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback; +{ + [self assertOnWorkQueue]; + [self _addConsumerWithScanner:consumer callback:callback dataLength:0]; +} + +- (void)_addConsumerWithDataLength:(size_t)dataLength callback:(data_callback)callback readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes; +{ + [self assertOnWorkQueue]; + assert(dataLength); + + [_consumers addObject:[_consumerPool consumerWithScanner:nil handler:callback bytesNeeded:dataLength readToCurrentFrame:readToCurrentFrame unmaskBytes:unmaskBytes]]; + [self _pumpScanner]; +} + +- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback dataLength:(size_t)dataLength; +{ + [self assertOnWorkQueue]; + [_consumers addObject:[_consumerPool consumerWithScanner:consumer handler:callback bytesNeeded:dataLength readToCurrentFrame:NO unmaskBytes:NO]]; + [self _pumpScanner]; +} + + +- (void)_scheduleCleanup +{ + @synchronized(self) { + if (_cleanupScheduled) { + return; + } + + _cleanupScheduled = YES; + + // Cleanup NSStream delegate's in the same RunLoop used by the streams themselves: + // This way we'll prevent race conditions between handleEvent and SRWebsocket's dealloc + NSTimer *timer = [NSTimer timerWithTimeInterval:(0.0f) target:self selector:@selector(_cleanupSelfReference:) userInfo:nil repeats:NO]; + [[NSRunLoop FSR_networkRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; + } +} + +- (void)_cleanupSelfReference:(NSTimer *)timer +{ + @synchronized(self) { + // Nuke NSStream delegate's + _inputStream.delegate = nil; + _outputStream.delegate = nil; + + // Remove the streams, right now, from the networkRunLoop + [_inputStream close]; + [_outputStream close]; + } + + // Cleanup selfRetain in the same GCD queue as usual + dispatch_async(_workQueue, ^{ + self->_selfRetain = nil; + }); +} + + +static const char CRLFCRLFBytes[] = {'\r', '\n', '\r', '\n'}; + +- (void)_readUntilHeaderCompleteWithCallback:(data_callback)dataHandler; +{ + [self _readUntilBytes:CRLFCRLFBytes length:sizeof(CRLFCRLFBytes) callback:dataHandler]; +} + +- (void)_readUntilBytes:(const void *)bytes length:(size_t)length callback:(data_callback)dataHandler; +{ + // TODO optimize so this can continue from where we last searched + stream_scanner consumer = ^size_t(NSData *data) { + __block size_t found_size = 0; + __block size_t match_count = 0; + + size_t size = data.length; + const unsigned char *buffer = data.bytes; + for (int i = 0; i < size; i++ ) { + if (((const unsigned char *)buffer)[i] == ((const unsigned char *)bytes)[match_count]) { + match_count += 1; + if (match_count == length) { + found_size = i + 1; + break; + } + } else { + match_count = 0; + } + } + return found_size; + }; + [self _addConsumerWithScanner:consumer callback:dataHandler]; +} + + +// Returns true if did work +- (BOOL)_innerPumpScanner { + + BOOL didWork = NO; + + if (self.readyState >= SR_CLOSING) { + return didWork; + } + + if (!_consumers.count) { + return didWork; + } + + size_t curSize = _readBuffer.length - _readBufferOffset; + if (!curSize) { + return didWork; + } + + FSRIOConsumer *consumer = [_consumers objectAtIndex:0]; + + size_t bytesNeeded = consumer.bytesNeeded; + + size_t foundSize = 0; + if (consumer.consumer) { + NSData *tempView = [NSData dataWithBytesNoCopy:(char *)_readBuffer.bytes + _readBufferOffset length:_readBuffer.length - _readBufferOffset freeWhenDone:NO]; + foundSize = consumer.consumer(tempView); + } else { + assert(consumer.bytesNeeded); + if (curSize >= bytesNeeded) { + foundSize = bytesNeeded; + } else if (consumer.readToCurrentFrame) { + foundSize = curSize; + } + } + + NSData *slice = nil; + if (consumer.readToCurrentFrame || foundSize) { + NSRange sliceRange = NSMakeRange(_readBufferOffset, foundSize); + slice = [_readBuffer subdataWithRange:sliceRange]; + + _readBufferOffset += foundSize; + + if (_readBufferOffset > 4096 && _readBufferOffset > (_readBuffer.length >> 1)) { + _readBuffer = [[NSMutableData alloc] initWithBytes:(char *)_readBuffer.bytes + _readBufferOffset length:_readBuffer.length - _readBufferOffset]; _readBufferOffset = 0; + } + + if (consumer.unmaskBytes) { + NSMutableData *mutableSlice = [slice mutableCopy]; + + NSUInteger len = mutableSlice.length; + uint8_t *bytes = mutableSlice.mutableBytes; + + for (int i = 0; i < len; i++) { + bytes[i] = bytes[i] ^ _currentReadMaskKey[_currentReadMaskOffset % sizeof(_currentReadMaskKey)]; + _currentReadMaskOffset += 1; + } + + slice = mutableSlice; + } + + if (consumer.readToCurrentFrame) { + [_currentFrameData appendData:slice]; + + _readOpCount += 1; + + if (_currentFrameOpcode == SROpCodeTextFrame) { + // Validate UTF8 stuff. + size_t currentDataSize = _currentFrameData.length; + if (_currentFrameOpcode == SROpCodeTextFrame && currentDataSize > 0) { + // TODO: Optimize the crap out of this. Don't really have to copy all the data each time + + size_t scanSize = currentDataSize - _currentStringScanPosition; + + NSData *scan_data = [_currentFrameData subdataWithRange:NSMakeRange(_currentStringScanPosition, scanSize)]; + int32_t valid_utf8_size = validate_dispatch_data_partial_string(scan_data); + + if (valid_utf8_size == -1) { + [self closeWithCode:SRStatusCodeInvalidUTF8 reason:@"Text frames must be valid UTF-8"]; + dispatch_async(_workQueue, ^{ + [self _disconnect]; + }); + return didWork; + } else { + _currentStringScanPosition += valid_utf8_size; + } + } + + } + + consumer.bytesNeeded -= foundSize; + + if (consumer.bytesNeeded == 0) { + [_consumers removeObjectAtIndex:0]; + consumer.handler(self, nil); + didWork = YES; + } + } else if (foundSize) { + [_consumers removeObjectAtIndex:0]; + consumer.handler(self, slice); + didWork = YES; + } + } + return didWork; +} + +-(void)_pumpScanner; +{ + [self assertOnWorkQueue]; + + if (!_isPumping) { + _isPumping = YES; + } else { + return; + } + + while ([self _innerPumpScanner]) { + + } + + _isPumping = NO; +} + +//#define NOMASK + +static const size_t SRFrameHeaderOverhead = 32; + +- (void)_sendFrameWithOpcode:(FSROpCode)opcode data:(id)data; +{ + [self assertOnWorkQueue]; + + if (data == nil) { + return; + } + + NSAssert([data isKindOfClass:[NSData class]] || [data isKindOfClass:[NSString class]], @"Function expects nil, NSString or NSData"); + + size_t payloadLength = [data isKindOfClass:[NSString class]] ? [(NSString *)data lengthOfBytesUsingEncoding:NSUTF8StringEncoding] : [data length]; + + NSMutableData *frame = [[NSMutableData alloc] initWithLength:payloadLength + SRFrameHeaderOverhead]; + if (!frame) { + [self closeWithCode:SRStatusCodeMessageTooBig reason:@"Message too big"]; + return; + } + uint8_t *frame_buffer = (uint8_t *)[frame mutableBytes]; + + // set fin + frame_buffer[0] = SRFinMask | opcode; + + BOOL useMask = YES; +#ifdef NOMASK + useMask = NO; +#endif + + if (useMask) { + // set the mask and header + frame_buffer[1] |= SRMaskMask; + } + + size_t frame_buffer_size = 2; + + const uint8_t *unmasked_payload = NULL; + if ([data isKindOfClass:[NSData class]]) { + unmasked_payload = (uint8_t *)[data bytes]; + } else if ([data isKindOfClass:[NSString class]]) { + unmasked_payload = (const uint8_t *)[data UTF8String]; + } else { + assert(NO); + } + + if (payloadLength < 126) { + frame_buffer[1] |= payloadLength; + } else if (payloadLength <= UINT16_MAX) { + frame_buffer[1] |= 126; + *((uint16_t *)(frame_buffer + frame_buffer_size)) = EndianU16_BtoN((uint16_t)payloadLength); + frame_buffer_size += sizeof(uint16_t); + } else { + frame_buffer[1] |= 127; + *((uint64_t *)(frame_buffer + frame_buffer_size)) = EndianU64_BtoN((uint64_t)payloadLength); + frame_buffer_size += sizeof(uint64_t); + } + + if (!useMask) { + for (int i = 0; i < payloadLength; i++) { + frame_buffer[frame_buffer_size] = unmasked_payload[i]; + frame_buffer_size += 1; + } + } else { + uint8_t *mask_key = frame_buffer + frame_buffer_size; + int result = SecRandomCopyBytes(kSecRandomDefault, sizeof(uint32_t), (uint8_t *)mask_key); + assert(result == 0); + frame_buffer_size += sizeof(uint32_t); + + // TODO: could probably optimize this with SIMD + for (int i = 0; i < payloadLength; i++) { + frame_buffer[frame_buffer_size] = unmasked_payload[i] ^ mask_key[i % sizeof(uint32_t)]; + frame_buffer_size += 1; + } + } + + assert(frame_buffer_size <= [frame length]); + frame.length = frame_buffer_size; + + [self _writeData:frame]; +} + +- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode; +{ + __weak __typeof__(self) weakSelf = self; + + // turn on keep-alive for the output stream. + if (eventCode == NSStreamEventOpenCompleted && aStream == _outputStream) { + CFDataRef socketData = CFWriteStreamCopyProperty((CFWriteStreamRef)_outputStream, kCFStreamPropertySocketNativeHandle); + // In rare cases socketData might be nil (there are crash reports out there), in which case we'll have to just + // live without keep-alive :( + if (socketData != nil) { + CFSocketNativeHandle socket; + CFDataGetBytes(socketData, CFRangeMake(0, sizeof(CFSocketNativeHandle)), (UInt8 *)&socket); + CFRelease(socketData); + + int keepAliveOn = 1; + if (setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &keepAliveOn, sizeof(keepAliveOn)) == -1) { + SRFastLog(@"Failed to turn on TCP keepalive for websocket"); + } + } + } + + if (_secure && !_pinnedCertFound && (eventCode == NSStreamEventHasBytesAvailable || eventCode == NSStreamEventHasSpaceAvailable)) { + + NSArray *sslCerts = [_urlRequest FSR_SSLPinnedCertificates]; + if (sslCerts) { + SecTrustRef secTrust = (__bridge SecTrustRef)[aStream propertyForKey:(__bridge id)kCFStreamPropertySSLPeerTrust]; + if (secTrust) { + NSInteger numCerts = SecTrustGetCertificateCount(secTrust); + for (NSInteger i = 0; i < numCerts && !_pinnedCertFound; i++) { + SecCertificateRef cert = SecTrustGetCertificateAtIndex(secTrust, i); + NSData *certData = CFBridgingRelease(SecCertificateCopyData(cert)); + + for (id ref in sslCerts) { + SecCertificateRef trustedCert = (__bridge SecCertificateRef)ref; + NSData *trustedCertData = CFBridgingRelease(SecCertificateCopyData(trustedCert)); + + if ([trustedCertData isEqualToData:certData]) { + _pinnedCertFound = YES; + break; + } + } + } + } + + if (!_pinnedCertFound) { + dispatch_async(_workQueue, ^{ + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : @"Invalid server cert" }; + [weakSelf _failWithError:[NSError errorWithDomain:@"org.lolrus.SocketRocket" code:23556 userInfo:userInfo]]; + }); + return; + } + } + } + + // SRFastLog(@"%@ Got stream event %d", aStream, eventCode); + dispatch_async(_workQueue, ^{ + [weakSelf safeHandleEvent:eventCode stream:aStream]; + }); +} + +- (void)safeHandleEvent:(NSStreamEvent)eventCode stream:(NSStream *)aStream +{ + switch (eventCode) { + case NSStreamEventOpenCompleted: { + SRFastLog(@"NSStreamEventOpenCompleted %@", aStream); + if (self.readyState >= SR_CLOSING) { + return; + } + + + assert(_readBuffer); + + if (self.readyState == SR_CONNECTING && aStream == _inputStream) { + [self didConnect]; + } + [self _pumpWriting]; + [self _pumpScanner]; + break; + } + + case NSStreamEventErrorOccurred: { + // Note: The upstream code for SocketRocket logs the error message, but this causes + // crashes on iOS 13 (https://github.com/firebase/firebase-ios-sdk/issues/3950) + SRFastLog(@"NSStreamEventErrorOccurred %@", aStream); + /// TODO specify error better! + [self _failWithError:aStream.streamError]; + _readBufferOffset = 0; + [_readBuffer setLength:0]; + break; + + } + + case NSStreamEventEndEncountered: { + [self _pumpScanner]; + SRFastLog(@"NSStreamEventEndEncountered %@", aStream); + if (aStream.streamError) { + [self _failWithError:aStream.streamError]; + } else { + dispatch_async(_workQueue, ^{ + if (self.readyState != SR_CLOSED) { + self.readyState = SR_CLOSED; + [self _scheduleCleanup]; + } + + if (!self->_sentClose && !self->_failed) { + self->_sentClose = YES; + // If we get closed in this state it's probably not clean because we should be sending this when we send messages + [self _performDelegateBlock:^{ + if ([self.delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)]) { + [self.delegate webSocket:self didCloseWithCode:0 reason:@"Stream end encountered" wasClean:NO]; + } + }]; + } + }); + } + + break; + } + + case NSStreamEventHasBytesAvailable: { + SRFastLog(@"NSStreamEventHasBytesAvailable %@", aStream); + const NSUInteger bufferSize = 2048; + uint8_t buffer[bufferSize]; + + while (_inputStream.hasBytesAvailable) { + NSInteger bytes_read = [_inputStream read:buffer maxLength:bufferSize]; + + if (bytes_read > 0) { + [_readBuffer appendBytes:buffer length:bytes_read]; + } else if (bytes_read < 0) { + [self _failWithError:_inputStream.streamError]; + } + + if (bytes_read != bufferSize) { + break; + } + }; + [self _pumpScanner]; + break; + } + + case NSStreamEventHasSpaceAvailable: { + SRFastLog(@"NSStreamEventHasSpaceAvailable %@", aStream); + [self _pumpWriting]; + break; + } + + default: + SRFastLog(@"(default) %@", aStream); + break; + } +} + +@end + + +@implementation FSRIOConsumer + +@synthesize bytesNeeded = _bytesNeeded; +@synthesize consumer = _scanner; +@synthesize handler = _handler; +@synthesize readToCurrentFrame = _readToCurrentFrame; +@synthesize unmaskBytes = _unmaskBytes; + +- (void)setupWithScanner:(stream_scanner)scanner handler:(data_callback)handler bytesNeeded:(size_t)bytesNeeded readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes; +{ + _scanner = [scanner copy]; + _handler = [handler copy]; + _bytesNeeded = bytesNeeded; + _readToCurrentFrame = readToCurrentFrame; + _unmaskBytes = unmaskBytes; + assert(_scanner || _bytesNeeded); +} + +@end + +@implementation FSRIOConsumerPool { + NSUInteger _poolSize; + NSMutableArray *_bufferedConsumers; +} + +- (id)initWithBufferCapacity:(NSUInteger)poolSize; +{ + self = [super init]; + if (self) { + _poolSize = poolSize; + _bufferedConsumers = [[NSMutableArray alloc] initWithCapacity:poolSize]; + } + return self; +} + +- (id)init +{ + return [self initWithBufferCapacity:8]; +} + +- (FSRIOConsumer *)consumerWithScanner:(stream_scanner)scanner handler:(data_callback)handler bytesNeeded:(size_t)bytesNeeded readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes; +{ + FSRIOConsumer *consumer = nil; + if (_bufferedConsumers.count) { + consumer = [_bufferedConsumers lastObject]; + [_bufferedConsumers removeLastObject]; + } else { + consumer = [[FSRIOConsumer alloc] init]; + } + + [consumer setupWithScanner:scanner handler:handler bytesNeeded:bytesNeeded readToCurrentFrame:readToCurrentFrame unmaskBytes:unmaskBytes]; + + return consumer; +} + +- (void)returnConsumer:(FSRIOConsumer *)consumer; +{ + if (_bufferedConsumers.count < _poolSize) { + [_bufferedConsumers addObject:consumer]; + } +} + +@end + +@implementation NSURLRequest (FCertificateAdditions) + +- (NSArray *)FSR_SSLPinnedCertificates; +{ + return [NSURLProtocol propertyForKey:@"FSR_SSLPinnedCertificates" inRequest:self]; +} + +@end + +@implementation NSMutableURLRequest (FCertificateAdditions) + +- (NSArray *)FSR_SSLPinnedCertificates; +{ + return [NSURLProtocol propertyForKey:@"FSR_SSLPinnedCertificates" inRequest:self]; +} + +- (void)setFSR_SSLPinnedCertificates:(NSArray *)FSR_SSLPinnedCertificates; +{ + [NSURLProtocol setProperty:FSR_SSLPinnedCertificates forKey:@"FSR_SSLPinnedCertificates" inRequest:self]; +} + +@end + +@implementation NSURL (FSRWebSocket) + +- (NSString *)SR_origin; +{ + NSString *scheme = [self.scheme lowercaseString]; + + if ([scheme isEqualToString:@"wss"]) { + scheme = @"https"; + } else if ([scheme isEqualToString:@"ws"]) { + scheme = @"http"; + } + + if (self.port != nil) { + return [NSString stringWithFormat:@"%@://%@:%@/", scheme, self.host, self.port]; + } else { + return [NSString stringWithFormat:@"%@://%@/", scheme, self.host]; + } +} + +@end + +// #define SR_ENABLE_LOG + +static inline void SRFastLog(NSString *format, ...) { +#ifdef SR_ENABLE_LOG + __block va_list arg_list; + va_start (arg_list, format); + + NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arg_list]; + + va_end(arg_list); + + NSLog(@"[SR] %@", formattedString); +#endif +} + + +#ifdef HAS_ICU + +static inline int32_t validate_dispatch_data_partial_string(NSData *data) { + + const void * contents = [data bytes]; + long size = [data length]; + + const uint8_t *str = (const uint8_t *)contents; + + + UChar32 codepoint = 1; + int32_t offset = 0; + int32_t lastOffset = 0; + while(offset < size && codepoint > 0) { + lastOffset = offset; + U8_NEXT(str, offset, size, codepoint); + } + + if (codepoint == -1) { + // Check to see if the last byte is valid or whether it was just continuing + if (!U8_IS_LEAD(str[lastOffset]) || U8_COUNT_TRAIL_BYTES(str[lastOffset]) + lastOffset < (int32_t)size) { + + size = -1; + } else { + uint8_t leadByte = str[lastOffset]; + U8_MASK_LEAD_BYTE(leadByte, U8_COUNT_TRAIL_BYTES(leadByte)); + + for (int i = lastOffset + 1; i < offset; i++) { + + if (U8_IS_SINGLE(str[i]) || U8_IS_LEAD(str[i]) || !U8_IS_TRAIL(str[i])) { + size = -1; + } + } + + if (size != -1) { + size = lastOffset; + } + } + } + + if (size != -1 && ![[NSString alloc] initWithBytesNoCopy:(char *)[data bytes] length:size encoding:NSUTF8StringEncoding freeWhenDone:NO]) { + size = -1; + } + + return (int32_t)size; +} + +#else + +// This is a hack, and probably not optimal +static inline int32_t validate_dispatch_data_partial_string(NSData *data) { + static const int maxCodepointSize = 3; + + for (int i = 0; i < maxCodepointSize; i++) { + NSString *str = [[NSString alloc] initWithBytesNoCopy:(char *)data.bytes length:data.length - i encoding:NSUTF8StringEncoding freeWhenDone:NO]; + if (str) { + return (int)(data.length - i); + } + } + + return -1; +} + +#endif + +static _FSRRunLoopThread *networkThread = nil; +static NSRunLoop *networkRunLoop = nil; + +@implementation NSRunLoop (FSRWebSocket) + ++ (NSRunLoop *)FSR_networkRunLoop { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + networkThread = [[_FSRRunLoopThread alloc] init]; + networkThread.name = @"com.squareup.SocketRocket.NetworkThread"; + [networkThread start]; + networkRunLoop = networkThread.runLoop; + }); + + return networkRunLoop; +} + +@end + + +@implementation _FSRRunLoopThread { + dispatch_group_t _waitGroup; +} + +@synthesize runLoop = _runLoop; + +- (void)dealloc +{ + sr_dispatch_release(_waitGroup); +} + +- (id)init +{ + self = [super init]; + if (self) { + _waitGroup = dispatch_group_create(); + dispatch_group_enter(_waitGroup); + } + return self; +} + + +/** + * This is the main method of the thread on which the socket events are scheduled in a run loop. + */ +- (void)main; +{ + @autoreleasepool { + _runLoop = [NSRunLoop currentRunLoop]; + dispatch_group_leave(_waitGroup); + + // Add an empty run loop source to prevent runloop from spinning. + CFRunLoopSourceContext sourceCtx = { + .version = 0, + .info = NULL, + .retain = NULL, + .release = NULL, + .copyDescription = NULL, + .equal = NULL, + .hash = NULL, + .schedule = NULL, + .cancel = NULL, + .perform = NULL + }; + CFRunLoopSourceRef source = CFRunLoopSourceCreate(NULL, 0, &sourceCtx); + CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode); + CFRelease(source); + + while ([_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { + + } + assert(NO); + } +} + +- (NSRunLoop *)runLoop; +{ + dispatch_group_wait(_waitGroup, DISPATCH_TIME_FOREVER); + return _runLoop; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/NSData+SRB64Additions.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/NSData+SRB64Additions.h new file mode 100644 index 00000000..bac393bc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/NSData+SRB64Additions.h @@ -0,0 +1,23 @@ +// +// Copyright 2012 Square Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +@interface FSRUtilities : NSObject + ++ (NSString *)base64EncodedStringFromData:(NSData *)data; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/NSData+SRB64Additions.m b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/NSData+SRB64Additions.m new file mode 100644 index 00000000..2be1d842 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/NSData+SRB64Additions.m @@ -0,0 +1,37 @@ +// +// Copyright 2012 Square Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "NSData+SRB64Additions.h" +#import "fbase64.h" + +@implementation FSRUtilities + ++ (NSString *)base64EncodedStringFromData:(NSData *)data { + size_t buffer_size = ((data.length * 3 + 2) / 2); + + char *buffer = (char *)malloc(buffer_size); + + int len = f_b64_ntop(data.bytes, data.length, buffer, buffer_size); + + if (len == -1) { + free(buffer); + return nil; + } else{ + return [[NSString alloc] initWithBytesNoCopy:buffer length:len encoding:NSUTF8StringEncoding freeWhenDone:YES]; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/fbase64.c b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/fbase64.c new file mode 100644 index 00000000..238c23cf --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/fbase64.c @@ -0,0 +1,318 @@ +/* $OpenBSD: base64.c,v 1.5 2006/10/21 09:55:03 otto Exp $ */ + +/* + * Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* + * Portions Copyright (c) 1995 by International Business Machines, Inc. + * + * International Business Machines, Inc. (hereinafter called IBM) grants + * permission under its copyrights to use, copy, modify, and distribute this + * Software with or without fee, provided that the above copyright notice and + * all paragraphs of this notice appear in all copies, and that the name of IBM + * not be used in connection with the marketing of any product incorporating + * the Software or modifications thereof, without specific, written prior + * permission. + * + * To the extent it has a right to do so, IBM grants an immunity from suit + * under its patents, if any, for the use, sale or manufacture of products to + * the extent that such products are used for performing Domain Name System + * dynamic updates in TCP/IP networks by means of the Software. No immunity is + * granted for any product per se or for any other function of any product. + * + * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, + * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN + * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +/* OPENBSD ORIGINAL: lib/libc/net/base64.c */ + + +// +// Distributed with modifications by Firebase ( https://www.firebase.com ) +// + +#if (!defined(HAVE_B64_NTOP) && !defined(HAVE___B64_NTOP)) || (!defined(HAVE_B64_PTON) && !defined(HAVE___B64_PTON)) + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "fbase64.h" + +static const char Base64[] = +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const char Pad64 = '='; + +/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) + The following encoding technique is taken from RFC 1521 by Borenstein + and Freed. It is reproduced here in a slightly edited form for + convenience. + + A 65-character subset of US-ASCII is used, enabling 6 bits to be + represented per printable character. (The extra 65th character, "=", + is used to signify a special processing function.) + + The encoding process represents 24-bit groups of input bits as output + strings of 4 encoded characters. Proceeding from left to right, a + 24-bit input group is formed by concatenating 3 8-bit input groups. + These 24 bits are then treated as 4 concatenated 6-bit groups, each + of which is translated into a single digit in the base64 alphabet. + + Each 6-bit group is used as an index into an array of 64 printable + characters. The character referenced by the index is placed in the + output string. + + Table 1: The Base64 Alphabet + + Value Encoding Value Encoding Value Encoding Value Encoding + 0 A 17 R 34 i 51 z + 1 B 18 S 35 j 52 0 + 2 C 19 T 36 k 53 1 + 3 D 20 U 37 l 54 2 + 4 E 21 V 38 m 55 3 + 5 F 22 W 39 n 56 4 + 6 G 23 X 40 o 57 5 + 7 H 24 Y 41 p 58 6 + 8 I 25 Z 42 q 59 7 + 9 J 26 a 43 r 60 8 + 10 K 27 b 44 s 61 9 + 11 L 28 c 45 t 62 + + 12 M 29 d 46 u 63 / + 13 N 30 e 47 v + 14 O 31 f 48 w (pad) = + 15 P 32 g 49 x + 16 Q 33 h 50 y + + Special processing is performed if fewer than 24 bits are available + at the end of the data being encoded. A full encoding quantum is + always completed at the end of a quantity. When fewer than 24 input + bits are available in an input group, zero bits are added (on the + right) to form an integral number of 6-bit groups. Padding at the + end of the data is performed using the '=' character. + + Since all base64 input is an integral number of octets, only the + ------------------------------------------------- + following cases can arise: + + (1) the final quantum of encoding input is an integral + multiple of 24 bits; here, the final unit of encoded + output will be an integral multiple of 4 characters + with no "=" padding, + (2) the final quantum of encoding input is exactly 8 bits; + here, the final unit of encoded output will be two + characters followed by two "=" padding characters, or + (3) the final quantum of encoding input is exactly 16 bits; + here, the final unit of encoded output will be three + characters followed by one "=" padding character. + */ + +#if !defined(HAVE_B64_NTOP) && !defined(HAVE___B64_NTOP) +int +f_b64_ntop(u_char const *src, size_t srclength, char *target, size_t targsize) +{ + size_t datalength = 0; + u_char input[3]; + u_char output[4]; + u_int i; + + while (2 < srclength) { + input[0] = *src++; + input[1] = *src++; + input[2] = *src++; + srclength -= 3; + + output[0] = input[0] >> 2; + output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); + output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); + output[3] = input[2] & 0x3f; + + if (datalength + 4 > targsize) + return (-1); + target[datalength++] = Base64[output[0]]; + target[datalength++] = Base64[output[1]]; + target[datalength++] = Base64[output[2]]; + target[datalength++] = Base64[output[3]]; + } + + /* Now we worry about padding. */ + if (0 != srclength) { + /* Get what's left. */ + input[0] = input[1] = input[2] = '\0'; + for (i = 0; i < srclength; i++) + input[i] = *src++; + + output[0] = input[0] >> 2; + output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); + output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); + + if (datalength + 4 > targsize) + return (-1); + target[datalength++] = Base64[output[0]]; + target[datalength++] = Base64[output[1]]; + if (srclength == 1) + target[datalength++] = Pad64; + else + target[datalength++] = Base64[output[2]]; + target[datalength++] = Pad64; + } + if (datalength >= targsize) + return (-1); + target[datalength] = '\0'; /* Returned value doesn't count \0. */ + return (int)(datalength); +} +#endif /* !defined(HAVE_B64_NTOP) && !defined(HAVE___B64_NTOP) */ + +#if !defined(HAVE_B64_PTON) && !defined(HAVE___B64_PTON) + +/* skips all whitespace anywhere. + converts characters, four at a time, starting at (or after) + src from base - 64 numbers into three 8 bit bytes in the target area. + it returns the number of data bytes stored at the target, or -1 on error. + */ + +int +f_b64_pton(char const *src, u_char *target, size_t targsize) +{ + u_int tarindex, state; + int ch; + char *pos; + + state = 0; + tarindex = 0; + + while ((ch = *src++) != '\0') { + if (isspace(ch)) /* Skip whitespace anywhere. */ + continue; + + if (ch == Pad64) + break; + + pos = strchr(Base64, ch); + if (pos == 0) /* A non-base64 character. */ + return (-1); + + switch (state) { + case 0: + if (target) { + if (tarindex >= targsize) + return (-1); + target[tarindex] = (pos - Base64) << 2; + } + state = 1; + break; + case 1: + if (target) { + if (tarindex + 1 >= targsize) + return (-1); + target[tarindex] |= (pos - Base64) >> 4; + target[tarindex+1] = ((pos - Base64) & 0x0f) + << 4 ; + } + tarindex++; + state = 2; + break; + case 2: + if (target) { + if (tarindex + 1 >= targsize) + return (-1); + target[tarindex] |= (pos - Base64) >> 2; + target[tarindex+1] = ((pos - Base64) & 0x03) + << 6; + } + tarindex++; + state = 3; + break; + case 3: + if (target) { + if (tarindex >= targsize) + return (-1); + target[tarindex] |= (pos - Base64); + } + tarindex++; + state = 0; + break; + } + } + + /* + * We are done decoding Base-64 chars. Let's see if we ended + * on a byte boundary, and/or with erroneous trailing characters. + */ + + if (ch == Pad64) { /* We got a pad char. */ + ch = *src++; /* Skip it, get next. */ + switch (state) { + case 0: /* Invalid = in first position */ + case 1: /* Invalid = in second position */ + return (-1); + + case 2: /* Valid, means one byte of info */ + /* Skip any number of spaces. */ + for (; ch != '\0'; ch = *src++) + if (!isspace(ch)) + break; + /* Make sure there is another trailing = sign. */ + if (ch != Pad64) + return (-1); + ch = *src++; /* Skip the = */ + /* Fall through to "single trailing =" case. */ + /* FALLTHROUGH */ + + case 3: /* Valid, means two bytes of info */ + /* + * We know this char is an =. Is there anything but + * whitespace after it? + */ + for (; ch != '\0'; ch = *src++) + if (!isspace(ch)) + return (-1); + + /* + * Now make sure for cases 2 and 3 that the "extra" + * bits that slopped past the last full byte were + * zeros. If we don't check them, they become a + * subliminal channel. + */ + if (target && target[tarindex] != 0) + return (-1); + } + } else { + /* + * We ended by seeing the end of the string. Make sure we + * have no partial bytes lying around. + */ + if (state != 0) + return (-1); + } + + return (tarindex); +} + +#endif /* !defined(HAVE_B64_PTON) && !defined(HAVE___B64_PTON) */ +#endif diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/fbase64.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/fbase64.h new file mode 100644 index 00000000..a9bf1427 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/SocketRocket/fbase64.h @@ -0,0 +1,33 @@ +// Copyright 2012 Square Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef FSocketRocket_base64_h +#define FSocketRocket_base64_h + +#include + +extern int +f_b64_ntop(u_char const *src, + size_t srclength, + char *target, + size_t targsize); + +extern int +f_b64_pton(char const *src, + u_char *target, + size_t targsize); + + +#endif diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/Wrap-leveldb/APLevelDB.h b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/Wrap-leveldb/APLevelDB.h new file mode 100644 index 00000000..c0baa224 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/Wrap-leveldb/APLevelDB.h @@ -0,0 +1,105 @@ +// +// APLevelDB.h +// +// Created by Adam Preble on 1/23/12. +// Copyright (c) 2012 Adam Preble. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +extern NSString * const APLevelDBErrorDomain; + +@class APLevelDBIterator; +@protocol APLevelDBWriteBatch; + +@interface APLevelDB : NSObject + +@property (nonatomic, readonly, strong) NSString *path; + ++ (APLevelDB *)levelDBWithPath:(NSString *)path error:(NSError *__autoreleasing*)errorOut; +- (void)close; + +- (BOOL)setData:(NSData *)data forKey:(NSString *)key; +- (BOOL)setString:(NSString *)str forKey:(NSString *)key; + +- (NSData *)dataForKey:(NSString *)key; +- (NSString *)stringForKey:(NSString *)key; + +- (BOOL)removeKey:(NSString *)key; + +- (NSArray *)allKeys; + +- (void)enumerateKeys:(void (^)(NSString *key, BOOL *stop))block; +- (void)enumerateKeysWithPrefix:(NSString *)prefix usingBlock:(void (^)(NSString *key, BOOL *stop))block; + +- (void)enumerateKeysAndValuesAsStrings:(void (^)(NSString *key, NSString *value, BOOL *stop))block; +- (void)enumerateKeysWithPrefix:(NSString *)prefix asStrings:(void (^)(NSString *key, NSString *value, BOOL *stop))block; + +- (void)enumerateKeysAndValuesAsData:(void (^)(NSString *key, NSData *value, BOOL *stop))block; +- (void)enumerateKeysWithPrefix:(NSString *)prefix asData:(void (^)(NSString *key, NSData *value, BOOL *stop))block; + +- (NSUInteger)approximateSizeFrom:(NSString *)from to:(NSString *)to; +- (NSUInteger)exactSizeFrom:(NSString *)from to:(NSString *)to; + +// Objective-C Subscripting Support: +// The database object supports subscripting for string-string and string-data key-value access and assignment. +// Examples: +// db[@"key"] = @"value"; +// db[@"key"] = [NSData data]; +// NSString *s = db[@"key"]; +// An NSInvalidArgumentException is raised if the key is not an NSString, or if the assigned object is not an +// instance of NSString or NSData. +- (id)objectForKeyedSubscript:(id)key; +- (void)setObject:(id)object forKeyedSubscript:(id)key; + +// Batch write/atomic update support: +- (id)beginWriteBatch; + +@end + + +@interface APLevelDBIterator : NSObject + ++ (id)iteratorWithLevelDB:(APLevelDB *)db; + +// Designated initializer: +- (id)initWithLevelDB:(APLevelDB *)db; + +- (BOOL)seekToKey:(NSString *)key; +- (NSString *)nextKey; +- (NSString *)key; +- (NSString *)valueAsString; +- (NSData *)valueAsData; + +@end + + +@protocol APLevelDBWriteBatch + +- (void)setData:(NSData *)data forKey:(NSString *)key; +- (void)setString:(NSString *)str forKey:(NSString *)key; + +- (void)removeKey:(NSString *)key; + +// Remove all of the buffered sets and removes: +- (void)clear; +- (BOOL)commit; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/Wrap-leveldb/APLevelDB.mm b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/Wrap-leveldb/APLevelDB.mm new file mode 100644 index 00000000..cdecce68 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Firebase/Database/third_party/Wrap-leveldb/APLevelDB.mm @@ -0,0 +1,500 @@ +// +// APLevelDB.m +// +// Created by Adam Preble on 1/23/12. +// Copyright (c) 2012 Adam Preble. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +// Portions of APLevelDB are based on LevelDB-ObjC: +// https://github.com/hoisie/LevelDB-ObjC +// Specifically the SliceFromString/StringFromSlice macros, and the structure of +// the enumeration methods. License for those potions follows: +// +// Copyright (c) 2011 Pave Labs +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#import "APLevelDB.h" + +#import "leveldb/db.h" +#import "leveldb/options.h" +#import "leveldb/write_batch.h" + +NSString * const APLevelDBErrorDomain = @"APLevelDBErrorDomain"; + +#define SliceFromString(_string_) (leveldb::Slice((char *)[_string_ UTF8String], [_string_ lengthOfBytesUsingEncoding:NSUTF8StringEncoding])) +#define StringFromSlice(_slice_) ([[NSString alloc] initWithBytes:_slice_.data() length:_slice_.size() encoding:NSUTF8StringEncoding]) + + +@interface APLevelDBWriteBatch : NSObject { + @package + leveldb::WriteBatch _batch; +} + +@property (nonatomic, strong) APLevelDB *levelDB; + +- (id)initWithLevelDB:(APLevelDB *)levelDB; +@end + + +#pragma mark - APLevelDB + +@interface APLevelDB () { + leveldb::DB *_db; + leveldb::ReadOptions _readOptions; + leveldb::WriteOptions _writeOptions; +} +- (id)initWithPath:(NSString *)path error:(NSError **)errorOut; ++ (leveldb::Options)defaultCreateOptions; +@property (nonatomic, readonly) leveldb::DB *db; +@end + + +@implementation APLevelDB + +@synthesize path = _path; +@synthesize db = _db; + ++ (APLevelDB *)levelDBWithPath:(NSString *)path error:(NSError *__autoreleasing *)errorOut +{ + return [[APLevelDB alloc] initWithPath:path error:errorOut]; +} + +- (id)initWithPath:(NSString *)path error:(NSError *__autoreleasing *)errorOut +{ + if ((self = [super init])) + { + _path = path; + + leveldb::Options options = [[self class] defaultCreateOptions]; + + leveldb::Status status = leveldb::DB::Open(options, [_path UTF8String], &_db); + + if (!status.ok()) + { + if (errorOut) + { + NSString *statusString = [[NSString alloc] initWithCString:status.ToString().c_str() encoding:NSUTF8StringEncoding]; + *errorOut = [NSError errorWithDomain:APLevelDBErrorDomain + code:0 + userInfo:[NSDictionary dictionaryWithObjectsAndKeys:statusString, NSLocalizedDescriptionKey, nil]]; + } + return nil; + } + + _writeOptions.sync = false; + } + return self; +} + +- (void)close { + if (_db != NULL) { + delete _db; + _db = NULL; + } +} + +- (void)dealloc +{ + if (_db != NULL) { + delete _db; + _db = NULL; + } +} + ++ (leveldb::Options)defaultCreateOptions +{ + leveldb::Options options; + options.create_if_missing = true; + return options; +} + +- (BOOL)setData:(NSData *)data forKey:(NSString *)key +{ + leveldb::Slice keySlice = SliceFromString(key); + leveldb::Slice valueSlice = leveldb::Slice((const char *)[data bytes], (size_t)[data length]); + leveldb::Status status = _db->Put(_writeOptions, keySlice, valueSlice); + return (status.ok() == true); +} + +- (BOOL)setString:(NSString *)str forKey:(NSString *)key +{ + // This could have been based on + leveldb::Slice keySlice = SliceFromString(key); + leveldb::Slice valueSlice = SliceFromString(str); + leveldb::Status status = _db->Put(_writeOptions, keySlice, valueSlice); + return (status.ok() == true); +} + +- (NSData *)dataForKey:(NSString *)key +{ + leveldb::Slice keySlice = SliceFromString(key); + std::string valueCPPString; + leveldb::Status status = _db->Get(_readOptions, keySlice, &valueCPPString); + + if (!status.ok()) + return nil; + else + return [NSData dataWithBytes:valueCPPString.data() length:valueCPPString.size()]; +} + +- (NSString *)stringForKey:(NSString *)key +{ + leveldb::Slice keySlice = SliceFromString(key); + std::string valueCPPString; + leveldb::Status status = _db->Get(_readOptions, keySlice, &valueCPPString); + + // We assume (dangerously?) UTF-8 string encoding: + if (!status.ok()) + return nil; + else + return [[NSString alloc] initWithBytes:valueCPPString.data() length:valueCPPString.size() encoding:NSUTF8StringEncoding]; +} + +- (BOOL)removeKey:(NSString *)key +{ + leveldb::Slice keySlice = SliceFromString(key); + leveldb::Status status = _db->Delete(_writeOptions, keySlice); + return (status.ok() == true); +} + +- (NSArray *)allKeys +{ + NSMutableArray *keys = [NSMutableArray array]; + [self enumerateKeys:^(NSString *key, BOOL *stop) { + [keys addObject:key]; + }]; + return keys; +} + +- (void)enumerateKeysAndValuesAsStrings:(void (^)(NSString *key, NSString *value, BOOL *stop))block +{ + [self enumerateKeysWithPrefix:@"" asStrings:block]; +} + +- (void)enumerateKeysWithPrefix:(NSString *)prefixString asStrings:(void (^)(NSString *, NSString *, BOOL *))block +{ + @autoreleasepool { + BOOL stop = NO; + leveldb::Iterator* iter = _db->NewIterator(leveldb::ReadOptions()); + leveldb::Slice prefix = SliceFromString(prefixString); + for (iter->Seek(prefix); iter->Valid(); iter->Next()) { + leveldb::Slice key = iter->key(), value = iter->value(); + if (key.starts_with(prefix)) { + NSString *k = StringFromSlice(key); + NSString *v = [[NSString alloc] initWithBytes:value.data() length:value.size() encoding:NSUTF8StringEncoding]; + block(k, v, &stop); + if (stop) + break; + } else { + break; + } + } + + delete iter; + } +} + +- (void)enumerateKeys:(void (^)(NSString *key, BOOL *stop))block +{ + [self enumerateKeysWithPrefix:@"" usingBlock:block]; +} + +- (void)enumerateKeysWithPrefix:(NSString *)prefixString usingBlock:(void (^)(NSString *key, BOOL *stop))block; +{ + @autoreleasepool { + BOOL stop = NO; + leveldb::Slice prefix = SliceFromString(prefixString); + leveldb::Iterator* iter = _db->NewIterator(leveldb::ReadOptions()); + for (iter->Seek(prefix); iter->Valid(); iter->Next()) { + leveldb::Slice key = iter->key(); + if (key.starts_with(prefix)) { + NSString *k = StringFromSlice(key); + block(k, &stop); + if (stop) + break; + } else { + break; + } + } + + delete iter; + } +} + +- (void)enumerateKeysAndValuesAsData:(void (^)(NSString *key, NSData *data, BOOL *stop))block +{ + [self enumerateKeysWithPrefix:@"" asData:block]; +} + +- (void)enumerateKeysWithPrefix:(NSString *)prefixString asData:(void (^)(NSString *, NSData *, BOOL *))block +{ + @autoreleasepool { + BOOL stop = NO; + leveldb::Iterator* iter = _db->NewIterator(leveldb::ReadOptions()); + leveldb::Slice prefix = SliceFromString(prefixString); + for (iter->Seek(prefix); iter->Valid(); iter->Next()) { + leveldb::Slice key = iter->key(), value = iter->value(); + if (key.starts_with(prefix)) { + NSString *k = StringFromSlice(key); + NSData *data = [NSData dataWithBytes:value.data() length:value.size()]; + block(k, data, &stop); + if (stop) + break; + } else { + break; + } + } + + delete iter; + } +} + +- (NSUInteger)exactSizeFrom:(NSString *)from to:(NSString *)to { + NSUInteger size = 0; + leveldb::Iterator* iter = _db->NewIterator(leveldb::ReadOptions()); + leveldb::Slice fromSlice = SliceFromString(from); + leveldb::Slice toSlice = SliceFromString(to); + iter->Seek(fromSlice); + while (iter->Valid() && iter->key().compare(toSlice) <= 0) { + size += iter->value().size(); + iter->Next(); + } + delete iter; + return size; +} + + +- (NSUInteger)approximateSizeFrom:(NSString *)from to:(NSString *)to { + leveldb::Range ranges[1]; + leveldb::Slice fromSlice = SliceFromString(from); + leveldb::Slice toSlice = SliceFromString(to); + ranges[0] = leveldb::Range(fromSlice, toSlice); + uint64_t sizes[1]; + _db->GetApproximateSizes(ranges, 1, sizes); + return (NSUInteger)sizes[0]; +} + +#pragma mark - Subscripting Support + +- (id)objectForKeyedSubscript:(id)key +{ + if (![key respondsToSelector: @selector(componentsSeparatedByString:)]) + { + [NSException raise:NSInvalidArgumentException format:@"key must be an NSString"]; + } + return [self stringForKey:key]; +} +- (void)setObject:(id)thing forKeyedSubscript:(id)key +{ + id idKey = (id) key; + if (![idKey respondsToSelector: @selector(componentsSeparatedByString:)]) + { + [NSException raise:NSInvalidArgumentException format:@"key must be NSString or NSData"]; + } + + if ([thing respondsToSelector:@selector(componentsSeparatedByString:)]) + [self setString:thing forKey:(NSString *)key]; + else if ([thing respondsToSelector:@selector(subdataWithRange:)]) + [self setData:thing forKey:(NSString *)key]; + else + [NSException raise:NSInvalidArgumentException format:@"object must be NSString or NSData"]; +} + +#pragma mark - Atomic Updates + +- (id)beginWriteBatch +{ + APLevelDBWriteBatch *batch = [[APLevelDBWriteBatch alloc] initWithLevelDB:self]; + return batch; +} + +- (BOOL)commitWriteBatch:(id)theBatch +{ + if (!theBatch) + return NO; + + APLevelDBWriteBatch *batch = theBatch; + + leveldb::Status status; + status = _db->Write(_writeOptions, &batch->_batch); + return (status.ok() == true); +} + +@end + + +#pragma mark - APLevelDBIterator + +@interface APLevelDBIterator () { + leveldb::Iterator *_iter; +} + +@property (nonatomic, strong) APLevelDB *levelDB; +@end + + + +@implementation APLevelDBIterator + ++ (id)iteratorWithLevelDB:(APLevelDB *)db +{ + APLevelDBIterator *iter = [[[self class] alloc] initWithLevelDB:db]; + return iter; +} + +- (id)initWithLevelDB:(APLevelDB *)db +{ + if ((self = [super init])) + { + // Hold on to the database so it doesn't get deallocated before the iterator is deallocated + self->_levelDB = db; + _iter = db.db->NewIterator(leveldb::ReadOptions()); + _iter->SeekToFirst(); + if (!_iter->Valid()) + return nil; + } + return self; +} + +- (id)init +{ + [NSException raise:@"BadInitializer" format:@"Use the designated initializer, -initWithLevelDB:, instead."]; + return nil; +} + +- (void)dealloc +{ + self->_levelDB = nil; + delete _iter; + _iter = NULL; +} + +- (BOOL)seekToKey:(NSString *)key +{ + leveldb::Slice target = SliceFromString(key); + _iter->Seek(target); + return _iter->Valid() == true; +} + +- (void)seekToFirst +{ + _iter->SeekToFirst(); +} + +- (void)seekToLast +{ + _iter->SeekToLast(); +} + +- (NSString *)nextKey +{ + _iter->Next(); + return [self key]; +} + +- (NSString *)key +{ + if (_iter->Valid() == false) + return nil; + leveldb::Slice value = _iter->key(); + return StringFromSlice(value); +} + +- (NSString *)valueAsString +{ + if (_iter->Valid() == false) + return nil; + leveldb::Slice value = _iter->value(); + return StringFromSlice(value); +} + +- (NSData *)valueAsData +{ + if (_iter->Valid() == false) + return nil; + leveldb::Slice value = _iter->value(); + return [NSData dataWithBytes:value.data() length:value.size()]; +} + +@end + + + +#pragma mark - APLevelDBWriteBatch + +@implementation APLevelDBWriteBatch + +- (id)initWithLevelDB:(APLevelDB *)levelDB { + self = [super init]; + if (self != nil) { + self->_levelDB = levelDB; + } + return self; +} + +- (void)setData:(NSData *)data forKey:(NSString *)key +{ + leveldb::Slice keySlice = SliceFromString(key); + leveldb::Slice valueSlice = leveldb::Slice((const char *)[data bytes], (size_t)[data length]); + _batch.Put(keySlice, valueSlice); +} +- (void)setString:(NSString *)str forKey:(NSString *)key +{ + leveldb::Slice keySlice = SliceFromString(key); + leveldb::Slice valueSlice = SliceFromString(str); + _batch.Put(keySlice, valueSlice); +} + +- (void)removeKey:(NSString *)key +{ + leveldb::Slice keySlice = SliceFromString(key); + _batch.Delete(keySlice); +} + +- (void)clear +{ + _batch.Clear(); +} + +- (BOOL)commit { + return [self.levelDB commitWriteBatch:self]; +} + +@end + diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRAppInternal.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRAppInternal.h new file mode 100644 index 00000000..9a0c943d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRAppInternal.h @@ -0,0 +1,173 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRApp.h" +#else +#import +#endif + +// The has_include is a workaround so the old IID needed for the FIS tests can find FIRErrors.h +#if __has_include("FirebaseCore/Sources/Private/FIRErrors.h") +#import "FirebaseCore/Sources/Private/FIRErrors.h" +#else +#import +#endif + +@class FIRComponentContainer; +@protocol FIRLibrary; + +/** + * The internal interface to FIRApp. This is meant for first-party integrators, who need to receive + * FIRApp notifications, log info about the success or failure of their configuration, and access + * other internal functionality of FIRApp. + * + * TODO(b/28296561): Restructure this header. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; + +/** + * The format string for the User Defaults key used for storing the data collection enabled flag. + * This includes formatting to append the Firebase App's name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** + * A notification fired containing diagnostic information when SDK errors occur. + */ +extern NSString *const kFIRAppDiagnosticsNotification; + +/** @var FIRAuthStateDidChangeInternalNotification + @brief The name of the @c NSNotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FIRAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FIRAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FIRAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FIRApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FIRAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/* + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * Creates an error for failing to configure a subspec service. This method is called by each + * FIRApp notification listener. + */ ++ (NSError *)errorForSubspecConfigurationFailureWithDomain:(NSString *)domain + errorCode:(FIRErrorCode)code + service:(NSString *)service + reason:(NSString *)reason; +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Used by each SDK to send logs about SDK configuration status to Clearcut. + * + * @note This API is a no-op, please remove calls to it. + */ +- (void)sendLogsWithServiceName:(NSString *)serviceName + version:(NSString *)version + error:(NSError *)error; + +/** + * Can be used by the unit tests in eack SDK to reset FIRApp. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponent.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponent.h new file mode 100644 index 00000000..cb51ee70 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponent.h @@ -0,0 +1,91 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +@class FIRDependency; + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the Component. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// An array of dependencies for the component. +@property(nonatomic, copy, readonly) NSArray *dependencies; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param dependencies - Any dependencies the `implementingClass` has, optional or required. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:dependencies:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponentContainer.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponentContainer.h new file mode 100644 index 00000000..db2bafef --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponentContainer.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponentType.h") +#import "FirebaseCore/Sources/Private/FIRComponentType.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#else +#import +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant:` call. These classes should conform to `FIRComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Unavailable. Use the `container` property on `FIRApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponentType.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponentType.h new file mode 100644 index 00000000..6f2aca7b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRComponentType.h @@ -0,0 +1,34 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (T)instanceForProtocol:(Protocol *)protocol inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h new file mode 100644 index 00000000..76c0c05f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRDiagnosticsData; +@class FIROptions; + +NS_ASSUME_NONNULL_BEGIN + +/** Connects FIRCore with the CoreDiagnostics library. */ +@interface FIRCoreDiagnosticsConnector : NSObject + +/** Logs FirebaseCore related data. + * + * @param options The options object containing data to log. + */ ++ (void)logCoreTelemetryWithOptions:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRDependency.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRDependency.h new file mode 100644 index 00000000..46e9b7ea --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRDependency.h @@ -0,0 +1,45 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A dependency on a specific protocol's functionality. +NS_SWIFT_NAME(Dependency) +@interface FIRDependency : NSObject + +/// The protocol describing functionality being depended on. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// A flag to specify if the dependency is required or not. +@property(nonatomic, readonly) BOOL isRequired; + +/// Initializes a dependency that is required. Calls `initWithProtocol:isRequired` with `YES` for +/// the required parameter. +/// Creates a required dependency on the specified protocol's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol; + +/// Creates a dependency on the specified protocol's functionality and specify if it's required for +/// the class's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol isRequired:(BOOL)required; + +/// Use `dependencyWithProtocol:isRequired:` instead. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRErrorCode.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRErrorCode.h new file mode 100644 index 00000000..c90d9eec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRErrorCode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** Error codes in Firebase error domain. */ +typedef NS_ENUM(NSInteger, FIRErrorCode) { + /** + * Unknown error. + */ + FIRErrorCodeUnknown = 0, + /** + * Loading data from the GoogleService-Info.plist file failed. This is a fatal error and should + * not be ignored. Further calls to the API will fail and/or possibly cause crashes. + */ + FIRErrorCodeInvalidPlistFile = -100, + + /** + * Validating the Google App ID format failed. + */ + FIRErrorCodeInvalidAppID = -101, + + /** + * Error code for failing to configure a specific service. It's deprecated, but + * still used after copybara. + */ + FIRErrorCodeConfigFailed = -114, +}; diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRErrors.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRErrors.h new file mode 100644 index 00000000..19e47328 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRErrors.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#include "FIRErrorCode.h" + +extern NSString *const kFirebaseErrorDomain; +extern NSString *const kFirebaseConfigErrorDomain; +extern NSString *const kFirebaseCoreErrorDomain; +extern NSString *const kFirebasePerfErrorDomain; diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h new file mode 100644 index 00000000..bfff73e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h @@ -0,0 +1,39 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRHeartbeatInfo : NSObject + +// Enum representing the different heartbeat codes. +typedef NS_ENUM(NSInteger, FIRHeartbeatInfoCode) { + FIRHeartbeatInfoCodeNone = 0, + FIRHeartbeatInfoCodeSDK = 1, + FIRHeartbeatInfoCodeGlobal = 2, + FIRHeartbeatInfoCodeCombined = 3, +}; + +/** + * Get heartbeat code requred for the sdk. + * @param heartbeatTag String representing the sdk heartbeat tag. + * @return Heartbeat code indicating whether or not an sdk/global heartbeat + * needs to be sent + */ ++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRLibrary.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRLibrary.h new file mode 100644 index 00000000..e7a9e077 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRLibrary.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponent.h") +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#else +#import +#endif + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more FIRComponents that will be registered in +/// FIRApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@optional +/// Implement this method if the library needs notifications for lifecycle events. This method is +/// called when the developer calls `FirebaseApp.configure()`. ++ (void)configureWithApp:(FIRApp *)app; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRLogger.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRLogger.h new file mode 100644 index 00000000..6fd77844 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIRLogger.h @@ -0,0 +1,156 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRLoggerLevel.h" +#else +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern FIRLoggerService kFIRLoggerABTesting; +extern FIRLoggerService kFIRLoggerAdMob; +extern FIRLoggerService kFIRLoggerAnalytics; +extern FIRLoggerService kFIRLoggerAuth; +extern FIRLoggerService kFIRLoggerCrash; +extern FIRLoggerService kFIRLoggerCore; +extern FIRLoggerService kFIRLoggerMLKit; +extern FIRLoggerService kFIRLoggerPerf; +extern FIRLoggerService kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to YES, the logging level for Analytics will be set to FIRLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Changes the default logging level of FIRLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FIRLoggerLevelNotice if the app is running from App Store. + * (required) log level (one of the FIRLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FIRLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + FIRLoggerService service, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FIRLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +@interface FIRLoggerWrapper : NSObject + +/** + * Objective-C wrapper for FIRLogBasic to allow weak linking to FIRLogger + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ + ++ (void)logWithLevel:(FIRLoggerLevel)level + withService:(FIRLoggerService)service + withCode:(NSString *)messageCode + withMessage:(NSString *)message + withArgs:(va_list)args; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIROptionsInternal.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIROptionsInternal.h new file mode 100644 index 00000000..acaf4586 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FIROptionsInternal.h @@ -0,0 +1,119 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIROptions.h" +#else +#import +#endif + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * This header file exposes the initialization of FIROptions to internal use. + */ +@interface FIROptions () + +/** + * resetDefaultOptions and initInternalWithOptionsDictionary: are exposed only for unit tests. + */ ++ (void)resetDefaultOptions; + +/** + * Initializes the options with dictionary. The above strings are the keys of the dictionary. + * This is the designated initializer. + */ +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)serviceInfoDictionary; + +/** + * defaultOptions and defaultOptionsDictionary are exposed in order to be used in FIRApp and + * other first party services. + */ ++ (FIROptions *)defaultOptions; + ++ (NSDictionary *)defaultOptionsDictionary; + +/** + * Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at + * runtime. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet; + +/** + * Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless + * explicitly disabled in GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionEnabled; + +/** + * Whether or not Analytics Collection was completely disabled. If YES, then + * isAnalyticsCollectionEnabled will be NO. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionDeactivated; + +/** + * The version ID of the client library, e.g. @"1100000". + */ +@property(nonatomic, readonly, copy) NSString *libraryVersionID; + +/** + * The flag indicating whether this object was constructed with the values in the default plist + * file. + */ +@property(nonatomic) BOOL usingOptionsFromDefaultPlist; + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isMeasurementEnabled; + +/** + * Whether or not Analytics was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isAnalyticsEnabled; + +/** + * Whether or not SignIn was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isSignInEnabled; + +/** + * Whether or not editing is locked. This should occur after FIROptions has been set on a FIRApp. + */ +@property(nonatomic, getter=isEditingLocked) BOOL editingLocked; + +@end diff --git a/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FirebaseCoreInternal.h b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FirebaseCoreInternal.h new file mode 100644 index 00000000..93af6cb8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/FirebaseCore/Sources/Private/FirebaseCoreInternal.h @@ -0,0 +1,31 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An umbrella header, for any other libraries in this repo to access Firebase Public and Private +// headers. Any package manager complexity should be handled here. + +#if SWIFT_PACKAGE +@import FirebaseCore; +#else +#import +#endif + +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" +#import "FirebaseCore/Sources/Private/FIRDependency.h" +#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" diff --git a/MyExperiences copy/Pods/FirebaseDatabase/Interop/Auth/Public/FIRAuthInterop.h b/MyExperiences copy/Pods/FirebaseDatabase/Interop/Auth/Public/FIRAuthInterop.h new file mode 100644 index 00000000..a33da7c9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/Interop/Auth/Public/FIRAuthInterop.h @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRAuthInterop_h +#define FIRAuthInterop_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRTokenCallback + @brief The type of block which gets called when a token is ready. + */ +typedef void (^FIRTokenCallback)(NSString *_Nullable token, NSError *_Nullable error) + NS_SWIFT_NAME(TokenCallback); + +/// Common methods for Auth interoperability. +NS_SWIFT_NAME(AuthInterop) +@protocol FIRAuthInterop + +/// Retrieves the Firebase authentication token, possibly refreshing it if it has expired. +- (void)getTokenForcingRefresh:(BOOL)forceRefresh withCallback:(FIRTokenCallback)callback; + +/// Get the current Auth user's UID. Returns nil if there is no user signed in. +- (nullable NSString *)getUserID; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRAuthInterop_h */ diff --git a/MyExperiences copy/Pods/FirebaseDatabase/LICENSE b/MyExperiences copy/Pods/FirebaseDatabase/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/FirebaseDatabase/README.md b/MyExperiences copy/Pods/FirebaseDatabase/README.md new file mode 100644 index 00000000..d778205f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseDatabase/README.md @@ -0,0 +1,311 @@ +[![Version](https://img.shields.io/cocoapods/v/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) + +[![Actions Status][gh-abtesting-badge]][gh-actions] +[![Actions Status][gh-auth-badge]][gh-actions] +[![Actions Status][gh-core-badge]][gh-actions] +[![Actions Status][gh-crashlytics-badge]][gh-actions] +[![Actions Status][gh-database-badge]][gh-actions] +[![Actions Status][gh-datatransport-badge]][gh-actions] +[![Actions Status][gh-dynamiclinks-badge]][gh-actions] +[![Actions Status][gh-firebasepod-badge]][gh-actions] +[![Actions Status][gh-firestore-badge]][gh-actions] +[![Actions Status][gh-functions-badge]][gh-actions] +[![Actions Status][gh-inappmessaging-badge]][gh-actions] +[![Actions Status][gh-interop-badge]][gh-actions] +[![Actions Status][gh-messaging-badge]][gh-actions] +[![Actions Status][gh-remoteconfig-badge]][gh-actions] +[![Actions Status][gh-storage-badge]][gh-actions] +[![Actions Status][gh-symbolcollision-badge]][gh-actions] +[![Actions Status][gh-zip-badge]][gh-actions] +[![Travis](https://travis-ci.org/firebase/firebase-ios-sdk.svg?branch=master)](https://travis-ci.org/firebase/firebase-ios-sdk) + +# Firebase Apple Open Source Development + +This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics, +FirebasePerformance, and FirebaseML. + +The repository also includes GoogleUtilities source. The +[GoogleUtilities](GoogleUtilities/README.md) pod is +a set of utilities used by Firebase and other Google products. + +Firebase is an app development platform with tools to help you build, grow and +monetize your app. More information about Firebase can be found at +[https://firebase.google.com](https://firebase.google.com). + +## Installation + +See the three subsections for details about three different installation methods. +1. [Standard pod install](README.md#standard-pod-install) +1. [Installing from the GitHub repo](README.md#installing-from-github) +1. [Experimental Carthage](README.md#carthage-ios-only) + +### Standard pod install + +Go to +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Installing from GitHub + +For releases starting with 5.0.0, the source for each release is also deployed +to CocoaPods master and available via standard +[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod). + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See +[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All of the official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +``` +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +``` + +To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do: + +``` +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution are at +[Carthage](Carthage.md). + +### Rome + +Instructions for installing binary frameworks via +[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md). + +### Using Firebase from a Framework or a library + +[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md) + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + + * Xcode 10.3 (or later) + * CocoaPods 1.7.2 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self contained Xcode project. See +[Firestore/README.md](Firestore/README.md). + +### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +### Adding a New Firebase Pod + +See [AddNewPod.md](AddNewPod.md). + +### Managing Headers and Imports + +See [HeadersImports.md](HeadersImports.md). + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh) +before creating a PR. + +Travis will verify that any code changes are done in a style compliant way. Install +`clang-format` and `swiftformat`. +These commands will get the right versions: + +``` +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb +``` + +Note: if you already have a newer version of these installed you may need to +`brew switch` to this version. + +To update this section, find the versions of clang-format and swiftformat.rb to +match the versions in the CI failure logs +[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula). + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +#### Viewing Code Coverage (Deprecated) + +First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`. + +After running the `AllUnitTests_iOS` scheme in Xcode, execute +`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output` +at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results. + +### Running Sample Apps +In order to run the sample apps and integration tests, you'll need valid +`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist +files without real values, but can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g. `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file +(e.g. in [Example/Database/App/](Example/Database/App/)); + +Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require +special Apple capabilities, and you will have to change the sample app to use a unique bundle +identifier that you can control in your own Apple Developer account. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase Auth + +If you're doing specific Firebase Auth development, see +[the Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to +`Example/Database/App/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[FIRStorageIntegrationTests.m](FirebaseStorage/Tests/Integration/FIRStorageIntegrationTests.m). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to actually test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account, and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications, and will not receive push notifications. +In order to receive push notifications, you'll have to follow the steps above and run the app on a +physical device. + +## Community Supported Efforts + +We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are +very grateful! We'd like to empower as many developers as we can to be able to use Firebase and +participate in the Firebase community. + +### tvOS, macOS, watchOS and Catalyst +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on +tvOS, macOS, watchOS and Catalyst. + +For tvOS, checkout the [Sample](Example/tvOSSample). +For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the +[Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this +repository is actively developed primarily for iOS. While we can catch basic unit test issues with +Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you +encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the app +has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +To install, add a subset of the following to the Podfile: + +``` +pod 'Firebase/ABTesting' # No watchOS support yet +pod 'Firebase/Auth' # No watchOS support yet +pod 'Firebase/Crashlytics' # No watchOS support yet +pod 'Firebase/Database' # No watchOS support yet +pod 'Firebase/Firestore' # No watchOS support yet +pod 'Firebase/Functions' # No watchOS support yet +pod 'Firebase/Messaging' +pod 'Firebase/RemoteConfig' # No watchOS support yet +pod 'Firebase/Storage' +``` + +#### Additional Catalyst Notes + +* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability` +to Build Settings. +* FirebaseFirestore requires signing the +[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +iOS SDK. + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg +[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg +[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg +[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg +[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg +[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg +[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg +[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg +[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg +[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg +[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg +[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg +[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg +[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg +[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg +[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRAppInternal.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRAppInternal.h new file mode 100644 index 00000000..9a0c943d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRAppInternal.h @@ -0,0 +1,173 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRApp.h" +#else +#import +#endif + +// The has_include is a workaround so the old IID needed for the FIS tests can find FIRErrors.h +#if __has_include("FirebaseCore/Sources/Private/FIRErrors.h") +#import "FirebaseCore/Sources/Private/FIRErrors.h" +#else +#import +#endif + +@class FIRComponentContainer; +@protocol FIRLibrary; + +/** + * The internal interface to FIRApp. This is meant for first-party integrators, who need to receive + * FIRApp notifications, log info about the success or failure of their configuration, and access + * other internal functionality of FIRApp. + * + * TODO(b/28296561): Restructure this header. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; + +/** + * The format string for the User Defaults key used for storing the data collection enabled flag. + * This includes formatting to append the Firebase App's name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** + * A notification fired containing diagnostic information when SDK errors occur. + */ +extern NSString *const kFIRAppDiagnosticsNotification; + +/** @var FIRAuthStateDidChangeInternalNotification + @brief The name of the @c NSNotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FIRAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FIRAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FIRAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FIRApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FIRAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/* + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * Creates an error for failing to configure a subspec service. This method is called by each + * FIRApp notification listener. + */ ++ (NSError *)errorForSubspecConfigurationFailureWithDomain:(NSString *)domain + errorCode:(FIRErrorCode)code + service:(NSString *)service + reason:(NSString *)reason; +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Used by each SDK to send logs about SDK configuration status to Clearcut. + * + * @note This API is a no-op, please remove calls to it. + */ +- (void)sendLogsWithServiceName:(NSString *)serviceName + version:(NSString *)version + error:(NSError *)error; + +/** + * Can be used by the unit tests in eack SDK to reset FIRApp. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponent.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponent.h new file mode 100644 index 00000000..cb51ee70 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponent.h @@ -0,0 +1,91 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +@class FIRDependency; + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the Component. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// An array of dependencies for the component. +@property(nonatomic, copy, readonly) NSArray *dependencies; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param dependencies - Any dependencies the `implementingClass` has, optional or required. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:dependencies:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentContainer.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentContainer.h new file mode 100644 index 00000000..db2bafef --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentContainer.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponentType.h") +#import "FirebaseCore/Sources/Private/FIRComponentType.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#else +#import +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant:` call. These classes should conform to `FIRComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Unavailable. Use the `container` property on `FIRApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentType.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentType.h new file mode 100644 index 00000000..6f2aca7b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentType.h @@ -0,0 +1,34 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (T)instanceForProtocol:(Protocol *)protocol inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h new file mode 100644 index 00000000..76c0c05f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRDiagnosticsData; +@class FIROptions; + +NS_ASSUME_NONNULL_BEGIN + +/** Connects FIRCore with the CoreDiagnostics library. */ +@interface FIRCoreDiagnosticsConnector : NSObject + +/** Logs FirebaseCore related data. + * + * @param options The options object containing data to log. + */ ++ (void)logCoreTelemetryWithOptions:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRDependency.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRDependency.h new file mode 100644 index 00000000..46e9b7ea --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRDependency.h @@ -0,0 +1,45 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A dependency on a specific protocol's functionality. +NS_SWIFT_NAME(Dependency) +@interface FIRDependency : NSObject + +/// The protocol describing functionality being depended on. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// A flag to specify if the dependency is required or not. +@property(nonatomic, readonly) BOOL isRequired; + +/// Initializes a dependency that is required. Calls `initWithProtocol:isRequired` with `YES` for +/// the required parameter. +/// Creates a required dependency on the specified protocol's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol; + +/// Creates a dependency on the specified protocol's functionality and specify if it's required for +/// the class's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol isRequired:(BOOL)required; + +/// Use `dependencyWithProtocol:isRequired:` instead. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRErrorCode.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRErrorCode.h new file mode 100644 index 00000000..c90d9eec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRErrorCode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** Error codes in Firebase error domain. */ +typedef NS_ENUM(NSInteger, FIRErrorCode) { + /** + * Unknown error. + */ + FIRErrorCodeUnknown = 0, + /** + * Loading data from the GoogleService-Info.plist file failed. This is a fatal error and should + * not be ignored. Further calls to the API will fail and/or possibly cause crashes. + */ + FIRErrorCodeInvalidPlistFile = -100, + + /** + * Validating the Google App ID format failed. + */ + FIRErrorCodeInvalidAppID = -101, + + /** + * Error code for failing to configure a specific service. It's deprecated, but + * still used after copybara. + */ + FIRErrorCodeConfigFailed = -114, +}; diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRErrors.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRErrors.h new file mode 100644 index 00000000..19e47328 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRErrors.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#include "FIRErrorCode.h" + +extern NSString *const kFirebaseErrorDomain; +extern NSString *const kFirebaseConfigErrorDomain; +extern NSString *const kFirebaseCoreErrorDomain; +extern NSString *const kFirebasePerfErrorDomain; diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h new file mode 100644 index 00000000..bfff73e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h @@ -0,0 +1,39 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRHeartbeatInfo : NSObject + +// Enum representing the different heartbeat codes. +typedef NS_ENUM(NSInteger, FIRHeartbeatInfoCode) { + FIRHeartbeatInfoCodeNone = 0, + FIRHeartbeatInfoCodeSDK = 1, + FIRHeartbeatInfoCodeGlobal = 2, + FIRHeartbeatInfoCodeCombined = 3, +}; + +/** + * Get heartbeat code requred for the sdk. + * @param heartbeatTag String representing the sdk heartbeat tag. + * @return Heartbeat code indicating whether or not an sdk/global heartbeat + * needs to be sent + */ ++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRLibrary.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRLibrary.h new file mode 100644 index 00000000..e7a9e077 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRLibrary.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponent.h") +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#else +#import +#endif + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more FIRComponents that will be registered in +/// FIRApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@optional +/// Implement this method if the library needs notifications for lifecycle events. This method is +/// called when the developer calls `FirebaseApp.configure()`. ++ (void)configureWithApp:(FIRApp *)app; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRLogger.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRLogger.h new file mode 100644 index 00000000..6fd77844 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRLogger.h @@ -0,0 +1,156 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRLoggerLevel.h" +#else +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern FIRLoggerService kFIRLoggerABTesting; +extern FIRLoggerService kFIRLoggerAdMob; +extern FIRLoggerService kFIRLoggerAnalytics; +extern FIRLoggerService kFIRLoggerAuth; +extern FIRLoggerService kFIRLoggerCrash; +extern FIRLoggerService kFIRLoggerCore; +extern FIRLoggerService kFIRLoggerMLKit; +extern FIRLoggerService kFIRLoggerPerf; +extern FIRLoggerService kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to YES, the logging level for Analytics will be set to FIRLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Changes the default logging level of FIRLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FIRLoggerLevelNotice if the app is running from App Store. + * (required) log level (one of the FIRLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FIRLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + FIRLoggerService service, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FIRLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +@interface FIRLoggerWrapper : NSObject + +/** + * Objective-C wrapper for FIRLogBasic to allow weak linking to FIRLogger + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ + ++ (void)logWithLevel:(FIRLoggerLevel)level + withService:(FIRLoggerService)service + withCode:(NSString *)messageCode + withMessage:(NSString *)message + withArgs:(va_list)args; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIROptionsInternal.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIROptionsInternal.h new file mode 100644 index 00000000..acaf4586 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIROptionsInternal.h @@ -0,0 +1,119 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIROptions.h" +#else +#import +#endif + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * This header file exposes the initialization of FIROptions to internal use. + */ +@interface FIROptions () + +/** + * resetDefaultOptions and initInternalWithOptionsDictionary: are exposed only for unit tests. + */ ++ (void)resetDefaultOptions; + +/** + * Initializes the options with dictionary. The above strings are the keys of the dictionary. + * This is the designated initializer. + */ +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)serviceInfoDictionary; + +/** + * defaultOptions and defaultOptionsDictionary are exposed in order to be used in FIRApp and + * other first party services. + */ ++ (FIROptions *)defaultOptions; + ++ (NSDictionary *)defaultOptionsDictionary; + +/** + * Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at + * runtime. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet; + +/** + * Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless + * explicitly disabled in GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionEnabled; + +/** + * Whether or not Analytics Collection was completely disabled. If YES, then + * isAnalyticsCollectionEnabled will be NO. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionDeactivated; + +/** + * The version ID of the client library, e.g. @"1100000". + */ +@property(nonatomic, readonly, copy) NSString *libraryVersionID; + +/** + * The flag indicating whether this object was constructed with the values in the default plist + * file. + */ +@property(nonatomic) BOOL usingOptionsFromDefaultPlist; + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isMeasurementEnabled; + +/** + * Whether or not Analytics was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isAnalyticsEnabled; + +/** + * Whether or not SignIn was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isSignInEnabled; + +/** + * Whether or not editing is locked. This should occur after FIROptions has been set on a FIRApp. + */ +@property(nonatomic, getter=isEditingLocked) BOOL editingLocked; + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FirebaseCoreInternal.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FirebaseCoreInternal.h new file mode 100644 index 00000000..93af6cb8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FirebaseCoreInternal.h @@ -0,0 +1,31 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An umbrella header, for any other libraries in this repo to access Firebase Public and Private +// headers. Any package manager complexity should be handled here. + +#if SWIFT_PACKAGE +@import FirebaseCore; +#else +#import +#endif + +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" +#import "FirebaseCore/Sources/Private/FIRDependency.h" +#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h new file mode 100644 index 00000000..5bc21a11 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h @@ -0,0 +1,56 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import + +@class FIRInstallationsHTTPError; + +NS_ASSUME_NONNULL_BEGIN + +void FIRInstallationsItemSetErrorToPointer(NSError *error, NSError **pointer); + +@interface FIRInstallationsErrorUtil : NSObject + ++ (NSError *)keyedArchiverErrorWithException:(NSException *)exception; ++ (NSError *)keyedArchiverErrorWithError:(NSError *)error; + ++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status; + ++ (NSError *)installationItemNotFoundForAppID:(NSString *)appID appName:(NSString *)appName; + ++ (NSError *)JSONSerializationError:(NSError *)error; + ++ (NSError *)networkErrorWithError:(NSError *)error; + ++ (NSError *)FIDRegistrationErrorWithResponseMissingField:(NSString *)missingFieldName; + ++ (NSError *)corruptedIIDTokenData; + ++ (FIRInstallationsHTTPError *)APIErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse + data:(nullable NSData *)data; ++ (BOOL)isAPIError:(NSError *)error withHTTPCode:(NSInteger)HTTPCode; + +/** + * Returns the passed error if it is already in the public domain or a new error with the passed + * error at `NSUnderlyingErrorKey`. + */ ++ (NSError *)publicDomainErrorWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m new file mode 100644 index 00000000..f85923ac --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m @@ -0,0 +1,124 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsErrorUtil.h" + +#import "FIRInstallationsHTTPError.h" + +NSString *const kFirebaseInstallationsErrorDomain = @"com.firebase.installations"; + +void FIRInstallationsItemSetErrorToPointer(NSError *error, NSError **pointer) { + if (pointer != NULL) { + *pointer = error; + } +} + +@implementation FIRInstallationsErrorUtil + ++ (NSError *)keyedArchiverErrorWithException:(NSException *)exception { + NSString *failureReason = [NSString + stringWithFormat:@"NSKeyedArchiver exception with name: %@, reason: %@, userInfo: %@", + exception.name, exception.reason, exception.userInfo]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)keyedArchiverErrorWithError:(NSError *)error { + NSString *failureReason = [NSString stringWithFormat:@"NSKeyedArchiver error."]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:error]; +} + ++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status { + NSString *failureReason = [NSString stringWithFormat:@"%@ (%li)", keychainFunction, (long)status]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeKeychain + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)installationItemNotFoundForAppID:(NSString *)appID appName:(NSString *)appName { + NSString *failureReason = + [NSString stringWithFormat:@"Installation for appID %@ appName %@ not found", appID, appName]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)corruptedIIDTokenData { + NSString *failureReason = + @"IID token data stored in Keychain is corrupted or in an incompatible format."; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (FIRInstallationsHTTPError *)APIErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse + data:(nullable NSData *)data { + return [[FIRInstallationsHTTPError alloc] initWithHTTPResponse:HTTPResponse data:data]; +} + ++ (BOOL)isAPIError:(NSError *)error withHTTPCode:(NSInteger)HTTPCode { + if (![error isKindOfClass:[FIRInstallationsHTTPError class]]) { + return NO; + } + + return [(FIRInstallationsHTTPError *)error HTTPResponse].statusCode == HTTPCode; +} + ++ (NSError *)JSONSerializationError:(NSError *)error { + NSString *failureReason = [NSString stringWithFormat:@"Failed to serialize JSON data."]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)FIDRegistrationErrorWithResponseMissingField:(NSString *)missingFieldName { + NSString *failureReason = [NSString + stringWithFormat:@"A required response field with name %@ is missing", missingFieldName]; + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:failureReason + underlyingError:nil]; +} + ++ (NSError *)networkErrorWithError:(NSError *)error { + return [self installationsErrorWithCode:FIRInstallationsErrorCodeServerUnreachable + failureReason:@"Network connection error." + underlyingError:error]; +} + ++ (NSError *)publicDomainErrorWithError:(NSError *)error { + if ([error.domain isEqualToString:kFirebaseInstallationsErrorDomain]) { + return error; + } + + return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown + failureReason:nil + underlyingError:error]; +} + ++ (NSError *)installationsErrorWithCode:(FIRInstallationsErrorCode)code + failureReason:(nullable NSString *)failureReason + underlyingError:(nullable NSError *)underlyingError { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[NSUnderlyingErrorKey] = underlyingError; + userInfo[NSLocalizedFailureReasonErrorKey] = failureReason; + + return [NSError errorWithDomain:kFirebaseInstallationsErrorDomain code:code userInfo:userInfo]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h new file mode 100644 index 00000000..ad0eb8c1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h @@ -0,0 +1,54 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Represents an error caused by an unexpected API response. */ +@interface FIRInstallationsHTTPError : NSError + +@property(nonatomic, readonly) NSHTTPURLResponse *HTTPResponse; +@property(nonatomic, readonly, nonnull) NSData *data; + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse data:(nullable NSData *)data; + +@end + +NS_ASSUME_NONNULL_END + +typedef NS_ENUM(NSInteger, FIRInstallationsHTTPCodes) { + FIRInstallationsHTTPCodesTooManyRequests = 429, + FIRInstallationsHTTPCodesServerInternalError = 500, +}; + +/** Possible response HTTP codes for `CreateInstallation` API request. */ +typedef NS_ENUM(NSInteger, FIRInstallationsRegistrationHTTPCode) { + FIRInstallationsRegistrationHTTPCodeSuccess = 201, + FIRInstallationsRegistrationHTTPCodeInvalidArgument = 400, + FIRInstallationsRegistrationHTTPCodeInvalidAPIKey = 401, + FIRInstallationsRegistrationHTTPCodeAPIKeyToProjectIDMismatch = 403, + FIRInstallationsRegistrationHTTPCodeProjectNotFound = 404, + FIRInstallationsRegistrationHTTPCodeTooManyRequests = 429, + FIRInstallationsRegistrationHTTPCodeServerInternalError = 500 +}; + +typedef NS_ENUM(NSInteger, FIRInstallationsAuthTokenHTTPCode) { + FIRInstallationsAuthTokenHTTPCodeInvalidAuthentication = 401, + FIRInstallationsAuthTokenHTTPCodeFIDNotFound = 404, +}; diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m new file mode 100644 index 00000000..05256ea1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m @@ -0,0 +1,79 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsHTTPError.h" +#import "FIRInstallationsErrorUtil.h" + +@implementation FIRInstallationsHTTPError + +- (instancetype)initWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse + data:(nullable NSData *)data { + NSDictionary *userInfo = [FIRInstallationsHTTPError userInfoWithHTTPResponse:HTTPResponse + data:data]; + self = [super + initWithDomain:kFirebaseInstallationsErrorDomain + code:[FIRInstallationsHTTPError errorCodeWithHTTPCode:HTTPResponse.statusCode] + userInfo:userInfo]; + if (self) { + _HTTPResponse = HTTPResponse; + _data = data; + } + return self; +} + ++ (FIRInstallationsErrorCode)errorCodeWithHTTPCode:(NSInteger)HTTPCode { + return FIRInstallationsErrorCodeUnknown; +} + ++ (NSDictionary *)userInfoWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse + data:(nullable NSData *)data { + NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSString *failureReason = + [NSString stringWithFormat:@"The server responded with an error: \n - URL: %@ \n - HTTP " + @"status code: %ld \n - Response body: %@", + HTTPResponse.URL, (long)HTTPResponse.statusCode, responseString]; + return @{NSLocalizedFailureReasonErrorKey : failureReason}; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + return [[FIRInstallationsHTTPError alloc] initWithHTTPResponse:self.HTTPResponse data:self.data]; +} + +#pragma mark - NSSecureCoding + +- (nullable instancetype)initWithCoder:(NSCoder *)coder { + NSHTTPURLResponse *HTTPResponse = [coder decodeObjectOfClass:[NSHTTPURLResponse class] + forKey:@"HTTPResponse"]; + if (!HTTPResponse) { + return nil; + } + NSData *data = [coder decodeObjectOfClass:[NSData class] forKey:@"data"]; + + return [self initWithHTTPResponse:HTTPResponse data:data]; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.HTTPResponse forKey:@"HTTPResponse"]; + [coder encodeObject:self.data forKey:@"data"]; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m new file mode 100644 index 00000000..d508663e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m @@ -0,0 +1,245 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallations.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "FIRInstallationsAuthTokenResultInternal.h" + +#import "FIRInstallationsErrorUtil.h" +#import "FIRInstallationsIDController.h" +#import "FIRInstallationsItem.h" +#import "FIRInstallationsLogger.h" +#import "FIRInstallationsStoredAuthToken.h" +#import "FIRInstallationsVersion.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol FIRInstallationsInstanceProvider +@end + +@interface FIRInstallations () +@property(nonatomic, readonly) FIROptions *appOptions; +@property(nonatomic, readonly) NSString *appName; + +@property(nonatomic, readonly) FIRInstallationsIDController *installationsIDController; + +@end + +@implementation FIRInstallations + +#pragma mark - Firebase component + ++ (void)load { + [FIRApp registerInternalLibrary:(Class)self + withName:@"fire-install" + withVersion:[NSString stringWithUTF8String:FIRInstallationsVersionStr]]; +} + ++ (nonnull NSArray *)componentsToRegister { + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + *isCacheable = YES; + FIRInstallations *installations = [[FIRInstallations alloc] initWithApp:container.app]; + return installations; + }; + + FIRComponent *installationsProvider = + [FIRComponent componentWithProtocol:@protocol(FIRInstallationsInstanceProvider) + instantiationTiming:FIRInstantiationTimingAlwaysEager + dependencies:@[] + creationBlock:creationBlock]; + return @[ installationsProvider ]; +} + +- (instancetype)initWithApp:(FIRApp *)app { + return [self initWitAppOptions:app.options appName:app.name]; +} + +- (instancetype)initWitAppOptions:(FIROptions *)appOptions appName:(NSString *)appName { + FIRInstallationsIDController *IDController = + [[FIRInstallationsIDController alloc] initWithGoogleAppID:appOptions.googleAppID + appName:appName + APIKey:appOptions.APIKey + projectID:appOptions.projectID + GCMSenderID:appOptions.GCMSenderID + accessGroup:appOptions.appGroupID]; + + // `prefetchAuthToken` is disabled due to b/156746574. + return [self initWithAppOptions:appOptions + appName:appName + installationsIDController:IDController + prefetchAuthToken:NO]; +} + +/// The initializer is supposed to be used by tests to inject `installationsStore`. +- (instancetype)initWithAppOptions:(FIROptions *)appOptions + appName:(NSString *)appName + installationsIDController:(FIRInstallationsIDController *)installationsIDController + prefetchAuthToken:(BOOL)prefetchAuthToken { + self = [super init]; + if (self) { + [[self class] validateAppOptions:appOptions appName:appName]; + [[self class] assertCompatibleIIDVersion]; + + _appOptions = [appOptions copy]; + _appName = [appName copy]; + _installationsIDController = installationsIDController; + + // Pre-fetch auth token. + if (prefetchAuthToken) { + [self authTokenWithCompletion:^(FIRInstallationsAuthTokenResult *_Nullable tokenResult, + NSError *_Nullable error){ + }]; + } + } + return self; +} + ++ (void)validateAppOptions:(FIROptions *)appOptions appName:(NSString *)appName { + NSMutableArray *missingFields = [NSMutableArray array]; + if (appName.length < 1) { + [missingFields addObject:@"`FirebaseApp.name`"]; + } + if (appOptions.APIKey.length < 1) { + [missingFields addObject:@"`FirebaseOptions.APIKey`"]; + } + if (appOptions.googleAppID.length < 1) { + [missingFields addObject:@"`FirebaseOptions.googleAppID`"]; + } + + // TODO(#4692): Check for `appOptions.projectID.length < 1` only. + // We can use `GCMSenderID` instead of `projectID` temporary. + if (appOptions.projectID.length < 1 && appOptions.GCMSenderID.length < 1) { + [missingFields addObject:@"`FirebaseOptions.projectID`"]; + } + + if (missingFields.count > 0) { + [NSException + raise:kFirebaseInstallationsErrorDomain + format: + @"%@[%@] Could not configure Firebase Installations due to invalid FirebaseApp " + @"options. The following parameters are nil or empty: %@. If you use " + @"GoogleServices-Info.plist please download the most recent version from the Firebase " + @"Console. If you configure Firebase in code, please make sure you specify all " + @"required parameters.", + kFIRLoggerInstallations, kFIRInstallationsMessageCodeInvalidFirebaseAppOptions, + [missingFields componentsJoinedByString:@", "]]; + } +} + +#pragma mark - Public + ++ (FIRInstallations *)installations { + FIRApp *defaultApp = [FIRApp defaultApp]; + if (!defaultApp) { + [NSException raise:kFirebaseInstallationsErrorDomain + format:@"The default FirebaseApp instance must be configured before the default" + @"FirebaseApp instance can be initialized. One way to ensure that is to " + @"call `[FIRApp configure];` (`FirebaseApp.configure()` in Swift) in the App" + @" Delegate's `application:didFinishLaunchingWithOptions:` " + @"(`application(_:didFinishLaunchingWithOptions:)` in Swift)."]; + } + + return [self installationsWithApp:defaultApp]; +} + ++ (FIRInstallations *)installationsWithApp:(FIRApp *)app { + id installations = + FIR_COMPONENT(FIRInstallationsInstanceProvider, app.container); + return (FIRInstallations *)installations; +} + +- (void)installationIDWithCompletion:(FIRInstallationsIDHandler)completion { + [self.installationsIDController getInstallationItem] + .then(^id(FIRInstallationsItem *installation) { + completion(installation.firebaseInstallationID, nil); + return nil; + }) + .catch(^(NSError *error) { + completion(nil, [FIRInstallationsErrorUtil publicDomainErrorWithError:error]); + }); +} + +- (void)authTokenWithCompletion:(FIRInstallationsTokenHandler)completion { + [self authTokenForcingRefresh:NO completion:completion]; +} + +- (void)authTokenForcingRefresh:(BOOL)forceRefresh + completion:(FIRInstallationsTokenHandler)completion { + [self.installationsIDController getAuthTokenForcingRefresh:forceRefresh] + .then(^FIRInstallationsAuthTokenResult *(FIRInstallationsItem *installation) { + FIRInstallationsAuthTokenResult *result = [[FIRInstallationsAuthTokenResult alloc] + initWithToken:installation.authToken.token + expirationDate:installation.authToken.expirationDate]; + return result; + }) + .then(^id(FIRInstallationsAuthTokenResult *token) { + completion(token, nil); + return nil; + }) + .catch(^void(NSError *error) { + completion(nil, [FIRInstallationsErrorUtil publicDomainErrorWithError:error]); + }); +} + +- (void)deleteWithCompletion:(void (^)(NSError *__nullable error))completion { + [self.installationsIDController deleteInstallation] + .then(^id(id result) { + completion(nil); + return nil; + }) + .catch(^void(NSError *error) { + completion([FIRInstallationsErrorUtil publicDomainErrorWithError:error]); + }); +} + +#pragma mark - IID version compatibility + ++ (void)assertCompatibleIIDVersion { + // We use this flag to disable IID compatibility exception for unit tests. +#ifdef FIR_INSTALLATIONS_ALLOWS_INCOMPATIBLE_IID_VERSION + return; +#else + if (![self isIIDVersionCompatible]) { + [NSException raise:kFirebaseInstallationsErrorDomain + format:@"FirebaseInstallations will not work correctly with current version of " + @"Firebase Instance ID. Please update your Firebase Instance ID version."]; + } +#endif +} + ++ (BOOL)isIIDVersionCompatible { + Class IIDClass = NSClassFromString(@"FIRInstanceID"); + if (IIDClass == nil) { + // It is OK if there is no IID at all. + return YES; + } + // We expect a compatible version having the method `+[FIRInstanceID usesFIS]` defined. + BOOL isCompatibleVersion = [IIDClass respondsToSelector:NSSelectorFromString(@"usesFIS")]; + return isCompatibleVersion; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m new file mode 100644 index 00000000..92e5fab1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsAuthTokenResultInternal.h" + +@implementation FIRInstallationsAuthTokenResult + +- (instancetype)initWithToken:(NSString *)token expirationDate:(NSDate *)expirationDate { + self = [super init]; + if (self) { + _authToken = [token copy]; + _expirationDate = expirationDate; + } + return self; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h new file mode 100644 index 00000000..0c959dba --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h @@ -0,0 +1,27 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRInstallationsAuthTokenResult (Internal) + +- (instancetype)initWithToken:(NSString *)token expirationDate:(NSDate *)expirationTime; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h new file mode 100644 index 00000000..95fdf835 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h @@ -0,0 +1,86 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRInstallationsStatus.h" + +@class FIRInstallationsStoredItem; +@class FIRInstallationsStoredAuthToken; +@class FIRInstallationsStoredIIDCheckin; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The class represents the required installation ID and auth token data including possible states. + * The data is stored to Keychain via `FIRInstallationsStoredItem` which has only the storage + * relevant data and does not contain any logic. `FIRInstallationsItem` must be used on the logic + * level (not `FIRInstallationsStoredItem`). + */ +@interface FIRInstallationsItem : NSObject + +/// A `FirebaseApp` identifier. +@property(nonatomic, readonly) NSString *appID; +/// A `FirebaseApp` name. +@property(nonatomic, readonly) NSString *firebaseAppName; +/// A stable identifier that uniquely identifies the app instance. +@property(nonatomic, copy, nullable) NSString *firebaseInstallationID; +/// The `refreshToken` is used to authorize the auth token requests. +@property(nonatomic, copy, nullable) NSString *refreshToken; + +@property(nonatomic, nullable) FIRInstallationsStoredAuthToken *authToken; +@property(nonatomic, assign) FIRInstallationsStatus registrationStatus; + +/// Instance ID default token imported from IID store as a part of IID migration. +@property(nonatomic, nullable) NSString *IIDDefaultToken; + +- (instancetype)initWithAppID:(NSString *)appID firebaseAppName:(NSString *)firebaseAppName; + +/** + * Populates `FIRInstallationsItem` properties with data from `FIRInstallationsStoredItem`. + * @param item An instance of `FIRInstallationsStoredItem` to get data from. + */ +- (void)updateWithStoredItem:(FIRInstallationsStoredItem *)item; + +/** + * Creates a stored item with data from the object. + * @return Returns a `FIRInstallationsStoredItem` instance with the data from the object. + */ +- (FIRInstallationsStoredItem *)storedItem; + +/** + * The installation identifier. + * @return Returns a string uniquely identifying the installation. + */ +- (NSString *)identifier; + +/** + * The installation identifier. + * @param appID A `FirebaseApp` identifier. + * @param appName A `FirebaseApp` name. + * @return Returns a string uniquely identifying the installation. + */ ++ (NSString *)identifierWithAppID:(NSString *)appID appName:(NSString *)appName; + +/** + * Generate a new Firebase Installation Identifier. + * @return Returns a 22 characters long globally unique string created based on UUID. + */ ++ (NSString *)generateFID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m new file mode 100644 index 00000000..bc819bf8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m @@ -0,0 +1,104 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsItem.h" + +#import "FIRInstallationsStoredAuthToken.h" +#import "FIRInstallationsStoredItem.h" + +@implementation FIRInstallationsItem + +- (instancetype)initWithAppID:(NSString *)appID firebaseAppName:(NSString *)firebaseAppName { + self = [super init]; + if (self) { + _appID = [appID copy]; + _firebaseAppName = [firebaseAppName copy]; + } + return self; +} + +- (nonnull id)copyWithZone:(nullable NSZone *)zone { + FIRInstallationsItem *clone = [[FIRInstallationsItem alloc] initWithAppID:self.appID + firebaseAppName:self.firebaseAppName]; + clone.firebaseInstallationID = [self.firebaseInstallationID copy]; + clone.refreshToken = [self.refreshToken copy]; + clone.authToken = [self.authToken copy]; + clone.registrationStatus = self.registrationStatus; + + return clone; +} + +- (void)updateWithStoredItem:(FIRInstallationsStoredItem *)item { + self.firebaseInstallationID = item.firebaseInstallationID; + self.refreshToken = item.refreshToken; + self.authToken = item.authToken; + self.registrationStatus = item.registrationStatus; + self.IIDDefaultToken = item.IIDDefaultToken; +} + +- (FIRInstallationsStoredItem *)storedItem { + FIRInstallationsStoredItem *storedItem = [[FIRInstallationsStoredItem alloc] init]; + storedItem.firebaseInstallationID = self.firebaseInstallationID; + storedItem.refreshToken = self.refreshToken; + storedItem.authToken = self.authToken; + storedItem.registrationStatus = self.registrationStatus; + storedItem.IIDDefaultToken = self.IIDDefaultToken; + return storedItem; +} + +- (nonnull NSString *)identifier { + return [[self class] identifierWithAppID:self.appID appName:self.firebaseAppName]; +} + ++ (NSString *)identifierWithAppID:(NSString *)appID appName:(NSString *)appName { + return [appID stringByAppendingString:appName]; +} + ++ (NSString *)generateFID { + NSUUID *UUID = [NSUUID UUID]; + uuid_t UUIDBytes; + [UUID getUUIDBytes:UUIDBytes]; + + NSUInteger UUIDLength = sizeof(uuid_t); + NSData *UUIDData = [NSData dataWithBytes:UUIDBytes length:UUIDLength]; + + uint8_t UUIDLast4Bits = UUIDBytes[UUIDLength - 1] & 0b00001111; + + // FID first 4 bits must be `0111`. The last 4 UUID bits will be cut later to form a proper FID. + // To keep 16 random bytes we copy these last 4 UUID to the FID 1st byte after `0111` prefix. + uint8_t FIDPrefix = 0b01110000 | UUIDLast4Bits; + NSMutableData *FIDData = [NSMutableData dataWithBytes:&FIDPrefix length:1]; + + [FIDData appendData:UUIDData]; + NSString *FIDString = [self base64URLEncodedStringWithData:FIDData]; + + // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5 bytes. + // Our generated ID has 16 bytes UUID + 1 byte prefix which after encoding with base64 will become + // 23 characters plus 1 character for "=" padding. + + // Remove the 23rd character that was added because of the extra 4 bits at the + // end of our 17 byte data and the '=' padding. + return [FIDString substringWithRange:NSMakeRange(0, 22)]; +} + ++ (NSString *)base64URLEncodedStringWithData:(NSData *)data { + NSString *string = [data base64EncodedStringWithOptions:0]; + string = [string stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; + string = [string stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; + return string; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h new file mode 100644 index 00000000..e4192bf6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h @@ -0,0 +1,51 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +extern FIRLoggerService kFIRLoggerInstallations; + +// FIRInstallationsAPIService.m +extern NSString *const kFIRInstallationsMessageCodeSendAPIRequest; +extern NSString *const kFIRInstallationsMessageCodeAPIRequestNetworkError; +extern NSString *const kFIRInstallationsMessageCodeAPIRequestResponse; +extern NSString *const kFIRInstallationsMessageCodeUnexpectedAPIRequestResponse; +extern NSString *const kFIRInstallationsMessageCodeParsingAPIResponse; +extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationFailed; +extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationSucceed; +extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenFailed; +extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenSucceed; + +// FIRInstallationsIDController.m +extern NSString *const kFIRInstallationsMessageCodeNewGetInstallationOperationCreated; +extern NSString *const kFIRInstallationsMessageCodeNewGetAuthTokenOperationCreated; +extern NSString *const kFIRInstallationsMessageCodeNewDeleteInstallationOperationCreated; +extern NSString *const kFIRInstallationsMessageCodeInvalidFirebaseConfiguration; + +// FIRInstallationsStoredItem.m +extern NSString *const kFIRInstallationsMessageCodeInstallationCoderVersionMismatch; + +// FIRInstallationsStoredAuthToken.m +extern NSString *const kFIRInstallationsMessageCodeAuthTokenCoderVersionMismatch; + +// FIRInstallationsStoredIIDCheckin.m +extern NSString *const kFIRInstallationsMessageCodeIIDCheckinCoderVersionMismatch; +extern NSString *const kFIRInstallationsMessageCodeIIDCheckinFailedToDecode; + +// FIRInstallations.m +extern NSString *const kFIRInstallationsMessageCodeInvalidFirebaseAppOptions; diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m new file mode 100644 index 00000000..c2bdf37f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m @@ -0,0 +1,49 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsLogger.h" + +FIRLoggerService kFIRLoggerInstallations = @"[Firebase/Installations]"; + +// FIRInstallationsAPIService.m +NSString *const kFIRInstallationsMessageCodeSendAPIRequest = @"I-FIS001001"; +NSString *const kFIRInstallationsMessageCodeAPIRequestNetworkError = @"I-FIS001002"; +NSString *const kFIRInstallationsMessageCodeAPIRequestResponse = @"I-FIS001003"; +NSString *const kFIRInstallationsMessageCodeUnexpectedAPIRequestResponse = @"I-FIS001004"; +NSString *const kFIRInstallationsMessageCodeParsingAPIResponse = @"I-FIS001005"; +NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationFailed = @"I-FIS001006"; +NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationSucceed = @"I-FIS001007"; +NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenFailed = @"I-FIS001008"; +NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenSucceed = @"I-FIS001009"; + +// FIRInstallationsIDController.m +NSString *const kFIRInstallationsMessageCodeNewGetInstallationOperationCreated = @"I-FIS002000"; +NSString *const kFIRInstallationsMessageCodeNewGetAuthTokenOperationCreated = @"I-FIS002001"; +NSString *const kFIRInstallationsMessageCodeNewDeleteInstallationOperationCreated = @"I-FIS002002"; +NSString *const kFIRInstallationsMessageCodeInvalidFirebaseConfiguration = @"I-FIS002003"; + +// FIRInstallationsStoredItem.m +NSString *const kFIRInstallationsMessageCodeInstallationCoderVersionMismatch = @"I-FIS003000"; + +// FIRInstallationsStoredAuthToken.m +NSString *const kFIRInstallationsMessageCodeAuthTokenCoderVersionMismatch = @"I-FIS004000"; + +// FIRInstallationsStoredIIDCheckin.m +NSString *const kFIRInstallationsMessageCodeIIDCheckinCoderVersionMismatch = @"I-FIS007000"; +NSString *const kFIRInstallationsMessageCodeIIDCheckinFailedToDecode = @"I-FIS007001"; + +// FIRInstallations.m +NSString *const kFIRInstallationsMessageCodeInvalidFirebaseAppOptions = @"I-FIS008000"; diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsVersion.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsVersion.m new file mode 100644 index 00000000..a75e3f5b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsVersion.m @@ -0,0 +1,23 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsVersion.h" + +// Convert the macro to a string +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x + +const char *const FIRInstallationsVersionStr = (const char *const)STR(FIRInstallations_LIB_VERSION); diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h new file mode 100644 index 00000000..e2408caa --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h @@ -0,0 +1,48 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +/** The class encapsulates a port of a piece FirebaseInstanceID logic required to migrate IID. */ +@interface FIRInstallationsIIDStore : NSObject + +/** + * Retrieves existing IID if present. + * @return Returns a promise that is resolved with IID string if IID has been found or rejected with + * an error otherwise. + */ +- (FBLPromise *)existingIID; + +/** + * Deletes existing IID if present. + * @return Returns a promise that is resolved with `[NSNull null]` if the IID was successfully. + * deleted or was not found. The promise is rejected otherwise. + */ +- (FBLPromise *)deleteExistingIID; + +#if TARGET_OS_OSX +/// If not `nil`, then only this keychain will be used to save and read data (see +/// `kSecMatchSearchList` and `kSecUseKeychain`. It is mostly intended to be used by unit tests. +@property(nonatomic, nullable) SecKeychainRef keychainRef; +#endif // TARGET_OSX + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m new file mode 100644 index 00000000..1f3a82af --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m @@ -0,0 +1,236 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsIIDStore.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import +#import "FIRInstallationsErrorUtil.h" + +static NSString *const kFIRInstallationsIIDKeyPairPublicTagPrefix = + @"com.google.iid.keypair.public-"; +static NSString *const kFIRInstallationsIIDKeyPairPrivateTagPrefix = + @"com.google.iid.keypair.private-"; +static NSString *const kFIRInstallationsIIDCreationTimePlistKey = @"|S|cre"; + +@implementation FIRInstallationsIIDStore + +- (FBLPromise *)existingIID { + return [FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + do:^id _Nullable { + if (![self hasPlistIIDFlag]) { + return nil; + } + + NSData *IIDPublicKeyData = [self IIDPublicKeyData]; + return [self IIDWithPublicKeyData:IIDPublicKeyData]; + }] + .validate(^BOOL(NSString *_Nullable IID) { + return IID.length > 0; + }); +} + +- (FBLPromise *)deleteExistingIID { + return [FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + do:^id _Nullable { + NSError *error; + if (![self deleteIIDFlagFromPlist:&error]) { + return error; + } + + if (![self deleteIID:&error]) { + return error; + } + + return [NSNull null]; + }]; +} + +#pragma mark - IID decoding + +- (NSString *)IIDWithPublicKeyData:(NSData *)publicKeyData { + NSData *publicKeySHA1 = [self sha1WithData:publicKeyData]; + + const uint8_t *bytes = publicKeySHA1.bytes; + NSMutableData *identityData = [NSMutableData dataWithData:publicKeySHA1]; + + uint8_t b0 = bytes[0]; + // Take the first byte and make the initial four 7 by initially making the initial 4 bits 0 + // and then adding 0x70 to it. + b0 = 0x70 + (0xF & b0); + // failsafe should give you back b0 itself + b0 = (b0 & 0xFF); + [identityData replaceBytesInRange:NSMakeRange(0, 1) withBytes:&b0]; + NSData *data = [identityData subdataWithRange:NSMakeRange(0, 8 * sizeof(Byte))]; + return [self base64URLEncodedStringWithData:data]; +} + +- (NSData *)sha1WithData:(NSData *)data { + unsigned char output[CC_SHA1_DIGEST_LENGTH]; + unsigned int length = (unsigned int)[data length]; + + CC_SHA1(data.bytes, length, output); + return [NSData dataWithBytes:output length:CC_SHA1_DIGEST_LENGTH]; +} + +- (NSString *)base64URLEncodedStringWithData:(NSData *)data { + NSString *string = [data base64EncodedStringWithOptions:0]; + string = [string stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; + string = [string stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; + string = [string stringByReplacingOccurrencesOfString:@"=" withString:@""]; + return string; +} + +#pragma mark - Keychain + +- (NSData *)IIDPublicKeyData { + NSString *tag = [self keychainKeyTagWithPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix]; + NSDictionary *query = [self keyPairQueryWithTag:tag returnData:YES]; + + CFTypeRef keyRef = NULL; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&keyRef); + + if (status != noErr) { + if (keyRef) { + CFRelease(keyRef); + } + return nil; + } + + return (__bridge NSData *)keyRef; +} + +- (BOOL)deleteIID:(NSError **)outError { + if (![self deleteKeychainKeyWithTagPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix + error:outError]) { + return NO; + } + + if (![self deleteKeychainKeyWithTagPrefix:kFIRInstallationsIIDKeyPairPrivateTagPrefix + error:outError]) { + return NO; + } + + return YES; +} + +- (BOOL)deleteKeychainKeyWithTagPrefix:(NSString *)tagPrefix error:(NSError **)outError { + NSString *keyTag = [self keychainKeyTagWithPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix]; + NSDictionary *keyQuery = [self keyPairQueryWithTag:keyTag returnData:NO]; + + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)keyQuery); + + // When item is not found, it should NOT be considered as an error. The operation should + // continue. + if (status != noErr && status != errSecItemNotFound) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil keychainErrorWithFunction:@"SecItemDelete" status:status], + outError); + return NO; + } + + return YES; +} + +- (NSDictionary *)keyPairQueryWithTag:(NSString *)tag returnData:(BOOL)shouldReturnData { + NSMutableDictionary *query = [NSMutableDictionary dictionary]; + NSData *tagData = [tag dataUsingEncoding:NSUTF8StringEncoding]; + + query[(__bridge id)kSecClass] = (__bridge id)kSecClassKey; + query[(__bridge id)kSecAttrApplicationTag] = tagData; + query[(__bridge id)kSecAttrKeyType] = (__bridge id)kSecAttrKeyTypeRSA; + if (shouldReturnData) { + query[(__bridge id)kSecReturnData] = @(YES); + } + +#if TARGET_OS_OSX + if (self.keychainRef) { + query[(__bridge NSString *)kSecMatchSearchList] = @[ (__bridge id)(self.keychainRef) ]; + } +#endif // TARGET_OSX + + return query; +} + +- (NSString *)keychainKeyTagWithPrefix:(NSString *)prefix { + NSString *mainAppBundleID = [[NSBundle mainBundle] bundleIdentifier]; + if (mainAppBundleID.length == 0) { + return nil; + } + return [NSString stringWithFormat:@"%@%@", prefix, mainAppBundleID]; +} + +- (NSString *)mainbundleIdentifier { + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + if (!bundleIdentifier.length) { + return nil; + } + return bundleIdentifier; +} + +#pragma mark - Plist + +- (BOOL)deleteIIDFlagFromPlist:(NSError **)outError { + NSString *path = [self plistPath]; + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + return YES; + } + + NSMutableDictionary *plistContent = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; + plistContent[kFIRInstallationsIIDCreationTimePlistKey] = nil; + + if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) { + return [plistContent writeToURL:[NSURL fileURLWithPath:path] error:outError]; + } + + return [plistContent writeToFile:path atomically:YES]; +} + +- (BOOL)hasPlistIIDFlag { + NSString *path = [self plistPath]; + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + return NO; + } + + NSDictionary *plistContent = [[NSDictionary alloc] initWithContentsOfFile:path]; + return plistContent[kFIRInstallationsIIDCreationTimePlistKey] != nil; +} + +- (NSString *)plistPath { + NSString *plistNameWithExtension = @"com.google.iid-keypair.plist"; + NSString *_subDirectoryName = @"Google/FirebaseInstanceID"; + + NSArray *directoryPaths = + NSSearchPathForDirectoriesInDomains([self supportedDirectory], NSUserDomainMask, YES); + NSArray *components = @[ directoryPaths.lastObject, _subDirectoryName, plistNameWithExtension ]; + + return [NSString pathWithComponents:components]; +} + +- (NSSearchPathDirectory)supportedDirectory { +#if TARGET_OS_TV + return NSCachesDirectory; +#else + return NSApplicationSupportDirectory; +#endif +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h new file mode 100644 index 00000000..ed98e3d7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The class reads a default IID token from IID store if available. + */ +@interface FIRInstallationsIIDTokenStore : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithGCMSenderID:(NSString *)GCMSenderID; + +- (FBLPromise *)existingIIDDefaultToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m new file mode 100644 index 00000000..b2b69313 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m @@ -0,0 +1,158 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsIIDTokenStore.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import + +#import "FIRInstallationsErrorUtil.h" + +static NSString *const kFIRInstallationsIIDTokenKeychainId = @"com.google.iid-tokens"; + +@interface FIRInstallationsIIDTokenInfo : NSObject +@property(nonatomic, nullable, copy) NSString *token; +@end + +@implementation FIRInstallationsIIDTokenInfo + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)coder { +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { + self = [super init]; + if (self) { + _token = [coder decodeObjectOfClass:[NSString class] forKey:@"token"]; + } + return self; +} + +@end + +@interface FIRInstallationsIIDTokenStore () +@property(nonatomic, readonly) NSString *GCMSenderID; +@end + +@implementation FIRInstallationsIIDTokenStore + +- (instancetype)initWithGCMSenderID:(NSString *)GCMSenderID { + self = [super init]; + if (self) { + _GCMSenderID = GCMSenderID; + } + return self; +} + +- (FBLPromise *)existingIIDDefaultToken { + return [[FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + do:^id _Nullable { + return [self IIDDefaultTokenData]; + }] onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + then:^id _Nullable(NSData *_Nullable keychainData) { + return [self IIDCheckinWithData:keychainData]; + }]; +} + +- (FBLPromise *)IIDCheckinWithData:(NSData *)data { + FBLPromise *resultPromise = [FBLPromise pendingPromise]; + + NSError *archiverError; + NSKeyedUnarchiver *unarchiver; + if (@available(iOS 11.0, tvOS 11.0, macOS 10.13, *)) { + unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&archiverError]; + } else { + @try { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; +#pragma clang diagnostic pop + } @catch (NSException *exception) { + archiverError = [FIRInstallationsErrorUtil keyedArchiverErrorWithException:exception]; + } + } + + if (!unarchiver) { + NSError *error = archiverError ?: [FIRInstallationsErrorUtil corruptedIIDTokenData]; + [resultPromise reject:error]; + return resultPromise; + } + + [unarchiver setClass:[FIRInstallationsIIDTokenInfo class] forClassName:@"FIRInstanceIDTokenInfo"]; + FIRInstallationsIIDTokenInfo *IIDTokenInfo = + [unarchiver decodeObjectOfClass:[FIRInstallationsIIDTokenInfo class] + forKey:NSKeyedArchiveRootObjectKey]; + + if (IIDTokenInfo.token.length < 1) { + [resultPromise reject:[FIRInstallationsErrorUtil corruptedIIDTokenData]]; + return resultPromise; + } + + [resultPromise fulfill:IIDTokenInfo.token]; + + return resultPromise; +} + +- (FBLPromise *)IIDDefaultTokenData { + FBLPromise *resultPromise = [FBLPromise pendingPromise]; + + NSMutableDictionary *keychainQuery = [self IIDDefaultTokenDataKeychainQuery]; + NSError *error; + NSData *data = [GULKeychainUtils getItemWithQuery:keychainQuery error:&error]; + + if (data) { + [resultPromise fulfill:data]; + return resultPromise; + } else { + NSError *outError = error ?: [FIRInstallationsErrorUtil corruptedIIDTokenData]; + [resultPromise reject:outError]; + return resultPromise; + } +} + +- (NSMutableDictionary *)IIDDefaultTokenDataKeychainQuery { + NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword}; + + NSMutableDictionary *finalQuery = [NSMutableDictionary dictionaryWithDictionary:query]; + finalQuery[(__bridge NSString *)kSecAttrGeneric] = kFIRInstallationsIIDTokenKeychainId; + + NSString *account = [self IIDAppIdentifier]; + if ([account length]) { + finalQuery[(__bridge NSString *)kSecAttrAccount] = account; + } + + finalQuery[(__bridge NSString *)kSecAttrService] = + [self serviceKeyForAuthorizedEntity:self.GCMSenderID scope:@"*"]; + return finalQuery; +} + +- (NSString *)IIDAppIdentifier { + return [[NSBundle mainBundle] bundleIdentifier] ?: @""; +} + +- (NSString *)serviceKeyForAuthorizedEntity:(NSString *)authorizedEntity scope:(NSString *)scope { + return [NSString stringWithFormat:@"%@:%@", authorizedEntity, scope]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h new file mode 100644 index 00000000..b45475d1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h @@ -0,0 +1,62 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; +@class FIRInstallationsItem; + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSString *const kFIRInstallationsUserAgentKey; + +FOUNDATION_EXPORT NSString *const kFIRInstallationsHeartbeatKey; + +/** + * The class is responsible for interacting with HTTP REST API for Installations. + */ +@interface FIRInstallationsAPIService : NSObject + +/** + * The default initializer. + * @param APIKey The Firebase project API key (see `FIROptions.APIKey`). + * @param projectID The Firebase project ID (see `FIROptions.projectID`). + */ +- (instancetype)initWithAPIKey:(NSString *)APIKey projectID:(NSString *)projectID; + +/** + * Sends a request to register a new FID to get auth and refresh tokens. + * @param installation The `FIRInstallationsItem` instance with the FID to register. + * @return A promise that is resolved with a new `FIRInstallationsItem` instance with valid tokens. + * It is rejected with an error in case of a failure. + */ +- (FBLPromise *)registerInstallation:(FIRInstallationsItem *)installation; + +- (FBLPromise *)refreshAuthTokenForInstallation: + (FIRInstallationsItem *)installation; + +/** + * Sends a request to delete the installation, related auth tokens and all related data from the + * server. + * @param installation The installation to delete. + * @return Returns a promise that is resolved with the passed installation on successful deletion or + * is rejected with an error otherwise. + */ +- (FBLPromise *)deleteInstallation:(FIRInstallationsItem *)installation; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m new file mode 100644 index 00000000..70218476 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m @@ -0,0 +1,361 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsAPIService.h" + +#import + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import "FIRInstallationsErrorUtil.h" +#import "FIRInstallationsItem+RegisterInstallationAPI.h" +#import "FIRInstallationsLogger.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +NSString *const kFIRInstallationsAPIBaseURL = @"https://firebaseinstallations.googleapis.com"; +NSString *const kFIRInstallationsAPIKey = @"X-Goog-Api-Key"; +NSString *const kFIRInstallationsBundleId = @"X-Ios-Bundle-Identifier"; +NSString *const kFIRInstallationsIIDMigrationAuthHeader = @"x-goog-fis-ios-iid-migration-auth"; +NSString *const kFIRInstallationsHeartbeatKey = @"X-firebase-client-log-type"; +NSString *const kFIRInstallationsHeartbeatTag = @"fire-installations"; +NSString *const kFIRInstallationsUserAgentKey = @"X-firebase-client"; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRInstallationsURLSessionResponse : NSObject +@property(nonatomic) NSHTTPURLResponse *HTTPResponse; +@property(nonatomic) NSData *data; + +- (instancetype)initWithResponse:(NSHTTPURLResponse *)response data:(nullable NSData *)data; +@end + +@implementation FIRInstallationsURLSessionResponse + +- (instancetype)initWithResponse:(NSHTTPURLResponse *)response data:(nullable NSData *)data { + self = [super init]; + if (self) { + _HTTPResponse = response; + _data = data ?: [NSData data]; + } + return self; +} + +@end + +@interface FIRInstallationsAPIService () +@property(nonatomic, readonly) NSURLSession *URLSession; +@property(nonatomic, readonly) NSString *APIKey; +@property(nonatomic, readonly) NSString *projectID; +@end + +NS_ASSUME_NONNULL_END + +@implementation FIRInstallationsAPIService + +- (instancetype)initWithAPIKey:(NSString *)APIKey projectID:(NSString *)projectID { + NSURLSession *URLSession = [NSURLSession + sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; + return [self initWithURLSession:URLSession APIKey:APIKey projectID:projectID]; +} + +/// The initializer for tests. +- (instancetype)initWithURLSession:(NSURLSession *)URLSession + APIKey:(NSString *)APIKey + projectID:(NSString *)projectID { + self = [super init]; + if (self) { + _URLSession = URLSession; + _APIKey = [APIKey copy]; + _projectID = [projectID copy]; + } + return self; +} + +#pragma mark - Public + +- (FBLPromise *)registerInstallation:(FIRInstallationsItem *)installation { + return [self registerRequestWithInstallation:installation] + .then(^id _Nullable(NSURLRequest *_Nullable request) { + return [self sendURLRequest:request]; + }) + .then(^id _Nullable(FIRInstallationsURLSessionResponse *response) { + return [self registeredInstallationWithInstallation:installation serverResponse:response]; + }); +} + +- (FBLPromise *)refreshAuthTokenForInstallation: + (FIRInstallationsItem *)installation { + return [self authTokenRequestWithInstallation:installation] + .then(^id _Nullable(NSURLRequest *_Nullable request) { + return [self sendURLRequest:request]; + }) + .then(^FBLPromise *( + FIRInstallationsURLSessionResponse *response) { + return [self authTokenWithServerResponse:response]; + }) + .then(^FIRInstallationsItem *(FIRInstallationsStoredAuthToken *authToken) { + FIRInstallationsItem *updatedInstallation = [installation copy]; + updatedInstallation.authToken = authToken; + return updatedInstallation; + }); +} + +- (FBLPromise *)deleteInstallation:(FIRInstallationsItem *)installation { + return [self deleteInstallationRequestWithInstallation:installation] + .then(^id _Nullable(NSURLRequest *_Nullable request) { + return [self sendURLRequest:request]; + }) + .then(^id _Nullable(FIRInstallationsURLSessionResponse *_Nullable value) { + // Return the original installation on success. + return installation; + }); +} + +#pragma mark - Register Installation + +- (FBLPromise *)registerRequestWithInstallation: + (FIRInstallationsItem *)installation { + NSString *URLString = [NSString stringWithFormat:@"%@/v1/projects/%@/installations/", + kFIRInstallationsAPIBaseURL, self.projectID]; + NSURL *URL = [NSURL URLWithString:URLString]; + + NSDictionary *bodyDict = @{ + @"fid" : installation.firebaseInstallationID, + @"authVersion" : @"FIS_v2", + @"appId" : installation.appID, + @"sdkVersion" : [self SDKVersion] + }; + + NSDictionary *headers; + if (installation.IIDDefaultToken) { + headers = @{kFIRInstallationsIIDMigrationAuthHeader : installation.IIDDefaultToken}; + } + + return [self requestWithURL:URL + HTTPMethod:@"POST" + bodyDict:bodyDict + refreshToken:nil + additionalHeaders:headers]; +} + +- (FBLPromise *) + registeredInstallationWithInstallation:(FIRInstallationsItem *)installation + serverResponse:(FIRInstallationsURLSessionResponse *)response { + return [FBLPromise do:^id { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeParsingAPIResponse, + @"Parsing server response for %@.", response.HTTPResponse.URL); + NSError *error; + FIRInstallationsItem *registeredInstallation = + [installation registeredInstallationWithJSONData:response.data + date:[NSDate date] + error:&error]; + if (registeredInstallation == nil) { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIResponseParsingInstallationFailed, + @"Failed to parse FIRInstallationsItem: %@.", error); + return error; + } + + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIResponseParsingInstallationSucceed, + @"FIRInstallationsItem parsed successfully."); + return registeredInstallation; + }]; +} + +#pragma mark - Auth token + +- (FBLPromise *)authTokenRequestWithInstallation: + (FIRInstallationsItem *)installation { + NSString *URLString = + [NSString stringWithFormat:@"%@/v1/projects/%@/installations/%@/authTokens:generate", + kFIRInstallationsAPIBaseURL, self.projectID, + installation.firebaseInstallationID]; + NSURL *URL = [NSURL URLWithString:URLString]; + + NSDictionary *bodyDict = @{@"installation" : @{@"sdkVersion" : [self SDKVersion]}}; + return [self requestWithURL:URL + HTTPMethod:@"POST" + bodyDict:bodyDict + refreshToken:installation.refreshToken]; +} + +- (FBLPromise *)authTokenWithServerResponse: + (FIRInstallationsURLSessionResponse *)response { + return [FBLPromise do:^id { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeParsingAPIResponse, + @"Parsing server response for %@.", response.HTTPResponse.URL); + NSError *error; + FIRInstallationsStoredAuthToken *token = + [FIRInstallationsItem authTokenWithGenerateTokenAPIJSONData:response.data + date:[NSDate date] + error:&error]; + if (token == nil) { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenFailed, + @"Failed to parse FIRInstallationsStoredAuthToken: %@.", error); + return error; + } + + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenSucceed, + @"FIRInstallationsStoredAuthToken parsed successfully."); + return token; + }]; +} + +#pragma mark - Delete Installation + +- (FBLPromise *)deleteInstallationRequestWithInstallation: + (FIRInstallationsItem *)installation { + NSString *URLString = [NSString stringWithFormat:@"%@/v1/projects/%@/installations/%@/", + kFIRInstallationsAPIBaseURL, self.projectID, + installation.firebaseInstallationID]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [self requestWithURL:URL + HTTPMethod:@"DELETE" + bodyDict:@{} + refreshToken:installation.refreshToken]; +} + +#pragma mark - URL Request +- (FBLPromise *)requestWithURL:(NSURL *)requestURL + HTTPMethod:(NSString *)HTTPMethod + bodyDict:(NSDictionary *)bodyDict + refreshToken:(nullable NSString *)refreshToken { + return [self requestWithURL:requestURL + HTTPMethod:HTTPMethod + bodyDict:bodyDict + refreshToken:refreshToken + additionalHeaders:nil]; +} + +- (FBLPromise *)requestWithURL:(NSURL *)requestURL + HTTPMethod:(NSString *)HTTPMethod + bodyDict:(NSDictionary *)bodyDict + refreshToken:(nullable NSString *)refreshToken + additionalHeaders:(nullable NSDictionary *) + additionalHeaders { + return [FBLPromise + onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) + do:^id _Nullable { + __block NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestURL]; + request.HTTPMethod = HTTPMethod; + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + [request addValue:self.APIKey forHTTPHeaderField:kFIRInstallationsAPIKey]; + [request addValue:bundleIdentifier forHTTPHeaderField:kFIRInstallationsBundleId]; + [self setJSONHTTPBody:bodyDict forRequest:request]; + if (refreshToken) { + NSString *authHeader = [NSString stringWithFormat:@"FIS_v2 %@", refreshToken]; + [request setValue:authHeader forHTTPHeaderField:@"Authorization"]; + } + // User agent Header. + [request setValue:[FIRApp firebaseUserAgent] + forHTTPHeaderField:kFIRInstallationsUserAgentKey]; + // Heartbeat Header. + [request setValue:@([FIRHeartbeatInfo + heartbeatCodeForTag:kFIRInstallationsHeartbeatTag]) + .stringValue + forHTTPHeaderField:kFIRInstallationsHeartbeatKey]; + [additionalHeaders + enumerateKeysAndObjectsUsingBlock:^(NSString *_Nonnull key, NSString *_Nonnull obj, + BOOL *_Nonnull stop) { + [request setValue:obj forHTTPHeaderField:key]; + }]; + + return [request copy]; + }]; +} + +- (FBLPromise *)URLRequestPromise:(NSURLRequest *)request { + return [[FBLPromise async:^(FBLPromiseFulfillBlock fulfill, FBLPromiseRejectBlock reject) { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeSendAPIRequest, + @"Sending request: %@, body:%@, headers: %@.", request, + [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding], + request.allHTTPHeaderFields); + [[self.URLSession + dataTaskWithRequest:request + completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAPIRequestNetworkError, + @"Request failed: %@, error: %@.", request, error); + reject(error); + } else { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeAPIRequestResponse, + @"Request response received: %@, error: %@, body: %@.", request, error, + [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); + fulfill([[FIRInstallationsURLSessionResponse alloc] + initWithResponse:(NSHTTPURLResponse *)response + data:data]); + } + }] resume]; + }] then:^id _Nullable(FIRInstallationsURLSessionResponse *response) { + return [self validateHTTPResponseStatusCode:response]; + }]; +} + +- (FBLPromise *)validateHTTPResponseStatusCode: + (FIRInstallationsURLSessionResponse *)response { + NSInteger statusCode = response.HTTPResponse.statusCode; + return [FBLPromise do:^id _Nullable { + if (statusCode < 200 || statusCode >= 300) { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeUnexpectedAPIRequestResponse, + @"Unexpected API response: %@, body: %@.", response.HTTPResponse, + [[NSString alloc] initWithData:response.data encoding:NSUTF8StringEncoding]); + return [FIRInstallationsErrorUtil APIErrorWithHTTPResponse:response.HTTPResponse + data:response.data]; + } + return response; + }]; +} + +- (FBLPromise *)sendURLRequest:(NSURLRequest *)request { + return [FBLPromise attempts:1 + delay:1 + condition:^BOOL(NSInteger remainingAttempts, NSError *_Nonnull error) { + return [FIRInstallationsErrorUtil isAPIError:error withHTTPCode:500]; + } + retry:^id _Nullable { + return [self URLRequestPromise:request]; + }]; +} + +- (NSString *)SDKVersion { + return [NSString stringWithFormat:@"i:%s", FIRInstallationsVersionStr]; +} + +#pragma mark - JSON + +- (void)setJSONHTTPBody:(NSDictionary *)body + forRequest:(NSMutableURLRequest *)request { + [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + + NSError *error; + NSData *JSONData = [NSJSONSerialization dataWithJSONObject:body options:0 error:&error]; + if (JSONData == nil) { + // TODO: Log or return an error. + } + request.HTTPBody = JSONData; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h new file mode 100644 index 00000000..cc6b5432 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h @@ -0,0 +1,53 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsItem.h" + +@class FIRInstallationsStoredAuthToken; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRInstallationsItem (RegisterInstallationAPI) + +/** + * Parses and validates the Register Installation API response and returns a corresponding + * `FIRInstallationsItem` instance on success. + * @param JSONData The data with JSON encoded API response. + * @param date The Auth Token expiration date will be calculated as `date` + + * `response.authToken.expiresIn`. For most of the cases `[NSDate date]` should be passed there. A + * different value may be passed e.g. for unit tests. + * @param outError A pointer to assign a specific `NSError` instance in case of failure. No error is + * assigned in case of success. + * @return Returns a new `FIRInstallationsItem` instance in the success case or `nil` otherwise. + */ +- (nullable FIRInstallationsItem *)registeredInstallationWithJSONData:(NSData *)JSONData + date:(NSDate *)date + error: + (NSError *_Nullable *)outError; + ++ (nullable FIRInstallationsStoredAuthToken *)authTokenWithGenerateTokenAPIJSONData:(NSData *)data + date:(NSDate *)date + error:(NSError **) + outError; + ++ (nullable FIRInstallationsStoredAuthToken *)authTokenWithJSONDict: + (NSDictionary *)dict + date:(NSDate *)date + error:(NSError **)outError; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.m new file mode 100644 index 00000000..569e35b9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.m @@ -0,0 +1,142 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsItem+RegisterInstallationAPI.h" + +#import "FIRInstallationsErrorUtil.h" +#import "FIRInstallationsStoredAuthToken.h" + +@implementation FIRInstallationsItem (RegisterInstallationAPI) + +- (nullable FIRInstallationsItem *) + registeredInstallationWithJSONData:(NSData *)data + date:(NSDate *)date + error:(NSError *__autoreleasing _Nullable *_Nullable)outError { + NSDictionary *responseJSON = [FIRInstallationsItem dictionaryFromJSONData:data error:outError]; + if (!responseJSON) { + return nil; + } + + NSString *refreshToken = [FIRInstallationsItem validStringOrNilForKey:@"refreshToken" + fromDict:responseJSON]; + if (refreshToken == nil) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil FIDRegistrationErrorWithResponseMissingField:@"refreshToken"], + outError); + return nil; + } + + NSDictionary *authTokenDict = responseJSON[@"authToken"]; + if (![authTokenDict isKindOfClass:[NSDictionary class]]) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil FIDRegistrationErrorWithResponseMissingField:@"authToken"], + outError); + return nil; + } + + FIRInstallationsStoredAuthToken *authToken = + [FIRInstallationsItem authTokenWithJSONDict:authTokenDict date:date error:outError]; + if (authToken == nil) { + return nil; + } + + FIRInstallationsItem *installation = + [[FIRInstallationsItem alloc] initWithAppID:self.appID firebaseAppName:self.firebaseAppName]; + NSString *installationID = [FIRInstallationsItem validStringOrNilForKey:@"fid" + fromDict:responseJSON]; + installation.firebaseInstallationID = installationID ?: self.firebaseInstallationID; + installation.refreshToken = refreshToken; + installation.authToken = authToken; + installation.registrationStatus = FIRInstallationStatusRegistered; + + return installation; +} + +#pragma mark - Auth token + ++ (nullable FIRInstallationsStoredAuthToken *)authTokenWithGenerateTokenAPIJSONData:(NSData *)data + date:(NSDate *)date + error:(NSError **) + outError { + NSDictionary *dict = [self dictionaryFromJSONData:data error:outError]; + if (!dict) { + return nil; + } + + return [self authTokenWithJSONDict:dict date:date error:outError]; +} + ++ (nullable FIRInstallationsStoredAuthToken *)authTokenWithJSONDict: + (NSDictionary *)dict + date:(NSDate *)date + error:(NSError **)outError { + NSString *token = [self validStringOrNilForKey:@"token" fromDict:dict]; + if (token == nil) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil FIDRegistrationErrorWithResponseMissingField:@"authToken.token"], + outError); + return nil; + } + + NSString *expiresInString = [self validStringOrNilForKey:@"expiresIn" fromDict:dict]; + if (expiresInString == nil) { + FIRInstallationsItemSetErrorToPointer( + [FIRInstallationsErrorUtil + FIDRegistrationErrorWithResponseMissingField:@"authToken.expiresIn"], + outError); + return nil; + } + + // The response should contain the string in format like "604800s". + // The server should never response with anything else except seconds. + // Just drop the last character and parse a number from string. + NSString *expiresInSeconds = [expiresInString substringToIndex:expiresInString.length - 1]; + NSTimeInterval expiresIn = [expiresInSeconds doubleValue]; + NSDate *expirationDate = [date dateByAddingTimeInterval:expiresIn]; + + FIRInstallationsStoredAuthToken *authToken = [[FIRInstallationsStoredAuthToken alloc] init]; + authToken.status = FIRInstallationsAuthTokenStatusTokenReceived; + authToken.token = token; + authToken.expirationDate = expirationDate; + + return authToken; +} + +#pragma mark - JSON + ++ (nullable NSDictionary *)dictionaryFromJSONData:(NSData *)data + error:(NSError **)outError { + NSError *error; + NSDictionary *responseJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; + + if (![responseJSON isKindOfClass:[NSDictionary class]]) { + FIRInstallationsItemSetErrorToPointer([FIRInstallationsErrorUtil JSONSerializationError:error], + outError); + return nil; + } + + return responseJSON; +} + ++ (NSString *)validStringOrNilForKey:(NSString *)key fromDict:(NSDictionary *)dict { + NSString *string = dict[key]; + if ([string isKindOfClass:[NSString class]] && string.length > 0) { + return string; + } + return nil; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h new file mode 100644 index 00000000..ab2092d2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h @@ -0,0 +1,44 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FBLPromise; +@class FIRInstallationsItem; + +/** + * The class is responsible for managing FID for a given `FIRApp`. + */ +@interface FIRInstallationsIDController : NSObject + +- (instancetype)initWithGoogleAppID:(NSString *)appID + appName:(NSString *)appName + APIKey:(NSString *)APIKey + projectID:(NSString *)projectID + GCMSenderID:(NSString *)GCMSenderID + accessGroup:(nullable NSString *)accessGroup; + +- (FBLPromise *)getInstallationItem; + +- (FBLPromise *)getAuthTokenForcingRefresh:(BOOL)forceRefresh; + +- (FBLPromise *)deleteInstallation; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.m new file mode 100644 index 00000000..325b5bfd --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.m @@ -0,0 +1,480 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsIDController.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "FIRInstallationsAPIService.h" +#import "FIRInstallationsErrorUtil.h" +#import "FIRInstallationsIIDStore.h" +#import "FIRInstallationsIIDTokenStore.h" +#import "FIRInstallationsItem.h" +#import "FIRInstallationsLogger.h" +#import "FIRInstallationsSingleOperationPromiseCache.h" +#import "FIRInstallationsStore.h" + +#import "FIRInstallationsHTTPError.h" +#import "FIRInstallationsStoredAuthToken.h" + +const NSNotificationName FIRInstallationIDDidChangeNotification = + @"FIRInstallationIDDidChangeNotification"; +NSString *const kFIRInstallationIDDidChangeNotificationAppNameKey = + @"FIRInstallationIDDidChangeNotification"; + +NSTimeInterval const kFIRInstallationsTokenExpirationThreshold = 60 * 60; // 1 hour. + +static NSString *const kKeychainService = @"com.firebase.FIRInstallations.installations"; + +@interface FIRInstallationsIDController () +@property(nonatomic, readonly) NSString *appID; +@property(nonatomic, readonly) NSString *appName; + +@property(nonatomic, readonly) FIRInstallationsStore *installationsStore; +@property(nonatomic, readonly) FIRInstallationsIIDStore *IIDStore; +@property(nonatomic, readonly) FIRInstallationsIIDTokenStore *IIDTokenStore; + +@property(nonatomic, readonly) FIRInstallationsAPIService *APIService; + +@property(nonatomic, readonly) FIRInstallationsSingleOperationPromiseCache + *getInstallationPromiseCache; +@property(nonatomic, readonly) + FIRInstallationsSingleOperationPromiseCache *authTokenPromiseCache; +@property(nonatomic, readonly) FIRInstallationsSingleOperationPromiseCache + *authTokenForcingRefreshPromiseCache; +@property(nonatomic, readonly) + FIRInstallationsSingleOperationPromiseCache *deleteInstallationPromiseCache; +@end + +@implementation FIRInstallationsIDController + +- (instancetype)initWithGoogleAppID:(NSString *)appID + appName:(NSString *)appName + APIKey:(NSString *)APIKey + projectID:(NSString *)projectID + GCMSenderID:(NSString *)GCMSenderID + accessGroup:(nullable NSString *)accessGroup { + NSString *serviceName = [FIRInstallationsIDController keychainServiceWithAppID:appID]; + GULKeychainStorage *secureStorage = [[GULKeychainStorage alloc] initWithService:serviceName]; + FIRInstallationsStore *installationsStore = + [[FIRInstallationsStore alloc] initWithSecureStorage:secureStorage accessGroup:accessGroup]; + + // Use `GCMSenderID` as project identifier when `projectID` is not available. + NSString *APIServiceProjectID = (projectID.length > 0) ? projectID : GCMSenderID; + FIRInstallationsAPIService *apiService = + [[FIRInstallationsAPIService alloc] initWithAPIKey:APIKey projectID:APIServiceProjectID]; + + FIRInstallationsIIDStore *IIDStore = [[FIRInstallationsIIDStore alloc] init]; + FIRInstallationsIIDTokenStore *IIDCheckingStore = + [[FIRInstallationsIIDTokenStore alloc] initWithGCMSenderID:GCMSenderID]; + + return [self initWithGoogleAppID:appID + appName:appName + installationsStore:installationsStore + APIService:apiService + IIDStore:IIDStore + IIDTokenStore:IIDCheckingStore]; +} + +/// The initializer is supposed to be used by tests to inject `installationsStore`. +- (instancetype)initWithGoogleAppID:(NSString *)appID + appName:(NSString *)appName + installationsStore:(FIRInstallationsStore *)installationsStore + APIService:(FIRInstallationsAPIService *)APIService + IIDStore:(FIRInstallationsIIDStore *)IIDStore + IIDTokenStore:(FIRInstallationsIIDTokenStore *)IIDTokenStore { + self = [super init]; + if (self) { + _appID = appID; + _appName = appName; + _installationsStore = installationsStore; + _APIService = APIService; + _IIDStore = IIDStore; + _IIDTokenStore = IIDTokenStore; + + __weak FIRInstallationsIDController *weakSelf = self; + + _getInstallationPromiseCache = [[FIRInstallationsSingleOperationPromiseCache alloc] + initWithNewOperationHandler:^FBLPromise *_Nonnull { + FIRInstallationsIDController *strongSelf = weakSelf; + return [strongSelf createGetInstallationItemPromise]; + }]; + + _authTokenPromiseCache = [[FIRInstallationsSingleOperationPromiseCache alloc] + initWithNewOperationHandler:^FBLPromise *_Nonnull { + FIRInstallationsIDController *strongSelf = weakSelf; + return [strongSelf installationWithValidAuthTokenForcingRefresh:NO]; + }]; + + _authTokenForcingRefreshPromiseCache = [[FIRInstallationsSingleOperationPromiseCache alloc] + initWithNewOperationHandler:^FBLPromise *_Nonnull { + FIRInstallationsIDController *strongSelf = weakSelf; + return [strongSelf installationWithValidAuthTokenForcingRefresh:YES]; + }]; + + _deleteInstallationPromiseCache = [[FIRInstallationsSingleOperationPromiseCache alloc] + initWithNewOperationHandler:^FBLPromise *_Nonnull { + FIRInstallationsIDController *strongSelf = weakSelf; + return [strongSelf createDeleteInstallationPromise]; + }]; + } + return self; +} + +#pragma mark - Get Installation. + +- (FBLPromise *)getInstallationItem { + return [self.getInstallationPromiseCache getExistingPendingOrCreateNewPromise]; +} + +- (FBLPromise *)createGetInstallationItemPromise { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeNewGetInstallationOperationCreated, @"%s, appName: %@", + __PRETTY_FUNCTION__, self.appName); + + FBLPromise *installationItemPromise = + [self getStoredInstallation].recover(^id(NSError *error) { + return [self createAndSaveFID]; + }); + + // Initiate registration process on success if needed, but return the installation without waiting + // for it. + installationItemPromise.then(^id(FIRInstallationsItem *installation) { + [self getAuthTokenForcingRefresh:NO]; + return nil; + }); + + return installationItemPromise; +} + +- (FBLPromise *)getStoredInstallation { + return [self.installationsStore installationForAppID:self.appID appName:self.appName].validate( + ^BOOL(FIRInstallationsItem *installation) { + BOOL isValid = NO; + switch (installation.registrationStatus) { + case FIRInstallationStatusUnregistered: + case FIRInstallationStatusRegistered: + isValid = YES; + break; + + case FIRInstallationStatusUnknown: + isValid = NO; + break; + } + + return isValid; + }); +} + +- (FBLPromise *)createAndSaveFID { + return [self migrateOrGenerateInstallation] + .then(^FBLPromise *(FIRInstallationsItem *installation) { + return [self saveInstallation:installation]; + }) + .then(^FIRInstallationsItem *(FIRInstallationsItem *installation) { + [self postFIDDidChangeNotification]; + return installation; + }); +} + +- (FBLPromise *)saveInstallation:(FIRInstallationsItem *)installation { + return [self.installationsStore saveInstallation:installation].then( + ^FIRInstallationsItem *(NSNull *result) { + return installation; + }); +} + +/** + * Tries to migrate IID data stored by FirebaseInstanceID SDK or generates a new Installation ID if + * not found. + */ +- (FBLPromise *)migrateOrGenerateInstallation { + if (![self isDefaultApp]) { + // Existing IID should be used only for default FirebaseApp. + FIRInstallationsItem *installation = + [self createInstallationWithFID:[FIRInstallationsItem generateFID] IIDDefaultToken:nil]; + return [FBLPromise resolvedWith:installation]; + } + + return [[[FBLPromise + all:@[ [self.IIDStore existingIID], [self.IIDTokenStore existingIIDDefaultToken] ]] + then:^id _Nullable(NSArray *_Nullable results) { + NSString *existingIID = results[0]; + NSString *IIDDefaultToken = results[1]; + + return [self createInstallationWithFID:existingIID IIDDefaultToken:IIDDefaultToken]; + }] recover:^id _Nullable(NSError *_Nonnull error) { + return [self createInstallationWithFID:[FIRInstallationsItem generateFID] IIDDefaultToken:nil]; + }]; +} + +- (FIRInstallationsItem *)createInstallationWithFID:(NSString *)FID + IIDDefaultToken:(nullable NSString *)IIDDefaultToken { + FIRInstallationsItem *installation = [[FIRInstallationsItem alloc] initWithAppID:self.appID + firebaseAppName:self.appName]; + installation.firebaseInstallationID = FID; + installation.IIDDefaultToken = IIDDefaultToken; + installation.registrationStatus = FIRInstallationStatusUnregistered; + return installation; +} + +#pragma mark - FID registration + +- (FBLPromise *)registerInstallationIfNeeded: + (FIRInstallationsItem *)installation { + switch (installation.registrationStatus) { + case FIRInstallationStatusRegistered: + // Already registered. Do nothing. + return [FBLPromise resolvedWith:installation]; + + case FIRInstallationStatusUnknown: + case FIRInstallationStatusUnregistered: + // Registration required. Proceed. + break; + } + + return [self.APIService registerInstallation:installation] + .catch(^(NSError *_Nonnull error) { + if ([self doesRegistrationErrorRequireConfigChange:error]) { + FIRLogError(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeInvalidFirebaseConfiguration, + @"Firebase Installation registration failed for app with name: %@, error:\n" + @"%@\nPlease make sure you use valid GoogleService-Info.plist", + self.appName, error.userInfo[NSLocalizedFailureReasonErrorKey]); + } + }) + .then(^id(FIRInstallationsItem *registeredInstallation) { + return [self saveInstallation:registeredInstallation]; + }) + .then(^FIRInstallationsItem *(FIRInstallationsItem *registeredInstallation) { + // Server may respond with a different FID if the sent one cannot be accepted. + if (![registeredInstallation.firebaseInstallationID + isEqualToString:installation.firebaseInstallationID]) { + [self postFIDDidChangeNotification]; + } + return registeredInstallation; + }); +} + +- (BOOL)doesRegistrationErrorRequireConfigChange:(NSError *)error { + FIRInstallationsHTTPError *HTTPError = (FIRInstallationsHTTPError *)error; + if (![HTTPError isKindOfClass:[FIRInstallationsHTTPError class]]) { + return NO; + } + + switch (HTTPError.HTTPResponse.statusCode) { + // These are the errors that require Firebase configuration change. + case FIRInstallationsRegistrationHTTPCodeInvalidArgument: + case FIRInstallationsRegistrationHTTPCodeInvalidAPIKey: + case FIRInstallationsRegistrationHTTPCodeAPIKeyToProjectIDMismatch: + case FIRInstallationsRegistrationHTTPCodeProjectNotFound: + return YES; + + default: + return NO; + } +} + +#pragma mark - Auth Token + +- (FBLPromise *)getAuthTokenForcingRefresh:(BOOL)forceRefresh { + if (forceRefresh || [self.authTokenForcingRefreshPromiseCache getExistingPendingPromise] != nil) { + return [self.authTokenForcingRefreshPromiseCache getExistingPendingOrCreateNewPromise]; + } else { + return [self.authTokenPromiseCache getExistingPendingOrCreateNewPromise]; + } +} + +- (FBLPromise *)installationWithValidAuthTokenForcingRefresh: + (BOOL)forceRefresh { + FIRLogDebug(kFIRLoggerInstallations, kFIRInstallationsMessageCodeNewGetAuthTokenOperationCreated, + @"-[FIRInstallationsIDController installationWithValidAuthTokenForcingRefresh:%@], " + @"appName: %@", + @(forceRefresh), self.appName); + + return [self getInstallationItem] + .then(^FBLPromise *(FIRInstallationsItem *installation) { + return [self registerInstallationIfNeeded:installation]; + }) + .then(^id(FIRInstallationsItem *registeredInstallation) { + BOOL isTokenExpiredOrExpiresSoon = + [registeredInstallation.authToken.expirationDate timeIntervalSinceDate:[NSDate date]] < + kFIRInstallationsTokenExpirationThreshold; + if (forceRefresh || isTokenExpiredOrExpiresSoon) { + return [self refreshAuthTokenForInstallation:registeredInstallation]; + } else { + return registeredInstallation; + } + }) + .recover(^id(NSError *error) { + return [self regenerateFIDOnRefreshTokenErrorIfNeeded:error]; + }); +} + +- (FBLPromise *)refreshAuthTokenForInstallation: + (FIRInstallationsItem *)installation { + return [[self.APIService refreshAuthTokenForInstallation:installation] + then:^id _Nullable(FIRInstallationsItem *_Nullable refreshedInstallation) { + return [self saveInstallation:refreshedInstallation]; + }]; +} + +- (id)regenerateFIDOnRefreshTokenErrorIfNeeded:(NSError *)error { + if (![error isKindOfClass:[FIRInstallationsHTTPError class]]) { + // No recovery possible. Return the same error. + return error; + } + + FIRInstallationsHTTPError *HTTPError = (FIRInstallationsHTTPError *)error; + switch (HTTPError.HTTPResponse.statusCode) { + case FIRInstallationsAuthTokenHTTPCodeInvalidAuthentication: + case FIRInstallationsAuthTokenHTTPCodeFIDNotFound: + // The stored installation was damaged or blocked by the server. + // Delete the stored installation then generate and register a new one. + return [self getInstallationItem] + .then(^FBLPromise *(FIRInstallationsItem *installation) { + return [self deleteInstallationLocally:installation]; + }) + .then(^FBLPromise *(id result) { + return [self installationWithValidAuthTokenForcingRefresh:NO]; + }); + + default: + // No recovery possible. Return the same error. + return error; + } +} + +#pragma mark - Delete FID + +- (FBLPromise *)deleteInstallation { + return [self.deleteInstallationPromiseCache getExistingPendingOrCreateNewPromise]; +} + +- (FBLPromise *)createDeleteInstallationPromise { + FIRLogDebug(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeNewDeleteInstallationOperationCreated, @"%s, appName: %@", + __PRETTY_FUNCTION__, self.appName); + + // Check for ongoing requests first, if there is no a request, then check local storage for + // existing installation. + FBLPromise *currentInstallationPromise = + [self mostRecentInstallationOperation] ?: [self getStoredInstallation]; + + return currentInstallationPromise + .then(^id(FIRInstallationsItem *installation) { + return [self sendDeleteInstallationRequestIfNeeded:installation]; + }) + .then(^id(FIRInstallationsItem *installation) { + // Remove the installation from the local storage. + return [self deleteInstallationLocally:installation]; + }); +} + +- (FBLPromise *)deleteInstallationLocally:(FIRInstallationsItem *)installation { + return [self.installationsStore removeInstallationForAppID:installation.appID + appName:installation.firebaseAppName] + .then(^FBLPromise *(NSNull *result) { + return [self deleteExistingIIDIfNeeded]; + }) + .then(^NSNull *(NSNull *result) { + [self postFIDDidChangeNotification]; + return result; + }); +} + +- (FBLPromise *)sendDeleteInstallationRequestIfNeeded: + (FIRInstallationsItem *)installation { + switch (installation.registrationStatus) { + case FIRInstallationStatusUnknown: + case FIRInstallationStatusUnregistered: + // The installation is not registered, so it is safe to be deleted as is, so return early. + return [FBLPromise resolvedWith:installation]; + break; + + case FIRInstallationStatusRegistered: + // Proceed to de-register the installation on the server. + break; + } + + return [self.APIService deleteInstallation:installation].recover(^id(NSError *APIError) { + if ([FIRInstallationsErrorUtil isAPIError:APIError withHTTPCode:404]) { + // The installation was not found on the server. + // Return success. + return installation; + } else { + // Re-throw the error otherwise. + return APIError; + } + }); +} + +- (FBLPromise *)deleteExistingIIDIfNeeded { + if ([self isDefaultApp]) { + return [self.IIDStore deleteExistingIID]; + } else { + return [FBLPromise resolvedWith:[NSNull null]]; + } +} + +- (nullable FBLPromise *)mostRecentInstallationOperation { + return [self.authTokenForcingRefreshPromiseCache getExistingPendingPromise] + ?: [self.authTokenPromiseCache getExistingPendingPromise] + ?: [self.getInstallationPromiseCache getExistingPendingPromise]; +} + +#pragma mark - Notifications + +- (void)postFIDDidChangeNotification { + [[NSNotificationCenter defaultCenter] + postNotificationName:FIRInstallationIDDidChangeNotification + object:nil + userInfo:@{kFIRInstallationIDDidChangeNotificationAppNameKey : self.appName}]; +} + +#pragma mark - Default App + +- (BOOL)isDefaultApp { + return [self.appName isEqualToString:kFIRDefaultAppName]; +} + +#pragma mark - Keychain + ++ (NSString *)keychainServiceWithAppID:(NSString *)appID { +#if TARGET_OS_MACCATALYST || TARGET_OS_OSX + // We need to keep service name unique per application on macOS. + // Applications on macOS may request access to Keychain items stored by other applications. It + // means that when the app looks up for a relevant Keychain item in the service scope it will + // request user password to grant access to the Keychain if there are other Keychain items from + // other applications stored under the same Keychain Service. + return [kKeychainService stringByAppendingFormat:@".%@", appID]; +#else + // Use a constant Keychain service for non-macOS because: + // 1. Keychain items cannot be shared between apps until configured specifically so the service + // name collisions are not a concern + // 2. We don't want to change the service name to avoid doing a migration. + return kKeychainService; +#endif +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h new file mode 100644 index 00000000..aeb54e50 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.h @@ -0,0 +1,58 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The class makes sure the a single operation (represented by a promise) is performed at a time. If + * there is an ongoing operation, then its existing corresponding promise will be returned instead + * of starting a new operation. + */ +@interface FIRInstallationsSingleOperationPromiseCache<__covariant ResultType> : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** + * The designated initializer. + * @param newOperationHandler The block that must return a new promise representing the + * single-at-a-time operation. The promise should be fulfilled when the operation is completed. The + * factory block will be used to create a new promise when needed. + */ +- (instancetype)initWithNewOperationHandler: + (FBLPromise *_Nonnull (^)(void))newOperationHandler NS_DESIGNATED_INITIALIZER; + +/** + * Creates a new promise or returns an existing pending one. + * @return Returns and existing pending promise if exists. If the pending promise does not exist + * then a new one will be created using the `factory` block passed in the initializer. Once the + * pending promise gets resolved, it is removed, so calling the method again will lead to creating + * and caching another promise. + */ +- (FBLPromise *)getExistingPendingOrCreateNewPromise; + +/** + * Returns an existing pending promise or `nil`. + * @return Returns an existing pending promise if there is one or `nil` otherwise. + */ +- (nullable FBLPromise *)getExistingPendingPromise; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m new file mode 100644 index 00000000..dfccfe36 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsSingleOperationPromiseCache.m @@ -0,0 +1,75 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsSingleOperationPromiseCache.h" + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +@interface FIRInstallationsSingleOperationPromiseCache () +@property(nonatomic, readonly) FBLPromise *_Nonnull (^newOperationHandler)(void); +@property(nonatomic, nullable) FBLPromise *pendingPromise; +@end + +@implementation FIRInstallationsSingleOperationPromiseCache + +- (instancetype)initWithNewOperationHandler: + (FBLPromise *_Nonnull (^)(void))newOperationHandler { + if (newOperationHandler == nil) { + [NSException raise:NSInvalidArgumentException + format:@"`newOperationHandler` must not be `nil`."]; + } + + self = [super init]; + if (self) { + _newOperationHandler = [newOperationHandler copy]; + } + return self; +} + +- (FBLPromise *)getExistingPendingOrCreateNewPromise { + @synchronized(self) { + if (!self.pendingPromise) { + self.pendingPromise = self.newOperationHandler(); + + self.pendingPromise + .then(^id(id result) { + @synchronized(self) { + self.pendingPromise = nil; + return nil; + } + }) + .catch(^void(NSError *error) { + @synchronized(self) { + self.pendingPromise = nil; + } + }); + } + + return self.pendingPromise; + } +} + +- (nullable FBLPromise *)getExistingPendingPromise { + @synchronized(self) { + return self.pendingPromise; + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h new file mode 100644 index 00000000..3edc6920 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** + * The enum represent possible states of the installation ID. + * + * WARNING: The enum is stored to Keychain as a part of `FIRInstallationsStoredItem`. Modification + * of it can lead to incompatibility with previous version. Any modification must be evaluated and, + * if it is really needed, the `storageVersion` must be bumped and proper migration code added. + */ +typedef NS_ENUM(NSInteger, FIRInstallationsStatus) { + /** Represents either an initial status when a FIRInstallationsItem instance was created but not + * stored to Keychain or an undefined status (e.g. when the status failed to deserialize). + */ + FIRInstallationStatusUnknown, + /// The Firebase Installation has not yet been registered with FIS. + FIRInstallationStatusUnregistered, + /// The Firebase Installation has successfully been registered with FIS. + FIRInstallationStatusRegistered, +}; diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h new file mode 100644 index 00000000..b86fb39a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.h @@ -0,0 +1,71 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FBLPromise; +@class FIRInstallationsItem; +@class GULKeychainStorage; + +NS_ASSUME_NONNULL_BEGIN + +/// The user defaults suite name used to store data. +extern NSString *const kFIRInstallationsStoreUserDefaultsID; + +/// The class is responsible for storing and accessing the installations data. +@interface FIRInstallationsStore : NSObject + +/** + * The default initializer. + * @param storage The secure storage to save installations data. + * @param accessGroup The Keychain Access Group to store and request the installations data. + */ +- (instancetype)initWithSecureStorage:(GULKeychainStorage *)storage + accessGroup:(nullable NSString *)accessGroup; + +/** + * Retrieves existing installation ID if there is. + * @param appID The Firebase(Google) Application ID. + * @param appName The Firebase Application Name. + * + * @return Returns a `FBLPromise` instance. The promise is resolved with a FIRInstallationsItem + * instance if there is a valid installation stored for `appID` and `appName`. The promise is + * rejected with a specific error when the installation has not been found or with another possible + * error. + */ +- (FBLPromise *)installationForAppID:(NSString *)appID + appName:(NSString *)appName; + +/** + * Saves the given installation. + * + * @param installationItem The installation data. + * @return Returns a promise that is resolved with `[NSNull null]` on success. + */ +- (FBLPromise *)saveInstallation:(FIRInstallationsItem *)installationItem; + +/** + * Removes installation data for the given app parameters. + * @param appID The Firebase(Google) Application ID. + * @param appName The Firebase Application Name. + * + * @return Returns a promise that is resolved with `[NSNull null]` on success. + */ +- (FBLPromise *)removeInstallationForAppID:(NSString *)appID appName:(NSString *)appName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m new file mode 100644 index 00000000..46f58dba --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m @@ -0,0 +1,126 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsStore.h" + +#import + +#if __has_include() +#import +#else +#import "FBLPromises.h" +#endif + +#import + +#import "FIRInstallationsErrorUtil.h" +#import "FIRInstallationsItem.h" +#import "FIRInstallationsStoredItem.h" + +NSString *const kFIRInstallationsStoreUserDefaultsID = @"com.firebase.FIRInstallations"; + +@interface FIRInstallationsStore () +@property(nonatomic, readonly) GULKeychainStorage *secureStorage; +@property(nonatomic, readonly, nullable) NSString *accessGroup; +@property(nonatomic, readonly) dispatch_queue_t queue; +@property(nonatomic, readonly) GULUserDefaults *userDefaults; +@end + +@implementation FIRInstallationsStore + +- (instancetype)initWithSecureStorage:(GULKeychainStorage *)storage + accessGroup:(NSString *)accessGroup { + self = [super init]; + if (self) { + _secureStorage = storage; + _accessGroup = [accessGroup copy]; + _queue = dispatch_queue_create("com.firebase.FIRInstallationsStore", DISPATCH_QUEUE_SERIAL); + + NSString *userDefaultsSuiteName = _accessGroup ?: kFIRInstallationsStoreUserDefaultsID; + _userDefaults = [[GULUserDefaults alloc] initWithSuiteName:userDefaultsSuiteName]; + } + return self; +} + +- (FBLPromise *)installationForAppID:(NSString *)appID + appName:(NSString *)appName { + NSString *itemID = [FIRInstallationsItem identifierWithAppID:appID appName:appName]; + return [self installationExistsForAppID:appID appName:appName] + .then(^id(id result) { + return [self.secureStorage getObjectForKey:itemID + objectClass:[FIRInstallationsStoredItem class] + accessGroup:self.accessGroup]; + }) + .then(^id(FIRInstallationsStoredItem *_Nullable storedItem) { + if (storedItem == nil) { + return [FIRInstallationsErrorUtil installationItemNotFoundForAppID:appID appName:appName]; + } + + FIRInstallationsItem *item = [[FIRInstallationsItem alloc] initWithAppID:appID + firebaseAppName:appName]; + [item updateWithStoredItem:storedItem]; + return item; + }); +} + +- (FBLPromise *)saveInstallation:(FIRInstallationsItem *)installationItem { + FIRInstallationsStoredItem *storedItem = [installationItem storedItem]; + NSString *identifier = [installationItem identifier]; + + return + [self.secureStorage setObject:storedItem forKey:identifier accessGroup:self.accessGroup].then( + ^id(id result) { + return [self setInstallationExists:YES forItemWithIdentifier:identifier]; + }); +} + +- (FBLPromise *)removeInstallationForAppID:(NSString *)appID appName:(NSString *)appName { + NSString *identifier = [FIRInstallationsItem identifierWithAppID:appID appName:appName]; + return [self.secureStorage removeObjectForKey:identifier accessGroup:self.accessGroup].then( + ^id(id result) { + return [self setInstallationExists:NO forItemWithIdentifier:identifier]; + }); +} + +#pragma mark - User defaults + +- (FBLPromise *)installationExistsForAppID:(NSString *)appID appName:(NSString *)appName { + NSString *identifier = [FIRInstallationsItem identifierWithAppID:appID appName:appName]; + return [FBLPromise onQueue:self.queue + do:^id _Nullable { + return [[self userDefaults] objectForKey:identifier] != nil + ? [NSNull null] + : [FIRInstallationsErrorUtil + installationItemNotFoundForAppID:appID + appName:appName]; + }]; +} + +- (FBLPromise *)setInstallationExists:(BOOL)exists + forItemWithIdentifier:(NSString *)identifier { + return [FBLPromise onQueue:self.queue + do:^id _Nullable { + if (exists) { + [[self userDefaults] setBool:YES forKey:identifier]; + } else { + [[self userDefaults] removeObjectForKey:identifier]; + } + + return [NSNull null]; + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h new file mode 100644 index 00000000..f6e42828 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h @@ -0,0 +1,58 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * The enum represent possible states of the installation auth token. + * + * WARNING: The enum is stored to Keychain as a part of `FIRInstallationsStoredAuthToken`. + * Modification of it can lead to incompatibility with previous version. Any modification must be + * evaluated and, if it is really needed, the `storageVersion` must be bumped and proper migration + * code added. + */ +typedef NS_ENUM(NSInteger, FIRInstallationsAuthTokenStatus) { + /// An initial status or an undefined value. + FIRInstallationsAuthTokenStatusUnknown, + /// The auth token has been received from the server. + FIRInstallationsAuthTokenStatusTokenReceived +}; + +/** + * This class serializes and deserializes the installation data into/from `NSData` to be stored in + * Keychain. This class is primarily used by `FIRInstallationsStore`. It is also used on the logic + * level as a data object (see `FIRInstallationsItem.authToken`). + * + * WARNING: Modification of the class properties can lead to incompatibility with the stored data + * encoded by the previous class versions. Any modification must be evaluated and, if it is really + * needed, the `storageVersion` must be bumped and proper migration code added. + */ +@interface FIRInstallationsStoredAuthToken : NSObject +@property FIRInstallationsAuthTokenStatus status; + +/// The token that can be used to authorize requests to Firebase backend. +@property(nullable, copy) NSString *token; +/// The date when the auth token expires. +@property(nullable, copy) NSDate *expirationDate; + +/// The version of local storage. +@property(nonatomic, readonly) NSInteger storageVersion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m new file mode 100644 index 00000000..b21f6dd2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.m @@ -0,0 +1,77 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsStoredAuthToken.h" + +#import "FIRInstallationsLogger.h" + +NSString *const kFIRInstallationsStoredAuthTokenStatusKey = @"status"; +NSString *const kFIRInstallationsStoredAuthTokenTokenKey = @"token"; +NSString *const kFIRInstallationsStoredAuthTokenExpirationDateKey = @"expirationDate"; +NSString *const kFIRInstallationsStoredAuthTokenStorageVersionKey = @"storageVersion"; + +NSInteger const kFIRInstallationsStoredAuthTokenStorageVersion = 1; + +@implementation FIRInstallationsStoredAuthToken + +- (NSInteger)storageVersion { + return kFIRInstallationsStoredAuthTokenStorageVersion; +} + +- (nonnull id)copyWithZone:(nullable NSZone *)zone { + FIRInstallationsStoredAuthToken *clone = [[FIRInstallationsStoredAuthToken alloc] init]; + clone.status = self.status; + clone.token = [self.token copy]; + clone.expirationDate = self.expirationDate; + return clone; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)aCoder { + [aCoder encodeInteger:self.status forKey:kFIRInstallationsStoredAuthTokenStatusKey]; + [aCoder encodeObject:self.token forKey:kFIRInstallationsStoredAuthTokenTokenKey]; + [aCoder encodeObject:self.expirationDate + forKey:kFIRInstallationsStoredAuthTokenExpirationDateKey]; + [aCoder encodeInteger:self.storageVersion + forKey:kFIRInstallationsStoredAuthTokenStorageVersionKey]; +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder { + NSInteger storageVersion = + [aDecoder decodeIntegerForKey:kFIRInstallationsStoredAuthTokenStorageVersionKey]; + if (storageVersion > kFIRInstallationsStoredAuthTokenStorageVersion) { + FIRLogWarning(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeAuthTokenCoderVersionMismatch, + @"FIRInstallationsStoredAuthToken was encoded by a newer coder version %ld. " + @"Current coder version is %ld. Some auth token data may be lost.", + (long)storageVersion, (long)kFIRInstallationsStoredAuthTokenStorageVersion); + } + + FIRInstallationsStoredAuthToken *object = [[FIRInstallationsStoredAuthToken alloc] init]; + object.status = [aDecoder decodeIntegerForKey:kFIRInstallationsStoredAuthTokenStatusKey]; + object.token = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kFIRInstallationsStoredAuthTokenTokenKey]; + object.expirationDate = + [aDecoder decodeObjectOfClass:[NSDate class] + forKey:kFIRInstallationsStoredAuthTokenExpirationDateKey]; + + return object; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h new file mode 100644 index 00000000..4926588c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h @@ -0,0 +1,51 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRInstallationsStatus.h" + +@class FIRInstallationsStoredAuthToken; +@class FIRInstallationsStoredIIDCheckin; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The class is supposed to be used by `FIRInstallationsStore` only. It is required to + * serialize/deserialize the installation data into/from `NSData` to be stored in Keychain. + * + * WARNING: Modification of the class properties can lead to incompatibility with the stored data + * encoded by the previous class versions. Any modification must be evaluated and, if it is really + * needed, the `storageVersion` must be bumped and proper migration code added. + */ +@interface FIRInstallationsStoredItem : NSObject + +/// A stable identifier that uniquely identifies the app instance. +@property(nonatomic, copy, nullable) NSString *firebaseInstallationID; +/// The `refreshToken` is used to authorize the auth token requests. +@property(nonatomic, copy, nullable) NSString *refreshToken; + +@property(nonatomic, nullable) FIRInstallationsStoredAuthToken *authToken; +@property(nonatomic) FIRInstallationsStatus registrationStatus; + +/// Instance ID default auth token imported from IID store as a part of IID migration. +@property(nonatomic, nullable) NSString *IIDDefaultToken; + +/// The version of local storage. +@property(nonatomic, readonly) NSInteger storageVersion; +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m new file mode 100644 index 00000000..0c7655c3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.m @@ -0,0 +1,80 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallationsStoredItem.h" + +#import "FIRInstallationsLogger.h" +#import "FIRInstallationsStoredAuthToken.h" + +NSString *const kFIRInstallationsStoredItemFirebaseInstallationIDKey = @"firebaseInstallationID"; +NSString *const kFIRInstallationsStoredItemRefreshTokenKey = @"refreshToken"; +NSString *const kFIRInstallationsStoredItemAuthTokenKey = @"authToken"; +NSString *const kFIRInstallationsStoredItemRegistrationStatusKey = @"registrationStatus"; +NSString *const kFIRInstallationsStoredItemIIDDefaultTokenKey = @"IIDDefaultToken"; +NSString *const kFIRInstallationsStoredItemStorageVersionKey = @"storageVersion"; + +NSInteger const kFIRInstallationsStoredItemStorageVersion = 1; + +@implementation FIRInstallationsStoredItem + +- (NSInteger)storageVersion { + return kFIRInstallationsStoredItemStorageVersion; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)aCoder { + [aCoder encodeObject:self.firebaseInstallationID + forKey:kFIRInstallationsStoredItemFirebaseInstallationIDKey]; + [aCoder encodeObject:self.refreshToken forKey:kFIRInstallationsStoredItemRefreshTokenKey]; + [aCoder encodeObject:self.authToken forKey:kFIRInstallationsStoredItemAuthTokenKey]; + [aCoder encodeInteger:self.registrationStatus + forKey:kFIRInstallationsStoredItemRegistrationStatusKey]; + [aCoder encodeObject:self.IIDDefaultToken forKey:kFIRInstallationsStoredItemIIDDefaultTokenKey]; + [aCoder encodeInteger:self.storageVersion forKey:kFIRInstallationsStoredItemStorageVersionKey]; +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder { + NSInteger storageVersion = + [aDecoder decodeIntegerForKey:kFIRInstallationsStoredItemStorageVersionKey]; + if (storageVersion > self.storageVersion) { + FIRLogWarning(kFIRLoggerInstallations, + kFIRInstallationsMessageCodeInstallationCoderVersionMismatch, + @"FIRInstallationsStoredItem was encoded by a newer coder version %ld. Current " + @"coder version is %ld. Some installation data may be lost.", + (long)storageVersion, (long)kFIRInstallationsStoredItemStorageVersion); + } + + FIRInstallationsStoredItem *item = [[FIRInstallationsStoredItem alloc] init]; + item.firebaseInstallationID = + [aDecoder decodeObjectOfClass:[NSString class] + forKey:kFIRInstallationsStoredItemFirebaseInstallationIDKey]; + item.refreshToken = [aDecoder decodeObjectOfClass:[NSString class] + forKey:kFIRInstallationsStoredItemRefreshTokenKey]; + item.authToken = [aDecoder decodeObjectOfClass:[FIRInstallationsStoredAuthToken class] + forKey:kFIRInstallationsStoredItemAuthTokenKey]; + item.registrationStatus = + [aDecoder decodeIntegerForKey:kFIRInstallationsStoredItemRegistrationStatusKey]; + item.IIDDefaultToken = + [aDecoder decodeObjectOfClass:[NSString class] + forKey:kFIRInstallationsStoredItemIIDDefaultTokenKey]; + + return item; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallations.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallations.h new file mode 100644 index 00000000..4839b4e0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallations.h @@ -0,0 +1,120 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRApp; +@class FIRInstallationsAuthTokenResult; + +NS_ASSUME_NONNULL_BEGIN + +/** A notification with this name is sent each time an installation is created or deleted. */ +FOUNDATION_EXPORT const NSNotificationName FIRInstallationIDDidChangeNotification; +/** `userInfo` key for the `FirebaseApp.name` in `FIRInstallationIDDidChangeNotification`. */ +FOUNDATION_EXPORT NSString *const kFIRInstallationIDDidChangeNotificationAppNameKey; + +/** + * An installation ID handler block. + * @param identifier The installation ID string if exists or `nil` otherwise. + * @param error The error when `identifier == nil` or `nil` otherwise. + */ +typedef void (^FIRInstallationsIDHandler)(NSString *__nullable identifier, + NSError *__nullable error) + NS_SWIFT_NAME(InstallationsIDHandler); + +/** + * An authorization token handler block. + * @param tokenResult An instance of `InstallationsAuthTokenResult` in case of success or `nil` + * otherwise. + * @param error The error when `tokenResult == nil` or `nil` otherwise. + */ +typedef void (^FIRInstallationsTokenHandler)( + FIRInstallationsAuthTokenResult *__nullable tokenResult, NSError *__nullable error) + NS_SWIFT_NAME(InstallationsTokenHandler); + +/** + * The class provides API for Firebase Installations. + * Each configured `FirebaseApp` has a corresponding single instance of `Installations`. + * An instance of the class provides access to the installation info for the `FirebaseApp` as well + * as the ability to delete it. A Firebase Installation is unique by `FirebaseApp.name` and + * `FirebaseApp.options.googleAppID` . + */ +NS_SWIFT_NAME(Installations) +@interface FIRInstallations : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Returns a default instance of `Installations`. + * @returns An instance of `Installations` for `FirebaseApp.defaultApp(). + * @throw Throws an exception if the default app is not configured yet or required `FirebaseApp` + * options are missing. + */ ++ (FIRInstallations *)installations NS_SWIFT_NAME(installations()); + +/** + * Returns an instance of `Installations` for an application. + * @param application A configured `FirebaseApp` instance. + * @returns An instance of `Installations` corresponding to the passed application. + * @throw Throws an exception if required `FirebaseApp` options are missing. + */ ++ (FIRInstallations *)installationsWithApp:(FIRApp *)application NS_SWIFT_NAME(installations(app:)); + +/** + * The method creates or retrieves an installation ID. The installation ID is a stable identifier + * that uniquely identifies the app instance. NOTE: If the application already has an existing + * FirebaseInstanceID then the InstanceID identifier will be used. + * @param completion A completion handler which is invoked when the operation completes. See + * `InstallationsIDHandler` for additional details. + */ +- (void)installationIDWithCompletion:(FIRInstallationsIDHandler)completion; + +/** + * Retrieves (locally if it exists or from the server) a valid authorization token. An existing + * token may be invalidated or expired, so it is recommended to fetch the auth token before each + * server request. The method does the same as `Installations.authTokenForcingRefresh(:, + * completion:)` with forcing refresh `NO`. + * @param completion A completion handler which is invoked when the operation completes. See + * `InstallationsTokenHandler` for additional details. + */ +- (void)authTokenWithCompletion:(FIRInstallationsTokenHandler)completion; + +/** + * Retrieves (locally or from the server depending on `forceRefresh` value) a valid authorization + * token. An existing token may be invalidated or expire, so it is recommended to fetch the auth + * token before each server request. This method should be used with `forceRefresh == YES` when e.g. + * a request with the previously fetched auth token failed with "Not Authorized" error. + * @param forceRefresh If `YES` then the locally cached auth token will be ignored and a new one + * will be requested from the server. If `NO`, then the locally cached auth token will be returned + * if exists and has not expired yet. + * @param completion A completion handler which is invoked when the operation completes. See + * `InstallationsTokenHandler` for additional details. + */ +- (void)authTokenForcingRefresh:(BOOL)forceRefresh + completion:(FIRInstallationsTokenHandler)completion; + +/** + * Deletes all the installation data including the unique identifier, auth tokens and + * all related data on the server side. A network connection is required for the method to + * succeed. If fails, the existing installation data remains untouched. + * @param completion A completion handler which is invoked when the operation completes. `error == + * nil` indicates success. + */ +- (void)deleteWithCompletion:(void (^)(NSError *__nullable error))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsAuthTokenResult.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsAuthTokenResult.h new file mode 100644 index 00000000..7753132d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsAuthTokenResult.h @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** The class represents a result of the auth token request. */ +NS_SWIFT_NAME(InstallationsAuthTokenResult) +@interface FIRInstallationsAuthTokenResult : NSObject + +/** The authorization token string. */ +@property(nonatomic, readonly) NSString *authToken; + +/** The auth token expiration date. */ +@property(nonatomic, readonly) NSDate *expirationDate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsErrors.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsErrors.h new file mode 100644 index 00000000..d0c3b996 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsErrors.h @@ -0,0 +1,34 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +extern NSString *const kFirebaseInstallationsErrorDomain; + +typedef NS_ENUM(NSUInteger, FIRInstallationsErrorCode) { + /** Unknown error. See `userInfo` for details. */ + FIRInstallationsErrorCodeUnknown = 0, + + /** Keychain error. See `userInfo` for details. */ + FIRInstallationsErrorCodeKeychain = 1, + + /** Server unreachable. A network error or server is unavailable. See `userInfo` for details. */ + FIRInstallationsErrorCodeServerUnreachable = 2, + + /** FirebaseApp configuration issues e.g. invalid GMP-App-ID, etc. See `userInfo` for details. */ + FIRInstallationsErrorCodeInvalidConfiguration = 3, + +} NS_SWIFT_NAME(InstallationsErrorCode); diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsVersion.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsVersion.h new file mode 100644 index 00000000..8cdf6778 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FIRInstallationsVersion.h @@ -0,0 +1,19 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +FOUNDATION_EXPORT const char *const FIRInstallationsVersionStr; diff --git a/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations.h b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations.h new file mode 100644 index 00000000..accc9ac6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Public/FirebaseInstallations.h @@ -0,0 +1,20 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRInstallations.h" +#import "FIRInstallationsAuthTokenResult.h" +#import "FIRInstallationsErrors.h" +#import "FIRInstallationsVersion.h" diff --git a/MyExperiences copy/Pods/FirebaseInstallations/LICENSE b/MyExperiences copy/Pods/FirebaseInstallations/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/FirebaseInstallations/README.md b/MyExperiences copy/Pods/FirebaseInstallations/README.md new file mode 100644 index 00000000..d778205f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseInstallations/README.md @@ -0,0 +1,311 @@ +[![Version](https://img.shields.io/cocoapods/v/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) + +[![Actions Status][gh-abtesting-badge]][gh-actions] +[![Actions Status][gh-auth-badge]][gh-actions] +[![Actions Status][gh-core-badge]][gh-actions] +[![Actions Status][gh-crashlytics-badge]][gh-actions] +[![Actions Status][gh-database-badge]][gh-actions] +[![Actions Status][gh-datatransport-badge]][gh-actions] +[![Actions Status][gh-dynamiclinks-badge]][gh-actions] +[![Actions Status][gh-firebasepod-badge]][gh-actions] +[![Actions Status][gh-firestore-badge]][gh-actions] +[![Actions Status][gh-functions-badge]][gh-actions] +[![Actions Status][gh-inappmessaging-badge]][gh-actions] +[![Actions Status][gh-interop-badge]][gh-actions] +[![Actions Status][gh-messaging-badge]][gh-actions] +[![Actions Status][gh-remoteconfig-badge]][gh-actions] +[![Actions Status][gh-storage-badge]][gh-actions] +[![Actions Status][gh-symbolcollision-badge]][gh-actions] +[![Actions Status][gh-zip-badge]][gh-actions] +[![Travis](https://travis-ci.org/firebase/firebase-ios-sdk.svg?branch=master)](https://travis-ci.org/firebase/firebase-ios-sdk) + +# Firebase Apple Open Source Development + +This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics, +FirebasePerformance, and FirebaseML. + +The repository also includes GoogleUtilities source. The +[GoogleUtilities](GoogleUtilities/README.md) pod is +a set of utilities used by Firebase and other Google products. + +Firebase is an app development platform with tools to help you build, grow and +monetize your app. More information about Firebase can be found at +[https://firebase.google.com](https://firebase.google.com). + +## Installation + +See the three subsections for details about three different installation methods. +1. [Standard pod install](README.md#standard-pod-install) +1. [Installing from the GitHub repo](README.md#installing-from-github) +1. [Experimental Carthage](README.md#carthage-ios-only) + +### Standard pod install + +Go to +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Installing from GitHub + +For releases starting with 5.0.0, the source for each release is also deployed +to CocoaPods master and available via standard +[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod). + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See +[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All of the official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +``` +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +``` + +To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do: + +``` +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution are at +[Carthage](Carthage.md). + +### Rome + +Instructions for installing binary frameworks via +[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md). + +### Using Firebase from a Framework or a library + +[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md) + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + + * Xcode 10.3 (or later) + * CocoaPods 1.7.2 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self contained Xcode project. See +[Firestore/README.md](Firestore/README.md). + +### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +### Adding a New Firebase Pod + +See [AddNewPod.md](AddNewPod.md). + +### Managing Headers and Imports + +See [HeadersImports.md](HeadersImports.md). + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh) +before creating a PR. + +Travis will verify that any code changes are done in a style compliant way. Install +`clang-format` and `swiftformat`. +These commands will get the right versions: + +``` +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb +``` + +Note: if you already have a newer version of these installed you may need to +`brew switch` to this version. + +To update this section, find the versions of clang-format and swiftformat.rb to +match the versions in the CI failure logs +[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula). + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +#### Viewing Code Coverage (Deprecated) + +First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`. + +After running the `AllUnitTests_iOS` scheme in Xcode, execute +`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output` +at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results. + +### Running Sample Apps +In order to run the sample apps and integration tests, you'll need valid +`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist +files without real values, but can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g. `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file +(e.g. in [Example/Database/App/](Example/Database/App/)); + +Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require +special Apple capabilities, and you will have to change the sample app to use a unique bundle +identifier that you can control in your own Apple Developer account. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase Auth + +If you're doing specific Firebase Auth development, see +[the Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to +`Example/Database/App/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[FIRStorageIntegrationTests.m](FirebaseStorage/Tests/Integration/FIRStorageIntegrationTests.m). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to actually test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account, and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications, and will not receive push notifications. +In order to receive push notifications, you'll have to follow the steps above and run the app on a +physical device. + +## Community Supported Efforts + +We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are +very grateful! We'd like to empower as many developers as we can to be able to use Firebase and +participate in the Firebase community. + +### tvOS, macOS, watchOS and Catalyst +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on +tvOS, macOS, watchOS and Catalyst. + +For tvOS, checkout the [Sample](Example/tvOSSample). +For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the +[Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this +repository is actively developed primarily for iOS. While we can catch basic unit test issues with +Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you +encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the app +has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +To install, add a subset of the following to the Podfile: + +``` +pod 'Firebase/ABTesting' # No watchOS support yet +pod 'Firebase/Auth' # No watchOS support yet +pod 'Firebase/Crashlytics' # No watchOS support yet +pod 'Firebase/Database' # No watchOS support yet +pod 'Firebase/Firestore' # No watchOS support yet +pod 'Firebase/Functions' # No watchOS support yet +pod 'Firebase/Messaging' +pod 'Firebase/RemoteConfig' # No watchOS support yet +pod 'Firebase/Storage' +``` + +#### Additional Catalyst Notes + +* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability` +to Build Settings. +* FirebaseFirestore requires signing the +[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +iOS SDK. + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg +[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg +[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg +[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg +[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg +[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg +[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg +[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg +[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg +[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg +[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg +[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg +[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg +[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg +[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg +[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRAppInternal.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRAppInternal.h new file mode 100644 index 00000000..9a0c943d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRAppInternal.h @@ -0,0 +1,173 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRApp.h" +#else +#import +#endif + +// The has_include is a workaround so the old IID needed for the FIS tests can find FIRErrors.h +#if __has_include("FirebaseCore/Sources/Private/FIRErrors.h") +#import "FirebaseCore/Sources/Private/FIRErrors.h" +#else +#import +#endif + +@class FIRComponentContainer; +@protocol FIRLibrary; + +/** + * The internal interface to FIRApp. This is meant for first-party integrators, who need to receive + * FIRApp notifications, log info about the success or failure of their configuration, and access + * other internal functionality of FIRApp. + * + * TODO(b/28296561): Restructure this header. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; + +/** + * The format string for the User Defaults key used for storing the data collection enabled flag. + * This includes formatting to append the Firebase App's name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** + * A notification fired containing diagnostic information when SDK errors occur. + */ +extern NSString *const kFIRAppDiagnosticsNotification; + +/** @var FIRAuthStateDidChangeInternalNotification + @brief The name of the @c NSNotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FIRAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FIRAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FIRAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FIRApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FIRAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/* + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * Creates an error for failing to configure a subspec service. This method is called by each + * FIRApp notification listener. + */ ++ (NSError *)errorForSubspecConfigurationFailureWithDomain:(NSString *)domain + errorCode:(FIRErrorCode)code + service:(NSString *)service + reason:(NSString *)reason; +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Used by each SDK to send logs about SDK configuration status to Clearcut. + * + * @note This API is a no-op, please remove calls to it. + */ +- (void)sendLogsWithServiceName:(NSString *)serviceName + version:(NSString *)version + error:(NSError *)error; + +/** + * Can be used by the unit tests in eack SDK to reset FIRApp. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponent.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponent.h new file mode 100644 index 00000000..cb51ee70 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponent.h @@ -0,0 +1,91 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +@class FIRDependency; + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the Component. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// An array of dependencies for the component. +@property(nonatomic, copy, readonly) NSArray *dependencies; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param dependencies - Any dependencies the `implementingClass` has, optional or required. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:dependencies:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponentContainer.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponentContainer.h new file mode 100644 index 00000000..db2bafef --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponentContainer.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponentType.h") +#import "FirebaseCore/Sources/Private/FIRComponentType.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#else +#import +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant:` call. These classes should conform to `FIRComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Unavailable. Use the `container` property on `FIRApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponentType.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponentType.h new file mode 100644 index 00000000..6f2aca7b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRComponentType.h @@ -0,0 +1,34 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (T)instanceForProtocol:(Protocol *)protocol inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h new file mode 100644 index 00000000..76c0c05f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRDiagnosticsData; +@class FIROptions; + +NS_ASSUME_NONNULL_BEGIN + +/** Connects FIRCore with the CoreDiagnostics library. */ +@interface FIRCoreDiagnosticsConnector : NSObject + +/** Logs FirebaseCore related data. + * + * @param options The options object containing data to log. + */ ++ (void)logCoreTelemetryWithOptions:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRDependency.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRDependency.h new file mode 100644 index 00000000..46e9b7ea --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRDependency.h @@ -0,0 +1,45 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A dependency on a specific protocol's functionality. +NS_SWIFT_NAME(Dependency) +@interface FIRDependency : NSObject + +/// The protocol describing functionality being depended on. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// A flag to specify if the dependency is required or not. +@property(nonatomic, readonly) BOOL isRequired; + +/// Initializes a dependency that is required. Calls `initWithProtocol:isRequired` with `YES` for +/// the required parameter. +/// Creates a required dependency on the specified protocol's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol; + +/// Creates a dependency on the specified protocol's functionality and specify if it's required for +/// the class's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol isRequired:(BOOL)required; + +/// Use `dependencyWithProtocol:isRequired:` instead. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRErrorCode.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRErrorCode.h new file mode 100644 index 00000000..c90d9eec --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRErrorCode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** Error codes in Firebase error domain. */ +typedef NS_ENUM(NSInteger, FIRErrorCode) { + /** + * Unknown error. + */ + FIRErrorCodeUnknown = 0, + /** + * Loading data from the GoogleService-Info.plist file failed. This is a fatal error and should + * not be ignored. Further calls to the API will fail and/or possibly cause crashes. + */ + FIRErrorCodeInvalidPlistFile = -100, + + /** + * Validating the Google App ID format failed. + */ + FIRErrorCodeInvalidAppID = -101, + + /** + * Error code for failing to configure a specific service. It's deprecated, but + * still used after copybara. + */ + FIRErrorCodeConfigFailed = -114, +}; diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRErrors.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRErrors.h new file mode 100644 index 00000000..19e47328 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRErrors.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#include "FIRErrorCode.h" + +extern NSString *const kFirebaseErrorDomain; +extern NSString *const kFirebaseConfigErrorDomain; +extern NSString *const kFirebaseCoreErrorDomain; +extern NSString *const kFirebasePerfErrorDomain; diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h new file mode 100644 index 00000000..bfff73e5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h @@ -0,0 +1,39 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRHeartbeatInfo : NSObject + +// Enum representing the different heartbeat codes. +typedef NS_ENUM(NSInteger, FIRHeartbeatInfoCode) { + FIRHeartbeatInfoCodeNone = 0, + FIRHeartbeatInfoCodeSDK = 1, + FIRHeartbeatInfoCodeGlobal = 2, + FIRHeartbeatInfoCodeCombined = 3, +}; + +/** + * Get heartbeat code requred for the sdk. + * @param heartbeatTag String representing the sdk heartbeat tag. + * @return Heartbeat code indicating whether or not an sdk/global heartbeat + * needs to be sent + */ ++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRLibrary.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRLibrary.h new file mode 100644 index 00000000..e7a9e077 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRLibrary.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponent.h") +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#else +#import +#endif + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more FIRComponents that will be registered in +/// FIRApp and participate in dependency resolution and injection. ++ (NSArray *)componentsToRegister; + +@optional +/// Implement this method if the library needs notifications for lifecycle events. This method is +/// called when the developer calls `FirebaseApp.configure()`. ++ (void)configureWithApp:(FIRApp *)app; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRLogger.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRLogger.h new file mode 100644 index 00000000..6fd77844 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIRLogger.h @@ -0,0 +1,156 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRLoggerLevel.h" +#else +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern FIRLoggerService kFIRLoggerABTesting; +extern FIRLoggerService kFIRLoggerAdMob; +extern FIRLoggerService kFIRLoggerAnalytics; +extern FIRLoggerService kFIRLoggerAuth; +extern FIRLoggerService kFIRLoggerCrash; +extern FIRLoggerService kFIRLoggerCore; +extern FIRLoggerService kFIRLoggerMLKit; +extern FIRLoggerService kFIRLoggerPerf; +extern FIRLoggerService kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to YES, the logging level for Analytics will be set to FIRLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Changes the default logging level of FIRLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FIRLoggerLevelNotice if the app is running from App Store. + * (required) log level (one of the FIRLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FIRLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + FIRLoggerService service, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FIRLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +@interface FIRLoggerWrapper : NSObject + +/** + * Objective-C wrapper for FIRLogBasic to allow weak linking to FIRLogger + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ + ++ (void)logWithLevel:(FIRLoggerLevel)level + withService:(FIRLoggerService)service + withCode:(NSString *)messageCode + withMessage:(NSString *)message + withArgs:(va_list)args; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIROptionsInternal.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIROptionsInternal.h new file mode 100644 index 00000000..acaf4586 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FIROptionsInternal.h @@ -0,0 +1,119 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIROptions.h" +#else +#import +#endif + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * This header file exposes the initialization of FIROptions to internal use. + */ +@interface FIROptions () + +/** + * resetDefaultOptions and initInternalWithOptionsDictionary: are exposed only for unit tests. + */ ++ (void)resetDefaultOptions; + +/** + * Initializes the options with dictionary. The above strings are the keys of the dictionary. + * This is the designated initializer. + */ +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)serviceInfoDictionary; + +/** + * defaultOptions and defaultOptionsDictionary are exposed in order to be used in FIRApp and + * other first party services. + */ ++ (FIROptions *)defaultOptions; + ++ (NSDictionary *)defaultOptionsDictionary; + +/** + * Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at + * runtime. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet; + +/** + * Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless + * explicitly disabled in GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionEnabled; + +/** + * Whether or not Analytics Collection was completely disabled. If YES, then + * isAnalyticsCollectionEnabled will be NO. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionDeactivated; + +/** + * The version ID of the client library, e.g. @"1100000". + */ +@property(nonatomic, readonly, copy) NSString *libraryVersionID; + +/** + * The flag indicating whether this object was constructed with the values in the default plist + * file. + */ +@property(nonatomic) BOOL usingOptionsFromDefaultPlist; + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isMeasurementEnabled; + +/** + * Whether or not Analytics was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isAnalyticsEnabled; + +/** + * Whether or not SignIn was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isSignInEnabled; + +/** + * Whether or not editing is locked. This should occur after FIROptions has been set on a FIRApp. + */ +@property(nonatomic, getter=isEditingLocked) BOOL editingLocked; + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FirebaseCoreInternal.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FirebaseCoreInternal.h new file mode 100644 index 00000000..93af6cb8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseCore/Sources/Private/FirebaseCoreInternal.h @@ -0,0 +1,31 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An umbrella header, for any other libraries in this repo to access Firebase Public and Private +// headers. Any package manager complexity should be handled here. + +#if SWIFT_PACKAGE +@import FirebaseCore; +#else +#import +#endif + +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" +#import "FirebaseCore/Sources/Private/FIRDependency.h" +#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorage.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorage.m new file mode 100644 index 00000000..c407272a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorage.m @@ -0,0 +1,260 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FirebaseStorage/Sources/FIRStorageComponent.h" +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStoragePath.h" +#import "FirebaseStorage/Sources/FIRStorageReference_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTokenAuthorizer.h" +#import "FirebaseStorage/Sources/FIRStorageUtils.h" +#import "FirebaseStorage/Sources/FIRStorage_Private.h" + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import "Interop/Auth/Public/FIRAuthInterop.h" + +#import +#import + +static NSMutableDictionary< + NSString * /* app name */, + NSMutableDictionary *> *_fetcherServiceMap; +static GTMSessionFetcherRetryBlock _retryWhenOffline; + +@interface FIRStorage () { + /// Stored Auth reference, if it exists. This needs to be stored for `copyWithZone:`. + id _Nullable _auth; +} +@end + +@implementation FIRStorage + ++ (void)initialize { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _retryWhenOffline = ^(BOOL suggestedWillRetry, NSError *GTM_NULLABLE_TYPE error, + GTMSessionFetcherRetryResponse response) { + bool shouldRetry = suggestedWillRetry; + // GTMSessionFetcher does not consider being offline a retryable error, but we do, so we + // special-case it here. + if (!shouldRetry && error) { + shouldRetry = error.code == NSURLErrorNotConnectedToInternet; + } + response(shouldRetry); + }; + _fetcherServiceMap = [[NSMutableDictionary alloc] init]; + }); +} + ++ (GTMSessionFetcherService *)fetcherServiceForApp:(FIRApp *)app + bucket:(NSString *)bucket + auth:(nullable id)auth { + @synchronized(_fetcherServiceMap) { + NSMutableDictionary *bucketMap = _fetcherServiceMap[app.name]; + if (!bucketMap) { + bucketMap = [[NSMutableDictionary alloc] init]; + _fetcherServiceMap[app.name] = bucketMap; + } + + GTMSessionFetcherService *fetcherService = bucketMap[bucket]; + if (!fetcherService) { + fetcherService = [[GTMSessionFetcherService alloc] init]; + [fetcherService setRetryEnabled:YES]; + [fetcherService setRetryBlock:_retryWhenOffline]; + FIRStorageTokenAuthorizer *authorizer = + [[FIRStorageTokenAuthorizer alloc] initWithGoogleAppID:app.options.googleAppID + fetcherService:fetcherService + authProvider:auth]; + [fetcherService setAuthorizer:authorizer]; + bucketMap[bucket] = fetcherService; + } + return fetcherService; + } +} + ++ (void)setGTMSessionFetcherLoggingEnabled:(BOOL)isLoggingEnabled { + [GTMSessionFetcher setLoggingEnabled:isLoggingEnabled]; +} + ++ (instancetype)storage { + return [self storageForApp:[FIRApp defaultApp]]; +} + ++ (instancetype)storageForApp:(FIRApp *)app { + if (app.options.storageBucket) { + NSString *url = [app.options.storageBucket isEqualToString:@""] + ? @"" + : [@"gs://" stringByAppendingString:app.options.storageBucket]; + return [self storageForApp:app URL:url]; + } else { + NSString *const kAppNotConfiguredMessage = + @"No default Storage bucket found. Did you configure Firebase Storage properly?"; + [NSException raise:NSInvalidArgumentException format:kAppNotConfiguredMessage]; + return nil; + } +} + ++ (instancetype)storageWithURL:(NSString *)url { + return [self storageForApp:[FIRApp defaultApp] URL:url]; +} + ++ (instancetype)storageForApp:(FIRApp *)app URL:(NSString *)url { + NSString *bucket; + if ([url isEqualToString:@""]) { + bucket = @""; + } else { + FIRStoragePath *path; + + @try { + path = [FIRStoragePath pathFromGSURI:url]; + } @catch (NSException *e) { + [NSException raise:NSInternalInconsistencyException + format:@"URI must be in the form of gs:///"]; + } + + if (path.object != nil && ![path.object isEqualToString:@""]) { + [NSException raise:NSInternalInconsistencyException + format:@"Storage bucket cannot be initialized with a path"]; + } + + bucket = path.bucket; + } + + // Retrieve the instance provider from the app's container to inject dependencies as needed. + id provider = + FIR_COMPONENT(FIRStorageMultiBucketProvider, app.container); + return [provider storageForBucket:bucket]; +} + +- (instancetype)initWithApp:(FIRApp *)app + bucket:(NSString *)bucket + auth:(nullable id)auth { + self = [super init]; + if (self) { + _app = app; + _auth = auth; + _storageBucket = bucket; + _dispatchQueue = dispatch_queue_create("com.google.firebase.storage", DISPATCH_QUEUE_SERIAL); + _fetcherServiceForApp = [FIRStorage fetcherServiceForApp:_app bucket:bucket auth:auth]; + _maxDownloadRetryTime = 600.0; + _maxOperationRetryTime = 120.0; + _maxUploadRetryTime = 600.0; + } + return self; +} + +- (instancetype)init { + NSAssert(false, @"Storage cannot be directly instantiated, use " + "Storage.storage() or Storage.storage(app:) instead"); + return nil; +} + +#pragma mark - NSObject overrides + +- (instancetype)copyWithZone:(NSZone *)zone { + FIRStorage *storage = [[[self class] allocWithZone:zone] initWithApp:_app + bucket:_storageBucket + auth:_auth]; + storage.callbackQueue = self.callbackQueue; + return storage; +} + +// Two FIRStorage objects are equal if they use the same app +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[FIRStorage class]]) { + return NO; + } + + BOOL isEqualObject = [self isEqualToFIRStorage:(FIRStorage *)object]; + return isEqualObject; +} + +- (BOOL)isEqualToFIRStorage:(FIRStorage *)storage { + BOOL isEqual = + [_app isEqual:storage.app] && [_storageBucket isEqualToString:storage.storageBucket]; + return isEqual; +} + +- (NSUInteger)hash { + NSUInteger hash = [_app hash] ^ [self.callbackQueue hash]; + return hash; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p: %@", [self class], self, _app]; +} + +#pragma mark - Public methods + +- (FIRStorageReference *)reference { + FIRStoragePath *path = [[FIRStoragePath alloc] initWithBucket:_storageBucket object:nil]; + return [[FIRStorageReference alloc] initWithStorage:self path:path]; +} + +- (FIRStorageReference *)referenceForURL:(NSString *)string { + FIRStoragePath *path = [FIRStoragePath pathFromString:string]; + + // If no default bucket exists (empty string), accept anything. + if ([_storageBucket isEqual:@""]) { + FIRStorageReference *reference = [[FIRStorageReference alloc] initWithStorage:self path:path]; + return reference; + } + + // If there exists a default bucket, throw if provided a different bucket. + if (![path.bucket isEqual:_storageBucket]) { + NSString *const kInvalidBucketFormat = + @"Provided bucket: %@ does not match the Storage bucket of the current instance: %@"; + [NSException raise:NSInvalidArgumentException + format:kInvalidBucketFormat, path.bucket, _storageBucket]; + } + + FIRStorageReference *reference = [[FIRStorageReference alloc] initWithStorage:self path:path]; + return reference; +} + +- (FIRStorageReference *)referenceWithPath:(NSString *)string { + FIRStorageReference *reference = [[self reference] child:string]; + return reference; +} + +- (dispatch_queue_t)callbackQueue { + return _fetcherServiceForApp.callbackQueue; +} + +- (void)setCallbackQueue:(dispatch_queue_t)callbackQueue { + _fetcherServiceForApp.callbackQueue = callbackQueue; +} + +#pragma mark - Background tasks + ++ (void)enableBackgroundTasks:(BOOL)isEnabled { + [NSException raise:NSGenericException format:@"enableBackgroundTasks not implemented"]; +} + +- (NSArray *)uploadTasks { + [NSException raise:NSGenericException format:@"getUploadTasks not implemented"]; + return nil; +} + +- (NSArray *)downloadTasks { + [NSException raise:NSGenericException format:@"getDownloadTasks not implemented"]; + return nil; +} +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageComponent.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageComponent.h new file mode 100644 index 00000000..ac3637ba --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageComponent.h @@ -0,0 +1,45 @@ +// Copyright 2018 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class FIRApp; +@class FIRStorage; + +NS_ASSUME_NONNULL_BEGIN + +/// This protocol is used in the interop registration process to register an instance provider for +/// individual FIRApps. +@protocol FIRStorageMultiBucketProvider + +/// Default method for creating a Storage instance. +- (FIRStorage *)storageForBucket:(NSString *)bucket; + +@end + +/// A concrete implementation for FIRStorageMultiBucketProvider to create Storage instances. +@interface FIRStorageComponent : NSObject + +/// The FIRApp that instances will be set up with. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Default method for creating a Storage instance. +- (FIRStorage *)storageForBucket:(NSString *)bucket; + +/// Unavailable, use `storageForApp:storageURL:` instead. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageComponent.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageComponent.m new file mode 100644 index 00000000..201021a8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageComponent.m @@ -0,0 +1,84 @@ +// Copyright 2018 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStorageComponent.h" + +#import + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import "Interop/Auth/Public/FIRAuthInterop.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStorage () +// Surface the internal initializer to create instances of FIRStorage. +- (instancetype)initWithApp:(FIRApp *)app + bucket:(NSString *)bucket + auth:(nullable id)auth; +@end + +@interface FIRStorageComponent () +/// Internal initializer. +- (instancetype)initWithApp:(FIRApp *)app; +@end + +@implementation FIRStorageComponent + +#pragma mark - Initialization + +- (instancetype)initWithApp:(FIRApp *)app { + self = [super init]; + if (self) { + _app = app; + } + return self; +} + +#pragma mark - Lifecycle + ++ (void)load { + [FIRApp registerInternalLibrary:(Class)self + withName:@"fire-str" + withVersion:[NSString stringWithUTF8String:FIRStorageVersionString]]; +} + +#pragma mark - FIRComponentRegistrant + ++ (nonnull NSArray *)componentsToRegister { + FIRDependency *authDep = [FIRDependency dependencyWithProtocol:@protocol(FIRAuthInterop) + isRequired:NO]; + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + return [[FIRStorageComponent alloc] initWithApp:container.app]; + }; + FIRComponent *storageProvider = + [FIRComponent componentWithProtocol:@protocol(FIRStorageMultiBucketProvider) + instantiationTiming:FIRInstantiationTimingLazy + dependencies:@[ authDep ] + creationBlock:creationBlock]; + + return @[ storageProvider ]; +} + +#pragma mark - FIRStorageInstanceProvider Conformance + +- (FIRStorage *)storageForBucket:(NSString *)bucket { + // Create an instance of FIRStorage and return it. + id auth = FIR_COMPONENT(FIRAuthInterop, self.app.container); + return [[FIRStorage alloc] initWithApp:self.app bucket:bucket auth:auth]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageConstants.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageConstants.m new file mode 100644 index 00000000..11dbfa00 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageConstants.m @@ -0,0 +1,92 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" + +NSString *const kGCSScheme = @"https"; +NSString *const kGCSHost = @"www.googleapis.com"; +NSString *const kGCSUploadPath = @"upload"; +NSString *const kGCSStorageVersionPath = @"storage/v1"; +NSString *const kGCSBucketPathFormat = @"b/%@"; +NSString *const kGCSObjectPathFormat = @"o/%@"; + +NSString *const kFIRStorageScheme = @"https"; +NSString *const kFIRStorageHost = @"firebasestorage.googleapis.com"; +NSString *const kFIRStorageVersionPath = @"v0"; +NSString *const kFIRStorageBucketPathFormat = @"b/%@"; +NSString *const kFIRStorageObjectPathFormat = @"o/%@"; +NSString *const kFIRStorageFullPathFormat = @"/v0/b/%@/o/%@"; + +NSString *const kFIRStorageAuthTokenFormat = @"Firebase %@"; +NSString *const kFIRStorageDefaultBucketFormat = @"gs://%@"; + +NSString *const kFIRStorageResponseErrorDomain = @"ResponseErrorDomain"; +NSString *const kFIRStorageResponseErrorCode = @"ResponseErrorCode"; +NSString *const kFIRStorageResponseBody = @"ResponseBody"; + +NSString *const FIRStorageErrorDomain = @"FIRStorageErrorDomain"; + +NSString *const kFIRStorageInvalidDataFormat = @"Invalid data returned from the server: %@"; +NSString *const kFIRStorageInvalidObserverStatus = + @"Invalid observer status requested, use one " + @"of: FIRStorageTaskStatusPause, Resume, Progress, " + @"Complete, or Failure"; + +/** + * String constants mapping GCS Object#list results to ListResult fields. + */ +NSString *const kFIRStorageListPrefixes = @"prefixes"; +NSString *const kFIRStorageListItems = @"items"; +NSString *const kFIRStorageListItemName = @"name"; +NSString *const kFIRStorageListPageToken = @"nextPageToken"; + +/** + * String constants mapping GCS Object#resource mappings to metadata fields. + */ +NSString *const kFIRStorageMetadataBucket = @"bucket"; +NSString *const kFIRStorageMetadataCacheControl = @"cacheControl"; +NSString *const kFIRStorageMetadataContentDisposition = @"contentDisposition"; +NSString *const kFIRStorageMetadataContentEncoding = @"contentEncoding"; +NSString *const kFIRStorageMetadataContentLanguage = @"contentLanguage"; +NSString *const kFIRStorageMetadataContentType = @"contentType"; +NSString *const kFIRStorageMetadataCustomMetadata = @"metadata"; +NSString *const kFIRStorageMetadataSize = @"size"; +NSString *const kFIRStorageMetadataGeneration = @"generation"; +NSString *const kFIRStorageMetadataMetageneration = @"metageneration"; +NSString *const kFIRStorageMetadataTimeCreated = @"timeCreated"; +NSString *const kFIRStorageMetadataUpdated = @"updated"; +NSString *const kFIRStorageMetadataName = @"name"; +NSString *const kFIRStorageMetadataDownloadTokens = @"downloadTokens"; +NSString *const kFIRStorageMetadataMd5Hash = @"md5Hash"; + +// TODO: add notification support +NSString *const kFIRStorageTaskStatusResumeNotification = + @"kFIRStorageTaskStatusResumeNotification"; +NSString *const kFIRStorageTaskStatusPauseNotification = @"kFIRStorageTaskStatusResumeNotification"; +NSString *const kFIRStorageTaskStatusProgressNotification = + @"kFIRStorageTaskStatusResumeNotification"; +NSString *const kFIRStorageTaskStatusCompleteNotification = + @"kFIRStorageTaskStatusResumeNotification"; +NSString *const kFIRStorageTaskStatusFailureNotification = + @"kFIRStorageTaskStatusResumeNotification"; + +NSString *const kFIRStorageBundleIdentifier = @"com.google.firebase.storage"; + +// The STR and STR_EXPAND macro allow a numeric version passed to he compiler driver +// with a -D to be treated as a string instead of an invalid floating point value. +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x +const char *const FIRStorageVersionString = (const char *const)STR(FIRStorage_VERSION); diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageConstants_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageConstants_Private.h new file mode 100644 index 00000000..76c382d8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageConstants_Private.h @@ -0,0 +1,150 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRStorageMetadata; + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSString *const kGCSScheme; +FOUNDATION_EXPORT NSString *const kGCSHost; +FOUNDATION_EXPORT NSString *const kGCSUploadPath; +FOUNDATION_EXPORT NSString *const kGCSStorageVersionPath; +FOUNDATION_EXPORT NSString *const kGCSBucketPathFormat; +FOUNDATION_EXPORT NSString *const kGCSObjectPathFormat; + +FOUNDATION_EXPORT NSString *const kFIRStorageScheme; +FOUNDATION_EXPORT NSString *const kFIRStorageHost; +FOUNDATION_EXPORT NSString *const kFIRStorageVersionPath; +FOUNDATION_EXPORT NSString *const kFIRStorageBucketPathFormat; +FOUNDATION_EXPORT NSString *const kFIRStorageObjectPathFormat; +FOUNDATION_EXPORT NSString *const kFIRStorageFullPathFormat; + +FOUNDATION_EXPORT NSString *const kFIRStorageAuthTokenFormat; +FOUNDATION_EXPORT NSString *const kFIRStorageDefaultBucketFormat; + +FOUNDATION_EXPORT NSString *const kFIRStorageResponseErrorDomain; +FOUNDATION_EXPORT NSString *const kFIRStorageResponseErrorCode; +FOUNDATION_EXPORT NSString *const kFIRStorageResponseBody; + +FOUNDATION_EXPORT NSString *const kFIRStorageTaskStatusResumeNotification; +FOUNDATION_EXPORT NSString *const kFIRStorageTaskStatusPauseNotification; +FOUNDATION_EXPORT NSString *const kFIRStorageTaskStatusProgressNotification; +FOUNDATION_EXPORT NSString *const kFIRStorageTaskStatusCompleteNotification; +FOUNDATION_EXPORT NSString *const kFIRStorageTaskStatusFailureNotification; + +FOUNDATION_EXPORT NSString *const kFIRStorageListPrefixes; +FOUNDATION_EXPORT NSString *const kFIRStorageListItems; +FOUNDATION_EXPORT NSString *const kFIRStorageListItemName; +FOUNDATION_EXPORT NSString *const kFIRStorageListPageToken; + +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataBucket; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataCacheControl; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataContentDisposition; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataContentEncoding; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataContentLanguage; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataContentType; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataCustomMetadata; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataSize; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataGeneration; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataMetageneration; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataTimeCreated; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataUpdated; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataName; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataDownloadTokens; +FOUNDATION_EXPORT NSString *const kFIRStorageMetadataMd5Hash; + +FOUNDATION_EXPORT NSString *const kFIRStorageInvalidDataFormat; +FOUNDATION_EXPORT NSString *const kFIRStorageInvalidObserverStatus; + +FOUNDATION_EXPORT NSString *const kFIRStorageBundleIdentifier; + +/** + * Enum representing the internal state of an upload or download task. + */ +typedef NS_ENUM(NSInteger, FIRStorageTaskState) { + /** + * Unknown task state + */ + FIRStorageTaskStateUnknown, + + /** + * Task is being queued is ready to run + */ + FIRStorageTaskStateQueueing, + + /** + * Task is resuming from a paused state + */ + FIRStorageTaskStateResuming, + + /** + * Task is currently running + */ + FIRStorageTaskStateRunning, + + /** + * Task reporting a progress event + */ + FIRStorageTaskStateProgress, + + /** + * Task is pausing + */ + FIRStorageTaskStatePausing, + + /** + * Task is completing successfully + */ + FIRStorageTaskStateCompleting, + + /** + * Task is failing unrecoverably + */ + FIRStorageTaskStateFailing, + + /** + * Task paused successfully + */ + FIRStorageTaskStatePaused, + + /** + * Task cancelled successfully + */ + FIRStorageTaskStateCancelled, + + /** + * Task completed successfully + */ + FIRStorageTaskStateSuccess, + + /** + * Task failed unrecoverably + */ + FIRStorageTaskStateFailed +}; + +/** + * Represents the various types of metadata: Files or Folders. + */ +typedef NS_ENUM(NSUInteger, FIRStorageMetadataType) { + FIRStorageMetadataTypeUnknown, + FIRStorageMetadataTypeFile, + FIRStorageMetadataTypeFolder, +}; + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDeleteTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDeleteTask.h new file mode 100644 index 00000000..02fcf62c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDeleteTask.h @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class GTMSessionFetcherService; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Task which provides the ability to delete an object in Firebase Storage. + */ +@interface FIRStorageDeleteTask : FIRStorageTask + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + completion:(FIRStorageVoidError)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDeleteTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDeleteTask.m new file mode 100644 index 00000000..1bb443e8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDeleteTask.m @@ -0,0 +1,83 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStorageDeleteTask.h" + +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" + +@implementation FIRStorageDeleteTask { + @private + FIRStorageVoidError _completion; +} + +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + +- (void)dealloc { + [_fetcher stopFetching]; +} + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + completion:(FIRStorageVoidError)completion { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _completion = [completion copy]; + } + return self; +} + +- (void)enqueue { + __weak FIRStorageDeleteTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageDeleteTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"DELETE"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; + + FIRStorageVoidError callback = strongSelf->_completion; + strongSelf->_completion = nil; + + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; + + fetcher.comment = @"DeleteTask"; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + strongSelf->_fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) { + if (!self.error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + } + if (callback) { + callback(self.error); + } + self->_fetcherCompletion = nil; + }; +#pragma clang diangostic pop + + [fetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) { + weakSelf.fetcherCompletion(data, error); + }]; + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDownloadTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDownloadTask.m new file mode 100644 index 00000000..c551c3ca --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDownloadTask.m @@ -0,0 +1,189 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStorageDownloadTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageObservableTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" + +@implementation FIRStorageDownloadTask + +@synthesize progress = _progress; +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + file:(nullable NSURL *)fileURL { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _fileURL = [fileURL copy]; + _progress = [NSProgress progressWithTotalUnitCount:0]; + } + return self; +} + +- (void)dealloc { + [_fetcher stopFetching]; +} + +- (void)enqueue { + [self enqueueWithData:nil]; +} + +- (void)enqueueWithData:(nullable NSData *)resumeData { + __weak FIRStorageDownloadTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageDownloadTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + strongSelf.state = FIRStorageTaskStateQueueing; + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"GET"; + request.timeoutInterval = strongSelf.reference.storage.maxDownloadRetryTime; + NSURLComponents *components = [NSURLComponents componentsWithURL:request.URL + resolvingAgainstBaseURL:NO]; + [components setQuery:@"alt=media"]; + request.URL = components.URL; + + GTMSessionFetcher *fetcher; + if (resumeData) { + fetcher = [GTMSessionFetcher fetcherWithDownloadResumeData:resumeData]; + fetcher.comment = @"Resuming DownloadTask"; + } else { + fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + fetcher.comment = @"Starting DownloadTask"; + } + + [fetcher setResumeDataBlock:^(NSData *data) { + FIRStorageDownloadTask *strong = weakSelf; + if (strong && data) { + strong->_downloadData = data; + } + }]; + + fetcher.maxRetryInterval = strongSelf.reference.storage.maxDownloadRetryTime; + + if (strongSelf->_fileURL) { + // Handle file downloads + [fetcher setDestinationFileURL:strongSelf->_fileURL]; + [fetcher setDownloadProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten, + int64_t totalBytesExpectedToWrite) { + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesWritten; + weakSelf.progress.totalUnitCount = totalBytesExpectedToWrite; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + }]; + } else { + // Handle data downloads + [fetcher setReceivedProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten) { + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesWritten; + int64_t totalLength = [[weakSelf.fetcher response] expectedContentLength]; + weakSelf.progress.totalUnitCount = totalLength; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + }]; + } + + strongSelf->_fetcher = fetcher; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + // Fire last progress updates + [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot]; + + // Handle potential issues with download + if (error) { + self.state = FIRStorageTaskStateFailed; + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; + [self removeAllObservers]; + self->_fetcherCompletion = nil; + return; + } + + // Download completed successfully, fire completion callbacks + self.state = FIRStorageTaskStateSuccess; + + if (data) { + self->_downloadData = data; + } + + [self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot]; + [self removeAllObservers]; + self->_fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + + strongSelf.state = FIRStorageTaskStateRunning; + [strongSelf.fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; + }]; +} + +#pragma mark - Download Management + +- (void)cancel { + NSError *error = [FIRStorageErrors errorWithCode:FIRStorageErrorCodeCancelled]; + [self cancelWithError:error]; +} + +- (void)cancelWithError:(NSError *)error { + __weak FIRStorageDownloadTask *weakSelf = self; + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStateCancelled; + [weakSelf.fetcher stopFetching]; + weakSelf.error = error; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:weakSelf.snapshot]; + }]; +} + +- (void)pause { + __weak FIRStorageDownloadTask *weakSelf = self; + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStatePausing; + [weakSelf.fetcher stopFetching]; + // Give the resume callback a chance to run (if scheduled) + [weakSelf.fetcher waitForCompletionWithTimeout:0.001]; + weakSelf.state = FIRStorageTaskStatePaused; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusPause snapshot:snapshot]; + }]; +} + +- (void)resume { + __weak FIRStorageDownloadTask *weakSelf = self; + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStateResuming; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusResume snapshot:snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + [weakSelf enqueueWithData:weakSelf.downloadData]; + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDownloadTask_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDownloadTask_Private.h new file mode 100644 index 00000000..1b682050 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageDownloadTask_Private.h @@ -0,0 +1,59 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import + +@class FIRStorageReference; +@class GTMSessionFetcherService; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStorageDownloadTask () + +/** + * Bytes which have been downloaded so far. + */ +@property(readonly, nonatomic) NSData *downloadData; + +/** + * The file on disk to write to. + */ +@property(copy, nonatomic) NSURL *fileURL; + +/** + * Initializes a download task with a base FIRStorageReference and GTMSessionFetcherService. + * @param reference The base FIRStorageReference which fetchers use for configuration. + * @param service The GTMSessionFetcherService which will create fetchers. + * @param queue The shared queue to use for all Storage operations. + * @param fileURL The system URL to download to. If nil, download in memory as bytes. + * @return Returns an instance of FIRStorageDownloadTask + */ +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + file:(nullable NSURL *)fileURL; + +/** + * Cancels the download task and passes an appropriate error to the developer. + * @param error NSError to propegate to the developer. + */ +- (void)cancelWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageErrors.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageErrors.h new file mode 100644 index 00000000..99648c11 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageErrors.h @@ -0,0 +1,70 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FIRStorageReference; + +/** + * Adds wrappers for common Firebase Storage errors (including creating errors from GCS errors). + * For more information on unwrapping GCS errors, see the GCS errors docs: + * https://cloud.google.com/storage/docs/json_api/v1/status-codes + * This is never publicly exposed to end developers (as they will simply see an NSError). + */ +@interface FIRStorageErrors : NSObject + +/** + * Creates a Firebase Storage error from a specific FIRStorageErrorCode. + */ ++ (NSError *)errorWithCode:(FIRStorageErrorCode)code; + +/** + * Creates a Firebase Storage error from a specific FIRStorageErrorCode while adding + * custom info from an optionally provided info dictionary. + */ ++ (NSError *)errorWithCode:(FIRStorageErrorCode)code + infoDictionary:(nullable NSDictionary *)dictionary; + +/** + * Creates a Firebase Storage error from a specific GCS error and FIRStorageReference. + * @param error Server error to wrap and return as a Firebase Storage error. + * @param reference FIRStorageReference which provides context about the request being made. + * @return Returns a Firebase Storage error, or nil if no error is provided. + */ ++ (nullable NSError *)errorWithServerError:(nullable NSError *)error + reference:(nullable FIRStorageReference *)reference; + +/** + * Creates a Firebase Storage error from an invalid request. + * + * @param request The NSData representation of the invalid user request. + * @return Returns the corresponding Firebase Storage error. + */ ++ (NSError *)errorWithInvalidRequest:(NSData *)request; + +/** + * Creates a Firebase Storage error with a custom error message. + * + * @param errorMessage A custom error message. + * @return Returns the corresponding Firebase Storage error. + */ ++ (NSError *)errorWithCustomMessage:(NSString *)errorMessage; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageErrors.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageErrors.m new file mode 100644 index 00000000..1301d062 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageErrors.m @@ -0,0 +1,189 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStorageErrors.h" + +#import +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStorageReference_Private.h" + +@implementation FIRStorageErrors + ++ (NSError *)errorWithCode:(FIRStorageErrorCode)code { + return [FIRStorageErrors errorWithCode:code infoDictionary:nil]; +} + ++ (NSError *)errorWithCode:(FIRStorageErrorCode)code + infoDictionary:(nullable NSDictionary *)dictionary { + NSMutableDictionary *errorDictionary; + if (dictionary) { + errorDictionary = [dictionary mutableCopy]; + } else { + errorDictionary = [[NSMutableDictionary alloc] init]; + } + + NSString *errorMessage; + switch (code) { + case FIRStorageErrorCodeObjectNotFound: + errorMessage = + [NSString stringWithFormat:@"Object %@ does not exist.", errorDictionary[@"object"]]; + break; + + case FIRStorageErrorCodeBucketNotFound: + errorMessage = + [NSString stringWithFormat:@"Bucket %@ does not exist.", errorDictionary[@"bucket"]]; + break; + + case FIRStorageErrorCodeProjectNotFound: + errorMessage = + [NSString stringWithFormat:@"Project %@ does not exist.", errorDictionary[@"project"]]; + break; + + case FIRStorageErrorCodeQuotaExceeded: { + NSString *const kQuotaExceededFormat = + @"Quota for bucket %@ exceeded, please view quota on firebase.google.com."; + errorMessage = [NSString stringWithFormat:kQuotaExceededFormat, errorDictionary[@"bucket"]]; + break; + } + + case FIRStorageErrorCodeDownloadSizeExceeded: { + int64_t total = [errorDictionary[@"totalSize"] longLongValue]; + int64_t size = [errorDictionary[@"maxAllowedSize"] longLongValue]; + NSString *totalString = total ? @(total).stringValue : @"unknown"; + NSString *sizeString = total ? @(size).stringValue : @"unknown"; + NSString *const kSizeExceededErrorFormat = + @"Attempted to download object with size of %@ bytes, " + @"which exceeds the maximum size of %@ bytes. " + @"Consider raising the maximum download size, or using " + @"[FIRStorageReference writeToFile:]"; + errorMessage = [NSString stringWithFormat:kSizeExceededErrorFormat, totalString, sizeString]; + break; + } + + case FIRStorageErrorCodeUnauthenticated: + errorMessage = @"User is not authenticated, please authenticate using Firebase " + @"Authentication and try again."; + break; + + case FIRStorageErrorCodeUnauthorized: { + NSString *bucket = errorDictionary[@"bucket"]; + NSString *object = errorDictionary[@"object"]; + NSString *const kUnauthorizedFormat = @"User does not have permission to access gs://%@/%@."; + errorMessage = [NSString stringWithFormat:kUnauthorizedFormat, bucket, object]; + break; + } + + case FIRStorageErrorCodeRetryLimitExceeded: + errorMessage = @"Max retry time for operation exceeded, please try again."; + break; + + case FIRStorageErrorCodeNonMatchingChecksum: { + // TODO: replace with actual checksum strings when we choose to implement. + NSString *const kChecksumFailedErrorFormat = + @"Uploaded/downloaded object %@ has checksum: %@ " + @"which does not match server checksum: %@. Please retry the upload/download."; + errorMessage = [NSString stringWithFormat:kChecksumFailedErrorFormat, @"object", + @"client checksum", @"server checksum"]; + break; + } + + case FIRStorageErrorCodeCancelled: + errorMessage = @"User cancelled the upload/download."; + break; + + case FIRStorageErrorCodeUnknown: + /* Fall through to default case for unknown errors */ + + default: + errorMessage = @"An unknown error occurred, please check the server response."; + break; + } + + errorDictionary[NSLocalizedDescriptionKey] = errorMessage; + + NSError *err = [NSError errorWithDomain:FIRStorageErrorDomain code:code userInfo:errorDictionary]; + return err; +} + ++ (nullable NSError *)errorWithServerError:(nullable NSError *)error + reference:(nullable FIRStorageReference *)reference { + if (error == nil) { + return nil; + } + + FIRStorageErrorCode errorCode; + switch (error.code) { + case 400: + errorCode = FIRStorageErrorCodeUnknown; + break; + + case 401: + errorCode = FIRStorageErrorCodeUnauthenticated; + break; + + case 402: + errorCode = FIRStorageErrorCodeQuotaExceeded; + break; + + case 403: + errorCode = FIRStorageErrorCodeUnauthorized; + break; + + case 404: + errorCode = FIRStorageErrorCodeObjectNotFound; + break; + + default: + errorCode = FIRStorageErrorCodeUnknown; + break; + } + + NSMutableDictionary *errorDictionary = + [[[NSDictionary alloc] initWithDictionary:error.userInfo] mutableCopy]; + errorDictionary[kFIRStorageResponseErrorDomain] = error.domain; + errorDictionary[kFIRStorageResponseErrorCode] = @(error.code); + + // Turn raw response into a string + NSData *responseData = errorDictionary[@"data"]; + if (responseData) { + NSString *errorString = [[NSString alloc] initWithData:responseData + encoding:NSUTF8StringEncoding]; + errorDictionary[kFIRStorageResponseBody] = errorString ?: @"No Response from Server."; + } + + errorDictionary[@"bucket"] = reference.path.bucket; + errorDictionary[@"object"] = reference.path.object; + + NSError *clientError = [FIRStorageErrors errorWithCode:errorCode infoDictionary:errorDictionary]; + return clientError; +} + ++ (NSError *)errorWithInvalidRequest:(NSData *)request { + NSString *requestString = [[NSString alloc] initWithData:request encoding:NSUTF8StringEncoding]; + NSString *invalidDataString = + [NSString stringWithFormat:kFIRStorageInvalidDataFormat, requestString]; + NSDictionary *dict; + if (invalidDataString.length > 0) { + dict = @{NSLocalizedFailureReasonErrorKey : invalidDataString}; + } + return [FIRStorageErrors errorWithCode:FIRStorageErrorCodeUnknown infoDictionary:dict]; +} + ++ (NSError *)errorWithCustomMessage:(NSString *)errorMessage { + return [NSError errorWithDomain:FIRStorageErrorDomain + code:FIRStorageErrorCodeUnknown + userInfo:@{NSLocalizedDescriptionKey : errorMessage}]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.h new file mode 100644 index 00000000..06116956 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.h @@ -0,0 +1,35 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class GTMSessionFetcherService; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Task which provides the ability to get a download URL for an object in Firebase Storage. + */ +@interface FIRStorageGetDownloadURLTask : FIRStorageTask + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + completion:(FIRStorageVoidURLError)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.m new file mode 100644 index 00000000..f7422b26 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.m @@ -0,0 +1,126 @@ +// Copyright 2018 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.h" + +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" + +@implementation FIRStorageGetDownloadURLTask { + @private + FIRStorageVoidURLError _completion; +} + +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + completion:(FIRStorageVoidURLError)completion { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _completion = [completion copy]; + } + return self; +} + +- (void)dealloc { + [_fetcher stopFetching]; +} + ++ (NSURL *)downloadURLFromMetadataDictionary:(NSDictionary *)dictionary { + NSString *downloadTokens = dictionary[kFIRStorageMetadataDownloadTokens]; + + if (downloadTokens && downloadTokens.length > 0) { + NSArray *downloadTokenArray = [downloadTokens componentsSeparatedByString:@","]; + NSString *bucket = dictionary[kFIRStorageMetadataBucket]; + NSString *path = dictionary[kFIRStorageMetadataName]; + NSString *fullPath = [NSString stringWithFormat:kFIRStorageFullPathFormat, bucket, + [FIRStorageUtils GCSEscapedString:path]]; + + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.scheme = kFIRStorageScheme; + components.host = kFIRStorageHost; + components.percentEncodedPath = fullPath; + + // The backend can return an arbitrary number of download tokens, but we only expose the first + // token via the download URL. + NSURLQueryItem *altItem = [[NSURLQueryItem alloc] initWithName:@"alt" value:@"media"]; + NSURLQueryItem *tokenItem = [[NSURLQueryItem alloc] initWithName:@"token" + value:downloadTokenArray[0]]; + components.queryItems = @[ altItem, tokenItem ]; + + return [components URL]; + } + + return nil; +} + +- (void)enqueue { + __weak FIRStorageGetDownloadURLTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageGetDownloadURLTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"GET"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; + + FIRStorageVoidURLError callback = strongSelf->_completion; + strongSelf->_completion = nil; + + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; + fetcher.comment = @"GetDownloadURLTask"; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + NSURL *downloadURL; + if (error) { + if (!self.error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + } + } else { + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary != nil) { + downloadURL = + [FIRStorageGetDownloadURLTask downloadURLFromMetadataDictionary:responseDictionary]; + if (!downloadURL) { + self.error = + [FIRStorageErrors errorWithCustomMessage:@"Failed to retrieve a download URL."]; + } + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } + } + + if (callback) { + callback(downloadURL, self.error); + } + + self->_fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; + }]; +}; + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask_Private.h new file mode 100644 index 00000000..a4b5ff8f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetDownloadURLTask_Private.h @@ -0,0 +1,31 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Task which provides the ability to get a download URL for an object in Firebase Storage. + */ +@interface FIRStorageGetDownloadURLTask () + +/** Extracts a download URL from the StorageMetadata dictonary representation. */ ++ (nullable NSURL *)downloadURLFromMetadataDictionary:(NSDictionary *)dictionary; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetMetadataTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetMetadataTask.h new file mode 100644 index 00000000..a14c44f0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetMetadataTask.h @@ -0,0 +1,35 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class GTMSessionFetcherService; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Task which provides the ability to get metadata on an object in Firebase Storage. + */ +@interface FIRStorageGetMetadataTask : FIRStorageTask + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + completion:(FIRStorageVoidMetadataError)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetMetadataTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetMetadataTask.m new file mode 100644 index 00000000..3a947e77 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageGetMetadataTask.m @@ -0,0 +1,97 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStorageGetMetadataTask.h" + +#import +#import "FirebaseStorage/Sources/FIRStorageMetadata_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageUtils.h" + +@implementation FIRStorageGetMetadataTask { + @private + FIRStorageVoidMetadataError _completion; +} + +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + completion:(FIRStorageVoidMetadataError)completion { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _completion = [completion copy]; + } + return self; +} + +- (void)dealloc { + [_fetcher stopFetching]; +} + +- (void)enqueue { + __weak FIRStorageGetMetadataTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageGetMetadataTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"GET"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; + + FIRStorageVoidMetadataError callback = strongSelf->_completion; + strongSelf->_completion = nil; + + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; + fetcher.comment = @"GetMetadataTask"; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + FIRStorageMetadata *metadata; + if (error) { + if (!self.error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + } + } else { + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary != nil) { + metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; + [metadata setType:FIRStorageMetadataTypeFile]; + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } + } + + if (callback) { + callback(metadata, self.error); + } + self->_fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListResult.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListResult.m new file mode 100644 index 00000000..ab887f93 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListResult.m @@ -0,0 +1,69 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" + +@implementation FIRStorageListResult + ++ (nullable FIRStorageListResult *)fromDictionary:(NSDictionary *)dictionary + atReference:(FIRStorageReference *)reference { + NSMutableArray *prefixes = [NSMutableArray new]; + NSMutableArray *items = [NSMutableArray new]; + + FIRStorageReference *rootReference = reference.root; + + NSArray *prefixEntries = dictionary[kFIRStorageListPrefixes]; + for (NSString *prefixEntry in prefixEntries) { + NSString *pathWithoutTrailingSlash = prefixEntry; + if ([prefixEntry hasSuffix:@"/"]) { + pathWithoutTrailingSlash = [pathWithoutTrailingSlash substringToIndex:prefixEntry.length - 1]; + } + + FIRStorageReference *prefixReference = [rootReference child:pathWithoutTrailingSlash]; + [prefixes addObject:prefixReference]; + } + + NSArray *> *itemEntries = dictionary[kFIRStorageListItems]; + for (NSDictionary *itemEntry in itemEntries) { + FIRStorageReference *itemReference = [rootReference child:itemEntry[kFIRStorageListItemName]]; + [items addObject:itemReference]; + } + + NSString *pageToken = dictionary[kFIRStorageListPageToken]; + return [[FIRStorageListResult alloc] initWithPrefixes:prefixes items:items pageToken:pageToken]; +} + +- (nullable instancetype)initWithPrefixes:(NSArray *)prefixes + items:(NSArray *)items + pageToken:(nullable NSString *)pageToken { + self = [super init]; + if (self) { + _prefixes = [prefixes copy]; + _items = [items copy]; + _pageToken = [pageToken copy]; + } + return self; +} + +- (instancetype)copyWithZone:(NSZone *)zone { + FIRStorageListResult *clone = [[[self class] allocWithZone:zone] initWithPrefixes:_prefixes + items:_items + pageToken:_pageToken]; + + return clone; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListResult_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListResult_Private.h new file mode 100644 index 00000000..f4a2f542 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListResult_Private.h @@ -0,0 +1,40 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStorageListResult (Private) + +/** + * Creates an instance of FIRStorageListResult with the contents of a dictionary. + * + * @param dictionary A dictionary containing the parsed JSON response from the backend. + * @param reference The FIRStorageReference that `list()` was called on. + * @return An instance of FIRStorageListResult that represents the contents of the dictionary. + */ ++ (nullable FIRStorageListResult *)fromDictionary:(NSDictionary *)dictionary + atReference:(FIRStorageReference *)reference; + +/** Initializes a new FIRStorageListResult with the given data. */ +- (nullable instancetype)initWithPrefixes:(NSArray *)prefixes + items:(NSArray *)items + pageToken:(nullable NSString *)pageToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListTask.h new file mode 100644 index 00000000..ea3fc48e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListTask.h @@ -0,0 +1,57 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +@class GTMSessionFetcherService; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Block typedef typically used in `list()` and `listAll()`. + * @param listResult The FIRStorageListResult returned by the operation, if it exists. + * @param error The error describing failure, if one occurred. + */ +typedef void (^FIRStorageVoidListError)(FIRStorageListResult *_Nullable listResult, + NSError *_Nullable error); + +/** A Task that lists the entries under a {@link StorageReference} */ +@interface FIRStorageListTask : FIRStorageTask + +/** + * Initializes a new List Task. + * + * To schedule the task, invoke `[FIRStorageListTask enqueue]`. + * + * @param reference The location to invoke List on. + * @param service GTMSessionFetcherService to use for the RPC. + * @param queue The queue to schedule the List operation on. + * @param pageSize An optional pageSize, denoting the maximum size of the result set. If + * set to `nil`, the backend will use the default page size. + * @param previousPageToken An optional pageToken, used to resume a previous invocation. + * @param completion The completion handler to be called with the FIRStorageListResult. + */ +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + pageSize:(nullable NSNumber *)pageSize + previousPageToken:(nullable NSString *)previousPageToken + completion:(FIRStorageVoidListError)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListTask.m new file mode 100644 index 00000000..c30bbdc6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageListTask.m @@ -0,0 +1,127 @@ +// Copyright 2019 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStorageListTask.h" +#import "FirebaseStorage/Sources/FIRStorageListResult_Private.h" +#import "FirebaseStorage/Sources/FIRStorageReference_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" + +@implementation FIRStorageListTask { + @private + FIRStorageVoidListError _completion; + NSNumber *_pageSize; + NSString *_previousPageToken; +} + +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + pageSize:(nullable NSNumber *)pageSize + previousPageToken:(nullable NSString *)previousPageToken + completion:(FIRStorageVoidListError)completion { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _completion = [completion copy]; + _pageSize = pageSize; + _previousPageToken = [previousPageToken copy]; + } + return self; +} + +- (void)dealloc { + [_fetcher stopFetching]; +} + +- (void)enqueue { + __weak FIRStorageListTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageListTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + NSMutableDictionary *queryParams = [NSMutableDictionary new]; + + NSString *prefix = [self reference].fullPath; + if (prefix.length != 0) { + queryParams[@"prefix"] = [prefix stringByAppendingString:@"/"]; + } + + // Firebase Storage uses file system semantics and treats slashes as separators. GCS's List API + // does not prescribe a separator, and hence we need to provide a slash as the delimiter. + queryParams[@"delimiter"] = @"/"; + + // listAll() doesn't set a pageSize as this allows Firebase Storage to determine how many items + // to return per page. This removes the need to backfill results if Firebase Storage filters + // objects that are considered invalid (such as items with two consecutive slashes). + if (strongSelf->_pageSize != nil) { + queryParams[@"maxResults"] = [strongSelf->_pageSize stringValue]; + } + + if (strongSelf->_previousPageToken) { + queryParams[@"pageToken"] = strongSelf->_previousPageToken; + } + + FIRStoragePath *basePath = [[FIRStoragePath alloc] initWithBucket:self.reference.bucket + object:nil]; + NSMutableURLRequest *request = + [[FIRStorageUtils defaultRequestForPath:basePath queryParams:queryParams] mutableCopy]; + + request.HTTPMethod = @"GET"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; + + FIRStorageVoidListError callback = strongSelf->_completion; + strongSelf->_completion = nil; + + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; + fetcher.comment = @"ListTask"; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + FIRStorageListResult *listResult; + if (error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + } else { + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary != nil) { + listResult = [FIRStorageListResult fromDictionary:responseDictionary + atReference:self.reference]; + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } + } + + if (callback) { + callback(listResult, self.error); + } + + // Remove retain cycle set up by `strongSelf->_fetcherCompletion` + self->_fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageMetadata.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageMetadata.m new file mode 100644 index 00000000..c6921295 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageMetadata.m @@ -0,0 +1,224 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStorageMetadata_Private.h" +#import "FirebaseStorage/Sources/FIRStorageUtils.h" + +// TODO: consider rewriting this using GTLR (GTLRStorageObjects.h) +@implementation FIRStorageMetadata + +#pragma mark - Initializers + +- (instancetype)init { + return [self initWithDictionary:[NSDictionary dictionary]]; +} + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + self = [super init]; + if (self) { + _initialMetadata = [dictionary copy]; + + _bucket = dictionary[kFIRStorageMetadataBucket]; + _cacheControl = dictionary[kFIRStorageMetadataCacheControl]; + _contentDisposition = dictionary[kFIRStorageMetadataContentDisposition]; + _contentEncoding = dictionary[kFIRStorageMetadataContentEncoding]; + _contentLanguage = dictionary[kFIRStorageMetadataContentLanguage]; + _contentType = dictionary[kFIRStorageMetadataContentType]; + _customMetadata = dictionary[kFIRStorageMetadataCustomMetadata]; + _size = [dictionary[kFIRStorageMetadataSize] longLongValue]; + _generation = [dictionary[kFIRStorageMetadataGeneration] longLongValue]; + _metageneration = [dictionary[kFIRStorageMetadataMetageneration] longLongValue]; + _timeCreated = [self dateFromRFC3339String:dictionary[kFIRStorageMetadataTimeCreated]]; + _updated = [self dateFromRFC3339String:dictionary[kFIRStorageMetadataUpdated]]; + _md5Hash = dictionary[kFIRStorageMetadataMd5Hash]; + // GCS "name" is our path, our "name" is just the last path component of the path + _path = dictionary[kFIRStorageMetadataName]; + _name = [_path lastPathComponent]; + } + return self; +} + +#pragma mark - NSObject overrides + +- (instancetype)copyWithZone:(NSZone *)zone { + FIRStorageMetadata *clone = + [[[self class] allocWithZone:zone] initWithDictionary:[self dictionaryRepresentation]]; + clone.initialMetadata = [self.initialMetadata copy]; + return clone; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[FIRStorageMetadata class]]) { + return NO; + } + + BOOL isEqualObject = [self isEqualToFIRStorageMetadata:(FIRStorageMetadata *)object]; + return isEqualObject; +} + +- (BOOL)isEqualToFIRStorageMetadata:(FIRStorageMetadata *)metadata { + return [[self dictionaryRepresentation] isEqualToDictionary:[metadata dictionaryRepresentation]]; +} + +- (NSUInteger)hash { + NSUInteger hash = [[self dictionaryRepresentation] hash]; + return hash; +} + +- (NSString *)description { + NSDictionary *metadataDictionary = [self dictionaryRepresentation]; + return [NSString stringWithFormat:@"%@ %p: %@", [self class], self, metadataDictionary]; +} + +#pragma mark - Public methods + +- (NSDictionary *)dictionaryRepresentation { + NSMutableDictionary *metadataDictionary = [[NSMutableDictionary alloc] initWithCapacity:13]; + + if (_bucket) { + metadataDictionary[kFIRStorageMetadataBucket] = _bucket; + } + + if (_cacheControl) { + metadataDictionary[kFIRStorageMetadataCacheControl] = _cacheControl; + } + + if (_contentDisposition) { + metadataDictionary[kFIRStorageMetadataContentDisposition] = _contentDisposition; + } + + if (_contentEncoding) { + metadataDictionary[kFIRStorageMetadataContentEncoding] = _contentEncoding; + } + + if (_contentLanguage) { + metadataDictionary[kFIRStorageMetadataContentLanguage] = _contentLanguage; + } + + if (_contentType) { + metadataDictionary[kFIRStorageMetadataContentType] = _contentType; + } + + if (_md5Hash) { + metadataDictionary[kFIRStorageMetadataMd5Hash] = _md5Hash; + } + + if (_customMetadata) { + metadataDictionary[kFIRStorageMetadataCustomMetadata] = _customMetadata; + } + + if (_generation) { + NSString *generationString = [NSString stringWithFormat:@"%lld", _generation]; + metadataDictionary[kFIRStorageMetadataGeneration] = generationString; + } + + if (_metageneration) { + NSString *metagenerationString = [NSString stringWithFormat:@"%lld", _metageneration]; + metadataDictionary[kFIRStorageMetadataMetageneration] = metagenerationString; + } + + if (_timeCreated) { + metadataDictionary[kFIRStorageMetadataTimeCreated] = [self RFC3339StringFromDate:_timeCreated]; + } + + if (_updated) { + metadataDictionary[kFIRStorageMetadataUpdated] = [self RFC3339StringFromDate:_updated]; + } + + if (_path) { + metadataDictionary[kFIRStorageMetadataName] = _path; + } + + if (_size) { + metadataDictionary[kFIRStorageMetadataSize] = [NSNumber numberWithLongLong:_size]; + } + + return [metadataDictionary copy]; +} + +- (BOOL)isFile { + return _type == FIRStorageMetadataTypeFile; +} + +- (BOOL)isFolder { + return _type == FIRStorageMetadataTypeFolder; +} + +#pragma mark - Private methods + ++ (void)removeMatchingMetadata:(NSMutableDictionary *)metadata + oldMetadata:(NSDictionary *)oldMetadata { + for (NSString *metadataKey in [oldMetadata allKeys]) { + id oldValue = [oldMetadata objectForKey:metadataKey]; + id newValue = [metadata objectForKey:metadataKey]; + + if (oldValue && !newValue) { + [metadata setObject:[NSNull null] forKey:metadataKey]; + } else if ([oldValue isKindOfClass:[NSString class]] && + [newValue isKindOfClass:[NSString class]]) { + if ([oldValue isEqualToString:newValue]) { + [metadata removeObjectForKey:metadataKey]; + } + } else if ([oldValue isKindOfClass:[NSDictionary class]] && + [newValue isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *nestedMetadata = [newValue mutableCopy]; + [self removeMatchingMetadata:nestedMetadata oldMetadata:oldValue]; + [metadata setObject:[nestedMetadata copy] forKey:metadataKey]; + } + } +} + +- (NSDictionary *)updatedMetadata { + NSMutableDictionary *metadataUpdate = [[self dictionaryRepresentation] mutableCopy]; + [FIRStorageMetadata removeMatchingMetadata:metadataUpdate oldMetadata:_initialMetadata]; + return [metadataUpdate copy]; +} + +#pragma mark - RFC 3339 conversions + +static NSDateFormatter *sRFC3339DateFormatter; + +static void setupDateFormatterOnce(void) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sRFC3339DateFormatter = [[NSDateFormatter alloc] init]; + NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + + [sRFC3339DateFormatter setLocale:enUSPOSIXLocale]; + [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSZZZZZ"]; + [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; + }); +} + +- (nullable NSDate *)dateFromRFC3339String:(NSString *)dateString { + setupDateFormatterOnce(); + NSDate *rfc3339Date = [sRFC3339DateFormatter dateFromString:dateString]; + return rfc3339Date; +} + +- (nullable NSString *)RFC3339StringFromDate:(NSDate *)date { + setupDateFormatterOnce(); + NSString *rfc3339String = [sRFC3339DateFormatter stringFromDate:date]; + return rfc3339String; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageMetadata_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageMetadata_Private.h new file mode 100644 index 00000000..30faa267 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageMetadata_Private.h @@ -0,0 +1,72 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" + +@class FIRStorageReference; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStorageMetadata () + +@property(readwrite, nonatomic) NSString *name; + +@property(readwrite, nonatomic) NSString *path; + +@property(readwrite, nonatomic) FIRStorageReference *reference; + +/** + * The type of the object, either a "File" or a "Folder". + */ +@property(readwrite) FIRStorageMetadataType type; + +/** + * The original metadata representation received from the server or an empty dictionary + * if the metadata object was initialized by the user. + */ +@property(copy, nonatomic) NSDictionary *initialMetadata; + +/** + * Recursively removes entries in 'metadata' that are unmodified from 'oldMetadata'. + * Adds 'NSNull' for entries that only exist in oldMetadata. + */ ++ (void)removeMatchingMetadata:(NSMutableDictionary *)metadata + oldMetadata:(NSDictionary *)oldMetadata; + +/** + * Computes the updates between the state at initialization and the current state. + * Returns a dictionary with only the updated data. Removed keys are set to NSNull. + */ +- (NSDictionary *)updatedMetadata; + +/** + * Returns an RFC3339 formatted date from a string. + * @param dateString An NSString of the form: yyyy-MM-ddTHH:mm:ss.SSSZ. + * @return An NSDate populated from the string or nil if conversion isn't possible. + */ +- (nullable NSDate *)dateFromRFC3339String:(NSString *)dateString; + +/** + * Returns an RFC3339 formatted string from an NSDate object. + * @param date The NSDate object to be converted to a string. + * @return An NSString of the form: yyyy-MM-ddTHH:mm:ss.SSSZ or nil if conversion isn't possible. + */ +- (nullable NSString *)RFC3339StringFromDate:(NSDate *)date; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageObservableTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageObservableTask.m new file mode 100644 index 00000000..858138e7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageObservableTask.m @@ -0,0 +1,215 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import "FirebaseStorage/Sources/FIRStorageObservableTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" + +@implementation FIRStorageObservableTask { + @private + // Handlers for pause, resume, progress, success, and failure callbacks + NSMutableDictionary *_resumeHandlers; + NSMutableDictionary *_pauseHandlers; + NSMutableDictionary *_progressHandlers; + NSMutableDictionary *_successHandlers; + NSMutableDictionary *_failureHandlers; + // Reverse map of fetcher handles to status types + NSMutableDictionary *_handleToStatusMap; +} + +@synthesize state = _state; + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _pauseHandlers = [[NSMutableDictionary alloc] init]; + _resumeHandlers = [[NSMutableDictionary alloc] init]; + _progressHandlers = [[NSMutableDictionary alloc] init]; + _successHandlers = [[NSMutableDictionary alloc] init]; + _failureHandlers = [[NSMutableDictionary alloc] init]; + _handleToStatusMap = [[NSMutableDictionary alloc] init]; + } + return self; +} + +#pragma mark - Observers + +- (FIRStorageHandle)observeStatus:(FIRStorageTaskStatus)status + handler:(FIRStorageVoidSnapshot)handler { + FIRStorageVoidSnapshot callback = handler; + + // Note: self.snapshot is synchronized + FIRStorageTaskSnapshot *snapshot = self.snapshot; + // TODO: use an increasing counter instead of a random UUID + NSString *UUIDString = [[NSUUID UUID] UUIDString]; + switch (status) { + case FIRStorageTaskStatusPause: + @synchronized(self) { + [_pauseHandlers setValue:callback forKey:UUIDString]; + } // @synchronized(self) + if (_state == FIRStorageTaskStatePausing || _state == FIRStorageTaskStatePaused) { + [self fireHandlers:_pauseHandlers snapshot:snapshot]; + } + break; + + case FIRStorageTaskStatusResume: + @synchronized(self) { + [_resumeHandlers setValue:callback forKey:UUIDString]; + } // @synchronized(self) + if (_state == FIRStorageTaskStateResuming || _state == FIRStorageTaskStateRunning) { + [self fireHandlers:_resumeHandlers snapshot:snapshot]; + } + break; + + case FIRStorageTaskStatusProgress: + @synchronized(self) { + [_progressHandlers setValue:callback forKey:UUIDString]; + } // @synchronized(self) + if (_state == FIRStorageTaskStateRunning || _state == FIRStorageTaskStateProgress) { + [self fireHandlers:_progressHandlers snapshot:snapshot]; + } + break; + + case FIRStorageTaskStatusSuccess: + @synchronized(self) { + [_successHandlers setValue:callback forKey:UUIDString]; + } // @synchronized(self) + if (_state == FIRStorageTaskStateSuccess) { + [self fireHandlers:_successHandlers snapshot:snapshot]; + } + break; + + case FIRStorageTaskStatusFailure: + @synchronized(self) { + [_failureHandlers setValue:callback forKey:UUIDString]; + } // @synchronized(self) + if (_state == FIRStorageTaskStateFailing || _state == FIRStorageTaskStateFailed) { + [self fireHandlers:_failureHandlers snapshot:snapshot]; + } + break; + + case FIRStorageTaskStatusUnknown: + // Fall through to exception case if an unknown status is passed + + default: + [NSException raise:NSInternalInconsistencyException + format:kFIRStorageInvalidObserverStatus, nil]; + break; + } + + @synchronized(self) { + _handleToStatusMap[UUIDString] = @(status); + } // @synchronized(self) + + return UUIDString; +} + +- (void)removeObserverWithHandle:(FIRStorageHandle)handle { + FIRStorageTaskStatus status = [_handleToStatusMap[handle] intValue]; + NSMutableDictionary *observerDictionary = + [self handlerDictionaryForStatus:status]; + + @synchronized(self) { + [observerDictionary removeObjectForKey:handle]; + [_handleToStatusMap removeObjectForKey:handle]; + } // @synchronized(self) +} + +- (void)removeAllObserversForStatus:(FIRStorageTaskStatus)status { + NSMutableDictionary *observerDictionary = + [self handlerDictionaryForStatus:status]; + [self removeHandlersFromStatusMapForDictionary:observerDictionary]; + + @synchronized(self) { + [observerDictionary removeAllObjects]; + } // @synchronized(self) +} + +- (void)removeAllObservers { + @synchronized(self) { + [_pauseHandlers removeAllObjects]; + [_resumeHandlers removeAllObjects]; + [_progressHandlers removeAllObjects]; + [_successHandlers removeAllObjects]; + [_failureHandlers removeAllObjects]; + [_handleToStatusMap removeAllObjects]; + } // @synchronized(self) +} + +- (NSMutableDictionary *)handlerDictionaryForStatus: + (FIRStorageTaskStatus)status { + switch (status) { + case FIRStorageTaskStatusPause: + return _pauseHandlers; + + case FIRStorageTaskStatusResume: + return _resumeHandlers; + + case FIRStorageTaskStatusProgress: + return _progressHandlers; + + case FIRStorageTaskStatusSuccess: + return _successHandlers; + + case FIRStorageTaskStatusFailure: + return _failureHandlers; + + case FIRStorageTaskStatusUnknown: + return [NSMutableDictionary dictionary]; + + default: + [NSException raise:NSInternalInconsistencyException + format:kFIRStorageInvalidObserverStatus, nil]; + return nil; + } +} + +- (void)removeHandlersFromStatusMapForDictionary: + (NSMutableDictionary *)dict { + @synchronized(self) { + [_handleToStatusMap removeObjectsForKeys:dict.allKeys]; + } // @synchronized(self) +} + +- (void)fireHandlersForStatus:(FIRStorageTaskStatus)status + snapshot:(FIRStorageTaskSnapshot *)snapshot { + NSMutableDictionary *observerDictionary = + [self handlerDictionaryForStatus:status]; + [self fireHandlers:observerDictionary snapshot:snapshot]; +} + +- (void)fireHandlers:(NSMutableDictionary *)handlers + snapshot:(FIRStorageTaskSnapshot *)snapshot { + dispatch_queue_t callbackQueue = self.fetcherService.callbackQueue; + if (!callbackQueue) { + callbackQueue = dispatch_get_main_queue(); + } + + // TODO: iterate over this list in a consistent order + NSMutableDictionary *handlersCopy; + @synchronized(self) { + handlersCopy = [handlers copy]; + } // @synchronized(self) + [handlersCopy + enumerateKeysAndObjectsUsingBlock:^( + NSString *_Nonnull key, FIRStorageVoidSnapshot _Nonnull handler, BOOL *_Nonnull stop) { + dispatch_async(callbackQueue, ^{ + handler(snapshot); + }); + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageObservableTask_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageObservableTask_Private.h new file mode 100644 index 00000000..fb8081d9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageObservableTask_Private.h @@ -0,0 +1,51 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FIRStorageReference; +@class FIRStorageTaskSnapshot; +@class GTMSessionFetcherService; + +@interface FIRStorageObservableTask () + +/** + * Creates a new FIRStorageTask initialized with a FIRStorageReference and GTMSessionFetcherService. + * @param reference A FIRStorageReference the task will be performed on. + * @param service A GTMSessionFetcherService which provides the fetchers and configuration for + * requests. + * @param queue The shared queue to use for all Storage operations. + * @return A new FIRStorageTask representing the current task. + */ +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue; + +/** + * Raise events for a given task status by passing along a snapshot of existing task state. + * @param status A FIRStorageTaskStatus to raise events for. + * @param snapshot A FIRStorageTaskSnapshot snapshot of task state to pass through the handler. + */ +- (void)fireHandlersForStatus:(FIRStorageTaskStatus)status + snapshot:(FIRStorageTaskSnapshot *)snapshot; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStoragePath.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStoragePath.h new file mode 100644 index 00000000..53ff7ef8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStoragePath.h @@ -0,0 +1,106 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Represents a path in GCS, which can be represented as: gs://bucket/path/to/object + * or http[s]://firebasestorage.googleapis.com/v0/b/bucket/o/path/to/object?token=<12345> + * This class also includes helper methods to parse those URI/Ls, as well as to + * add and remove path segments. + */ +@interface FIRStoragePath : NSObject + +/** + * The GCS bucket in the path. + */ +@property(copy, nonatomic) NSString *bucket; + +/** + * The GCS object in the path. + */ +@property(copy, nonatomic, nullable) NSString *object; + +/** + * Parses a generic string (representing some URI or URL) and returns the appropriate path. + * @param string String which is parsed into a path. + * @return Returns an instance of FIRStoragePath or nil if one can't be created. + * @throws Throws an exception if the string is not a valid gs:// URI or http[s]:// URL. + */ ++ (nullable FIRStoragePath *)pathFromString:(NSString *)string; + +/** + * Parses a gs://bucket/path/to/object URI into a GCS path. + * @param aURIString gs:// URI which is parsed into a path. + * @return Returns an instance of FIRStoragePath or nil if one can't be created. + * @throws Throws an exception if the string is not a valid gs:// URI. + */ ++ (nullable FIRStoragePath *)pathFromGSURI:(NSString *)aURIString; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Constructs an FIRStoragePath object that represents the given bucket and object. + * @param bucket The name of the bucket. + * @param object The name of the object. + * @return An instance of FIRStoragePath representing the @a bucket and @a object. + */ +- (instancetype)initWithBucket:(NSString *)bucket + object:(nullable NSString *)object NS_DESIGNATED_INITIALIZER; + +/** + * Parses a http[s]://firebasestorage.googleapis.com/v0/b/bucket/o/path/to/object...?token=<12345> + * URL into a GCS path. + * @param aURLString http[s]:// URL which is parsed into a path. + * string which is parsed into a path. + * @return Returns an instance of FIRStoragePath or nil if one can't be created. + * @throws Throws an exception if the string is not a valid http[s]:// URL. + */ ++ (nullable FIRStoragePath *)pathFromHTTPURL:(NSString *)aURLString; + +/** + * Creates a new path based off of the current path and a string appended to it. + * Note that all slashes are compressed to a single slash, and leading and trailing slashes + * are removed. + * @param path String to append to the current path. + * @return Returns a new instance of FIRStoragePath with the new path appended. + */ +- (FIRStoragePath *)child:(NSString *)path; + +/** + * Creates a new path based off of the current path with the last path segment removed. + * @return Returns a new instance of FIRStoragePath pointing to the parent path, + * or nil if the current path points to the root. + */ +- (nullable FIRStoragePath *)parent; + +/** + * Creates a new path based off of the root of the bucket. + * @return Returns a new instance of FIRStoragePath pointing to the root of the bucket. + */ +- (FIRStoragePath *)root; + +/** + * Returns a GS URI representing the current path. + * @return Returns a gs://bucket/path/to/object URI representing the current path. + */ +- (NSString *)stringValue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStoragePath.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStoragePath.m new file mode 100644 index 00000000..ef897d8b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStoragePath.m @@ -0,0 +1,199 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStoragePath.h" + +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" + +@implementation FIRStoragePath + +#pragma mark - Class methods + ++ (nullable FIRStoragePath *)pathFromString:(NSString *)string { + if ([string hasPrefix:@"gs://"]) { + // "gs://bucket/path/to/object" + return [FIRStoragePath pathFromGSURI:string]; + } else if ([string hasPrefix:@"http://"] || [string hasPrefix:@"https://"]) { + // "http[s]://firebasestorage.googleapis.com/bucket/path/to/object?signed_url_params" + return [FIRStoragePath pathFromHTTPURL:string]; + } else { + // Invalid scheme, raise an exception! + [NSException raise:NSInternalInconsistencyException + format:@"URL scheme must be one of gs://, http://, or https:// "]; + return nil; + } +} + ++ (nullable FIRStoragePath *)pathFromGSURI:(NSString *)aURIString { + NSString *bucketName; + NSString *objectName; + NSScanner *scanner = [NSScanner scannerWithString:aURIString]; + BOOL isGSURI = [scanner scanString:@"gs://" intoString:NULL]; + BOOL hasBucket = [scanner scanUpToString:@"/" intoString:&bucketName]; + [scanner scanString:@"/" intoString:NULL]; + [scanner scanUpToString:@"\n" intoString:&objectName]; + + if (!isGSURI || !hasBucket) { + [NSException raise:NSInternalInconsistencyException + format:@"URI must be in the form of gs:///"]; + return nil; + } + + return [[self alloc] initWithBucket:bucketName object:objectName]; +} + ++ (nullable FIRStoragePath *)pathFromHTTPURL:(NSString *)aURLString { + NSString *bucketName; + NSString *objectName; + NSURL *httpsURL = [NSURL URLWithString:aURLString]; + NSArray *pathComponents = httpsURL.pathComponents; // [/, v0, b, , o, ] + + if ([httpsURL.host isEqual:kFIRStorageHost]) { + // Have a bucket name + if ([pathComponents count] > 3) { + bucketName = pathComponents[3]; + } + + // Have an object name + if ([pathComponents count] > 5) { + NSRange objectRange = NSMakeRange(5, [pathComponents count] - 5); + objectName = [[pathComponents subarrayWithRange:objectRange] componentsJoinedByString:@"/"]; + } + } + + if (bucketName.length == 0) { + [NSException raise:NSInternalInconsistencyException + format:@"URL must be in the form of " + @"http[s]://firebasestorage.googleapis.com/v0/b//o/[?token=signed_url_params]"]; + return nil; + } + + if (objectName.length == 0) { + objectName = nil; + } + + return [[self alloc] initWithBucket:bucketName object:objectName]; +} + +#pragma mark - Initializers + +- (instancetype)initWithBucket:(NSString *)bucket object:(nullable NSString *)object { + self = [super init]; + if (self) { + _bucket = [bucket copy]; + _object = [self standardizedPathForString:[object copy]]; + } + return self; +} + +#pragma mark - NSObject overrides + +- (instancetype)copyWithZone:(NSZone *)zone { + return [[[self class] allocWithZone:zone] initWithBucket:_bucket object:_object]; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[FIRStoragePath class]]) { + return NO; + } + + BOOL isObjectEqual = [self isEqualToFIRStoragePath:(FIRStoragePath *)object]; + return isObjectEqual; +} + +- (BOOL)isEqualToFIRStoragePath:(FIRStoragePath *)path { + BOOL isBucketEqual = _bucket == nil && path->_bucket == nil; + BOOL isObjectEqual = _object == nil && path->_object == nil; + + if (_bucket && path->_bucket) { + isBucketEqual = [_bucket isEqual:path->_bucket]; + } + + if (_object && path.object) { + isObjectEqual = [_object isEqual:path->_object]; + } + + BOOL isEqual = isBucketEqual && isObjectEqual; + return isEqual; +} + +- (NSUInteger)hash { + // "...because in those days, you could XOR anything with anything and get something useful..." + // https://www.usenix.org/system/files/1309_14-17_mickens.pdf + NSUInteger hash = [_bucket hash] ^ [_object hash]; + return hash; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p: %@", [self class], self, [self stringValue]]; +} + +- (NSString *)stringValue { + return [NSString stringWithFormat:@"gs://%@/%@", _bucket, _object ?: @""]; +} + +#pragma mark - Public methods + +- (FIRStoragePath *)child:(NSString *)path { + if (path.length == 0) { + return [self copy]; // Return a copy of the same path, nothing happened + } + + NSString *childObject; + if (_object == nil) { + childObject = path; + } else { + childObject = [_object stringByAppendingPathComponent:path]; + } + + FIRStoragePath *childPath = [[FIRStoragePath alloc] initWithBucket:_bucket object:childObject]; + return childPath; +} + +- (nullable FIRStoragePath *)parent { + if (_object.length == 0) { + return nil; + } + + NSString *parentObject = [_object stringByDeletingLastPathComponent]; + FIRStoragePath *parentPath = [[FIRStoragePath alloc] initWithBucket:_bucket object:parentObject]; + return parentPath; +} + +- (FIRStoragePath *)root { + FIRStoragePath *rootPath = [[FIRStoragePath alloc] initWithBucket:_bucket object:nil]; + return rootPath; +} + +#pragma mark - Private methods + +// Removes leading and trailing slashes, and compresses multiple slashes +// to create a canonical representation. +// Example: /foo//bar///baz//// -> foo/bar/baz +- (NSString *)standardizedPathForString:(NSString *)string { + NSMutableArray *components = [[string componentsSeparatedByString:@"/"] mutableCopy]; + NSIndexSet *removedPaths = + [components indexesOfObjectsPassingTest:^BOOL(NSString *string, NSUInteger idx, BOOL *stop) { + return (string.length == 0); + }]; + [components removeObjectsAtIndexes:removedPaths]; + return [components componentsJoinedByString:@"/"]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageReference.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageReference.m new file mode 100644 index 00000000..cf687b4f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageReference.m @@ -0,0 +1,487 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStorageDeleteTask.h" +#import "FirebaseStorage/Sources/FIRStorageDownloadTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageGetDownloadURLTask.h" +#import "FirebaseStorage/Sources/FIRStorageGetMetadataTask.h" +#import "FirebaseStorage/Sources/FIRStorageListResult_Private.h" +#import "FirebaseStorage/Sources/FIRStorageListTask.h" +#import "FirebaseStorage/Sources/FIRStorageMetadata_Private.h" +#import "FirebaseStorage/Sources/FIRStorageReference_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTaskSnapshot_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.h" +#import "FirebaseStorage/Sources/FIRStorageUploadTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageUtils.h" +#import "FirebaseStorage/Sources/FIRStorage_Private.h" + +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import +#import + +@implementation FIRStorageReference + +- (instancetype)init { + FIRStorage *storage = [FIRStorage storage]; + NSString *storageBucket = storage.app.options.storageBucket; + FIRStoragePath *path = [[FIRStoragePath alloc] initWithBucket:storageBucket object:nil]; + FIRStorageReference *reference = [self initWithStorage:storage path:path]; + return reference; +} + +- (instancetype)initWithStorage:(FIRStorage *)storage path:(FIRStoragePath *)path { + self = [super init]; + if (self) { + _storage = storage; + _path = path; + } + return self; +} + +#pragma mark - NSObject overrides + +- (instancetype)copyWithZone:(NSZone *)zone { + FIRStorageReference *copiedReference = [[[self class] allocWithZone:zone] initWithStorage:_storage + path:_path]; + return copiedReference; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[FIRStorageReference class]]) { + return NO; + } + + BOOL isObjectEqual = [self isEqualToFIRStorageReference:(FIRStorageReference *)object]; + return isObjectEqual; +} + +- (BOOL)isEqualToFIRStorageReference:(FIRStorageReference *)reference { + BOOL isEqual = [_storage isEqual:reference.storage] && [_path isEqual:reference.path]; + return isEqual; +} + +- (NSUInteger)hash { + NSUInteger hash = [_storage hash] ^ [_path hash]; + return hash; +} + +- (NSString *)description { + return [self stringValue]; +} + +- (NSString *)stringValue { + NSString *value = [NSString stringWithFormat:@"gs://%@/%@", _path.bucket, _path.object ?: @""]; + return value; +} + +#pragma mark - Property Getters + +- (NSString *)bucket { + NSString *bucket = _path.bucket; + return bucket; +} + +- (NSString *)fullPath { + NSString *path = _path.object; + if (!path) { + path = @""; + } + return path; +} + +- (NSString *)name { + NSString *name = [_path.object lastPathComponent]; + if (!name) { + name = @""; + } + return name; +} + +#pragma mark - Path Operations + +- (FIRStorageReference *)root { + FIRStoragePath *rootPath = [_path root]; + FIRStorageReference *rootReference = [[FIRStorageReference alloc] initWithStorage:_storage + path:rootPath]; + return rootReference; +} + +- (nullable FIRStorageReference *)parent { + FIRStoragePath *parentPath = [_path parent]; + if (!parentPath) { + return nil; + } + + FIRStorageReference *parentReference = [[FIRStorageReference alloc] initWithStorage:_storage + path:parentPath]; + return parentReference; +} + +- (FIRStorageReference *)child:(NSString *)path { + FIRStoragePath *childPath = [_path child:path]; + FIRStorageReference *childReference = [[FIRStorageReference alloc] initWithStorage:_storage + path:childPath]; + return childReference; +} + +#pragma mark - Uploads + +- (FIRStorageUploadTask *)putData:(NSData *)uploadData { + return [self putData:uploadData metadata:nil completion:nil]; +} + +- (FIRStorageUploadTask *)putData:(NSData *)uploadData + metadata:(nullable FIRStorageMetadata *)metadata { + return [self putData:uploadData metadata:metadata completion:nil]; +} + +- (FIRStorageUploadTask *)putData:(NSData *)uploadData + metadata:(nullable FIRStorageMetadata *)metadata + completion:(nullable FIRStorageVoidMetadataError)completion { + if (!metadata) { + metadata = [[FIRStorageMetadata alloc] init]; + } + + metadata.path = _path.object; + metadata.name = [_path.object lastPathComponent]; + FIRStorageUploadTask *task = + [[FIRStorageUploadTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + data:uploadData + metadata:metadata]; + + if (completion) { + __block BOOL completed = NO; + dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue; + if (!callbackQueue) { + callbackQueue = dispatch_get_main_queue(); + } + + [task observeStatus:FIRStorageTaskStatusSuccess + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + dispatch_async(callbackQueue, ^{ + if (!completed) { + completed = YES; + completion(snapshot.metadata, nil); + } + }); + }]; + [task observeStatus:FIRStorageTaskStatusFailure + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + dispatch_async(callbackQueue, ^{ + if (!completed) { + completed = YES; + completion(nil, snapshot.error); + } + }); + }]; + } + [task enqueue]; + return task; +} + +- (FIRStorageUploadTask *)putFile:(NSURL *)fileURL { + return [self putFile:fileURL metadata:nil completion:nil]; +} + +- (FIRStorageUploadTask *)putFile:(NSURL *)fileURL + metadata:(nullable FIRStorageMetadata *)metadata { + return [self putFile:fileURL metadata:metadata completion:nil]; +} + +- (FIRStorageUploadTask *)putFile:(NSURL *)fileURL + metadata:(nullable FIRStorageMetadata *)metadata + completion:(nullable FIRStorageVoidMetadataError)completion { + if (!metadata) { + metadata = [[FIRStorageMetadata alloc] init]; + } + + metadata.path = _path.object; + metadata.name = [_path.object lastPathComponent]; + FIRStorageUploadTask *task = + [[FIRStorageUploadTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + file:fileURL + metadata:metadata]; + + if (completion) { + __block BOOL completed = NO; + dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue; + if (!callbackQueue) { + callbackQueue = dispatch_get_main_queue(); + } + + [task observeStatus:FIRStorageTaskStatusSuccess + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + dispatch_async(callbackQueue, ^{ + if (!completed) { + completed = YES; + completion(snapshot.metadata, nil); + } + }); + }]; + [task observeStatus:FIRStorageTaskStatusFailure + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + dispatch_async(callbackQueue, ^{ + if (!completed) { + completed = YES; + completion(nil, snapshot.error); + } + }); + }]; + } + [task enqueue]; + return task; +} + +#pragma mark - Downloads + +- (FIRStorageDownloadTask *)dataWithMaxSize:(int64_t)size + completion:(FIRStorageVoidDataError)completion { + __block BOOL completed = NO; + FIRStorageDownloadTask *task = + [[FIRStorageDownloadTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + file:nil]; + + dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue; + if (!callbackQueue) { + callbackQueue = dispatch_get_main_queue(); + } + + [task observeStatus:FIRStorageTaskStatusSuccess + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + FIRStorageDownloadTask *task = snapshot.task; + dispatch_async(callbackQueue, ^{ + if (!completed) { + completed = YES; + completion(task.downloadData, nil); + } + }); + }]; + + [task observeStatus:FIRStorageTaskStatusFailure + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + dispatch_async(callbackQueue, ^{ + if (!completed) { + completed = YES; + completion(nil, snapshot.error); + } + }); + }]; + [task + observeStatus:FIRStorageTaskStatusProgress + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + FIRStorageDownloadTask *task = snapshot.task; + if (task.progress.totalUnitCount > size || task.progress.completedUnitCount > size) { + NSDictionary *infoDictionary = + @{@"totalSize" : @(task.progress.totalUnitCount), + @"maxAllowedSize" : @(size)}; + NSError *error = + [FIRStorageErrors errorWithCode:FIRStorageErrorCodeDownloadSizeExceeded + infoDictionary:infoDictionary]; + [task cancelWithError:error]; + } + }]; + [task enqueue]; + return task; +} + +- (FIRStorageDownloadTask *)writeToFile:(NSURL *)fileURL { + return [self writeToFile:fileURL completion:nil]; +} + +- (FIRStorageDownloadTask *)writeToFile:(NSURL *)fileURL + completion:(FIRStorageVoidURLError)completion { + FIRStorageDownloadTask *task = + [[FIRStorageDownloadTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + file:fileURL]; + if (completion) { + __block BOOL completed = NO; + dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue; + if (!callbackQueue) { + callbackQueue = dispatch_get_main_queue(); + } + + [task observeStatus:FIRStorageTaskStatusSuccess + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + dispatch_async(callbackQueue, ^{ + if (!completed) { + completed = YES; + completion(fileURL, nil); + } + }); + }]; + [task observeStatus:FIRStorageTaskStatusFailure + handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) { + dispatch_async(callbackQueue, ^{ + if (!completed) { + completed = YES; + completion(nil, snapshot.error); + } + }); + }]; + } + [task enqueue]; + return task; +} + +- (void)downloadURLWithCompletion:(FIRStorageVoidURLError)completion { + FIRStorageGetDownloadURLTask *task = + [[FIRStorageGetDownloadURLTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + completion:completion]; + [task enqueue]; +} + +#pragma mark - List + +- (void)listWithMaxResults:(int64_t)maxResults completion:(FIRStorageVoidListError)completion { + if (maxResults <= 0 || maxResults > 1000) { + completion(nil, + [FIRStorageUtils storageErrorWithDescription: + @"Argument 'maxResults' must be between 1 and 1000 inclusive." + code:FIRStorageErrorCodeInvalidArgument]); + } else { + FIRStorageListTask *task = + [[FIRStorageListTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + pageSize:@(maxResults) + previousPageToken:nil + completion:completion]; + [task enqueue]; + } +} + +- (void)listWithMaxResults:(int64_t)maxResults + pageToken:(NSString *)pageToken + completion:(FIRStorageVoidListError)completion { + if (maxResults <= 0 || maxResults > 1000) { + completion(nil, + [FIRStorageUtils storageErrorWithDescription: + @"Argument 'maxResults' must be between 1 and 1000 inclusive." + code:FIRStorageErrorCodeInvalidArgument]); + } else { + FIRStorageListTask *task = + [[FIRStorageListTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + pageSize:@(maxResults) + previousPageToken:pageToken + completion:completion]; + [task enqueue]; + } +} + +- (void)listAllWithCompletion:(FIRStorageVoidListError)completion { + NSMutableArray *prefixes = [NSMutableArray new]; + NSMutableArray *items = [NSMutableArray new]; + + __weak FIRStorageReference *weakSelf = self; + + __block FIRStorageVoidListError paginatedCompletion = + ^(FIRStorageListResult *listResult, NSError *error) { + if (error) { + completion(nil, error); + } + + FIRStorageReference *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + + [prefixes addObjectsFromArray:listResult.prefixes]; + [items addObjectsFromArray:listResult.items]; + + if (listResult.pageToken) { + FIRStorageListTask *nextPage = [[FIRStorageListTask alloc] + initWithReference:self + fetcherService:strongSelf->_storage.fetcherServiceForApp + dispatchQueue:strongSelf->_storage.dispatchQueue + pageSize:nil + previousPageToken:listResult.pageToken + completion:paginatedCompletion]; + [nextPage enqueue]; + } else { + FIRStorageListResult *result = [[FIRStorageListResult alloc] initWithPrefixes:prefixes + items:items + pageToken:nil]; + // Break the retain cycle we set up indirectly by passing the callback to `nextPage`. + paginatedCompletion = nil; + completion(result, nil); + } + }; + + FIRStorageListTask *task = + [[FIRStorageListTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + pageSize:nil + previousPageToken:nil + completion:paginatedCompletion]; + + [task enqueue]; +} + +#pragma mark - Metadata Operations + +- (void)metadataWithCompletion:(FIRStorageVoidMetadataError)completion { + FIRStorageGetMetadataTask *task = + [[FIRStorageGetMetadataTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + completion:completion]; + [task enqueue]; +} + +- (void)updateMetadata:(FIRStorageMetadata *)metadata + completion:(nullable FIRStorageVoidMetadataError)completion { + FIRStorageUpdateMetadataTask *task = + [[FIRStorageUpdateMetadataTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + metadata:metadata + completion:completion]; + [task enqueue]; +} + +#pragma mark - Delete + +- (void)deleteWithCompletion:(nullable FIRStorageVoidError)completion { + FIRStorageDeleteTask *task = + [[FIRStorageDeleteTask alloc] initWithReference:self + fetcherService:_storage.fetcherServiceForApp + dispatchQueue:_storage.dispatchQueue + completion:completion]; + [task enqueue]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageReference_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageReference_Private.h new file mode 100644 index 00000000..84a36b52 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageReference_Private.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FirebaseStorage/Sources/FIRStoragePath.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStorageReference () + +@property(nonatomic, readwrite) FIRStorage *storage; + +/** + * The current path which points to an object in the Google Cloud Storage bucket. + */ +@property(strong, nonatomic) FIRStoragePath *path; + +- (instancetype)initWithStorage:(FIRStorage *)storage + path:(FIRStoragePath *)path NS_DESIGNATED_INITIALIZER; + +- (NSString *)stringValue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTask.m new file mode 100644 index 00000000..49bc109a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTask.m @@ -0,0 +1,68 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import +#import +#import +#import "FirebaseStorage/Sources/FIRStorageReference_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTaskSnapshot_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorage_Private.h" + +#import + +@implementation FIRStorageTask + +- (instancetype)init { + @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." + reason:@"init unavailable, use designated initializer" + userInfo:nil]; +} + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue { + self = [super init]; + if (self) { + _reference = reference; + _baseRequest = [FIRStorageUtils defaultRequestForPath:reference.path]; + _fetcherService = service; + _fetcherService.maxRetryInterval = _reference.storage.maxOperationRetryTime; + _dispatchQueue = queue; + } + return self; +} + +- (FIRStorageTaskSnapshot *)snapshot { + @synchronized(self) { + NSProgress *progress = [NSProgress progressWithTotalUnitCount:self.progress.totalUnitCount]; + progress.completedUnitCount = self.progress.completedUnitCount; + FIRStorageTaskSnapshot *snapshot = + [[FIRStorageTaskSnapshot alloc] initWithTask:self + state:self.state + metadata:self.metadata + reference:self.reference + progress:progress + error:[self.error copy]]; + return snapshot; + } +} + +- (void)dispatchAsync:(void (^)(void))block { + dispatch_async(self.dispatchQueue, block); +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTaskSnapshot.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTaskSnapshot.m new file mode 100644 index 00000000..c5f7c2b3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTaskSnapshot.m @@ -0,0 +1,87 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import "FirebaseStorage/Sources/FIRStorageTaskSnapshot_Private.h" + +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" + +@implementation FIRStorageTaskSnapshot + +- (instancetype)initWithTask:(__kindof FIRStorageTask *)task + state:(FIRStorageTaskState)state + metadata:(nullable FIRStorageMetadata *)metadata + reference:(FIRStorageReference *)reference + progress:(nullable NSProgress *)progress + error:(nullable NSError *)error { + self = [super init]; + if (self) { + _task = task; + _metadata = metadata; + _reference = reference; + _progress = progress; + _error = error; + + switch (state) { + case FIRStorageTaskStateQueueing: + case FIRStorageTaskStateRunning: + case FIRStorageTaskStateResuming: + _status = FIRStorageTaskStatusResume; + break; + + case FIRStorageTaskStateProgress: + _status = FIRStorageTaskStatusProgress; + break; + + case FIRStorageTaskStatePaused: + case FIRStorageTaskStatePausing: + _status = FIRStorageTaskStatusPause; + break; + + case FIRStorageTaskStateSuccess: + case FIRStorageTaskStateCompleting: + _status = FIRStorageTaskStatusSuccess; + break; + + case FIRStorageTaskStateCancelled: + case FIRStorageTaskStateFailing: + case FIRStorageTaskStateFailed: + _status = FIRStorageTaskStatusFailure; + break; + + default: + _status = FIRStorageTaskStatusUnknown; + } + } + return self; +} + +- (NSString *)description { + switch (_status) { + case FIRStorageTaskStatusResume: + return @""; + case FIRStorageTaskStatusProgress: + return [NSString stringWithFormat:@"", _progress]; + case FIRStorageTaskStatusPause: + return @""; + case FIRStorageTaskStatusSuccess: + return @""; + case FIRStorageTaskStatusFailure: + return [NSString stringWithFormat:@"", _error]; + default: + return @""; + }; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTaskSnapshot_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTaskSnapshot_Private.h new file mode 100644 index 00000000..4ffc9712 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTaskSnapshot_Private.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import + +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" + +NS_ASSUME_NONNULL_BEGIN + +@class FIRStorageMetadata; +@class FIRStorageReference; +@class FIRStorageTask; + +@interface FIRStorageTaskSnapshot () + +@property(readwrite, copy, nonatomic) FIRStorageTask *task; +@property(readwrite, copy, nonatomic) FIRStorageMetadata *metadata; +@property(readwrite, copy, nonatomic) FIRStorageReference *reference; +@property(readwrite, strong, nonatomic) NSProgress *progress; +@property(readwrite, copy, nonatomic) NSError *error; + +/** + * Creates a new task snapshot from the given properties. + * @param task The task being represented in this snapshot. + * @param state The current state of the parent task. + * @param metadata The FIRStorageMetadata of a task. Before upload/update, contains the metadata + * to be updated; after, contains the returned metadata. May be nil if no metadata is provided + * or returned. + * @param reference The FIRStorageReference that spawned the task this snapshot is based on. + * @param progress An NSProgress object containing progress of the task this snapshot is based on, + * or nil if the task doesn't report progress. + * @param error An NSError object containing an error that occurred during the task, + * if one occurred. + * @return Returns the constructed snapshot. + */ +- (instancetype)initWithTask:(__kindof FIRStorageTask *)task + state:(FIRStorageTaskState)state + metadata:(nullable FIRStorageMetadata *)metadata + reference:(FIRStorageReference *)reference + progress:(nullable NSProgress *)progress + error:(nullable NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTask_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTask_Private.h new file mode 100644 index 00000000..6d441e70 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTask_Private.h @@ -0,0 +1,91 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStorageErrors.h" +#import "FirebaseStorage/Sources/FIRStorageReference_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTaskSnapshot_Private.h" +#import "FirebaseStorage/Sources/FIRStorageUtils.h" + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStorageTask () + +/** + * State for the current task in progress. + */ +@property(atomic) FIRStorageTaskState state; + +/** + * FIRStorageMetadata for the task in progress, or nil if none present. + */ +@property(strong, nonatomic, nullable) FIRStorageMetadata *metadata; + +/** + * Error which occurred during task execution, or nil if no error occurred. + */ +@property(strong, nonatomic, nullable) NSError *error; + +/** + * NSProgress object which tracks the progess of an observable task. + */ +@property(strong, nonatomic) NSProgress *progress; + +/** + * Reference pointing to the location the task is being performed against. + */ +@property(strong, nonatomic) FIRStorageReference *reference; + +/** + * A serial queue for all storage operations. + */ +@property(nonatomic, readonly) dispatch_queue_t dispatchQueue; + +@property(strong, readwrite, nonatomic, nonnull) FIRStorageTaskSnapshot *snapshot; + +@property(readonly, copy, nonatomic) NSURLRequest *baseRequest; + +@property(strong, atomic) GTMSessionFetcher *fetcher; + +@property(readonly, nonatomic) GTMSessionFetcherService *fetcherService; + +@property(readonly, copy) GTMSessionFetcherCompletionHandler fetcherCompletion; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Creates a new FIRStorageTask initialized with a FIRStorageReference and GTMSessionFetcherService. + * @param reference A FIRStorageReference the task will be performed on. + * @param service A GTMSessionFetcherService which provides the fetchers and configuration for + * requests. + * @param queue The shared queue to use for all Storage operations. + * @return A new FIRStorageTask representing the current task. + */ +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER; + +/** Dispatches a block on the shared Storage queue. */ +- (void)dispatchAsync:(void (^)(void))block; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTokenAuthorizer.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTokenAuthorizer.h new file mode 100644 index 00000000..75893dd0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTokenAuthorizer.h @@ -0,0 +1,47 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol FIRAuthInterop; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Wrapper class for FIRAuthInterop that implements the GTMFetcherAuthorizationProtocol, + * so as to easily provide GTMSessionFetcher fetches a Firebase Authentication JWT + * for the current logged in user. Handles token expiration and other failure cases. + * If no authentication provider exists or no token is found, no token is added + * and the request is passed. + */ +@interface FIRStorageTokenAuthorizer : NSObject + +/** + * Initializes the token authorizer with an instance of FIRApp. + * @param googleAppID The Google AppID of the app to send with the request. + * @param auth An instance that provides access to Auth functionality, if it exists. + * @return Returns an instance of FIRStorageTokenAuthorizer which adds the appropriate + * "Authorization" header to all outbound requests. Note that a token may not be added + * if the Auth instance is nil. This allows for unauthenticated access, if Firebase + * Storage rules allow for it. + */ +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + fetcherService:(GTMSessionFetcherService *)service + authProvider:(nullable id)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTokenAuthorizer.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTokenAuthorizer.m new file mode 100644 index 00000000..79b50162 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageTokenAuthorizer.m @@ -0,0 +1,132 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStorageTokenAuthorizer.h" + +#import +#import +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStorageErrors.h" + +#import "Interop/Auth/Public/FIRAuthInterop.h" + +@implementation FIRStorageTokenAuthorizer { + @private + /// Google App ID to pass along with each request. + NSString *_googleAppID; + + /// Auth provider. + id _auth; +} + +@synthesize fetcherService = _fetcherService; + +- (instancetype)initWithGoogleAppID:(NSString *)googleAppID + fetcherService:(GTMSessionFetcherService *)service + authProvider:(nullable id)auth { + self = [super init]; + if (self) { + _googleAppID = googleAppID; + _fetcherService = service; + _auth = auth; + } + return self; +} + +#pragma mark - GTMFetcherAuthorizationProtocol methods + +- (void)authorizeRequest:(NSMutableURLRequest *)request + delegate:(id)delegate + didFinishSelector:(SEL)sel { + // Set version header on each request + NSString *versionString = [NSString stringWithFormat:@"ios/%s", FIRStorageVersionString]; + [request setValue:versionString forHTTPHeaderField:@"x-firebase-storage-version"]; + + // Set GMP ID on each request + [request setValue:_googleAppID forHTTPHeaderField:@"x-firebase-gmpid"]; + + if (delegate && sel) { + id selfParam = self; + NSMethodSignature *sig = [delegate methodSignatureForSelector:sel]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; + [invocation setSelector:sel]; + [invocation setTarget:delegate]; + [invocation setArgument:&selfParam atIndex:2]; + [invocation setArgument:&request atIndex:3]; + + dispatch_queue_t callbackQueue = self.fetcherService.callbackQueue; + if (!callbackQueue) { + callbackQueue = dispatch_get_main_queue(); + } + + [invocation retainArguments]; + if (_auth) { + [_auth getTokenForcingRefresh:NO + withCallback:^(NSString *_Nullable token, NSError *_Nullable error) { + if (error) { + NSMutableDictionary *errorDictionary = + [NSMutableDictionary dictionaryWithDictionary:error.userInfo]; + errorDictionary[kFIRStorageResponseErrorDomain] = error.domain; + errorDictionary[kFIRStorageResponseErrorCode] = @(error.code); + + NSError *tokenError = + [FIRStorageErrors errorWithCode:FIRStorageErrorCodeUnauthenticated + infoDictionary:errorDictionary]; + [invocation setArgument:&tokenError atIndex:4]; + } else if (token) { + NSString *firebaseToken = + [NSString stringWithFormat:kFIRStorageAuthTokenFormat, token]; + [request setValue:firebaseToken forHTTPHeaderField:@"Authorization"]; + } + dispatch_async(callbackQueue, ^{ + [invocation invoke]; + }); + }]; + } else { + dispatch_async(callbackQueue, ^{ + [invocation invoke]; + }); + } + } +} + +// Note that stopAuthorization, isAuthorizingRequest, and userEmail +// aren't relevant with the Firebase App/Auth implementation of tokens, +// and thus aren't implemented. Token refresh is handled transparently +// for us, and we don't allow the auth request to be stopped. +// Auth is also not required so the world doesn't stop. +- (void)stopAuthorization { + // Noop +} + +- (void)stopAuthorizationForRequest:(NSURLRequest *)request { + // Noop +} + +- (BOOL)isAuthorizingRequest:(NSURLRequest *)request { + return NO; +} + +- (BOOL)isAuthorizedRequest:(NSURLRequest *)request { + NSString *authHeader = request.allHTTPHeaderFields[@"Authorization"]; + BOOL isFirebaseToken = [authHeader hasPrefix:@"Firebase"]; + return isFirebaseToken; +} + +- (NSString *)userEmail { + // Noop + return nil; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.h new file mode 100644 index 00000000..fb60fc5c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.h @@ -0,0 +1,36 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class GTMSessionFetcherService; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Task which provides the ability update the metadata on an object in Firebase Storage. + */ +@interface FIRStorageUpdateMetadataTask : FIRStorageTask + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + metadata:(FIRStorageMetadata *)metadata + completion:(FIRStorageVoidMetadataError)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.m new file mode 100644 index 00000000..d091b7ca --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.m @@ -0,0 +1,107 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FirebaseStorage/Sources/FIRStorageUpdateMetadataTask.h" + +#import "FirebaseStorage/Sources/FIRStorageMetadata_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" + +@implementation FIRStorageUpdateMetadataTask { + @private + FIRStorageVoidMetadataError _completion; + // Metadata used in the update request + FIRStorageMetadata *_updateMetadata; +} + +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + metadata:(FIRStorageMetadata *)metadata + completion:(FIRStorageVoidMetadataError)completion { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _updateMetadata = [metadata copy]; + _completion = [completion copy]; + } + return self; +} + +- (void)dealloc { + [_fetcher stopFetching]; +} + +- (void)enqueue { + __weak FIRStorageUpdateMetadataTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageUpdateMetadataTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + NSDictionary *updateDictionary = [strongSelf->_updateMetadata updatedMetadata]; + NSData *updateData = [NSData frs_dataFromJSONDictionary:updateDictionary]; + request.HTTPMethod = @"PATCH"; + request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime; + request.HTTPBody = updateData; + NSString *typeString = @"application/json; charset=UTF-8"; + [request setValue:typeString forHTTPHeaderField:@"Content-Type"]; + NSString *lengthString = [NSString stringWithFormat:@"%zu", (unsigned long)[updateData length]]; + [request setValue:lengthString forHTTPHeaderField:@"Content-Length"]; + + FIRStorageVoidMetadataError callback = strongSelf->_completion; + strongSelf->_completion = nil; + + GTMSessionFetcher *fetcher = [strongSelf.fetcherService fetcherWithRequest:request]; + strongSelf->_fetcher = fetcher; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + strongSelf->_fetcherCompletion = ^(NSData *data, NSError *error) { + FIRStorageMetadata *metadata; + if (error) { + if (!self.error) { + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + } + } else { + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary) { + metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; + [metadata setType:FIRStorageMetadataTypeFile]; + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } + } + + if (callback) { + callback(metadata, self.error); + } + self->_fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + + fetcher.comment = @"UpdateMetadataTask"; + + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); + }]; + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUploadTask.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUploadTask.m new file mode 100644 index 00000000..18a67656 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUploadTask.m @@ -0,0 +1,271 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStorageMetadata_Private.h" +#import "FirebaseStorage/Sources/FIRStorageObservableTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageTask_Private.h" +#import "FirebaseStorage/Sources/FIRStorageUploadTask_Private.h" + +#import + +@implementation FIRStorageUploadTask + +@synthesize progress = _progress; +@synthesize fetcherCompletion = _fetcherCompletion; + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + data:(NSData *)uploadData + metadata:(FIRStorageMetadata *)metadata { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _uploadMetadata = [metadata copy]; + _uploadData = [uploadData copy]; + _progress = [NSProgress progressWithTotalUnitCount:[_uploadData length]]; + + if (!_uploadMetadata.contentType) { + _uploadMetadata.contentType = @"application/octet-stream"; + } + } + return self; +} + +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + file:(NSURL *)fileURL + metadata:(FIRStorageMetadata *)metadata { + self = [super initWithReference:reference fetcherService:service dispatchQueue:queue]; + if (self) { + _uploadMetadata = [metadata copy]; + _fileURL = [fileURL copy]; + _progress = [NSProgress progressWithTotalUnitCount:0]; + + NSString *mimeType = [FIRStorageUtils MIMETypeForExtension:[_fileURL pathExtension]]; + + if (!_uploadMetadata.contentType) { + _uploadMetadata.contentType = mimeType ?: @"application/octet-stream"; + } + } + return self; +} + +- (void)dealloc { + [_uploadFetcher stopFetching]; +} + +- (void)enqueue { + __weak FIRStorageUploadTask *weakSelf = self; + + [self dispatchAsync:^() { + FIRStorageUploadTask *strongSelf = weakSelf; + + if (!strongSelf) { + return; + } + + NSError *contentValidationError; + if (![strongSelf isContentToUploadValid:&contentValidationError]) { + strongSelf.error = contentValidationError; + [strongSelf finishTaskWithStatus:FIRStorageTaskStatusFailure snapshot:strongSelf.snapshot]; + return; + } + + strongSelf.state = FIRStorageTaskStateQueueing; + + NSMutableURLRequest *request = [strongSelf.baseRequest mutableCopy]; + request.HTTPMethod = @"POST"; + request.timeoutInterval = strongSelf.reference.storage.maxUploadRetryTime; + NSData *bodyData = + [NSData frs_dataFromJSONDictionary:[strongSelf->_uploadMetadata dictionaryRepresentation]]; + request.HTTPBody = bodyData; + [request setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; + NSString *contentLengthString = + [NSString stringWithFormat:@"%zu", (unsigned long)[bodyData length]]; + [request setValue:contentLengthString forHTTPHeaderField:@"Content-Length"]; + + NSURLComponents *components = [NSURLComponents componentsWithURL:request.URL + resolvingAgainstBaseURL:NO]; + + if ([components.host isEqual:kGCSHost]) { + [components setPercentEncodedPath:[@"/upload" stringByAppendingString:components.path]]; + } + + NSDictionary *queryParams = @{@"uploadType" : @"resumable", @"name" : self.uploadMetadata.path}; + [components setPercentEncodedQuery:[FIRStorageUtils queryStringForDictionary:queryParams]]; + request.URL = components.URL; + + GTMSessionUploadFetcher *uploadFetcher = + [GTMSessionUploadFetcher uploadFetcherWithRequest:request + uploadMIMEType:strongSelf->_uploadMetadata.contentType + chunkSize:kGTMSessionUploadFetcherStandardChunkSize + fetcherService:self.fetcherService]; + + if (strongSelf->_uploadData) { + [uploadFetcher setUploadData:strongSelf->_uploadData]; + uploadFetcher.comment = @"Data UploadTask"; + } else if (strongSelf->_fileURL) { + [uploadFetcher setUploadFileURL:strongSelf->_fileURL]; + uploadFetcher.comment = @"File UploadTask"; + } + + uploadFetcher.maxRetryInterval = self.reference.storage.maxUploadRetryTime; + + [uploadFetcher setSendProgressBlock:^(int64_t bytesSent, int64_t totalBytesSent, + int64_t totalBytesExpectedToSend) { + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesSent; + weakSelf.progress.totalUnitCount = totalBytesExpectedToSend; + weakSelf.metadata = self->_uploadMetadata; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:weakSelf.snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + }]; + + strongSelf->_uploadFetcher = uploadFetcher; + + // Process fetches + strongSelf.state = FIRStorageTaskStateRunning; + + strongSelf->_fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) { + // Fire last progress updates + [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot]; + + // Handle potential issues with upload + if (error) { + self.state = FIRStorageTaskStateFailed; + self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; + self.metadata = self->_uploadMetadata; + + [self finishTaskWithStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; + return; + } + + // Upload completed successfully, fire completion callbacks + self.state = FIRStorageTaskStateSuccess; + + NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data]; + if (responseDictionary) { + FIRStorageMetadata *metadata = + [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary]; + [metadata setType:FIRStorageMetadataTypeFile]; + self.metadata = metadata; + } else { + self.error = [FIRStorageErrors errorWithInvalidRequest:data]; + } + + [self finishTaskWithStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot]; + }; + + [strongSelf->_uploadFetcher + beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) { + if (weakSelf.fetcherCompletion != nil) { + weakSelf.fetcherCompletion(data, error); + } + }]; + }]; +} + +- (void)finishTaskWithStatus:(FIRStorageTaskStatus)status + snapshot:(FIRStorageTaskSnapshot *)snapshot { + [self fireHandlersForStatus:status snapshot:self.snapshot]; + [self removeAllObservers]; + self->_fetcherCompletion = nil; +} + +- (BOOL)isContentToUploadValid:(NSError **)outError { + if (_uploadData != nil) { + return YES; + } + + NSError *fileReachabilityError; + if (![_fileURL checkResourceIsReachableAndReturnError:&fileReachabilityError] || + ![self fileURLisFile:_fileURL]) { + if (outError != NULL) { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:2]; + userInfo[NSLocalizedDescriptionKey] = [NSString + stringWithFormat:@"File at URL: %@ is not reachable. " + @"Ensure file URL is not a directory, symbolic link, or invalid url.", + _fileURL.absoluteString]; + + if (fileReachabilityError) { + userInfo[NSUnderlyingErrorKey] = fileReachabilityError; + } + + *outError = [NSError errorWithDomain:FIRStorageErrorDomain + code:FIRStorageErrorCodeUnknown + userInfo:userInfo]; + } + + return NO; + } + + return YES; +} + +#pragma mark - Upload Management + +- (void)cancel { + __weak FIRStorageUploadTask *weakSelf = self; + + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStateCancelled; + [weakSelf.uploadFetcher stopFetching]; + if (weakSelf.state != FIRStorageTaskStateSuccess) { + weakSelf.metadata = weakSelf.uploadMetadata; + } + weakSelf.error = [FIRStorageErrors errorWithCode:FIRStorageErrorCodeCancelled]; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:weakSelf.snapshot]; + }]; +} + +- (void)pause { + __weak FIRStorageUploadTask *weakSelf = self; + + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStatePaused; + [weakSelf.uploadFetcher pauseFetching]; + if (weakSelf.state != FIRStorageTaskStateSuccess) { + weakSelf.metadata = weakSelf.uploadMetadata; + } + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusPause snapshot:weakSelf.snapshot]; + }]; +} + +- (void)resume { + __weak FIRStorageUploadTask *weakSelf = self; + + [self dispatchAsync:^() { + weakSelf.state = FIRStorageTaskStateResuming; + [weakSelf.uploadFetcher resumeFetching]; + if (weakSelf.state != FIRStorageTaskStateSuccess) { + weakSelf.metadata = weakSelf.uploadMetadata; + } + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusResume snapshot:weakSelf.snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; + }]; +} + +#pragma mark - Private Helpers + +- (BOOL)fileURLisFile:(NSURL *)fileURL { + NSNumber *isFile = [NSNumber numberWithBool:NO]; + [fileURL getResourceValue:&isFile forKey:NSURLIsRegularFileKey error:nil]; + return [isFile boolValue]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUploadTask_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUploadTask_Private.h new file mode 100644 index 00000000..8d37a8b6 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUploadTask_Private.h @@ -0,0 +1,73 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class GTMSessionUploadFetcher; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStorageUploadTask () + +/** + * The data to be uploaded (if uploading bytes). + */ +@property(readonly, copy, nonatomic, nullable) NSData *uploadData; + +/** + * The name of a file on disk to be uploaded (if uploading from a file). + */ +@property(readonly, copy, nonatomic, nullable) NSURL *fileURL; + +/** + * The FIRStorageMetadata about the object being uploaded. + */ +@property(readonly, copy, nonatomic) FIRStorageMetadata *uploadMetadata; + +/** + * GTMSessionUploadFetcher used by all uploads. + */ +@property(strong, atomic) GTMSessionUploadFetcher *uploadFetcher; + +/** + * Initializes an upload task with a base FIRStorageReference and GTMSessionFetcherService. + * @param reference The base FIRStorageReference which fetchers use for configuration. + * @param service The GTMSessionFetcherService which will create fetchers. + * @param queue The shared queue to use for all Storage operations. + * @param uploadData The NSData object to be uploaded. + * @return Returns an instance of FIRStorageUploadTask. + */ +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + data:(NSData *)uploadData + metadata:(FIRStorageMetadata *)metadata; + +/** + * Initializes an upload task with a base FIRStorageReference and GTMSessionFetcherService. + * @param reference The base FIRStorageReference which fetchers use for configuration. + * @param service The GTMSessionFetcherService which will create fetchers. + * @param queue The shared queue to use for all Storage operations. + * @param fileURL The system file URL to upload from. + * @return Returns an instance of FIRStorageUploadTask. + */ +- (instancetype)initWithReference:(FIRStorageReference *)reference + fetcherService:(GTMSessionFetcherService *)service + dispatchQueue:(dispatch_queue_t)queue + file:(NSURL *)fileURL + metadata:(FIRStorageMetadata *)metadata; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUtils.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUtils.h new file mode 100644 index 00000000..55dfab09 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUtils.h @@ -0,0 +1,111 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRStoragePath; + +NS_ASSUME_NONNULL_BEGIN + +/** + * FIRStorageUtils provides a number of helper methods for commonly used operations + * in Firebase Storage, such as JSON parsing, escaping, and file extensions. + */ +@interface FIRStorageUtils : NSObject + +/** + * Returns a percent encoded string appropriate for GCS. + * See https://cloud.google.com/storage/docs/naming for more details. + * @param string A path to escape characters according to the GCS + * @return A percent encoded string appropriate for GCS operations or nil if string is nil + * or can't be escaped. + */ ++ (nullable NSString *)GCSEscapedString:(NSString *)string; + +/** + * Returns the MIME type for a file extension. + * Example of how to get MIME type here: http://ddeville.me/2011/12/mime-to-UTI-cocoa/ + * @param extension A file extension such as "txt", "png", etc. + * @return The MIME type for the input extension such as "text/plain", "image/png", etc. + * or nil if no type is found. + */ ++ (nullable NSString *)MIMETypeForExtension:(NSString *)extension; + +/** + * Returns a properly escaped query string from a given dictionary of query items to values. + * @param dictionary A dictionary containing query items and associated values. + * @return A properly escaped query string or the empty string for a nil or empty dictionary. + */ ++ (NSString *)queryStringForDictionary:(nullable NSDictionary *)dictionary; + +/** + * Returns a base NSURLRequest used by all tasks. + * @param path The FIRStoragePath to create a request for. + * @return Returns a properly formatted NSURLRequest of the form: + * scheme://host/version/b//o[/path/to/object] + */ ++ (NSURLRequest *)defaultRequestForPath:(FIRStoragePath *)path; + +/** + * Returns a base NSURLRequest with custom query parameters. + * @param path The FIRStoragePath to create a request for. + * @param queryParams A key/value dictionary with query parameters. + * @return Returns a formatted NSURLRequest + */ ++ (NSURLRequest *)defaultRequestForPath:(FIRStoragePath *)path + queryParams:(NSDictionary *)queryParams; + +/** + * Creates the appropriate GCS percent escaped path for a given FIRStoragePath. + * @param path The FIRStoragePath to encode. + * @return Returns the GCS encoded URL for a given FIRStoragePath. + */ ++ (NSString *)encodedURLForPath:(FIRStoragePath *)path; + +/** + * Creates a NSError in the Firebase Storage domain with given code and description. + * Useful for argument validation. + * @param description The error description to surface to the user. + * @param code The error code. + * @return An NSError in the Firebase Storage error domain. + */ ++ (NSError *)storageErrorWithDescription:(NSString *)description code:(NSInteger)code; + +@end + +@interface NSDictionary (FIRStorageNSDictionaryJSONHelpers) + +/** + * Returns a dictionary representation of the data in @a data. + * @param data NSData containing JSON data. + * @return An NSDictionary representation of the JSON, or nil if serialization failed. + */ ++ (nullable instancetype)frs_dictionaryFromJSONData:(nullable NSData *)data; + +@end + +@interface NSData (FIRStorageNSDataJSONHelpers) + +/** + * Returns an NSData instance containing JSON serialized from @a dictionary. + * @param dictionary An NSDictionary containing only types serializable to JSON. + * @return An NSData object representing the binary JSON, or nil if serialization failed. + */ ++ (nullable instancetype)frs_dataFromJSONDictionary:(nullable NSDictionary *)dictionary; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUtils.m b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUtils.m new file mode 100644 index 00000000..443b26dc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorageUtils.m @@ -0,0 +1,151 @@ +// Copyright 2017 Google +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#if TARGET_OS_IOS || TARGET_OS_TV +#import +#elif TARGET_OS_OSX || TARGET_OS_WATCH +#import +#endif + +#import "FirebaseStorage/Sources/FIRStorageUtils.h" + +#import "FirebaseStorage/Sources/FIRStorageConstants_Private.h" +#import "FirebaseStorage/Sources/FIRStorageErrors.h" +#import "FirebaseStorage/Sources/FIRStoragePath.h" + +#import + +// This is the list at https://cloud.google.com/storage/docs/json_api/ without &, ; and +. +NSString *const kGCSObjectAllowedCharacterSet = + @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$'()*,=:@"; + +@implementation FIRStorageUtils + ++ (nullable NSString *)GCSEscapedString:(NSString *)string { + NSCharacterSet *allowedCharacters = + [NSCharacterSet characterSetWithCharactersInString:kGCSObjectAllowedCharacterSet]; + + return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters]; +} + ++ (nullable NSString *)MIMETypeForExtension:(NSString *)extension { + if (extension == nil) { + return nil; + } + + CFStringRef pathExtension = (__bridge_retained CFStringRef)extension; + CFStringRef type = + UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, NULL); + NSString *mimeType = + (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass(type, kUTTagClassMIMEType); + CFRelease(pathExtension); + if (type != NULL) { + CFRelease(type); + } + + return mimeType; +} + ++ (NSString *)queryStringForDictionary:(nullable NSDictionary *)dictionary { + if (!dictionary) { + return @""; + } + + __block NSMutableArray *queryItems = [[NSMutableArray alloc] initWithCapacity:[dictionary count]]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *_Nonnull name, NSString *_Nonnull value, + BOOL *_Nonnull stop) { + NSString *item = + [FIRStorageUtils GCSEscapedString:[NSString stringWithFormat:@"%@=%@", name, value]]; + [queryItems addObject:item]; + }]; + return [queryItems componentsJoinedByString:@"&"]; +} + ++ (NSURLRequest *)defaultRequestForPath:(FIRStoragePath *)path { + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; + NSURLComponents *components = [[NSURLComponents alloc] init]; + [components setScheme:kFIRStorageScheme]; + [components setHost:kFIRStorageHost]; + NSString *encodedPath = [self encodedURLForPath:path]; + [components setPercentEncodedPath:encodedPath]; + [request setURL:components.URL]; + return request; +} + ++ (NSURLRequest *)defaultRequestForPath:(FIRStoragePath *)path + queryParams:(NSDictionary *)queryParams { + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; + NSURLComponents *components = [[NSURLComponents alloc] init]; + [components setScheme:kFIRStorageScheme]; + [components setHost:kFIRStorageHost]; + + NSMutableArray *queryItems = [NSMutableArray new]; + for (NSString *key in queryParams) { + [queryItems addObject:[NSURLQueryItem queryItemWithName:key value:queryParams[key]]]; + } + [components setQueryItems:queryItems]; + + NSString *encodedPath = [self encodedURLForPath:path]; + [components setPercentEncodedPath:encodedPath]; + [request setURL:components.URL]; + return request; +} + ++ (NSString *)encodedURLForPath:(FIRStoragePath *)path { + NSString *bucketName = [FIRStorageUtils GCSEscapedString:path.bucket]; + NSString *objectName = [FIRStorageUtils GCSEscapedString:path.object]; + NSString *bucketFormat = [NSString stringWithFormat:kFIRStorageBucketPathFormat, bucketName]; + NSString *urlPath = [@"/" stringByAppendingPathComponent:bucketFormat]; + if (objectName) { + NSString *objectFormat = [NSString stringWithFormat:kFIRStorageObjectPathFormat, objectName]; + urlPath = [urlPath stringByAppendingFormat:@"/%@", objectFormat]; + } else { + urlPath = [urlPath stringByAppendingString:@"/o"]; + } + return [@"/" stringByAppendingString:[kFIRStorageVersionPath stringByAppendingString:urlPath]]; +} + ++ (NSError *)storageErrorWithDescription:(NSString *)description code:(NSInteger)code { + return [NSError errorWithDomain:FIRStorageErrorDomain + code:code + userInfo:@{NSLocalizedDescriptionKey : description}]; +} + +@end + +@implementation NSDictionary (FIRStorageNSDictionaryJSONHelpers) + ++ (nullable instancetype)frs_dictionaryFromJSONData:(nullable NSData *)data { + if (!data) { + return nil; + } + return [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingMutableContainers + error:nil]; +} + +@end + +@implementation NSData (FIRStorageNSDataJSONHelpers) + ++ (nullable instancetype)frs_dataFromJSONDictionary:(nullable NSDictionary *)dictionary { + if (!dictionary) { + return nil; + } + return [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorage_Private.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorage_Private.h new file mode 100644 index 00000000..04cecc14 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/FIRStorage_Private.h @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class FIRApp; +@class GTMSessionFetcherService; + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRStorage () + +@property(strong, nonatomic, readwrite) FIRApp *app; + +@property(strong, nonatomic) GTMSessionFetcherService *fetcherServiceForApp; + +@property(nonatomic, readonly) dispatch_queue_t dispatchQueue; + +@property(strong, nonatomic) NSString *storageBucket; + +/** + * Enables/disables GTMSessionFetcher HTTP logging + * @param isLoggingEnabled Boolean passed through to enable/disable GTMSessionFetcher logging + */ ++ (void)setGTMSessionFetcherLoggingEnabled:(BOOL)isLoggingEnabled; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorage.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorage.h new file mode 100644 index 00000000..85eb25da --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorage.h @@ -0,0 +1,130 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRStorageConstants.h" + +@class FIRApp; +@class FIRStorageReference; + +NS_ASSUME_NONNULL_BEGIN + +/** Project version string for FirebaseStorage. */ +FOUNDATION_EXPORT const char *const FIRStorageVersionString NS_SWIFT_NAME(StorageVersionString); + +/** + * FirebaseStorage is a service that supports uploading and downloading binary objects, + * such as images, videos, and other files to Google Cloud Storage. + * + * If you call [FIRStorage storage], the instance will initialize with the default FIRApp, + * [FIRApp defaultApp], and the storage location will come from the provided + * GoogleService-Info.plist. + * + * If you call [FIRStorage storageForApp:] and provide a custom instance of FIRApp, + * the storage location will be specified via the FIROptions#storageBucket property. + */ +NS_SWIFT_NAME(Storage) +@interface FIRStorage : NSObject + +/** + * Creates an instance of FIRStorage, configured with the default FIRApp. + * @return the FIRStorage instance, initialized with the default FIRApp. + */ ++ (instancetype)storage NS_SWIFT_NAME(storage()); + +/** + * Creates an instance of FIRStorage, configured with the custom FIRApp @a app. + * @param app The custom FIRApp used for initialization. + * @return the FIRStorage instance, initialized with the custom FIRApp. + */ ++ (instancetype)storageForApp:(FIRApp *)app NS_SWIFT_NAME(storage(app:)); + +/** + * Creates an instance of FIRStorage, configured with a custom storage bucket @a url. + * @param url The gs:// url to your Firebase Storage Bucket. + * @return the FIRStorage instance, initialized with the custom FIRApp. + */ ++ (instancetype)storageWithURL:(NSString *)url NS_SWIFT_NAME(storage(url:)); + +/** + * Creates an instance of FIRStorage, configured with a custom FIRApp @a app and a custom storage + * bucket @a url. + * @param app The custom FIRApp used for initialization. + * @param url The gs:// url to your Firebase Storage Bucket. + * @return the FIRStorage instance, initialized with the custom FIRApp. + */ ++ (instancetype)storageForApp:(FIRApp *)app URL:(NSString *)url NS_SWIFT_NAME(storage(app:url:)); + +- (instancetype)init NS_UNAVAILABLE; + +/** + * The Firebase App associated with this Firebase Storage instance. + */ +@property(strong, nonatomic, readonly) FIRApp *app; + +/** + * Maximum time in seconds to retry an upload if a failure occurs. + * Defaults to 10 minutes (600 seconds). + */ +@property NSTimeInterval maxUploadRetryTime; + +/** + * Maximum time in seconds to retry a download if a failure occurs. + * Defaults to 10 minutes (600 seconds). + */ +@property NSTimeInterval maxDownloadRetryTime; + +/** + * Maximum time in seconds to retry operations other than upload and download if a failure occurs. + * Defaults to 2 minutes (120 seconds). + */ +@property NSTimeInterval maxOperationRetryTime; + +/** + * Queue that all developer callbacks are fired on. Defaults to the main queue. + */ +@property(strong, nonatomic) dispatch_queue_t callbackQueue; + +/** + * Creates a FIRStorageReference initialized at the root Firebase Storage location. + * @return An instance of FIRStorageReference initialized at the root. + */ +- (FIRStorageReference *)reference; + +/** + * Creates a FIRStorageReference given a gs:// or https:// URL pointing to a Firebase Storage + * location. For example, you can pass in an https:// download URL retrieved from + * [FIRStorageReference downloadURLWithCompletion] or the gs:// URI from + * [FIRStorageReference description]. + * @param string A gs:// or https:// URL to initialize the reference with. + * @return An instance of FIRStorageReference at the given child path. + * @throws Throws an exception if passed in URL is not associated with the FIRApp used to initialize + * this FIRStorage. + */ +- (FIRStorageReference *)referenceForURL:(NSString *)string; + +/** + * Creates a FIRStorageReference initialized at a child Firebase Storage location. + * @param string A relative path from the root to initialize the reference with, + * for instance @"path/to/object". + * @return An instance of FIRStorageReference at the given child path. + */ +- (FIRStorageReference *)referenceWithPath:(NSString *)string; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageConstants.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageConstants.h new file mode 100644 index 00000000..52c73826 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageConstants.h @@ -0,0 +1,174 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRStorageDownloadTask; +@class FIRStorageMetadata; +@class FIRStorageTaskSnapshot; +@class FIRStorageUploadTask; + +NS_ASSUME_NONNULL_BEGIN + +/** + * NSString typedef representing a task listener handle. + */ +typedef NSString *FIRStorageHandle NS_SWIFT_NAME(StorageHandle); + +/** + * Block typedef typically used when downloading data. + * @param data The data returned by the download, or nil if no data available or download failed. + * @param error The error describing failure, if one occurred. + */ +typedef void (^FIRStorageVoidDataError)(NSData *_Nullable data, NSError *_Nullable error) + NS_SWIFT_NAME(StorageVoidDataError); + +/** + * Block typedef typically used when performing "binary" async operations such as delete, + * where the operation either succeeds without an error or fails with an error. + * @param error The error describing failure, if one occurred. + */ +typedef void (^FIRStorageVoidError)(NSError *_Nullable error) NS_SWIFT_NAME(StorageVoidError); + +/** + * Block typedef typically used when retrieving metadata. + * @param metadata The metadata returned by the operation, if metadata exists. + */ +typedef void (^FIRStorageVoidMetadata)(FIRStorageMetadata *_Nullable metadata) + NS_SWIFT_NAME(StorageVoidMetadata); + +/** + * Block typedef typically used when retrieving metadata with the possibility of an error. + * @param metadata The metadata returned by the operation, if metadata exists. + * @param error The error describing failure, if one occurred. + */ +typedef void (^FIRStorageVoidMetadataError)(FIRStorageMetadata *_Nullable metadata, + NSError *_Nullable error) + NS_SWIFT_NAME(StorageVoidMetadataError); + +/** + * Block typedef typically used to asynchronously return a storage task snapshot. + * @param snapshot The returned task snapshot. + */ +typedef void (^FIRStorageVoidSnapshot)(FIRStorageTaskSnapshot *snapshot) + NS_SWIFT_NAME(StorageVoidSnapshot); + +/** + * Block typedef typically used when retrieving a download URL. + * @param URL The download URL associated with the operation. + * @param error The error describing failure, if one occurred. + */ +typedef void (^FIRStorageVoidURLError)(NSURL *_Nullable URL, NSError *_Nullable error) + NS_SWIFT_NAME(StorageVoidURLError); + +/** + * Enum representing the upload and download task status. + */ +typedef NS_ENUM(NSInteger, FIRStorageTaskStatus) { + /** + * Unknown task status. + */ + FIRStorageTaskStatusUnknown, + + /** + * Task is being resumed. + */ + FIRStorageTaskStatusResume, + + /** + * Task reported a progress event. + */ + FIRStorageTaskStatusProgress, + + /** + * Task is paused. + */ + FIRStorageTaskStatusPause, + + /** + * Task has completed successfully. + */ + FIRStorageTaskStatusSuccess, + + /** + * Task has failed and is unrecoverable. + */ + FIRStorageTaskStatusFailure +} NS_SWIFT_NAME(StorageTaskStatus); + +/** + * Firebase Storage error domain. + */ +FOUNDATION_EXPORT NSString *const FIRStorageErrorDomain NS_SWIFT_NAME(StorageErrorDomain); + +/** + * Enum representing the errors raised by Firebase Storage. + */ +typedef NS_ENUM(NSInteger, FIRStorageErrorCode) { + /** An unknown error occurred. */ + FIRStorageErrorCodeUnknown = -13000, + + /** No object exists at the desired reference. */ + FIRStorageErrorCodeObjectNotFound = -13010, + + /** No bucket is configured for Firebase Storage. */ + FIRStorageErrorCodeBucketNotFound = -13011, + + /** No project is configured for Firebase Storage. */ + FIRStorageErrorCodeProjectNotFound = -13012, + + /** + * Quota on your Firebase Storage bucket has been exceeded. + * If you're on the free tier, upgrade to a paid plan. + * If you're on a paid plan, reach out to Firebase support. + */ + FIRStorageErrorCodeQuotaExceeded = -13013, + + /** User is unauthenticated. Authenticate and try again. */ + FIRStorageErrorCodeUnauthenticated = -13020, + + /** + * User is not authorized to perform the desired action. + * Check your rules to ensure they are correct. + */ + FIRStorageErrorCodeUnauthorized = -13021, + + /** + * The maximum time limit on an operation (upload, download, delete, etc.) has been exceeded. + * Try uploading again. + */ + FIRStorageErrorCodeRetryLimitExceeded = -13030, + + /** + * File on the client does not match the checksum of the file received by the server. + * Try uploading again. + */ + FIRStorageErrorCodeNonMatchingChecksum = -13031, + + /** + * Size of the downloaded file exceeds the amount of memory allocated for the download. + * Increase memory cap and try downloading again. + */ + FIRStorageErrorCodeDownloadSizeExceeded = -13032, + + /** User cancelled the operation. */ + FIRStorageErrorCodeCancelled = -13040, + + /** An invalid argument was provided. */ + FIRStorageErrorCodeInvalidArgument = -13050 +} NS_SWIFT_NAME(StorageErrorCode); + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageDownloadTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageDownloadTask.h new file mode 100644 index 00000000..c11373f0 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageDownloadTask.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRStorageObservableTask.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * FIRStorageDownloadTask implements resumable downloads from an object in Firebase Storage. + * Downloads can be returned on completion with a completion handler, and can be monitored + * by attaching observers, or controlled by calling FIRStorageTask#pause, FIRStorageTask#resume, + * or FIRStorageTask#cancel. + * Downloads can currently be returned as NSData in memory, or as an NSURL to a file on disk. + * Downloads are performed on a background queue, and callbacks are raised on the developer + * specified callbackQueue in FIRStorage, or the main queue if left unspecified. + * Currently all uploads must be initiated and managed on the main queue. + */ +NS_SWIFT_NAME(StorageDownloadTask) +@interface FIRStorageDownloadTask : FIRStorageObservableTask + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageListResult.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageListResult.h new file mode 100644 index 00000000..0207c51c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageListResult.h @@ -0,0 +1,53 @@ +/* + * Copyright 2019 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRStorageReference; + +NS_ASSUME_NONNULL_BEGIN + +/** Contains the prefixes and items returned by a `StorageReference.list()` call. */ +NS_SWIFT_NAME(StorageListResult) +@interface FIRStorageListResult : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** + * The prefixes (folders) returned by the `list()` operation. + * + * @return A list of prefixes (folders). + */ +@property(nonatomic, readonly) NSArray *prefixes; + +/** + * The items (files) returned by the `list()` operation. + * + * @return A list of items (files). + */ +@property(nonatomic, readonly) NSArray *items; + +/** + * Returns a token that can be used to resume a previous `list()` operation. `nil` + * indicates that there are no more results. + * + * @return A page token if more results are available. + */ +@property(nonatomic, readonly, nullable) NSString *pageToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageMetadata.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageMetadata.h new file mode 100644 index 00000000..3749504e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageMetadata.h @@ -0,0 +1,140 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class FIRStorageReference; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Class which represents the metadata on an object in Firebase Storage. This metadata is + * returned on successful operations, and can be used to retrieve download URLs, content types, + * and a FIRStorage reference to the object in question. Full documentation can be found at the GCS + * Objects#resource docs. + * @see https://cloud.google.com/storage/docs/json_api/v1/objects#resource + */ +NS_SWIFT_NAME(StorageMetadata) +@interface FIRStorageMetadata : NSObject + +/** + * The name of the bucket containing this object. + */ +@property(copy, nonatomic, readonly) NSString *bucket; + +/** + * Cache-Control directive for the object data. + */ +@property(copy, nonatomic, nullable) NSString *cacheControl; + +/** + * Content-Disposition of the object data. + */ +@property(copy, nonatomic, nullable) NSString *contentDisposition; + +/** + * Content-Encoding of the object data. + */ +@property(copy, nonatomic, nullable) NSString *contentEncoding; + +/** + * Content-Language of the object data. + */ +@property(copy, nonatomic, nullable) NSString *contentLanguage; + +/** + * Content-Type of the object data. + */ +@property(copy, nonatomic, nullable) NSString *contentType; + +/** + * MD5 hash of the data; encoded using base64. + */ +@property(copy, nonatomic, nullable, readonly) NSString *md5Hash; + +/** + * The content generation of this object. Used for object versioning. + */ +@property(readonly) int64_t generation; + +/** + * User-provided metadata, in key/value pairs. + */ +@property(copy, nonatomic, nullable) NSDictionary *customMetadata; + +/** + * The version of the metadata for this object at this generation. Used + * for preconditions and for detecting changes in metadata. A metageneration number is only + * meaningful in the context of a particular generation of a particular object. + */ +@property(readonly) int64_t metageneration; + +/** + * The name of this object, in gs://bucket/path/to/object.txt, this is object.txt. + */ +@property(copy, nonatomic, readonly, nullable) NSString *name; + +/** + * The full path of this object, in gs://bucket/path/to/object.txt, this is path/to/object.txt. + */ +@property(copy, nonatomic, readonly, nullable) NSString *path; + +/** + * Content-Length of the data in bytes. + */ +@property(readonly) int64_t size; + +/** + * The creation time of the object in RFC 3339 format. + */ +@property(copy, nonatomic, readonly, nullable) NSDate *timeCreated; + +/** + * The modification time of the object metadata in RFC 3339 format. + */ +@property(copy, nonatomic, readonly, nullable) NSDate *updated; + +/** + * A reference to the object in Firebase Storage. + */ +@property(strong, nonatomic, readonly, nullable) FIRStorageReference *storageReference; + +/** + * Creates an instance of FIRStorageMetadata from the contents of a dictionary. + * @return An instance of FIRStorageMetadata that represents the contents of a dictionary. + */ +- (nullable instancetype)initWithDictionary:(NSDictionary *)dictionary + NS_DESIGNATED_INITIALIZER; + +/** + * Creates an NSDictionary from the contents of the metadata. + * @return An NSDictionary that represents the contents of the metadata. + */ +- (NSDictionary *)dictionaryRepresentation; + +/** + * Determines if the current metadata represents a "file". + */ +@property(readonly, getter=isFile) BOOL file; + +/** + * Determines if the current metadata represents a "folder". + */ +@property(readonly, getter=isFolder) BOOL folder; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageObservableTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageObservableTask.h new file mode 100644 index 00000000..d8ad401c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageObservableTask.h @@ -0,0 +1,62 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRStorageTask.h" + +NS_ASSUME_NONNULL_BEGIN + +@class FIRStorageReference; +@class FIRStorageTaskSnapshot; + +/** + * Extends FIRStorageTask to provide observable semantics such as adding and removing observers. + * Observers produce a FIRStorageHandle, which is used to keep track of and remove specific + * observers at a later date. + * This class is currently not thread safe and can only be called on the main thread. + */ +NS_SWIFT_NAME(StorageObservableTask) +@interface FIRStorageObservableTask : FIRStorageTask + +/** + * Observes changes in the upload status: Resume, Pause, Progress, Success, and Failure. + * @param status The FIRStorageTaskStatus change to observe. + * @param handler A callback that fires every time the status event occurs, + * returns a FIRStorageTaskSnapshot containing the state of the task. + * @return A task handle that can be used to remove the observer at a later date. + */ +- (FIRStorageHandle)observeStatus:(FIRStorageTaskStatus)status + handler:(void (^)(FIRStorageTaskSnapshot *snapshot))handler; + +/** + * Removes the single observer with the provided handle. + * @param handle The handle of the task to remove. + */ +- (void)removeObserverWithHandle:(FIRStorageHandle)handle; + +/** + * Removes all observers for a single status. + * @param status A FIRStorageTaskStatus to remove listeners for. + */ +- (void)removeAllObserversForStatus:(FIRStorageTaskStatus)status; + +/** + * Removes all observers. + */ +- (void)removeAllObservers; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageReference.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageReference.h new file mode 100644 index 00000000..94b1c89c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageReference.h @@ -0,0 +1,313 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRStorage.h" +#import "FIRStorageConstants.h" +#import "FIRStorageDownloadTask.h" +#import "FIRStorageListResult.h" +#import "FIRStorageMetadata.h" +#import "FIRStorageTask.h" +#import "FIRStorageUploadTask.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * FIRStorageReference represents a reference to a Google Cloud Storage object. Developers can + * upload and download objects, as well as get/set object metadata, and delete an object at the + * path. + * @see https://cloud.google.com/storage/ + */ +NS_SWIFT_NAME(StorageReference) +@interface FIRStorageReference : NSObject + +/** + * The FIRStorage service object which created this reference. + */ +@property(nonatomic, readonly) FIRStorage *storage; + +/** + * The name of the Google Cloud Storage bucket associated with this reference, + * in gs://bucket/path/to/object.txt, the bucket would be: 'bucket' + */ +@property(nonatomic, readonly) NSString *bucket; + +/** + * The full path to this object, not including the Google Cloud Storage bucket. + * In gs://bucket/path/to/object.txt, the full path would be: 'path/to/object.txt' + */ +@property(nonatomic, readonly) NSString *fullPath; + +/** + * The short name of the object associated with this reference, + * in gs://bucket/path/to/object.txt, the name of the object would be: 'object.txt' + */ +@property(nonatomic, readonly) NSString *name; + +#pragma mark - Path Operations + +/** + * Creates a new FIRStorageReference pointing to the root object. + * @return A new FIRStorageReference pointing to the root object. + */ +- (FIRStorageReference *)root; + +/** + * Creates a new FIRStorageReference pointing to the parent of the current reference + * or nil if this instance references the root location. + * For example: + * path = foo/bar/baz parent = foo/bar + * path = foo parent = (root) + * path = (root) parent = nil + * @return A new FIRStorageReference pointing to the parent of the current reference. + */ +- (nullable FIRStorageReference *)parent; + +/** + * Creates a new FIRStorageReference pointing to a child object of the current reference. + * path = foo child = bar newPath = foo/bar + * path = foo/bar child = baz newPath = foo/bar/baz + * All leading and trailing slashes will be removed, and consecutive slashes will be + * compressed to single slashes. For example: + * child = /foo/bar newPath = foo/bar + * child = foo/bar/ newPath = foo/bar + * child = foo///bar newPath = foo/bar + * @param path Path to append to the current path. + * @return A new FIRStorageReference pointing to a child location of the current reference. + */ +- (FIRStorageReference *)child:(NSString *)path; + +#pragma mark - Uploads + +/** + * Asynchronously uploads data to the currently specified FIRStorageReference, + * without additional metadata. + * This is not recommended for large files, and one should instead upload a file from disk. + * @param uploadData The NSData to upload. + * @return An instance of FIRStorageUploadTask, which can be used to monitor or manage the upload. + */ +- (FIRStorageUploadTask *)putData:(NSData *)uploadData NS_SWIFT_NAME(putData(_:)); + +/** + * Asynchronously uploads data to the currently specified FIRStorageReference. + * This is not recommended for large files, and one should instead upload a file from disk. + * @param uploadData The NSData to upload. + * @param metadata FIRStorageMetadata containing additional information (MIME type, etc.) + * about the object being uploaded. + * @return An instance of FIRStorageUploadTask, which can be used to monitor or manage the upload. + */ +// clang-format off +- (FIRStorageUploadTask *)putData:(NSData *)uploadData + metadata:(nullable FIRStorageMetadata *)metadata +NS_SWIFT_NAME(putData(_:metadata:)); +// clang-format on + +/** + * Asynchronously uploads data to the currently specified FIRStorageReference. + * This is not recommended for large files, and one should instead upload a file from disk. + * @param uploadData The NSData to upload. + * @param metadata FIRStorageMetadata containing additional information (MIME type, etc.) + * about the object being uploaded. + * @param completion A completion block that either returns the object metadata on success, + * or an error on failure. + * @return An instance of FIRStorageUploadTask, which can be used to monitor or manage the upload. + */ +// clang-format off +- (FIRStorageUploadTask *)putData:(NSData *)uploadData + metadata:(nullable FIRStorageMetadata *)metadata + completion:(nullable void (^)(FIRStorageMetadata *_Nullable metadata, + NSError *_Nullable error))completion + NS_SWIFT_NAME(putData(_:metadata:completion:)); +// clang-format on + +/** + * Asynchronously uploads a file to the currently specified FIRStorageReference, + * without additional metadata. + * @param fileURL A URL representing the system file path of the object to be uploaded. + * @return An instance of FIRStorageUploadTask, which can be used to monitor or manage the upload. + */ +- (FIRStorageUploadTask *)putFile:(NSURL *)fileURL NS_SWIFT_NAME(putFile(from:)); + +/** + * Asynchronously uploads a file to the currently specified FIRStorageReference. + * @param fileURL A URL representing the system file path of the object to be uploaded. + * @param metadata FIRStorageMetadata containing additional information (MIME type, etc.) + * about the object being uploaded. + * @return An instance of FIRStorageUploadTask, which can be used to monitor or manage the upload. + */ +// clang-format off +- (FIRStorageUploadTask *)putFile:(NSURL *)fileURL + metadata:(nullable FIRStorageMetadata *)metadata + NS_SWIFT_NAME(putFile(from:metadata:)); +// clang-format on + +/** + * Asynchronously uploads a file to the currently specified FIRStorageReference. + * @param fileURL A URL representing the system file path of the object to be uploaded. + * @param metadata FIRStorageMetadata containing additional information (MIME type, etc.) + * about the object being uploaded. + * @param completion A completion block that either returns the object metadata on success, + * or an error on failure. + * @return An instance of FIRStorageUploadTask, which can be used to monitor or manage the upload. + */ +// clang-format off +- (FIRStorageUploadTask *)putFile:(NSURL *)fileURL + metadata:(nullable FIRStorageMetadata *)metadata + completion:(nullable void (^)(FIRStorageMetadata *_Nullable metadata, + NSError *_Nullable error))completion + NS_SWIFT_NAME(putFile(from:metadata:completion:)); +// clang-format on + +#pragma mark - Downloads + +/** + * Asynchronously downloads the object at the FIRStorageReference to an NSData object in memory. + * An NSData of the provided max size will be allocated, so ensure that the device has enough free + * memory to complete the download. For downloading large files, writeToFile may be a better option. + * @param size The maximum size in bytes to download. If the download exceeds this size + * the task will be cancelled and an error will be returned. + * @param completion A completion block that either returns the object data on success, + * or an error on failure. + * @return An FIRStorageDownloadTask that can be used to monitor or manage the download. + */ +// clang-format off +- (FIRStorageDownloadTask *)dataWithMaxSize:(int64_t)size + completion:(void (^)(NSData *_Nullable data, + NSError *_Nullable error))completion + NS_SWIFT_NAME(getData(maxSize:completion:)); +// clang-format on + +/** + * Asynchronously retrieves a long lived download URL with a revokable token. + * This can be used to share the file with others, but can be revoked by a developer + * in the Firebase Console if desired. + * @param completion A completion block that either returns the URL on success, + * or an error on failure. + */ +- (void)downloadURLWithCompletion:(void (^)(NSURL *_Nullable URL, + NSError *_Nullable error))completion; + +/** + * Asynchronously downloads the object at the current path to a specified system filepath. + * @param fileURL A file system URL representing the path the object should be downloaded to. + * @return An FIRStorageDownloadTask that can be used to monitor or manage the download. + */ +- (FIRStorageDownloadTask *)writeToFile:(NSURL *)fileURL; + +/** + * Asynchronously downloads the object at the current path to a specified system filepath. + * @param fileURL A file system URL representing the path the object should be downloaded to. + * @param completion A completion block that fires when the file download completes. + * Returns an NSURL pointing to the file path of the downloaded file on success, + * or an error on failure. + * @return An FIRStorageDownloadTask that can be used to monitor or manage the download. + */ +- (FIRStorageDownloadTask *)writeToFile:(NSURL *)fileURL + completion:(nullable void (^)(NSURL *_Nullable URL, + NSError *_Nullable error))completion; +#pragma mark - List Support + +/** + * List all items (files) and prefixes (folders) under this StorageReference. + * + * This is a helper method for calling list() repeatedly until there are no more results. + * Consistency of the result is not guaranteed if objects are inserted or removed while this + * operation is executing. All results are buffered in memory. + * + * `listAll(completion:)` is only available for projects using Firebase Rules Version 2. + * + * @param completion A completion handler that will be invoked with all items and prefixes under + * the current StorageReference. + */ +- (void)listAllWithCompletion:(void (^)(FIRStorageListResult *result, + NSError *_Nullable error))completion; + +/** + * List up to `maxResults` items (files) and prefixes (folders) under this StorageReference. + * + * "/" is treated as a path delimiter. Firebase Storage does not support unsupported object + * paths that end with "/" or contain two consecutive "/"s. All invalid objects in GCS will be + * filtered. + * + * `list(maxResults:completion:)` is only available for projects using Firebase Rules Version 2. + * + * @param maxResults The maximum number of results to return in a single page. Must be greater + * than 0 and at most 1000. + * @param completion A completion handler that will be invoked with up to maxResults items and + * prefixes under the current StorageReference. + */ +- (void)listWithMaxResults:(int64_t)maxResults + completion: + (void (^)(FIRStorageListResult *result, NSError *_Nullable error))completion; + +/** + * Resumes a previous call to list(maxResults:completion:)`, starting after a pagination token. + * Returns the next set of items (files) and prefixes (folders) under this StorageReference. + * + * "/" is treated as a path delimiter. Firebase Storage does not support unsupported object + * paths that end with "/" or contain two consecutive "/"s. All invalid objects in GCS will be + * filtered. + * + * `list(maxResults:pageToken:completion:)`is only available for projects using Firebase Rules + * Version 2. + * + * @param maxResults The maximum number of results to return in a single page. Must be greater + * than 0 and at most 1000. + * @param pageToken A page token from a previous call to list. + * @param completion A completion handler that will be invoked with the next items and prefixes + * under the current StorageReference. + */ +- (void)listWithMaxResults:(int64_t)maxResults + pageToken:(NSString *)pageToken + completion: + (void (^)(FIRStorageListResult *result, NSError *_Nullable error))completion; + +#pragma mark - Metadata Operations + +/** + * Retrieves metadata associated with an object at the current path. + * @param completion A completion block which returns the object metadata on success, + * or an error on failure. + */ +- (void)metadataWithCompletion: + (void (^)(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error))completion + NS_SWIFT_NAME(getMetadata(completion:)); + +/** + * Updates the metadata associated with an object at the current path. + * @param metadata An FIRStorageMetadata object with the metadata to update. + * @param completion A completion block which returns the FIRStorageMetadata on success, + * or an error on failure. + */ +// clang-format off +- (void)updateMetadata:(FIRStorageMetadata *)metadata + completion:(nullable void (^)(FIRStorageMetadata *_Nullable metadata, + NSError *_Nullable error))completion +NS_SWIFT_NAME(updateMetadata(_:completion:)); +// clang-format on + +#pragma mark - Delete + +/** + * Deletes the object at the current path. + * @param completion A completion block which returns nil on success, or an error on failure. + */ +- (void)deleteWithCompletion:(nullable void (^)(NSError *_Nullable error))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageTask.h new file mode 100644 index 00000000..e889d5eb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageTask.h @@ -0,0 +1,75 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRStorageConstants.h" +#import "FIRStorageMetadata.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * A superclass to all FIRStorage*Tasks, including FIRStorageUploadTask + * and FIRStorageDownloadTask, to provide state transitions, event raising, and common storage + * or metadata and errors. + * Callbacks are always fired on the developer specified callback queue. + * If no queue is specified by the developer, it defaults to the main queue. + * Currently not thread safe, so only call methods on the main thread. + */ +NS_SWIFT_NAME(StorageTask) +@interface FIRStorageTask : NSObject + +/** + * An immutable view of the task and associated metadata, progress, error, etc. + */ +@property(strong, readonly, nonatomic, nonnull) FIRStorageTaskSnapshot *snapshot; + +@end + +/** + * Defines task operations such as pause, resume, cancel, and enqueue for all tasks. + * All tasks are required to implement enqueue, which begins the task, and may optionally + * implement pause, resume, and cancel, which operate on the task to pause, resume, and cancel + * operations. + */ +NS_SWIFT_NAME(StorageTaskManagement) +@protocol FIRStorageTaskManagement + +@required +/** + * Prepares a task and begins execution. + */ +- (void)enqueue; + +@optional +/** + * Pauses a task currently in progress. + */ +- (void)pause; + +/** + * Cancels a task currently in progress. + */ +- (void)cancel; + +/** + * Resumes a task that is paused. + */ +- (void)resume; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageTaskSnapshot.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageTaskSnapshot.h new file mode 100644 index 00000000..7d142024 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageTaskSnapshot.h @@ -0,0 +1,67 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRStorageConstants.h" + +NS_ASSUME_NONNULL_BEGIN + +@class FIRStorageMetadata; +@class FIRStorageReference; +@class FIRStorageTask; + +/** + * FIRStorageTaskSnapshot represents an immutable view of a task. + * A Snapshot contains a task, storage reference, metadata (if it exists), + * progress, and an error (if one occurred). + */ +NS_SWIFT_NAME(StorageTaskSnapshot) +@interface FIRStorageTaskSnapshot : NSObject + +/** + * Subclass of FIRStorageTask this snapshot represents. + */ +@property(readonly, copy, nonatomic) __kindof FIRStorageTask *task; + +/** + * Metadata returned by the task, or nil if no metadata returned. + */ +@property(readonly, copy, nonatomic, nullable) FIRStorageMetadata *metadata; + +/** + * FIRStorageReference this task is operates on. + */ +@property(readonly, copy, nonatomic) FIRStorageReference *reference; + +/** + * NSProgress object which tracks the progess of an upload or download. + */ +@property(readonly, strong, nonatomic, nullable) NSProgress *progress; + +/** + * Error during task execution, or nil if no error occurred. + */ +@property(readonly, copy, nonatomic, nullable) NSError *error; + +/** + * Status of the task. + */ +@property(readonly, nonatomic) FIRStorageTaskStatus status; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageUploadTask.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageUploadTask.h new file mode 100644 index 00000000..c7535002 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FIRStorageUploadTask.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import "FIRStorageObservableTask.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * FIRStorageUploadTask implements resumable uploads to a file in Firebase Storage. + * Uploads can be returned on completion with a completion callback, and can be monitored + * by attaching observers, or controlled by calling FIRStorageTask#pause, FIRStorageTask#resume, + * or FIRStorageTask#cancel. + * Uploads can take NSData in memory, or an NSURL to a file on disk. + * Uploads are performed on a background queue, and callbacks are raised on the developer + * specified callbackQueue in FIRStorage, or the main queue if left unspecified. + * Currently all uploads must be initiated and managed on the main queue. + */ +NS_SWIFT_NAME(StorageUploadTask) +@interface FIRStorageUploadTask : FIRStorageObservableTask + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FirebaseStorage.h b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FirebaseStorage.h new file mode 100644 index 00000000..be9ee240 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/FirebaseStorage/Sources/Public/FirebaseStorage.h @@ -0,0 +1,26 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRStorage.h" +#import "FIRStorageConstants.h" +#import "FIRStorageDownloadTask.h" +#import "FIRStorageListResult.h" +#import "FIRStorageMetadata.h" +#import "FIRStorageObservableTask.h" +#import "FIRStorageReference.h" +#import "FIRStorageTask.h" +#import "FIRStorageTaskSnapshot.h" +#import "FIRStorageUploadTask.h" diff --git a/MyExperiences copy/Pods/FirebaseStorage/Interop/Auth/Public/FIRAuthInterop.h b/MyExperiences copy/Pods/FirebaseStorage/Interop/Auth/Public/FIRAuthInterop.h new file mode 100644 index 00000000..a33da7c9 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/Interop/Auth/Public/FIRAuthInterop.h @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRAuthInterop_h +#define FIRAuthInterop_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FIRTokenCallback + @brief The type of block which gets called when a token is ready. + */ +typedef void (^FIRTokenCallback)(NSString *_Nullable token, NSError *_Nullable error) + NS_SWIFT_NAME(TokenCallback); + +/// Common methods for Auth interoperability. +NS_SWIFT_NAME(AuthInterop) +@protocol FIRAuthInterop + +/// Retrieves the Firebase authentication token, possibly refreshing it if it has expired. +- (void)getTokenForcingRefresh:(BOOL)forceRefresh withCallback:(FIRTokenCallback)callback; + +/// Get the current Auth user's UID. Returns nil if there is no user signed in. +- (nullable NSString *)getUserID; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRAuthInterop_h */ diff --git a/MyExperiences copy/Pods/FirebaseStorage/LICENSE b/MyExperiences copy/Pods/FirebaseStorage/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/FirebaseStorage/README.md b/MyExperiences copy/Pods/FirebaseStorage/README.md new file mode 100644 index 00000000..d778205f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseStorage/README.md @@ -0,0 +1,311 @@ +[![Version](https://img.shields.io/cocoapods/v/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) +[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase) + +[![Actions Status][gh-abtesting-badge]][gh-actions] +[![Actions Status][gh-auth-badge]][gh-actions] +[![Actions Status][gh-core-badge]][gh-actions] +[![Actions Status][gh-crashlytics-badge]][gh-actions] +[![Actions Status][gh-database-badge]][gh-actions] +[![Actions Status][gh-datatransport-badge]][gh-actions] +[![Actions Status][gh-dynamiclinks-badge]][gh-actions] +[![Actions Status][gh-firebasepod-badge]][gh-actions] +[![Actions Status][gh-firestore-badge]][gh-actions] +[![Actions Status][gh-functions-badge]][gh-actions] +[![Actions Status][gh-inappmessaging-badge]][gh-actions] +[![Actions Status][gh-interop-badge]][gh-actions] +[![Actions Status][gh-messaging-badge]][gh-actions] +[![Actions Status][gh-remoteconfig-badge]][gh-actions] +[![Actions Status][gh-storage-badge]][gh-actions] +[![Actions Status][gh-symbolcollision-badge]][gh-actions] +[![Actions Status][gh-zip-badge]][gh-actions] +[![Travis](https://travis-ci.org/firebase/firebase-ios-sdk.svg?branch=master)](https://travis-ci.org/firebase/firebase-ios-sdk) + +# Firebase Apple Open Source Development + +This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics, +FirebasePerformance, and FirebaseML. + +The repository also includes GoogleUtilities source. The +[GoogleUtilities](GoogleUtilities/README.md) pod is +a set of utilities used by Firebase and other Google products. + +Firebase is an app development platform with tools to help you build, grow and +monetize your app. More information about Firebase can be found at +[https://firebase.google.com](https://firebase.google.com). + +## Installation + +See the three subsections for details about three different installation methods. +1. [Standard pod install](README.md#standard-pod-install) +1. [Installing from the GitHub repo](README.md#installing-from-github) +1. [Experimental Carthage](README.md#carthage-ios-only) + +### Standard pod install + +Go to +[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup). + +### Installing from GitHub + +For releases starting with 5.0.0, the source for each release is also deployed +to CocoaPods master and available via standard +[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod). + +These instructions can be used to access the Firebase repo at other branches, +tags, or commits. + +#### Background + +See +[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod) +for instructions and options about overriding pod source locations. + +#### Accessing Firebase Source Snapshots + +All of the official releases are tagged in this repo and available via CocoaPods. To access a local +source snapshot or unreleased branch, use Podfile directives like the following: + +To access FirebaseFirestore via a branch: +``` +pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master' +``` + +To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do: + +``` +pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk' +pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk' +``` + +### Carthage (iOS only) + +Instructions for the experimental Carthage distribution are at +[Carthage](Carthage.md). + +### Rome + +Instructions for installing binary frameworks via +[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md). + +### Using Firebase from a Framework or a library + +[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md) + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + + * Xcode 10.3 (or later) + * CocoaPods 1.7.2 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self contained Xcode project. See +[Firestore/README.md](Firestore/README.md). + +### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +### Adding a New Firebase Pod + +See [AddNewPod.md](AddNewPod.md). + +### Managing Headers and Imports + +See [HeadersImports.md](HeadersImports.md). + +### Code Formatting + +To ensure that the code is formatted consistently, run the script +[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh) +before creating a PR. + +Travis will verify that any code changes are done in a style compliant way. Install +`clang-format` and `swiftformat`. +These commands will get the right versions: + +``` +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb +brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb +``` + +Note: if you already have a newer version of these installed you may need to +`brew switch` to this version. + +To update this section, find the versions of clang-format and swiftformat.rb to +match the versions in the CI failure logs +[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula). + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +#### Viewing Code Coverage (Deprecated) + +First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`. + +After running the `AllUnitTests_iOS` scheme in Xcode, execute +`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output` +at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results. + +### Running Sample Apps +In order to run the sample apps and integration tests, you'll need valid +`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist +files without real values, but can be replaced with real plist files. To get your own +`GoogleService-Info.plist` files: + +1. Go to the [Firebase Console](https://console.firebase.google.com/) +2. Create a new Firebase project, if you don't already have one +3. For each sample app you want to test, create a new Firebase app with the sample app's bundle +identifier (e.g. `com.google.Database-Example`) +4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file +(e.g. in [Example/Database/App/](Example/Database/App/)); + +Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require +special Apple capabilities, and you will have to change the sample app to use a unique bundle +identifier that you can control in your own Apple Developer account. + +## Specific Component Instructions +See the sections below for any special instructions for those components. + +### Firebase Auth + +If you're doing specific Firebase Auth development, see +[the Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to +`Example/Database/App/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[FIRStorageIntegrationTests.m](FirebaseStorage/Tests/Integration/FIRStorageIntegrationTests.m). + +#### Push Notifications + +Push notifications can only be delivered to specially provisioned App IDs in the developer portal. +In order to actually test receiving push notifications, you will need to: + +1. Change the bundle identifier of the sample app to something you own in your Apple Developer +account, and enable that App ID for push notifications. +2. You'll also need to +[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs) +at **Project Settings > Cloud Messaging > [Your Firebase App]**. +3. Ensure your iOS device is added to your Apple Developer portal as a test device. + +#### iOS Simulator + +The iOS Simulator cannot register for remote notifications, and will not receive push notifications. +In order to receive push notifications, you'll have to follow the steps above and run the app on a +physical device. + +## Community Supported Efforts + +We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are +very grateful! We'd like to empower as many developers as we can to be able to use Firebase and +participate in the Firebase community. + +### tvOS, macOS, watchOS and Catalyst +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on +tvOS, macOS, watchOS and Catalyst. + +For tvOS, checkout the [Sample](Example/tvOSSample). +For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the +[Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this +repository is actively developed primarily for iOS. While we can catch basic unit test issues with +Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you +encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the app +has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +To install, add a subset of the following to the Podfile: + +``` +pod 'Firebase/ABTesting' # No watchOS support yet +pod 'Firebase/Auth' # No watchOS support yet +pod 'Firebase/Crashlytics' # No watchOS support yet +pod 'Firebase/Database' # No watchOS support yet +pod 'Firebase/Firestore' # No watchOS support yet +pod 'Firebase/Functions' # No watchOS support yet +pod 'Firebase/Messaging' +pod 'Firebase/RemoteConfig' # No watchOS support yet +pod 'Firebase/Storage' +``` + +#### Additional Catalyst Notes + +* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability` +to Build Settings. +* FirebaseFirestore requires signing the +[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681). + +## Roadmap + +See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source +plans and directions. + +## Contributing + +See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase +iOS SDK. + +## License + +The contents of this repository is licensed under the +[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + +Your use of Firebase is governed by the +[Terms of Service for Firebase Services](https://firebase.google.com/terms/). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg +[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg +[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg +[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg +[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg +[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg +[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg +[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg +[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg +[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg +[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg +[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg +[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg +[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg +[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg +[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation.h new file mode 100644 index 00000000..13b1865d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation.h @@ -0,0 +1,103 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +@import Foundation; + +@class FIRAuth; +@class FIRUser; +@class FUIAuth; +@class UIViewController; + +NS_ASSUME_NONNULL_BEGIN + +/** @protocol FUIAccountSettingsOperationUIDelegate + @brief A delegate that provides UI methods for @c FUIAccountSettingsOperation. + */ +@protocol FUIAccountSettingsOperationUIDelegate + +/** @property auth + @brief The @c FIRAuth instance of the application. + */ +@property(nonatomic, strong, readonly) FIRAuth *auth; + +/** @property authUI + @brief The @c FUIAuth instance of the application. + */ +@property(nonatomic, strong, readonly) FUIAuth *authUI; + +/** @fn incrementActivity + @brief Increment the current activity count. If there's positive number of activities, display + and animate the activity indicator with a short period of delay. + @remarks Calls to @c incrementActivity and @c decrementActivity should be balanced. + */ +- (void)incrementActivity; + +/** @fn decrementActivity + @brief Decrement the current activity count. If the count reaches 0, stop and hide the + activity indicator. + @remarks Calls to @c incrementActivity and @c decrementActivity should be balanced. + */ +- (void)decrementActivity; + +/** @fn presentBaseController + @brief Called when initial Account Settings controller needs to be presented. + */ +- (void)presentBaseController; + +/** @fn presentViewController: + @brief Presents (pops) @c UIViewController from navigation stack. + */ +- (void)presentViewController:(UIViewController *)controller; + +/** @fn pushViewController: + @brief Adds (pushes) @c UIViewController to navigation stack. + */ +- (void)pushViewController:(UIViewController *)controller; + +/** @fn presentingController + @brief Provides access to presenting controller. + */ +- (UIViewController *)presentingController; + +@end + +/** @class FUIAccountSettingsOperation + @brief Handles logic for every specific user operation. + */ +@interface FUIAccountSettingsOperation : NSObject + +/** @fn executeOperationWithDelegate:showDialog: + @brief Creates new instance of @c FUIAccountSettingsOperation and executes logic + associated with it. + @param delegate UI delegate which handles all UI related logic. + @param showDialog Determines if operation specific UI should be started with confirmation + dialog. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog; + +/** @fn executeOperationWithDelegate: + @brief Creates new instance of @c FUIAccountSettingsOperation and executes logic + associated with it. New flow is started with new view. + @param delegate UI delegate which handles all UI related logic. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation.m new file mode 100644 index 00000000..e70f47dc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation.m @@ -0,0 +1,274 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperation_Internal.h" + +#import "FUIAccountSettingsOperationDeleteAccount.h" +#import "FUIAccountSettingsOperationForgotPassword.h" +#import "FUIAccountSettingsOperationSignOut.h" +#import "FUIAccountSettingsOperationUnlinkAccount.h" +#import "FUIAccountSettingsOperationUpdateEmail.h" +#import "FUIAccountSettingsOperationUpdateName.h" +#import "FUIAccountSettingsOperationUpdatePassword.h" +#import "FUIAuthBaseViewController_Internal.h" +#import "FUIAuthErrorUtils.h" +#import "FUIAuth_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FUIAccountSettingsOperation + ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog { + FUIAccountSettingsOperation *operation = [[self alloc] initWithDelegate:delegate]; + [operation execute:showDialog]; + return operation; +} + ++ (instancetype)executeOperationWithDelegate:(id)delegate { + FUIAccountSettingsOperation *operation = [[self alloc] initWithDelegate:delegate]; + [operation execute:NO]; + return operation; +} + +- (instancetype)initWithDelegate:(id)operationDelegate { + if (self = [super init]) { + _delegate = operationDelegate; + } + return self; +} + +- (void)execute:(BOOL)showDialog { + NSAssert(NO, @"Expected execute: to be overwritten by subclass"); +} + +- (FUIAccountSettingsOperationType)operationType { + NSAssert(NO, @"Expected execute: to be overwritten by subclass"); + return FUIAccountSettingsOperationTypeUnsupported; +} + +#pragma mark - protected methods + +- (void)finishOperationWithError:(nullable NSError *)error { + if (error) { + switch (error.code) { + case FIRAuthErrorCodeEmailAlreadyInUse: + [self showAlertWithMessage:FUILocalizedString(kStr_EmailAlreadyInUseError)]; + break; + case FIRAuthErrorCodeInvalidEmail: + [self showAlertWithMessage:FUILocalizedString(kStr_InvalidEmailError)]; + break; + case FIRAuthErrorCodeWeakPassword: + [self showAlertWithMessage:FUILocalizedString(kStr_WeakPasswordError)]; + break; + case FIRAuthErrorCodeTooManyRequests: + [self showAlertWithMessage:FUILocalizedString(kStr_SignUpTooManyTimesError)]; + break; + case FIRAuthErrorCodeWrongPassword: + [self showAlertWithMessage:FUILocalizedString(kStr_WrongPasswordError)]; + break; + case FIRAuthErrorCodeUserNotFound: + [self showAlertWithMessage:FUILocalizedString(kStr_UserNotFoundError)]; + break; + case FIRAuthErrorCodeUserDisabled: + [self showAlertWithMessage:FUILocalizedString(kStr_AccountDisabledError)]; + break; + case FUIAuthErrorCodeCantFindProvider: { + NSString *message = [NSString stringWithFormat:FUILocalizedString(kStr_CantFindProvider), + error.userInfo[FUIAuthErrorUserInfoProviderIDKey]]; + [self showAlertWithMessage:message]; + break; + } + case FIRAuthErrorCodeUserMismatch: + [self showAlertWithMessage:FUILocalizedString(kStr_EmailsDontMatch)]; + break; + } + } + + [self.delegate.authUI invokeOperationCallback:[self operationType] error:error]; +} + +- (void)showSelectProviderDialogWithAlertTitle:(nullable NSString *)title + alertMessage:(nullable NSString *)message + alertCloseButton:(nullable NSString *)closeActionTitle + providerHandler:(nullable FUIAccountSettingsChooseProviderHandler) + handler; { + UIAlertController *alert = + [UIAlertController alertControllerWithTitle:title + message:message + preferredStyle:UIAlertControllerStyleAlert]; + for (id provider in self.delegate.auth.currentUser.providerData) { + NSString *providerTitle = + [NSString stringWithFormat:FUILocalizedString(kStr_SignInWithProvider), + [FUIAuthBaseViewController providerLocalizedName:provider.providerID]]; + UIAlertAction* action = [UIAlertAction actionWithTitle:providerTitle + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *_Nonnull action) { + if (handler) { + handler(provider); + } + }]; + [alert addAction:action]; + } + UIAlertAction* closeButton = [UIAlertAction actionWithTitle:closeActionTitle + style:UIAlertActionStyleCancel + handler:nil]; + [alert addAction:closeButton]; + [self.delegate presentViewController:alert]; +} + +- (void)showAlertWithMessage:(NSString *)message { + UIAlertController *alertController = + [UIAlertController alertControllerWithTitle:nil + message:message + preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:FUILocalizedString(kStr_OK) + style:UIAlertActionStyleDefault + handler:nil]; + [alertController addAction:okAction]; + [self.delegate presentViewController:alertController]; +} + +- (void)reauthenticateWithProvider:(NSString *)providerID + actionHandler:(nullable FUIAccountSettingsReauthenticateHandler)handler { + + id providerUI; + for (id authProvider in self.delegate.authUI.providers) { + if ([providerID isEqualToString:authProvider.providerID]) { + providerUI = authProvider; + break; + } + } + + if (!providerUI) { + NSError *error = [FUIAuthErrorUtils errorWithCode:FUIAuthErrorCodeCantFindProvider + userInfo:@{ + FUIAuthErrorUserInfoProviderIDKey : providerID + }]; + [self finishOperationWithError:error]; + return; + } + + [self.delegate incrementActivity]; + // Sign out first to make sure sign in starts with a clean state. + [providerUI signOut]; + [providerUI signInWithDefaultValue:self.delegate.auth.currentUser.email + presentingViewController:[self.delegate presentingController] + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error, + _Nullable FIRAuthResultCallback result, + NSDictionary *_Nullable userInfo) { + if (error) { + [self.delegate decrementActivity]; + [self finishOperationWithError:error]; + if (result) { + result(nil, error); + } + return; + } + [self.delegate.auth.currentUser + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable reauthError) { + [self.delegate decrementActivity]; + if (result) { + result(self.delegate.auth.currentUser, reauthError); + } + if (error) { + [self finishOperationWithError:error]; + } else { + if (handler) { + handler(); + [self finishOperationWithError:error]; + } + } + }]; + }]; +} + +- (void)reauthenticateWithPassword:(NSString *)password + actionHandler:(nullable FUIAccountSettingsReauthenticateHandler)handler { + if (password.length <= 0) { + [self showAlertWithMessage:FUILocalizedString(kStr_InvalidPasswordError)]; + return; + } + + [self.delegate incrementActivity]; + + if (self.delegate.auth.currentUser.email == nil) { + NSLog(@"FirebaseUI: Expected nonnull email during email/password reauthentication"); + return; + } + [self.delegate.auth signInWithEmail:self.delegate.auth.currentUser.email + password:password + completion:^(FIRAuthDataResult *authResult, NSError *error) { + [self.delegate decrementActivity]; + + [self finishOperationWithError:error]; + if (!error && handler) { + handler(); + } + }]; +} + +- (void)showVerifyDialogWithMessage:(NSString *)message + providerHandler:(nullable FUIAccountSettingsReauthenticateHandler)handler { + [self showSelectProviderDialogWithAlertTitle:FUILocalizedString(kStr_VerifyItsYou) + alertMessage:message + alertCloseButton:FUILocalizedString(kStr_Cancel) + providerHandler:^(id provider) { + if (![provider.providerID isEqualToString:FIREmailAuthProviderID]) { + [self reauthenticateWithProvider:provider.providerID actionHandler:handler]; + } else { + [self showVerifyPasswordViewWithMessage:message providerHandler:handler]; + } + }]; +} + +- (void)showVerifyPasswordViewWithMessage:(NSString *)message + providerHandler:(nullable FUIAccountSettingsReauthenticateHandler) + handler { + __block FUIStaticContentTableViewCell *passwordCell = + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_Password) + value:nil + placeholder:FUILocalizedString(kStr_PlaceholderEnterPassword) + type:FUIStaticContentTableViewCellTypePassword + action:nil]; + FUIStaticContentTableViewContent *contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle:nil + cells:@[passwordCell]], + ]]; + + UIViewController *controller = + [[FUIStaticContentTableViewController alloc] initWithContents:contents + nextTitle:FUILocalizedString(kStr_Next) + nextAction:^{ + [self reauthenticateWithPassword:passwordCell.value actionHandler:handler]; + } + headerText:message + footerText: + FUILocalizedString(kStr_ForgotPassword) + footerAction:^{ + [FUIAccountSettingsOperationForgotPassword executeOperationWithDelegate:self.delegate]; + }]; + controller.title = FUILocalizedString(kStr_VerifyItsYou); + [self.delegate pushViewController:controller]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationDeleteAccount.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationDeleteAccount.h new file mode 100644 index 00000000..15b75caf --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationDeleteAccount.h @@ -0,0 +1,36 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAccountSettingsOperationDeleteAccount + @brief Handles logic of account deletion operation. + */ +@interface FUIAccountSettingsOperationDeleteAccount : FUIAccountSettingsOperation + +/** @fn executeOperationWithDelegate: + @brief Instead use @c executeOperationWithDelegate:showDialog: + @param delegate UI delegate which handles all UI related logic. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationDeleteAccount.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationDeleteAccount.m new file mode 100644 index 00000000..07ae7cd7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationDeleteAccount.m @@ -0,0 +1,135 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperationDeleteAccount.h" + +#import "FUIAccountSettingsOperation_Internal.h" +#import "FUIAccountSettingsOperationForgotPassword.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FUIAccountSettingsOperationDeleteAccount + +- (FUIAccountSettingsOperationType)operationType { + return FUIAccountSettingsOperationTypeDeleteAccount; +} + +- (void)execute:(BOOL)showDialog { + if (showDialog) { + [self showDeleteAccountDialog]; + } else { + [self showDeleteAccountViewWithPassword]; + } +} + +- (void)showDeleteAccountDialog { + [self showSelectProviderDialogWithAlertTitle: + FUILocalizedString(kStr_DeleteAccountConfirmationTitle) + alertMessage:FUILocalizedString(kStr_DeleteAccountBody) + alertCloseButton:FUILocalizedString(kStr_Cancel) + providerHandler:^(id provider) { + if (![provider.providerID isEqualToString:FIREmailAuthProviderID]) { + [self reauthenticateWithProvider:provider.providerID actionHandler:^{ + [self showDeleteAccountView]; + }]; + } else { + [self showDeleteAccountViewWithPassword]; + } + }]; +} + +- (void)showDeleteAccountViewWithPassword { + __block FUIStaticContentTableViewCell *passwordCell = + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_Password) + value:nil + placeholder:FUILocalizedString(kStr_PlaceholderEnterPassword) + type:FUIStaticContentTableViewCellTypePassword + action:nil]; + FUIStaticContentTableViewContent *contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle:nil cells:@[passwordCell]], + ]]; + + NSString *message = FUILocalizedString(kStr_DeleteAccountConfirmationMessage); + UIViewController *controller = + [[FUIStaticContentTableViewController alloc] + initWithContents:contents + nextTitle:FUILocalizedString(kStr_Delete) + nextAction:^{ [self deleteCurrentAccountWithPassword:passwordCell.value]; } + headerText:message + footerText:FUILocalizedString(kStr_ForgotPassword) + footerAction:^{ + [FUIAccountSettingsOperationForgotPassword executeOperationWithDelegate:self.delegate]; + }]; + controller.title = FUILocalizedString(kStr_DeleteAccountControllerTitle); + [self.delegate pushViewController:controller]; +} + +- (void)showDeleteAccountView { + NSString *message = FUILocalizedString(kStr_DeleteAccountConfirmationMessage); + UIViewController *controller = + [[FUIStaticContentTableViewController alloc] initWithContents:nil + nextTitle:FUILocalizedString(kStr_Delete) + nextAction:^{ + [self onDeleteAccountViewNextAction]; + } + headerText:message]; + controller.title = FUILocalizedString(kStr_DeleteAccountControllerTitle); + [self.delegate pushViewController:controller]; + +} + +- (void)onDeleteAccountViewNextAction { + UIAlertController *alertController = + [UIAlertController alertControllerWithTitle:FUILocalizedString(kStr_DeleteAccountConfirmationTitle) + message:FUILocalizedString(kStr_ActionCantBeUndone) + preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *deleteAction = + [UIAlertAction actionWithTitle:FUILocalizedString(kStr_DeleteAccountControllerTitle) + style:UIAlertActionStyleDestructive + handler:^(UIAlertAction *_Nonnull action) { + [self deleteCurrentAccount]; + }]; + UIAlertAction *action = + [UIAlertAction actionWithTitle:FUILocalizedString(kStr_Cancel) + style:UIAlertActionStyleCancel + handler:nil]; + [alertController addAction:deleteAction]; + [alertController addAction:action]; + [self.delegate presentViewController:alertController]; + +} + +- (void)deleteCurrentAccountWithPassword:(NSString *)password { + [self reauthenticateWithPassword:password actionHandler:^{ + [self deleteCurrentAccount]; + }]; +} + +- (void)deleteCurrentAccount { + [self.delegate incrementActivity]; + [self.delegate.auth.currentUser deleteWithCompletion:^(NSError *_Nullable error) { + [self.delegate decrementActivity]; + [self finishOperationWithError:error]; + if (!error) { + [self.delegate presentBaseController]; + } + }]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationForgotPassword.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationForgotPassword.h new file mode 100644 index 00000000..50143ffb --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationForgotPassword.h @@ -0,0 +1,37 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#import "FUIAccountSettingsOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAccountSettingsOperationForgotPassword + @brief Handles logic of 'forgot password' operation. + */ +@interface FUIAccountSettingsOperationForgotPassword : FUIAccountSettingsOperation + +/** @fn executeOperationWithDelegate:showDialog: + @brief Instead use @c executeOperationWithDelegate: + @param delegate UI delegate which handles all UI related logic. + @param showDialog Determines if operation specific UI should be started with confirmation + dialog. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationForgotPassword.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationForgotPassword.m new file mode 100644 index 00000000..4b829b85 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationForgotPassword.m @@ -0,0 +1,93 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperationForgotPassword.h" + +#import "FUIAccountSettingsOperation_Internal.h" +#import "FUIAuthBaseViewController_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FUIAccountSettingsOperationForgotPassword + +- (FUIAccountSettingsOperationType)operationType { + return FUIAccountSettingsOperationTypeForgotPassword; +} + +- (void)execute:(BOOL)showDialog { + [self onForgotPassword]; +} + +- (void)onForgotPassword { + __block FUIStaticContentTableViewCell *inputCell = + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_Email) + value:self.delegate.auth.currentUser.email + placeholder:FUILocalizedString(kStr_PlaceholderEnterEmail) + type:FUIStaticContentTableViewCellTypeInput + action:nil]; + FUIStaticContentTableViewContent *contents = + [FUIStaticContentTableViewContent + contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle:nil + cells:@[inputCell]], + ]]; + + UIViewController *controller = + [[FUIStaticContentTableViewController alloc] + initWithContents:contents + nextTitle:FUILocalizedString(kStr_Send) + nextAction:^{ [self onPasswordRecovery:inputCell.value]; } + headerText:FUILocalizedString(kStr_PasswordRecoveryMessage)]; + controller.title = FUILocalizedString(kStr_PasswordRecoveryTitle); + [self.delegate pushViewController:controller]; +} + +- (void)onPasswordRecovery:(NSString *)email { + if (![[FUIAuthBaseViewController class] isValidEmail:email]) { + [self showAlertWithMessage:FUILocalizedString(kStr_InvalidEmailError)]; + return; + } + + [self.delegate incrementActivity]; + + [self.delegate.auth sendPasswordResetWithEmail:email + completion:^(NSError *_Nullable error) { + [self.delegate decrementActivity]; + + if (error) { + [self finishOperationWithError:error]; + return; + } + + NSString *message = [NSString stringWithFormat: + FUILocalizedString(kStr_PasswordRecoveryEmailSentMessage), email]; + UIAlertController *alertController = + [UIAlertController alertControllerWithTitle:nil + message:message + preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:FUILocalizedString(kStr_OK) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *_Nonnull action) { + [self finishOperationWithError:error]; + }]; + [alertController addAction:okAction]; + [self.delegate presentViewController:alertController]; + }]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationSignOut.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationSignOut.h new file mode 100644 index 00000000..c059a3da --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationSignOut.h @@ -0,0 +1,37 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAccountSettingsOperationSignOut + @brief Handles logic of signing-out operation. + */ +@interface FUIAccountSettingsOperationSignOut : FUIAccountSettingsOperation + +/** @fn executeOperationWithDelegate:showDialog: + @brief Instead use @c executeOperationWithDelegate: + @param delegate UI delegate which handles all UI related logic. + @param showDialog Determines if operation specific UI should be started with confirmation + dialog. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog NS_UNAVAILABLE; +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationSignOut.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationSignOut.m new file mode 100644 index 00000000..9ab3bcf7 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationSignOut.m @@ -0,0 +1,45 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperationSignOut.h" + +#import "FUIAccountSettingsOperation_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FUIAccountSettingsOperationSignOut + +- (FUIAccountSettingsOperationType)operationType { + return FUIAccountSettingsOperationTypeSignOut; +} + +- (void)execute:(BOOL)showDialog { + [self signOut]; +} + +- (void)signOut{ + NSError *error; + [self.delegate.authUI signOutWithError:&error]; + [self finishOperationWithError:error]; + if (!error) { + [self.delegate presentBaseController]; + } + +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationType.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationType.h new file mode 100644 index 00000000..796d110f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationType.h @@ -0,0 +1,29 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** @typedef FUIAccountSettingsOperationType + @brief List of all possible Account management operations. + */ +typedef NS_ENUM(NSInteger, FUIAccountSettingsOperationType) { + FUIAccountSettingsOperationTypeUnsupported = 0, + FUIAccountSettingsOperationTypeUpdateName, + FUIAccountSettingsOperationTypeUpdatePassword, + FUIAccountSettingsOperationTypeForgotPassword, + FUIAccountSettingsOperationTypeUpdateEmail, + FUIAccountSettingsOperationTypeUnlinkAccount, + FUIAccountSettingsOperationTypeSignOut, + FUIAccountSettingsOperationTypeDeleteAccount, +}; diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUnlinkAccount.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUnlinkAccount.h new file mode 100644 index 00000000..cec0d253 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUnlinkAccount.h @@ -0,0 +1,61 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperation.h" + +@protocol FIRUserInfo; + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAccountSettingsOperationUnlinkAccount + @brief Handles logic of unlinking from 3P provider operation. + */ +@interface FUIAccountSettingsOperationUnlinkAccount : FUIAccountSettingsOperation + +/** @fn executeOperationWithDelegate:showDialog: + @brief Instead use @c executeOperationWithDelegate:showDialog:provider: + @param delegate UI delegate which handles all UI related logic. + @param showDialog Determines if operation specific UI should be started with confirmation + dialog. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog NS_UNAVAILABLE; + +/** @fn executeOperationWithDelegate: + @brief Instead use @c executeOperationWithDelegate:showDialog:provider: + @param delegate UI delegate which handles all UI related logic. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + NS_UNAVAILABLE; + +/** @fn executeOperationWithDelegate:showDialog:provider: + @brief Creates new instance of @c FUIAccountSettingsOperationUnlinkAccount and executes logic + associated with it. + @param delegate UI delegate which handles all UI related logic. + @param showDialog Determines if operation specific UI should be started with confirmation + dialog. + @param provider Instance of 3P provider retrieved from currently logged in @c FIRUser. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog + provider:(id)provider; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUnlinkAccount.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUnlinkAccount.m new file mode 100644 index 00000000..7539fd2e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUnlinkAccount.m @@ -0,0 +1,106 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperationUnlinkAccount.h" + +#import "FUIAccountSettingsOperation_Internal.h" +#import "FUIAuthBaseViewController_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FUIAccountSettingsOperationUnlinkAccount () +{ + id _provider; +} +@end + +@implementation FUIAccountSettingsOperationUnlinkAccount + ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog + provider:(id)provider { + FUIAccountSettingsOperationUnlinkAccount *operation = + [[self alloc] initWithDelegate:delegate provider:provider]; + [operation execute:showDialog]; + return operation; +} + +- (instancetype)initWithDelegate:(id)delegate + provider:(id) provider { + if (self = [super initWithDelegate:delegate]) { + _provider = provider; + } + return self; +} + +- (FUIAccountSettingsOperationType)operationType { + return FUIAccountSettingsOperationTypeUnlinkAccount; +} + +- (void)execute:(BOOL)showDialog { + __block FUIStaticContentTableViewCell *cell = + [FUIStaticContentTableViewCell cellWithTitle: + [FUIAuthBaseViewController providerLocalizedName:_provider.providerID] + value:_provider.displayName + type:FUIStaticContentTableViewCellTypeDefault + action:nil]; + FUIStaticContentTableViewContent *contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle:nil + cells:@[cell]], + ]]; + + UIViewController *controller = + [[FUIStaticContentTableViewController alloc] initWithContents:contents + nextTitle: + FUILocalizedString(kStr_UnlinkAction) + nextAction:^{ + [self showUnlinkConfirmationDialog]; + }]; + controller.title = FUILocalizedString(kStr_UnlinkTitle); + [self.delegate pushViewController:controller]; +} + +- (void)showUnlinkConfirmationDialog { + UIAlertController *alertController = + [UIAlertController alertControllerWithTitle:FUILocalizedString(kStr_UnlinkConfirmationTitle) + message:FUILocalizedString(kStr_UnlinkConfirmationMessage) + preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *action = + [UIAlertAction actionWithTitle:FUILocalizedString(kStr_UnlinkConfirmationActionTitle) + style:UIAlertActionStyleDestructive + handler:^(UIAlertAction *_Nonnull action) { [self unlinkAcount]; }]; + [alertController addAction:action]; + UIAlertAction *cancelAction = + [UIAlertAction actionWithTitle:FUILocalizedString(kStr_Cancel) + style:UIAlertActionStyleCancel + handler:nil]; + [alertController addAction:cancelAction]; + [self.delegate presentViewController:alertController]; +} + +- (void)unlinkAcount { + [self.delegate.auth.currentUser unlinkFromProvider:_provider.providerID + completion:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + [self finishOperationWithError:error]; + [self.delegate presentBaseController]; + }]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateEmail.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateEmail.h new file mode 100644 index 00000000..67c55776 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateEmail.h @@ -0,0 +1,38 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAccountSettingsOperationUpdateEmail + @brief Handles logic of updating email operation. + */ +@interface FUIAccountSettingsOperationUpdateEmail : FUIAccountSettingsOperation + +/** @fn executeOperationWithDelegate:showDialog: + @brief Instead use @c executeOperationWithDelegate: + @param delegate UI delegate which handles all UI related logic. + @param showDialog Determines if operation specific UI should be started with confirmation + dialog. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateEmail.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateEmail.m new file mode 100644 index 00000000..989ee2ca --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateEmail.m @@ -0,0 +1,92 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperationUpdateEmail.h" + +#import "FUIAccountSettingsOperation_Internal.h" +#import "FUIAuthBaseViewController_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FUIAccountSettingsOperationUpdateEmail + +- (FUIAccountSettingsOperationType)operationType { + return FUIAccountSettingsOperationTypeUpdateEmail; +} + +- (void)execute:(BOOL)showDialog { + if (showDialog) { + [self showUpdateEmailDialog]; + } else { + [self showUpdateEmailView]; + } +} + +- (void)showUpdateEmailDialog { + NSString *message; + message = FUILocalizedString(kStr_UpdateEmailAlertMessage); + [self showVerifyDialogWithMessage:message providerHandler:^{ [self showUpdateEmail]; }]; + +} + +- (void)showUpdateEmailView { + [self showVerifyPasswordViewWithMessage: + FUILocalizedString(kStr_UpdateEmailVerificationAlertMessage) + providerHandler:^{ [self showUpdateEmail]; }]; +} + +- (void)showUpdateEmail { + __block FUIStaticContentTableViewCell *cell = + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_Email) + value:self.delegate.auth.currentUser.email + placeholder:FUILocalizedString(kStr_PlaceholderEnterEmail) + type:FUIStaticContentTableViewCellTypeInput + action:nil]; + FUIStaticContentTableViewContent *contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle:nil + cells:@[cell]], + ]]; + + UIViewController *controller = + [[FUIStaticContentTableViewController alloc] initWithContents:contents + nextTitle:FUILocalizedString(kStr_Save) + nextAction:^{ + [self updateEmailForCurrentUser:cell.value]; + }]; + controller.title = FUILocalizedString(kStr_EditEmailTitle); + [self.delegate pushViewController:controller]; + +} + +- (void)updateEmailForCurrentUser:(NSString *)email { + if (![[FUIAuthBaseViewController class] isValidEmail:email]) { + [self showAlertWithMessage:FUILocalizedString(kStr_InvalidEmailError)]; + } else { + [self.delegate incrementActivity]; + [self.delegate.auth.currentUser updateEmail:email completion:^(NSError *_Nullable error) { + [self.delegate decrementActivity]; + [self finishOperationWithError:error]; + if (!error) { + [self.delegate presentBaseController]; + } + }]; + } +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateName.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateName.h new file mode 100644 index 00000000..34bf8cf5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateName.h @@ -0,0 +1,36 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAccountSettingsOperationUpdateName + @brief Handles logic of updating name operation. + */ +@interface FUIAccountSettingsOperationUpdateName : FUIAccountSettingsOperation + +/** @fn executeOperationWithDelegate: + @brief Instead use @c executeOperationWithDelegate:showDialog: + @param delegate UI delegate which handles all UI related logic. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateName.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateName.m new file mode 100644 index 00000000..6daf83d3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdateName.m @@ -0,0 +1,65 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperationUpdateName.h" + +#import "FUIAccountSettingsOperation_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FUIAccountSettingsOperationUpdateName + +- (FUIAccountSettingsOperationType)operationType { + return FUIAccountSettingsOperationTypeUpdateName; +} + +- (void)execute:(BOOL)showDialog { + __block FUIStaticContentTableViewCell *cell = + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_Name) + value:self.delegate.auth.currentUser.displayName + placeholder:FUILocalizedString(kStr_PlaceholderEnterName) + type:FUIStaticContentTableViewCellTypeInput + action:nil]; + FUIStaticContentTableViewContent *contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle:nil + cells:@[cell]], + ]]; + + UIViewController *controller = + [[FUIStaticContentTableViewController alloc] initWithContents:contents + nextTitle:FUILocalizedString(kStr_Save) + nextAction:^{ + [self onUpdateName:cell.value]; + }]; + controller.title = FUILocalizedString(kStr_EditNameTitle); + [self.delegate pushViewController:controller]; +} + +- (void)onUpdateName:(NSString *)username { + [self.delegate incrementActivity]; + FIRUserProfileChangeRequest *request = [self.delegate.auth.currentUser profileChangeRequest]; + request.displayName = username; + [request commitChangesWithCompletion:^(NSError *_Nullable error) { + [self.delegate decrementActivity]; + [self finishOperationWithError:error]; + [self.delegate presentBaseController]; + }]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdatePassword.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdatePassword.h new file mode 100644 index 00000000..644d5cca --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdatePassword.h @@ -0,0 +1,59 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAccountSettingsOperationUpdatePassword + @brief Handles logic of updating password operation. + */ +@interface FUIAccountSettingsOperationUpdatePassword : FUIAccountSettingsOperation + +/** @fn executeOperationWithDelegate:showDialog: + @brief Instead use @c executeOperationWithDelegate:showDialog:newPassword: + @param delegate UI delegate which handles all UI related logic. + @param showDialog Determines if operation specific UI should be started with confirmation + dialog. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog NS_UNAVAILABLE; + +/** @fn executeOperationWithDelegate: + @brief Instead use @c executeOperationWithDelegate:showDialog:newPassword: + @param delegate UI delegate which handles all UI related logic. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + NS_UNAVAILABLE; + +/** @fn executeOperationWithDelegate:showDialog:newPassword: + @brief Creates new instance of @c FUIAccountSettingsOperationUnlinkAccount and executes logic + associated with it. + @param delegate UI delegate which handles all UI related logic. + @param showDialog Determines if operation specific UI should be started with confirmation + dialog. + @param newPassword Defines if this is add password (pass YES) or update password operation. + @return Instance of the executed operation. + */ ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog + newPassword:(BOOL)newPassword; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdatePassword.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdatePassword.m new file mode 100644 index 00000000..38beda77 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperationUpdatePassword.m @@ -0,0 +1,126 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperationUpdatePassword.h" + +#import "FUIAccountSettingsOperation_Internal.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FUIAccountSettingsOperationUpdatePassword () +{ + BOOL _newPassword; +} +@end + +@implementation FUIAccountSettingsOperationUpdatePassword + ++ (instancetype)executeOperationWithDelegate:(id)delegate + showDialog:(BOOL)showDialog + newPassword:(BOOL)newPassword { + FUIAccountSettingsOperationUpdatePassword *operation = + [[self alloc] initWithDelegate:delegate newPassword:newPassword]; + [operation execute:showDialog]; + return operation; +} + +- (instancetype)initWithDelegate:(id)delegate + newPassword:(BOOL)newPassword { + if (self = [super initWithDelegate:delegate]) { + _newPassword = newPassword; + } + return self; +} + +- (FUIAccountSettingsOperationType)operationType { + return FUIAccountSettingsOperationTypeUpdatePassword; +} + +- (void)execute:(BOOL)showDialog { + if (showDialog) { + [self showUpdatePasswordDialog:_newPassword]; + } else { + [self showUpdatePasswordView]; + } +} + +- (void)showUpdatePasswordDialog:(BOOL)newPassword { + NSString *message; + if (newPassword) { + message = FUILocalizedString(kStr_AddPasswordAlertMessage); + } else { + message = FUILocalizedString(kStr_EditPasswordAlertMessage); + } + + [self showVerifyDialogWithMessage:message + providerHandler:^{ [self showUpdatePassword:newPassword]; }]; + +} + +- (void)showUpdatePasswordView { + [self showVerifyPasswordViewWithMessage: + FUILocalizedString(kStr_ReauthenticateEditPasswordAlertMessage) + providerHandler:^{ [self showUpdatePassword:NO]; }]; +} + +- (void)showUpdatePassword:(BOOL)newPassword { + NSString *placeHolder = newPassword ? FUILocalizedString(kStr_PlaceholderChosePassword) : + FUILocalizedString(kStr_PlaceholderNewPassword); + __block FUIStaticContentTableViewCell *passwordCell = + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_Password) + value:nil + placeholder:placeHolder + type:FUIStaticContentTableViewCellTypePassword + action:nil]; + FUIStaticContentTableViewContent *contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle:nil + cells:@[passwordCell]], + ]]; + + UIViewController *controller = + [[FUIStaticContentTableViewController alloc] initWithContents:contents + nextTitle:FUILocalizedString(kStr_Save) + nextAction:^{ + [self updatePasswordForCurrentUser:passwordCell.value]; + }]; + if (newPassword) { + controller.title = FUILocalizedString(kStr_AddPasswordTitle); + } else { + controller.title = FUILocalizedString(kStr_EditPasswordTitle); + } + [self.delegate pushViewController:controller]; + +} + +- (void)updatePasswordForCurrentUser:(NSString *)password { + if (!password.length) { + [self showAlertWithMessage:FUILocalizedString(kStr_WeakPasswordError)]; + } else { + [self.delegate incrementActivity]; + [self.delegate.auth.currentUser updatePassword:password completion:^(NSError *_Nullable error) { + [self.delegate decrementActivity]; + [self finishOperationWithError:error]; + if (!error) { + [self.delegate presentBaseController]; + } + }]; + } +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation_Internal.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation_Internal.h new file mode 100644 index 00000000..fe42c86c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsOperation_Internal.h @@ -0,0 +1,109 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsOperation.h" + +#import + +#import "FUIAccountSettingsOperationType.h" +#import "FUIAuthStrings.h" +#import "FUIAuth_Internal.h" +#import "FUIStaticContentTableViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FUIAccountSettingsChooseProviderHandler + @brief The type of block invoked when a select provider dialog button is tapped. + */ +typedef void(^FUIAccountSettingsChooseProviderHandler)(id provider); + +/** @typedef FUIAccountSettingsReauthenticateHandler + @brief The type of block invoked when reathentication operation is finished. + */ +typedef void(^FUIAccountSettingsReauthenticateHandler)(void); + +/** Internal methods which are not exposed for public usage. */ +@interface FUIAccountSettingsOperation () + +/** @fn initWithDelegate: + @brief Creates new instance of @c FUIAccountSettingsOperation. + */ +- (instancetype)initWithDelegate:(id)delegate; + +/** @fn finishOperationWithError: + @brief Callback which is used for notification of operation result. + */ +- (void)finishOperationWithError:(nullable NSError *)error; + +/** @fn reauthenticateWithProvider:actionHandler: + @brief Reauthenticates currently logged-in user with specified 3P porviderID. + @param providerID The ID of third party provider. + @param handler Block which is called when user was re-authenticated. + */ +- (void)reauthenticateWithProvider:(NSString *)providerID + actionHandler:(nullable FUIAccountSettingsReauthenticateHandler)handler; + +/** @fn reauthenticateWithPassword:actionHandler: + @brief Reauthenticates currently logged-in user with 'password' auth provider. + @param password Value of the password used for re-authentication of currently loggen-in user. + @param handler Block which is called when user was re-authenticated. + */ +- (void)reauthenticateWithPassword:(NSString *)password + actionHandler:(nullable FUIAccountSettingsReauthenticateHandler)handler; + +/** @fn showSelectProviderDialogWithAlertTitle:alertMessage:alertCloseButton:providerHandler: + @brief Displays alert dialog with all available 3P providers. + @param title The title of the dialog + @param message The message displayed in the alert body. + @param closeActionTitle The title of the close button. + @param handler Block which is called when user selects any of 3P providers. + */ +- (void)showSelectProviderDialogWithAlertTitle:(nullable NSString *)title + alertMessage:(nullable NSString *)message + alertCloseButton:(nullable NSString *)closeActionTitle + providerHandler:(nullable FUIAccountSettingsChooseProviderHandler) + handler; + +/** @fn showVerifyDialogWithMessage:providerHandler: + @brief Displays alert dialog when user need to verify it's identity. + @param message The message displayed in the alert body. + @param handler Block which is called when user selects any of 3P providers. + */ +- (void)showVerifyDialogWithMessage:(NSString *)message + providerHandler:(nullable FUIAccountSettingsReauthenticateHandler)handler; + +/** @fn showVerifyPasswordViewWithMessage:providerHandler: + @brief Displays view with password input field when user need to verify it's identity. + @param message The message displayed in the alert body. + @param handler Block which is called when user selects any of 3P providers. + */ +- (void)showVerifyPasswordViewWithMessage:(NSString *)message + providerHandler:(nullable FUIAccountSettingsReauthenticateHandler)handler; + +/** @fn showAlertWithMessage:message: + @brief Displays alert view with with specified message and OK button. + @param message The message displayed in the alert body. + */ +- (void)showAlertWithMessage:(NSString *)message; + +/** @property delegate + @brief The operation UI delegate which handles all UI callbacks. + */ +@property(nonatomic, weak, readonly) id delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.h new file mode 100644 index 00000000..472ebb38 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.h @@ -0,0 +1,35 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthBaseViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAccountSettingsViewController + @brief Represents View Controller for Account Management UI. This controller should be embedded + in @c UINavigationController in order to present it's internal views. + */ +@interface FUIAccountSettingsViewController : FUIAuthBaseViewController + +/** @property deleteAccountActionDisabled + @brief Whether to hide "Delete account" button, defaults to NO. + */ +@property(nonatomic, assign, getter=isDeleteAccountActionDisabled) + BOOL deleteAccountActionDisabled; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.m new file mode 100644 index 00000000..d17aae9b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.m @@ -0,0 +1,431 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAccountSettingsViewController.h" + +#import + +#import "FUIAccountSettingsOperation.h" +#import "FUIAccountSettingsOperationDeleteAccount.h" +#import "FUIAccountSettingsOperationForgotPassword.h" +#import "FUIAccountSettingsOperationSignOut.h" +#import "FUIAccountSettingsOperationUnlinkAccount.h" +#import "FUIAccountSettingsOperationUpdateEmail.h" +#import "FUIAccountSettingsOperationUpdateName.h" +#import "FUIAccountSettingsOperationUpdatePassword.h" +#import "FUIAuthBaseViewController_Internal.h" +#import "FUIAuthStrings.h" +#import "FUIStaticContentTableViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var FUIASAccountState + @brief Defines all possible states of current loogged-in @c FIRUser. + */ +typedef NS_ENUM(NSInteger, FUIASAccountState) { + FUIASAccountStateUnknown = 0, + FUIASAccountStateEmailPassword, + FUIASAccountStateLinkedAccountWithEmail, + FUIASAccountStateLinkedAccountWithoutEmail, + FUIASAccountStateLinkedAccountWithEmailPassword +}; + +/** @var kUserAccountImage + @brief Name of icon to show default user account. + */ +static NSString *const kUserAccountImage = @"ic_account_circle.png"; + +@interface FUIAccountSettingsViewController () +@end + +@implementation FUIAccountSettingsViewController { + __weak UITableView *_tableView; + FUIStaticContentTableViewManager *_tableViewManager; + FUIASAccountState _accountState; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + _tableViewManager = [[FUIStaticContentTableViewManager alloc] init]; + _tableViewManager.tableView = _tableView; + _tableView.dataSource = _tableViewManager; + _tableView.delegate = _tableViewManager; + [self updateUI]; +} + +#pragma mark - Helpers + +- (FUIASAccountState)accountState { + NSArray> *providers = self.auth.currentUser.providerData; + if (!providers || providers.count == 0) { + return FUIASAccountStateUnknown; + } + + BOOL hasPasswordProvider = NO; + BOOL hasEmailInLinkedProvider = NO; + + for (id userInfo in providers) { + if (userInfo.email.length > 0 && + ![userInfo.providerID isEqualToString:FIREmailAuthProviderID]) { + hasEmailInLinkedProvider = YES; + } + + if ([userInfo.providerID isEqualToString:FIREmailAuthProviderID]) { + hasPasswordProvider = YES; + } + } + + if (providers.count == 1 && hasPasswordProvider) { + return FUIASAccountStateEmailPassword; + } else if (!hasPasswordProvider && !hasEmailInLinkedProvider) { + return FUIASAccountStateLinkedAccountWithoutEmail; + } else if (!hasPasswordProvider && hasEmailInLinkedProvider) { + return FUIASAccountStateLinkedAccountWithEmail; + } else if (hasPasswordProvider && hasEmailInLinkedProvider) { + return FUIASAccountStateLinkedAccountWithEmailPassword; + } else if (hasPasswordProvider && !hasEmailInLinkedProvider) { + return FUIASAccountStateLinkedAccountWithEmailPassword; + } + + return FUIASAccountStateUnknown; +} + +- (void)populateTableHeader { + + if (!self.auth.currentUser) { + _tableViewManager.tableView.tableHeaderView = nil; + return; + } + + CGFloat profileHeight = 60; + UIImageView *headerImage = + [[UIImageView alloc] initWithImage:[UIImage imageNamed:kUserAccountImage]]; + headerImage.layer.cornerRadius = profileHeight / 2; + headerImage.clipsToBounds = YES; + UIView *wrapper = [[UIView alloc] init]; + [wrapper addSubview:headerImage]; + headerImage.translatesAutoresizingMaskIntoConstraints = NO; + [headerImage addConstraint: + [NSLayoutConstraint constraintWithItem:headerImage + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 + constant:profileHeight]]; + [headerImage addConstraint: + [NSLayoutConstraint constraintWithItem:headerImage + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 + constant:profileHeight]]; + [wrapper addConstraint: + [NSLayoutConstraint constraintWithItem:headerImage + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:wrapper + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0]]; + [wrapper addConstraint: + [NSLayoutConstraint constraintWithItem:headerImage + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:wrapper + attribute:NSLayoutAttributeCenterY + multiplier:1 + constant:0]]; + + _tableViewManager.tableView.tableHeaderView = wrapper; + CGRect frame = _tableViewManager.tableView.tableHeaderView.frame; + frame.size.height = 90; + _tableViewManager.tableView.tableHeaderView.frame = frame; + + NSURL *photoURL = self.auth.currentUser.photoURL; + if (photoURL) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + NSData *imageData = [NSData dataWithContentsOfURL:photoURL]; + UIImage *image = [UIImage imageWithData:imageData]; + dispatch_async(dispatch_get_main_queue(), ^{ + headerImage.image = image; + }); + }); + + } +} + +- (void)updateTable { + switch (_accountState) { + case FUIASAccountStateEmailPassword: + [self updateTableStateEmailPassword]; + break; + case FUIASAccountStateLinkedAccountWithEmail: + [self updateTableStateLinkedAccountWithEmail]; + break; + case FUIASAccountStateLinkedAccountWithoutEmail: + [self updateTableStateLinkedAccountWithoutEmail]; + break; + case FUIASAccountStateLinkedAccountWithEmailPassword: + [self updateTableStateLinkedAccountWithEmailPassword]; + break; + + default: + _tableViewManager.contents = nil; + break; + } +} + +- (void)updateTableStateEmailPassword { + _tableViewManager.contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleProfile) + cells:@[ + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellName) + value:self.auth.currentUser.displayName + action:^{ + [FUIAccountSettingsOperationUpdateName executeOperationWithDelegate:self showDialog:NO]; + }], + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellEmail) + value:self.auth.currentUser.email + action:^{ + [FUIAccountSettingsOperationUpdateEmail executeOperationWithDelegate:self]; + }] + ]], + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleSecurity) + cells:@[ + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellChangePassword) + action:^{ + [FUIAccountSettingsOperationUpdatePassword executeOperationWithDelegate:self + showDialog:YES + newPassword:NO]; + }] + ]], + [self createActionsSection] + ]]; +} + +- (void)updateTableStateLinkedAccountWithoutEmail { + NSMutableArray *linkedAccounts = + [[NSMutableArray alloc] initWithCapacity:self.auth.currentUser.providerData.count]; + for (id userInfo in self.auth.currentUser.providerData) { + if ([userInfo.providerID isEqualToString:FIREmailAuthProviderID]) { + continue; + } + FUIStaticContentTableViewCell *cell = + [FUIStaticContentTableViewCell cellWithTitle: + [FUIAuthBaseViewController providerLocalizedName:userInfo.providerID] + value:userInfo.displayName]; + [linkedAccounts addObject:cell]; + } + + _tableViewManager.contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleProfile) + cells:@[ + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellName) + value:self.auth.currentUser.displayName + action:^{ + [FUIAccountSettingsOperationUpdateName executeOperationWithDelegate:self showDialog:NO]; + }], + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellEmail) + value:self.auth.currentUser.email + action:^{ + [FUIAccountSettingsOperationUpdateEmail executeOperationWithDelegate:self]; + }] + ]], + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleLinkedAccounts) + cells:linkedAccounts], + [self createActionsSection] + ]]; +} + +- (void)updateTableStateLinkedAccountWithEmail { + NSMutableArray *linkedAccounts = + [[NSMutableArray alloc] initWithCapacity:self.auth.currentUser.providerData.count]; + for (id userInfo in self.auth.currentUser.providerData) { + if ([userInfo.providerID isEqualToString:FIREmailAuthProviderID]) { + continue; + } + FUIStaticContentTableViewCell *cell = + [FUIStaticContentTableViewCell cellWithTitle: + [FUIAuthBaseViewController providerLocalizedName:userInfo.providerID] + value:userInfo.displayName]; + [linkedAccounts addObject:cell]; + } + + _tableViewManager.contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleProfile) + cells:@[ + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellName) + value:self.auth.currentUser.displayName + action:^{ + [FUIAccountSettingsOperationUpdateName executeOperationWithDelegate:self showDialog:NO]; + }], + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellEmail) + value:self.auth.currentUser.email + action:^{ + [FUIAccountSettingsOperationUpdateEmail executeOperationWithDelegate:self]; + }] + ]], + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleSecurity) + cells:@[ + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellAddPassword) + action:^{ + [FUIAccountSettingsOperationUpdatePassword executeOperationWithDelegate:self + showDialog:YES + newPassword:YES]; + }] + ]], + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleLinkedAccounts) + cells:linkedAccounts], + [self createActionsSection] + ]]; +} + +- (void)updateTableStateLinkedAccountWithEmailPassword { + NSMutableArray *linkedAccounts = + [[NSMutableArray alloc] initWithCapacity:self.auth.currentUser.providerData.count]; + for (id userInfo in self.auth.currentUser.providerData) { + if ([userInfo.providerID isEqualToString:FIREmailAuthProviderID]) { + continue; + } + FUIStaticContentTableViewCell *cell = + [FUIStaticContentTableViewCell cellWithTitle: + [FUIAuthBaseViewController providerLocalizedName:userInfo.providerID] + value:userInfo.displayName + action:^{ + [FUIAccountSettingsOperationUnlinkAccount executeOperationWithDelegate:self + showDialog:NO + provider:userInfo]; + }]; + [linkedAccounts addObject:cell]; + } + + _tableViewManager.contents = + [FUIStaticContentTableViewContent contentWithSections:@[ + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleProfile) + cells:@[ + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellName) + value:self.auth.currentUser.displayName + action:^{ + [FUIAccountSettingsOperationUpdateName executeOperationWithDelegate:self showDialog:NO]; + }], + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellEmail) + value:self.auth.currentUser.email + action:^{ + [FUIAccountSettingsOperationUpdateEmail executeOperationWithDelegate:self]; + }] + ]], + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleSecurity) + cells:@[ + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellChangePassword) + action:^{ + [FUIAccountSettingsOperationUpdatePassword executeOperationWithDelegate:self + showDialog:YES + newPassword:NO]; + }] + ]], + [FUIStaticContentTableViewSection sectionWithTitle: + FUILocalizedString(kStr_ASSectionTitleLinkedAccounts) + cells:linkedAccounts], + [self createActionsSection] + ]]; +} + +- (FUIStaticContentTableViewSection *)createActionsSection { + FUIStaticContentTableViewCell *signOutCell = + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellSignOut) + type:FUIStaticContentTableViewCellTypeButton + action:^{ + [FUIAccountSettingsOperationSignOut executeOperationWithDelegate:self]; + } +]; + NSMutableArray *cells = [NSMutableArray arrayWithObject:signOutCell]; + if (!_deleteAccountActionDisabled) { + FUIStaticContentTableViewCell *deleteCell = + [FUIStaticContentTableViewCell cellWithTitle:FUILocalizedString(kStr_ASCellDeleteAccount) + type:FUIStaticContentTableViewCellTypeButton + action:^{ + [FUIAccountSettingsOperationDeleteAccount executeOperationWithDelegate:self + showDialog:YES]; + } +]; + [cells addObject:deleteCell]; + } + return [FUIStaticContentTableViewSection sectionWithTitle:nil cells:cells]; +} + +- (void)updateUI { + _accountState = [self accountState]; + [self populateTableHeader]; + [self updateTable]; +} + +- (void)popToRoot { + [self.navigationController popToViewController:self animated:YES]; +} + +#pragma mark - FUIAccountSettingsOperationUIDelegate + +- (void)presentViewController:(UIViewController *)controller { + [self.navigationController presentViewController:controller animated:YES completion:nil]; +} + +- (void)pushViewController:(UIViewController *)controller { + [super pushViewController:controller]; +} + +- (void)presentBaseController { + [self popToRoot]; + [self updateUI]; +} + +- (void)incrementActivity { + UIViewController *controller = self.navigationController.topViewController; + if (controller == self) { + [super incrementActivity]; + } else if ([controller isKindOfClass:[FUIAuthBaseViewController class]]) { + [(FUIAuthBaseViewController *)controller incrementActivity]; + } +} + +- (void)decrementActivity { + UIViewController *controller = self.navigationController.topViewController; + if (controller == self) { + [super decrementActivity]; + } else if ([controller isKindOfClass:[FUIAuthBaseViewController class]]) { + [(FUIAuthBaseViewController *)controller decrementActivity]; + } +} + +- (UIViewController *)presentingController { + return self; +} +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.xib b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.xib new file mode 100644 index 00000000..e9bf85ff --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIAccountSettingsViewController.xib @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIInputTableViewCell.xib b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIInputTableViewCell.xib new file mode 100644 index 00000000..872fa477 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIInputTableViewCell.xib @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIPasswordTableViewCell.xib b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIPasswordTableViewCell.xib new file mode 100644 index 00000000..bd8b11c4 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/AccountManagement/FUIPasswordTableViewCell.xib @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.h new file mode 100644 index 00000000..db604ea8 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.h @@ -0,0 +1,268 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +#import "FUIAccountSettingsOperationType.h" +#import "FUIAuthProvider.h" + +@class FIRAuth; +@class FUIAuthPickerViewController; +@class FUIAuth; +@class FIRUser; +@class FUIEmailEntryViewController; +@class FUIPasswordSignInViewController; +@class FUIPasswordSignUpViewController; +@class FUIPasswordRecoveryViewController; +@class FUIPasswordVerificationViewController; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FUIAuthResultCallback + @brief The type of block invoked when sign-in related events complete. + @param user The user signed in, if any. + @param error The error which occurred, if any. + */ +typedef void (^FUIAuthResultCallback)(FIRUser *_Nullable user, NSError *_Nullable error); + +/** @protocol FUIAuthDelegate + @brief A delegate that receives callbacks or provides custom UI for @c FUIAuth. + */ +@protocol FUIAuthDelegate + +@optional + +/** @fn authUI:didSignInWithAuthDataResult:error: + @brief Message sent after the sign in process has completed to report the signed in user or + error encountered. + @param authUI The @c FUIAuth instance sending the message. + @param authDataResult The data result if the sign in attempt was successful. + @param url pass the deep link associated with an email link sign-in completion. It is useful + for the developer to access the state before the sign-in attempt was triggered. + @param error The error that occurred during sign in, if any. + */ +- (void)authUI:(FUIAuth *)authUI + didSignInWithAuthDataResult:(nullable FIRAuthDataResult *)authDataResult + URL:(nullable NSURL *)url + error:(nullable NSError *)error; + +/** @fn authUI:didSignInWithAuthDataResult:error: + @brief Message sent after the sign in process has completed to report the signed in user or + error encountered. + @param authUI The @c FUIAuth instance sending the message. + @param authDataResult The data result if the sign in attempt was successful. + @param error The error that occurred during sign in, if any. + */ +- (void)authUI:(FUIAuth *)authUI + didSignInWithAuthDataResult:(nullable FIRAuthDataResult *)authDataResult + error:(nullable NSError *)error; + +/** @fn authUI:didSignInWithUser:error: + @brief This is deprecated API and will be removed in a future release. + Use @c authUI:didSignInWithAuthDataResult:error: + Both sign in call backs are called (@c authUI:didSignInWithAuthDataResult:error: + and @c authUI:didSignInWithUser:error:). + This message is sent after the sign in process has completed to report the signed in user or + error encountered. + @param authUI The @c FUIAuth instance sending the message. + @param user The signed in user if the sign in attempt was successful. + @param error The error that occurred during sign in, if any. + */ +- (void)authUI:(FUIAuth *)authUI + didSignInWithUser:(nullable FIRUser *)user + error:(nullable NSError *)error +__attribute__((deprecated("Instead use authUI:didSignInWithAuthDataResult:error:"))); + + +/** @fn authUI:didFinishOperation:error: + @brief Message sent after finishing Account Management operation. + @param authUI The @c FUIAuth instance sending the message. + @param operation The operation type that was just completed. + @param error The error that occurred during operation, if any. +*/ +- (void)authUI:(FUIAuth *)authUI + didFinishOperation:(FUIAccountSettingsOperationType)operation + error:(nullable NSError *)error; + +/** @fn authPickerViewControllerForAuthUI: + @brief Sent to the receiver to ask for an instance of @c FUIAuthPickerViewController subclass + to allow UI customizations. + @param authUI The @c FUIAuth instance sending the message. + @return an instance of @c FUIAuthPickerViewController subclass. + */ +- (FUIAuthPickerViewController *)authPickerViewControllerForAuthUI:(FUIAuth *)authUI; + +/** @fn emailEntryViewControllerForAuthUI: + @brief Sent to the receiver to ask for an instance of @c FUIEmailEntryViewController subclass + to allow UI customizations. + @param authUI The @c FUIAuth instance sending the message. + @return an instance of @c FUIEmailEntryViewController subclass. + */ +- (FUIEmailEntryViewController *)emailEntryViewControllerForAuthUI:(FUIAuth *)authUI; + +/** @fn passwordSignInViewControllerForAuthUI:email: + @brief Sent to the receiver to ask for an instance of @c FUIPasswordSignInViewController subclass + to allow sign-in UI customizations. + @param authUI The @c FUIAuth instance sending the message. + @param email The email user is using for sin-in. + @return an instance of @c FUIPasswordSignInViewController subclass. + */ +- (FUIPasswordSignInViewController *)passwordSignInViewControllerForAuthUI:(FUIAuth *)authUI + email:(NSString *)email; + +/** @fn passwordSignInViewControllerForAuthUI:email: + @brief Sent to the receiver to ask for an instance of @c FUIPasswordSignUpViewController subclass + to allow sign-up UI customizations. + @param authUI The @c FUIAuth instance sending the message. + @param email The email user is using for sin-in. + @param requireDisplayName Whether the displayname field is required . + @return an instance of @c FUIPasswordSignUpViewController subclass. + */ +- (FUIPasswordSignUpViewController *)passwordSignUpViewControllerForAuthUI:(FUIAuth *)authUI + email:(NSString *)email + requireDisplayName:(BOOL)requireDisplayName; + +/** @fn passwordRecoveryViewControllerForAuthUI:email: + @brief Sent to the receiver to ask for an instance of @c FUIPasswordRecoveryViewController subclass + to allow sign-up UI customizations. + @param authUI The @c FUIAuth instance sending the message. + @param email The email user is using for password recovery. + @return an instance of @c FUIPasswordRecoveryViewController subclass. + */ +- (FUIPasswordRecoveryViewController *)passwordRecoveryViewControllerForAuthUI:(FUIAuth *)authUI + email:(NSString *)email; + +/** @fn passwordVerificationViewControllerForAuthUI:email:newCredential: + @brief Sent to the receiver to ask for an instance of @c FUIPasswordVerificationViewController subclass + to allow password verification UI customizations. + @param authUI The @c FUIAuth instance sending the message. + @param email The email user is using for sin-in. + @param newCredential This @c FIRAuthCredential obtained from linked account. + @return an instance of @c FUIPasswordVerificationViewController subclass. + */ +- (FUIPasswordVerificationViewController *)passwordVerificationViewControllerForAuthUI:(FUIAuth *)authUI + email:(NSString *)email + newCredential:(FIRAuthCredential *)newCredential; +@end + +/** @class FUIAuth + @brief Provides various iOS UIs for Firebase Auth. + */ +@interface FUIAuth : NSObject + +/** @fn defaultAuthUI + @brief Gets the @c FUIAuth object for the default FirebaseApp. + @remarks Thread safe. + */ ++ (nullable FUIAuth *)defaultAuthUI; + +/** @fn authUIWithAuth: + @brief Gets the @c FUIAuth instance for a @c FIRAuth. + @param auth The @c FIRAuth for which to retrieve the associated @c FUIAuth instance. + @return The @c FUIAuth instance associated with the given @c FIRAuth. + @remarks Thread safe. + */ ++ (nullable FUIAuth *)authUIWithAuth:(FIRAuth *)auth; + +/** @property app + @brief Gets the @c FIRAuth this auth UI object is connected to. + */ +@property(nonatomic, weak, readonly, nullable) FIRAuth *auth; + +/** @property providers + @brief The @c FUIAuthProvider implementations to use for sign-in. + */ +@property(nonatomic, copy) NSArray> *providers; + +/** @property shouldHideCancelButton + @brief Whether to hide the cancel button, defaults to NO. + */ +@property(nonatomic, assign) BOOL shouldHideCancelButton; + +/** @property interactiveDismissEnabled + @brief Whether or not interactive dismiss should be enabled on iOS 13 and above devices. + */ +@property(nonatomic, assign, getter=isInteractiveDismissEnabled) BOOL interactiveDismissEnabled API_AVAILABLE(ios(13)); + +/** @property customStringsBundle + @brief Custom strings bundle supplied by the developer. Nil when there is no custom strings + bundle set. In which case the default bundle will be used. + @remarks Set this property to nil in order to remove the custom strings bundle and revert to + using the default bundle. + */ +@property(nonatomic, strong, nullable) NSBundle *customStringsBundle; + +/** @property TOSURL + @brief The URL of your app's Terms of Service. If not nil, a Terms of Service notice is + displayed on the initial sign-in screen and potentially the phone number auth and + email/password account creation screen. + */ +@property(nonatomic, copy, nullable) NSURL *TOSURL; + +/** @property shouldAutoUpgradeAnonymousUsers + @brief Whether to enable auto upgrading of anonymous accounts, defaults to NO. + */ +@property(nonatomic, assign, getter=shouldAutoUpgradeAnonymousUsers) BOOL autoUpgradeAnonymousUsers; + +/** @property privacyPolicyURL + @brief The URL of your app's Privacy Policy. If not nil, a privacy policy notice is + displayed on the initial sign-in screen and potentially the phone number auth and + email/password account creation screen. + */ +@property(nonatomic, copy, nullable) NSURL *privacyPolicyURL; + +/** @property delegate + @brief A delegate that receives callbacks or provides custom UI for @c FUIAuth. + */ +@property(nonatomic, weak) id delegate; + +/** @fn init + @brief Please use @c FUIAuth.authUIWithAuth to get a @c FUIAuth instance. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn handleOpenURL: + @brief Should be called from your @c UIApplicationDelegate in + @c UIApplicationDelegate.application:openURL:options: to finish sign-in flows. + @param URL The URL which may be handled by Firebase Auth UI if an URL is expected. + @param sourceApplication The application which tried opening the URL. + @return YES if Firebase Auth UI handled the URL. NO otherwise. + */ +- (BOOL)handleOpenURL:(NSURL *)URL + sourceApplication:(nullable NSString *)sourceApplication; + +/** @fn authViewController + @brief Returns an instance of the initial navigation view controller of AuthUI. + @return An instance of the the initial navigation view controller of AuthUI. + */ +- (UINavigationController *)authViewController; + +/** @fn signOutWithError: + @brief Signs out the current user from Firebase and all providers. + @param error Optionally; if an error occurs during Firebase sign out, upon return contains an + NSError object that describes the problem; is nil otherwise. If Firebase error occurs all + providers are not logged-out and sign-out should be retried. + @return @YES when the sign out request was successful. @NO otherwise. + @remarks Possible error codes: + - @c FIRAuthErrorCodeKeychainError Indicates an error occurred when accessing the keychain. + The @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo dictionary + will contain more information about the error encountered. + */ +- (BOOL)signOutWithError:(NSError *_Nullable *_Nullable)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.m new file mode 100644 index 00000000..5ab32ff5 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.m @@ -0,0 +1,417 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuth_Internal.h" + +#import + +#import +#import +#import +#import +#import "FUIAuthBaseViewController_Internal.h" +#import "FUIAuthErrors.h" +#import "FUIAuthErrorUtils.h" +#import "FUIAuthPickerViewController.h" +#import "FUIAuthStrings.h" + +/** @var kAppNameCodingKey + @brief The key used to encode the app Name for NSCoding. + */ +static NSString *const kAppNameCodingKey = @"appName"; + +/** @var kAuthAssociationKey + @brief The address of this variable is used as the key for associating FUIAuth instances with + root FIRAuth objects. + */ +static const char kAuthAssociationKey; + +/** @var kErrorUserInfoEmailKey + @brief The key for the email address in the userInfo dictionary of a sign in error. + */ +static NSString *const kErrorUserInfoEmailKey = @"FIRAuthErrorUserInfoEmailKey"; + +/** @var kFirebaseAuthUIFrameworkMarker + @brief The marker in the HTTP header that indicates the presence of Firebase Auth UI. + */ +static NSString *const kFirebaseAuthUIFrameworkMarker = @"FirebaseUI-iOS"; + +/** @category FIRAuth(InternalInterface) + @brief Redeclares the internal interface not publicly exposed in FIRAuth. + */ +@interface FIRAuth (InternalInterface) + +/** @property additionalFrameworkMarker + @brief Additional framework marker that will be added as part of the header of every request. + */ +@property(nonatomic, copy, nullable) NSString *additionalFrameworkMarker; + +@end + +@interface FUIAuth () + +/** @fn initWithAuth: + @brief auth The @c FIRAuth to associate the @c FUIAuth instance with. + */ +- (instancetype)initWithAuth:(FIRAuth *)auth NS_DESIGNATED_INITIALIZER; + +@end + +@implementation FUIAuth { + id __weak _emailAuthProvider; +} + ++ (nullable FUIAuth *)defaultAuthUI { + FIRAuth *defaultAuth = [FIRAuth auth]; + if (!defaultAuth) { + return nil; + } + return [self authUIWithAuth:defaultAuth]; +} + ++ (nullable FUIAuth *)authUIWithAuth:(FIRAuth *)auth { + NSParameterAssert(auth != nil); + @synchronized (self) { + // Let the FIRAuth instance retain the FUIAuth instance. + FUIAuth *authUI = objc_getAssociatedObject(auth, &kAuthAssociationKey); + if (!authUI) { + authUI = [[FUIAuth alloc] initWithAuth:auth]; + objc_setAssociatedObject(auth, &kAuthAssociationKey, authUI, + OBJC_ASSOCIATION_RETAIN_NONATOMIC); + if ([auth respondsToSelector:@selector(setAdditionalFrameworkMarker:)]) { + auth.additionalFrameworkMarker = kFirebaseAuthUIFrameworkMarker; + } + // Update auth with the actual language used in the app. + // If localization is not provided by developer, the first localization available, + // ordered by the user's preferred order, is used. + auth.languageCode = [NSBundle mainBundle].preferredLocalizations.firstObject; + } + return authUI; + } +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + _interactiveDismissEnabled = YES; + } + return self; +} + +- (BOOL)handleOpenURL:(NSURL *)URL + sourceApplication:(NSString *)sourceApplication { + // Complete IDP-based sign-in flow. + for (id provider in _providers) { + if ([provider handleOpenURL:URL sourceApplication:sourceApplication]) { + return YES; + } + } + // The URL was not meant for us. + return NO; +} + +- (UINavigationController *)authViewController { + static UINavigationController *authViewController; + + UIViewController *controller; + if ([self.delegate respondsToSelector:@selector(authPickerViewControllerForAuthUI:)]) { + controller = [self.delegate authPickerViewControllerForAuthUI:self]; + } else { + controller = [[FUIAuthPickerViewController alloc] initWithAuthUI:self]; + } + authViewController = [[UINavigationController alloc] initWithRootViewController:controller]; + + return authViewController; +} + +- (BOOL)signOutWithError:(NSError *_Nullable *_Nullable)error { + // sign out from Firebase + BOOL success = [self.auth signOut:error]; + if (success) { + // sign out from all providers (wipes provider tokens too) + for (id provider in _providers) { + [provider signOut]; + } + } + + return success; +} + +- (void)signInWithProviderUI:(id)providerUI + presentingViewController:(FUIAuthBaseViewController *)presentingViewController + defaultValue:(nullable NSString *)defaultValue { + + // Sign out first to make sure sign in starts with a clean state. + [providerUI signOut]; + [providerUI signInWithDefaultValue:defaultValue + presentingViewController:presentingViewController + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error, + _Nullable FIRAuthResultCallback result, + NSDictionary *_Nullable userInfo) { + BOOL isAuthPickerShown = + [presentingViewController isKindOfClass:[FUIAuthPickerViewController class]]; + if (error) { + if (!isAuthPickerShown || error.code != FUIAuthErrorCodeUserCancelledSignIn) { + [self invokeResultCallbackWithAuthDataResult:nil URL:nil error:error]; + } + if (result) { + result(nil, error); + } + return; + } + + // Test if it's an anonymous login. + if (self.auth.currentUser.isAnonymous && !credential) { + if (result) { + result(self.auth.currentUser, nil); + } + // Hide Auth Picker Controller which was presented modally. + if (isAuthPickerShown && presentingViewController.presentingViewController) { + [presentingViewController dismissViewControllerAnimated:YES completion:nil]; + } + FIRAuthDataResult *authResult = userInfo[FUIAuthProviderSignInUserInfoKeyAuthDataResult]; + if (authResult != nil) { + [self invokeResultCallbackWithAuthDataResult:authResult URL:nil error:error]; + } + return; + } + + // Check for the presence of an anonymous user and whether automatic upgrade is enabled. + if (self.auth.currentUser.isAnonymous && self.shouldAutoUpgradeAnonymousUsers) { + [self autoUpgradeAccountWithProviderUI:providerUI + presentingViewController:presentingViewController + credential:credential + resultCallback:result]; + } else { + [self.auth signInWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + if (error && error.code == FIRAuthErrorCodeAccountExistsWithDifferentCredential) { + NSString *email = error.userInfo[kErrorUserInfoEmailKey]; + [self.emailAuthProvider handleAccountLinkingForEmail:email + newCredential:credential + presentingViewController:presentingViewController + signInResult:result]; + + return; + } + if (error) { + if (result) { + result(nil, error); + } + [self invokeResultCallbackWithAuthDataResult:nil URL:nil error:error]; + return; + } + [self completeSignInWithResult:authResult + error:nil + presentingViewController:presentingViewController + callback:result]; + }]; + } + }]; +} + +- (void)autoUpgradeAccountWithProviderUI:(id)providerUI + presentingViewController:(FUIAuthBaseViewController *)presentingViewController + credential:(nullable FIRAuthCredential *)credential + resultCallback:(nullable FIRAuthResultCallback)callback { + [self.auth.currentUser + linkWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError * _Nullable error) { + if (error) { + // Check for "credential in use" conflict error and handle appropriately. + if (error.code == FIRAuthErrorCodeCredentialAlreadyInUse) { + FIRAuthCredential *newCredential = error.userInfo[FIRAuthErrorUserInfoUpdatedCredentialKey]; + NSDictionary *userInfo = @{ }; + if (newCredential) { + userInfo = @{ FUIAuthCredentialKey : newCredential }; + } + NSError *mergeError = [FUIAuthErrorUtils mergeConflictErrorWithUserInfo:userInfo + underlyingError:error]; + [self completeSignInWithResult:authResult + error:mergeError + presentingViewController:presentingViewController + callback:callback]; + } else if (error.code == FIRAuthErrorCodeEmailAlreadyInUse) { + if ([providerUI respondsToSelector:@selector(email)]) { + // Link federated providers + [self.emailAuthProvider signInWithEmailHint:[providerUI email] + presentingViewController:presentingViewController + originalError:error + completion: + ^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable emailError, + FIRAuthCredential *_Nullable existingCredential) { + if (emailError) { + [self completeSignInWithResult:nil + error:emailError + presentingViewController:presentingViewController + callback:callback]; + return; + } + + if (![authResult.user.email isEqualToString:[providerUI email]] + && credential) { + NSDictionary *userInfo = @{ + FUIAuthCredentialKey : credential, + }; + NSError *mergeError = [FUIAuthErrorUtils mergeConflictErrorWithUserInfo:userInfo + underlyingError:error]; + [self completeSignInWithResult:authResult + error:mergeError + presentingViewController:presentingViewController + callback:callback]; + return; + } + + [authResult.user linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *linkError) { + if (linkError) { + [self completeSignInWithResult:nil + error:linkError + presentingViewController:presentingViewController + callback:callback]; + return; + } + FIRAuthCredential *newCredential = credential; + NSDictionary *userInfo = @{ + FUIAuthCredentialKey : newCredential, + }; + NSError *mergeError = [FUIAuthErrorUtils mergeConflictErrorWithUserInfo:userInfo + underlyingError:error]; + [self completeSignInWithResult:authResult + error:mergeError + presentingViewController:presentingViewController + callback:callback]; + }]; + }]; + } + } else { + [self completeSignInWithResult:nil + error:error + presentingViewController:presentingViewController + callback:callback]; + } + } else { + [self completeSignInWithResult:authResult + error:nil + presentingViewController:presentingViewController + callback:callback]; + } + }]; +} + +- (void)completeSignInWithResult:(nullable FIRAuthDataResult *)authResult + error:(nullable NSError *)error + presentingViewController:(FUIAuthBaseViewController *)presentingViewController + callback:(nullable FIRAuthResultCallback)callback { + BOOL isAuthPickerShown = + [presentingViewController isKindOfClass:[FUIAuthPickerViewController class]]; + if (callback) { + callback(authResult.user, error); + } + // Hide Auth Picker Controller which was presented modally. + if (isAuthPickerShown && presentingViewController.presentingViewController) { + [presentingViewController dismissViewControllerAnimated:YES completion:^{ + [self invokeResultCallbackWithAuthDataResult:authResult URL:nil error:error]; + }]; + } else { + [self invokeResultCallbackWithAuthDataResult:authResult URL:nil error:error]; + } +} + +#pragma mark - Internal Methods + +- (void)invokeResultCallbackWithAuthDataResult:(nullable FIRAuthDataResult *)authDataResult + URL:(nullable NSURL *)url + error:(nullable NSError *)error { + dispatch_async(dispatch_get_main_queue(), ^{ + if ([self.delegate respondsToSelector:@selector(authUI:didSignInWithAuthDataResult:URL:error:)]) { + [self.delegate authUI:self + didSignInWithAuthDataResult:authDataResult + URL:url + error:error]; + } + if ([self.delegate respondsToSelector:@selector(authUI:didSignInWithAuthDataResult:error:)]) { + [self.delegate authUI:self didSignInWithAuthDataResult:authDataResult error:error]; + } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if ([self.delegate respondsToSelector:@selector(authUI:didSignInWithUser:error:)]) { + [self.delegate authUI:self didSignInWithUser:authDataResult.user error:error]; + } +#pragma clang diagnostic pop + }); +} + +- (void)invokeOperationCallback:(FUIAccountSettingsOperationType)operation + error:(NSError *_Nullable)error { + dispatch_async(dispatch_get_main_queue(), ^{ + if ([self.delegate respondsToSelector:@selector(authUI:didFinishOperation:error:)]) { + [self.delegate authUI:self didFinishOperation:operation error:error]; + } + }); +} + +- (nullable id)providerWithID:(NSString *)providerID { + NSArray> *providers = self.providers; + for (id provider in providers) { + if ([provider.providerID isEqual:providerID]) { + return provider; + } + } + return nil; +} + +- (void)setEmailAuthProvider:(id)emailAuthProvider { + _emailAuthProvider = emailAuthProvider; +} + +- (id)emailAuthProvider { + return _emailAuthProvider; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *appName = [aDecoder decodeObjectOfClass:[NSString class] forKey:kAppNameCodingKey]; + if (!appName) { + return nil; + } + FIRApp *app = [FIRApp appNamed:appName]; + if (!app) { + return nil; + } + FIRAuth *auth = [FIRAuth authWithApp:app]; + if (!auth) { + return nil; + } + return [self initWithAuth:auth]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_auth.app.name forKey:kAppNameCodingKey]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController.h new file mode 100644 index 00000000..6354c95e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController.h @@ -0,0 +1,124 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +@class FIRAuth; +@class FUIAuth; +@protocol FUIAuthProvider; + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAuthBaseViewController + @brief The base view controller that provides common methods for all subclasses. + */ +@interface FUIAuthBaseViewController : UIViewController + +/** @typedef FUIAuthAlertActionHandler + @brief The type of block called when an alert view is dismissed by a user action. + */ +typedef void (^FUIAuthAlertActionHandler)(void); + +/** @property auth + @brief The @c FIRAuth instance of the application. + */ +@property(nonatomic, strong, readonly) FIRAuth *auth; + +/** @property authUI + @brief The @c FUIAuth instance of the application. + */ +@property(nonatomic, strong, readonly) FUIAuth *authUI; + +/** @fn init + @brief Please use @c initWithNibName:bundle:authUI:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithStyle: + @brief Please use @c initWithNibName:bundle:authUI:. + */ +- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE; + +/** @fn initWithNibName:bundle: + @brief Please use @c initWithNibName:bundle:authUI:. + */ +- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil + bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE; + +/** @fn initWithNibName:bundle:authUI: + @brief Designated initializer. + @param nibNameOrNil The name of the nib file to associate with the view controller. + @param nibBundleOrNil The bundle in which to search for the nib file. + @param authUI The @c FUIAuth instance that manages this view controller. + */ +- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil + bundle:(nullable NSBundle *)nibBundleOrNil + authUI:(FUIAuth *)authUI NS_DESIGNATED_INITIALIZER; + +/** @fn initWithAuthUI: + @brief Convenience initializer. If your custom auth picker controller is using its + own nib file, this initializer should be overwritten. + @param authUI The @c FUIAuth instance that manages this view controller. + */ +- (instancetype)initWithAuthUI:(FUIAuth *)authUI; + +/** @fn onBack + @brief Pops the view controller from navigation stack. If current controller is root + works as @c cancelAuthorization + */ +- (void)onBack; + +/** @fn cancelAuthorization + @brief Cancels Authorization flow, calls UI delegate callbacks and hides UI + */ +- (void)cancelAuthorization; + +/** @fn showSignInAlertWithEmail:provider:handler: + @brief Displays an alert asking the user to confirm whether or not they want to proceed with the selected provider. + @param email The email address to sign in with. + @param provider The identity provider to sign in with. + @param signinHandler Handler for the sign in action of the alert. + @param cancelHandler Handler for the cancel action of the alert. + */ ++ (void)showSignInAlertWithEmail:(NSString *)email + provider:(id)provider + presentingViewController:(UIViewController *)presentingViewController + signinHandler:(FUIAuthAlertActionHandler)signinHandler + cancelHandler:(FUIAuthAlertActionHandler)cancelHandler; + +/** @fn incrementActivity + @brief Increment the current activity count. If there's positive number of activities, display + and animate the activity indicator with a short delay. + @remarks Calls to @c incrementActivity and @c decrementActivity should be balanced. + */ +- (void)incrementActivity; + +/** @fn decrementActivity + @brief Decrement the current activity count. If the count reaches 0, stop and hide the + activity indicator. + @remarks Calls to @c incrementActivity and @c decrementActivity should be balanced. + */ +- (void)decrementActivity; + +/** @fn addActivityIndicator: + @brief Creates and adds an activity indicator to the center of the specified view. + @param view The view where indicator is shown. + */ ++ (UIActivityIndicatorView *)addActivityIndicator:(UIView *)view; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController.m new file mode 100644 index 00000000..1bba323a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController.m @@ -0,0 +1,448 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthBaseViewController_Internal.h" + +#import +#import "FUIAuthErrorUtils.h" +#import "FUIAuthStrings.h" +#import "FUIAuthUtils.h" +#import "FUIAuth_Internal.h" +#import "objc/runtime.h" + +/** @var kActivityIndiactorPadding + @brief The padding between the activity indiactor and its overlay. + */ +static const CGFloat kActivityIndiactorPadding = 20.0f; + +/** @var kActivityIndiactorOverlayCornerRadius + @brief The corner radius of the overlay of the activity indicator. + */ +static const CGFloat kActivityIndiactorOverlayCornerRadius = 20.0f; + +/** @var kActivityIndiactorOverlayOpacity + @brief The opacity of the overlay of the activity indicator. + */ +static const CGFloat kActivityIndiactorOverlayOpacity = 0.8f; + +/** @var kActivityIndiactorAnimationDelay + @brief The time delay before the activity indicator is actually animated. + */ +static const NSTimeInterval kActivityIndiactorAnimationDelay = 0.5f; + +/** @var kUITableViewCellHeight + @brief Height of all table view cells used in subclasses of the controller. + */ +static const CGFloat kUITableViewCellHeight = 44.f; + +/** @var kEmailRegex + @brief Regular expression for matching email addresses. + */ +static NSString *const kEmailRegex = @".+@([a-zA-Z0-9\\-]+\\.)+[a-zA-Z0-9]{2,63}"; + +/** @var kAuthUICodingKey + @brief The key used to encode @c FUIAuth instance for NSCoding. + */ +static NSString *const kAuthUICodingKey = @"authUI"; + +@implementation FUIAuthBaseViewController { + /** @var _activityIndicator + @brief A spinner that is displayed when there's an ongoing activity. + */ + UIActivityIndicatorView *_activityIndicator; + + /** @var _activityCount + @brief Count of current ongoing activities. + */ + NSInteger _activityCount; +} + +- (instancetype)initWithNibName:(NSString *)nibNameOrNil + bundle:(NSBundle *)nibBundleOrNil + authUI:(FUIAuth *)authUI { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + _auth = authUI.auth; + _authUI = authUI; + + _activityIndicator = [[self class] addActivityIndicator:self.view]; + } + return self; +} + +- (instancetype)initWithAuthUI:(FUIAuth *)authUI { + return [self initWithNibName:NSStringFromClass([self class]) + bundle:[FUIAuthUtils bundleNamed:FUIAuthBundleName] + authUI:authUI]; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + + CGPoint activityIndicatorCenter = self.view.center; + // Compensate for bounds adjustment if any. + activityIndicatorCenter.y += self.view.bounds.origin.y; + _activityIndicator.center = activityIndicatorCenter; +} + +#pragma mark - NSCoding + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + FUIAuth *authUI = [aDecoder decodeObjectOfClass:[FUIAuth class] forKey:kAuthUICodingKey]; + if (!authUI) { + return nil; + } + return [self initWithAuthUI:authUI]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_authUI forKey:kAuthUICodingKey]; +} + +#pragma mark - Utilities + ++ (BOOL)isValidEmail:(NSString *)email { + static dispatch_once_t onceToken; + static NSPredicate *emailPredicate; + dispatch_once(&onceToken, ^{ + emailPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", kEmailRegex]; + }); + return [emailPredicate evaluateWithObject:email]; +} + ++ (UIActivityIndicatorView *)addActivityIndicator:(UIView *)view { + if (!view) { + return nil; + } + UIActivityIndicatorView *activityIndicator = + [[UIActivityIndicatorView alloc] + initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + UIView *tintView = [[UIView alloc] initWithFrame:CGRectInset(activityIndicator.frame, + -kActivityIndiactorPadding, + -kActivityIndiactorPadding)]; + tintView.backgroundColor = + [UIColor colorWithWhite:0 alpha:kActivityIndiactorOverlayOpacity]; + tintView.layer.cornerRadius = kActivityIndiactorOverlayCornerRadius; + [activityIndicator addSubview:tintView]; + + // Align tintView (transparent background). + tintView.translatesAutoresizingMaskIntoConstraints = NO; + [activityIndicator addConstraint: + [NSLayoutConstraint constraintWithItem:tintView + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 + constant:CGRectGetWidth(tintView.frame)]]; + [activityIndicator addConstraint: + [NSLayoutConstraint constraintWithItem:tintView + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:activityIndicator + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0]]; + + [activityIndicator addConstraint: + [NSLayoutConstraint constraintWithItem:tintView + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 + constant:CGRectGetHeight(tintView.frame)]]; + [activityIndicator addConstraint: + [NSLayoutConstraint constraintWithItem:tintView + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:activityIndicator + attribute:NSLayoutAttributeCenterY + multiplier:1 + constant:0]]; + + [activityIndicator sendSubviewToBack:tintView]; + + [view addSubview:activityIndicator]; + // Align activity indicator. + activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; + [view addConstraint: + [NSLayoutConstraint constraintWithItem:activityIndicator + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:view + attribute:NSLayoutAttributeWidth + multiplier:1 + constant:0]]; + [view addConstraint: + [NSLayoutConstraint constraintWithItem:activityIndicator + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0]]; + + [view addConstraint: + [NSLayoutConstraint constraintWithItem:activityIndicator + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:view + attribute:NSLayoutAttributeHeight + multiplier:1 + constant:0]]; + [view addConstraint: + [NSLayoutConstraint constraintWithItem:activityIndicator + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:view + attribute:NSLayoutAttributeCenterY + multiplier:1 + constant:0]]; + return activityIndicator; +} + +- (void)showAlertWithMessage:(NSString *)message { + [[self class] showAlertWithMessage:message presentingViewController:self]; +} + ++ (void)showAlertWithMessage:(NSString *)message { + [[self class] showAlertWithMessage:message presentingViewController:nil]; +} + ++ (void)showAlertWithMessage:(NSString *)message + presentingViewController:(nullable UIViewController *)presentingViewController { + [[self class] showAlertWithTitle:message + message:nil + presentingViewController:presentingViewController]; +} + ++ (void)showAlertWithTitle:(nullable NSString *)title + message:(nullable NSString *)message + presentingViewController:(nullable UIViewController *)presentingViewController { + [[self class] showAlertWithTitle:title + message:message + actionTitle:nil + actionHandler:nil + dismissTitle:FUILocalizedString(kStr_OK) + dismissHandler:nil + presentingViewController:presentingViewController]; +} + ++ (void)showAlertWithTitle:(nullable NSString *)title + message:(nullable NSString *)message + actionTitle:(nullable NSString *)actionTitle + actionHandler:(nullable FUIAuthAlertActionHandler)actionHandler + dismissTitle:(nullable NSString *)dismissTitle + dismissHandler:(nullable FUIAuthAlertActionHandler)dismissHandler + presentingViewController:(nullable UIViewController *)presentingViewController { + UIAlertController *alertController = + [UIAlertController alertControllerWithTitle:title + message:message + preferredStyle:UIAlertControllerStyleAlert]; + + if (actionTitle) { + UIAlertAction *action = + [UIAlertAction actionWithTitle:actionTitle + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *_Nonnull action) { + if (actionHandler) { + actionHandler(); + } + }]; + [alertController addAction:action]; + } + + if (dismissTitle) { + UIAlertAction *dismissAction = + [UIAlertAction actionWithTitle:dismissTitle + style:UIAlertActionStyleCancel + handler:^(UIAlertAction * _Nonnull action) { + if (dismissHandler) { + dismissHandler(); + } + }]; + [alertController addAction:dismissAction]; + } + + if (presentingViewController) { + [presentingViewController presentViewController:alertController animated:YES completion:nil]; + } else { + UIViewController *viewController = [[UIViewController alloc] init]; + viewController.view.backgroundColor = UIColor.clearColor; + UIWindow *window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; + window.rootViewController = viewController; + window.windowLevel = UIWindowLevelAlert + 1; + [window makeKeyAndVisible]; + [viewController presentViewController:alertController animated:YES completion:nil]; + + if (@available(iOS 13.0, *)) { + /* + Earlier iOS versions established a strong reference to the window when makeKeyAndVisible was called. + Now we add one from the alert controller, to prevent objects from getting garbage collected right away. + */ + static char key; + objc_setAssociatedObject(alertController, &key, window, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + } +} + ++ (void)showSignInAlertWithEmail:(NSString *)email + provider:(id)provider + presentingViewController:(UIViewController *)presentingViewController + signinHandler:(FUIAuthAlertActionHandler)signinHandler + cancelHandler:(FUIAuthAlertActionHandler)cancelHandler { + [self showSignInAlertWithEmail:email + providerShortName:provider.shortName + providerSignInLabel:provider.signInLabel + presentingViewController:presentingViewController + signinHandler:signinHandler + cancelHandler:cancelHandler]; +} + ++ (void)showSignInAlertWithEmail:(NSString *)email + providerShortName:(NSString *)providerShortName + providerSignInLabel:(NSString *)providerSignInLabel + presentingViewController:(UIViewController *)presentingViewController + signinHandler:(FUIAuthAlertActionHandler)signinHandler + cancelHandler:(FUIAuthAlertActionHandler)cancelHandler { + NSString *message = + [NSString stringWithFormat:FUILocalizedString(kStr_ProviderUsedPreviouslyMessage), + email, providerShortName]; + UIAlertController *alertController = + [UIAlertController alertControllerWithTitle:FUILocalizedString(kStr_ExistingAccountTitle) + message:message + preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *signInAction = + [UIAlertAction actionWithTitle:providerSignInLabel + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *_Nonnull action) { + if (signinHandler) { + signinHandler(); + } + }]; + [alertController addAction:signInAction]; + UIAlertAction *cancelAction = + [UIAlertAction actionWithTitle:FUILocalizedString(kStr_Cancel) + style:UIAlertActionStyleCancel + handler:^(UIAlertAction * _Nonnull action) { + if (cancelHandler) { + cancelHandler(); + } + }]; + [alertController addAction:cancelAction]; + [presentingViewController presentViewController:alertController animated:YES completion:nil]; +} + +- (void)pushViewController:(UIViewController *)viewController { + [[self class] pushViewController:viewController + navigationController:self.navigationController]; +} + +- (void)dismissNavigationControllerAnimated:(BOOL)animated completion:(void (^)(void))completion { + if (self.navigationController.presentingViewController == nil){ + if (completion){ + completion(); + } + } else { + [self.navigationController dismissViewControllerAnimated:animated completion:completion]; + } +} + ++ (void)pushViewController:(UIViewController *)viewController + navigationController:(UINavigationController *)navigationController { + // Override the back button title with "Back". + viewController.navigationItem.backBarButtonItem = + [[UIBarButtonItem alloc] initWithTitle:FUILocalizedString(kStr_Back) + style:UIBarButtonItemStylePlain + target:nil + action:nil]; + [navigationController pushViewController:viewController animated:YES]; +} + + ++ (UIBarButtonItem *)barItemWithTitle:(NSString *)title + target:(nullable id)target + action:(SEL)action { + UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithTitle:title + style:UIBarButtonItemStylePlain + target:target + action:action]; + return buttonItem; +} + +- (void)onBack { + if (self.navigationController.viewControllers.count > 1) { + [self.navigationController popViewControllerAnimated:YES]; + } else { + [self cancelAuthorization]; + } +} + +- (void)incrementActivity { + _activityCount++; + + // Delay the display of acitivty indiactor for a short period of time. + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, + (int64_t)(kActivityIndiactorAnimationDelay * NSEC_PER_SEC)), + dispatch_get_main_queue(), ^{ + [self->_activityIndicator.superview bringSubviewToFront:self->_activityIndicator]; + if (self->_activityCount > 0) { + [self->_activityIndicator startAnimating]; + } + }); +} + +- (void)decrementActivity { + _activityCount--; + + if (_activityCount < 0) { + NSLog(@"Unbalanced calls to incrementActivity and decrementActivity."); + _activityCount = 0; + } + + if (_activityCount == 0) { + [_activityIndicator.superview sendSubviewToBack:_activityIndicator]; + [_activityIndicator stopAnimating]; + } +} + +- (void)cancelAuthorization { + [self dismissNavigationControllerAnimated:YES completion:^{ + NSError *error = [FUIAuthErrorUtils userCancelledSignInError]; + [self.authUI invokeResultCallbackWithAuthDataResult:nil URL:nil error:error]; + }]; +} + ++ (NSString *)providerLocalizedName:(NSString *)providerId { + if ([providerId isEqualToString:FIREmailAuthProviderID]) { + return FUILocalizedString(kStr_ProviderTitlePassword); + } else if ([providerId isEqualToString:FIRGoogleAuthProviderID]) { + return FUILocalizedString(kStr_ProviderTitleGoogle); + } else if ([providerId isEqualToString:FIRFacebookAuthProviderID]) { + return FUILocalizedString(kStr_ProviderTitleFacebook); + } else if ([providerId isEqualToString:FIRTwitterAuthProviderID]) { + return FUILocalizedString(kStr_ProviderTitleTwitter); + } + return @""; +} + +- (void)enableDynamicCellHeightForTableView:(UITableView *)tableView { + tableView.rowHeight = UITableViewAutomaticDimension; + tableView.estimatedRowHeight = kUITableViewCellHeight; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController_Internal.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController_Internal.h new file mode 100644 index 00000000..fa5b505f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthBaseViewController_Internal.h @@ -0,0 +1,150 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthBaseViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * The methods in this category are exposed so that the FirebaseUI provider frameworks + * can make use of them. They may change in non-breaking releases and should not be + * used publicly. + */ +@interface FUIAuthBaseViewController (Internal) + +/** @fn isValidEmail: + @brief Statically validates email address. + @param email The email address to validate. + */ ++ (BOOL)isValidEmail:(NSString *)email; + +/** @fn showAlertWithMessage: + @brief Displays an alert view with given title and message on top of the current view + controller. + @param message The message of the alert. + */ +- (void)showAlertWithMessage:(NSString *)message; + +/** @fn showAlertWithMessage: + @brief Displays an alert view with given title and message on top of the current view + controller. + @param message The message of the alert. + */ ++ (void)showAlertWithMessage:(NSString *)message; + +/** @fn showAlertWithMessage:presentingViewController: + @brief Displays an alert view with given title and message on top of the current view + controller. + @param message The message of the alert. + @param presentingViewController The controller which shows alert. + */ ++ (void)showAlertWithMessage:(NSString *)message + presentingViewController:(nullable UIViewController *)presentingViewController; + +/** @fn showAlertWithTitle:message: + @brief Displays an alert view with given title, message and action title on top of the + specified view controller. + @param title The title of the alert. + @param message The message of the alert. + @param presentingViewController The controller which shows alert. +*/ ++ (void)showAlertWithTitle:(nullable NSString *)title + message:(nullable NSString *)message + presentingViewController:(nullable UIViewController *)presentingViewController; + +/** @fn showAlertWithTitle:message:actionTitle:actionHandler:dismissTitle:dismissHandler: + @brief Displays an alert view with given title, message and action title on top of the + specified view controller. + @param title The title of the alert. + @param message The message of the alert. + @param actionTitle The title of the action button. + @param actionHandler The block to execute if the action button is tapped. + @param dismissTitle The title of the dismiss button. + @param dismissHandler The block to execute if the cancel button is tapped. + @param presentingViewController The controller which shows alert. +*/ ++ (void)showAlertWithTitle:(nullable NSString *)title + message:(nullable NSString *)message + actionTitle:(nullable NSString *)actionTitle + actionHandler:(nullable FUIAuthAlertActionHandler)actionHandler + dismissTitle:(nullable NSString *)dismissTitle + dismissHandler:(nullable FUIAuthAlertActionHandler)dismissHandler + presentingViewController:(nullable UIViewController *)presentingViewController; + +/** @fn showSignInAlertWithEmail:providerShortName:providerSignInLabel:handler: + @brief Displays an alert to conform with user whether she wants to proceed with the provider. + @param email The email address to sign in with. + @param providerShortName The name of the provider as displayed in the sign-in alert message. + @param providerSignInLabel The name of the provider as displayed in the sign-in alert button. + @param signinHandler Handler for the sign in action of the alert. + @param cancelHandler Handler for the cancel action of the alert. + */ ++ (void)showSignInAlertWithEmail:(NSString *)email + providerShortName:(NSString *)providerShortName + providerSignInLabel:(NSString *)providerSignInLabel + presentingViewController:(UIViewController *)presentingViewController + signinHandler:(FUIAuthAlertActionHandler)signinHandler + cancelHandler:(FUIAuthAlertActionHandler)cancelHandler; + +/** @fn pushViewController: + @brief Push the view controller to the navigation controller of the current view controller + with animation. The pushed view controller will have a fixed "Back" title for back button. + @param viewController The view controller to be pushed. + */ +- (void)pushViewController:(UIViewController *)viewController; + +/** @fn dismissNavigationControllerAnimated:completion: + @brief dismiss navigation controller if it is not the rootViewController. If it is set as + the rootViewController only perform the completion block. + @param animated Use animation when dismissing the ViewControler. + @param completion Code to be executed upon completion + */ +- (void)dismissNavigationControllerAnimated:(BOOL)animated + completion:(void (^)(void))completion; + +/** @fn pushViewController: + @brief Push the view controller to the navigation controller of the current view controller + with animation. The pushed view controller will have a fixed "Back" title for back button. + @param viewController The view controller to be pushed. + @param navigationController The controller where view controller is pushed. + */ ++ (void)pushViewController:(UIViewController *)viewController + navigationController:(UINavigationController *)navigationController; + +/** @fn providerLocalizedName: + @brief Maps provider Id to localized provider name. + */ ++ (NSString *)providerLocalizedName:(NSString *)providerId; + +/** @fn barItemWithTitle:target:action: + @brief Creates multiline @c UIBarButtonItem of fixed width. + @param title The title of the button. + @param target The target object of the @c UIBarButtonItem . + @param action The action called when button is selected. + */ ++ (UIBarButtonItem *)barItemWithTitle:(NSString *)title + target:(nullable id)target + action:(SEL)action; + +/** @fn enableDynamicCellHeightForTableView: + @brief Configures table view in the way than it resizes rows according to their height. + @param tableView The tableView which is going to be configured. + */ +- (void)enableDynamicCellHeightForTableView:(UITableView *)tableView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrorUtils.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrorUtils.h new file mode 100644 index 00000000..0e4aa070 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrorUtils.h @@ -0,0 +1,62 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthErrors.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAuthErrorUtils + @brief Utility class used to construct @c NSError instances. + */ +@interface FUIAuthErrorUtils : NSObject + +/** @fn errorWithCode: + @brief Creates an error with the specified code. + @param code The error code. + @param userInfo The dictionary containing the error description if available. + @return An @c NSError with the correct code and corresponding description if available. + */ ++ (NSError *)errorWithCode:(FUIAuthErrorCode)code userInfo:(nullable NSDictionary *)userInfo; + +/** @fn userCancelledSignInError + @brief Constructs an @c NSError with the @c FUIAuthErrorCodeUserCancelledSignIn code. + */ ++ (NSError *)userCancelledSignInError; + +/** @fn mergeConflictErrorWithUserInfo:underlyingError: + @brief Constructs an @c NSError with the @c FUIAuthErrorCodeMergeConflict code. + @param userInfo The userInfo dictionary to add to the NSError object. + @param underlyingError The error that was raised by FirebaseAuth while merging accounts. + @return The merge conflict error. + */ ++ (NSError *)mergeConflictErrorWithUserInfo:(NSDictionary *)userInfo + underlyingError:(nullable NSError *)underlyingError; + +/** @fn providerErrorWithUnderlyingError:providerID: + @brief Constructs an @c NSError with the @c FUIAuthErrorCodeProviderError code and a populated + @c NSUnderlyingErrorKey and @c FUIAuthErrorUserInfoProviderIDKey in the + @c NSError.userInfo dictionary. + @param underlyingError The value of the @c NSUnderlyingErrorKey. + @param providerID The value of the @c FUIAuthErrorUserInfoProviderIDKey. + @remarks This error is used when an error from the identity provider cannot be immediately + handled, and should be forwarded to the client. + */ ++ (NSError *)providerErrorWithUnderlyingError:(NSError *)underlyingError + providerID:(NSString *)providerID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrorUtils.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrorUtils.m new file mode 100644 index 00000000..95f27386 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrorUtils.m @@ -0,0 +1,49 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthErrorUtils.h" + +@implementation FUIAuthErrorUtils + ++ (NSError *)errorWithCode:(FUIAuthErrorCode)code userInfo:(NSDictionary *)userInfo { + return [NSError errorWithDomain:FUIAuthErrorDomain code:code userInfo:userInfo]; +} + ++ (NSError *)userCancelledSignInError { + return [self errorWithCode:FUIAuthErrorCodeUserCancelledSignIn userInfo:nil]; +} + ++ (NSError *)mergeConflictErrorWithUserInfo:(NSDictionary *)userInfo + underlyingError:(NSError *)underlyingError { + NSMutableDictionary *errorInfo = [userInfo mutableCopy]; + if (underlyingError != nil) { + errorInfo[NSUnderlyingErrorKey] = underlyingError; + } + errorInfo[NSLocalizedDescriptionKey] = @"Unable to merge accounts. Check the userInfo dictionary" + @" for the auth credential of the logged-in account."; + return [self errorWithCode:FUIAuthErrorCodeMergeConflict userInfo:[errorInfo copy]]; +} + ++ (NSError *)providerErrorWithUnderlyingError:(NSError *)underlyingError + providerID:(NSString *)providerID { + return [self errorWithCode:FUIAuthErrorCodeProviderError + userInfo:@{ + NSUnderlyingErrorKey : underlyingError, + FUIAuthErrorUserInfoProviderIDKey : providerID + }]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrors.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrors.h new file mode 100644 index 00000000..885d9fa3 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrors.h @@ -0,0 +1,68 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +@import Foundation; + +NS_ASSUME_NONNULL_BEGIN + +/** @var FUIAuthErrorDomain + @brief The standard Firebase error domain. + */ +extern NSString *const FUIAuthErrorDomain; + +/** @var FUIAuthErrorUserInfoProviderIDKey + @brief The ID of the identity provider. + */ +extern NSString *const FUIAuthErrorUserInfoProviderIDKey; + +/** @var FUIAuthCredentialKey + @brief The key used to obtain the credential stored within the userInfo dictionary of the + error, if available. + */ +extern NSString *const FUIAuthCredentialKey; + +/** @var FUIAuthErrorCode + @brief Error codes used by FUIAuth. + */ +typedef NS_ENUM(NSUInteger, FUIAuthErrorCode) { + + /** @var FUIAuthErrorCodeUserCancelledSignIn + @brief Indicates the user cancelled a sign-in flow. + */ + FUIAuthErrorCodeUserCancelledSignIn = 1, + + /** @var FUIAuthErrorCodeProviderError + @brief Indicates there's an error from the identity provider. The + @c FUIAuthErrorUserInfoProviderIDKey field in the @c NError.userInfo dictionary will + contain the ID of the identity provider. + */ + FUIAuthErrorCodeProviderError = 2, + + /** @var FUIAuthErrorCodeCantFindProvider + @brief Indicates that @FUIAuth.providers doen't contain current provider (see NSError.userInfo + key @c FUIAuthErrorUserInfoProviderIDKey). + */ + FUIAuthErrorCodeCantFindProvider = 3, + + /** @var FUIAuthErrorCodeMergeConflict + @brief Indicates that a merge conflict occurred while trying to automatically upgrade an + anonymous user. The non-anonymous credential can be obtained from the userInfo dictionary + of the corresponding NSError using the @c FUIAuthCredentialKey. + */ + FUIAuthErrorCodeMergeConflict = 4, +}; + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrors.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrors.m new file mode 100644 index 00000000..dc7df99a --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthErrors.m @@ -0,0 +1,23 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthErrors.h" + +NSString *const FUIAuthErrorDomain = @"FUIAuthErrorDomain"; + +NSString *const FUIAuthErrorUserInfoProviderIDKey = @"FUIAuthErrorUserInfoProviderIDKey"; + +NSString *const FUIAuthCredentialKey = @"FUIAuthCredentialKey"; diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.h new file mode 100644 index 00000000..d81a2b2e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.h @@ -0,0 +1,30 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +#import "FUIAuthBaseViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAuthPickerViewController + @brief The view controller that displays sign in options to the user. + */ +@interface FUIAuthPickerViewController : FUIAuthBaseViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.m new file mode 100644 index 00000000..e484d78f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.m @@ -0,0 +1,208 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthPickerViewController.h" + +#import + +#import +#import "FUIAuthBaseViewController_Internal.h" +#import "FUIAuthSignInButton.h" +#import "FUIAuthStrings.h" +#import "FUIAuthUtils.h" +#import "FUIAuth_Internal.h" +#import "FUIPrivacyAndTermsOfServiceView.h" + +/** @var kSignInButtonWidth + @brief The width of the sign in buttons. + */ +static const CGFloat kSignInButtonWidth = 220.0f; + +/** @var kSignInButtonHeight + @brief The height of the sign in buttons. + */ +static const CGFloat kSignInButtonHeight = 40.0f; + +/** @var kSignInButtonVerticalMargin + @brief The vertical margin between sign in buttons. + */ +static const CGFloat kSignInButtonVerticalMargin = 24.0f; + +/** @var kButtonContainerBottomMargin + @brief The magin between sign in buttons and the bottom of the content view. + */ +static const CGFloat kButtonContainerBottomMargin = 48.0f; + +/** @var kButtonContainerTopMargin + @brief The margin between sign in buttons and the top of the content view. + */ +static const CGFloat kButtonContainerTopMargin = 16.0f; + +/** @var kTOSViewBottomMargin + @brief The margin between privacy policy and TOS view and the bottom of the content view. + */ +static const CGFloat kTOSViewBottomMargin = 24.0f; + +/** @var kTOSViewHorizontalMargin + @brief The margin between privacy policy and TOS view and the left or right of the content view. + */ +static const CGFloat kTOSViewHorizontalMargin = 16.0f; + +@implementation FUIAuthPickerViewController { + UIView *_buttonContainerView; + + IBOutlet FUIPrivacyAndTermsOfServiceView *_privacyPolicyAndTOSView; + + IBOutlet UIView *_contentView; + + IBOutlet UIScrollView *_scrollView; +} + +- (instancetype)initWithAuthUI:(FUIAuth *)authUI { + return [self initWithNibName:@"FUIAuthPickerViewController" + bundle:[FUIAuthUtils bundleNamed:FUIAuthBundleName] + authUI:authUI]; +} + +- (instancetype)initWithNibName:(NSString *)nibNameOrNil + bundle:(NSBundle *)nibBundleOrNil + authUI:(FUIAuth *)authUI { + + self = [super initWithNibName:nibNameOrNil + bundle:nibBundleOrNil + authUI:authUI]; + if (self) { + self.title = FUILocalizedString(kStr_AuthPickerTitle); + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Makes sure that embedded scroll view properly handles translucent navigation bar + if (!self.navigationController.navigationBar.isTranslucent) { + self.extendedLayoutIncludesOpaqueBars = true; + } + + if (!self.authUI.shouldHideCancelButton) { + UIBarButtonItem *cancelBarButton = + [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel + target:self + action:@selector(cancelAuthorization)]; + self.navigationItem.leftBarButtonItem = cancelBarButton; + } + if (@available(iOS 13, *)) { + if (!self.authUI.interactiveDismissEnabled) { + self.modalInPresentation = YES; + } + } + + self.navigationItem.backBarButtonItem = + [[UIBarButtonItem alloc] initWithTitle:FUILocalizedString(kStr_Back) + style:UIBarButtonItemStylePlain + target:nil + action:nil]; + + NSInteger numberOfButtons = self.authUI.providers.count; + + CGFloat buttonContainerViewHeight = + kSignInButtonHeight * numberOfButtons + kSignInButtonVerticalMargin * (numberOfButtons); + CGRect buttonContainerViewFrame = CGRectMake(0, 0, kSignInButtonWidth, buttonContainerViewHeight); + _buttonContainerView = [[UIView alloc] initWithFrame:buttonContainerViewFrame]; + if (_scrollView) { + [_contentView addSubview:_buttonContainerView]; + } else { + // For backward compatibility. The old auth picker view does not have a scroll view and its + // customized class put the button container view directly into self.view. + [self.view addSubview:_buttonContainerView]; + } + + CGRect buttonFrame = CGRectMake(0, 0, kSignInButtonWidth, kSignInButtonHeight); + for (id providerUI in self.authUI.providers) { + UIButton *providerButton = + [[FUIAuthSignInButton alloc] initWithFrame:buttonFrame providerUI:providerUI]; + [providerButton addTarget:self + action:@selector(didTapSignInButton:) + forControlEvents:UIControlEventTouchUpInside]; + [_buttonContainerView addSubview:providerButton]; + + // Make the frame for the new button. + buttonFrame.origin.y += (kSignInButtonHeight + kSignInButtonVerticalMargin); + } + + _privacyPolicyAndTOSView.authUI = self.authUI; + [_privacyPolicyAndTOSView useFullMessage]; + [_contentView bringSubviewToFront:_privacyPolicyAndTOSView]; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + + // For backward compatibility. The old auth picker view does not have a scroll view and its + // customized class put the button container view directly into self.view. The following is the + // old layout behavior. + if (!_scrollView) { + CGFloat distanceFromCenterToBottom = + CGRectGetHeight(_buttonContainerView.frame) / 2.0f + kButtonContainerBottomMargin + kTOSViewBottomMargin; + CGFloat centerY = CGRectGetHeight(self.view.bounds) - distanceFromCenterToBottom; + // Compensate for bounds adjustment if any. + centerY += self.view.bounds.origin.y; + _buttonContainerView.center = CGPointMake(self.view.center.x, centerY); + return; + } + + CGFloat buttonContainerHeight = CGRectGetHeight(_buttonContainerView.frame); + CGFloat buttonContainerWidth = CGRectGetWidth(_buttonContainerView.frame); + CGFloat contentViewHeight = kButtonContainerTopMargin + buttonContainerHeight + + kButtonContainerBottomMargin + kTOSViewBottomMargin; + CGFloat contentViewWidth = CGRectGetWidth(self.view.bounds); + _scrollView.frame = self.view.frame; + CGFloat scrollViewHeight; + if (@available(iOS 11.0, *)) { + scrollViewHeight = CGRectGetHeight(_scrollView.frame) - _scrollView.safeAreaInsets.top; + } else { + scrollViewHeight = CGRectGetHeight(_scrollView.frame) + - CGRectGetHeight(self.navigationController.navigationBar.frame) + - CGRectGetHeight([UIApplication sharedApplication].statusBarFrame); + } + CGFloat contentViewY = scrollViewHeight - contentViewHeight; + if (contentViewY < 0) { + contentViewY = 0; + } + _contentView.frame = CGRectMake(0, contentViewY, contentViewWidth, contentViewHeight); + _scrollView.contentSize = CGSizeMake(contentViewWidth, contentViewY + contentViewHeight); + CGFloat buttonContainerLeftMargin = (contentViewWidth - buttonContainerWidth) / 2.0f; + _buttonContainerView.frame =CGRectMake(buttonContainerLeftMargin, + kButtonContainerTopMargin, + buttonContainerWidth, + buttonContainerHeight); + CGFloat privacyViewHeight = CGRectGetHeight(_privacyPolicyAndTOSView.frame); + _privacyPolicyAndTOSView.frame = CGRectMake(kTOSViewHorizontalMargin, contentViewHeight + - privacyViewHeight - kTOSViewBottomMargin, + contentViewWidth - kTOSViewHorizontalMargin*2, + privacyViewHeight); +} + +#pragma mark - Actions + +- (void)didTapSignInButton:(FUIAuthSignInButton *)button { + [self.authUI signInWithProviderUI:button.providerUI + presentingViewController:self + defaultValue:nil]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.xib b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.xib new file mode 100644 index 00000000..740cc32c --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthPickerViewController.xib @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthProvider.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthProvider.h new file mode 100644 index 00000000..dd2a7caf --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthProvider.h @@ -0,0 +1,178 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import + +@class FIRAuth; +@class FIRAuthCredential; +@class FIRUserInfo; + +NS_ASSUME_NONNULL_BEGIN + +/** @typedef FUIAuthProviderSignInCompletionBlock + @brief The type of block used to notify the auth system of the result of a sign-in flow. + @see FUIAuthProvider.signInWithDefaultValue:presentingViewController:completion: + @param credential The @c FIRAuthCredential object created after user interaction with third + party provider. + @param error The error which may happen during creation of The @c FIRAuthCredential object. + @param result The result of sign-in operation using provided @c FIRAuthCredential object. + @see @c FIRAuth.signInWithCredential:completion: + @param userInfo A dictionary containing additional information about the sign in operation. + @see FUIAuthProviderSignInUserInfoKey + */ +typedef void (^FUIAuthProviderSignInCompletionBlock) ( + FIRAuthCredential *_Nullable credential, + NSError *_Nullable error, + _Nullable FIRAuthResultCallback result, + NSDictionary *_Nullable userInfo); + +/** + @typedef FUIAuthProviderSignInUserInfoKey + @brief A key in a userInfo dictionary corresponding to some supplemental value from + the sign-in operation. + @see FUIAuthProviderSignInCompletionBlock + */ +typedef NSString *FUIAuthProviderSignInUserInfoKey NS_TYPED_ENUM; + +/** + @typedef FUIButtonAlignment + @brief The alignment of the icon and text of the button. +*/ +typedef NS_ENUM(NSInteger, FUIButtonAlignment) { + FUIButtonAlignmentLeading, + FUIButtonAlignmentCenter, +}; + +/** + For Firebase-based authentication operations, use this key to obtain the original auth result + that was returned from the sign-in operation. + */ +static FUIAuthProviderSignInUserInfoKey FUIAuthProviderSignInUserInfoKeyAuthDataResult = + @"FUIAuthProviderSignInUserInfoKeyAuthDataResult"; + +/** @protocol FUIAuthProvider + @brief Represents an authentication provider (such as Google Sign In or Facebook Login) which + can be used with the AuthUI classes (like @c FUIAuthPickerViewController). + @remarks @c FUIAuth.signInProviders is populated with a list of @c FUIAuthProvider instances + to provide users with sign-in options. + */ +@protocol FUIAuthProvider + +/** @property providerID + @brief A unique identifier for the provider. + */ +@property(nonatomic, copy, readonly, nullable) NSString *providerID; + +/** @property shortName + @brief A short display name for the provider. + */ +@property(nonatomic, copy, readonly) NSString *shortName; + +/** @property signInLabel + @brief A localized label for the provider's sign-in button. + */ +@property(nonatomic, copy, readonly) NSString *signInLabel; + +/** @property icon + @brief The icon image of the provider. + */ +@property(nonatomic, strong, readonly) UIImage *icon; + +/** @property buttonBackgroundColor + @brief The background color that should be used for the sign in button of the provider. + */ +@property(nonatomic, strong, readonly) UIColor *buttonBackgroundColor; + +/** @property buttonTextColor + @brief The text color that should be used for the sign in button of the provider. + */ +@property(nonatomic, strong, readonly) UIColor *buttonTextColor; + +/** @property buttonAlignment + @brief The alignment of the icon and text of the button. + */ +@property(nonatomic, readwrite) FUIButtonAlignment buttonAlignment; + +/** @fn signInWithEmail:presentingViewController:completion: + @brief Called when the user wants to sign in using this auth provider. + @remarks Implementors should invoke the completion block when the sign-in process has terminated + or is canceled. There are two valid combinations of parameters; either @c credentials and + @c userInfo are both non-nil, or @c error is non-nil. Errors must specify an error code + which is one of the @c FIRAuthErrorCode codes. It is very important that all possible code + paths eventually call this method to inform the auth system of the result of the sign-in + flow. + @param email The email address of the user if it's known. + @param presentingViewController The view controller used to present the UI. + @param completion See remarks. A block which should be invoked when the sign-in process + (using @c FIRAuthCredential) completes. + */ +- (void)signInWithEmail:(nullable NSString *)email + presentingViewController:(nullable UIViewController *)presentingViewController + completion:(nullable FUIAuthProviderSignInCompletionBlock)completion +__attribute__((deprecated("This is deprecated API and will be removed in a future release." + "Use signInWithDefaultValue:presentingViewController:completion:"))); + +/** @fn signInWithDefaultValue:presentingViewController:completion: + @brief Called when the user wants to sign in using this auth provider. + @remarks Implementors should invoke the completion block when the sign-in process has terminated + or is canceled. There are two valid combinations of parameters; either @c credentials and + @c userInfo are both non-nil, or @c error is non-nil. Errors must specify an error code + which is one of the @c FIRAuthErrorCode codes. It is very important that all possible code + paths eventually call this method to inform the auth system of the result of the sign-in + flow. + @param defaultValue The default initialization value of the provider (email, phone number etc.). + @param presentingViewController The view controller used to present the UI. + @param completion See remarks. A block which should be invoked when the sign-in process + (using @c FIRAuthCredential) completes. + */ +- (void)signInWithDefaultValue:(nullable NSString *)defaultValue + presentingViewController:(nullable UIViewController *)presentingViewController + completion:(nullable FUIAuthProviderSignInCompletionBlock)completion; + +/** @fn signOut + @brief Called when the user wants to sign out. + */ +- (void)signOut; + +/** @property accessToken + @brief User Access Token obtained during sign in. + */ +@property(nonatomic, copy, readonly, nullable) NSString *accessToken; + +@optional; + +/** @property idToken + @brief User Id Token obtained during sign in. Not all providers can return, thus it's optional. + */ +@property(nonatomic, copy, readonly, nullable) NSString *idToken; + +/** @fn email + @brief The email address associated with this provider, if any. + */ +- (NSString *)email; + +/** @fn handleOpenURL: + @brief May be used to help complete a sign-in flow which requires a callback from Safari. + @param URL The URL which may be handled by the auth provider if an URL is expected. + @param sourceApplication The application which tried opening the URL. + @return YES if your auth provider handled the URL. NO otherwise. + */ +- (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(nullable NSString *)sourceApplication; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthSignInButton.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthSignInButton.h new file mode 100644 index 00000000..3456a391 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthSignInButton.h @@ -0,0 +1,68 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +#import "FUIAuthProvider.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAuthSignInButton + @brief Button representing an identity provider on the auth picker screen that starts + authentication with the provider when touched. + */ +@interface FUIAuthSignInButton : UIButton + +/** @property provider + @brief The provider UI instance associated with this button. Can be nil. + */ +@property(nonatomic, strong, readonly, nullable) id providerUI; + +/** @fn initWithFrame: + @brief Please use initWithFrame:image:text:backgroundColor:textColor:. + */ +- (id)initWithFrame:(CGRect)frame NS_UNAVAILABLE; + +/** @fn initWithCoder: + @brief Please use initWithFrame:image:text:backgroundColor:textColor:. + */ +- (id)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE; + +/** @fn initWithFrame:image:text:backgroundColor:textColor: + @brief Designated initializer. + @param frame The initial frame for the button. + @param image Logo image for the button. + @param text Button text. + @param backgroundColor Background color of the button in the normal state. + @param textColor Color of the button text. + */ +- (id)initWithFrame:(CGRect)frame + image:(UIImage *)image + text:(NSString *)text + backgroundColor:(UIColor *)backgroundColor + textColor:(UIColor *)textColor + buttonAlignment:(FUIButtonAlignment)buttonAlignment NS_DESIGNATED_INITIALIZER; + +/** @fn initWithFrame:providerUI: + @brief Convenience initalizer. + @param frame The initial frame for the button. + @param providerUI The provider UI instance associated with this button. + */ +- (id)initWithFrame:(CGRect)frame providerUI:(id)providerUI; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthSignInButton.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthSignInButton.m new file mode 100644 index 00000000..ef7c2965 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthSignInButton.m @@ -0,0 +1,116 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthSignInButton.h" + +#import "FUIAuthProvider.h" +#import "FUIAuthUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kCornerRadius + @brief Corner radius of the button. + */ +static const int kCornerRadius = 2.0f; + +/** @var kDropShadowAlpha + @brief Opacity of the drop shadow of the button. + */ +static const CGFloat kDropShadowAlpha = 0.24f; + +/** @var kDropShadowRadius + @brief Radius of the drop shadow of the button. + */ +static const CGFloat kDropShadowRadius = 2.0f; + +/** @var kDropShadowYOffset + @brief Vertical offset of the drop shadow of the button. + */ +static const CGFloat kDropShadowYOffset = 2.0f; + +/** @var kFontSize + @brief Button text font size. + */ +static const CGFloat kFontSize = 12.0f; + +@implementation FUIAuthSignInButton + +- (instancetype)initWithFrame:(CGRect)frame + image:(UIImage *)image + text:(NSString *)text + backgroundColor:(UIColor *)backgroundColor + textColor:(UIColor *)textColor + buttonAlignment:(FUIButtonAlignment)buttonAlignment { + self = [super initWithFrame:frame]; + if (!self) { + return nil; + } + + self.backgroundColor = backgroundColor; + [self setTitle:text forState:UIControlStateNormal]; + [self setTitleColor:textColor forState:UIControlStateNormal]; + self.titleLabel.font = [UIFont boldSystemFontOfSize:kFontSize]; + self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; + [self setImage:image forState:UIControlStateNormal]; + + CGFloat paddingTitle = 8.0f; + CGFloat contentWidth = self.imageView.frame.size.width + paddingTitle + self.titleLabel.frame.size.width; + CGFloat paddingImage = 8.0f; + if (buttonAlignment == FUIButtonAlignmentCenter) { + paddingImage = (frame.size.width - contentWidth) / 2 - 4.0f; + } + BOOL isLTRLayout = [[UIApplication sharedApplication] userInterfaceLayoutDirection] == + UIUserInterfaceLayoutDirectionLeftToRight; + if (isLTRLayout) { + [self setTitleEdgeInsets:UIEdgeInsetsMake(0, paddingTitle, 0, paddingImage + paddingTitle)]; + [self setContentEdgeInsets:UIEdgeInsetsMake(0, paddingImage, 0, -paddingImage - paddingTitle)]; + [self setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; + } else { + [self setTitleEdgeInsets:UIEdgeInsetsMake(0, paddingImage + paddingTitle, 0, paddingTitle)]; + [self setContentEdgeInsets:UIEdgeInsetsMake(0, -paddingImage - paddingTitle, 0, paddingImage)]; + [self setContentHorizontalAlignment:UIControlContentHorizontalAlignmentRight]; + } + + + + self.layer.cornerRadius = kCornerRadius; + + // Add a drop shadow. + self.layer.masksToBounds = NO; + self.layer.shadowColor = [UIColor blackColor].CGColor; + self.layer.shadowOpacity = kDropShadowAlpha; + self.layer.shadowRadius = kDropShadowRadius; + self.layer.shadowOffset = CGSizeMake(0, kDropShadowYOffset); + + self.adjustsImageWhenHighlighted = NO; + + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame providerUI:(id)providerUI { + _providerUI = providerUI; + return [self initWithFrame:frame + image:providerUI.icon + text:providerUI.signInLabel + backgroundColor:providerUI.buttonBackgroundColor + textColor:providerUI.buttonTextColor + buttonAlignment:providerUI.buttonAlignment]; +} + +@end + +NS_ASSUME_NONNULL_END + diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthStrings.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthStrings.h new file mode 100644 index 00000000..3ddd4790 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthStrings.h @@ -0,0 +1,147 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +extern NSString *const kStr_ASCellAddPassword; +extern NSString *const kStr_ASCellChangePassword; +extern NSString *const kStr_ASCellDeleteAccount; +extern NSString *const kStr_ASCellEmail; +extern NSString *const kStr_ASCellName; +extern NSString *const kStr_ASCellSignOut; +extern NSString *const kStr_ASSectionTitleLinkedAccounts; +extern NSString *const kStr_ASSectionTitleProfile; +extern NSString *const kStr_ASSectionTitleSecurity; +extern NSString *const kStr_AccountDisabledError; +extern NSString *const kStr_AuthPickerTitle; +extern NSString *const kStr_Back; +extern NSString *const kStr_Cancel; +extern NSString *const kStr_CannotAuthenticateError; +extern NSString *const kStr_ChoosePassword; +extern NSString *const kStr_Close; +extern NSString *const kStr_ConfirmEmail; +extern NSString *const kStr_Email; +extern NSString *const kStr_EmailAlreadyInUseError; +extern NSString *const kStr_EmailSentConfirmationMessage; +extern NSString *const kStr_EnterYourEmail; +extern NSString *const kStr_EnterYourPassword; +extern NSString *const kStr_Error; +extern NSString *const kStr_ExistingAccountTitle; +extern NSString *const kStr_FirstAndLastName; +extern NSString *const kStr_ForgotPassword; +extern NSString *const kStr_InvalidEmailError; +extern NSString *const kStr_InvalidPasswordError; +extern NSString *const kStr_Name; +extern NSString *const kStr_Next; +extern NSString *const kStr_OK; +extern NSString *const kStr_Password; +extern NSString *const kStr_PasswordRecoveryEmailSentMessage; +extern NSString *const kStr_PasswordRecoveryEmailSentTitle; +extern NSString *const kStr_PasswordRecoveryMessage; +extern NSString *const kStr_PasswordRecoveryTitle; +extern NSString *const kStr_PasswordVerificationMessage; +extern NSString *const kStr_ProviderUsedPreviouslyMessage; +extern NSString *const kStr_Save; +extern NSString *const kStr_Send; +extern NSString *const kStr_Resend; +extern NSString *const kStr_SignedIn; +extern NSString *const kStr_SignInTitle; +extern NSString *const kStr_SignInTooManyTimesError; +extern NSString *const kStr_SignInWithEmail; +extern NSString *const kStr_SignInEmailSent; +extern NSString *const kStr_SignUpTitle; +extern NSString *const kStr_SignUpTooManyTimesError; +extern NSString *const kStr_TermsOfService; +extern NSString *const kStr_TroubleGettingEmailTitle; +extern NSString *const kStr_TroubleGettingEmailMessage; +extern NSString *const kStr_PrivacyPolicy; +extern NSString *const kStr_TermsOfServiceMessage; +extern NSString *const kStr_UserNotFoundError; +extern NSString *const kStr_WeakPasswordError; +extern NSString *const kStr_WrongPasswordError; +extern NSString *const kStr_CantFindProvider; +extern NSString *const kStr_EmailsDontMatch; +extern NSString *const kStr_ForgotPassword; +extern NSString *const kStr_VerifyItsYou; +extern NSString *const kStr_DeleteAccountConfirmationTitle; +extern NSString *const kStr_DeleteAccountBody; +extern NSString *const kStr_DeleteAccountConfirmationMessage; +extern NSString *const kStr_Delete; +extern NSString *const kStr_DeleteAccountControllerTitle; +extern NSString *const kStr_ActionCantBeUndone; +extern NSString *const kStr_UnlinkTitle; +extern NSString *const kStr_UnlinkAction; +extern NSString *const kStr_UnlinkConfirmationTitle; +extern NSString *const kStr_UnlinkConfirmationMessage; +extern NSString *const kStr_UnlinkConfirmationActionTitle; +extern NSString *const kStr_UpdateEmailAlertMessage; +extern NSString *const kStr_UpdateEmailVerificationAlertMessage; +extern NSString *const kStr_AddPasswordAlertMessage; +extern NSString *const kStr_EditPasswordAlertMessage; +extern NSString *const kStr_ReauthenticateEditPasswordAlertMessage; +extern NSString *const kStr_AddPasswordTitle; +extern NSString *const kStr_EditPasswordTitle; +extern NSString *const kStr_EditNameTitle; +extern NSString *const kStr_EditEmailTitle; +extern NSString *const kStr_ProviderTitlePassword; +extern NSString *const kStr_ProviderTitleGoogle; +extern NSString *const kStr_ProviderTitleFacebook; +extern NSString *const kStr_ProviderTitleTwitter; +extern NSString *const kStr_SignInWithProvider; +extern NSString *const kStr_PlaceholderEnterName; +extern NSString *const kStr_PlaceholderEnterEmail; +extern NSString *const kStr_PlaceholderEnterPassword; +extern NSString *const kStr_PlaceholderChosePassword; +extern NSString *const kStr_PlaceholderNewPassword; +extern NSString *const kStr_ForgotPasswordTitle; + +#ifdef __cplusplus +extern "C" { +#endif + +/** @fn FUILocalizedString + @brief Gets a localized string from a name. + @param key The key value of the string. + @return The string by the key localized in the current locale located in default table. + */ +NSString *FUILocalizedString(NSString *key); + +/** @fn FUILocalizedStringFromTable + @brief Gets a localized string from a name. + @param key The key value of the string. + @param table The localization table name. + @return The string by the key localized in the current locale. +*/ +NSString *FUILocalizedStringFromTable(NSString *key, NSString *table); + +/** @fn FUILocalizedStringFromTableInBundle + @brief Gets a localized string from a name. + @param key The key value of the string. + @param table The localization table name. + @param bundleName The value of bundlu to look for. If nil is passed looking in apps bundle. + @return The string by the key localized in the current locale. +*/ +NSString *FUILocalizedStringFromTableInBundle(NSString *key, + NSString *table, + NSString *_Nullable bundleName); + +#ifdef __cplusplus +} +#endif + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthStrings.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthStrings.m new file mode 100644 index 00000000..88d550b2 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthStrings.m @@ -0,0 +1,160 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +#import "FUIAuthStrings.h" + +#import "FUIAuth.h" +#import "FUIAuthUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +// AuthUI string keys. +NSString *const kStr_ASCellAddPassword = @"AS_AddPassword"; +NSString *const kStr_ASCellChangePassword = @"AS_ChangePassword"; +NSString *const kStr_ASCellDeleteAccount = @"AS_DeleteAccount"; +NSString *const kStr_ASCellEmail = @"AS_Email"; +NSString *const kStr_ASCellName = @"AS_Name"; +NSString *const kStr_ASCellSignOut = @"AS_SignOut"; +NSString *const kStr_ASSectionTitleLinkedAccounts = @"AS_SectionLinkedAccounts"; +NSString *const kStr_ASSectionTitleProfile = @"AS_SectionProfile"; +NSString *const kStr_ASSectionTitleSecurity = @"AS_SectionSecurity"; +NSString *const kStr_AccountDisabledError = @"AccountDisabledError"; +NSString *const kStr_AuthPickerTitle = @"AuthPickerTitle"; +NSString *const kStr_Back = @"Back"; +NSString *const kStr_Cancel = @"Cancel"; +NSString *const kStr_CannotAuthenticateError = @"CannotAuthenticateError"; +NSString *const kStr_ChoosePassword = @"ChoosePassword"; +NSString *const kStr_Close = @"Close"; +NSString *const kStr_ConfirmEmail = @"ConfirmEmail"; +NSString *const kStr_Email = @"Email"; +NSString *const kStr_EmailAlreadyInUseError = @"EmailAlreadyInUseError"; +NSString *const kStr_EmailSentConfirmationMessage = @"EmailSentConfirmationMessage"; +NSString *const kStr_EnterYourEmail = @"EnterYourEmail"; +NSString *const kStr_EnterYourPassword = @"EnterYourPassword"; +NSString *const kStr_Error = @"Error"; +NSString *const kStr_ExistingAccountTitle = @"ExistingAccountTitle"; +NSString *const kStr_FirstAndLastName = @"FirstAndLastName"; +NSString *const kStr_ForgotPassword = @"ForgotPassword"; +NSString *const kStr_InvalidEmailError = @"InvalidEmailError"; +NSString *const kStr_InvalidPasswordError = @"InvalidPasswordError"; +NSString *const kStr_Name = @"Name"; +NSString *const kStr_Next = @"Next"; +NSString *const kStr_OK = @"OK"; +NSString *const kStr_Password = @"Password"; +NSString *const kStr_PasswordRecoveryEmailSentMessage = @"PasswordRecoveryEmailSentMessage"; +NSString *const kStr_PasswordRecoveryEmailSentTitle = @"PasswordRecoveryEmailSentTitle"; +NSString *const kStr_PasswordRecoveryMessage = @"PasswordRecoveryMessage"; +NSString *const kStr_PasswordRecoveryTitle = @"PasswordRecoveryTitle"; +NSString *const kStr_PasswordVerificationMessage = @"PasswordVerificationMessage"; +NSString *const kStr_ProviderUsedPreviouslyMessage = @"ProviderUsedPreviouslyMessage"; +NSString *const kStr_Save = @"Save"; +NSString *const kStr_Send = @"Send"; +NSString *const kStr_Resend = @"Resend"; +NSString *const kStr_SignedIn = @"SignedIn"; +NSString *const kStr_SignInTitle = @"SignInTitle"; +NSString *const kStr_SignInTooManyTimesError = @"SignInTooManyTimesError"; +NSString *const kStr_SignInWithEmail = @"SignInWithEmail"; +NSString *const kStr_SignInEmailSent = @"SignInEmailSent"; +NSString *const kStr_SignUpTitle = @"SignUpTitle"; +NSString *const kStr_SignUpTooManyTimesError = @"SignUpTooManyTimesError"; +NSString *const kStr_TermsOfService = @"TermsOfService"; +NSString *const kStr_TroubleGettingEmailTitle = @"TroubleGettingEmailTitle"; +NSString *const kStr_TroubleGettingEmailMessage = @"TroubleGettingEmailMessage"; +NSString *const kStr_PrivacyPolicy = @"PrivacyPolicy"; +NSString *const kStr_TermsOfServiceMessage = @"TermsOfServiceMessage"; +NSString *const kStr_UserNotFoundError = @"UserNotFoundError"; +NSString *const kStr_WeakPasswordError = @"WeakPasswordError"; +NSString *const kStr_WrongPasswordError = @"WrongPasswordError"; +NSString *const kStr_CantFindProvider = @"CantFindProvider"; +NSString *const kStr_EmailsDontMatch = @"EmailsDontMatch"; +NSString *const kStr_VerifyItsYou = @"VerifyItsYou"; +NSString *const kStr_DeleteAccountConfirmationTitle = @"DeleteAccountConfirmationTitle"; +NSString *const kStr_DeleteAccountBody = @"DeleteAccountBody"; +NSString *const kStr_DeleteAccountConfirmationMessage = @"DeleteAccountConfirmationMessage"; +NSString *const kStr_Delete = @"Delete"; +NSString *const kStr_DeleteAccountControllerTitle = @"DeleteAccountControllerTitle"; +NSString *const kStr_ActionCantBeUndone = @"ActionCantBeUndone"; +NSString *const kStr_UnlinkTitle = @"UnlinkTitle"; +NSString *const kStr_UnlinkAction = @"UnlinkAction"; +NSString *const kStr_UnlinkConfirmationTitle = @"UnlinkConfirmationTitle"; +NSString *const kStr_UnlinkConfirmationMessage = @"UnlinkConfirmationMessage"; +NSString *const kStr_UnlinkConfirmationActionTitle = @"UnlinkConfirmationActionTitle"; +NSString *const kStr_UpdateEmailAlertMessage = @"UpdateEmailAlertMessage"; +NSString *const kStr_UpdateEmailVerificationAlertMessage = @"UpdateEmailVerificationAlertMessage"; +NSString *const kStr_EditEmailTitle = @"EditEmailTitle"; +NSString *const kStr_EditNameTitle = @"EditNameTitle"; +NSString *const kStr_AddPasswordAlertMessage = @"AddPasswordAlertMessage"; +NSString *const kStr_EditPasswordAlertMessage = @"EditPasswordAlertMessage"; +NSString *const kStr_ReauthenticateEditPasswordAlertMessage = @"ReauthenticateEditPasswordAlertMessage"; +NSString *const kStr_AddPasswordTitle = @"AddPasswordTitle"; +NSString *const kStr_EditPasswordTitle = @"EditPasswordTitle"; +NSString *const kStr_ProviderTitlePassword = @"ProviderTitlePassword"; +NSString *const kStr_ProviderTitleGoogle = @"ProviderTitleGoogle"; +NSString *const kStr_ProviderTitleFacebook = @"ProviderTitleFacebook"; +NSString *const kStr_ProviderTitleTwitter = @"ProviderTitleTwitter"; +NSString *const kStr_SignInWithProvider = @"SignInWithProvider"; +NSString *const kStr_PlaceholderEnterName = @"PlaceholderEnterName"; +NSString *const kStr_PlaceholderEnterEmail = @"PlaceholderEnterEmail"; +NSString *const kStr_PlaceholderEnterPassword = @"PlaceholderEnterPassword"; +NSString *const kStr_PlaceholderChosePassword = @"PlaceholderChosePassword"; +NSString *const kStr_PlaceholderNewPassword = @"PlaceholderNewPassword"; +NSString *const kStr_ForgotPasswordTitle = @"ForgotPasswordTitle"; + +/** @var kKeyNotFound + @brief The value returned if the key is not found in the table. + */ +NSString *const kKeyNotFound = @"KeyNotFound"; + +/** @var kTableName + @brief The name of the strings table to search for localized strings. + */ +NSString *const kTableName = @"FirebaseAuthUI"; + +NSString *FUILocalizedString(NSString *key) { + return FUILocalizedStringFromTable(key, kTableName); +} + +NSString *FUILocalizedStringFromTable(NSString *key, NSString *table) { + return FUILocalizedStringFromTableInBundle(key, table, kTableName); +} + +NSString *FUILocalizedStringFromTableInBundle(NSString *key, + NSString *table, + NSString *_Nullable bundleName) { + // Don't load defaultAuthUI if the default app isn't configured. We don't recommend + // people do this in our docs, but if for whatever reason they want to use a custom + // app, this code shouldn't crash. + if ([FIRApp defaultApp] != nil) { + NSBundle *customStringsBundle = [FUIAuth defaultAuthUI].customStringsBundle; + if (customStringsBundle) { + NSString *localizedString = [customStringsBundle localizedStringForKey:key + value:kKeyNotFound + table:table]; + if (![kKeyNotFound isEqual:localizedString]) { + return localizedString; + } + } + } + NSBundle *frameworkBundle = [FUIAuthUtils bundleNamed:bundleName]; + if (frameworkBundle == nil) { + frameworkBundle = [NSBundle mainBundle]; + } + return [frameworkBundle localizedStringForKey:key value:nil table:table]; +} + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableHeaderView.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableHeaderView.h new file mode 100644 index 00000000..ed6ffd43 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableHeaderView.h @@ -0,0 +1,34 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +/** @class FUIAuthTableHeaderView + @brief A table header view that contains a title label and a detail label. + */ +@interface FUIAuthTableHeaderView : UIView + +/** @property titleLabel + @brief The title label in this table header view. + */ +@property(nonatomic, strong) UILabel *titleLabel; + +/** @property detailLabel + @brief The detail label in this table header view. + */ +@property(nonatomic, strong) UILabel *detailLabel; + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableHeaderView.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableHeaderView.m new file mode 100644 index 00000000..19b29f9f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableHeaderView.m @@ -0,0 +1,83 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthTableHeaderView.h" + +/** @var kLabelHorizontalMargin + @brief The horizontal margin around any @c UILabel. + */ +static const CGFloat kLabelHorizontalMargin = 8.0f; + +/** @var kLabelVerticalMargin + @brief The veritcal margin around any @c UILabel. + */ +static const CGFloat kLabelVerticalMargin = 16.0f; + +@implementation FUIAuthTableHeaderView + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.font = [UIFont boldSystemFontOfSize:16.0f]; + [self addSubview:_titleLabel]; + + _detailLabel = [[UILabel alloc] init]; + _detailLabel.font = [UIFont systemFontOfSize:14.0f]; + _detailLabel.numberOfLines = 0; + [self addSubview:_detailLabel]; + } + return self; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + + [_titleLabel sizeToFit]; + + CGRect contentRect = CGRectInset(self.bounds, kLabelHorizontalMargin, kLabelVerticalMargin); + CGRect titleLabelFrame, detailLabelFrame, space; + CGRectDivide(contentRect, &titleLabelFrame, &contentRect, + CGRectGetHeight(_titleLabel.frame), CGRectMinYEdge); + CGRectDivide(contentRect, &space, &detailLabelFrame, kLabelVerticalMargin, CGRectMinYEdge); + + _titleLabel.frame = titleLabelFrame; + _detailLabel.frame = detailLabelFrame; +} + +- (CGSize)sizeThatFits:(CGSize)size { + CGFloat labelWidth = size.width - kLabelHorizontalMargin * 2; + CGFloat titleLabelHeight = [[self class] sizeForLabel:_titleLabel maxWidth:labelWidth].height; + CGFloat detailLabelHeight = [[self class] sizeForLabel:_detailLabel maxWidth:labelWidth].height; + CGFloat height = titleLabelHeight + detailLabelHeight + kLabelVerticalMargin * 3; + return CGSizeMake(size.width, height); +} + +#pragma mark - Utility + +/** @fn sizeForLabel:maxWidth: + @brief Calculate the with of the @c UILabel with the given maximum width. + @return The calculated size. + */ ++ (CGSize)sizeForLabel:(UILabel *)label maxWidth:(CGFloat)maxWidth { + CGRect rect = [label.text boundingRectWithSize:CGSizeMake(maxWidth, CGFLOAT_MAX) + options:NSStringDrawingUsesLineFragmentOrigin + attributes:@{ NSFontAttributeName : label.font } + context:nil]; + return CGRectIntegral(rect).size; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.h new file mode 100644 index 00000000..e8357c5d --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.h @@ -0,0 +1,38 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIAuthTableViewCell + @brief A common table view cell that can be used in multiple view controllers. + */ +@interface FUIAuthTableViewCell : UITableViewCell + +/** @property label + @brief The label that describes the purpose of @c textField. + */ +@property(nonatomic, strong) IBOutlet UILabel *label; + +/** @property textField + @brief The text field that collects user's input. + */ +@property(nonatomic, strong) IBOutlet UITextField *textField; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.m new file mode 100644 index 00000000..443e9c75 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.m @@ -0,0 +1,35 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthTableViewCell.h" + +@implementation FUIAuthTableViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + + if (@available(iOS 13.0, *)) { + self.textField.textColor = [UIColor labelColor]; + self.label.textColor = [UIColor labelColor]; + } +} + +- (void)setLabel:(UILabel *)label { + _label = label; + [self layoutIfNeeded]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.xib b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.xib new file mode 100644 index 00000000..4060491f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthTableViewCell.xib @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthUtils.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthUtils.h new file mode 100644 index 00000000..10bc8b06 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthUtils.h @@ -0,0 +1,56 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/* Name of the FirebaseAuthUI resource bundle. */ +extern NSString *const FUIAuthBundleName; + +/** @class FUIAuthUtils + @brief Provides utility methods for Firebase Auth UI. + */ +@interface FUIAuthUtils : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** @fn bundleNamed: + @brief Gets the framework bundle for specified name + @param bundleName Name of the bundle to retreive. If nil, this returns the default bundle for + FirebaseUI. + */ ++ (nullable NSBundle *)bundleNamed:(nullable NSString *)bundleName; + +/** @fn imageNamed:fromBundle: + @brief Gets a UIImage with the given name, assuming it's a png. + @param name Name of the image to retreive. + @param bundleNameOrNil Name of the bundle to retreive. If nil, this method will look into the + default FirebaseUI framework bundle. + */ ++ (nullable UIImage *)imageNamed:(NSString *)name fromBundleNameOrNil:(nullable NSString *)bundleNameOrNil; + +/** @fn imageNamed:fromBundle: + @brief Gets a UIImage with the given name, assuming it's a png. + @param name Name of the image to retreive. + @param bundle The bundle to retrieve the image from. If nil, this method will look into the + default FirebaseUI framework bundle. + */ ++ (nullable UIImage *)imageNamed:(NSString *)name fromBundle:(nullable NSBundle *)bundle; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthUtils.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthUtils.m new file mode 100644 index 00000000..e6eb7d91 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuthUtils.m @@ -0,0 +1,59 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuthUtils.h" + +NSString *const FUIAuthBundleName = @"FirebaseAuthUI"; + +@implementation FUIAuthUtils + ++ (nullable NSBundle *)bundleNamed:(nullable NSString *)bundleName { + NSBundle *frameworkBundle = nil; + if (!bundleName) { + bundleName = FUIAuthBundleName; + } + NSString *path = [[NSBundle mainBundle] pathForResource:bundleName ofType:@"bundle"]; + if (!path) { + // Check framework resources if bundle isn't present in main bundle. + path = [[NSBundle mainBundle] pathForResource:bundleName ofType:@"framework"]; + } + frameworkBundle = [NSBundle bundleWithPath:path]; + if (!frameworkBundle) { + frameworkBundle = [NSBundle bundleForClass:[self class]]; + } + return frameworkBundle; +} + ++ (nullable UIImage *)imageNamed:(NSString *)name fromBundle:(nullable NSBundle *)bundle { + if (!bundle) { + bundle = [self bundleNamed:nil]; + } + NSString *path = [bundle pathForResource:name ofType:@"png"]; + if (!path) { + NSLog(@"Warning: Unable to find asset %@ in bundle %@.", name, bundle); + } + return [UIImage imageWithContentsOfFile:path]; +} + ++ (nullable UIImage *)imageNamed:(NSString *)name fromBundleNameOrNil:(nullable NSString *)bundleNameOrNil { + NSString *path = [[FUIAuthUtils bundleNamed:bundleNameOrNil] pathForResource:name ofType:@"png"]; + if (!path) { + NSLog(@"Warning: Unable to find asset %@ in bundle named %@.", name, bundleNameOrNil); + } + return [UIImage imageWithContentsOfFile:path]; +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth_Internal.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth_Internal.h new file mode 100644 index 00000000..9da1d27e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth_Internal.h @@ -0,0 +1,100 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIAuth.h" + +@class FUIAuthBaseViewController; + +/** @typedef FUIEmailHintSignInCallback + @brief The type of block invoked when an emailHint sign-in event completes. + + @param authResult Optionally; Result of sign-in request containing both the user and + the additional user info associated with the user. + @param error Optionally; the error which occurred - or nil if the request was successful. + @param credential Optionally; The credential used to sign-in. + */ +typedef void (^FUIEmailHintSignInCallback)(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error, + FIRAuthCredential *_Nullable credential); + +NS_ASSUME_NONNULL_BEGIN + + +/** + * The methods defined in this file are for use in the FirebaseUI provider libraries. + * They may break in non-major releases and are not for public use. + */ +@protocol FUIEmailAuthProvider + +- (void)handleAccountLinkingForEmail:(NSString *)email + newCredential:(FIRAuthCredential *)newCredential + presentingViewController:(UIViewController *)presentingViewController + signInResult:(_Nullable FIRAuthResultCallback)result; + +- (void)signInWithEmailHint:(NSString *)emailHint + presentingViewController:(FUIAuthBaseViewController *)presentingViewController + originalError:(NSError *)originalError + completion:(FUIEmailHintSignInCallback)completion; + +@end + +@interface FUIAuth () + +/** @fn invokeResultCallbackWithAuthDataResult:error: + @brief Invokes the auth UI result callback. + @param authDataResult The sign in data result, if any. + @param url The url, if any. + @param error The error which occurred, if any. + */ +- (void)invokeResultCallbackWithAuthDataResult:(nullable FIRAuthDataResult *)authDataResult + URL:(nullable NSURL *)url + error:(nullable NSError *)error; + +/** @fn invokeOperationCallback:error: + @brief Invokes the auth UI operation callback. + @param operation The executed operation. + @param error The error which occurred, if any. + */ +- (void)invokeOperationCallback:(FUIAccountSettingsOperationType)operation + error:(NSError *_Nullable)error; + + +/** @fn providerWithID: + @brief Returns first provider (if it exists) with specified provider ID. + @param providerID The ID of the provider. + */ +- (nullable id)providerWithID:(NSString *)providerID; + +/** @fn signInWithProviderUI:presentingViewController:defaultValue: + @brief Signs in with specified provider. + @see FUIAuthDelegate.authUI:didSignInWithAuthDataResult:URL:error: for method callback. + @param providerUI The authentication provider used for signing in. + @param presentingViewController The view controller used to present the UI. + @param defaultValue The provider default initialization value (e.g. email or phone number) + used for signing in. + */ +- (void)signInWithProviderUI:(id)providerUI + presentingViewController:(UIViewController *)presentingViewController + defaultValue:(nullable NSString *)defaultValue; + +/** @property emailAuthProvider + @brief The email auth provider, if any, that will be displayed in the default sign-in UI. + */ +@property(nonatomic, weak, nullable) id emailAuthProvider; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIPrivacyAndTermsOfServiceView.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIPrivacyAndTermsOfServiceView.h new file mode 100644 index 00000000..ca75c72b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIPrivacyAndTermsOfServiceView.h @@ -0,0 +1,56 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +@class FUIAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FUIPrivacyAndTermsOfServiceView : UITextView + +/** @fn useFullMessage + @brief Display Privacy and Terms of Service message in full form. + */ +- (void)useFullMessage; + +/** @fn useFooterMessage + @brief Display Privacy and Terms of Service link, which usually are placed as footer. + */ +- (void)useFooterMessage; + +/** @property authUI + @brief the @c FUIAuth instance whose bundle will be used to populate the view's terms of service and + privacy policy content. If this property is nil, the default @c FUIAuth instance's terms of service and + privacy policy will be used. + */ +@property(nonatomic, strong, nullable) FUIAuth *authUI; + +@end + +@interface FUIPrivacyAndTermsOfServiceView (Protected) + +/** @fn privacyPolicyAndTOSMessageFromFormat: + @brief produce the Privacy and Terms of Service attributed string based on a customized format. + @param format the customized format with two placeholder for Privacy and Terms of Service + respectively. + @return the Privacy and Terms of Service attributed string. + */ +- (NSAttributedString *)privacyPolicyAndTOSMessageFromFormat:(NSString *)format; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIPrivacyAndTermsOfServiceView.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIPrivacyAndTermsOfServiceView.m new file mode 100644 index 00000000..c07d3d6e --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIPrivacyAndTermsOfServiceView.m @@ -0,0 +1,98 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIPrivacyAndTermsOfServiceView.h" + +#import +#import "FUIAuth.h" +#import "FUIAuthStrings.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FUIPrivacyAndTermsOfServiceView + +#pragma mark - Public + +- (void)useFullMessage { + NSAttributedString *fullMessage = [self fullPrivacyPolicyAndTOSMessage]; + self.attributedText = fullMessage; + self.textAlignment = NSTextAlignmentLeft; +} + +- (void)useFooterMessage { + NSAttributedString *footerMessage = [self footerPrivacyPolicyAndTOSMessage]; + self.attributedText = footerMessage; + self.textAlignment = NSTextAlignmentRight; +} + +#pragma mark - Protected + +- (NSAttributedString *)privacyPolicyAndTOSMessageFromFormat:(NSString *)format { + FUIAuth *authUI = self.authUI ?: [FUIAuth defaultAuthUI]; + NSURL *TOSURL = authUI.TOSURL; + NSURL *privacyPolicyURL = authUI.privacyPolicyURL; + NSUInteger TOSURLStringLength = TOSURL.absoluteString.length; + NSUInteger privacyPolicyURLStringLength = privacyPolicyURL.absoluteString.length; + + if (!TOSURLStringLength && !privacyPolicyURLStringLength) { + return nil; + } + if (!TOSURLStringLength || !privacyPolicyURLStringLength) { + NSLog(@"The terms of service and privacy policy URLs for your app must be provided together. Pl" + "ease set the terms of service policy using [FUIAuth defaultAuthUI].TOSURL and the privacy" + " policy URL using [FUIAuth defaultAuthUI].privacyPolicyURL"); + return nil; + } + NSString *termsOfServiceString = FUILocalizedString(kStr_TermsOfService); + NSString *privacyPolicyString = FUILocalizedString(kStr_PrivacyPolicy); + NSString *privacyPolicyAndTOSString = + [NSString stringWithFormat:format, termsOfServiceString, privacyPolicyString]; + NSMutableAttributedString *attributedLinkText = nil; + + if (@available(iOS 13.0, *)) { + attributedLinkText = [[NSMutableAttributedString alloc] initWithString:privacyPolicyAndTOSString + attributes:@{NSForegroundColorAttributeName: [UIColor labelColor]}]; + } else { + attributedLinkText = [[NSMutableAttributedString alloc] initWithString:privacyPolicyAndTOSString]; + } + + NSRange TOSRange = [privacyPolicyAndTOSString rangeOfString:termsOfServiceString]; + if (TOSRange.length) { + [attributedLinkText addAttribute:NSLinkAttributeName value:TOSURL range:TOSRange]; + } + + NSRange privacyPolicyRange = [privacyPolicyAndTOSString rangeOfString:privacyPolicyString]; + if (privacyPolicyRange.length) { + [attributedLinkText addAttribute:NSLinkAttributeName + value:privacyPolicyURL + range:privacyPolicyRange]; + } + return attributedLinkText; +} + +#pragma mark - Private + +- (NSAttributedString *)fullPrivacyPolicyAndTOSMessage { + return [self privacyPolicyAndTOSMessageFromFormat:FUILocalizedString(kStr_TermsOfServiceMessage)]; +} + +- (NSAttributedString *)footerPrivacyPolicyAndTOSMessage { + return [self privacyPolicyAndTOSMessageFromFormat:@"%@ %@"]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.h new file mode 100644 index 00000000..333f60ee --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.h @@ -0,0 +1,98 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +#import "FUIAuthBaseViewController.h" +#import "FUIStaticContentTableViewManager.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @class FUIStaticContentTableViewController + @brief The view controller which presents contents of @c FUIStaticContentTableViewContent. + controller has footer and header views. + */ +@interface FUIStaticContentTableViewController : FUIAuthBaseViewController + +/** @fn initWithContents:nextTitle:nextAction + @brief Convenience initializer. View controller doesn't have header and footer sections. + @param contents The contents of the table view presented in the controller. + @param nextTitle Text displayed on the navigation bar title. + @param nextAction Action triggered on the right bar item of @C UINavigationController + */ +- (instancetype)initWithContents:(nullable FUIStaticContentTableViewContent *)contents + nextTitle:(nullable NSString *)nextTitle + nextAction:(nullable FUIStaticContentTableViewCellAction)nextAction; + +// TODO: set nextAction param last arg +/** @fn initWithContents:nextTitle:nextAction:headerText: + @brief Convenience initializer. View controller doesn't have footer section. + @param contents The contents of the table view presented in the controller. + @param nextTitle Text displayed on the navigation bar title. + @param nextAction Action triggered on the right bar item of @C UINavigationController + @param headerText Text displayed at the header view controller. + */ +- (instancetype)initWithContents:(nullable FUIStaticContentTableViewContent *)contents + nextTitle:(nullable NSString *)nextTitle + nextAction:(nullable FUIStaticContentTableViewCellAction)nextAction + headerText:(nullable NSString *)headerText; + +/** @fn initWithContents:nextTitle:nextAction:headerText:footerText:footerAction: + @brief Designated initializer. + @param contents The contents of the table view presented in the controller. + @param actionTitle Text displayed on the navigation bar title. + @param nextAction Action triggered on the right bar item of @C UINavigationController + @param headerText Text displayed at the header view controller. + @param footerText Text displayed at the footer of view controller. + @param footerAction Action triggered when user taps on the footer. + */ +- (instancetype)initWithContents:(nullable FUIStaticContentTableViewContent *)contents + nextTitle:(nullable NSString *)actionTitle + nextAction:(nullable FUIStaticContentTableViewCellAction)nextAction + headerText:(nullable NSString *)headerText + footerText:(nullable NSString *)footerText + footerAction:(nullable FUIStaticContentTableViewCellAction)footerAction + NS_DESIGNATED_INITIALIZER; + +/** @fn init + @brief Please use @c initWithContents:nextTitle:nextAction:headerText:footerText:footerAction:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithNibName:bundle: + @brief Please use @c initWithContents:nextTitle:nextAction:headerText:footerText:footerAction:. + */ +- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil + bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE; + +/** @fn initWithCoder: + @brief Please use @c initWithContents:nextTitle:nextAction:headerText:footerText:footerAction:. + */ +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE; + +/** @fn initWithNibName:bundle:authUI: + @brief Please use @c initWithContents:nextTitle:nextAction:headerText:footerText:footerAction:. + @param nibNameOrNil The name of the nib file to associate with the view controller. + @param nibBundleOrNil The bundle in which to search for the nib file. + @param authUI The @c FUIAuth instance that manages this view controller. + */ +- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil + bundle:(nullable NSBundle *)nibBundleOrNil + authUI:(FUIAuth *)authUI NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.m new file mode 100644 index 00000000..93f0a631 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.m @@ -0,0 +1,137 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIStaticContentTableViewController.h" + +#import "FUIAuth.h" +#import "FUIAuthBaseViewController_Internal.h" +#import "FUIAuthUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kSaveButtonAccessibilityID + @brief The Accessibility Identifier for the @c next button. + */ +static NSString *const kNextButtonAccessibilityID = @"NextButtonAccessibilityID"; + +@interface FUIStaticContentTableViewController () +{ + NSString *_headerText; + NSString *_footerText; + NSString *_actionTitle; + __weak IBOutlet UILabel *_headerLabel; + __weak IBOutlet UITableView *_tableView; + __weak IBOutlet UIButton *_footerButton; + FUIStaticContentTableViewManager *_tableViewManager; + FUIStaticContentTableViewCellAction _nextAction; + FUIStaticContentTableViewCellAction _footerAction; +} +@end + +@implementation FUIStaticContentTableViewController + +- (instancetype)initWithContents:(nullable FUIStaticContentTableViewContent *)contents + nextTitle:(nullable NSString *)nextTitle + nextAction:(nullable FUIStaticContentTableViewCellAction)nextAction { + return [self initWithContents:contents nextTitle:nextTitle nextAction:nextAction headerText:nil]; +} + +- (instancetype)initWithContents:(nullable FUIStaticContentTableViewContent *)contents + nextTitle:(nullable NSString *)nextTitle + nextAction:(nullable FUIStaticContentTableViewCellAction)nextAction + headerText:(nullable NSString *)headerText { + return [self initWithContents:contents + nextTitle:nextTitle + nextAction:nextAction + headerText:headerText + footerText:nil + footerAction:nil]; +} + +- (instancetype)initWithContents:(nullable FUIStaticContentTableViewContent *)contents + nextTitle:(nullable NSString *)actionTitle + nextAction:(nullable FUIStaticContentTableViewCellAction)nextAction + headerText:(nullable NSString *)headerText + footerText:(nullable NSString *)footerText + footerAction:(nullable FUIStaticContentTableViewCellAction)footerAction { + if (self = [super initWithNibName:NSStringFromClass([self class]) + bundle:[FUIAuthUtils bundleNamed:FUIAuthBundleName] + authUI:[FUIAuth defaultAuthUI]]) { + _tableViewManager.contents = contents; + _nextAction = [nextAction copy]; + _footerAction = [footerAction copy]; + _headerText = [headerText copy]; + _footerText = [footerText copy]; + _actionTitle = [actionTitle copy]; + + UIBarButtonItem *actionButtonItem = + [FUIAuthBaseViewController barItemWithTitle:_actionTitle + target:self + action:@selector(onNext)]; + actionButtonItem.accessibilityIdentifier = kNextButtonAccessibilityID; + self.navigationItem.rightBarButtonItem = actionButtonItem; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + _tableViewManager = [[FUIStaticContentTableViewManager alloc] init]; + _tableViewManager.tableView = _tableView; + _tableView.delegate = _tableViewManager; + _tableView.dataSource = _tableViewManager; + if (_headerText) { + _headerLabel.text = _headerText; + } else { + _tableView.tableHeaderView = nil; + } + if (!_footerText) { + _tableView.tableFooterView.hidden = YES; + } else { + [_footerButton setTitle:_footerText forState:UIControlStateNormal]; + } + + [self enableDynamicCellHeightForTableView:_tableView]; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + [self updateHeaderSize]; +} + +- (void)updateHeaderSize { + _headerLabel.preferredMaxLayoutWidth = _headerLabel.bounds.size.width; + CGFloat height = [_tableView.tableHeaderView + systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; + CGRect frame = _tableView.tableHeaderView.frame; + frame.size.height = height; + _tableView.tableHeaderView.frame = frame; +} + +- (void)onNext { + if (_nextAction) { + _nextAction(); + } +} +- (IBAction)onFooterAction:(id)sender { + if (_footerAction) { + _footerAction(); + } +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.xib b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.xib new file mode 100644 index 00000000..04a2b42b --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewController.xib @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewManager.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewManager.h new file mode 100644 index 00000000..fe0df2cc --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewManager.h @@ -0,0 +1,311 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +#pragma mark - Forward Declarations + +@class FUIStaticContentTableViewCell; +@class FUIStaticContentTableViewContent; +@class FUIStaticContentTableViewSection; + +NS_ASSUME_NONNULL_BEGIN + +#pragma mark - Block Type Definitions + +/** @typedef FUIStaticContentTableViewCellAction + @brief The type of block invoked when a cell is tapped. + */ +typedef void(^FUIStaticContentTableViewCellAction)(void); + +#pragma mark - + +/** @class FUIStaticContentTableViewManager + @brief Generic class useful for populating a @c UITableView with static content. + */ +@interface FUIStaticContentTableViewManager : NSObject + +/** @property contents + @brief The static contents of the @c UITableView. + @remarks Setting this property will reload the @c UITableView. + */ +@property(nonatomic, strong, nullable) FUIStaticContentTableViewContent *contents; + +/** @property tableView + @brief A reference to the managed @c UITableView. + @remarks This is needed to automatically reload the table view when the @c contents are changed. + */ +@property(nonatomic, weak, nullable) IBOutlet UITableView *tableView; + +@end + +#pragma mark - + +/** @class FUIStaticContentTableViewContent + @brief Represents the contents of a @c UITableView. + */ +@interface FUIStaticContentTableViewContent : NSObject + +/** @property sections + @brief The sections for the @c UITableView. + */ +@property(nonatomic, copy, readonly, nullable) + NSArray *sections; + +/** @fn contentWithSections: + @brief Convenience factory method for creating a new instance of + @c FUIStaticContentTableViewContent. + @param sections The sections for the @c UITableView. + */ ++ (instancetype)contentWithSections:(nullable NSArray *)sections; + +/** @fn init + @brief Please use initWithSections: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithSections: + @brief Designated initializer. + @param sections The sections in the @c UITableView. + */ +- (instancetype)initWithSections:(nullable NSArray *)sections; + +@end + +#pragma mark - + +/** @class FUIStaticContentTableViewSection + @brief Represents a section in a @c UITableView. + @remarks Each section has a title (used for the section title in the @c UITableView) and an + array of cells. + */ +@interface FUIStaticContentTableViewSection : NSObject + +/** @property title + @brief The title of the section in the @c UITableView. + */ +@property(nonatomic, copy, readonly, nullable) NSString *title; + +/** @property cells + @brief The cells in this section of the @c UITableView. + */ +@property(nonatomic, copy, readonly, nullable) NSArray *cells; + +/** @fn sectionWithTitle:cells: + @brief Convenience factory method for creating a new instance of + @c FUIStaticContentTableViewSection. + @param title The title of the section in the @c UITableView. + @param cells The cells in this section of the @c UITableView. + */ ++ (instancetype) sectionWithTitle:(nullable NSString *)title + cells:(nullable NSArray *)cells; + +/** @fn init + @brief Please use initWithTitle:cells: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** @fn initWithTitle:cells: + @brief Designated initializer. + @param title The title of the section in the @c UITableView. + @param cells The cells in this section of the @c UITableView. + */ +- (instancetype)initWithTitle:(nullable NSString *)title + cells:(nullable NSArray *)cells; + +@end + +#pragma mark - + +/** @typedef FUIStaticContentTableViewCellType + @brief Defines all possible styles of @c FUIStaticContentTableViewCell. + */ +typedef NS_ENUM(NSInteger, FUIStaticContentTableViewCellType) { + FUIStaticContentTableViewCellTypeDefault = 0, + FUIStaticContentTableViewCellTypeButton, + FUIStaticContentTableViewCellTypeInput, + FUIStaticContentTableViewCellTypePassword +}; + +/** @class FUIStaticContentTableViewCell + @brief Represents a cell in a @c UITableView. + */ +@interface FUIStaticContentTableViewCell : NSObject + +/** @property title + @brief The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + */ +@property(nonatomic, copy, readonly, nullable) NSString *title; + +/** @property value + @brief The text of the @c detailTextLabel of the @c FUIStaticContentTableViewCell. + */ +@property(nonatomic, copy, nullable) NSString *value; + +/** @property placeholder + @brief The text of the placeholder or hint of the @c FUIStaticContentTableViewCell. + */ +@property(nonatomic, copy, nullable) NSString *placeholder; + +/** @property type + @brief Style of displaying cell. Default value is @c FUIStaticContentTableViewCellTypeDefault + */ +@property(nonatomic, assign) FUIStaticContentTableViewCellType type; + +/** @property action + @brief A block which is executed when the cell is selected. + @remarks Avoid retain cycles. Since these blocked are retained here, and your + @c UIViewController's object graph likely retains this object, you don't want these blocks + to retain your @c UIViewController. The easiest thing is just to create a weak reference to + your @c UIViewController and pass it a message as the only thing the block does. + */ +@property(nonatomic, copy, readonly, nullable) FUIStaticContentTableViewCellAction action; + +/** @fn cellWithTitle: + @brief Convenience factory method for a new instance of @c FUIStaticContentTableViewCell. + @param title The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + */ ++ (instancetype)cellWithTitle:(nullable NSString *)title; + +/** @fn cellWithTitle:value: + @brief Convenience factory method for a new instance of @c FUIStaticContentTableViewCell. + @param title The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + @param value The text of the @c detailTextLabel of the @c FUIStaticContentTableViewCell. + */ ++ (instancetype)cellWithTitle:(nullable NSString *)title + value:(nullable NSString *)value; + +/** @fn cellWithTitle:action: + @brief Convenience factory method for a new instance of @c FUIStaticContentTableViewCell. + @param title The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + @param action A block which is executed when the cell is selected. + */ ++ (instancetype)cellWithTitle:(nullable NSString *)title + action:(nullable FUIStaticContentTableViewCellAction)action; + +/** @fn cellWithTitle:action:type: + @brief Convenience factory method for a new instance of @c FUIStaticContentTableViewCell. + @param title The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + @param type Style of displaying cell. + @param action A block which is executed when the cell is selected. + */ ++ (instancetype)cellWithTitle:(nullable NSString *)title + type:(FUIStaticContentTableViewCellType) type + action:(nullable FUIStaticContentTableViewCellAction)action; + +/** @fn cellWithTitle:value:action: + @brief Convenience factory method for a new instance of @c FUIStaticContentTableViewCell. + @param title The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + @param value The text of the @c detailTextLabel of the @c FUIStaticContentTableViewCell. + @param action A block which is executed when the cell is selected. + */ ++ (instancetype)cellWithTitle:(nullable NSString *)title + value:(nullable NSString *)value + action:(nullable FUIStaticContentTableViewCellAction)action; + +/** @fn cellWithTitle:value:type:action: + @brief Convenience factory method for a new instance of @c FUIStaticContentTableViewCell. + @param title The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + @param value The text of the @c detailTextLabel of the @c FUIStaticContentTableViewCell. + @param type Style of displaying cell. + @param action A block which is executed when the cell is selected. + */ ++ (instancetype)cellWithTitle:(nullable NSString *)title + value:(nullable NSString *)value + type:(FUIStaticContentTableViewCellType) type + action:(nullable FUIStaticContentTableViewCellAction)action; + +/** @fn cellWithTitle:value:type:action: + @brief Convenience factory method for a new instance of @c FUIStaticContentTableViewCell. + @param title The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + @param value The text of the @c detailTextLabel of the @c FUIStaticContentTableViewCell. + @param placeholder The placeholder of input filed, if any. + @param action A block which is executed when the cell is selected. + @param type Style of displaying cell. + */ ++ (instancetype)cellWithTitle:(nullable NSString *)title + value:(nullable NSString *)value + placeholder:(nullable NSString *)placeholder + type:(FUIStaticContentTableViewCellType) type + action:(nullable FUIStaticContentTableViewCellAction)action; + +/** @fn initWithTitle:value:action:type: + @brief Designated initializer. + @param title The text of the @c titleLabel of the @c FUIStaticContentTableViewCell. + @param value The text of the @c detailTextLabel of the @c FUIStaticContentTableViewCell. + @param placeholder The placeholder of input filed, if any. + @param type Style of displaying cell. + @param action A block which is executed when the cell is selected. + */ +- (instancetype)initWithTitle:(nullable NSString *)title + value:(nullable NSString *)value + placeholder:(nullable NSString *)placeholder + type:(FUIStaticContentTableViewCellType) type + action:(nullable FUIStaticContentTableViewCellAction)action + NS_DESIGNATED_INITIALIZER; + +/** @fn init + @brief Please use initWithTitle:value:action:type: + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +/** @class FUIPasswordTableViewCell + @brief Represents a cell in a @c UITableView. This cell has password input field. + */ +@interface FUIPasswordTableViewCell : UITableViewCell + +/** @var cellData + @brief Used to retrieve modified value of the cell. + */ +@property (nonatomic) FUIStaticContentTableViewCell *cellData; + +/** @var title + @brief The title label of the cell. + */ +@property (weak, nonatomic) IBOutlet UILabel *title; + +/** @var password + @brief The password inout field of the cell. + */ +@property (weak, nonatomic) IBOutlet UITextField *password; + +@end + +/** @class FUIInputTableViewCell + @brief Represents a cell in a @c UITableView. This cell has regular input field. + */ +@interface FUIInputTableViewCell : UITableViewCell + +/** @var cellData + @brief Used to retrieve modified value of the cell. + */ +@property (nonatomic) FUIStaticContentTableViewCell *cellData; + +/** @var title + @brief The title label of the cell. + */ +@property (weak, nonatomic) IBOutlet UILabel *title; + +/** @var password + @brief The inout field of the cell. + */ +@property (weak, nonatomic) IBOutlet UITextField *input; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewManager.m b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewManager.m new file mode 100644 index 00000000..56dc4f48 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIStaticContentTableViewManager.m @@ -0,0 +1,319 @@ +// +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIStaticContentTableViewManager.h" + +#import "FUIAuthUtils.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @var kCellReuseIdentitfier + @brief The reuse identifier for default style table view cell. + */ +static NSString *const kCellReuseIdentitfier = @"reuseIdentifier"; + +/** @var kValueCellReuseIdentitfier + @brief The reuse identifier for value style table view cell. + */ +static NSString *const kValueCellReuseIdentitfier = @"reuseValueIdentifier"; + +/** @var kPasswordCellReuseIdentitfier + @brief The reuse identifier for password style table view cell. + */ +static NSString *const kPasswordCellReuseIdentitfier = @"passwordCellReuseIdentitfier"; + +/** @var kInputCellReuseIdentitfier + @brief The reuse identifier for input style table view cell. + */ +static NSString *const kInputCellReuseIdentitfier = @"inputCellReuseIdentitfier"; + +/** @var kVisibilityOffImage + @brief Name of icon to show current password in secure input field. + */ +static NSString *const kVisibilityOffImage = @"ic_visibility_off.png"; + +/** @var kVisibilityOnImage + @brief Name of icon to show current password in secure input field. + */ +static NSString *const kVisibilityOnImage = @"ic_visibility.png"; + +#pragma mark - + +@implementation FUIStaticContentTableViewManager + +- (void)setContents:(nullable FUIStaticContentTableViewContent *)contents { + _contents = contents; + [self.tableView reloadData]; +} + +- (void)setTableView:(nullable UITableView *)tableView { + _tableView = tableView; + [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kCellReuseIdentitfier]; + + UINib *passwordCellNib = [UINib nibWithNibName:NSStringFromClass([FUIPasswordTableViewCell class]) + bundle:[FUIAuthUtils bundleNamed:FUIAuthBundleName]]; + [tableView registerNib:passwordCellNib forCellReuseIdentifier:kPasswordCellReuseIdentitfier]; + + UINib *inputCellNib = [UINib nibWithNibName:NSStringFromClass([FUIInputTableViewCell class]) + bundle:[FUIAuthUtils bundleNamed:FUIAuthBundleName]]; + [tableView registerNib:inputCellNib forCellReuseIdentifier:kInputCellReuseIdentitfier]; +} + +#pragma mark - UITableViewDataSource + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return _contents.sections.count; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return _contents.sections[section].cells.count; +} + +- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + return _contents.sections[section].title; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView + cellForRowAtIndexPath:(NSIndexPath *)indexPath{ + FUIStaticContentTableViewCell *cellData = + _contents.sections[indexPath.section].cells[indexPath.row]; + UITableViewCell *cell; + if (cellData.type == FUIStaticContentTableViewCellTypePassword) { + return [self dequeuePasswordCell:cellData tableView:tableView]; + } else if (cellData.type == FUIStaticContentTableViewCellTypeInput) { + return [self dequeueInputCell:cellData tableView:tableView]; + } else if (cellData.value.length) { + cell = [tableView dequeueReusableCellWithIdentifier:kValueCellReuseIdentitfier]; + if (!cell) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 + reuseIdentifier:kValueCellReuseIdentitfier]; + cell.detailTextLabel.adjustsFontSizeToFitWidth = YES; + cell.detailTextLabel.minimumScaleFactor = 0.5; + } + } else { + // kCellReuseIdentitfier has already been registered. + cell = [tableView dequeueReusableCellWithIdentifier:kCellReuseIdentitfier + forIndexPath:indexPath]; + } + cell.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + cell.detailTextLabel.text = cellData.value; + cell.textLabel.text = cellData.title; + cell.accessoryType = cellData.action && + cellData.type == FUIStaticContentTableViewCellTypeDefault ? + UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; + cell.textLabel.textColor = cellData.type == FUIStaticContentTableViewCellTypeButton ? + [UIColor blueColor] : [UIColor blackColor]; + cell.selectionStyle = cellData.action ? UITableViewCellSelectionStyleDefault : + UITableViewCellSelectionStyleNone; + return cell; +} + +- (UITableViewCell *)dequeuePasswordCell:(FUIStaticContentTableViewCell *)cellData + tableView:(UITableView *)tableView{ + FUIPasswordTableViewCell *cell = + [tableView dequeueReusableCellWithIdentifier:kPasswordCellReuseIdentitfier]; + cell.title.text = cellData.title; + cell.password.text = cellData.value; + cell.password.placeholder = cellData.placeholder; + cell.cellData = cellData; + cell.title.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + return cell; +} + +- (UITableViewCell *)dequeueInputCell:(FUIStaticContentTableViewCell *)cellData + tableView:(UITableView *)tableView{ + FUIInputTableViewCell *cell = + [tableView dequeueReusableCellWithIdentifier:kInputCellReuseIdentitfier]; + cell.title.text = cellData.title; + cell.input.text = cellData.value; + cell.input.placeholder = cellData.placeholder; + cell.cellData = cellData; + cell.title.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + return cell; +} + +#pragma mark - UITableViewDelegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + FUIStaticContentTableViewCell *cellData = + _contents.sections[indexPath.section].cells[indexPath.row]; + BOOL hasAssociatedAction = cellData.action != nil; + if (hasAssociatedAction) { + cellData.action(); + } + [tableView deselectRowAtIndexPath:indexPath animated:hasAssociatedAction]; +} + +@end + +#pragma mark - + +@implementation FUIStaticContentTableViewContent + ++ (instancetype)contentWithSections: + (nullable NSArray *)sections { + return [[self alloc] initWithSections:sections]; +} + +- (instancetype)initWithSections:(nullable NSArray *)sections { + self = [super init]; + if (self) { + _sections = [sections copy]; + } + return self; +} + +@end + +#pragma mark - + +@implementation FUIStaticContentTableViewSection + ++ (instancetype)sectionWithTitle:(nullable NSString *)title + cells:(nullable NSArray *)cells { + return [[self alloc] initWithTitle:title cells:cells]; +} + +- (instancetype)initWithTitle:(nullable NSString *)title + cells:(nullable NSArray *)cells { + self = [super init]; + if (self) { + _title = [title copy]; + _cells = [cells copy]; + } + return self; +} + +@end + +#pragma mark - + +@implementation FUIStaticContentTableViewCell + ++ (instancetype)cellWithTitle:(nullable NSString *)title { + return [[self alloc] initWithTitle:title + value:nil + placeholder:nil + type:FUIStaticContentTableViewCellTypeDefault + action:nil]; +} + ++ (instancetype)cellWithTitle:(nullable NSString *)title + value:(nullable NSString *)value { + return [[self alloc] initWithTitle:title + value:value + placeholder:nil + type:FUIStaticContentTableViewCellTypeDefault + action:nil]; +} + ++ (instancetype)cellWithTitle:(nullable NSString *)title + action:(nullable FUIStaticContentTableViewCellAction)action { + return [[self alloc] initWithTitle:title + value:nil + placeholder:nil + type:FUIStaticContentTableViewCellTypeDefault + action:action]; +} + ++ (instancetype)cellWithTitle:(nullable NSString *)title + type:(FUIStaticContentTableViewCellType) type + action:(nullable FUIStaticContentTableViewCellAction)action { + return [[self alloc] initWithTitle:title + value:nil + placeholder:nil + type:type + action:action]; +} + ++ (instancetype)cellWithTitle:(nullable NSString *)title + value:(nullable NSString *)value + action:(nullable FUIStaticContentTableViewCellAction)action { + return [[self alloc] initWithTitle:title + value:value + placeholder:nil + type:FUIStaticContentTableViewCellTypeDefault + action:action]; +} + ++ (instancetype)cellWithTitle:(nullable NSString *)title + value:(nullable NSString *)value + type:(FUIStaticContentTableViewCellType) type + action:(nullable FUIStaticContentTableViewCellAction)action { + return [[self alloc] initWithTitle:title + value:value + placeholder:nil + type:type + action:action]; +} + ++ (instancetype)cellWithTitle:(nullable NSString *)title + value:(nullable NSString *)value + placeholder:(nullable NSString *)placeholder + type:(FUIStaticContentTableViewCellType) type + action:(nullable FUIStaticContentTableViewCellAction)action { + return [[self alloc] initWithTitle:title + value:value + placeholder:placeholder + type:type + action:action]; +} + +- (instancetype)initWithTitle:(nullable NSString *)title + value:(nullable NSString *)value + placeholder:(nullable NSString *)placeholder + type:(FUIStaticContentTableViewCellType) type + action:(nullable FUIStaticContentTableViewCellAction)action { + self = [super init]; + if (self) { + _title = [title copy]; + _value = [value copy]; + _action = [action copy]; + _placeholder = [placeholder copy]; + _type = type; + } + return self; +} + +@end + +@interface FUIPasswordTableViewCell () +@property (weak, nonatomic) IBOutlet UIButton *visibilityButton; +@end + +@implementation FUIPasswordTableViewCell + +- (IBAction)onPasswordVisibilitySelected:(id)sender { + self.password.secureTextEntry = ! self.password.secureTextEntry; + UIImage *image = self.password.secureTextEntry ? [UIImage imageNamed:kVisibilityOnImage] + : [UIImage imageNamed:kVisibilityOffImage]; + [self.visibilityButton setImage:image forState:UIControlStateNormal]; +} +- (IBAction)onPasswordChanged:(id)sender { + self.cellData.value = self.password.text; +} + +@end + +@implementation FUIInputTableViewCell + +- (IBAction)onInputChanged:(id)sender { + self.cellData.value = self.input.text; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FirebaseAuthUI.h b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FirebaseAuthUI.h new file mode 100644 index 00000000..913b88f1 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/FirebaseAuthUI.h @@ -0,0 +1,38 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +@import UIKit; + +//! Project version number for FirebaseAuthUI. +FOUNDATION_EXPORT double FirebaseAuthUIVersionNumber; + +//! Project version string for FirebaseAuthUI. +FOUNDATION_EXPORT const unsigned char FirebaseAuthUIVersionString[]; + + +#import "FUIAccountSettingsOperationType.h" +#import "FUIAccountSettingsViewController.h" + +#import "FUIAuth.h" +#import "FUIAuthBaseViewController.h" +#import "FUIAuthErrorUtils.h" +#import "FUIAuthPickerViewController.h" +#import "FUIAuthProvider.h" +#import "FUIAuthUtils.h" +#import "FUIAuthStrings.h" +#import "FUIPrivacyAndTermsOfServiceView.h" +#import "FUIAuthTableViewCell.h" +#import "FUIAuthTableHeaderView.h" diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle.png b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle.png new file mode 100755 index 0000000000000000000000000000000000000000..93082c336f7b972c4f87442ed1f9127cf2fa1d9e GIT binary patch literal 767 zcmV=rn@6 z!ZK=M_CmXql9VBcBE62%$`_hB&BjG@&pr3tduPDKe16;W@Nn-u=bkg<hZ7 zZ~K`5>B^Z^RNO;TNcpq@WGYxzRB26kK)HchuyS3wx%OjgR5?;UtoW5<_81%W2t^{O zL=}}uj-xc8Y}|`VpR)ET3N<7>H14-KKB}?QgYfXG$8D-_VM%q~+7H)?P4yQn1QE7r z#Y($IbtO`58l_8=BU6c?QGFGuFhV1)!|aIG`VAe}UFHkC#?3GwB<<;jK7R>5-X>OkdRb8!-oTfd_YJOV~A#I*@rKc66$DXi0=q#W+=d+ zLS7;~<~aqpkjDd0Z3pq;+GW;UHI37RM`esSY?@@4QZk~JC<(2m3C1`|Mpbj0uga!# xbWuf?9HfN-CRxN_GZljcCK(_^1v^7d&OZ+}nu|OKSdIVy002ovPDHLkV1gOvTsQy# literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle2x.png b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle2x.png new file mode 100755 index 0000000000000000000000000000000000000000..ea280fe634771dd26ca4b15ea29d7f672e6e0a6d GIT binary patch literal 1471 zcmV;w1wi_VP)HfgQRWh+|bNT^`6UaWyH1bYo{lv{KRtADntjx>j6Bj_A+?;~4q~(09A`6e($IYN za1&AN2H#LZnuxKLzYqgmXA4nM+H4Loj2LW)1hYs;!_Dicx)P7h>u+&9}mspHsW)= z6yuSF+(YocKIY?rCEQ0+q(K(rviGze_c86%P)d{#A!00`hEqJ&dgM}EG)LoQPO^=u~Z!)!i&Uc(OACnalu3`EANA=uwy+>5T!cF#<(AqANND-TBZER z2@I=56sy9C4TxeD7&L=H<=@ zqVy|oGs38dFrxfMh0)fGDAtauGl*hMXe!b;tExd&t;X3`94&2#a;2zRh$wdq4YRcl zUZbeW)jHHIMA<<^qY$b>h(-rc6l2(@2hP^Kt%#sxE233Q|CLs(0VTRuVhd2U2+`^) z3f@IDt3g#AqS;$Gwg=Jd6spc5n(e|d_3Lcit!0!E19!^~6(R=Oj*6X#fu^f(?$qle zhEsWlPQ9yfb;HX~dOAI72N9$t6TKxh$fN zv-;Z%{UfF>WE|9qZ9T|1s2kh*k#SHG+lG*F&_ir{ij0Fsg9i>?>2bDb1^+F1zVYaz zi*^$1=8Lg*li(DWU3;G{`L(sY$x-T9LYV&(VJY>r(u)}EB)07{^z&??l4&^cDpj-@ z`cq;rw$&qA-RB_XOh8qLh6jqSUXHV^#($`OS;# z+S>|C(?_@?gO9nTFp%iTal}E-*vBN?ltZ(-2gI8Z+dW`4UigGZi0wAwNZi3!CM9@f zfrDx70vzf_Y&6XKc&W_h3D`9p+l|=hb3CAM)%G=xmDt*zPrz$g{Eb*P7X{Z5i$22- z+YpPcpk#}}zoQr4Ml7mFN!0S><7NEt3i84p5kXNxVSDbrPmveajIvo4$9Y4{!E0|a zY;klKM?;I{Iz0t1g)N6|4x=S*`JKr*vhYfX^Oo0jGtty!W1F6V7cyzHe?_V;OcJr^ zdon$E+(U>(cbSX<>k!M1l7*W>v?7*OVn_#K*?A`8mML67EIWrW1q>jT-C!^d?qDU$}9W9n-#EP>eS0!5he2EQP-+K+MBblM(W*-HdnQ5tQ3YkH9^ zT#)bJDrAr^$wSptb~!lA=^+=F6w~KuUit`2$-s$BKH!+6L8c@{xTw_ehqeFkEz6mN zm6uq-e(Upa?~f1{b6;uv;CB)956hm`G{uXq_hYPTty6Yg?b{SiFxeeI-=M$ zzG5zEXgbxjI+(!erGirHm+nKp+qZ1OkCH Z_8);WaOBW9V157q002ovPDHLkV1j_?xA*`6 literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle3x.png b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_account_circle3x.png new file mode 100755 index 0000000000000000000000000000000000000000..5d488d08dfef3d5b333d0eea8563ec1ff36cc710 GIT binary patch literal 2297 zcmVZvTO-~(pnxu>HY8pIuDdwstD z0G!-8=Q`(lD2}xp$8j9TaU92SoILJk0V`-_I|u0DJQo?{265utV33QPr-uV zpo%<_=8R=NtJuX^;z)|cIm1p?F^?jgZ%|AF8|fv1C@8^c-r^C);(TQqFLH!9qM;av zd4VcMxGAir7ctOjR#CwSl*baf5yO4V6XY>sl(C*Kk$@Ut9i^nbS-e9G3AiXbm`U2I zVLxI~d#EPuRPjDyT?yW$lC)7w8!^PvqP$8Gp_jpO`Vq_PV<{0rtct@(Na|)Pp_I*P zZXzM-CNGdh$W+jSgs>x&6C#aVLqghBo+K3V*ouU_P2^&^iJU;vpktI`vAOgkX;L4x zSn3IGB5BkR4OnOul6EC{4y#01kECg>SR;dtNE-JiB3K}Utw@@;nFs-kun`#ny+OcU zMMg+#-AKb!&k>NHB1XGH58HW-mu~eM9rSS3@L;cj0L*0=G1PIMVI~=TT?REgYw)Fi zh*}JrXy|1-%4Y82+e~LGF+(rrr5KcF=vTCxyGT|!dklSU%EcHHBj-yjB2|mIjA-xA z7}98DregwLl<+B{y(Jhh*}&|{KJxKu6kP_!KNHa`n;rv~IU7H+4P5HOWTDk+12>I) z{2FE82J$=_-OaG}N8kihDAE2{9HJ6UG7Kz-S%fN!5zQSUf)>jSjGI;3i)ij?G$_{o zE*Rx5RGLIg`;D#;Wn}gw106DrtZS`CiMJ8$^`OgfM0?v&pp2OL zf2u;AM&^O;#JBZ`fnGzG4dGafkZ))+@k{8k1~E`Sx%jdKaThwN9>b_HpEB= z@u3niREP10q538%o=F?-zhwrh8V2I_$#>jrsBzqh{2vkhi1fJ z&3JMIG1%wm@P*-x`yLb%M~pTd)v6Jr#V90Y4T#~|QLO_pTszc(dHIVx2ULk#!2 zkD;Bx_MlQ1V!TtNXeT^X39K%%@#8lBiUd|CDLIP-SQn%4YILBNS?DDNdBl-G`;-#ADB~CsXfbj~+TBRt zU1l++Yt-9#&J5?z?xgN(aCX3k1=c~X$KIO=k}Ad9>nFjqa^J-;_}=% zl6DbsdF}#98$?{58z5;n5SQn!le9SE@?6Z!g?7cv+&Wy>%{&ZU17?PIt_x;fSX}4a zE4Z1Cx{pd`+GpnY1y{S75C5(fGl%-PmW6L}R=CJPHnW6^EsluCQ>p_^L=aw_Y#C!-XUhwLi8dM+8%lBOd?2A=pe4`e>a8{oz}D+s1h4g z(WPneTFTx+6!#w20^)e43cKI9AV z;IOj81MkCTbCkW(9Kw?q6kXj4 zUet#Pn+6~Id~@(=9pbTR1kcoASFQL~O3d?@x(Hzs@w`H7msdnK+DaD@x4t z@sVXNVeunk!JpW-*T+fW6@{Y}^A8|W2D&!NyN3AGVL?7a#9*VKecux3S>so*Y zOA%l7G7+0h_I>DFBU(iG1o2fLbFjq^=|_C^5fL<*%1y*q!~BZiMffdI-^(*A@Wa4_ z?QV()(jDwIG!g4V7Dtq3BhXSZ zF(s2<(uXMNF%0>O!lT;jFkv2lLlpHU#^mxDqO2p#L#IXbDBbCO8wQoqr+8iQFUUu= zQ7q*P#rqy7U|6m4?KcB#U^Z$*_yKKvseEhGYy!|g0#V+1{>c4g;Z-(sXyM<8@)Fb& zkS0V^gS^M@xQ{%Nl}9Zr+07M1Q!5EjE26b1e`hyqXk;O?C}AA8lXa`x8AmCzSV$vl zc%Od|MYQ%Z0eb@(0c{{~8Eiq)yiG)~KqSq7)onzu##$szdl}0#kwDU{1S_#n14Bp} zb%S~=RZAa|CS7DU7AxhmG&v;jPAr$pCM4v&Ne-c~geyo$8{{!Uq@2S@2YC4EoaJ$&bbkbf4Yw1SVC( zjBrzFrkj|iS@c6RQOQ@FLh5;)Q^XMk#W_hE4^zN5a0;lSnYZaB=Hd5ynogRiqkyD2 zIaKl>%V?pU{T$^S7Z~6=F=AY2fD4@CDEnxqg=N$+g&Z8maU92S9LI4S$5Q_X3o@V- TDRIIk00000NkvXXu0mjf{O~LV literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility.png b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility.png new file mode 100644 index 0000000000000000000000000000000000000000..58597e91b97dda5cef43b40691793da044e2a662 GIT binary patch literal 309 zcmV-50m}Y~P)4oRAdjLA!j=$GOA!1wD58Z(%>yB7{_)W_5fllEprBcZw1WnQAhZ=d4l}Sb zdUys07vOb`?)!e;*Hu#Jd+mMYD}4nzW%|BR1L9+G{ZQp&j7wfwL;U}!QM=PpRs)rbnK#@%Djz!t1Z#BiD_-5T{%v_ z|MEZvgh$wK1Ej+00000NkvXX Hu0mjfuP=*W literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility@2x.png b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7b4cc8f24b2f7632cd7568f236c7d765d8e352 GIT binary patch literal 593 zcmV-X0<#`8vnng>!UtbleXE=B(Ruq2mABs<^Oc z-JECL(G$w{-ALkc<6H0O)0U@vs3K{iu6&?hOLE@!r=*3tv>>NR1z$9G5~oCe+qhc*Fur@<-d25g7f*QIUVExQNQ<_{5HDuo+q`X*Me^{J{{}6Ht%tF^o&_+cAdNO-)&tv_k}ex fp4QRPaUVPY1vc-$n*zk(00000NkvXXu0mjfH$oNV literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility@3x.png b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c816ab49dca80cea33cd7815db4549dfa8978579 GIT binary patch literal 868 zcmV-q1DpJbP)U^7{~GN8fWWGhuM42IP8C5!>|i9#YQF&F;lz{3G6^3me%AU6$^wyL`3L7AqCN4 zn~D;6F&88HAB2e)VOWuH5nX9>bSL4ijX1Ugg7whx8eV&I0*1HZYTrQW( z<#OF5cc`L`C?mX=$p}%}c#1n*GmT0{iF1gaCx^rtr2>tj3-cMr=mqAOPpP3u%IM}N zbgXBKS1H9&UV8Zx-A0ax;>97)v5oFPe&tzgyUjehgPG$tHq`PPy2Cl(X|Cuk{t#k+eoFu|L6(FGvv??w zM>xpmM3F&1=caRJ&?v~q!aC1WsCHqc_mL4rH%$~P`h;oS2x>?RXXpPkT394OniP91 z&`cKLETyQz#N#A{J1cI7blco|(x03{(-@1m5;(|G|S*5wvTQPN`d8A_Qvo$u`}lq&W@ zFIl`~dt&vDy-Vh0-_oI8kUv%}9qK(w$kHh`4WKlO)r}}aV)ZLr;$cf@TDEZNzQbr$ zn7oNb4$p8QygK|SAx`sFCb^Fi5WdYXs3niD&`mRrQGK43lGI@|DNOyGydGoMwDp7_ zMj_U6T&(*T-6Lr_bDKvnQ7t@SmdMt`JiDA_vcnvWWQz$;t4aht;wx5U;kDWYvJZui z{B{cUBLAAsnxY^YGr~%JfNW4$=SwsSmy+#@DT_!I uK`U=C%)6Nk^E$0m;KSu|xm+&S&G8>_o}3QQ)9<4I0000hSqc>diP4$sW^U%BO-%KmsS`H+(X*WB~K#9deQbW&MH@=6l3F>|bg zT9cE)snpumquooFttH7vm7Wu&Lw)mzRxS!S@2ez5A{d8X3(uR-KXX!eZmPstJbNK? zTZ#=ek-YT;11WX`_#%{2Wh-g^Bs0`fYz3@^a)=*NPR`+IHy8?~kEc>3?N_=k^E%WV zrKycyIqAjEeJMB+-(d`>G_B;b3c)3xA~`cqtKAV-JamCJ2Oir>9b2mC=GZeENz8ZO x{+>`cF>>F;$Q6a!GLrqs$pZFI7H;}S{050TyiMlgk#hh5002ovPDHLkV1g{Sls*6e literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility_off@2x.png b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility_off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46bf0c931a0ae05a32733eb4b9fe1e9895d42c83 GIT binary patch literal 629 zcmV-*0*d{KP)^q&wHDGIu(&_c13b1fcJ zMe!n%3}Q(Umo!;|N$`?O^zQ3+gU^@ep20^P^8T#Hz2L{g^LzZO9d*=m`g(Q#{R3gW zKB6x~okY*0oX~N_hraTwKTP~-$C@wQaM?4ehxwHF*hJ(r@vV2vsZQ7^5Xb!}O1JGj zZ52C{63b%7wp`VyN<1ndCMC!{9Tj@XrYI0?A6U@U&~(azn??z->6{t8ZeNH3QLO7u zLJVD0(rXTcs7P?lxbXXt3*?Ao}Vdy%dQ7|EX~pefS*VA>m{N5rzoi0Vhwup*Kz z0IrJ?;<8A#>M_%JMI^fkXjv^GJ`%~!`$wON!bZA)u9ciXJGn1DRcOw`g!mjl%aVaT zdv<3MYo3(!qMd}emVX}P7i-ze4lX3u$T%V9ONf2vm2@$EW#4hKKy0SO(5q&2&PGBU zxMk64EltmR%NPC<1>$LERjA{hsIr8pSi@CY^%Atb>-TyIp76GBOhi6o_bpkkPUM~N zruW_Tz_vqUyB@mhhD%P6TuHTmnb*?%e@XPIi`Wo;@vPc9qp#zr|5<+n{d4iW28vN3 P00000NkvXXu0mjf>5ejo literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility_off@3x.png b/MyExperiences copy/Pods/FirebaseUI/Auth/FirebaseAuthUI/Resources/ic_visibility_off@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..13eb65df37f34436c96b63e5e3d1edad08bd15be GIT binary patch literal 884 zcmV-)1B?8LP)FW!?-sLzGlhR8&+Y z1$x88`2T z;2#2hNQxqDT(Jo&$dPow7vyQDo;X!BkY$QB$^xmxDB8tXbQo2p4{LFpN-@u|fO-k7 zDp*CKTu4%B3Igd(Vt6cWa(s{=&zURfbv(9=LIpw^5J)c|M_%CQktT&nk08{6fzl_@ z#4fw6(1k7GES=JVOG*BaG0r4zVjqR#Yi`C`TDaqOsNvGy7Z4j5$fOfGv9=&gT>|Is z6E+&$K+Yqn8MBn|s5~cwLkWHsKwkoQByD4DU6}k04o#qh^*Csdx-pv;XXmh0g?yav z01eVAW*y?}Ux_Uk*D{7weOI(#4$6lA9y>-3aUn)z6sX0k+)P~ zRzeA+8!<~DPu~J-gUDMNF#8oHku)z^KUhn!CvM4Nwu;gq-Kl@5VMN?Cg;_UBgY=X* zdkE~s`BB)khP7=C(uOekTVgnL7Z<{R;S^@goOmQ9I1=7Pvf$iX!Y`S}TBlc%@P_gl zmsU&B6?9A*Yt4M+o3u*}E@ddWk_y=CVud1qQ(^~0n{-MmLSw>Z%X4`-ZPGBvz3K`& zV<0fni+C!=I|6Ak5YiiXF3x)>;Vh*+lltu>-4{iG7_SJVV-`r^R1;e$f%LNfj}1<% z%sSI_&`322(%j7qo1CLiuB1AySUbO={4bN_za;O5jRg0y6E;!>V;qEw1eJ{NL%2u) zZ7gx9@iBOr3=ebWn + +/** @property scopes + @brief The scopes to use with Google Sign In. + @remarks Defaults to using email and profile scopes. For a list of all scopes + see https://developers.google.com/identity/protocols/googlescopes + */ +@property(nonatomic, copy, readonly) NSArray *scopes; + +/** @property buttonAlignment + @brief The alignment of the icon and text of the button. + */ +@property(nonatomic, readwrite) FUIButtonAlignment buttonAlignment; + +/** @fn init + @brief Convenience initializer. Calls designated init with default + scopes of "email" and "profile". + */ +- (instancetype)init; + +/** @fn initWithScopes: + @brief Designated initializer. + @param scopes The user account scopes required by the app. A list of possible scopes can be + found at https://developers.google.com/identity/protocols/googlescopes + */ +- (instancetype)initWithScopes:(NSArray *)scopes NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FUIGoogleAuth.m b/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FUIGoogleAuth.m new file mode 100644 index 00000000..d328a94f --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FUIGoogleAuth.m @@ -0,0 +1,222 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "FUIGoogleAuth.h" + +#import +#import +#import +#import "FUIAuthBaseViewController.h" +#import "FUIAuthErrorUtils.h" +#import "FirebaseAuthUI.h" +#import +#import +#import "FUIAuthBaseViewController_Internal.h" +#import "FUIAuthStrings.h" +#import "FUIAuthUtils.h" + +/** @var kTableName + @brief The name of the strings table to search for localized strings. + */ +static NSString *const kTableName = @"FirebaseGoogleAuthUI"; + +/** @var kBundleName + @brief The name of the bundle to search for resources. + */ +static NSString *const kBundleName = @"FirebaseGoogleAuthUI"; + +/** @var kSignInWithGoogle + @brief The string key for localized button text. + */ +static NSString *const kSignInWithGoogle = @"SignInWithGoogle"; + +@interface FUIGoogleAuth () +@end +@implementation FUIGoogleAuth { + /** @var _presentingViewController + @brief The presenting view controller for interactive sign-in. + */ + UIViewController *_presentingViewController; + + /** @var _pendingSignInCallback + @brief The callback which should be invoked when the sign in flow completes (or is cancelled.) + */ + FUIAuthProviderSignInCompletionBlock _pendingSignInCallback; + + /** @var _email + @brief The email address associated with this account. + */ + NSString *_email; +} + +- (instancetype)init { + return [self initWithScopes:@[kGoogleUserInfoEmailScope, kGoogleUserInfoProfileScope]]; +} + +- (instancetype)initWithScopes:(NSArray *)scopes { + self = [super init]; + if (self) { + _scopes = [scopes copy]; + } + return self; +} + +#pragma mark - FUIAuthProvider + +- (nullable NSString *)providerID { + return FIRGoogleAuthProviderID; +} + +- (nullable NSString *)accessToken { + return [GIDSignIn sharedInstance].currentUser.authentication.accessToken; +} + +- (nullable NSString *)idToken { + return [GIDSignIn sharedInstance].currentUser.authentication.idToken; +} + +- (NSString *)shortName { + return @"Google"; +} + +- (NSString *)signInLabel { + return FUILocalizedStringFromTableInBundle(kSignInWithGoogle, kTableName, kBundleName); +} + +- (UIImage *)icon { + return [FUIAuthUtils imageNamed:@"ic_google" fromBundleNameOrNil:kBundleName]; +} + +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} + +- (UIColor *)buttonTextColor { + return [UIColor colorWithWhite:0 alpha:0.54f]; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +- (void)signInWithEmail:(nullable NSString *)email + presentingViewController:(nullable UIViewController *)presentingViewController + completion:(nullable FUIAuthProviderSignInCompletionBlock)completion { + [self signInWithDefaultValue:email + presentingViewController:presentingViewController + completion:completion]; +} +#pragma clang diagnostic pop + +- (void)signInWithDefaultValue:(nullable NSString *)defaultValue + presentingViewController:(nullable UIViewController *)presentingViewController + completion:(nullable FUIAuthProviderSignInCompletionBlock)completion { + _presentingViewController = presentingViewController; + + GIDSignIn *signIn = [self configuredGoogleSignIn]; + signIn.presentingViewController = presentingViewController; + _pendingSignInCallback = ^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error, + _Nullable FIRAuthResultCallback result, + NSDictionary *_Nullable userInfo) { + signIn.loginHint = nil; + if (completion) { + completion(credential, error, result, nil); + } + }; + + signIn.loginHint = defaultValue; + [signIn signIn]; +} + +- (void)signOut { + GIDSignIn *signIn = [self configuredGoogleSignIn]; + [signIn signOut]; +} + +- (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(NSString *)sourceApplication { + GIDSignIn *signIn = [self configuredGoogleSignIn]; + return [signIn handleURL:URL]; +} + +- (NSString *)email { + return _email; +} + +#pragma mark - GIDSignInDelegate methods + +- (void)signIn:(GIDSignIn *)signIn + didSignInForUser:(GIDGoogleUser *)user + withError:(NSError *)error { + if (error) { + if (error.code == kGIDSignInErrorCodeCanceled) { + [self callbackWithCredential:nil + error:[FUIAuthErrorUtils + userCancelledSignInError] result:nil]; + } else { + NSError *newError = + [FUIAuthErrorUtils providerErrorWithUnderlyingError:error + providerID:FIRGoogleAuthProviderID]; + [self callbackWithCredential:nil error:newError result:nil]; + } + return; + } + _email = user.profile.email; + UIActivityIndicatorView *activityView = + [FUIAuthBaseViewController addActivityIndicator:_presentingViewController.view]; + [activityView startAnimating]; + FIRAuthCredential *credential = + [FIRGoogleAuthProvider credentialWithIDToken:user.authentication.idToken + accessToken:user.authentication.accessToken]; + [self callbackWithCredential:credential error:nil result:^(FIRUser *_Nullable user, + NSError *_Nullable error) { + [activityView stopAnimating]; + [activityView removeFromSuperview]; + }]; +} + +#pragma mark - Helpers + +/** @fn configuredGoogleSignIn + @brief Returns an instance of @c GIDSignIn which is configured to match the configuration + of this instance. + */ +- (GIDSignIn *)configuredGoogleSignIn { + GIDSignIn *signIn = [GIDSignIn sharedInstance]; + signIn.delegate = self; + signIn.shouldFetchBasicProfile = YES; + signIn.clientID = [[FIRApp defaultApp] options].clientID; + signIn.scopes = _scopes; + return signIn; +} + +/** @fn callbackWithCredential:error: + @brief Ends the sign-in flow by cleaning up and calling back with given credential or error. + @param credential The credential to pass back, if any. + @param error The error to pass back, if any. + @param result The result of sign-in operation using provided @c FIRAuthCredential object. + @see @c FIRAuth.signInWithCredential:completion: + */ +- (void)callbackWithCredential:(nullable FIRAuthCredential *)credential + error:(nullable NSError *)error + result:(nullable FIRAuthResultCallback)result { + FUIAuthProviderSignInCompletionBlock callback = _pendingSignInCallback; + _presentingViewController = nil; + _pendingSignInCallback = nil; + if (callback) { + callback(credential, error, result, nil); + } +} + +@end diff --git a/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FirebaseGoogleAuthUI.h b/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FirebaseGoogleAuthUI.h new file mode 100644 index 00000000..7c831f74 --- /dev/null +++ b/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/FirebaseGoogleAuthUI.h @@ -0,0 +1,25 @@ +// +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +@import UIKit; + +//! Project version number for FirebaseGoogleAuthUI. +FOUNDATION_EXPORT double FirebaseGoogleAuthUIVersionNumber; + +//! Project version string for FirebaseGoogleAuthUI. +FOUNDATION_EXPORT const unsigned char FirebaseGoogleAuthUIVersionString[]; + +#import "FUIGoogleAuth.h" diff --git a/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google.png b/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0e1c00598b8adc1b68b291372f344f71a77406 GIT binary patch literal 549 zcmV+=0^0qFP)p-3GO>xZ3UW3#y>DjorKA8Poss*%!WF@}2MZ z4N=%M@zX+tpBZHT&kTI~Cnd%YivPj$i(ix+Ff1`*$YPTw4hC`dj||LxhLQriNQMO^ zH)u@kj|}q7x7;Z=0+#=p8aDuzz;uNXG>I~(Mef|B#hwn>Fs`|=;6P%r;%r-{Q+q^QVhv#&g}6)!o_nHy|Wph!}l z+4@0sK}{~VGq^0bKrW=OEjsEebZyaW?=#43Wv?%Q6d(_zuldJ)g|02!71e@_HHG^E zTB5(1?Y_#I`x1fVnN!vlzI7^CTet>!qcp4S!D{*AYd!f4eIh3c^Sj9~;-$_rC|-oT z@jbJ<sN@G!|5UV7BWWS)Y+pshSlorDC n8+d;*Mw8iczPvdKhbI05oZHhx+NEG900000NkvXXu0mjfC*=xX literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google@2x.png b/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..62b29c6a027b2e7a44071ff118bb38b6955684d8 GIT binary patch literal 999 zcmVdXT93$IgW zWVuZInJ$ri!6mR=XcS@*Jr;v`(=BnQlA*$5;w8-RhtyCq!a&}2o46^N%evKCfGx5- zVbftM;uiTCFm-A+NheKa{kGUHZzpd$Y&9Mv>7vDC*bxWu<8+y)1Me1fB1s1z%lX(g zua8Lc6fEtUINIPH)KsU$+i*i2=aM+)pU(n&7bfA2%$t|=6Js)u74it2KKl038}Rto zGGZQ7ImacjpG7y%&xvP)z|={(E`ghuR`ZmO7Ya@YEZGU1W+tq8YJ?0|I-bi{+n>#Y z*4iz>Z9j6beqTd|EAYbBTX#H{7oq`BZF;m2d{-XW+q~B+idzli?B`udjrUi}^xXmH zq6>%i4lFSvUm0knn>px}y324I>KIBrA-Aj}F)9?>l%%xXJw zL=UlP0qmI4HTua@JA5}um1A6^fd^yIdttLbJJ2x|AUkCbvXVy*1x~R8r^+dNkO_1A z3&U3+@NG(7B^sYDf}8F)0#k4QM{K>rE2?tRuM(H9gS;uT13yHlz)F%REzcA^M9qKk z)OK*PYUwuLEyb}W`RoU-jyMBz16GnK-#xR<*$+RuFBp|myG;)g#5|H9(tQ8X*#CiW z=IQ?~EQ3OlD6%T&puvyBn(uBW`<$sTH9Iczvx7!qw*Rk4*{8EXl7&^}iPU5?v5Mn$ z9Be&_0(buz2ja2o4eQsmOqtyjX?^<4i(y-m3TUrK52Aax-{BO;R9-pV#;fviY=gtV zD)w{n8u#G;9%1Soo&O)pm){DL=lwc(0CW7ekW_)Klut7p-gx3-t1pHLi{I_HdHgSg zc>_%x!~N&&7=9j-l?=vJ4gU?U|MOFpz}6%k=v8@JY=^hg5(G+LGWT=KoY3ARomd~g zt^g~sJk{pue9#1uOo0O`VKqKX+Pva$;&rYEfGm<}=!R4 literal 0 HcmV?d00001 diff --git a/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google@3x.png b/MyExperiences copy/Pods/FirebaseUI/GoogleAuth/FirebaseGoogleAuthUI/Resources/ic_google@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a2ac76cd98a2fb21a00eabe7f831a830f7a12f0 GIT binary patch literal 1449 zcmV;a1y=frP)TR%Z$^wFS^CWv6wA#&!wPQ*WQ+q$i~upkwpXOhm8+v9PuSaW9pIu zG3pc==ABS_Y1k8}Q(HB70cHMY6K8M8IFax`{FSn=k{*xz! zLm~J1@w^@iqe+t{O`0@m(xgcf6~Y+b=ighnEnr5KejYXXdDiRW*-L&i8uOV^#BXNr z!1)B6UxTw>;A<^DGyB>nQiU$h7y#T93&7_6h zxs+otGHfTW0rR8<9I0cW?l{t*D`-ZB*j5$PO+6ekwZ@i4XdKd}EdJEy%1KI62?u{- z$njg*zhbB{gJi;H5~K-h!462#52)M2<~+JX;mGA%QHH?DHW4`g*`2O6c(VG5<30-Ed9zsJNO zlOu$aZnfc-!~$~bugU`i=FR5m2Ndc{Y>K&c<8lFEk3KgI01YM@P*gUc{&f%04#?~X zk7$6FF;b{gmttQ14*CIwuO+%j53Qsk4H0x%YxB#u`2h+BMXI})GbO7=)UBWY^v9h( zW9Pw`R}J0~sgK1-R4AxH4%L^{>pl15m)lJ^ug!*$Q&4?bg}UNZP=hK}z3#Yp_F-&s zJxAay7~5tWHF~R5yY47%!0Szp@QhqQMRn1ws$H0!?0ga;hJaaYtW!|!!i=vCy`f-8 z{9BbP*QuX#aLwrg3Ci8(v_;u=Tdo?>11S?w0O%VgS-Rz3voH_+(Y+BLI90SX94U%M zNWo5S?FoOasDssqi%fr8flDn!q$5MMSvto<6vb>oHDw^ zb$dR(+8o0MKU#GXtJ7J*(Qd_%q~hI$T%tiS7#JH^mv{*3+I6-=?aCjkp@V_3cmUrz)X?U z`d+F#6bNca9W9XZTkM{aFY#K2HgTtf{SZyT)WH$vpew#_$M#hWts)aMK 8.0' # Pull in all Firebase UI features +``` + +If you don't want to use all of FirebaseUI, there are multiple subspecs which can selectively install subsets of the full feature set: + +```ruby +# Only pull in Firestore features +pod 'FirebaseUI/Firestore', '~> 8.0' + +# Only pull in Database features +pod 'FirebaseUI/Database', '~> 8.0' + +# Only pull in Storage features +pod 'FirebaseUI/Storage', '~> 8.0' + +# Only pull in Auth features +pod 'FirebaseUI/Auth', '~> 8.0' + +# Only pull in Facebook login features +pod 'FirebaseUI/Facebook', '~> 8.0' + +# Only pull in Google login features +pod 'FirebaseUI/Google', '~> 8.0' + +# Only pull in Phone Auth login features +pod 'FirebaseUI/Phone', '~> 8.0' +``` + +If you're including FirebaseUI in a Swift project, make sure you also have: + +```ruby +platform :ios, '9.0' +use_frameworks! +``` + +Otherwise, you can include the FirebaseUI Xcode project from this repo in +your project. You also need to +[add the Firebase framework](https://firebase.google.com/docs/ios/setup) +to your project. + +## Documentation + +The READMEs for components of FirebaseUI can be found in their respective +project folders. + +- [Auth](Auth/README.md) +- [PhoneAuth](PhoneAuth/README.md) +- [Database](Database/README.md) +- [Firestore](Firestore/README.md) +- [Storage](Storage/README.md) + +## Local Setup + +If you'd like to contribute to FirebaseUI for iOS, you'll need to run the +following commands to get your environment set up: + +```bash +$ git clone https://github.com/firebase/FirebaseUI-iOS.git +$ cd FirebaseUI-iOS +$ cd Auth # or PhoneAuth, Database, etc +$ pod install +``` + +Alternatively you can use `pod try FirebaseUI` to install the Objective-C or Swift sample projects. + +## Sample Project Configuration + +You'll have to configure your Xcode project in order to run the samples. + +1. Your Xcode project should contain a `GoogleService-Info.plist`, downloaded from [Firebase console](https://console.firebase.google.com) when you add your app to a Firebase project.
+Copy the `GoogleService-Info.plist` into the sample project folder (`samples/obj-c/GoogleService-Info.plist` or `samples/swift/GoogleService-Info.plist`). + +1. Update URL Types.
+Go to `Project Settings -> Info tab -> Url Types` and update values for: + + `REVERSED_CLIENT_ID` (get value from `GoogleService-Info.plist`) + + `fb{your-app-id}` (put Facebook App Id) + +1. Update `Info.plist` with Facebook configuration values + + `FacebookAppID -> {your-app-id}` (put Facebook App Id) + +1. Enable Keychain Sharing.
+Facebook SDK requires keychain sharing.
+This can be done here: `Project Settings -> Capabilities -> KeyChain Sharing -> ON` + +1. Don't forget to configure your Firebase App Database using [Firebase console](https://console.firebase.google.com).
+Database should contain appropriate read/write permissions and folders (`objc_demo-chat` and `swift_demo-chat` respectively) + +1. In Order to use `Phone Auth` provider you should [Configure Push Notifications](#configure-apple-push-notifications) + +#### Configure Apple Push Notifications + +##### Enable silent push notifications in Xcode + + * `Push Notification` - Under `Capabilities` tab in your app target choose `Push Notifications` and put the switch to the `On` position. + * `Background Mode` - Under `Capabilities` tab in your app target choose `Background Modes` put the switch to the `On` position. In the list of available modes select `Background fetch` and `Remote notifications` (If available). + +##### Upload APNS Certificate to Firebase + +1. Create your `Provisioning APNS SSL Certificates` by following the steps on the following link. +https://firebase.google.com/docs/cloud-messaging/ios/certs + +1. Upload your `APNS Certificate` to Firebase: + + Inside your project in the Firebase console, select the gear icon, select `Project Settings`, and then select the `Cloud Messaging` tab. + + Select the `Upload Certificate` button for your development certificate, your production certificate, or both. At least one is required. + + For each certificate, select the `.p12 file`, and provide the password, if any. Make sure the `bundle ID` for this certificate matches the `bundle ID` of your app. Select `Save`. + +## Contributing to FirebaseUI + +### Contributor License Agreements + +We'd love to accept your sample apps and patches! Before we can take them, we +have to jump a couple of legal hurdles. + +Please fill out either the individual or corporate Contributor License Agreement +(CLA). + + * If you are an individual writing original source code and you're sure you + own the intellectual property, then you'll need to sign an [individual CLA] + (https://developers.google.com/open-source/cla/individual). + * If you work for a company that wants to allow you to contribute your work, + then you'll need to sign a [corporate CLA] + (https://developers.google.com/open-source/cla/corporate). + +Follow either of the two links above to access the appropriate CLA and +instructions for how to sign and return it. Once we receive it, we'll be able to +accept your pull requests. + +### Contribution Process + +1. Submit an issue describing your proposed change to the repo in question. +1. The repo owner will respond to your issue promptly. +1. If your proposed change is accepted, and you haven't already done so, sign a + Contributor License Agreement (see details above). +1. Fork the desired repo, develop and test your code changes. +1. Ensure that your code adheres to the existing style of the library to which + you are contributing. +1. Ensure that your code has an appropriate set of unit tests which all pass. +1. Submit a pull request diff --git a/MyExperiences copy/Pods/GTMAppAuth/LICENSE b/MyExperiences copy/Pods/GTMAppAuth/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/GTMAppAuth/README.md b/MyExperiences copy/Pods/GTMAppAuth/README.md new file mode 100644 index 00000000..e2c02fd0 --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/README.md @@ -0,0 +1,385 @@ +# GTMAppAuth for iOS and macOS + +GTMAppAuth enables you to use [AppAuth](http://openid.github.io/AppAuth-iOS) +with the +[Google Toolbox for Mac - Session Fetcher](https://github.com/google/gtm-session-fetcher) +and +[Google APIs Client Library for Objective-C For REST](https://github.com/google/google-api-objectivec-client-for-rest) +libraries by providing an implementation of `GTMFetcherAuthorizationProtocol` +for authorizing requests with AppAuth. + +GTMAppAuth is an alternative authorizer to GTMOAuth2. The key differentiator is +the use of the user's default browser for the authorization, which is more +secure, more usable (the user's session can be reused) and follows modern OAuth +[best practices for native apps](https://tools.ietf.org/html/draft-ietf-oauth-native-apps). +Compatibility methods for GTMOAuth2 are offered allowing you to migrate +from GTMOAuth2 to GTMAppAuth preserving previously serialized authorizations +(so users shouldn't need to re-authenticate). + +## Setup + +If you use [CocoaPods](https://guides.cocoapods.org/using/getting-started.html), +simply add: + + pod 'GTMAppAuth' + +To your `Podfile` and run `pod install`. + +## Usage + +### Configuration + +To configure GTMAppAuth with the OAuth endpoints for Google, you can use the +convenience method: + +```objc +OIDServiceConfiguration *configuration = + [GTMAppAuthFetcherAuthorization configurationForGoogle]; +``` + +Alternatively, you can configure GTMAppAuth by specifying the endpoints +directly: + +```objc +NSURL *authorizationEndpoint = + [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/v2/auth"]; +NSURL *tokenEndpoint = + [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v4/token"]; + +OIDServiceConfiguration *configuration = + [[OIDServiceConfiguration alloc] + initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint]; + +// perform the auth request... +``` + +Or through discovery: + +```objc +NSURL *issuer = [NSURL URLWithString:@"https://accounts.google.com"]; + +[OIDAuthorizationService discoverServiceConfigurationForIssuer:issuer + completion:^(OIDServiceConfiguration *_Nullable configuration, + NSError *_Nullable error) { + if (!configuration) { + NSLog(@"Error retrieving discovery document: %@", + [error localizedDescription]); + return; + } + + // perform the auth request... +}]; +``` + +### Authorizing + +First, you need to have a way for your UIApplicationDelegate to continue the +authorization flow session from the incoming redirect URI. Typically you could +store the in-progress OIDAuthorizationFlowSession instance in a property: + +```objc +// property of the app's UIApplicationDelegate +@property(nonatomic, nullable) + id currentAuthorizationFlow; +``` + +And in a location accessible by all controllers that need authorization, a +property to store the authorization state: + +```objc +// property of the containing class +@property(nonatomic, nullable) GTMAppAuthFetcherAuthorization *authorization; +``` + +Then, initiate the authorization request. By using the +`authStateByPresentingAuthorizationRequest` method, the OAuth token +exchange will be performed automatically, and everything will be protected with +PKCE (if the server supports it). + +```objc +// builds authentication request +OIDAuthorizationRequest *request = + [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration + clientId:kClientID + clientSecret:kClientSecret + scopes:@[OIDScopeOpenID, OIDScopeProfile] + redirectURL:redirectURI + responseType:OIDResponseTypeCode + additionalParameters:nil]; +// performs authentication request +self.appDelegate.currentAuthorizationFlow = + [OIDAuthState authStateByPresentingAuthorizationRequest:request + callback:^(OIDAuthState *_Nullable authState, + NSError *_Nullable error) { + if (authState) { + // Creates the GTMAppAuthFetcherAuthorization from the OIDAuthState. + GTMAppAuthFetcherAuthorization *authorization = + [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState]; + + self.authorization = authorization; + NSLog(@"Got authorization tokens. Access token: %@", + authState.lastTokenResponse.accessToken); + } else { + NSLog(@"Authorization error: %@", [error localizedDescription]); + self.authorization = nil; + } +}]; +``` + +### Handling the Redirect + +The authorization response URL is returned to the app via the platform-specific +application delegate method, so you need to pipe this through to the current +authorization session (created in the previous session). + +#### macOS Custom URI Scheme Redirect Example + +```objc +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Other app initialization code ... + + // Register for GetURL events. + NSAppleEventManager *appleEventManager = + [NSAppleEventManager sharedAppleEventManager]; + [appleEventManager setEventHandler:self + andSelector:@selector(handleGetURLEvent:withReplyEvent:) + forEventClass:kInternetEventClass + andEventID:kAEGetURL]; +} + +- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event + withReplyEvent:(NSAppleEventDescriptor *)replyEvent { + NSString *URLString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; + NSURL *URL = [NSURL URLWithString:URLString]; + [_currentAuthorizationFlow resumeExternalUserAgentFlowWithURL:URL]; +} +``` + +#### iOS Custom URI Scheme Redirect Example + +```objc +- (BOOL)application:(UIApplication *)app + openURL:(NSURL *)url + options:(NSDictionary *)options { + // Sends the URL to the current authorization flow (if any) which will + // process it if it relates to an authorization response. + if ([_currentAuthorizationFlow resumeExternalUserAgentFlowWithURL:url]) { + _currentAuthorizationFlow = nil; + return YES; + } + + // Your additional URL handling (if any) goes here. + + return NO; +} +``` + +### Making API Calls + +The goal of GTMAppAuth is to enable you to authorize HTTP requests with fresh +tokens following the Session Fetcher pattern, which you can do like so: + +```objc +// Creates a GTMSessionFetcherService with the authorization. +// Normally you would save this service object and re-use it for all REST API calls. +GTMSessionFetcherService *fetcherService = [[GTMSessionFetcherService alloc] init]; +fetcherService.authorizer = self.authorization; + +// Creates a fetcher for the API call. +NSURL *userinfoEndpoint = [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v3/userinfo"]; +GTMSessionFetcher *fetcher = [fetcherService fetcherWithURL:userinfoEndpoint]; +[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + // Checks for an error. + if (error) { + // OIDOAuthTokenErrorDomain indicates an issue with the authorization. + if ([error.domain isEqual:OIDOAuthTokenErrorDomain]) { + self.authorization = nil; + NSLog(@"Authorization error during token refresh, clearing state. %@", + error); + // Other errors are assumed transient. + } else { + NSLog(@"Transient error during token refresh. %@", error); + } + return; + } + + // Parses the JSON response. + NSError *jsonError = nil; + id jsonDictionaryOrArray = + [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; + + // JSON error. + if (jsonError) { + NSLog(@"JSON decoding error %@", jsonError); + return; + } + + // Success response! + NSLog(@"Success: %@", jsonDictionaryOrArray); +}]; +``` + +### Serialization + +You can easily serialize `GTMAppAuthFetcherAuthorization` objects using the +included Keychain category. + +```objc +// Serialize to Keychain +[GTMAppAuthFetcherAuthorization saveAuthorization:_authorization + toKeychainForName:kGTMAppAuthExampleAuthorizerKey]; + +// Deserialize from Keychain +GTMAppAuthFetcherAuthorization* authorization = + [GTMAppAuthFetcherAuthorization authorizationFromKeychainForName:kGTMAppAuthExampleAuthorizerKey]; + +// Remove from Keychain +[GTMAppAuthFetcherAuthorization + removeAuthorizationFromKeychainForName:kGTMAppAuthExampleAuthorizerKey]; +``` + +### GTMOAuth2-compatible Serialization + +To assist the migration from GTMOAuth2 to GTMAppAuth, GTMOAuth2-compatible +serialization methods are provided in `GTMOAuth2KeychainCompatibility`. + +```objc +// Deserialize from Keychain +GTMAppAuthFetcherAuthorization *auth = + [GTMOAuth2KeychainCompatibility authForGoogleFromKeychainForName:kKeychainItemName + clientID:clientID + clientSecret:clientSecret]; + +// Remove from Keychain +[GTMOAuth2KeychainCompatibility removeAuthFromKeychainForName:kKeychainItemName]; +``` + +You can also serialize to GTMOAuth2 format, though this is discouraged (you +should serialize in GTMAppAuth format as described above). + +```objc +// Serialize to Keychain +[GTMOAuth2KeychainCompatibility saveAuthToKeychainForName:kKeychainItemName + authentication:authorization]; +``` + +## Included Samples + +Try out one of the included sample apps under [Examples](Examples). In the +apps folder run `pod install`, then open the resulting `xcworkspace` file. + +Be sure to follow the instructions in +[Example-iOS/README.md](Examples/Example-iOS/README.md) or +[Example-macOS/README.md](Examples/Example-macOS/README.md) to configure +your own OAuth client ID for use with the example. + +## Differences with GTMOAuth2 + +### Authorization Method + +GTMAppAuth uses the browser to present the authorization request, while +GTMOAuth2 uses an embedded web-view. Migrating to GTMAppAuth will require you +to change how you authorize the user. Follow the instructions above to get the +authorization. You can then create a `GTMAppAuthFetcherAuthorization` object +with the `initWithAuthState:authState` initializer. + +Once you have the `GTMAppAuthFetcherAuthorization` you can continue to make REST +calls as before. + +### Error Handling + +GTMAppAuth's error handling is also different. There are no notifications, +instead you need to inspect NSError in the callback. If the error domain is +`OIDOAuthTokenErrorDomain`, it indicates an authorization error, you should +clear your authorization state and consider prompting the user to authorize +again. Other errors are generally considered transient, meaning that you should +retry the request after a delay. + +### Serialization + +The serialization format is different between GTMOAuth2 and GTMAppAuth, though +we have methods to help you migrate from one to the other without losing any +data. + +## Migrating from GTMOAuth2 + +### OAuth Client Registration + +Typically, GTMOAuth2 clients are registered with Google as type "Other". This is +correct for macOS, but on iOS clients should be registered with the type "iOS". + +If you're migrating an iOS client, in the *same project as your existing client*, +[register a new iOS client](https://console.developers.google.com/apis/credentials?project=_) +to be used with GTMAppAuth. + +### Changing your Authorization Flows + +Both GTMOAuth2 and GTMAppAuth support the `GTMFetcherAuthorizationProtocol` +allowing you to use the authorization with the session fetcher. Where you +previously had a property like `GTMOAuth2Authentication *authorization` change the +type to reference the protocol instead, i.e.: +`id authorization`. This allows you to switch +the authorization implementation under the hood to GTMAppAuth. + +Then, follow the instructions above to replace authorization request +(where you ask the user to grant access) with the GTMAppAuth approach. If you +created a new OAuth client, use that for these requests. + +### Serialization & Migrating Existing Grants + +GTMAppAuth has a new data format and APIs for serialization. Unlike +GTMOAuth2, GTMAppAuth serializes the configuration and history of the +authorization, including the client id, and a record of the authorization +request that resulted in the authorization grant. + +The client ID used for GTMAppAuth is [different](#oauth-client-registration) to +the one used for GTMOAuth2. In order to keep track of the different client ids +used for new and old grants, it's recommended to migrate to the new +serialization format, which will store that for you. +[GTMOAuth2-compatible serialization](#gtmoauth2-compatible-serialization) is +also offered, but not fully supported. + +Change how you serialize your `authorization` object using the new methods +using the following example. + +```objc +// Serialize to Keychain +[GTMAppAuthFetcherAuthorization saveAuthorization:(GTMAppAuthFetcherAuthorization *)authorization + toKeychainForName:kNewKeychainName]; +``` + +Be sure to use a *new* name for the keychain. Don't reuse your old one! + +For deserializing, we can preserve all existing grants (so users who authorized +your app in GTMOAuth2 don't have to authorize it again). Remember that when +deserializing the *old* data you need to use your *old* keychain name, and +the old client id and client secret (if those changed), and that when +serializing to the *new* format, use the *new* keychain name. +Once again, pay particular care to use the old details when deserializing the +GTMOAuth2 keychain, and the new details for all other GTMAppAuth calls. + +Keychain migration example: + +```objc +// Attempt to deserialize from Keychain in GTMAppAuth format. +id authorization = + [GTMAppAuthFetcherAuthorization authorizationFromKeychainForName:kNewKeychainName]; + +// If no data found in the new format, try to deserialize data from GTMOAuth2 +if (!authorization) { + // Tries to load the data serialized by GTMOAuth2 using old keychain name. + // If you created a new client id, be sure to use the *previous* client id and secret here. + authorization = + [GTMOAuth2KeychainCompatibility authForGoogleFromKeychainForName:kPreviousKeychainName + clientID:kPreviousClientID + clientSecret:kPreviousClientSecret]; + if (authorization) { + // Remove previously stored GTMOAuth2-formatted data. + [GTMOAuth2KeychainCompatibility removeAuthFromKeychainForName:kPreviousKeychainName]; + // Serialize to Keychain in GTMAppAuth format. + [GTMAppAuthFetcherAuthorization saveAuthorization:(GTMAppAuthFetcherAuthorization *)authorization + toKeychainForName:kNewKeychainName]; + } +} +``` diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuth.h b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuth.h new file mode 100644 index 00000000..ecbdad60 --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuth.h @@ -0,0 +1,30 @@ +/*! @file GTMAppAuth.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "GTMAppAuthFetcherAuthorization.h" +#import "GTMAppAuthFetcherAuthorization+Keychain.h" + +#if TARGET_OS_TV +#elif TARGET_OS_WATCH +#elif TARGET_OS_IOS +#import "GTMOAuth2KeychainCompatibility.h" +#elif TARGET_OS_MAC +#import "GTMOAuth2KeychainCompatibility.h" +#else +#warn "Platform Undefined" +#endif diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h new file mode 100644 index 00000000..f0b9ffeb --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h @@ -0,0 +1,52 @@ +/*! @file GTMAppAuthFetcherAuthorization+Keychain.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "GTMAppAuthFetcherAuthorization.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Category to support serialization and deserialization of + @c GTMAppAuthFetcherAuthorization in the format used by GTMAppAuth. + */ +@interface GTMAppAuthFetcherAuthorization (Keychain) + +/*! @brief Attempts to create a @c GTMAppAuthFetcherAuthorization from data stored in the keychain + in GTMAppAuth format. + @param keychainItemName The keychain name. + @return A @c GTMAppAuthFetcherAuthorization object, or nil. + */ ++ (nullable GTMAppAuthFetcherAuthorization *) + authorizationFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Removes a stored authorization state. + @param keychainItemName The keychain name. + @return YES the tokens were removed successfully (or didn't exist). + */ ++ (BOOL)removeAuthorizationFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Saves the authorization state to the keychain, in GTMAppAuth format. + @param auth The authorization to save. + @param keychainItemName The keychain name. + @return YES when the state was saved successfully. + */ ++ (BOOL)saveAuthorization:(GTMAppAuthFetcherAuthorization *)auth + toKeychainForName:(NSString *)keychainItemName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m new file mode 100644 index 00000000..e4910a81 --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m @@ -0,0 +1,46 @@ +/*! @file GTMAppAuthFetcherAuthorization+Keychain.m + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "GTMAppAuthFetcherAuthorization+Keychain.h" + +#import "GTMKeychain.h" + +@implementation GTMAppAuthFetcherAuthorization (Keychain) + ++ (GTMAppAuthFetcherAuthorization *)authorizationFromKeychainForName:(NSString *)keychainItemName { + NSData *passwordData = [GTMKeychain passwordDataFromKeychainForName:keychainItemName]; + if (!passwordData) { + return nil; + } + GTMAppAuthFetcherAuthorization *authorization = (GTMAppAuthFetcherAuthorization *) + [NSKeyedUnarchiver unarchiveObjectWithData:passwordData]; + return authorization; +} + ++ (BOOL)removeAuthorizationFromKeychainForName:(NSString *)keychainItemName { + return [GTMKeychain removePasswordFromKeychainForName:keychainItemName]; +} + ++ (BOOL)saveAuthorization:(GTMAppAuthFetcherAuthorization *)auth + toKeychainForName:(NSString *)keychainItemName { + NSData *authorizationData = [NSKeyedArchiver archivedDataWithRootObject:auth]; + return [GTMKeychain savePasswordDataToKeychainForName:keychainItemName + passwordData:authorizationData]; +} + +@end diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h new file mode 100644 index 00000000..248223c8 --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h @@ -0,0 +1,153 @@ +/*! @file GTMAppAuthFetcherAuthorization.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#ifndef GTMAPPAUTH_USER_IMPORTS +#import +#else // GTMAPPAUTH_USER_IMPORTS +#import "GTMSessionFetcher.h" +#endif // GTMAPPAUTH_USER_IMPORTS + +@class OIDAuthState; +@class OIDServiceConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief The userInfo key for the @c NSURLRequest. + */ +extern NSString *const GTMAppAuthFetcherAuthorizationErrorRequestKey; + +/*! @brief The error domain for errors specific to the session fetcher authorization. + */ +extern NSString *const GTMAppAuthFetcherAuthorizationErrorDomain; + +/*! @brief Enum of all possible error codes in the @c ::GTMAppAuthFetcherAuthorizationErrorDomain + domain. + @discussion Note that these are GTMAppAuth-specific errors. When AppAuth errors are encountered, + those are returned instead. + */ +typedef NS_ENUM(NSInteger, GTMAppAuthFetcherAuthorizationError) { + GTMAppAuthFetcherAuthorizationErrorUnauthorizableRequest = -1004 +}; + +typedef void (^GTMAppAuthFetcherAuthorizationCompletion)(NSError *_Nullable error); + +@class GTMAppAuthFetcherAuthorization; + +/*! @protocol GTMAppAuthFetcherAuthorizationTokenRefreshDelegate + @brief Delegate of the GTMAppAuthFetcherAuthorization used to supply additional parameters on + token refresh. + */ +@protocol GTMAppAuthFetcherAuthorizationTokenRefreshDelegate + +/*! @brief Called before a token refresh request is performed. + @param authorization The @c GTMFetcherAuthorization performing the token refresh. + @return A dictionary of parameters to be added to the token refresh request. + */ +- (nullable NSDictionary *)additionalRefreshParameters: + (GTMAppAuthFetcherAuthorization *)authorization; + +@end + +/*! @brief An implementation of the @c GTMFetcherAuthorizationProtocol protocol for the AppAuth + library. + @discussion Enables you to use AppAuth with the GTM Session Fetcher library. + */ +@interface GTMAppAuthFetcherAuthorization : NSObject + +/*! @brief The AppAuth authentication state. + */ +@property(nonatomic, readonly) OIDAuthState *authState; + +/*! @brief Service identifier, for example "Google"; not used for authentication. + @discussion The provider name is just for allowing stored authorization to be associated + with the authorizing service. + */ +@property(nullable, nonatomic, readonly) NSString *serviceProvider; + +/*! @brief User ID from the ID Token. + * @discussion Note: Never send this value to your backend as an authentication token, rather send + * an ID Token and validate it. + */ +@property(nullable, nonatomic, readonly) NSString *userID; + +/*! @brief Email verified status; not used for authentication. + @discussion The verified string can be checked with -boolValue. If the result is false, then + the email address is listed with the account on the server, but the address has not been + confirmed as belonging to the owner of the account. + */ +@property(nullable, nonatomic, readonly) NSString *userEmailIsVerified; + +@property(nullable, nonatomic, weak) id + tokenRefreshDelegate; + +/*! @brief Creates a new @c GTMAppAuthFetcherAuthorization using the given @c OIDAuthState from + AppAuth. + @param authState The authorization state. + */ +- (instancetype)initWithAuthState:(OIDAuthState *)authState; + +/*! @brief Creates a new @c GTMAppAuthFetcherAuthorization using the given @c OIDAuthState from + AppAuth. + @param authState The authorization state. + @param serviceProvider An optional string to describe the service. + @param userID An optional string of the user ID. + @param userEmail An optional string of the user's email address. + @param userEmailIsVerified An optional string representation of a boolean to indicate that the + email address has been verified. Pass @"true" for @c YES, or @"false" for @c NO. + @discussion Designated initializer. + */ +- (instancetype)initWithAuthState:(OIDAuthState *)authState + serviceProvider:(nullable NSString *)serviceProvider + userID:(nullable NSString *)userID + userEmail:(nullable NSString *)userEmail + userEmailIsVerified:(nullable NSString *)userEmailIsVerified + NS_DESIGNATED_INITIALIZER; + +#if !GTM_APPAUTH_SKIP_GOOGLE_SUPPORT +/*! @brief Convenience method to return an @c OIDServiceConfiguration for Google. + @return A @c OIDServiceConfiguration object setup with Google OAuth endpoints. + */ ++ (OIDServiceConfiguration *)configurationForGoogle; +#endif // !GTM_APPAUTH_SKIP_GOOGLE_SUPPORT + +/*! @brief Adds an authorization header to the given request, using the authorization state. + Refreshes the access token if needed. + @param request The request to authorize. + @param handler The block that is called after authorizing the request is attempted. If @c error + is non-nil, the authorization failed. Errors in the domain @c ::OIDOAuthTokenErrorDomain + indicate that the authorization itself is invalid, and will need to be re-obtained from the + user. Errors in the @c GTMAppAuthFetcherAuthorizationErrorDomain indicate another + unrecoverable errors. Errors in other domains may indicate a transitive error condition such + as a network error, and typically you do not need to reauthenticate the user on such errors. + @discussion The completion handler is scheduled on the main thread, unless the @c callbackQueue + property is set on the @c fetcherService in which case the handler is scheduled on that + queue. + */ +- (void)authorizeRequest:(nullable NSMutableURLRequest *)request + completionHandler:(GTMAppAuthFetcherAuthorizationCompletion)handler; + +/*! @brief Returns YES if the authorization state is currently valid. + @discussion Note that this doesn't guarantee that a request will get a valid authorization, as + the authorization state could become invalid on on the next token refresh. + */ +- (BOOL)canAuthorize; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m new file mode 100644 index 00000000..988a87b3 --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m @@ -0,0 +1,492 @@ +/*! @file GTMAppAuthFetcherAuthorization.m + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "GTMAppAuthFetcherAuthorization.h" + +#ifndef GTMAPPAUTH_USER_IMPORTS +#import +#else // GTMAPPAUTH_USER_IMPORTS +#import "AppAuthCore.h" +#endif // GTMAPPAUTH_USER_IMPORTS + +#define GTMOAuth2AssertValidSelector GTMBridgeAssertValidSelector + +/*! @brief Provides a template implementation for init-family methods which have been marked as + NS_UNAVILABLE. Stops the compiler from giving a warning when it's the super class' + designated initializer, and gives callers useful feedback telling them what the + new designated initializer is. + @remarks Takes a SEL as a parameter instead of a string so that we get compiler warnings if the + designated initializer's signature changes. + @param designatedInitializer A SEL referencing the designated initializer. + */ +#define GTM_UNAVAILABLE_USE_INITIALIZER(designatedInitializer) { \ + NSString *reason = [NSString stringWithFormat:@"Called: %@\nDesignated Initializer:%@", \ + NSStringFromSelector(_cmd), \ + NSStringFromSelector(designatedInitializer)]; \ + @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." \ + reason:reason \ + userInfo:nil]; \ +} + +/*! @brief Key used to encode the @c authState property for @c NSSecureCoding. + */ +static NSString *const kAuthStateKey = @"authState"; + +/*! @brief Key used to encode the @c serviceProvider property for @c NSSecureCoding. + */ +static NSString *const kServiceProviderKey = @"serviceProvider"; + +/*! @brief Key used to encode the @c userID property for @c NSSecureCoding. + */ +static NSString *const kUserIDKey = @"userID"; + +/*! @brief Key used to encode the @c userEmail property for @c NSSecureCoding. + */ +static NSString *const kUserEmailKey = @"userEmail"; + +/*! @brief Key used to encode the @c userEmailIsVerified property for @c NSSecureCoding. + */ +static NSString *const kUserEmailIsVerifiedKey = @"userEmailIsVerified"; + +NSString *const GTMAppAuthFetcherAuthorizationErrorDomain = + @"kGTMAppAuthFetcherAuthorizationErrorDomain"; +NSString *const GTMAppAuthFetcherAuthorizationErrorRequestKey = @"request"; + +/*! @brief Internal wrapper class for requests needing authorization and their callbacks. + @discusssion Used to abstract away the detail of whether a callback or block is used. + */ +@interface GTMAppAuthFetcherAuthorizationArgs : NSObject + +/*! @brief The request to authorize. + * @discussion Not copied, as we are mutating the request. + */ +@property (nonatomic, strong) NSMutableURLRequest *request; + +/*! @brief The delegate on which @c selector is called on completion. + */ +@property (nonatomic, weak) id delegate; + +/*! @brief The selector called on the @c delegate object on completion. + */ +@property (nonatomic) SEL selector; + +/*! @brief The completion block when the block option was used. + */ +@property (nonatomic, strong) GTMAppAuthFetcherAuthorizationCompletion completionHandler; + +/*! @brief The error that happened during token refresh (if any). + */ +@property (nonatomic, strong) NSError *error; + ++ (GTMAppAuthFetcherAuthorizationArgs *)argsWithRequest:(NSMutableURLRequest *)req + delegate:(id)delegate + selector:(SEL)selector + completionHandler:(GTMAppAuthFetcherAuthorizationCompletion)completionHandler; + +@end + +@implementation GTMAppAuthFetcherAuthorizationArgs + +@synthesize request = _request; +@synthesize delegate = _delegate; +@synthesize selector = _selector; +@synthesize completionHandler = _completionHandler; +@synthesize error = _error; + ++ (GTMAppAuthFetcherAuthorizationArgs *)argsWithRequest:(NSMutableURLRequest *)req + delegate:(id)delegate + selector:(SEL)selector + completionHandler:(GTMAppAuthFetcherAuthorizationCompletion)completionHandler { + GTMAppAuthFetcherAuthorizationArgs *obj; + obj = [[GTMAppAuthFetcherAuthorizationArgs alloc] init]; + obj.request = req; + obj.delegate = delegate; + obj.selector = selector; + obj.completionHandler = completionHandler; + return obj; +} + +@end + +@implementation GTMAppAuthFetcherAuthorization { + /*! @brief Array of requests pending authorization headers. + */ + NSMutableArray *_authorizationQueue; +} + +@synthesize authState = _authState; +@synthesize serviceProvider = _serviceProvider; +@synthesize userID = _userID; +@synthesize userEmailIsVerified = _userEmailIsVerified; + +// GTMFetcherAuthorizationProtocol doesn't specify atomic/nonatomic for these properties. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wimplicit-atomic-properties" +@synthesize userEmail = _userEmail; +@synthesize shouldAuthorizeAllRequests = _shouldAuthorizeAllRequests; +@synthesize fetcherService = _fetcherService; +#pragma clang diagnostic pop + +#pragma mark - Initializers + +// Ignore warning about not calling the designated initializer. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-designated-initializers" +- (instancetype)init + GTM_UNAVAILABLE_USE_INITIALIZER(@selector(initWithAuthState:)); +#pragma clang diagnostic pop + +- (instancetype)initWithAuthState:(OIDAuthState *)authState { + return [self initWithAuthState:authState + serviceProvider:nil + userID:nil + userEmail:nil + userEmailIsVerified:nil]; +} + +- (instancetype)initWithAuthState:(OIDAuthState *)authState + serviceProvider:(nullable NSString *)serviceProvider + userID:(nullable NSString *)userID + userEmail:(nullable NSString *)userEmail + userEmailIsVerified:(nullable NSString *)userEmailIsVerified { + self = [super init]; + if (self) { + _authState = authState; + _authorizationQueue = [[NSMutableArray alloc] init]; + + _serviceProvider = [serviceProvider copy]; + _userID = [userID copy]; + _userEmail = [userEmail copy]; + _userEmailIsVerified = [userEmailIsVerified copy]; + + // Decodes the ID Token locally to extract the email address. + NSString *idToken = _authState.lastTokenResponse.idToken + ? : _authState.lastAuthorizationResponse.idToken; + if (idToken) { + NSDictionary *claimsDictionary = [[OIDIDToken alloc] initWithIDTokenString:idToken].claims; + if (claimsDictionary) { + _userEmail = (NSString *)[claimsDictionary[@"email"] copy]; + _userEmailIsVerified = [(NSNumber *)claimsDictionary[@"email_verified"] stringValue]; + _userID = [claimsDictionary[@"sub"] copy]; + } + } + } + return self; +} + +# pragma mark - Convenience + +#if !GTM_APPAUTH_SKIP_GOOGLE_SUPPORT ++ (OIDServiceConfiguration *)configurationForGoogle { + NSURL *authorizationEndpoint = + [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/v2/auth"]; + NSURL *tokenEndpoint = + [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v4/token"]; + + OIDServiceConfiguration *configuration = + [[OIDServiceConfiguration alloc] initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint]; + return configuration; +} +#endif // !GTM_APPAUTH_SKIP_GOOGLE_SUPPORT + +#pragma mark - Authorizing Requests + +/*! @brief Internal routine common to delegate and block invocations to queue requests while + fresh tokens are obtained. + */ +- (void)authorizeRequestArgs:(GTMAppAuthFetcherAuthorizationArgs *)args { + // Adds requests to queue. + @synchronized(_authorizationQueue) { + [_authorizationQueue addObject:args]; + } + + NSDictionary *additionalRefreshParameters = _tokenRefreshDelegate ? + [_tokenRefreshDelegate additionalRefreshParameters:self] : nil; + + // Obtains fresh tokens from AppAuth. + [_authState performActionWithFreshTokens:^(NSString *_Nullable accessToken, + NSString *_Nullable idToken, + NSError *_Nullable error) { + // Processes queue. + @synchronized(self->_authorizationQueue) { + for (GTMAppAuthFetcherAuthorizationArgs *fetcherArgs in self->_authorizationQueue) { + [self authorizeRequestImmediateArgs:fetcherArgs accessToken:accessToken error:error]; + } + [self->_authorizationQueue removeAllObjects]; + } + } + additionalRefreshParameters:additionalRefreshParameters]; +} + +/*! @brief Adds authorization headers to the given request, using the supplied access token, or + handles the error. + @param args The request argument group to authorize. + @param accessToken A currently valid access token. + @param error If accessToken is nil, the error which caused the token to be unavailable. + @return YES if the request was authorized with a valid access token. + */ +- (BOOL)authorizeRequestImmediateArgs:(GTMAppAuthFetcherAuthorizationArgs *)args + accessToken:(NSString *)accessToken + error:(NSError *)error { + // This authorization entry point never attempts to refresh the access token, + // but does call the completion routine + + NSMutableURLRequest *request = args.request; + + NSURL *requestURL = [request URL]; + NSString *scheme = [requestURL scheme]; + BOOL isAuthorizableRequest = + !requestURL + || (scheme && [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame) + || [requestURL isFileURL] + || self.shouldAuthorizeAllRequests; + if (!isAuthorizableRequest) { + // Request is not https, a local file, or nil, so may be insecure + // + // The NSError will be created below +#if DEBUG + NSLog(@"Cannot authorize request with scheme %@ (%@)", scheme, request); +#endif + } + + // Get the access token. + if (isAuthorizableRequest && accessToken && accessToken.length > 0) { + if (request) { + // Adds the authorization header to the request. + NSString *value = [NSString stringWithFormat:@"%@ %@", @"Bearer", accessToken]; + [request setValue:value forHTTPHeaderField:@"Authorization"]; + } + + // We've authorized the request, even if the previous refresh + // failed with an error + args.error = nil; + } else { + NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; + if (!userInfo) { + userInfo = [[NSMutableDictionary alloc] init]; + } + if (request) { + userInfo[GTMAppAuthFetcherAuthorizationErrorRequestKey] = request; + } + + if (!isAuthorizableRequest || !error) { + args.error = [NSError errorWithDomain:GTMAppAuthFetcherAuthorizationErrorDomain + code:GTMAppAuthFetcherAuthorizationErrorUnauthorizableRequest + userInfo:userInfo]; + } else { + // Passes through error domain & code from AppAuth, with additional userInfo args. + args.error = [NSError errorWithDomain:error.domain + code:error.code + userInfo:userInfo]; + } + } + + // Invoke any callbacks on the proper thread + if (args.delegate || args.completionHandler) { + // If the fetcher service provides a callback queue, we'll use that + // (or if it's nil, we'll use the main thread) for callbacks. + dispatch_queue_t callbackQueue = self.fetcherService.callbackQueue; + if (!callbackQueue) { + callbackQueue = dispatch_get_main_queue(); + } + dispatch_async(callbackQueue, ^{ + [self invokeCallbackArgs:args]; + }); + } + + BOOL didAuth = (args.error == nil); + return didAuth; +} + +/*! @brief Invokes the callback for the given authorization argument group. + @param args The request argument group to invoke following authorization or error. + */ +- (void)invokeCallbackArgs:(GTMAppAuthFetcherAuthorizationArgs *)args { + NSError *error = args.error; + id delegate = args.delegate; + SEL sel = args.selector; + + // If the selector callback method exists, invokes the selector. + if (delegate && sel) { + NSMutableURLRequest *request = args.request; + + NSMethodSignature *sig = [delegate methodSignatureForSelector:sel]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; + [invocation setSelector:sel]; + [invocation setTarget:delegate]; + GTMAppAuthFetcherAuthorization *authorization = self; + [invocation setArgument:&authorization atIndex:2]; + [invocation setArgument:&request atIndex:3]; + [invocation setArgument:&error atIndex:4]; + [invocation invoke]; + } + + // If a callback block exists, executes the block. + id handler = args.completionHandler; + if (handler) { + void (^authCompletionBlock)(NSError *) = handler; + authCompletionBlock(error); + } +} + +#pragma mark - GTMFetcherAuthorizationProtocol + +/*! @brief Authorizing with a callback selector. + @discussion Selector has the signature: + - (void)authentication:(GTMAppAuthFetcherAuthorization *)auth + request:(NSMutableURLRequest *)request + finishedWithError:(NSError *)error; + */ +- (void)authorizeRequest:(NSMutableURLRequest *)request + delegate:(id)delegate + didFinishSelector:(SEL)sel { + GTMOAuth2AssertValidSelector(delegate, sel, + @encode(GTMAppAuthFetcherAuthorization *), + @encode(NSMutableURLRequest *), + @encode(NSError *), 0); + + GTMAppAuthFetcherAuthorizationArgs *args; + args = [GTMAppAuthFetcherAuthorizationArgs argsWithRequest:request + delegate:delegate + selector:sel + completionHandler:nil]; + [self authorizeRequestArgs:args]; +} + +/*! @brief Removes all pending requests from the authorization queue. + */ +- (void)stopAuthorization { + @synchronized(_authorizationQueue) { + [_authorizationQueue removeAllObjects]; + } +} + +/*! @brief Attempts to remove a specific pending requests from the authorization queue. + @discussion Has no effect if the authorization already occurred. + */ +- (void)stopAuthorizationForRequest:(NSURLRequest *)request { + @synchronized(_authorizationQueue) { + NSUInteger argIndex = 0; + BOOL found = NO; + for (GTMAppAuthFetcherAuthorizationArgs *args in _authorizationQueue) { + // Checks pointer equality with given request, don't want to match equivalent requests. + if ([args request] == request) { + found = YES; + break; + } + argIndex++; + } + + if (found) { + [_authorizationQueue removeObjectAtIndex:argIndex]; + + // If the queue is now empty, go ahead and stop the fetcher. + if (_authorizationQueue.count == 0) { + [self stopAuthorization]; + } + } + } +} + +/*! @brief Returns YES if the given requests is in the pending authorization queue. + */ +- (BOOL)isAuthorizingRequest:(NSURLRequest *)request { + BOOL wasFound = NO; + @synchronized(_authorizationQueue) { + for (GTMAppAuthFetcherAuthorizationArgs *args in _authorizationQueue) { + // Checks pointer equality with given request, don't want to match equivalent requests. + if ([args request] == request) { + wasFound = YES; + break; + } + } + } + return wasFound; +} + +/*! @brief Returns YES if given request has an Authorization header. + */ +- (BOOL)isAuthorizedRequest:(NSURLRequest *)request { + NSString *authStr = [request valueForHTTPHeaderField:@"Authorization"]; + return (authStr.length > 0); +} + +/*! @brief Returns YES if the authorization state is currently valid. + @discussion Note that the state can become invalid immediately due to an error on token refresh. + */ +- (BOOL)canAuthorize { + return [_authState isAuthorized]; +} + +/*! @brief Authorizing with a completion block. + */ +- (void)authorizeRequest:(NSMutableURLRequest *)request + completionHandler:(GTMAppAuthFetcherAuthorizationCompletion)handler { + GTMAppAuthFetcherAuthorizationArgs *args = + [GTMAppAuthFetcherAuthorizationArgs argsWithRequest:request + delegate:nil + selector:NULL + completionHandler:handler]; + [self authorizeRequestArgs:args]; +} + +/*! @brief Forces a token refresh the next time a request is queued for authorization. + */ +- (BOOL)primeForRefresh { + if (_authState.refreshToken == nil) { + // Cannot refresh without a refresh token + return NO; + } + [_authState setNeedsTokenRefresh]; + return YES; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDAuthState *authState = + [aDecoder decodeObjectOfClass:[OIDAuthState class] forKey:kAuthStateKey]; + NSString *serviceProvider = + [aDecoder decodeObjectOfClass:[NSString class] forKey:kServiceProviderKey]; + NSString *userID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kUserIDKey]; + NSString *userEmail = [aDecoder decodeObjectOfClass:[NSString class] forKey:kUserEmailKey]; + NSString *userEmailIsVerified = + [aDecoder decodeObjectOfClass:[NSString class] forKey:kUserEmailIsVerifiedKey]; + + self = [self initWithAuthState:authState + serviceProvider:serviceProvider + userID:userID + userEmail:userEmail + userEmailIsVerified:userEmailIsVerified]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_authState forKey:kAuthStateKey]; + [aCoder encodeObject:_serviceProvider forKey:kServiceProviderKey]; + [aCoder encodeObject:_userID forKey:kUserIDKey]; + [aCoder encodeObject:_userEmail forKey:kUserEmailKey]; + [aCoder encodeObject:_userEmailIsVerified forKey:kUserEmailIsVerifiedKey]; +} + +@end diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/GTMKeychain.h b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMKeychain.h new file mode 100644 index 00000000..b4d5d062 --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMKeychain.h @@ -0,0 +1,62 @@ +/*! @file GTMKeychain.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Utility for saving and loading data to the keychain. + */ +@interface GTMKeychain : NSObject + +/*! @brief Saves the password string to the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @param password Password string to save. + @return YES when the password string was saved successfully. + */ ++ (BOOL)savePasswordToKeychainForName:(NSString *)keychainItemName password:(NSString *)password; + +/*! @brief Loads the password string from the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @return The password string at the given identifier, or nil. + */ ++ (nullable NSString *)passwordFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Saves the password data to the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @param passwordData Password data to save. + @return YES when the password data was saved successfully. + */ ++ (BOOL)savePasswordDataToKeychainForName:(NSString *)keychainItemName + passwordData:(NSData *)passwordData; + +/*! @brief Loads the password data from the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @return The password data at the given identifier, or nil. + */ ++ (nullable NSData *)passwordDataFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Removes stored password string, such as when the user signs out. + @param keychainItemName Keychain name of the item. + @return YES if the password string was removed successfully (or didn't exist). + */ ++ (BOOL)removePasswordFromKeychainForName:(NSString *)keychainItemName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h new file mode 100644 index 00000000..9c0c5bf1 --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h @@ -0,0 +1,131 @@ +/*! @file GTMOAuth2Compatibility.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "GTMAppAuthFetcherAuthorization.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Class to support serialization and deserialization of @c GTMAppAuthFetcherAuthorization + in the format used by GTMOAuth2. + @discussion The methods of this class are capable of serializing and deserializing auth + objects in a way compatible with the serialization in @c GTMOAuth2ViewControllerTouch and + @c GTMOAuth2WindowController in GTMOAuth2. + */ +@interface GTMOAuth2KeychainCompatibility : NSObject + +/*! @brief Encodes the given @c GTMAppAuthFetcherAuthorization in a GTMOAuth2 compatible persistence + string using URL param key/value encoding. + @param authorization The @c GTMAppAuthFetcherAuthorization to serialize in GTMOAuth2 format. + @return The GTMOAuth2 persistence representation of this object. + */ ++ (NSString *)persistenceResponseStringForAuthorization: + (GTMAppAuthFetcherAuthorization *)authorization; + +/*! @brief Attempts to create a @c GTMAppAuthFetcherAuthorization from data stored in the keychain + in GTMOAuth2 format, at the supplied keychain identifier. + @param keychainItemName The keychain name. + @param tokenURL The OAuth token endpoint URL. + @param redirectURI The OAuth redirect URI used when obtaining the original authorization. + @param clientID The OAuth client id. + @param clientSecret The OAuth client secret. + @return A @c GTMAppAuthFetcherAuthorization object, or nil. + */ ++ (nullable GTMAppAuthFetcherAuthorization *) + authorizeFromKeychainForName:(NSString *)keychainItemName + tokenURL:(NSURL *)tokenURL + redirectURI:(NSString *)redirectURI + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret; + +/*! @brief Attempts to create a @c GTMAppAuthFetcherAuthorization from a @c NSString + representation of the GTMOAuth2 keychain data. + @param persistenceString String representation of the GTMOAuth2 keychain data. + @param tokenURL The OAuth token endpoint URL. + @param redirectURI The OAuth redirect URI used when obtaining the original authorization. + @param clientID The OAuth client id. + @param clientSecret The OAuth client secret. + @return A @c GTMAppAuthFetcherAuthorization object, or nil. + */ ++ (nullable GTMAppAuthFetcherAuthorization *) + authorizeFromPersistenceString:(NSString *)persistenceString + tokenURL:(NSURL *)tokenURL + redirectURI:(NSString *)redirectURI + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret; + +/*! @brief Removes stored tokens, such as when the user signs out. + @param keychainItemName The keychain name. + @return YES the tokens were removed successfully (or didn't exist). + */ ++ (BOOL)removeAuthFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Saves the authorization state to the keychain, in a GTMOAuth2 compatible manner. + @param keychainItemName The keychain name. + @return YES when the state was saved successfully. + */ ++ (BOOL)saveAuthToKeychainForName:(NSString *)keychainItemName + authentication:(GTMAppAuthFetcherAuthorization *)auth + __attribute__((deprecated( + "Use GTMAppAuthFetcherAuthorization::saveAuthorization:toKeychainForName:"))); + +#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +/*! @brief Attempts to create a @c GTMAppAuthFetcherAuthorization from data stored in the keychain + in GTMOAuth2 format, at the supplied keychain identifier. Uses Google OAuth provider + information. + @param keychainItemName The keychain name. + @param clientID The OAuth client id. + @param clientSecret The OAuth client secret. + @return A @c GTMAppAuthFetcherAuthorization object, or nil. + */ ++ (nullable GTMAppAuthFetcherAuthorization *) + authForGoogleFromKeychainForName:(NSString *)keychainItemName + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret; + +/*! @brief Returns Google's OAuth 2.0 authorization endpoint. + @return Returns Google's OAuth 2.0 authorization endpoint. + */ ++ (NSURL *)googleAuthorizationURL; + +/*! @brief Returns Google's OAuth 2.0 token endpoint. + @return Returns Google's OAuth 2.0 token endpoint. + */ ++ (NSURL *)googleTokenURL; + +/*! @brief Returns Google's OAuth 2.0 revocation endpoint. + @return Returns Google's OAuth 2.0 revocation endpoint. + */ ++ (NSURL *)googleRevocationURL; + +/*! @brief Returns Google's OAuth 2.0 userinfo endpoint. + @return Returns Google's OAuth 2.0 userinfo endpoint. + */ ++ (NSURL *)googleUserInfoURL; + +/*! @brief Returns Google's native OOB redirect URI. + @discussion This is a legacy redirect URI that was used with WebViews. + @return Returns Google's native OOB redirect URI. + */ ++ (NSString *)nativeClientRedirectURI; + +#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +@end + +NS_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m new file mode 100644 index 00000000..5e56341b --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m @@ -0,0 +1,325 @@ +/*! @file GTMOAuth2Compatibility.m + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "GTMOAuth2KeychainCompatibility.h" + +#ifndef GTMAPPAUTH_USER_IMPORTS +#import +#else // GTMAPPAUTH_USER_IMPORTS +#import "AppAuthCore.h" +#endif // GTMAPPAUTH_USER_IMPORTS + +#import "GTMKeychain.h" + +// standard OAuth keys +static NSString *const kOAuth2AccessTokenKey = @"access_token"; +static NSString *const kOAuth2RefreshTokenKey = @"refresh_token"; +static NSString *const kOAuth2ScopeKey = @"scope"; +static NSString *const kOAuth2ErrorKey = @"error"; +static NSString *const kOAuth2TokenTypeKey = @"token_type"; +static NSString *const kOAuth2ExpiresInKey = @"expires_in"; +static NSString *const kOAuth2CodeKey = @"code"; +static NSString *const kOAuth2AssertionKey = @"assertion"; +static NSString *const kOAuth2RefreshScopeKey = @"refreshScope"; + +// additional persistent keys +static NSString *const kServiceProviderKey = @"serviceProvider"; +static NSString *const kUserIDKey = @"userID"; +static NSString *const kUserEmailKey = @"email"; +static NSString *const kUserEmailIsVerifiedKey = @"isVerified"; + +// URI indicating an installed app is signing in. This is described at +// +// https://developers.google.com/identity/protocols/OAuth2InstalledApp#formingtheurl +// +static NSString *const kOOBString = @"urn:ietf:wg:oauth:2.0:oob"; + +@implementation GTMOAuth2KeychainCompatibility + +// This returns a "response string" that can be passed later to +// setKeysForResponseString: to reuse an old access token in a new auth object ++ (NSString *)persistenceResponseStringForAuthorization: + (GTMAppAuthFetcherAuthorization *)authorization { + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + + NSString *refreshToken = authorization.authState.refreshToken; + NSString *accessToken = authorization.authState.lastTokenResponse.accessToken; + + // Any nil values will not set a dictionary entry + [dict setValue:refreshToken forKey:kOAuth2RefreshTokenKey]; + [dict setValue:accessToken forKey:kOAuth2AccessTokenKey]; + [dict setValue:authorization.serviceProvider forKey:kServiceProviderKey]; + [dict setValue:authorization.userID forKey:kUserIDKey]; + [dict setValue:authorization.userEmail forKey:kUserEmailKey]; + [dict setValue:authorization.userEmailIsVerified forKey:kUserEmailIsVerifiedKey]; + [dict setValue:authorization.authState.scope forKey:kOAuth2ScopeKey]; + + NSString *result = [self encodedQueryParametersForDictionary:dict]; + return result; +} + ++ (GTMAppAuthFetcherAuthorization *)authorizeFromKeychainForName:(NSString *)keychainItemName + tokenURL:(NSURL *)tokenURL + redirectURI:(NSString *)redirectURI + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret { + // Loads password string from keychain. + NSString *password = [GTMKeychain passwordFromKeychainForName:keychainItemName]; + + if (!password) { + return nil; + } + + GTMAppAuthFetcherAuthorization *authorization = + [self authorizeFromPersistenceString:password + tokenURL:tokenURL + redirectURI:redirectURI + clientID:clientID + clientSecret:clientSecret]; + return authorization; +} + ++ (GTMAppAuthFetcherAuthorization *)authorizeFromPersistenceString:(NSString *)persistenceString + tokenURL:(NSURL *)tokenURL + redirectURI:(NSString *)redirectURIString + clientID:(NSString *)clientID + clientSecret:(NSString *)clientSecret { + // Parses persistence data into NSDictionary. + NSDictionary *dict = [self dictionaryWithResponseString:persistenceString]; + + NSURL *redirectURI = (NSURL *)[NSURL URLWithString:redirectURIString]; + + // OIDAuthState is based on the request/response history. + // Creates history based on the data from the keychain, and client details passed in. + OIDServiceConfiguration *authConfig = + [[OIDServiceConfiguration alloc] initWithAuthorizationEndpoint:tokenURL tokenEndpoint:tokenURL]; + OIDAuthorizationRequest *authRequest = + [[OIDAuthorizationRequest alloc] initWithConfiguration:authConfig + clientId:clientID + clientSecret:clientSecret + scope:dict[kOAuth2ScopeKey] + redirectURL:redirectURI + responseType:OIDResponseTypeCode + state:nil + nonce:nil + codeVerifier:nil + codeChallenge:nil + codeChallengeMethod:nil + additionalParameters:nil]; + OIDAuthorizationResponse *authResponse = + [[OIDAuthorizationResponse alloc] initWithRequest:authRequest parameters:dict]; + // Exclude scope and refresh token parameters from additionalParameters. + NSMutableDictionary *additionalParameters = [dict mutableCopy]; + [additionalParameters removeObjectForKey:kOAuth2ScopeKey]; + [additionalParameters removeObjectForKey:kOAuth2RefreshTokenKey]; + OIDTokenRequest *tokenRequest = + [[OIDTokenRequest alloc] initWithConfiguration:authConfig + grantType:@"token" + authorizationCode:nil + redirectURL:redirectURI + clientID:clientID + clientSecret:clientSecret + scope:dict[kOAuth2ScopeKey] + refreshToken:dict[kOAuth2RefreshTokenKey] + codeVerifier:nil + additionalParameters:additionalParameters]; + OIDTokenResponse *tokenResponse = + [[OIDTokenResponse alloc] initWithRequest:tokenRequest parameters:dict]; + OIDAuthState *authState = [[OIDAuthState alloc] initWithAuthorizationResponse:authResponse + tokenResponse:tokenResponse]; + // We're not serializing the token expiry date, so the first refresh needs to be forced. + [authState setNeedsTokenRefresh]; + + GTMAppAuthFetcherAuthorization *authorizer = + [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState + serviceProvider:dict[kServiceProviderKey] + userID:dict[kUserIDKey] + userEmail:dict[kUserEmailKey] + userEmailIsVerified:dict[kUserEmailIsVerifiedKey]]; + return authorizer; +} + +#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + ++ (GTMAppAuthFetcherAuthorization *)authForGoogleFromKeychainForName:(NSString *)keychainItemName + clientID:(NSString *)clientID + clientSecret:(NSString *)clientSecret { + Class signInClass = self; + NSURL *tokenURL = [signInClass googleTokenURL]; + NSString *redirectURI = [signInClass nativeClientRedirectURI]; + + GTMAppAuthFetcherAuthorization *auth; + auth = [self authorizeFromKeychainForName:keychainItemName + tokenURL:tokenURL + redirectURI:redirectURI + clientID:clientID + clientSecret:clientSecret]; + return auth; +} + +#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +/*! @brief Removes stored tokens, such as when the user signs out. + @return YES the tokens were removed successfully (or didn't exist). + */ ++ (BOOL)removeAuthFromKeychainForName:(NSString *)keychainItemName { + return [GTMKeychain removePasswordFromKeychainForName:keychainItemName]; +} + +/*! @brief Saves the authorization state to the keychain, in a GTMOAuth2 compatible manner. + @return YES when the state was saved successfully. + */ ++ (BOOL)saveAuthToKeychainForName:(NSString *)keychainItemName + authentication:(GTMAppAuthFetcherAuthorization *)auth { + [self removeAuthFromKeychainForName:keychainItemName]; + NSString *password = [self persistenceResponseStringForAuthorization:auth]; + + return [GTMKeychain savePasswordToKeychainForName:keychainItemName password:password]; +} + +#pragma mark Utility Routines + ++ (NSString *)encodedQueryParametersForDictionary:(NSDictionary *)dict { + // Make a string like "cat=fluffy&dog=spot" + NSMutableString *result = [NSMutableString string]; + NSArray *sortedKeys = + [[dict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + NSString *joiner = @""; + for (NSString *key in sortedKeys) { + NSString *value = [dict objectForKey:key]; + NSString *encodedValue = [self encodedOAuthValueForString:value]; + NSString *encodedKey = [self encodedOAuthValueForString:key]; + [result appendFormat:@"%@%@=%@", joiner, encodedKey, encodedValue]; + joiner = @"&"; + } + return result; +} + ++ (NSString *)encodedOAuthValueForString:(NSString *)originalString { + // For parameters, we'll explicitly leave spaces unescaped now, and replace + // them with +'s + NSString *const kForceEscape = @"!*'();:@&=+$,/?%#[]"; + +#if (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_7_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0) + // Builds targeting iOS 7/OS X 10.9 and higher only. + NSMutableCharacterSet *cs = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; + [cs removeCharactersInString:kForceEscape]; + + return [originalString stringByAddingPercentEncodingWithAllowedCharacters:cs]; +#else + // Builds targeting iOS 6/OS X 10.8. + CFStringRef escapedStr = NULL; + if (originalString) { + escapedStr = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, + (CFStringRef)originalString, + NULL, + (CFStringRef)kForceEscape, + kCFStringEncodingUTF8); + } + + return (__bridge NSString *)escapedStr; +#endif +} + ++ (NSDictionary *)dictionaryWithResponseString:(NSString *)responseStr { + // Build a dictionary from a response string of the form + // "cat=fluffy&dog=spot". Missing or empty values are considered + // empty strings; keys and values are percent-decoded. + if (responseStr == nil) return nil; + + NSArray *items = [responseStr componentsSeparatedByString:@"&"]; + + NSMutableDictionary *responseDict = [NSMutableDictionary dictionaryWithCapacity:items.count]; + + for (NSString *item in items) { + NSString *key; + NSString *value = @""; + + NSRange equalsRange = [item rangeOfString:@"="]; + if (equalsRange.location != NSNotFound) { + // The parameter has at least one '=' + key = [item substringToIndex:equalsRange.location]; + + // There are characters after the '=' + if (equalsRange.location + 1 < item.length) { + value = [item substringFromIndex:(equalsRange.location + 1)]; + } + } else { + // The parameter has no '=' + key = item; + } + + NSString *plainKey = [self unencodedOAuthParameterForString:key]; + NSString *plainValue = [self unencodedOAuthParameterForString:value]; + + [responseDict setObject:plainValue forKey:plainKey]; + } + + return responseDict; +} + ++ (NSString *)unencodedOAuthParameterForString:(NSString *)str { +#if (!TARGET_OS_IPHONE \ + && defined(MAC_OS_X_VERSION_10_9) \ + && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9) \ + || (TARGET_OS_IPHONE \ + && defined(__IPHONE_7_0) \ + && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0) + // On iOS 7, -stringByRemovingPercentEncoding incorrectly returns nil for an empty string. + if (str != nil && [str length] == 0) return @""; + + NSString *plainStr = [str stringByRemovingPercentEncoding]; + return plainStr; +#else + NSString *plainStr = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + return plainStr; +#endif +} + +#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +// Endpoint URLs are available at https://accounts.google.com/.well-known/openid-configuration + ++ (NSURL *)googleAuthorizationURL { + NSString *str = @"https://accounts.google.com/o/oauth2/v2/auth"; + return (NSURL *)[NSURL URLWithString:str]; +} + ++ (NSURL *)googleTokenURL { + NSString *str = @"https://www.googleapis.com/oauth2/v4/token"; + return (NSURL *)[NSURL URLWithString:str]; +} + ++ (NSURL *)googleRevocationURL { + NSString *urlStr = @"https://accounts.google.com/o/oauth2/revoke"; + return (NSURL *)[NSURL URLWithString:urlStr]; +} + ++ (NSURL *)googleUserInfoURL { + NSString *urlStr = @"https://www.googleapis.com/oauth2/v3/userinfo"; + return (NSURL *)[NSURL URLWithString:urlStr]; +} + ++ (NSString *)nativeClientRedirectURI { + return kOOBString; +} + +#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +@end diff --git a/MyExperiences copy/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m b/MyExperiences copy/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m new file mode 100644 index 00000000..ab64882e --- /dev/null +++ b/MyExperiences copy/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m @@ -0,0 +1,287 @@ +/*! @file GTMKeychain_iOS.m + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "GTMKeychain.h" + +#import + +typedef NS_ENUM(NSInteger, GTMAppAuthFetcherAuthorizationGTMAppAuthGTMOAuth2KeychainError) { + GTMAppAuthGTMOAuth2KeychainErrorBadArguments = -1301, + GTMAppAuthGTMOAuth2KeychainErrorNoPassword = -1302 +}; + +/*! @brief Keychain helper class. + */ +@interface GTMAppAuthGTMOAuth2Keychain : NSObject + ++ (GTMAppAuthGTMOAuth2Keychain *)defaultKeychain; + +// OK to pass nil for the error parameter. +- (NSString *)passwordForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error; + +- (NSData *)passwordDataForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error; + +// OK to pass nil for the error parameter. +- (BOOL)removePasswordForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error; + +// OK to pass nil for the error parameter. +// +// accessibility should be one of the constants for kSecAttrAccessible +// such as kSecAttrAccessibleWhenUnlocked +- (BOOL)setPassword:(NSString *)password + forService:(NSString *)service + accessibility:(CFTypeRef)accessibility + account:(NSString *)account + error:(NSError **)error; + +- (BOOL)setPasswordData:(NSData *)passwordData + forService:(NSString *)service + accessibility:(CFTypeRef)accessibility + account:(NSString *)account + error:(NSError **)error; + +// For unit tests: allow setting a mock object ++ (void)setDefaultKeychain:(GTMAppAuthGTMOAuth2Keychain *)keychain; + +@end + +NSString *const kGTMAppAuthFetcherAuthorizationGTMOAuth2ErrorDomain = @"com.google.GTMOAuth2"; +NSString *const kGTMAppAuthFetcherAuthorizationGTMOAuth2KeychainErrorDomain = + @"com.google.GTMOAuthKeychain"; +static NSString *const kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName = @"OAuth"; +static GTMAppAuthGTMOAuth2Keychain* gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain = nil; + +@implementation GTMKeychain + ++ (BOOL)removePasswordFromKeychainForName:(NSString *)keychainItemName { + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + return [keychain removePasswordForService:keychainItemName + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:nil]; +} + ++ (NSString *)passwordFromKeychainForName:(NSString *)keychainItemName { + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + NSError *error; + NSString *password = + [keychain passwordForService:keychainItemName + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:&error]; + return password; +} + ++ (BOOL)savePasswordToKeychainForName:(NSString *)keychainItemName password:(NSString *)password { + return [self savePasswordToKeychainForName:keychainItemName + password:password + accessibility:NULL + error:NULL]; +} + ++ (BOOL)savePasswordToKeychainForName:(NSString *)keychainItemName password:(NSString *)password + accessibility:(CFTypeRef)accessibility + error:(NSError **)error { + if (accessibility == NULL) { + accessibility = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + } + // make a response string containing the values we want to save + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + return [keychain setPassword:password + forService:keychainItemName + accessibility:accessibility + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:error]; +} + +/*! @brief Saves the password string to the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @param password Password string to save. + @return YES when the password string was saved successfully. + */ ++ (BOOL)savePasswordDataToKeychainForName:(NSString *)keychainItemName + passwordData:(NSData *)password { + CFTypeRef accessibility = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + // make a response string containing the values we want to save + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + return [keychain setPasswordData:password + forService:keychainItemName + accessibility:accessibility + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:NULL]; +} + +/*! @brief Loads the password string from the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @return The password string at the given identifier, or nil. + */ ++ (NSData *)passwordDataFromKeychainForName:(NSString *)keychainItemName { + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + NSError *error; + NSData *password = + [keychain passwordDataForService:keychainItemName + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:&error]; + return password; +} + +@end + +#pragma mark GTMAppAuthGTMOAuth2Keychain + +@implementation GTMAppAuthGTMOAuth2Keychain + ++ (GTMAppAuthGTMOAuth2Keychain *)defaultKeychain { + static dispatch_once_t onceToken; + dispatch_once (&onceToken, ^{ + gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain = [[self alloc] init]; + }); + return gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain; +} + + +// For unit tests: allow setting a mock object ++ (void)setDefaultKeychain:(GTMAppAuthGTMOAuth2Keychain *)keychain { + if (gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain != keychain) { + gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain = keychain; + } +} + +- (NSString *)keyForService:(NSString *)service account:(NSString *)account { + return [NSString stringWithFormat:@"com.google.GTMOAuth.%@%@", service, account]; +} + ++ (NSMutableDictionary *)keychainQueryForService:(NSString *)service account:(NSString *)account { + NSMutableDictionary *query = + [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword, (id)kSecClass, + @"OAuth", (id)kSecAttrGeneric, + account, (id)kSecAttrAccount, + service, (id)kSecAttrService, + nil]; + return query; +} + +- (NSMutableDictionary *)keychainQueryForService:(NSString *)service account:(NSString *)account { + return [[self class] keychainQueryForService:service account:account]; +} + +// iPhone +- (NSString *)passwordForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error { + NSData *passwordData = [self passwordDataForService:service account:account error:error]; + if (!passwordData) { + return nil; + } + NSString *result = [[NSString alloc] initWithData:passwordData + encoding:NSUTF8StringEncoding]; + return result; +} + +// iPhone +- (NSData *)passwordDataForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error { + OSStatus status = GTMAppAuthGTMOAuth2KeychainErrorBadArguments; + NSData *result = nil; + if (service.length > 0 && account.length > 0) { + CFDataRef passwordData = NULL; + NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; + [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; + [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; + + status = SecItemCopyMatching((CFDictionaryRef)keychainQuery, + (CFTypeRef *)&passwordData); + if (status == noErr && 0 < [(__bridge NSData *)passwordData length]) { + result = [(__bridge NSData *)passwordData copy]; + } + if (passwordData != NULL) { + CFRelease(passwordData); + } + } + if (status != noErr && error != NULL) { + *error = [NSError errorWithDomain:kGTMAppAuthFetcherAuthorizationGTMOAuth2KeychainErrorDomain + code:status + userInfo:nil]; + } + return result; +} + +// iPhone +- (BOOL)removePasswordForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error { + OSStatus status = GTMAppAuthGTMOAuth2KeychainErrorBadArguments; + if (0 < [service length] && 0 < [account length]) { + NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; + status = SecItemDelete((CFDictionaryRef)keychainQuery); + } + if (status != noErr && error != NULL) { + *error = [NSError errorWithDomain:kGTMAppAuthFetcherAuthorizationGTMOAuth2KeychainErrorDomain + code:status + userInfo:nil]; + } + return status == noErr; +} + +// iPhone +- (BOOL)setPassword:(NSString *)password + forService:(NSString *)service + accessibility:(CFTypeRef)accessibility + account:(NSString *)account + error:(NSError **)error { + NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding]; + return [self setPasswordData:passwordData + forService:service + accessibility:accessibility + account:account + error:error]; +} + +- (BOOL)setPasswordData:(NSData *)passwordData + forService:(NSString *)service + accessibility:(CFTypeRef)accessibility + account:(NSString *)account + error:(NSError **)error { + OSStatus status = GTMAppAuthGTMOAuth2KeychainErrorBadArguments; + if (0 < [service length] && 0 < [account length]) { + [self removePasswordForService:service account:account error:nil]; + if (0 < [passwordData length]) { + NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; + [keychainQuery setObject:passwordData forKey:(id)kSecValueData]; + + if (accessibility != NULL) { + [keychainQuery setObject:(__bridge id)accessibility + forKey:(id)kSecAttrAccessible]; + } + status = SecItemAdd((CFDictionaryRef)keychainQuery, NULL); + } + } + if (status != noErr && error != NULL) { + *error = [NSError errorWithDomain:kGTMAppAuthFetcherAuthorizationGTMOAuth2KeychainErrorDomain + code:status + userInfo:nil]; + } + return status == noErr; +} + +@end diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/LICENSE b/MyExperiences copy/Pods/GTMSessionFetcher/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/README.md b/MyExperiences copy/Pods/GTMSessionFetcher/README.md new file mode 100644 index 00000000..478efde9 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/README.md @@ -0,0 +1,23 @@ +# Google Toolbox for Mac - Session Fetcher # + +**Project site**
+**Discussion group** + +[![Build Status](https://travis-ci.org/google/gtm-session-fetcher.svg?branch=master)](https://travis-ci.org/google/gtm-session-fetcher) + +`GTMSessionFetcher` makes it easy for Cocoa applications to perform http +operations. The fetcher is implemented as a wrapper on `NSURLSession`, so its +behavior is asynchronous and uses operating-system settings on iOS and Mac OS X. + +Features include: +- Simple to build; only one source/header file pair is required +- Simple to use: takes just two lines of code to fetch a request +- Supports upload and download sessions +- Flexible cookie storage +- Automatic retry on errors, with exponential backoff +- Support for generating multipart MIME upload streams +- Easy, convenient logging of http requests and responses +- Supports plug-in authentication such as with GTMAppAuth +- Easily testable; self-mocking +- Automatic rate limiting when created by the `GTMSessionFetcherService` factory class +- Fully independent of other projects diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h new file mode 100644 index 00000000..ec3c0125 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h @@ -0,0 +1,52 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// The GTMGatherInput stream is an input stream implementation that is to be +// instantiated with an NSArray of NSData objects. It works in the traditional +// scatter/gather vector I/O model. Rather than allocating a big NSData object +// to hold all of the data and performing a copy into that object, the +// GTMGatherInputStream will maintain a reference to the NSArray and read from +// each NSData in turn as the read method is called. You should not alter the +// underlying set of NSData objects until all read operations on this input +// stream have completed. + +#import + +#ifndef GTM_NONNULL + #if defined(__has_attribute) + #if __has_attribute(nonnull) + #define GTM_NONNULL(x) __attribute__((nonnull x)) + #else + #define GTM_NONNULL(x) + #endif + #else + #define GTM_NONNULL(x) + #endif +#endif + +// Avoid multiple declaration of this class. +// +// Note: This should match the declaration of GTMGatherInputStream in GTMMIMEDocument.m + +#ifndef GTM_GATHERINPUTSTREAM_DECLARED +#define GTM_GATHERINPUTSTREAM_DECLARED + +@interface GTMGatherInputStream : NSInputStream + ++ (NSInputStream *)streamWithArray:(NSArray *)dataArray GTM_NONNULL((1)); + +@end + +#endif // GTM_GATHERINPUTSTREAM_DECLARED diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m new file mode 100644 index 00000000..0f65310f --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m @@ -0,0 +1,185 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMGatherInputStream.h" + +@implementation GTMGatherInputStream { + NSArray *_dataArray; // NSDatas that should be "gathered" and streamed. + NSUInteger _arrayIndex; // Index in the array of the current NSData. + long long _dataOffset; // Offset in the current NSData we are processing. + NSStreamStatus _streamStatus; + id __weak _delegate; // Stream delegate, defaults to self. +} + ++ (NSInputStream *)streamWithArray:(NSArray *)dataArray { + return [(GTMGatherInputStream *)[self alloc] initWithArray:dataArray]; +} + +- (instancetype)initWithArray:(NSArray *)dataArray { + self = [super init]; + if (self) { + _dataArray = dataArray; + _delegate = self; // An NSStream's default delegate should be self. + } + return self; +} + +#pragma mark - NSStream + +- (void)open { + _arrayIndex = 0; + _dataOffset = 0; + _streamStatus = NSStreamStatusOpen; +} + +- (void)close { + _streamStatus = NSStreamStatusClosed; +} + +- (id)delegate { + return _delegate; +} + +- (void)setDelegate:(id)delegate { + if (delegate == nil) { + _delegate = self; + } else { + _delegate = delegate; + } +} + +- (id)propertyForKey:(NSString *)key { + if ([key isEqual:NSStreamFileCurrentOffsetKey]) { + return @([self absoluteOffset]); + } + return nil; +} + +- (BOOL)setProperty:(id)property forKey:(NSString *)key { + if ([key isEqual:NSStreamFileCurrentOffsetKey]) { + NSNumber *absoluteOffsetNumber = property; + [self setAbsoluteOffset:absoluteOffsetNumber.longLongValue]; + return YES; + } + return NO; +} + +- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { +} + +- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { +} + +- (NSStreamStatus)streamStatus { + return _streamStatus; +} + +- (NSError *)streamError { + return nil; +} + +#pragma mark - NSInputStream + +- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len { + NSInteger bytesRead = 0; + NSUInteger bytesRemaining = len; + + // Read bytes from the currently-indexed array. + while ((bytesRemaining > 0) && (_arrayIndex < _dataArray.count)) { + NSData *data = [_dataArray objectAtIndex:_arrayIndex]; + + NSUInteger dataLen = data.length; + NSUInteger dataBytesLeft = dataLen - (NSUInteger)_dataOffset; + + NSUInteger bytesToCopy = MIN(bytesRemaining, dataBytesLeft); + NSRange range = NSMakeRange((NSUInteger) _dataOffset, bytesToCopy); + + [data getBytes:(buffer + bytesRead) range:range]; + + bytesRead += bytesToCopy; + _dataOffset += bytesToCopy; + bytesRemaining -= bytesToCopy; + + if (_dataOffset == (long long)dataLen) { + _dataOffset = 0; + _arrayIndex++; + } + } + if (_arrayIndex >= _dataArray.count) { + _streamStatus = NSStreamStatusAtEnd; + } + return bytesRead; +} + +- (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len { + return NO; // We don't support this style of reading. +} + +- (BOOL)hasBytesAvailable { + // If we return no, the read never finishes, even if we've already delivered all the bytes. + return YES; +} + +#pragma mark - NSStreamDelegate + +- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { + id delegate = _delegate; + if (delegate != self) { + [delegate stream:self handleEvent:streamEvent]; + } +} + +#pragma mark - Private + +- (long long)absoluteOffset { + long long absoluteOffset = 0; + NSUInteger index = 0; + for (NSData *data in _dataArray) { + if (index >= _arrayIndex) { + break; + } + absoluteOffset += data.length; + ++index; + } + absoluteOffset += _dataOffset; + return absoluteOffset; +} + +- (void)setAbsoluteOffset:(long long)absoluteOffset { + if (absoluteOffset < 0) { + absoluteOffset = 0; + } + _arrayIndex = 0; + _dataOffset = absoluteOffset; + for (NSData *data in _dataArray) { + long long dataLen = (long long) data.length; + if (dataLen > _dataOffset) { + break; + } + _arrayIndex++; + _dataOffset -= dataLen; + } + if (_arrayIndex == _dataArray.count) { + if (_dataOffset > 0) { + _dataOffset = 0; + } + } +} + +@end diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h new file mode 100644 index 00000000..451e1323 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h @@ -0,0 +1,148 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// This is a simple class to create or parse a MIME document. + +// To create a MIME document, allocate a new GTMMIMEDocument and start adding parts. +// When you are done adding parts, call generateInputStream or generateDispatchData. +// +// A good reference for MIME is http://en.wikipedia.org/wiki/MIME + +#import + +#ifndef GTM_NONNULL + #if defined(__has_attribute) + #if __has_attribute(nonnull) + #define GTM_NONNULL(x) __attribute__((nonnull x)) + #else + #define GTM_NONNULL(x) + #endif + #else + #define GTM_NONNULL(x) + #endif +#endif + +#ifndef GTM_DECLARE_GENERICS + #if __has_feature(objc_generics) + #define GTM_DECLARE_GENERICS 1 + #else + #define GTM_DECLARE_GENERICS 0 + #endif +#endif + +#ifndef GTM_NSArrayOf + #if GTM_DECLARE_GENERICS + #define GTM_NSArrayOf(value) NSArray + #define GTM_NSDictionaryOf(key, value) NSDictionary + #else + #define GTM_NSArrayOf(value) NSArray + #define GTM_NSDictionaryOf(key, value) NSDictionary + #endif // GTM_DECLARE_GENERICS +#endif // GTM_NSArrayOf + + +// GTMMIMEDocumentPart represents a part of a MIME document. +// +// +[GTMMIMEDocument MIMEPartsWithBoundary:data:] returns an array of these. +@interface GTMMIMEDocumentPart : NSObject + +@property(nonatomic, readonly) GTM_NSDictionaryOf(NSString *, NSString *) *headers; +@property(nonatomic, readonly) NSData *headerData; +@property(nonatomic, readonly) NSData *body; +@property(nonatomic, readonly) NSUInteger length; + ++ (instancetype)partWithHeaders:(NSDictionary *)headers body:(NSData *)body; + +@end + +@interface GTMMIMEDocument : NSObject + +// Get or set the unique boundary for the parts that have been added. +// +// When creating a MIME document from parts, this is typically calculated +// automatically after all parts have been added. +@property(nonatomic, copy) NSString *boundary; + +#pragma mark - Methods for Creating a MIME Document + ++ (instancetype)MIMEDocument; + +// Adds a new part to this mime document with the given headers and body. +// The headers keys and values should be NSStrings. +// Adding a part may cause the boundary string to change. +- (void)addPartWithHeaders:(GTM_NSDictionaryOf(NSString *, NSString *) *)headers + body:(NSData *)body GTM_NONNULL((1,2)); + +// An inputstream that can be used to efficiently read the contents of the MIME document. +// +// Any parameter may be null if the result is not wanted. +- (void)generateInputStream:(NSInputStream **)outStream + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary; + +// A dispatch_data_t with the contents of the MIME document. +// +// Note: dispatch_data_t is one-way toll-free bridged so the result +// may be cast directly to NSData *. +// +// Any parameter may be null if the result is not wanted. +- (void)generateDispatchData:(dispatch_data_t *)outDispatchData + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary; + +// Utility method for making a header section, including trailing newlines. ++ (NSData *)dataWithHeaders:(GTM_NSDictionaryOf(NSString *, NSString *) *)headers; + +#pragma mark - Methods for Parsing a MIME Document + +// Method for parsing out an array of MIME parts from a MIME document. +// +// Returns an array of GTMMIMEDocumentParts. Returns nil if no part can +// be found. ++ (GTM_NSArrayOf(GTMMIMEDocumentPart *) *)MIMEPartsWithBoundary:(NSString *)boundary + data:(NSData *)fullDocumentData; + +// Utility method for efficiently searching possibly discontiguous NSData +// for occurrences of target byte. This method does not "flatten" an NSData +// that is composed of discontiguous blocks. +// +// The byte offsets of non-overlapping occurrences of the target are returned as +// NSNumbers in the array. ++ (void)searchData:(NSData *)data + targetBytes:(const void *)targetBytes + targetLength:(NSUInteger)targetLength + foundOffsets:(GTM_NSArrayOf(NSNumber *) **)outFoundOffsets; + +// Utility method to parse header bytes into an NSDictionary. ++ (GTM_NSDictionaryOf(NSString *, NSString *) *)headersWithData:(NSData *)data; + +// ------ UNIT TESTING ONLY BELOW ------ + +// Internal methods, exposed for unit testing only. +- (void)seedRandomWith:(u_int32_t)seed; + ++ (NSUInteger)findBytesWithNeedle:(const unsigned char *)needle + needleLength:(NSUInteger)needleLength + haystack:(const unsigned char *)haystack + haystackLength:(NSUInteger)haystackLength + foundOffset:(NSUInteger *)foundOffset; + ++ (void)searchData:(NSData *)data + targetBytes:(const void *)targetBytes + targetLength:(NSUInteger)targetLength + foundOffsets:(GTM_NSArrayOf(NSNumber *) **)outFoundOffsets + foundBlockNumbers:(GTM_NSArrayOf(NSNumber *) **)outFoundBlockNumbers; + +@end diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m new file mode 100644 index 00000000..f4460c5d --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m @@ -0,0 +1,631 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMMIMEDocument.h" + +// Avoid a hard dependency on GTMGatherInputStream. +#ifndef GTM_GATHERINPUTSTREAM_DECLARED +#define GTM_GATHERINPUTSTREAM_DECLARED + +@interface GTMGatherInputStream : NSInputStream + ++ (NSInputStream *)streamWithArray:(NSArray *)dataArray GTM_NONNULL((1)); + +@end +#endif // GTM_GATHERINPUTSTREAM_DECLARED + +// FindBytes +// +// Helper routine to search for the existence of a set of bytes (needle) within +// a presumed larger set of bytes (haystack). Can find the first part of the +// needle at the very end of the haystack. +// +// Returns the needle length on complete success, the number of bytes matched +// if a partial needle was found at the end of the haystack, and 0 on failure. +static NSUInteger FindBytes(const unsigned char *needle, NSUInteger needleLen, + const unsigned char *haystack, NSUInteger haystackLen, + NSUInteger *foundOffset); + +// SearchDataForBytes +// +// This implements the functionality of the +searchData: methods below. See the documentation +// for those methods. +static void SearchDataForBytes(NSData *data, const void *targetBytes, NSUInteger targetLength, + NSMutableArray *foundOffsets, NSMutableArray *foundBlockNumbers); + +@implementation GTMMIMEDocumentPart { + NSDictionary *_headers; + NSData *_headerData; // Header content including the ending "\r\n". + NSData *_bodyData; +} + +@synthesize headers = _headers, + headerData = _headerData, + body = _bodyData; + +@dynamic length; + ++ (instancetype)partWithHeaders:(NSDictionary *)headers body:(NSData *)body { + return [[self alloc] initWithHeaders:headers body:body]; +} + +- (instancetype)initWithHeaders:(NSDictionary *)headers body:(NSData *)body { + self = [super init]; + if (self) { + _bodyData = body; + _headers = headers; + } + return self; +} + +// Returns true if the part's header or data contain the given set of bytes. +// +// NOTE: We assume that the 'bytes' we are checking for do not contain "\r\n", +// so we don't need to check the concatenation of the header and body bytes. +- (BOOL)containsBytes:(const unsigned char *)bytes length:(NSUInteger)length { + // This uses custom search code rather than strcpy because the encoded data may contain + // null values. + NSData *headerData = self.headerData; + return (FindBytes(bytes, length, headerData.bytes, headerData.length, NULL) == length || + FindBytes(bytes, length, _bodyData.bytes, _bodyData.length, NULL) == length); +} + +- (NSData *)headerData { + if (!_headerData) { + _headerData = [GTMMIMEDocument dataWithHeaders:_headers]; + } + return _headerData; +} + +- (NSData *)body { + return _bodyData; +} + +- (NSUInteger)length { + return _headerData.length + _bodyData.length; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p (headers %lu keys, body %lu bytes)", + [self class], self, (unsigned long)_headers.count, + (unsigned long)_bodyData.length]; +} + +- (BOOL)isEqual:(GTMMIMEDocumentPart *)other { + if (self == other) return YES; + if (![other isKindOfClass:[GTMMIMEDocumentPart class]]) return NO; + return ((_bodyData == other->_bodyData || [_bodyData isEqual:other->_bodyData]) + && (_headers == other->_headers || [_headers isEqual:other->_headers])); +} + +- (NSUInteger)hash { + return _bodyData.hash | _headers.hash; +} + +@end + +@implementation GTMMIMEDocument { + NSMutableArray *_parts; // Ordered array of GTMMIMEDocumentParts. + unsigned long long _length; // Length in bytes of the document. + NSString *_boundary; + u_int32_t _randomSeed; // For testing. +} + ++ (instancetype)MIMEDocument { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _parts = [[NSMutableArray alloc] init]; + } + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p (%lu parts)", + [self class], self, (unsigned long)_parts.count]; +} + +#pragma mark - Joining Parts + +// Adds a new part to this mime document with the given headers and body. +- (void)addPartWithHeaders:(NSDictionary *)headers body:(NSData *)body { + GTMMIMEDocumentPart *part = [GTMMIMEDocumentPart partWithHeaders:headers body:body]; + [_parts addObject:part]; + _boundary = nil; +} + +// For unit testing only, seeds the random number generator so that we will +// have reproducible boundary strings. +- (void)seedRandomWith:(u_int32_t)seed { + _randomSeed = seed; + _boundary = nil; +} + +- (u_int32_t)random { + if (_randomSeed) { + // For testing only. + return _randomSeed++; + } else { + return arc4random(); + } +} + +// Computes the mime boundary to use. This should only be called +// after all the desired document parts have been added since it must compute +// a boundary that does not exist in the document data. +- (NSString *)boundary { + if (_boundary) { + return _boundary; + } + + // Use an easily-readable boundary string. + NSString *const kBaseBoundary = @"END_OF_PART"; + + _boundary = kBaseBoundary; + + // If the boundary isn't unique, append random numbers, up to 10 attempts; + // if that's still not unique, use a random number sequence instead, and call it good. + BOOL didCollide = NO; + + const int maxTries = 10; // Arbitrarily chosen maximum attempts. + for (int tries = 0; tries < maxTries; ++tries) { + + NSData *data = [_boundary dataUsingEncoding:NSUTF8StringEncoding]; + const void *dataBytes = data.bytes; + NSUInteger dataLen = data.length; + + for (GTMMIMEDocumentPart *part in _parts) { + didCollide = [part containsBytes:dataBytes length:dataLen]; + if (didCollide) break; + } + + if (!didCollide) break; // We're fine, no more attempts needed. + + // Try again with a random number appended. + _boundary = [NSString stringWithFormat:@"%@_%08x", kBaseBoundary, [self random]]; + } + + if (didCollide) { + // Fallback... two random numbers. + _boundary = [NSString stringWithFormat:@"%08x_tedborg_%08x", [self random], [self random]]; + } + return _boundary; +} + +- (void)setBoundary:(NSString *)str { + _boundary = [str copy]; +} + +// Internal method. +- (void)generateDataArray:(NSMutableArray *)dataArray + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary { + + // The input stream is of the form: + // --boundary + // [part_1_headers] + // [part_1_data] + // --boundary + // [part_2_headers] + // [part_2_data] + // --boundary-- + + // First we set up our boundary NSData objects. + NSString *boundary = self.boundary; + + NSString *mainBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary]; + NSString *endBoundary = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary]; + + NSData *mainBoundaryData = [mainBoundary dataUsingEncoding:NSUTF8StringEncoding]; + NSData *endBoundaryData = [endBoundary dataUsingEncoding:NSUTF8StringEncoding]; + + // Now we add them all in proper order to our dataArray. + unsigned long long length = 0; + + for (GTMMIMEDocumentPart *part in _parts) { + [dataArray addObject:mainBoundaryData]; + [dataArray addObject:part.headerData]; + [dataArray addObject:part.body]; + + length += part.length + mainBoundaryData.length; + } + + [dataArray addObject:endBoundaryData]; + length += endBoundaryData.length; + + if (outLength) *outLength = length; + if (outBoundary) *outBoundary = boundary; +} + +- (void)generateInputStream:(NSInputStream **)outStream + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary { + NSMutableArray *dataArray = outStream ? [NSMutableArray array] : nil; + [self generateDataArray:dataArray + length:outLength + boundary:outBoundary]; + + if (outStream) { + Class streamClass = NSClassFromString(@"GTMGatherInputStream"); + NSAssert(streamClass != nil, @"GTMGatherInputStream not available."); + + *outStream = [streamClass streamWithArray:dataArray]; + } +} + +- (void)generateDispatchData:(dispatch_data_t *)outDispatchData + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary { + NSMutableArray *dataArray = outDispatchData ? [NSMutableArray array] : nil; + [self generateDataArray:dataArray + length:outLength + boundary:outBoundary]; + + if (outDispatchData) { + // Create an empty data accumulator. + dispatch_data_t dataAccumulator; + + dispatch_queue_t bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + + for (NSData *partData in dataArray) { + __block NSData *immutablePartData = [partData copy]; + dispatch_data_t newDataPart = + dispatch_data_create(immutablePartData.bytes, immutablePartData.length, bgQueue, ^{ + // We want the data retained until this block executes. + immutablePartData = nil; + }); + + if (dataAccumulator == nil) { + // First part. + dataAccumulator = newDataPart; + } else { + // Append the additional part. + dataAccumulator = dispatch_data_create_concat(dataAccumulator, newDataPart); + } + } + *outDispatchData = dataAccumulator; + } +} + ++ (NSData *)dataWithHeaders:(NSDictionary *)headers { + // Generate the header data by coalescing the dictionary as lines of "key: value\r\n". + NSMutableString* headerString = [NSMutableString string]; + + // Sort the header keys so we have a deterministic order for unit testing. + SEL sortSel = @selector(caseInsensitiveCompare:); + NSArray *sortedKeys = [headers.allKeys sortedArrayUsingSelector:sortSel]; + + for (NSString *key in sortedKeys) { + NSString *value = [headers objectForKey:key]; + +#if DEBUG + // Look for troublesome characters in the header keys & values. + NSCharacterSet *badKeyChars = [NSCharacterSet characterSetWithCharactersInString:@":\r\n"]; + NSCharacterSet *badValueChars = [NSCharacterSet characterSetWithCharactersInString:@"\r\n"]; + + NSRange badRange = [key rangeOfCharacterFromSet:badKeyChars]; + NSAssert(badRange.location == NSNotFound, @"invalid key: %@", key); + + badRange = [value rangeOfCharacterFromSet:badValueChars]; + NSAssert(badRange.location == NSNotFound, @"invalid value: %@", value); +#endif + + [headerString appendFormat:@"%@: %@\r\n", key, value]; + } + // Headers end with an extra blank line. + [headerString appendString:@"\r\n"]; + + NSData *result = [headerString dataUsingEncoding:NSUTF8StringEncoding]; + return result; +} + +#pragma mark - Separating Parts + ++ (NSArray *)MIMEPartsWithBoundary:(NSString *)boundary + data:(NSData *)fullDocumentData { + // In MIME documents, the boundary is preceded by CRLF and two dashes, and followed + // at the end by two dashes. + NSData *boundaryData = [boundary dataUsingEncoding:NSUTF8StringEncoding]; + NSUInteger boundaryLength = boundaryData.length; + + NSMutableArray *foundBoundaryOffsets; + [self searchData:fullDocumentData + targetBytes:boundaryData.bytes + targetLength:boundaryLength + foundOffsets:&foundBoundaryOffsets]; + + // According to rfc1341, ignore anything before the first boundary, or after the last, though two + // dashes are expected to follow the last boundary. + if (foundBoundaryOffsets.count < 2) { + return nil; + } + + // Wrap the full document data with a dispatch_data_t for more efficient slicing + // and dicing. + dispatch_data_t dataWrapper; + if ([fullDocumentData conformsToProtocol:@protocol(OS_dispatch_data)]) { + dataWrapper = (dispatch_data_t)fullDocumentData; + } else { + // A no-op self invocation on fullDocumentData will keep it retained until the block is invoked. + dispatch_queue_t bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dataWrapper = dispatch_data_create(fullDocumentData.bytes, + fullDocumentData.length, + bgQueue, ^{ [fullDocumentData self]; }); + } + NSMutableArray *parts; + NSInteger previousBoundaryOffset = -1; + NSInteger partCounter = -1; + NSInteger numberOfPartsWithHeaders = 0; + for (NSNumber *currentBoundaryOffset in foundBoundaryOffsets) { + ++partCounter; + if (previousBoundaryOffset == -1) { + // This is the first boundary. + previousBoundaryOffset = currentBoundaryOffset.integerValue; + continue; + } else { + // Create a part data subrange between the previous boundary and this one. + // + // The last four bytes before a boundary are CRLF--. + // The first two bytes following a boundary are either CRLF or, for the last boundary, --. + NSInteger previousPartDataStartOffset = + previousBoundaryOffset + (NSInteger)boundaryLength + 2; + NSInteger previousPartDataEndOffset = currentBoundaryOffset.integerValue - 4; + NSInteger previousPartDataLength = previousPartDataEndOffset - previousPartDataStartOffset; + + if (previousPartDataLength < 2) { + // The preceding part was too short to be useful. +#if DEBUG + NSLog(@"MIME part %ld has %ld bytes", (long)partCounter - 1, + (long)previousPartDataLength); +#endif + } else { + if (!parts) parts = [NSMutableArray array]; + + dispatch_data_t partData = + dispatch_data_create_subrange(dataWrapper, + (size_t)previousPartDataStartOffset, (size_t)previousPartDataLength); + // Scan the part data for the separator between headers and body. After the CRLF, + // either the headers start immediately, or there's another CRLF and there are no headers. + // + // We need to map the part data to get the first two bytes. (Or we could cast it to + // NSData and get the bytes pointer of that.) If we're concerned that a single part + // data may be expensive to map, we could make a subrange here for just the first two bytes, + // and map that two-byte subrange. + const void *partDataBuffer; + size_t partDataBufferSize; + dispatch_data_t mappedPartData NS_VALID_UNTIL_END_OF_SCOPE = + dispatch_data_create_map(partData, &partDataBuffer, &partDataBufferSize); + dispatch_data_t bodyData; + NSDictionary *headers; + BOOL hasAnotherCRLF = (((char *)partDataBuffer)[0] == '\r' + && ((char *)partDataBuffer)[1] == '\n'); + mappedPartData = nil; + + if (hasAnotherCRLF) { + // There are no headers; skip the CRLF to get to the body, and leave headers nil. + bodyData = dispatch_data_create_subrange(partData, 2, (size_t)previousPartDataLength - 2); + } else { + // There are part headers. They are separated from body data by CRLFCRLF. + NSArray *crlfOffsets; + [self searchData:(NSData *)partData + targetBytes:"\r\n\r\n" + targetLength:4 + foundOffsets:&crlfOffsets]; + if (crlfOffsets.count == 0) { +#if DEBUG + // We could not distinguish body and headers. + NSLog(@"MIME part %ld lacks a header separator: %@", (long)partCounter - 1, + [[NSString alloc] initWithData:(NSData *)partData encoding:NSUTF8StringEncoding]); +#endif + } else { + NSInteger headerSeparatorOffset = ((NSNumber *)crlfOffsets.firstObject).integerValue; + dispatch_data_t headerData = + dispatch_data_create_subrange(partData, 0, (size_t)headerSeparatorOffset); + headers = [self headersWithData:(NSData *)headerData]; + + bodyData = dispatch_data_create_subrange(partData, (size_t)headerSeparatorOffset + 4, + (size_t)(previousPartDataLength - (headerSeparatorOffset + 4))); + + numberOfPartsWithHeaders++; + } // crlfOffsets.count == 0 + } // hasAnotherCRLF + GTMMIMEDocumentPart *part = [GTMMIMEDocumentPart partWithHeaders:headers + body:(NSData *)bodyData]; + [parts addObject:part]; + } // previousPartDataLength < 2 + previousBoundaryOffset = currentBoundaryOffset.integerValue; + } + } +#if DEBUG + // In debug builds, warn if a reasonably long document lacks any CRLF characters. + if (numberOfPartsWithHeaders == 0) { + NSUInteger length = fullDocumentData.length; + if (length > 20) { // Reasonably long. + NSMutableArray *foundCRLFs; + [self searchData:fullDocumentData + targetBytes:"\r\n" + targetLength:2 + foundOffsets:&foundCRLFs]; + if (foundCRLFs.count == 0) { + // Parts were logged above (due to lacking header separators.) + NSLog(@"Warning: MIME document lacks any headers (may have wrong line endings)"); + } + } + } +#endif // DEBUG + return parts; +} + +// Efficiently search the supplied data for the target bytes. +// +// This uses enumerateByteRangesUsingBlock: to scan for bytes. It can find +// the target even if it spans multiple separate byte ranges. +// +// Returns an array of found byte offset values, as NSNumbers. ++ (void)searchData:(NSData *)data + targetBytes:(const void *)targetBytes + targetLength:(NSUInteger)targetLength + foundOffsets:(GTM_NSArrayOf(NSNumber *) **)outFoundOffsets { + NSMutableArray *foundOffsets = [NSMutableArray array]; + SearchDataForBytes(data, targetBytes, targetLength, foundOffsets, NULL); + *outFoundOffsets = foundOffsets; +} + + +// This version of searchData: also returns the block numbers (0-based) where the +// target was found, used for testing that the supplied dispatch_data buffer +// has not been flattened. ++ (void)searchData:(NSData *)data + targetBytes:(const void *)targetBytes + targetLength:(NSUInteger)targetLength + foundOffsets:(GTM_NSArrayOf(NSNumber *) **)outFoundOffsets + foundBlockNumbers:(GTM_NSArrayOf(NSNumber *) **)outFoundBlockNumbers { + NSMutableArray *foundOffsets = [NSMutableArray array]; + NSMutableArray *foundBlockNumbers = [NSMutableArray array]; + + SearchDataForBytes(data, targetBytes, targetLength, foundOffsets, foundBlockNumbers); + *outFoundOffsets = foundOffsets; + *outFoundBlockNumbers = foundBlockNumbers; +} + +static void SearchDataForBytes(NSData *data, const void *targetBytes, NSUInteger targetLength, + NSMutableArray *foundOffsets, NSMutableArray *foundBlockNumbers) { + __block NSUInteger priorPartialMatchAmount = 0; + __block NSInteger priorPartialMatchStartingBlockNumber = -1; + __block NSInteger blockNumber = -1; + + [data enumerateByteRangesUsingBlock:^(const void *bytes, + NSRange byteRange, + BOOL *stop) { + // Search for the first character in the current range. + const void *ptr = bytes; + NSInteger remainingInCurrentRange = (NSInteger)byteRange.length; + ++blockNumber; + + if (priorPartialMatchAmount > 0) { + NSUInteger amountRemainingToBeMatched = targetLength - priorPartialMatchAmount; + NSUInteger remainingFoundOffset; + NSUInteger amountMatched = FindBytes(targetBytes + priorPartialMatchAmount, + amountRemainingToBeMatched, + ptr, (NSUInteger)remainingInCurrentRange, &remainingFoundOffset); + if (amountMatched == 0 || remainingFoundOffset > 0) { + // No match of the rest of the prior partial match in this range. + } else if (amountMatched < amountRemainingToBeMatched) { + // Another partial match; we're done with this range. + priorPartialMatchAmount = priorPartialMatchAmount + amountMatched; + return; + } else { + // The offset is in an earlier range. + NSUInteger offset = byteRange.location - priorPartialMatchAmount; + [foundOffsets addObject:@(offset)]; + [foundBlockNumbers addObject:@(priorPartialMatchStartingBlockNumber)]; + priorPartialMatchStartingBlockNumber = -1; + } + priorPartialMatchAmount = 0; + } + + while (remainingInCurrentRange > 0) { + NSUInteger offsetFromPtr; + NSUInteger amountMatched = FindBytes(targetBytes, targetLength, ptr, + (NSUInteger)remainingInCurrentRange, &offsetFromPtr); + if (amountMatched == 0) { + // No match in this range. + return; + } + if (amountMatched < targetLength) { + // Found a partial target. If there's another range, we'll check for the rest. + priorPartialMatchAmount = amountMatched; + priorPartialMatchStartingBlockNumber = blockNumber; + return; + } + // Found the full target. + NSUInteger globalOffset = byteRange.location + (NSUInteger)(ptr - bytes) + offsetFromPtr; + + [foundOffsets addObject:@(globalOffset)]; + [foundBlockNumbers addObject:@(blockNumber)]; + + ptr += targetLength + offsetFromPtr; + remainingInCurrentRange -= (targetLength + offsetFromPtr); + } + }]; +} + +// Internal method only for testing; this calls through the static method. ++ (NSUInteger)findBytesWithNeedle:(const unsigned char *)needle + needleLength:(NSUInteger)needleLength + haystack:(const unsigned char *)haystack + haystackLength:(NSUInteger)haystackLength + foundOffset:(NSUInteger *)foundOffset { + return FindBytes(needle, needleLength, haystack, haystackLength, foundOffset); +} + +// Utility method to parse header bytes into an NSDictionary. ++ (NSDictionary *)headersWithData:(NSData *)data { + NSString *headersString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + if (!headersString) return nil; + + NSMutableDictionary *headers = [NSMutableDictionary dictionary]; + NSScanner *scanner = [NSScanner scannerWithString:headersString]; + // The scanner is skipping leading whitespace and newline characters by default. + NSCharacterSet *newlineCharacters = [NSCharacterSet newlineCharacterSet]; + NSString *key; + NSString *value; + while ([scanner scanUpToString:@":" intoString:&key] + && [scanner scanString:@":" intoString:NULL] + && [scanner scanUpToCharactersFromSet:newlineCharacters intoString:&value]) { + [headers setObject:value forKey:key]; + // Discard the trailing newline. + [scanner scanCharactersFromSet:newlineCharacters intoString:NULL]; + } + return headers; +} + +@end + +// Return how much of the needle was found in the haystack. +// +// If the result is less than needleLen, then the beginning of the needle +// was found at the end of the haystack. +static NSUInteger FindBytes(const unsigned char* needle, NSUInteger needleLen, + const unsigned char* haystack, NSUInteger haystackLen, + NSUInteger *foundOffset) { + const unsigned char *ptr = haystack; + NSInteger remain = (NSInteger)haystackLen; + // Assume memchr is an efficient way to find a match for the first + // byte of the needle, and memcmp is an efficient way to compare a + // range of bytes. + while (remain > 0 && (ptr = memchr(ptr, needle[0], (size_t)remain)) != 0) { + // The first character is present. + NSUInteger offset = (NSUInteger)(ptr - haystack); + remain = (NSInteger)(haystackLen - offset); + + NSUInteger amountToCompare = MIN((NSUInteger)remain, needleLen); + if (memcmp(ptr, needle, amountToCompare) == 0) { + if (foundOffset) *foundOffset = offset; + return amountToCompare; + } + ptr++; + remain--; + } + if (foundOffset) *foundOffset = 0; + return 0; +} diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h new file mode 100644 index 00000000..4e306428 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h @@ -0,0 +1,49 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#ifndef GTM_NONNULL + #if defined(__has_attribute) + #if __has_attribute(nonnull) + #define GTM_NONNULL(x) __attribute__((nonnull x)) + #else + #define GTM_NONNULL(x) + #endif + #else + #define GTM_NONNULL(x) + #endif +#endif + + +@interface GTMReadMonitorInputStream : NSInputStream + ++ (instancetype)inputStreamWithStream:(NSInputStream *)input GTM_NONNULL((1)); + +- (instancetype)initWithStream:(NSInputStream *)input GTM_NONNULL((1)); + +// The read monitor selector is called when bytes have been read. It should have this signature: +// +// - (void)inputStream:(GTMReadMonitorInputStream *)stream +// readIntoBuffer:(uint8_t *)buffer +// length:(int64_t)length; + +@property(atomic, weak) id readDelegate; +@property(atomic, assign) SEL readSelector; + +// Modes for invoking callbacks, when necessary. +@property(atomic, strong) NSArray *runLoopModes; + +@end diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m new file mode 100644 index 00000000..6f95dd54 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m @@ -0,0 +1,190 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMReadMonitorInputStream.h" + +@implementation GTMReadMonitorInputStream { + NSInputStream *_inputStream; // Encapsulated stream that does the work. + + NSThread *_thread; // Thread in which this object was created. + NSArray *_runLoopModes; // Modes for calling callbacks, when necessary. +} + + +@synthesize readDelegate = _readDelegate; +@synthesize readSelector = _readSelector; +@synthesize runLoopModes = _runLoopModes; + +// We'll forward all unhandled messages to the NSInputStream class or to the encapsulated input +// stream. This is needed for all messages sent to NSInputStream which aren't handled by our +// superclass; that includes various private run loop calls. ++ (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { + return [NSInputStream methodSignatureForSelector:selector]; +} + ++ (void)forwardInvocation:(NSInvocation*)invocation { + [invocation invokeWithTarget:[NSInputStream class]]; +} + +- (BOOL)respondsToSelector:(SEL)selector { + return [_inputStream respondsToSelector:selector]; +} + +- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { + return [_inputStream methodSignatureForSelector:selector]; +} + +- (void)forwardInvocation:(NSInvocation*)invocation { + [invocation invokeWithTarget:_inputStream]; +} + +#pragma mark - + ++ (instancetype)inputStreamWithStream:(NSInputStream *)input { + return [[self alloc] initWithStream:input]; +} + +- (instancetype)initWithStream:(NSInputStream *)input { + self = [super init]; + if (self) { + _inputStream = input; + _thread = [NSThread currentThread]; + } + return self; +} + +- (instancetype)init { + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +#pragma mark - + +- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len { + // Read from the encapsulated stream. + NSInteger numRead = [_inputStream read:buffer maxLength:len]; + if (numRead > 0) { + if (_readDelegate && _readSelector) { + // Call the read selector with the buffer and number of bytes actually read into it. + BOOL isOnOriginalThread = [_thread isEqual:[NSThread currentThread]]; + if (isOnOriginalThread) { + // Invoke immediately. + NSData *data = [NSData dataWithBytesNoCopy:buffer + length:(NSUInteger)numRead + freeWhenDone:NO]; + [self invokeReadSelectorWithBuffer:data]; + } else { + // Copy the buffer into an NSData to be retained by the performSelector, + // and invoke on the proper thread. + SEL sel = @selector(invokeReadSelectorWithBuffer:); + NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numRead]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + if (_runLoopModes) { + [self performSelector:sel + onThread:_thread + withObject:data + waitUntilDone:NO + modes:_runLoopModes]; + } else { + [self performSelector:sel + onThread:_thread + withObject:data + waitUntilDone:NO]; + } +#pragma clang diagnostic pop + } + } + } + return numRead; +} + +- (void)invokeReadSelectorWithBuffer:(NSData *)data { + const void *buffer = data.bytes; + int64_t length = (int64_t)data.length; + + id argSelf = self; + id readDelegate = _readDelegate; + if (readDelegate) { + NSMethodSignature *signature = [readDelegate methodSignatureForSelector:_readSelector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setSelector:_readSelector]; + [invocation setTarget:readDelegate]; + [invocation setArgument:&argSelf atIndex:2]; + [invocation setArgument:&buffer atIndex:3]; + [invocation setArgument:&length atIndex:4]; + [invocation invoke]; + } +} + +- (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len { + return [_inputStream getBuffer:buffer length:len]; +} + +- (BOOL)hasBytesAvailable { + return [_inputStream hasBytesAvailable]; +} + +#pragma mark Standard messages + +// Pass expected messages to our encapsulated stream. +// +// We want our encapsulated NSInputStream to handle the standard messages; +// we don't want the superclass to handle them. +- (void)open { + [_inputStream open]; +} + +- (void)close { + [_inputStream close]; +} + +- (id)delegate { + return [_inputStream delegate]; +} + +- (void)setDelegate:(id)delegate { + [_inputStream setDelegate:delegate]; +} + +- (id)propertyForKey:(NSString *)key { + return [_inputStream propertyForKey:key]; +} + +- (BOOL)setProperty:(id)property forKey:(NSString *)key { + return [_inputStream setProperty:property forKey:key]; +} + +- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { + [_inputStream scheduleInRunLoop:aRunLoop forMode:mode]; +} + +- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { + [_inputStream removeFromRunLoop:aRunLoop forMode:mode]; +} + +- (NSStreamStatus)streamStatus { + return [_inputStream streamStatus]; +} + +- (NSError *)streamError { + return [_inputStream streamError]; +} + +@end diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h new file mode 100644 index 00000000..0504aa75 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h @@ -0,0 +1,1332 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// GTMSessionFetcher is a wrapper around NSURLSession for http operations. +// +// What does this offer on top of of NSURLSession? +// +// - Block-style callbacks for useful functionality like progress rather +// than delegate methods. +// - Out-of-process uploads and downloads using NSURLSession, including +// management of fetches after relaunch. +// - Integration with GTMAppAuth for invisible management and refresh of +// authorization tokens. +// - Pretty-printed http logging. +// - Cookies handling that does not interfere with or get interfered with +// by WebKit cookies or on Mac by Safari and other apps. +// - Credentials handling for the http operation. +// - Rate-limiting and cookie grouping when fetchers are created with +// GTMSessionFetcherService. +// +// If the bodyData or bodyFileURL property is set, then a POST request is assumed. +// +// Each fetcher is assumed to be for a one-shot fetch request; don't reuse the object +// for a second fetch. +// +// The fetcher will be self-retained as long as a connection is pending. +// +// To keep user activity private, URLs must have an https scheme (unless the property +// allowedInsecureSchemes is set to permit the scheme.) +// +// Callbacks will be released when the fetch completes or is stopped, so there is no need +// to use weak self references in the callback blocks. +// +// Sample usage: +// +// _fetcherService = [[GTMSessionFetcherService alloc] init]; +// +// GTMSessionFetcher *myFetcher = [_fetcherService fetcherWithURLString:myURLString]; +// myFetcher.retryEnabled = YES; +// myFetcher.comment = @"First profile image"; +// +// // Optionally specify a file URL or NSData for the request body to upload. +// myFetcher.bodyData = [postString dataUsingEncoding:NSUTF8StringEncoding]; +// +// [myFetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { +// if (error != nil) { +// // Server status code or network error. +// // +// // If the domain is kGTMSessionFetcherStatusDomain then the error code +// // is a failure status from the server. +// } else { +// // Fetch succeeded. +// } +// }]; +// +// There is also a beginFetch call that takes a pointer and selector for the completion handler; +// a pointer and selector is a better style when the callback is a substantial, separate method. +// +// NOTE: Fetches may retrieve data from the server even though the server +// returned an error, so the criteria for success is a non-nil error. +// The completion handler is called when the server status is >= 300 with an NSError +// having domain kGTMSessionFetcherStatusDomain and code set to the server status. +// +// Status codes are at +// +// +// Background session support: +// +// Out-of-process uploads and downloads may be created by setting the fetcher's +// useBackgroundSession property. Data to be uploaded should be provided via +// the uploadFileURL property; the download destination should be specified with +// the destinationFileURL. NOTE: Background upload files should be in a location +// that will be valid even after the device is restarted, so the file should not +// be uploaded from a system temporary or cache directory. +// +// Background session transfers are slower, and should typically be used only +// for very large downloads or uploads (hundreds of megabytes). +// +// When background sessions are used in iOS apps, the application delegate must +// pass through the parameters from UIApplicationDelegate's +// application:handleEventsForBackgroundURLSession:completionHandler: to the +// fetcher class. +// +// When the application has been relaunched, it may also create a new fetcher +// instance to handle completion of the transfers. +// +// - (void)application:(UIApplication *)application +// handleEventsForBackgroundURLSession:(NSString *)identifier +// completionHandler:(void (^)())completionHandler { +// // Application was re-launched on completing an out-of-process download. +// +// // Pass the URLSession info related to this re-launch to the fetcher class. +// [GTMSessionFetcher application:application +// handleEventsForBackgroundURLSession:identifier +// completionHandler:completionHandler]; +// +// // Get a fetcher related to this re-launch and re-hook up a completionHandler to it. +// GTMSessionFetcher *fetcher = [GTMSessionFetcher fetcherWithSessionIdentifier:identifier]; +// NSURL *destinationFileURL = fetcher.destinationFileURL; +// fetcher.completionHandler = ^(NSData *data, NSError *error) { +// [self downloadCompletedToFile:destinationFileURL error:error]; +// }; +// } +// +// +// Threading and queue support: +// +// Networking always happens on a background thread; there is no advantage to +// changing thread or queue to create or start a fetcher. +// +// Callbacks are run on the main thread; alternatively, the app may set the +// fetcher's callbackQueue to a dispatch queue. +// +// Once the fetcher's beginFetch method has been called, the fetcher's methods and +// properties may be accessed from any thread. +// +// Downloading to disk: +// +// To have downloaded data saved directly to disk, specify a file URL for the +// destinationFileURL property. +// +// HTTP methods and headers: +// +// Alternative HTTP methods, like PUT, and custom headers can be specified by +// creating the fetcher with an appropriate NSMutableURLRequest. +// +// +// Caching: +// +// The fetcher avoids caching. That is best for API requests, but may hurt +// repeat fetches of static data. Apps may enable a persistent disk cache by +// customizing the config: +// +// fetcher.configurationBlock = ^(GTMSessionFetcher *configFetcher, +// NSURLSessionConfiguration *config) { +// config.URLCache = [NSURLCache sharedURLCache]; +// }; +// +// Or use the standard system config to share cookie storage with web views +// and to enable disk caching: +// +// fetcher.configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +// +// +// Cookies: +// +// There are three supported mechanisms for remembering cookies between fetches. +// +// By default, a standalone GTMSessionFetcher uses a mutable array held +// statically to track cookies for all instantiated fetchers. This avoids +// cookies being set by servers for the application from interfering with +// Safari and WebKit cookie settings, and vice versa. +// The fetcher cookies are lost when the application quits. +// +// To rely instead on WebKit's global NSHTTPCookieStorage, set the fetcher's +// cookieStorage property: +// myFetcher.cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; +// +// To share cookies with other apps, use the method introduced in iOS 9/OS X 10.11: +// myFetcher.cookieStorage = +// [NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier:kMyCompanyContainedID]; +// +// To ignore existing cookies and only have cookies related to the single fetch +// be applied, make a temporary cookie storage object: +// myFetcher.cookieStorage = [[GTMSessionCookieStorage alloc] init]; +// +// Note: cookies set while following redirects will be sent to the server, as +// the redirects are followed by the fetcher. +// +// To completely disable cookies, similar to setting cookieStorageMethod to +// kGTMHTTPFetcherCookieStorageMethodNone, adjust the session configuration +// appropriately in the fetcher or fetcher service: +// fetcher.configurationBlock = ^(GTMSessionFetcher *configFetcher, +// NSURLSessionConfiguration *config) { +// config.HTTPCookieAcceptPolicy = NSHTTPCookieAcceptPolicyNever; +// config.HTTPShouldSetCookies = NO; +// }; +// +// If the fetcher is created from a GTMSessionFetcherService object +// then the cookie storage mechanism is set to use the cookie storage in the +// service object rather than the static storage. Disabling cookies in the +// session configuration set on a service object will disable cookies for all +// fetchers created from that GTMSessionFetcherService object, since the session +// configuration is propagated to the fetcher. +// +// +// Monitoring data transfers. +// +// The fetcher supports a variety of properties for progress monitoring +// progress with callback blocks. +// GTMSessionFetcherSendProgressBlock sendProgressBlock +// GTMSessionFetcherReceivedProgressBlock receivedProgressBlock +// GTMSessionFetcherDownloadProgressBlock downloadProgressBlock +// +// If supplied by the server, the anticipated total download size is available +// as [[myFetcher response] expectedContentLength] (and may be -1 for unknown +// download sizes.) +// +// +// Automatic retrying of fetches +// +// The fetcher can optionally create a timer and reattempt certain kinds of +// fetch failures (status codes 408, request timeout; 502, gateway failure; +// 503, service unavailable; 504, gateway timeout; networking errors +// NSURLErrorTimedOut and NSURLErrorNetworkConnectionLost.) The user may +// set a retry selector to customize the type of errors which will be retried. +// +// Retries are done in an exponential-backoff fashion (that is, after 1 second, +// 2, 4, 8, and so on.) +// +// Enabling automatic retries looks like this: +// myFetcher.retryEnabled = YES; +// +// With retries enabled, the completion callbacks are called only +// when no more retries will be attempted. Calling the fetcher's stopFetching +// method will terminate the retry timer, without the finished or failure +// selectors being invoked. +// +// Optionally, the client may set the maximum retry interval: +// myFetcher.maxRetryInterval = 60.0; // in seconds; default is 60 seconds +// // for downloads, 600 for uploads +// +// Servers should never send a 400 or 500 status for errors that are retryable +// by clients, as those values indicate permanent failures. In nearly all +// cases, the default standard retry behavior is correct for clients, and no +// custom client retry behavior is needed or appropriate. Servers that send +// non-retryable status codes and expect the client to retry the request are +// faulty. +// +// Still, the client may provide a block to determine if a status code or other +// error should be retried. The block returns YES to set the retry timer or NO +// to fail without additional fetch attempts. +// +// The retry method may return the |suggestedWillRetry| argument to get the +// default retry behavior. Server status codes are present in the +// error argument, and have the domain kGTMSessionFetcherStatusDomain. The +// user's method may look something like this: +// +// myFetcher.retryBlock = ^(BOOL suggestedWillRetry, NSError *error, +// GTMSessionFetcherRetryResponse response) { +// // Perhaps examine error.domain and error.code, or fetcher.retryCount +// // +// // Respond with YES to start the retry timer, NO to proceed to the failure +// // callback, or suggestedWillRetry to get default behavior for the +// // current error domain and code values. +// response(suggestedWillRetry); +// }; + + +#import + +#if TARGET_OS_IPHONE +#import +#endif +#if TARGET_OS_WATCH +#import +#endif + +// By default it is stripped from non DEBUG builds. Developers can override +// this in their project settings. +#ifndef STRIP_GTM_FETCH_LOGGING + #if !DEBUG + #define STRIP_GTM_FETCH_LOGGING 1 + #else + #define STRIP_GTM_FETCH_LOGGING 0 + #endif +#endif + +// Logs in debug builds. +#ifndef GTMSESSION_LOG_DEBUG + #if DEBUG + #define GTMSESSION_LOG_DEBUG(...) NSLog(__VA_ARGS__) + #else + #define GTMSESSION_LOG_DEBUG(...) do { } while (0) + #endif +#endif + +// Asserts in debug builds (or logs in debug builds if GTMSESSION_ASSERT_AS_LOG +// or NS_BLOCK_ASSERTIONS are defined.) +#ifndef GTMSESSION_ASSERT_DEBUG + #if DEBUG && !defined(NS_BLOCK_ASSERTIONS) && !GTMSESSION_ASSERT_AS_LOG + #undef GTMSESSION_ASSERT_AS_LOG + #define GTMSESSION_ASSERT_AS_LOG 1 + #endif + + #if DEBUG && !GTMSESSION_ASSERT_AS_LOG + #define GTMSESSION_ASSERT_DEBUG(...) NSAssert(__VA_ARGS__) + #elif DEBUG + #define GTMSESSION_ASSERT_DEBUG(pred, ...) if (!(pred)) { NSLog(__VA_ARGS__); } + #else + #define GTMSESSION_ASSERT_DEBUG(pred, ...) do { } while (0) + #endif +#endif + +// Asserts in debug builds, logs in release builds (or logs in debug builds if +// GTMSESSION_ASSERT_AS_LOG is defined.) +#ifndef GTMSESSION_ASSERT_DEBUG_OR_LOG + #if DEBUG && !GTMSESSION_ASSERT_AS_LOG + #define GTMSESSION_ASSERT_DEBUG_OR_LOG(...) NSAssert(__VA_ARGS__) + #else + #define GTMSESSION_ASSERT_DEBUG_OR_LOG(pred, ...) if (!(pred)) { NSLog(__VA_ARGS__); } + #endif +#endif + +// Macro useful for examining messages from NSURLSession during debugging. +#if 0 +#define GTM_LOG_SESSION_DELEGATE(...) GTMSESSION_LOG_DEBUG(__VA_ARGS__) +#else +#define GTM_LOG_SESSION_DELEGATE(...) +#endif + +#ifndef GTM_NULLABLE + #if __has_feature(nullability) // Available starting in Xcode 6.3 + #define GTM_NULLABLE_TYPE __nullable + #define GTM_NONNULL_TYPE __nonnull + #define GTM_NULLABLE nullable + #define GTM_NONNULL_DECL nonnull // GTM_NONNULL is used by GTMDefines.h + #define GTM_NULL_RESETTABLE null_resettable + + #define GTM_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN + #define GTM_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END + #else + #define GTM_NULLABLE_TYPE + #define GTM_NONNULL_TYPE + #define GTM_NULLABLE + #define GTM_NONNULL_DECL + #define GTM_NULL_RESETTABLE + #define GTM_ASSUME_NONNULL_BEGIN + #define GTM_ASSUME_NONNULL_END + #endif // __has_feature(nullability) +#endif // GTM_NULLABLE + +#ifndef GTM_DECLARE_GENERICS + #if __has_feature(objc_generics) + #define GTM_DECLARE_GENERICS 1 + #else + #define GTM_DECLARE_GENERICS 0 + #endif +#endif + +#ifndef GTM_NSArrayOf + #if GTM_DECLARE_GENERICS + #define GTM_NSArrayOf(value) NSArray + #define GTM_NSDictionaryOf(key, value) NSDictionary + #else + #define GTM_NSArrayOf(value) NSArray + #define GTM_NSDictionaryOf(key, value) NSDictionary + #endif // __has_feature(objc_generics) +#endif // GTM_NSArrayOf + +// For iOS, the fetcher can declare itself a background task to allow fetches +// to finish when the app leaves the foreground. +// +// (This is unrelated to providing a background configuration, which allows +// out-of-process uploads and downloads.) +// +// To disallow use of background tasks during fetches, the target should define +// GTM_BACKGROUND_TASK_FETCHING to 0, or alternatively may set the +// skipBackgroundTask property to YES. +#if TARGET_OS_IPHONE && !TARGET_OS_WATCH && !defined(GTM_BACKGROUND_TASK_FETCHING) + #define GTM_BACKGROUND_TASK_FETCHING 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if (TARGET_OS_TV \ + || TARGET_OS_WATCH \ + || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0)) + #ifndef GTM_USE_SESSION_FETCHER + #define GTM_USE_SESSION_FETCHER 1 + #endif +#endif + +#if !defined(GTMBridgeFetcher) + // These bridge macros should be identical in GTMHTTPFetcher.h and GTMSessionFetcher.h + #if GTM_USE_SESSION_FETCHER + // Macros to new fetcher class. + #define GTMBridgeFetcher GTMSessionFetcher + #define GTMBridgeFetcherService GTMSessionFetcherService + #define GTMBridgeFetcherServiceProtocol GTMSessionFetcherServiceProtocol + #define GTMBridgeAssertValidSelector GTMSessionFetcherAssertValidSelector + #define GTMBridgeCookieStorage GTMSessionCookieStorage + #define GTMBridgeCleanedUserAgentString GTMFetcherCleanedUserAgentString + #define GTMBridgeSystemVersionString GTMFetcherSystemVersionString + #define GTMBridgeApplicationIdentifier GTMFetcherApplicationIdentifier + #define kGTMBridgeFetcherStatusDomain kGTMSessionFetcherStatusDomain + #define kGTMBridgeFetcherStatusBadRequest GTMSessionFetcherStatusBadRequest + #else + // Macros to old fetcher class. + #define GTMBridgeFetcher GTMHTTPFetcher + #define GTMBridgeFetcherService GTMHTTPFetcherService + #define GTMBridgeFetcherServiceProtocol GTMHTTPFetcherServiceProtocol + #define GTMBridgeAssertValidSelector GTMAssertSelectorNilOrImplementedWithArgs + #define GTMBridgeCookieStorage GTMCookieStorage + #define GTMBridgeCleanedUserAgentString GTMCleanedUserAgentString + #define GTMBridgeSystemVersionString GTMSystemVersionString + #define GTMBridgeApplicationIdentifier GTMApplicationIdentifier + #define kGTMBridgeFetcherStatusDomain kGTMHTTPFetcherStatusDomain + #define kGTMBridgeFetcherStatusBadRequest kGTMHTTPFetcherStatusBadRequest + #endif // GTM_USE_SESSION_FETCHER +#endif + +// When creating background sessions to perform out-of-process uploads and +// downloads, on app launch any background sessions must be reconnected in +// order to receive events that occurred while the app was not running. +// +// The fetcher will automatically attempt to recreate the sessions on app +// start, but doing so reads from NSUserDefaults. This may have launch-time +// performance impacts. +// +// To avoid launch performance impacts, on iPhone/iPad with iOS 13+ the +// GTMSessionFetcher class will register for the app launch notification and +// perform the reconnect then. +// +// Apps targeting Mac or older iOS SDKs can opt into the new behavior by defining +// GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH=1. +// +// Apps targeting new SDKs can force the old behavior by defining +// GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH = 0. +#ifndef GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH + // Default to the on-launch behavior for iOS 13+. + #if TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 + #define GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH 1 + #else + #define GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH 0 + #endif +#endif + +GTM_ASSUME_NONNULL_BEGIN + +// Notifications +// +// Fetch started and stopped, and fetch retry delay started and stopped. +extern NSString *const kGTMSessionFetcherStartedNotification; +extern NSString *const kGTMSessionFetcherStoppedNotification; +extern NSString *const kGTMSessionFetcherRetryDelayStartedNotification; +extern NSString *const kGTMSessionFetcherRetryDelayStoppedNotification; + +// Completion handler notification. This is intended for use by code capturing +// and replaying fetch requests and results for testing. For fetches where +// destinationFileURL or accumulateDataBlock is set for the fetcher, the data +// will be nil for successful fetches. +// +// This notification is posted on the main thread. +extern NSString *const kGTMSessionFetcherCompletionInvokedNotification; +extern NSString *const kGTMSessionFetcherCompletionDataKey; +extern NSString *const kGTMSessionFetcherCompletionErrorKey; + +// Constants for NSErrors created by the fetcher (excluding server status errors, +// and error objects originating in the OS.) +extern NSString *const kGTMSessionFetcherErrorDomain; + +// The fetcher turns server error status values (3XX, 4XX, 5XX) into NSErrors +// with domain kGTMSessionFetcherStatusDomain. +// +// Any server response body data accompanying the status error is added to the +// userInfo dictionary with key kGTMSessionFetcherStatusDataKey. +extern NSString *const kGTMSessionFetcherStatusDomain; +extern NSString *const kGTMSessionFetcherStatusDataKey; +extern NSString *const kGTMSessionFetcherStatusDataContentTypeKey; + +// When a fetch fails with an error, these keys are included in the error userInfo +// dictionary if retries were attempted. +extern NSString *const kGTMSessionFetcherNumberOfRetriesDoneKey; +extern NSString *const kGTMSessionFetcherElapsedIntervalWithRetriesKey; + +// Background session support requires access to NSUserDefaults. +// If [NSUserDefaults standardUserDefaults] doesn't yield the correct NSUserDefaults for your usage, +// ie for an App Extension, then implement this class/method to return the correct NSUserDefaults. +// https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW6 +@interface GTMSessionFetcherUserDefaultsFactory : NSObject + ++ (NSUserDefaults *)fetcherUserDefaults; + +@end + +#ifdef __cplusplus +} +#endif + +typedef NS_ENUM(NSInteger, GTMSessionFetcherError) { + GTMSessionFetcherErrorDownloadFailed = -1, + GTMSessionFetcherErrorUploadChunkUnavailable = -2, + GTMSessionFetcherErrorBackgroundExpiration = -3, + GTMSessionFetcherErrorBackgroundFetchFailed = -4, + GTMSessionFetcherErrorInsecureRequest = -5, + GTMSessionFetcherErrorTaskCreationFailed = -6, +}; + +typedef NS_ENUM(NSInteger, GTMSessionFetcherStatus) { + // Standard http status codes. + GTMSessionFetcherStatusNotModified = 304, + GTMSessionFetcherStatusBadRequest = 400, + GTMSessionFetcherStatusUnauthorized = 401, + GTMSessionFetcherStatusForbidden = 403, + GTMSessionFetcherStatusPreconditionFailed = 412 +}; + +#ifdef __cplusplus +extern "C" { +#endif + +@class GTMSessionCookieStorage; +@class GTMSessionFetcher; + +// The configuration block is for modifying the NSURLSessionConfiguration only. +// DO NOT change any fetcher properties in the configuration block. +typedef void (^GTMSessionFetcherConfigurationBlock)(GTMSessionFetcher *fetcher, + NSURLSessionConfiguration *configuration); +typedef void (^GTMSessionFetcherSystemCompletionHandler)(void); +typedef void (^GTMSessionFetcherCompletionHandler)(NSData * GTM_NULLABLE_TYPE data, + NSError * GTM_NULLABLE_TYPE error); +typedef void (^GTMSessionFetcherBodyStreamProviderResponse)(NSInputStream *bodyStream); +typedef void (^GTMSessionFetcherBodyStreamProvider)(GTMSessionFetcherBodyStreamProviderResponse response); +typedef void (^GTMSessionFetcherDidReceiveResponseDispositionBlock)(NSURLSessionResponseDisposition disposition); +typedef void (^GTMSessionFetcherDidReceiveResponseBlock)(NSURLResponse *response, + GTMSessionFetcherDidReceiveResponseDispositionBlock dispositionBlock); +typedef void (^GTMSessionFetcherChallengeDispositionBlock)(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential * GTM_NULLABLE_TYPE credential); +typedef void (^GTMSessionFetcherChallengeBlock)(GTMSessionFetcher *fetcher, + NSURLAuthenticationChallenge *challenge, + GTMSessionFetcherChallengeDispositionBlock dispositionBlock); +typedef void (^GTMSessionFetcherWillRedirectResponse)(NSURLRequest * GTM_NULLABLE_TYPE redirectedRequest); +typedef void (^GTMSessionFetcherWillRedirectBlock)(NSHTTPURLResponse *redirectResponse, + NSURLRequest *redirectRequest, + GTMSessionFetcherWillRedirectResponse response); +typedef void (^GTMSessionFetcherAccumulateDataBlock)(NSData * GTM_NULLABLE_TYPE buffer); +typedef void (^GTMSessionFetcherSimulateByteTransferBlock)(NSData * GTM_NULLABLE_TYPE buffer, + int64_t bytesWritten, + int64_t totalBytesWritten, + int64_t totalBytesExpectedToWrite); +typedef void (^GTMSessionFetcherReceivedProgressBlock)(int64_t bytesWritten, + int64_t totalBytesWritten); +typedef void (^GTMSessionFetcherDownloadProgressBlock)(int64_t bytesWritten, + int64_t totalBytesWritten, + int64_t totalBytesExpectedToWrite); +typedef void (^GTMSessionFetcherSendProgressBlock)(int64_t bytesSent, + int64_t totalBytesSent, + int64_t totalBytesExpectedToSend); +typedef void (^GTMSessionFetcherWillCacheURLResponseResponse)(NSCachedURLResponse * GTM_NULLABLE_TYPE cachedResponse); +typedef void (^GTMSessionFetcherWillCacheURLResponseBlock)(NSCachedURLResponse *proposedResponse, + GTMSessionFetcherWillCacheURLResponseResponse responseBlock); +typedef void (^GTMSessionFetcherRetryResponse)(BOOL shouldRetry); +typedef void (^GTMSessionFetcherRetryBlock)(BOOL suggestedWillRetry, + NSError * GTM_NULLABLE_TYPE error, + GTMSessionFetcherRetryResponse response); + +API_AVAILABLE(ios(10.0), macosx(10.12), tvos(10.0), watchos(3.0)) +typedef void (^GTMSessionFetcherMetricsCollectionBlock)(NSURLSessionTaskMetrics *metrics); + +typedef void (^GTMSessionFetcherTestResponse)(NSHTTPURLResponse * GTM_NULLABLE_TYPE response, + NSData * GTM_NULLABLE_TYPE data, + NSError * GTM_NULLABLE_TYPE error); +typedef void (^GTMSessionFetcherTestBlock)(GTMSessionFetcher *fetcherToTest, + GTMSessionFetcherTestResponse testResponse); + +void GTMSessionFetcherAssertValidSelector(id GTM_NULLABLE_TYPE obj, SEL GTM_NULLABLE_TYPE sel, ...); + +// Utility functions for applications self-identifying to servers via a +// user-agent header + +// The "standard" user agent includes the application identifier, taken from the bundle, +// followed by a space and the system version string. Pass nil to use +mainBundle as the source +// of the bundle identifier. +// +// Applications may use this as a starting point for their own user agent strings, perhaps +// with additional sections appended. Use GTMFetcherCleanedUserAgentString() below to +// clean up any string being added to the user agent. +NSString *GTMFetcherStandardUserAgentString(NSBundle * GTM_NULLABLE_TYPE bundle); + +// Make a generic name and version for the current application, like +// com.example.MyApp/1.2.3 relying on the bundle identifier and the +// CFBundleShortVersionString or CFBundleVersion. +// +// The bundle ID may be overridden as the base identifier string by +// adding to the bundle's Info.plist a "GTMUserAgentID" key. +// +// If no bundle ID or override is available, the process name preceded +// by "proc_" is used. +NSString *GTMFetcherApplicationIdentifier(NSBundle * GTM_NULLABLE_TYPE bundle); + +// Make an identifier like "MacOSX/10.7.1" or "iPod_Touch/4.1 hw/iPod1_1" +NSString *GTMFetcherSystemVersionString(void); + +// Make a parseable user-agent identifier from the given string, replacing whitespace +// and commas with underscores, and removing other characters that may interfere +// with parsing of the full user-agent string. +// +// For example, @"[My App]" would become @"My_App" +NSString *GTMFetcherCleanedUserAgentString(NSString *str); + +// Grab the data from an input stream. Since streams cannot be assumed to be rewindable, +// this may be destructive; the caller can try to rewind the stream (by setting the +// NSStreamFileCurrentOffsetKey property) or can just use the NSData to make a new +// NSInputStream. This function is intended to facilitate testing rather than be used in +// production. +// +// This function operates synchronously on the current thread. Depending on how the +// input stream is implemented, it may be appropriate to dispatch to a different +// queue before calling this function. +// +// Failure is indicated by a returned data value of nil. +NSData * GTM_NULLABLE_TYPE GTMDataFromInputStream(NSInputStream *inputStream, NSError **outError); + +#ifdef __cplusplus +} // extern "C" +#endif + + +#if !GTM_USE_SESSION_FETCHER +@protocol GTMHTTPFetcherServiceProtocol; +#endif + +// This protocol allows abstract references to the fetcher service, primarily for +// fetchers (which may be compiled without the fetcher service class present.) +// +// Apps should not need to use this protocol. +@protocol GTMSessionFetcherServiceProtocol +// This protocol allows us to call into the service without requiring +// GTMSessionFetcherService sources in this project + +@property(atomic, strong) dispatch_queue_t callbackQueue; + +- (BOOL)fetcherShouldBeginFetching:(GTMSessionFetcher *)fetcher; +- (void)fetcherDidCreateSession:(GTMSessionFetcher *)fetcher; +- (void)fetcherDidBeginFetching:(GTMSessionFetcher *)fetcher; +- (void)fetcherDidStop:(GTMSessionFetcher *)fetcher; + +- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request; +- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher; + +@property(atomic, assign) BOOL reuseSession; +- (GTM_NULLABLE NSURLSession *)session; +- (GTM_NULLABLE NSURLSession *)sessionForFetcherCreation; +- (GTM_NULLABLE id)sessionDelegate; +- (GTM_NULLABLE NSDate *)stoppedAllFetchersDate; + +// Methods for compatibility with the old GTMHTTPFetcher. +@property(atomic, readonly, strong, GTM_NULLABLE) NSOperationQueue *delegateQueue; + +@end // @protocol GTMSessionFetcherServiceProtocol + +#ifndef GTM_FETCHER_AUTHORIZATION_PROTOCOL +#define GTM_FETCHER_AUTHORIZATION_PROTOCOL 1 +@protocol GTMFetcherAuthorizationProtocol +@required +// This protocol allows us to call the authorizer without requiring its sources +// in this project. +- (void)authorizeRequest:(GTM_NULLABLE NSMutableURLRequest *)request + delegate:(id)delegate + didFinishSelector:(SEL)sel; + +- (void)stopAuthorization; + +- (void)stopAuthorizationForRequest:(NSURLRequest *)request; + +- (BOOL)isAuthorizingRequest:(NSURLRequest *)request; + +- (BOOL)isAuthorizedRequest:(NSURLRequest *)request; + +@property(atomic, strong, readonly, GTM_NULLABLE) NSString *userEmail; + +@optional + +// Indicate if authorization may be attempted. Even if this succeeds, +// authorization may fail if the user's permissions have been revoked. +@property(atomic, readonly) BOOL canAuthorize; + +// For development only, allow authorization of non-SSL requests, allowing +// transmission of the bearer token unencrypted. +@property(atomic, assign) BOOL shouldAuthorizeAllRequests; + +- (void)authorizeRequest:(GTM_NULLABLE NSMutableURLRequest *)request + completionHandler:(void (^)(NSError * GTM_NULLABLE_TYPE error))handler; + +#if GTM_USE_SESSION_FETCHER +@property(atomic, weak, GTM_NULLABLE) id fetcherService; +#else +@property(atomic, weak, GTM_NULLABLE) id fetcherService; +#endif + +- (BOOL)primeForRefresh; + +@end +#endif // GTM_FETCHER_AUTHORIZATION_PROTOCOL + +#if GTM_BACKGROUND_TASK_FETCHING +// A protocol for an alternative target for messages from GTMSessionFetcher to UIApplication. +// Set the target using +[GTMSessionFetcher setSubstituteUIApplication:] +@protocol GTMUIApplicationProtocol +- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(nullable NSString *)taskName + expirationHandler:(void(^ __nullable)(void))handler; +- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier; +@end +#endif + +#pragma mark - + +// GTMSessionFetcher objects are used for async retrieval of an http get or post +// +// See additional comments at the beginning of this file +@interface GTMSessionFetcher : NSObject + +// Create a fetcher +// +// fetcherWithRequest will return an autoreleased fetcher, but if +// the connection is successfully created, the connection should retain the +// fetcher for the life of the connection as well. So the caller doesn't have +// to retain the fetcher explicitly unless they want to be able to cancel it. ++ (instancetype)fetcherWithRequest:(GTM_NULLABLE NSURLRequest *)request; + +// Convenience methods that make a request, like +fetcherWithRequest ++ (instancetype)fetcherWithURL:(NSURL *)requestURL; ++ (instancetype)fetcherWithURLString:(NSString *)requestURLString; + +// Methods for creating fetchers to continue previous fetches. ++ (instancetype)fetcherWithDownloadResumeData:(NSData *)resumeData; ++ (GTM_NULLABLE instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier; + +// Returns an array of currently active fetchers for background sessions, +// both restarted and newly created ones. ++ (GTM_NSArrayOf(GTMSessionFetcher *) *)fetchersForBackgroundSessions; + +// Designated initializer. +// +// Applications should create fetchers with a "fetcherWith..." method on a fetcher +// service or a class method, not with this initializer. +// +// The configuration should typically be nil. Applications needing to customize +// the configuration may do so by setting the configurationBlock property. +- (instancetype)initWithRequest:(GTM_NULLABLE NSURLRequest *)request + configuration:(GTM_NULLABLE NSURLSessionConfiguration *)configuration; + +// The fetcher's request. This may not be set after beginFetch has been invoked. The request +// may change due to redirects. +@property(atomic, strong, GTM_NULLABLE) NSURLRequest *request; + +// Set a header field value on the request. Header field value changes will not +// affect a fetch after the fetch has begun. +- (void)setRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field; + +// Data used for resuming a download task. +@property(atomic, readonly, GTM_NULLABLE) NSData *downloadResumeData; + +// The configuration; this must be set before the fetch begins. If no configuration is +// set or inherited from the fetcher service, then the fetcher uses an ephemeral config. +// +// NOTE: This property should typically be nil. Applications needing to customize +// the configuration should do so by setting the configurationBlock property. +// That allows the fetcher to pick an appropriate base configuration, with the +// application setting only the configuration properties it needs to customize. +@property(atomic, strong, GTM_NULLABLE) NSURLSessionConfiguration *configuration; + +// A block the client may use to customize the configuration used to create the session. +// +// This is called synchronously, either on the thread that begins the fetch or, during a retry, +// on the main thread. The configuration block may be called repeatedly if multiple fetchers are +// created. +// +// The configuration block is for modifying the NSURLSessionConfiguration only. +// DO NOT change any fetcher properties in the configuration block. Fetcher properties +// may be set in the fetcher service prior to fetcher creation, or on the fetcher prior +// to invoking beginFetch. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherConfigurationBlock configurationBlock; + +// A session is created as needed by the fetcher. A fetcher service object +// may maintain sessions for multiple fetches to the same host. +@property(atomic, strong, GTM_NULLABLE) NSURLSession *session; + +// The task in flight. +@property(atomic, readonly, GTM_NULLABLE) NSURLSessionTask *sessionTask; + +// The background session identifier. +@property(atomic, readonly, GTM_NULLABLE) NSString *sessionIdentifier; + +// Indicates a fetcher created to finish a background session task. +@property(atomic, readonly) BOOL wasCreatedFromBackgroundSession; + +// Additional user-supplied data to encode into the session identifier. Since session identifier +// length limits are unspecified, this should be kept small. Key names beginning with an underscore +// are reserved for use by the fetcher. +@property(atomic, strong, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSString *) *sessionUserInfo; + +// The human-readable description to be assigned to the task. +@property(atomic, copy, GTM_NULLABLE) NSString *taskDescription; + +// The priority assigned to the task, if any. Use NSURLSessionTaskPriorityLow, +// NSURLSessionTaskPriorityDefault, or NSURLSessionTaskPriorityHigh. +@property(atomic, assign) float taskPriority; + +// The fetcher encodes information used to resume a session in the session identifier. +// This method, intended for internal use returns the encoded information. The sessionUserInfo +// dictionary is stored as identifier metadata. +- (GTM_NULLABLE GTM_NSDictionaryOf(NSString *, NSString *) *)sessionIdentifierMetadata; + +#if TARGET_OS_IPHONE && !TARGET_OS_WATCH +// The app should pass to this method the completion handler passed in the app delegate method +// application:handleEventsForBackgroundURLSession:completionHandler: ++ (void)application:(UIApplication *)application + handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(GTMSessionFetcherSystemCompletionHandler)completionHandler; +#endif + +// Indicate that a newly created session should be a background session. +// A new session identifier will be created by the fetcher. +// +// Warning: The only thing background sessions are for is rare download +// of huge, batched files of data. And even just for those, there's a lot +// of pain and hackery needed to get transfers to actually happen reliably +// with background sessions. +// +// Don't try to upload or download in many background sessions, since the system +// will impose an exponentially increasing time penalty to prevent the app from +// getting too much background execution time. +// +// References: +// +// "Moving to Fewer, Larger Transfers" +// https://forums.developer.apple.com/thread/14853 +// +// "NSURLSession’s Resume Rate Limiter" +// https://forums.developer.apple.com/thread/14854 +// +// "Background Session Task state persistence" +// https://forums.developer.apple.com/thread/11554 +// +@property(atomic, assign) BOOL useBackgroundSession; + +// Indicates if the fetcher was started using a background session. +@property(atomic, readonly, getter=isUsingBackgroundSession) BOOL usingBackgroundSession; + +// Indicates if uploads should use an upload task. This is always set for file or stream-provider +// bodies, but may be set explicitly for NSData bodies. +@property(atomic, assign) BOOL useUploadTask; + +// Indicates that the fetcher is using a session that may be shared with other fetchers. +@property(atomic, readonly) BOOL canShareSession; + +// By default, the fetcher allows only secure (https) schemes unless this +// property is set, or the GTM_ALLOW_INSECURE_REQUESTS build flag is set. +// +// For example, during debugging when fetching from a development server that lacks SSL support, +// this may be set to @[ @"http" ], or when the fetcher is used to retrieve local files, +// this may be set to @[ @"file" ]. +// +// This should be left as nil for release builds to avoid creating the opportunity for +// leaking private user behavior and data. If a server is providing insecure URLs +// for fetching by the client app, report the problem as server security & privacy bug. +// +// For builds with the iOS 9/OS X 10.11 and later SDKs, this property is required only when +// the app specifies NSAppTransportSecurity/NSAllowsArbitraryLoads in the main bundle's Info.plist. +@property(atomic, copy, GTM_NULLABLE) GTM_NSArrayOf(NSString *) *allowedInsecureSchemes; + +// By default, the fetcher prohibits localhost requests unless this property is set, +// or the GTM_ALLOW_INSECURE_REQUESTS build flag is set. +// +// For localhost requests, the URL scheme is not checked when this property is set. +// +// For builds with the iOS 9/OS X 10.11 and later SDKs, this property is required only when +// the app specifies NSAppTransportSecurity/NSAllowsArbitraryLoads in the main bundle's Info.plist. +@property(atomic, assign) BOOL allowLocalhostRequest; + +// By default, the fetcher requires valid server certs. This may be bypassed +// temporarily for development against a test server with an invalid cert. +@property(atomic, assign) BOOL allowInvalidServerCertificates; + +// Cookie storage object for this fetcher. If nil, the fetcher will use a static cookie +// storage instance shared among fetchers. If this fetcher was created by a fetcher service +// object, it will be set to use the service object's cookie storage. See Cookies section above for +// the full discussion. +// +// Because as of Jan 2014 standalone instances of NSHTTPCookieStorage do not actually +// store any cookies (Radar 15735276) we use our own subclass, GTMSessionCookieStorage, +// to hold cookies in memory. +@property(atomic, strong, GTM_NULLABLE) NSHTTPCookieStorage *cookieStorage; + +// Setting the credential is optional; it is used if the connection receives +// an authentication challenge. +@property(atomic, strong, GTM_NULLABLE) NSURLCredential *credential; + +// Setting the proxy credential is optional; it is used if the connection +// receives an authentication challenge from a proxy. +@property(atomic, strong, GTM_NULLABLE) NSURLCredential *proxyCredential; + +// If body data, body file URL, or body stream provider is not set, then a GET request +// method is assumed. +@property(atomic, strong, GTM_NULLABLE) NSData *bodyData; + +// File to use as the request body. This forces use of an upload task. +@property(atomic, strong, GTM_NULLABLE) NSURL *bodyFileURL; + +// Length of body to send, expected or actual. +@property(atomic, readonly) int64_t bodyLength; + +// The body stream provider may be called repeatedly to provide a body. +// Setting a body stream provider forces use of an upload task. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherBodyStreamProvider bodyStreamProvider; + +// Object to add authorization to the request, if needed. +// +// This may not be changed once beginFetch has been invoked. +@property(atomic, strong, GTM_NULLABLE) id authorizer; + +// The service object that created and monitors this fetcher, if any. +@property(atomic, strong) id service; + +// The host, if any, used to classify this fetcher in the fetcher service. +@property(atomic, copy, GTM_NULLABLE) NSString *serviceHost; + +// The priority, if any, used for starting fetchers in the fetcher service. +// +// Lower values are higher priority; the default is 0, and values may +// be negative or positive. This priority affects only the start order of +// fetchers that are being delayed by a fetcher service when the running fetchers +// exceeds the service's maxRunningFetchersPerHost. A priority of NSIntegerMin will +// exempt this fetcher from delay. +@property(atomic, assign) NSInteger servicePriority; + +// The delegate's optional didReceiveResponse block may be used to inspect or alter +// the session task response. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherDidReceiveResponseBlock didReceiveResponseBlock; + +// The delegate's optional challenge block may be used to inspect or alter +// the session task challenge. +// +// If this block is not set, the fetcher's default behavior for the NSURLSessionTask +// didReceiveChallenge: delegate method is to use the fetcher's respondToChallenge: method +// which relies on the fetcher's credential and proxyCredential properties. +// +// Warning: This may be called repeatedly if the challenge fails. Check +// challenge.previousFailureCount to identify repeated invocations. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherChallengeBlock challengeBlock; + +// The delegate's optional willRedirect block may be used to inspect or alter +// the redirection. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherWillRedirectBlock willRedirectBlock; + +// The optional send progress block reports body bytes uploaded. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherSendProgressBlock sendProgressBlock; + +// The optional accumulate block may be set by clients wishing to accumulate data +// themselves rather than let the fetcher append each buffer to an NSData. +// +// When this is called with nil data (such as on redirect) the client +// should empty its accumulation buffer. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherAccumulateDataBlock accumulateDataBlock; + +// The optional received progress block may be used to monitor data +// received from a data task. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherReceivedProgressBlock receivedProgressBlock; + +// The delegate's optional downloadProgress block may be used to monitor download +// progress in writing to disk. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherDownloadProgressBlock downloadProgressBlock; + +// The delegate's optional willCacheURLResponse block may be used to alter the cached +// NSURLResponse. The user may prevent caching by passing nil to the block's response. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherWillCacheURLResponseBlock willCacheURLResponseBlock; + +// Enable retrying; see comments at the top of this file. Setting +// retryEnabled=YES resets the min and max retry intervals. +@property(atomic, assign, getter=isRetryEnabled) BOOL retryEnabled; + +// Retry block is optional for retries. +// +// If present, this block should call the response block with YES to cause a retry or NO to end the +// fetch. +// See comments at the top of this file. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherRetryBlock retryBlock; + +// The optional block for collecting the metrics of the present session. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) + GTMSessionFetcherMetricsCollectionBlock metricsCollectionBlock API_AVAILABLE( + ios(10.0), macosx(10.12), tvos(10.0), watchos(3.0)); + +// Retry intervals must be strictly less than maxRetryInterval, else +// they will be limited to maxRetryInterval and no further retries will +// be attempted. Setting maxRetryInterval to 0.0 will reset it to the +// default value, 60 seconds for downloads and 600 seconds for uploads. +@property(atomic, assign) NSTimeInterval maxRetryInterval; + +// Starting retry interval. Setting minRetryInterval to 0.0 will reset it +// to a random value between 1.0 and 2.0 seconds. Clients should normally not +// set this except for unit testing. +@property(atomic, assign) NSTimeInterval minRetryInterval; + +// Multiplier used to increase the interval between retries, typically 2.0. +// Clients should not need to set this. +@property(atomic, assign) double retryFactor; + +// Number of retries attempted. +@property(atomic, readonly) NSUInteger retryCount; + +// Interval delay to precede next retry. +@property(atomic, readonly) NSTimeInterval nextRetryInterval; + +#if GTM_BACKGROUND_TASK_FETCHING +// Skip use of a UIBackgroundTask, thus requiring fetches to complete when the app is in the +// foreground. +// +// Targets should define GTM_BACKGROUND_TASK_FETCHING to 0 to avoid use of a UIBackgroundTask +// on iOS to allow fetches to complete in the background. This property is available when +// it's not practical to set the preprocessor define. +@property(atomic, assign) BOOL skipBackgroundTask; +#endif // GTM_BACKGROUND_TASK_FETCHING + +// Begin fetching the request +// +// The delegate may optionally implement the callback or pass nil for the selector or handler. +// +// The delegate and all callback blocks are retained between the beginFetch call until after the +// finish callback, or until the fetch is stopped. +// +// An error is passed to the callback for server statuses 300 or +// higher, with the status stored as the error object's code. +// +// finishedSEL has a signature like: +// - (void)fetcher:(GTMSessionFetcher *)fetcher +// finishedWithData:(NSData *)data +// error:(NSError *)error; +// +// If the application has specified a destinationFileURL or an accumulateDataBlock +// for the fetcher, the data parameter passed to the callback will be nil. + +- (void)beginFetchWithDelegate:(GTM_NULLABLE id)delegate + didFinishSelector:(GTM_NULLABLE SEL)finishedSEL; + +- (void)beginFetchWithCompletionHandler:(GTM_NULLABLE GTMSessionFetcherCompletionHandler)handler; + +// Returns YES if this fetcher is in the process of fetching a URL. +@property(atomic, readonly, getter=isFetching) BOOL fetching; + +// Cancel the fetch of the request that's currently in progress. The completion handler +// will not be called. +- (void)stopFetching; + +// A block to be called when the fetch completes. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherCompletionHandler completionHandler; + +// A block to be called if download resume data becomes available. +@property(atomic, strong, GTM_NULLABLE) void (^resumeDataBlock)(NSData *); + +// Return the status code from the server response. +@property(atomic, readonly) NSInteger statusCode; + +// Return the http headers from the response. +@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSString *) *responseHeaders; + +// The response, once it's been received. +@property(atomic, strong, readonly, GTM_NULLABLE) NSURLResponse *response; + +// Bytes downloaded so far. +@property(atomic, readonly) int64_t downloadedLength; + +// Buffer of currently-downloaded data, if available. +@property(atomic, readonly, strong, GTM_NULLABLE) NSData *downloadedData; + +// Local path to which the downloaded file will be moved. +// +// If a file already exists at the path, it will be overwritten. +// Will create the enclosing folders if they are not present. +@property(atomic, strong, GTM_NULLABLE) NSURL *destinationFileURL; + +// The time this fetcher originally began fetching. This is useful as a time +// barrier for ignoring irrelevant fetch notifications or callbacks. +@property(atomic, strong, readonly, GTM_NULLABLE) NSDate *initialBeginFetchDate; + +// userData is retained solely for the convenience of the client. +@property(atomic, strong, GTM_NULLABLE) id userData; + +// Stored property values are retained solely for the convenience of the client. +@property(atomic, copy, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, id) *properties; + +- (void)setProperty:(GTM_NULLABLE id)obj forKey:(NSString *)key; // Pass nil for obj to remove the property. +- (GTM_NULLABLE id)propertyForKey:(NSString *)key; + +- (void)addPropertiesFromDictionary:(GTM_NSDictionaryOf(NSString *, id) *)dict; + +// Comments are useful for logging, so are strongly recommended for each fetcher. +@property(atomic, copy, GTM_NULLABLE) NSString *comment; + +- (void)setCommentWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); + +// Log of request and response, if logging is enabled +@property(atomic, copy, GTM_NULLABLE) NSString *log; + +// Callbacks are run on this queue. If none is supplied, the main queue is used. +@property(atomic, strong, GTM_NULL_RESETTABLE) dispatch_queue_t callbackQueue; + +// The queue used internally by the session to invoke its delegate methods in the fetcher. +// +// Application callbacks are always called by the fetcher on the callbackQueue above, +// not on this queue. Apps should generally not change this queue. +// +// The default delegate queue is the main queue. +// +// This value is ignored after the session has been created, so this +// property should be set in the fetcher service rather in the fetcher as it applies +// to a shared session. +@property(atomic, strong, GTM_NULL_RESETTABLE) NSOperationQueue *sessionDelegateQueue; + +// Spin the run loop or sleep the thread, discarding events, until the fetch has completed. +// +// This is only for use in testing or in tools without a user interface. +// +// Note: Synchronous fetches should never be used by shipping apps; they are +// sufficient reason for rejection from the app store. +// +// Returns NO if timed out. +- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds; + +// Test block is optional for testing. +// +// If present, this block will cause the fetcher to skip starting the session, and instead +// use the test block response values when calling the completion handler and delegate code. +// +// Test code can set this on the fetcher or on the fetcher service. For testing libraries +// that use a fetcher without exposing either the fetcher or the fetcher service, the global +// method setGlobalTestBlock: will set the block for all fetchers that do not have a test +// block set. +// +// The test code can pass nil for all response parameters to indicate that the fetch +// should proceed. +// +// Applications can exclude test block support by setting GTM_DISABLE_FETCHER_TEST_BLOCK. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherTestBlock testBlock; + ++ (void)setGlobalTestBlock:(GTM_NULLABLE GTMSessionFetcherTestBlock)block; + +// When using the testBlock, |testBlockAccumulateDataChunkCount| is the desired number of chunks to +// divide the response data into if the client has streaming enabled. The data will be divided up to +// |testBlockAccumulateDataChunkCount| chunks; however, the exact amount may vary depending on the +// size of the response data (e.g. a 1-byte response can only be divided into one chunk). +@property(atomic, readwrite) NSUInteger testBlockAccumulateDataChunkCount; + +#if GTM_BACKGROUND_TASK_FETCHING +// For testing or to override UIApplication invocations, apps may specify an alternative +// target for messages to UIApplication. ++ (void)setSubstituteUIApplication:(nullable id)substituteUIApplication; ++ (nullable id)substituteUIApplication; +#endif // GTM_BACKGROUND_TASK_FETCHING + +// Exposed for testing. ++ (GTMSessionCookieStorage *)staticCookieStorage; ++ (BOOL)appAllowsInsecureRequests; + +#if STRIP_GTM_FETCH_LOGGING +// If logging is stripped, provide a stub for the main method +// for controlling logging. ++ (void)setLoggingEnabled:(BOOL)flag; ++ (BOOL)isLoggingEnabled; + +#else + +// These methods let an application log specific body text, such as the text description of a binary +// request or response. The application should set the fetcher to defer response body logging until +// the response has been received and the log response body has been set by the app. For example: +// +// fetcher.logRequestBody = [binaryObject stringDescription]; +// fetcher.deferResponseBodyLogging = YES; +// [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { +// if (error == nil) { +// fetcher.logResponseBody = [[[MyThing alloc] initWithData:data] stringDescription]; +// } +// fetcher.deferResponseBodyLogging = NO; +// }]; + +@property(atomic, copy, GTM_NULLABLE) NSString *logRequestBody; +@property(atomic, assign) BOOL deferResponseBodyLogging; +@property(atomic, copy, GTM_NULLABLE) NSString *logResponseBody; + +// Internal logging support. +@property(atomic, readonly) NSData *loggedStreamData; +@property(atomic, assign) BOOL hasLoggedError; +@property(atomic, strong, GTM_NULLABLE) NSURL *redirectedFromURL; +- (void)appendLoggedStreamData:(NSData *)dataToAdd; +- (void)clearLoggedStreamData; + +#endif // STRIP_GTM_FETCH_LOGGING + +@end + +@interface GTMSessionFetcher (BackwardsCompatibilityOnly) +// Clients using GTMSessionFetcher should set the cookie storage explicitly themselves. +// This method is just for compatibility with the old GTMHTTPFetcher class. +- (void)setCookieStorageMethod:(NSInteger)method; +@end + +// Until we can just instantiate NSHTTPCookieStorage for local use, we'll +// implement all the public methods ourselves. This stores cookies only in +// memory. Additional methods are provided for testing. +// +// iOS 9/OS X 10.11 added +[NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier:] +// which may also be used to create cookie storage. +@interface GTMSessionCookieStorage : NSHTTPCookieStorage + +// Add the array off cookies to the storage, replacing duplicates. +// Also removes expired cookies from the storage. +- (void)setCookies:(GTM_NULLABLE GTM_NSArrayOf(NSHTTPCookie *) *)cookies; + +- (void)removeAllCookies; + +@end + +// Macros to monitor synchronization blocks in debug builds. +// These report problems using GTMSessionCheckDebug. +// +// GTMSessionMonitorSynchronized Start monitoring a top-level-only +// @sync scope. +// GTMSessionMonitorRecursiveSynchronized Start monitoring a top-level or +// recursive @sync scope. +// GTMSessionCheckSynchronized Verify that the current execution +// is inside a @sync scope. +// GTMSessionCheckNotSynchronized Verify that the current execution +// is not inside a @sync scope. +// +// Example usage: +// +// - (void)myExternalMethod { +// @synchronized(self) { +// GTMSessionMonitorSynchronized(self) +// +// - (void)myInternalMethod { +// GTMSessionCheckSynchronized(self); +// +// - (void)callMyCallbacks { +// GTMSessionCheckNotSynchronized(self); +// +// GTMSessionCheckNotSynchronized is available for verifying the code isn't +// in a deadlockable @sync state when posting notifications and invoking +// callbacks. Don't use GTMSessionCheckNotSynchronized immediately before a +// @sync scope; the normal recursiveness check of GTMSessionMonitorSynchronized +// can catch those. + +#ifdef __OBJC__ +// If asserts are entirely no-ops, the synchronization monitor is just a bunch +// of counting code that doesn't report exceptional circumstances in any way. +// Only build the synchronization monitor code if NS_BLOCK_ASSERTIONS is not +// defined or asserts are being logged instead. +#if DEBUG && (!defined(NS_BLOCK_ASSERTIONS) || GTMSESSION_ASSERT_AS_LOG) + #define __GTMSessionMonitorSynchronizedVariableInner(varname, counter) \ + varname ## counter + #define __GTMSessionMonitorSynchronizedVariable(varname, counter) \ + __GTMSessionMonitorSynchronizedVariableInner(varname, counter) + + #define GTMSessionMonitorSynchronized(obj) \ + NS_VALID_UNTIL_END_OF_SCOPE id \ + __GTMSessionMonitorSynchronizedVariable(__monitor, __COUNTER__) = \ + [[GTMSessionSyncMonitorInternal alloc] initWithSynchronizationObject:obj \ + allowRecursive:NO \ + functionName:__func__] + + #define GTMSessionMonitorRecursiveSynchronized(obj) \ + NS_VALID_UNTIL_END_OF_SCOPE id \ + __GTMSessionMonitorSynchronizedVariable(__monitor, __COUNTER__) = \ + [[GTMSessionSyncMonitorInternal alloc] initWithSynchronizationObject:obj \ + allowRecursive:YES \ + functionName:__func__] + + #define GTMSessionCheckSynchronized(obj) { \ + GTMSESSION_ASSERT_DEBUG( \ + [GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ + @"GTMSessionCheckSynchronized(" #obj ") failed: not sync'd" \ + @" on " #obj " in %s. Call stack:\n%@", \ + __func__, [NSThread callStackSymbols]); \ + } + + #define GTMSessionCheckNotSynchronized(obj) { \ + GTMSESSION_ASSERT_DEBUG( \ + ![GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ + @"GTMSessionCheckNotSynchronized(" #obj ") failed: was sync'd" \ + @" on " #obj " in %s by %@. Call stack:\n%@", __func__, \ + [GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ + [NSThread callStackSymbols]); \ + } + +// GTMSessionSyncMonitorInternal is a private class that keeps track of the +// beginning and end of synchronized scopes. +// +// This class should not be used directly, but only via the +// GTMSessionMonitorSynchronized macro. +@interface GTMSessionSyncMonitorInternal : NSObject +- (instancetype)initWithSynchronizationObject:(id)object + allowRecursive:(BOOL)allowRecursive + functionName:(const char *)functionName; +// Return the names of the functions that hold sync on the object, or nil if none. ++ (NSArray *)functionsHoldingSynchronizationOnObject:(id)object; +@end + +#else + #define GTMSessionMonitorSynchronized(obj) do { } while (0) + #define GTMSessionMonitorRecursiveSynchronized(obj) do { } while (0) + #define GTMSessionCheckSynchronized(obj) do { } while (0) + #define GTMSessionCheckNotSynchronized(obj) do { } while (0) +#endif // !DEBUG +#endif // __OBJC__ + + +GTM_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m new file mode 100644 index 00000000..3dc64597 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m @@ -0,0 +1,4670 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMSessionFetcher.h" +#if TARGET_OS_OSX && GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH +// To reconnect background sessions on Mac outside +load requires importing and linking +// AppKit to access the NSApplicationDidFinishLaunching symbol. +#import +#endif + +#import + +#ifndef STRIP_GTM_FETCH_LOGGING + #error GTMSessionFetcher headers should have defaulted this if it wasn't already defined. +#endif + +GTM_ASSUME_NONNULL_BEGIN + +NSString *const kGTMSessionFetcherStartedNotification = @"kGTMSessionFetcherStartedNotification"; +NSString *const kGTMSessionFetcherStoppedNotification = @"kGTMSessionFetcherStoppedNotification"; +NSString *const kGTMSessionFetcherRetryDelayStartedNotification = @"kGTMSessionFetcherRetryDelayStartedNotification"; +NSString *const kGTMSessionFetcherRetryDelayStoppedNotification = @"kGTMSessionFetcherRetryDelayStoppedNotification"; + +NSString *const kGTMSessionFetcherCompletionInvokedNotification = @"kGTMSessionFetcherCompletionInvokedNotification"; +NSString *const kGTMSessionFetcherCompletionDataKey = @"data"; +NSString *const kGTMSessionFetcherCompletionErrorKey = @"error"; + +NSString *const kGTMSessionFetcherErrorDomain = @"com.google.GTMSessionFetcher"; +NSString *const kGTMSessionFetcherStatusDomain = @"com.google.HTTPStatus"; +NSString *const kGTMSessionFetcherStatusDataKey = @"data"; // data returned with a kGTMSessionFetcherStatusDomain error +NSString *const kGTMSessionFetcherStatusDataContentTypeKey = @"data_content_type"; + +NSString *const kGTMSessionFetcherNumberOfRetriesDoneKey = @"kGTMSessionFetcherNumberOfRetriesDoneKey"; +NSString *const kGTMSessionFetcherElapsedIntervalWithRetriesKey = @"kGTMSessionFetcherElapsedIntervalWithRetriesKey"; + +static NSString *const kGTMSessionIdentifierPrefix = @"com.google.GTMSessionFetcher"; +static NSString *const kGTMSessionIdentifierDestinationFileURLMetadataKey = @"_destURL"; +static NSString *const kGTMSessionIdentifierBodyFileURLMetadataKey = @"_bodyURL"; + +// The default max retry interview is 10 minutes for uploads (POST/PUT/PATCH), +// 1 minute for downloads. +static const NSTimeInterval kUnsetMaxRetryInterval = -1.0; +static const NSTimeInterval kDefaultMaxDownloadRetryInterval = 60.0; +static const NSTimeInterval kDefaultMaxUploadRetryInterval = 60.0 * 10.; + +// The maximum data length that can be loaded to the error userInfo +static const int64_t kMaximumDownloadErrorDataLength = 20000; + +#ifdef GTMSESSION_PERSISTED_DESTINATION_KEY +// Projects using unique class names should also define a unique persisted destination key. +static NSString * const kGTMSessionFetcherPersistedDestinationKey = + GTMSESSION_PERSISTED_DESTINATION_KEY; +#else +static NSString * const kGTMSessionFetcherPersistedDestinationKey = + @"com.google.GTMSessionFetcher.downloads"; +#endif + +GTM_ASSUME_NONNULL_END + +// +// GTMSessionFetcher +// + +#if 0 +#define GTM_LOG_BACKGROUND_SESSION(...) GTMSESSION_LOG_DEBUG(__VA_ARGS__) +#else +#define GTM_LOG_BACKGROUND_SESSION(...) +#endif + +#ifndef GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY + #if (TARGET_OS_TV \ + || TARGET_OS_WATCH \ + || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0)) + #define GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY 1 + #endif +#endif + +#if ((defined(TARGET_OS_MACCATALYST) && TARGET_OS_MACCATALYST) || \ + (TARGET_OS_OSX && defined(__MAC_10_15) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15) || \ + (TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_13_0) || \ + (TARGET_OS_WATCH && defined(__WATCHOS_6_0) && __WATCHOS_VERSION_MIN_REQUIRED >= __WATCHOS_6_0) || \ + (TARGET_OS_TV && defined(__TVOS_13_0) && __TVOS_VERSION_MIN_REQUIRED >= __TVOS_13_0)) +#define GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 1 +#define GTM_SDK_SUPPORTS_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 1 +#elif ((TARGET_OS_OSX && defined(__MAC_10_15) && __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_10_15) || \ + (TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0) || \ + (TARGET_OS_WATCH && defined(__WATCHOS_6_0) && __WATCHOS_VERSION_MAX_ALLOWED >= __WATCHOS_6_0) || \ + (TARGET_OS_TV && defined(__TVOS_13_0) && __TVOS_VERSION_MAX_ALLOWED >= __TVOS_13_0)) +#define GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 0 +#define GTM_SDK_SUPPORTS_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 1 +#else +#define GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 0 +#define GTM_SDK_SUPPORTS_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 0 +#endif + +#if ((defined(TARGET_OS_MACCATALYST) && TARGET_OS_MACCATALYST) || \ + (TARGET_OS_OSX && defined(__MAC_10_15) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15) || \ + (TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_13_0) || \ + (TARGET_OS_WATCH && defined(__WATCHOS_6_0) && __WATCHOS_VERSION_MIN_REQUIRED >= __WATCHOS_6_0) || \ + (TARGET_OS_TV && defined(__TVOS_13_0) && __TVOS_VERSION_MIN_REQUIRED >= __TVOS_13_0)) +#define GTM_SDK_REQUIRES_SECTRUSTEVALUATEWITHERROR 1 +#else +#define GTM_SDK_REQUIRES_SECTRUSTEVALUATEWITHERROR 0 +#endif + +@interface GTMSessionFetcher () + +@property(atomic, strong, readwrite, GTM_NULLABLE) NSData *downloadedData; +@property(atomic, strong, readwrite, GTM_NULLABLE) NSData *downloadResumeData; + +#if GTM_BACKGROUND_TASK_FETCHING +// Should always be accessed within an @synchronized(self). +@property(assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskIdentifier; +#endif + +@property(atomic, readwrite, getter=isUsingBackgroundSession) BOOL usingBackgroundSession; + +@end + +#if !GTMSESSION_BUILD_COMBINED_SOURCES +@interface GTMSessionFetcher (GTMSessionFetcherLoggingInternal) +- (void)logFetchWithError:(NSError *)error; +- (void)logNowWithError:(GTM_NULLABLE NSError *)error; +- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream; +- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: + (GTMSessionFetcherBodyStreamProvider)streamProvider; +@end +#endif // !GTMSESSION_BUILD_COMBINED_SOURCES + +GTM_ASSUME_NONNULL_BEGIN + +static NSTimeInterval InitialMinRetryInterval(void) { + return 1.0 + ((double)(arc4random_uniform(0x0FFFF)) / (double) 0x0FFFF); +} + +static BOOL IsLocalhost(NSString * GTM_NULLABLE_TYPE host) { + // We check if there's host, and then make the comparisons. + if (host == nil) return NO; + return ([host caseInsensitiveCompare:@"localhost"] == NSOrderedSame + || [host isEqual:@"::1"] + || [host isEqual:@"127.0.0.1"]); +} + +static NSDictionary *GTM_NULLABLE_TYPE GTMErrorUserInfoForData( + NSData *GTM_NULLABLE_TYPE data, NSDictionary *GTM_NULLABLE_TYPE responseHeaders) { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + + if (data.length > 0) { + userInfo[kGTMSessionFetcherStatusDataKey] = data; + + NSString *contentType = responseHeaders[@"Content-Type"]; + if (contentType) { + userInfo[kGTMSessionFetcherStatusDataContentTypeKey] = contentType; + } + } + + return userInfo.count > 0 ? userInfo : nil; +} + +static GTMSessionFetcherTestBlock GTM_NULLABLE_TYPE gGlobalTestBlock; + +@implementation GTMSessionFetcher { + NSMutableURLRequest *_request; // after beginFetch, changed only in delegate callbacks + BOOL _useUploadTask; // immutable after beginFetch + NSURL *_bodyFileURL; // immutable after beginFetch + GTMSessionFetcherBodyStreamProvider _bodyStreamProvider; // immutable after beginFetch + NSURLSession *_session; + BOOL _shouldInvalidateSession; // immutable after beginFetch + NSURLSession *_sessionNeedingInvalidation; + NSURLSessionConfiguration *_configuration; + NSURLSessionTask *_sessionTask; + NSString *_taskDescription; + float _taskPriority; + NSURLResponse *_response; + NSString *_sessionIdentifier; + BOOL _wasCreatedFromBackgroundSession; + BOOL _didCreateSessionIdentifier; + NSString *_sessionIdentifierUUID; + BOOL _userRequestedBackgroundSession; + BOOL _usingBackgroundSession; + NSMutableData * GTM_NULLABLE_TYPE _downloadedData; + NSError *_downloadFinishedError; + NSData *_downloadResumeData; // immutable after construction + NSData * GTM_NULLABLE_TYPE _downloadTaskErrorData; // Data for when download task fails + NSURL *_destinationFileURL; + int64_t _downloadedLength; + NSURLCredential *_credential; // username & password + NSURLCredential *_proxyCredential; // credential supplied to proxy servers + BOOL _isStopNotificationNeeded; // set when start notification has been sent + BOOL _isUsingTestBlock; // set when a test block was provided (remains set when the block is released) + id _userData; // retained, if set by caller + NSMutableDictionary *_properties; // more data retained for caller + dispatch_queue_t _callbackQueue; + dispatch_group_t _callbackGroup; // read-only after creation + NSOperationQueue *_delegateQueue; // immutable after beginFetch + + id _authorizer; // immutable after beginFetch + + // The service object that created and monitors this fetcher, if any. + id _service; // immutable; set by the fetcher service upon creation + NSString *_serviceHost; + NSInteger _servicePriority; // immutable after beginFetch + BOOL _hasStoppedFetching; // counterpart to _initialBeginFetchDate + BOOL _userStoppedFetching; + + BOOL _isRetryEnabled; // user wants auto-retry + NSTimer *_retryTimer; + NSUInteger _retryCount; + NSTimeInterval _maxRetryInterval; // default 60 (download) or 600 (upload) seconds + NSTimeInterval _minRetryInterval; // random between 1 and 2 seconds + NSTimeInterval _retryFactor; // default interval multiplier is 2 + NSTimeInterval _lastRetryInterval; + NSDate *_initialBeginFetchDate; // date that beginFetch was first invoked; immutable after initial beginFetch + NSDate *_initialRequestDate; // date of first request to the target server (ignoring auth) + BOOL _hasAttemptedAuthRefresh; // accessed only in shouldRetryNowForStatus: + + NSString *_comment; // comment for log + NSString *_log; +#if !STRIP_GTM_FETCH_LOGGING + NSMutableData *_loggedStreamData; + NSURL *_redirectedFromURL; + NSString *_logRequestBody; + NSString *_logResponseBody; + BOOL _hasLoggedError; + BOOL _deferResponseBodyLogging; +#endif +} + +#if !GTMSESSION_UNIT_TESTING ++ (void)load { +#if GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH && TARGET_OS_IPHONE + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(reconnectFetchersForBackgroundSessionsOnAppLaunch:) + name:UIApplicationDidFinishLaunchingNotification + object:nil]; +#elif GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH && TARGET_OS_OSX + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(reconnectFetchersForBackgroundSessionsOnAppLaunch:) + name:NSApplicationDidFinishLaunchingNotification + object:nil]; +#else + [self fetchersForBackgroundSessions]; +#endif +} + ++ (void)reconnectFetchersForBackgroundSessionsOnAppLaunch:(NSNotification *)notification { + // Give all other app-did-launch handlers a chance to complete before + // reconnecting the fetchers. Not doing this may lead to reconnecting + // before the app delegate has a chance to run. + dispatch_async(dispatch_get_main_queue(), ^{ + [self fetchersForBackgroundSessions]; + }); +} +#endif // !GTMSESSION_UNIT_TESTING + ++ (instancetype)fetcherWithRequest:(GTM_NULLABLE NSURLRequest *)request { + return [[self alloc] initWithRequest:request configuration:nil]; +} + ++ (instancetype)fetcherWithURL:(NSURL *)requestURL { + return [self fetcherWithRequest:[NSURLRequest requestWithURL:requestURL]]; +} + ++ (instancetype)fetcherWithURLString:(NSString *)requestURLString { + return [self fetcherWithURL:(NSURL *)[NSURL URLWithString:requestURLString]]; +} + ++ (instancetype)fetcherWithDownloadResumeData:(NSData *)resumeData { + GTMSessionFetcher *fetcher = [self fetcherWithRequest:nil]; + fetcher.comment = @"Resuming download"; + fetcher.downloadResumeData = resumeData; + return fetcher; +} + ++ (GTM_NULLABLE instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier { + GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); + NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; + GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; + if (!fetcher && [sessionIdentifier hasPrefix:kGTMSessionIdentifierPrefix]) { + fetcher = [self fetcherWithRequest:nil]; + [fetcher setSessionIdentifier:sessionIdentifier]; + [sessionIdentifierToFetcherMap setObject:fetcher forKey:sessionIdentifier]; + fetcher->_wasCreatedFromBackgroundSession = YES; + [fetcher setCommentWithFormat:@"Resuming %@", + fetcher && fetcher->_sessionIdentifierUUID ? fetcher->_sessionIdentifierUUID : @"?"]; + } + return fetcher; +} + ++ (NSMapTable *)sessionIdentifierToFetcherMap { + // TODO: What if a service is involved in creating the fetcher? Currently, when re-creating + // fetchers, if a service was involved, it is not re-created. Should the service maintain a map? + static NSMapTable *gSessionIdentifierToFetcherMap = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gSessionIdentifierToFetcherMap = [NSMapTable strongToWeakObjectsMapTable]; + }); + return gSessionIdentifierToFetcherMap; +} + +#if !GTM_ALLOW_INSECURE_REQUESTS ++ (BOOL)appAllowsInsecureRequests { + // If the main bundle Info.plist key NSAppTransportSecurity is present, and it specifies + // NSAllowsArbitraryLoads, then we need to explicitly enforce secure schemes. +#if GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY + static BOOL allowsInsecureRequests; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *mainBundle = [NSBundle mainBundle]; + NSDictionary *appTransportSecurity = + [mainBundle objectForInfoDictionaryKey:@"NSAppTransportSecurity"]; + allowsInsecureRequests = + [[appTransportSecurity objectForKey:@"NSAllowsArbitraryLoads"] boolValue]; + }); + return allowsInsecureRequests; +#else + // For builds targeting iOS 8 or 10.10 and earlier, we want to require fetcher + // security checks. + return YES; +#endif // GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY +} +#else // GTM_ALLOW_INSECURE_REQUESTS ++ (BOOL)appAllowsInsecureRequests { + return YES; +} +#endif // !GTM_ALLOW_INSECURE_REQUESTS + + +- (instancetype)init { + return [self initWithRequest:nil configuration:nil]; +} + +- (instancetype)initWithRequest:(NSURLRequest *)request { + return [self initWithRequest:request configuration:nil]; +} + +- (instancetype)initWithRequest:(GTM_NULLABLE NSURLRequest *)request + configuration:(GTM_NULLABLE NSURLSessionConfiguration *)configuration { + self = [super init]; + if (self) { +#if GTM_BACKGROUND_TASK_FETCHING + _backgroundTaskIdentifier = UIBackgroundTaskInvalid; +#endif + _request = [request mutableCopy]; + _configuration = configuration; + + NSData *bodyData = request.HTTPBody; + if (bodyData) { + _bodyLength = (int64_t)bodyData.length; + } else { + _bodyLength = NSURLSessionTransferSizeUnknown; + } + + _callbackQueue = dispatch_get_main_queue(); + _callbackGroup = dispatch_group_create(); + _delegateQueue = [NSOperationQueue mainQueue]; + + _minRetryInterval = InitialMinRetryInterval(); + _maxRetryInterval = kUnsetMaxRetryInterval; + + _taskPriority = -1.0f; // Valid values if set are 0.0...1.0. + + _testBlockAccumulateDataChunkCount = 1; + +#if !STRIP_GTM_FETCH_LOGGING + // Encourage developers to set the comment property or use + // setCommentWithFormat: by providing a default string. + _comment = @"(No fetcher comment set)"; +#endif + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + // disallow use of fetchers in a copy property + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (NSString *)description { + NSString *requestStr = self.request.URL.description; + if (requestStr.length == 0) { + if (self.downloadResumeData.length > 0) { + requestStr = @""; + } else if (_wasCreatedFromBackgroundSession) { + requestStr = @""; + } else { + requestStr = @""; + } + } + return [NSString stringWithFormat:@"%@ %p (%@)", [self class], self, requestStr]; +} + +- (void)dealloc { + GTMSESSION_ASSERT_DEBUG(!_isStopNotificationNeeded, + @"unbalanced fetcher notification for %@", _request.URL); + [self forgetSessionIdentifierForFetcherWithoutSyncCheck]; + + // Note: if a session task or a retry timer was pending, then this instance + // would be retained by those so it wouldn't be getting dealloc'd, + // hence we don't need to stopFetch here +} + +#pragma mark - + +// Begin fetching the URL (or begin a retry fetch). The delegate is retained +// for the duration of the fetch connection. + +- (void)beginFetchWithCompletionHandler:(GTM_NULLABLE GTMSessionFetcherCompletionHandler)handler { + GTMSessionCheckNotSynchronized(self); + + _completionHandler = [handler copy]; + + // The user may have called setDelegate: earlier if they want to use other + // delegate-style callbacks during the fetch; otherwise, the delegate is nil, + // which is fine. + [self beginFetchMayDelay:YES mayAuthorize:YES]; +} + +// Begin fetching the URL for a retry fetch. The delegate and completion handler +// are already provided, and do not need to be copied. +- (void)beginFetchForRetry { + GTMSessionCheckNotSynchronized(self); + + [self beginFetchMayDelay:YES mayAuthorize:YES]; +} + +- (GTMSessionFetcherCompletionHandler)completionHandlerWithTarget:(GTM_NULLABLE_TYPE id)target + didFinishSelector:(GTM_NULLABLE_TYPE SEL)finishedSelector { + GTMSessionFetcherAssertValidSelector(target, finishedSelector, @encode(GTMSessionFetcher *), + @encode(NSData *), @encode(NSError *), 0); + GTMSessionFetcherCompletionHandler completionHandler = ^(NSData *data, NSError *error) { + if (target && finishedSelector) { + id selfArg = self; // Placate ARC. + NSMethodSignature *sig = [target methodSignatureForSelector:finishedSelector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; + [invocation setSelector:(SEL)finishedSelector]; + [invocation setTarget:target]; + [invocation setArgument:&selfArg atIndex:2]; + [invocation setArgument:&data atIndex:3]; + [invocation setArgument:&error atIndex:4]; + [invocation invoke]; + } + }; + return completionHandler; +} + +- (void)beginFetchWithDelegate:(GTM_NULLABLE_TYPE id)target + didFinishSelector:(GTM_NULLABLE_TYPE SEL)finishedSelector { + GTMSessionCheckNotSynchronized(self); + + GTMSessionFetcherCompletionHandler handler = [self completionHandlerWithTarget:target + didFinishSelector:finishedSelector]; + [self beginFetchWithCompletionHandler:handler]; +} + +- (void)beginFetchMayDelay:(BOOL)mayDelay + mayAuthorize:(BOOL)mayAuthorize { + // This is the internal entry point for re-starting fetches. + GTMSessionCheckNotSynchronized(self); + + NSMutableURLRequest *fetchRequest = _request; // The request property is now externally immutable. + NSURL *fetchRequestURL = fetchRequest.URL; + NSString *priorSessionIdentifier = self.sessionIdentifier; + + // A utility block for creating error objects when we fail to start the fetch. + NSError *(^beginFailureError)(NSInteger) = ^(NSInteger code){ + NSString *urlString = fetchRequestURL.absoluteString; + NSDictionary *userInfo = @{ + NSURLErrorFailingURLStringErrorKey : (urlString ? urlString : @"(missing URL)") + }; + return [NSError errorWithDomain:kGTMSessionFetcherErrorDomain + code:code + userInfo:userInfo]; + }; + + // Catch delegate queue maxConcurrentOperationCount values other than 1, particularly + // NSOperationQueueDefaultMaxConcurrentOperationCount (-1), to avoid the additional complexity + // of simultaneous or out-of-order delegate callbacks. + GTMSESSION_ASSERT_DEBUG(_delegateQueue.maxConcurrentOperationCount == 1, + @"delegate queue %@ should support one concurrent operation, not %ld", + _delegateQueue.name, + (long)_delegateQueue.maxConcurrentOperationCount); + + if (!_initialBeginFetchDate) { + // This ivar is set only here on the initial beginFetch so need not be synchronized. + _initialBeginFetchDate = [[NSDate alloc] init]; + } + + if (self.sessionTask != nil) { + // If cached fetcher returned through fetcherWithSessionIdentifier:, then it's + // already begun, but don't consider this a failure, since the user need not know this. + if (self.sessionIdentifier != nil) { + return; + } + GTMSESSION_ASSERT_DEBUG(NO, @"Fetch object %@ being reused; this should never happen", self); + [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorDownloadFailed)]; + return; + } + + if (fetchRequestURL == nil && !_downloadResumeData && !priorSessionIdentifier) { + GTMSESSION_ASSERT_DEBUG(NO, @"Beginning a fetch requires a request with a URL"); + [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorDownloadFailed)]; + return; + } + + // We'll respect the user's request for a background session (unless this is + // an upload fetcher, which does its initial request foreground.) + self.usingBackgroundSession = self.useBackgroundSession && [self canFetchWithBackgroundSession]; + + NSURL *bodyFileURL = self.bodyFileURL; + if (bodyFileURL) { + NSError *fileCheckError; + if (![bodyFileURL checkResourceIsReachableAndReturnError:&fileCheckError]) { + // This assert fires when the file being uploaded no longer exists once + // the fetcher is ready to start the upload. + GTMSESSION_ASSERT_DEBUG_OR_LOG(0, @"Body file is unreachable: %@\n %@", + bodyFileURL.path, fileCheckError); + [self failToBeginFetchWithError:fileCheckError]; + return; + } + } + + NSString *requestScheme = fetchRequestURL.scheme; + BOOL isDataRequest = [requestScheme isEqual:@"data"]; + if (isDataRequest) { + // NSURLSession does not support data URLs in background sessions. +#if DEBUG + if (priorSessionIdentifier || self.sessionIdentifier) { + GTMSESSION_LOG_DEBUG(@"Converting background to foreground session for %@", + fetchRequest); + } +#endif + // If priorSessionIdentifier is allowed to stay non-nil, a background session can + // still be created. + priorSessionIdentifier = nil; + [self setSessionIdentifierInternal:nil]; + self.usingBackgroundSession = NO; + } + +#if GTM_ALLOW_INSECURE_REQUESTS + BOOL shouldCheckSecurity = NO; +#else + BOOL shouldCheckSecurity = (fetchRequestURL != nil + && !isDataRequest + && [[self class] appAllowsInsecureRequests]); +#endif + + if (shouldCheckSecurity) { + // Allow https only for requests, unless overridden by the client. + // + // Non-https requests may too easily be snooped, so we disallow them by default. + // + // file: and data: schemes are usually safe if they are hardcoded in the client or provided + // by a trusted source, but since it's fairly rare to need them, it's safest to make clients + // explicitly whitelist them. + BOOL isSecure = + requestScheme != nil && [requestScheme caseInsensitiveCompare:@"https"] == NSOrderedSame; + if (!isSecure) { + BOOL allowRequest = NO; + NSString *host = fetchRequestURL.host; + + // Check schemes first. A file scheme request may be allowed here, or as a localhost request. + for (NSString *allowedScheme in _allowedInsecureSchemes) { + if (requestScheme != nil && + [requestScheme caseInsensitiveCompare:allowedScheme] == NSOrderedSame) { + allowRequest = YES; + break; + } + } + if (!allowRequest) { + // Check for localhost requests. Security checks only occur for non-https requests, so + // this check won't happen for an https request to localhost. + BOOL isLocalhostRequest = (host.length == 0 && [fetchRequestURL isFileURL]) || IsLocalhost(host); + if (isLocalhostRequest) { + if (self.allowLocalhostRequest) { + allowRequest = YES; + } else { + GTMSESSION_ASSERT_DEBUG(NO, @"Fetch request for localhost but fetcher" + @" allowLocalhostRequest is not set: %@", fetchRequestURL); + } + } else { + GTMSESSION_ASSERT_DEBUG(NO, @"Insecure fetch request has a scheme (%@)" + @" not found in fetcher allowedInsecureSchemes (%@): %@", + requestScheme, _allowedInsecureSchemes ?: @" @[] ", fetchRequestURL); + } + } + + if (!allowRequest) { +#if !DEBUG + NSLog(@"Insecure fetch disallowed for %@", fetchRequestURL.description ?: @"nil request URL"); +#endif + [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorInsecureRequest)]; + return; + } + } // !isSecure + } // (requestURL != nil) && !isDataRequest + + if (self.cookieStorage == nil) { + self.cookieStorage = [[self class] staticCookieStorage]; + } + + BOOL isRecreatingSession = (self.sessionIdentifier != nil) && (fetchRequest == nil); + + self.canShareSession = !isRecreatingSession && !self.usingBackgroundSession; + + if (!self.session && self.canShareSession) { + self.session = [_service sessionForFetcherCreation]; + // If _session is nil, then the service's session creation semaphore will block + // until this fetcher invokes fetcherDidCreateSession: below, so this *must* invoke + // that method, even if the session fails to be created. + } + + if (!self.session) { + // Create a session. + if (!_configuration) { + if (priorSessionIdentifier || self.usingBackgroundSession) { + NSString *sessionIdentifier = priorSessionIdentifier; + if (!sessionIdentifier) { + sessionIdentifier = [self createSessionIdentifierWithMetadata:nil]; + } + NSMapTable *sessionIdentifierToFetcherMap = [[self class] sessionIdentifierToFetcherMap]; + [sessionIdentifierToFetcherMap setObject:self forKey:self.sessionIdentifier]; + + if (@available(iOS 8.0, tvOS 9.0, watchOS 2.0, macOS 10.10, *)) { + _configuration = + [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionIdentifier]; + } else { +#if ((!TARGET_OS_IPHONE && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10) \ + || (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0)) + // If building with support for iOS 7 or < macOS 10.10, allow using the older + // -backgroundSessionConfiguration: method, otherwise leave it out to avoid deprecated + // API warnings/errors. + _configuration = + [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier]; +#endif + } + self.usingBackgroundSession = YES; + self.canShareSession = NO; + } else { + _configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; + } +#if !GTM_ALLOW_INSECURE_REQUESTS +#if GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION + _configuration.TLSMinimumSupportedProtocolVersion = tls_protocol_version_TLSv12; +#elif GTM_SDK_SUPPORTS_TLSMINIMUMSUPPORTEDPROTOCOLVERSION + if (@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)) { +#if TARGET_OS_IOS + // Early seeds of iOS 13 don't actually support the selector and several + // months later, those seeds are still in use, so validate if the selector + // is supported. + if ([_configuration respondsToSelector:@selector(setTLSMinimumSupportedProtocolVersion:)]) { + _configuration.TLSMinimumSupportedProtocolVersion = tls_protocol_version_TLSv12; + } else { + _configuration.TLSMinimumSupportedProtocol = kTLSProtocol12; + } +#else + _configuration.TLSMinimumSupportedProtocolVersion = tls_protocol_version_TLSv12; +#endif // TARGET_OS_IOS + } else { + _configuration.TLSMinimumSupportedProtocol = kTLSProtocol12; + } +#else + _configuration.TLSMinimumSupportedProtocol = kTLSProtocol12; +#endif // GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION +#endif + } // !_configuration + _configuration.HTTPCookieStorage = self.cookieStorage; + + if (_configurationBlock) { + _configurationBlock(self, _configuration); + } + + id delegate = [_service sessionDelegate]; + if (!delegate || !self.canShareSession) { + delegate = self; + } + self.session = [NSURLSession sessionWithConfiguration:_configuration + delegate:delegate + delegateQueue:self.sessionDelegateQueue]; + GTMSESSION_ASSERT_DEBUG(self.session, @"Couldn't create session"); + + // Tell the service about the session created by this fetcher. This also signals the + // service's semaphore to allow other fetchers to request this session. + [_service fetcherDidCreateSession:self]; + + // If this assertion fires, the client probably tried to use a session identifier that was + // already used. The solution is to make the client use a unique identifier (or better yet let + // the session fetcher assign the identifier). + GTMSESSION_ASSERT_DEBUG(self.session.delegate == delegate, @"Couldn't assign delegate."); + + if (self.session) { + BOOL isUsingSharedDelegate = (delegate != self); + if (!isUsingSharedDelegate) { + _shouldInvalidateSession = YES; + } + } + } + + if (isRecreatingSession) { + _shouldInvalidateSession = YES; + + // Let's make sure there are tasks still running or if not that we get a callback from a + // completed one; otherwise, we assume the tasks failed. + // This is the observed behavior perhaps 25% of the time within the Simulator running 7.0.3 on + // exiting the app after starting an upload and relaunching the app if we manage to relaunch + // after the task has completed, but before the system relaunches us in the background. + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, + NSArray *downloadTasks) { + if (dataTasks.count == 0 && uploadTasks.count == 0 && downloadTasks.count == 0) { + double const kDelayInSeconds = 1.0; // We should get progress indication or completion soon + dispatch_time_t checkForFeedbackDelay = + dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kDelayInSeconds * NSEC_PER_SEC)); + dispatch_after(checkForFeedbackDelay, dispatch_get_main_queue(), ^{ + if (!self.sessionTask && !fetchRequest) { + // If our task and/or request haven't been restored, then we assume task feedback lost. + [self removePersistedBackgroundSessionFromDefaults]; + NSError *sessionError = + [NSError errorWithDomain:kGTMSessionFetcherErrorDomain + code:GTMSessionFetcherErrorBackgroundFetchFailed + userInfo:nil]; + [self failToBeginFetchWithError:sessionError]; + } + }); + } + }]; + return; + } + + self.downloadedData = nil; + self.downloadedLength = 0; + + if (_servicePriority == NSIntegerMin) { + mayDelay = NO; + } + if (mayDelay && _service) { + BOOL shouldFetchNow = [_service fetcherShouldBeginFetching:self]; + if (!shouldFetchNow) { + // The fetch is deferred, but will happen later. + // + // If this session is held by the fetcher service, clear the session now so that we don't + // assume it's still valid after the fetcher is restarted. + if (self.canShareSession) { + self.session = nil; + } + return; + } + } + + NSString *effectiveHTTPMethod = [fetchRequest valueForHTTPHeaderField:@"X-HTTP-Method-Override"]; + if (effectiveHTTPMethod == nil) { + effectiveHTTPMethod = fetchRequest.HTTPMethod; + } + BOOL isEffectiveHTTPGet = (effectiveHTTPMethod == nil + || [effectiveHTTPMethod isEqual:@"GET"]); + + BOOL needsUploadTask = (self.useUploadTask || self.bodyFileURL || self.bodyStreamProvider); + if (_bodyData || self.bodyStreamProvider || fetchRequest.HTTPBodyStream) { + if (isEffectiveHTTPGet) { + fetchRequest.HTTPMethod = @"POST"; + isEffectiveHTTPGet = NO; + } + + if (_bodyData) { + if (!needsUploadTask) { + fetchRequest.HTTPBody = _bodyData; + } +#if !STRIP_GTM_FETCH_LOGGING + } else if (fetchRequest.HTTPBodyStream) { + if ([self respondsToSelector:@selector(loggedInputStreamForInputStream:)]) { + fetchRequest.HTTPBodyStream = + [self performSelector:@selector(loggedInputStreamForInputStream:) + withObject:fetchRequest.HTTPBodyStream]; + } +#endif + } + } + + // We authorize after setting up the http method and body in the request + // because OAuth 1 may need to sign the request body + if (mayAuthorize && _authorizer && !isDataRequest) { + BOOL isAuthorized = [_authorizer isAuthorizedRequest:fetchRequest]; + if (!isAuthorized) { + // Authorization needed. + // + // If this session is held by the fetcher service, clear the session now so that we don't + // assume it's still valid after authorization completes. + if (self.canShareSession) { + self.session = nil; + } + + // Authorizing the request will recursively call this beginFetch:mayDelay: + // or failToBeginFetchWithError:. + [self authorizeRequest]; + return; + } + } + + // set the default upload or download retry interval, if necessary + if ([self isRetryEnabled] && self.maxRetryInterval <= 0) { + if (isEffectiveHTTPGet || [effectiveHTTPMethod isEqual:@"HEAD"]) { + [self setMaxRetryInterval:kDefaultMaxDownloadRetryInterval]; + } else { + [self setMaxRetryInterval:kDefaultMaxUploadRetryInterval]; + } + } + + // finally, start the connection + NSURLSessionTask *newSessionTask; + BOOL needsDataAccumulator = NO; + if (_downloadResumeData) { + newSessionTask = [_session downloadTaskWithResumeData:_downloadResumeData]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, + @"Failed downloadTaskWithResumeData for %@, resume data %lu bytes", + _session, (unsigned long)_downloadResumeData.length); + } else if (_destinationFileURL && !isDataRequest) { + newSessionTask = [_session downloadTaskWithRequest:fetchRequest]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, @"Failed downloadTaskWithRequest for %@, %@", + _session, fetchRequest); + } else if (needsUploadTask) { + if (bodyFileURL) { + newSessionTask = [_session uploadTaskWithRequest:fetchRequest + fromFile:bodyFileURL]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, + @"Failed uploadTaskWithRequest for %@, %@, file %@", + _session, fetchRequest, bodyFileURL.path); + } else if (self.bodyStreamProvider) { + newSessionTask = [_session uploadTaskWithStreamedRequest:fetchRequest]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, + @"Failed uploadTaskWithStreamedRequest for %@, %@", + _session, fetchRequest); + } else { + GTMSESSION_ASSERT_DEBUG_OR_LOG(_bodyData != nil, + @"Upload task needs body data, %@", fetchRequest); + newSessionTask = [_session uploadTaskWithRequest:fetchRequest + fromData:(NSData * GTM_NONNULL_TYPE)_bodyData]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, + @"Failed uploadTaskWithRequest for %@, %@, body data %lu bytes", + _session, fetchRequest, (unsigned long)_bodyData.length); + } + needsDataAccumulator = YES; + } else { + newSessionTask = [_session dataTaskWithRequest:fetchRequest]; + needsDataAccumulator = YES; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, @"Failed dataTaskWithRequest for %@, %@", + _session, fetchRequest); + } + self.sessionTask = newSessionTask; + + if (!newSessionTask) { + // We shouldn't get here; if we're here, an earlier assertion should have fired to explain + // which session task creation failed. + [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorTaskCreationFailed)]; + return; + } + + if (needsDataAccumulator && _accumulateDataBlock == nil) { + self.downloadedData = [NSMutableData data]; + } + if (_taskDescription) { + newSessionTask.taskDescription = _taskDescription; + } + if (_taskPriority >= 0) { + if (@available(iOS 8.0, macOS 10.10, *)) { + newSessionTask.priority = _taskPriority; + } + } + +#if GTM_DISABLE_FETCHER_TEST_BLOCK + GTMSESSION_ASSERT_DEBUG(_testBlock == nil && gGlobalTestBlock == nil, @"test blocks disabled"); + _testBlock = nil; +#else + if (!_testBlock) { + if (gGlobalTestBlock) { + // Note that the test block may pass nil for all of its response parameters, + // indicating that the fetch should actually proceed. This is useful when the + // global test block has been set, and the app is only testing a specific + // fetcher. The block simulation code will then resume the task. + _testBlock = gGlobalTestBlock; + } + } + _isUsingTestBlock = (_testBlock != nil); +#endif // GTM_DISABLE_FETCHER_TEST_BLOCK + +#if GTM_BACKGROUND_TASK_FETCHING + id app = [[self class] fetcherUIApplication]; + // Background tasks seem to interfere with out-of-process uploads and downloads. + if (app && !self.skipBackgroundTask && !self.usingBackgroundSession) { + // Tell UIApplication that we want to continue even when the app is in the + // background. +#if DEBUG + NSString *bgTaskName = [NSString stringWithFormat:@"%@-%@", + [self class], fetchRequest.URL.host]; +#else + NSString *bgTaskName = @"GTMSessionFetcher"; +#endif + __block UIBackgroundTaskIdentifier bgTaskID = [app beginBackgroundTaskWithName:bgTaskName + expirationHandler:^{ + // Background task expiration callback - this block is always invoked by + // UIApplication on the main thread. + if (bgTaskID != UIBackgroundTaskInvalid) { + @synchronized(self) { + if (bgTaskID == self.backgroundTaskIdentifier) { + self.backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + } + [app endBackgroundTask:bgTaskID]; + } + }]; + @synchronized(self) { + self.backgroundTaskIdentifier = bgTaskID; + } + } +#endif + + if (!_initialRequestDate) { + _initialRequestDate = [[NSDate alloc] init]; + } + + // We don't expect to reach here even on retry or auth until a stop notification has been sent + // for the previous task, but we should ensure that we don't unbalance that. + GTMSESSION_ASSERT_DEBUG(!_isStopNotificationNeeded, @"Start notification without a prior stop"); + [self sendStopNotificationIfNeeded]; + + [self addPersistedBackgroundSessionToDefaults]; + + [self setStopNotificationNeeded:YES]; + + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherStartedNotification + userInfo:nil + requireAsync:NO]; + + // The service needs to know our task if it is serving as NSURLSession delegate. + [_service fetcherDidBeginFetching:self]; + + if (_testBlock) { +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + [self simulateFetchForTestBlock]; +#endif + } else { + // We resume the session task after posting the notification since the + // delegate callbacks may happen immediately if the fetch is started off + // the main thread or the session delegate queue is on a background thread, + // and we don't want to post a start notification after a premature finish + // of the session task. + [newSessionTask resume]; + } +} + +NSData * GTM_NULLABLE_TYPE GTMDataFromInputStream(NSInputStream *inputStream, NSError **outError) { + NSMutableData *data = [NSMutableData data]; + + [inputStream open]; + NSInteger numberOfBytesRead = 0; + while ([inputStream hasBytesAvailable]) { + uint8_t buffer[512]; + numberOfBytesRead = [inputStream read:buffer maxLength:sizeof(buffer)]; + if (numberOfBytesRead > 0) { + [data appendBytes:buffer length:(NSUInteger)numberOfBytesRead]; + } else { + break; + } + } + [inputStream close]; + NSError *streamError = inputStream.streamError; + + if (streamError) { + data = nil; + } + if (outError) { + *outError = streamError; + } + return data; +} + +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + +- (void)simulateFetchForTestBlock { + // This is invoked on the same thread as the beginFetch method was. + // + // Callbacks will all occur on the callback queue. + _testBlock(self, ^(NSURLResponse *response, NSData *responseData, NSError *error) { + // Callback from test block. + if (response == nil && responseData == nil && error == nil) { + // Assume the fetcher should execute rather than be tested. + self->_testBlock = nil; + self->_isUsingTestBlock = NO; + [self->_sessionTask resume]; + return; + } + + GTMSessionFetcherBodyStreamProvider bodyStreamProvider = self.bodyStreamProvider; + if (bodyStreamProvider) { + bodyStreamProvider(^(NSInputStream *bodyStream){ + // Read from the input stream into an NSData buffer. We'll drain the stream + // explicitly on a background queue. + [self invokeOnCallbackQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) + afterUserStopped:NO + block:^{ + NSError *streamError; + NSData *streamedData = GTMDataFromInputStream(bodyStream, &streamError); + + dispatch_async(dispatch_get_main_queue(), ^{ + // Continue callbacks on the main thread, since serial behavior + // is more reliable for tests. + [self simulateDataCallbacksForTestBlockWithBodyData:streamedData + response:response + responseData:responseData + error:(error ?: streamError)]; + }); + }]; + }); + } else { + // No input stream; use the supplied data or file URL. + NSURL *bodyFileURL = self.bodyFileURL; + if (bodyFileURL) { + NSError *readError; + self->_bodyData = [NSData dataWithContentsOfURL:bodyFileURL + options:NSDataReadingMappedIfSafe + error:&readError]; + error = readError; + } + + // No stream provider. + + // In real fetches, nothing happens until the run loop spins, so apps have leeway to + // set callbacks after they call beginFetch. We'll mirror that fetcher behavior by + // delaying callbacks here at least to the next spin of the run loop. That keeps + // immediate, synchronous setting of callback blocks after beginFetch working in tests. + dispatch_async(dispatch_get_main_queue(), ^{ + [self simulateDataCallbacksForTestBlockWithBodyData:self->_bodyData + response:response + responseData:responseData + error:error]; + }); + } + }); +} + +- (void)simulateByteTransferReportWithDataLength:(int64_t)totalDataLength + block:(GTMSessionFetcherSendProgressBlock)block { + // This utility method simulates transfer progress with up to three callbacks. + // It is used to call back to any of the progress blocks. + int64_t sendReportSize = totalDataLength / 3 + 1; + int64_t totalSent = 0; + while (totalSent < totalDataLength) { + int64_t bytesRemaining = totalDataLength - totalSent; + sendReportSize = MIN(sendReportSize, bytesRemaining); + totalSent += sendReportSize; + [self invokeOnCallbackQueueUnlessStopped:^{ + block(sendReportSize, totalSent, totalDataLength); + }]; + } +} + +- (void)simulateDataCallbacksForTestBlockWithBodyData:(NSData * GTM_NULLABLE_TYPE)bodyData + response:(NSURLResponse *)response + responseData:(NSData *)suppliedData + error:(NSError *)suppliedError { + __block NSData *responseData = suppliedData; + __block NSError *responseError = suppliedError; + + // This method does the test simulation of callbacks once the upload + // and download data are known. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Get copies of ivars we'll access in async invocations. This simulation assumes + // they won't change during fetcher execution. + NSURL *destinationFileURL = _destinationFileURL; + GTMSessionFetcherWillRedirectBlock willRedirectBlock = _willRedirectBlock; + GTMSessionFetcherDidReceiveResponseBlock didReceiveResponseBlock = _didReceiveResponseBlock; + GTMSessionFetcherSendProgressBlock sendProgressBlock = _sendProgressBlock; + GTMSessionFetcherDownloadProgressBlock downloadProgressBlock = _downloadProgressBlock; + GTMSessionFetcherAccumulateDataBlock accumulateDataBlock = _accumulateDataBlock; + GTMSessionFetcherReceivedProgressBlock receivedProgressBlock = _receivedProgressBlock; + GTMSessionFetcherWillCacheURLResponseBlock willCacheURLResponseBlock = + _willCacheURLResponseBlock; + GTMSessionFetcherChallengeBlock challengeBlock = _challengeBlock; + + // Simulate receipt of redirection. + if (willRedirectBlock) { + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES + block:^{ + willRedirectBlock((NSHTTPURLResponse *)response, self->_request, + ^(NSURLRequest *redirectRequest) { + // For simulation, we'll assume the app will just continue. + }); + }]; + } + + // If the fetcher has a challenge block, simulate a challenge. + // + // It might be nice to eventually let the user determine which testBlock + // fetches get challenged rather than always executing the supplied + // challenge block. + if (challengeBlock) { + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES + block:^{ + NSURL *requestURL = self->_request.URL; + NSString *host = requestURL.host; + NSURLProtectionSpace *pspace = + [[NSURLProtectionSpace alloc] initWithHost:host + port:requestURL.port.integerValue + protocol:requestURL.scheme + realm:nil + authenticationMethod:NSURLAuthenticationMethodHTTPBasic]; + id unusedSender = + (id)[NSNull null]; + NSURLAuthenticationChallenge *challenge = + [[NSURLAuthenticationChallenge alloc] initWithProtectionSpace:pspace + proposedCredential:nil + previousFailureCount:0 + failureResponse:nil + error:nil + sender:unusedSender]; + challengeBlock(self, challenge, ^(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential * GTM_NULLABLE_TYPE credential){ + // We could change the responseData and responseError based on the disposition, + // but it's easier for apps to just supply the expected data and error + // directly to the test block. So this simulation ignores the disposition. + }); + }]; + } + + // Simulate receipt of an initial response. + if (response && didReceiveResponseBlock) { + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES + block:^{ + didReceiveResponseBlock(response, ^(NSURLSessionResponseDisposition desiredDisposition) { + // For simulation, we'll assume the disposition is to continue. + }); + }]; + } + + // Simulate reporting send progress. + if (sendProgressBlock) { + [self simulateByteTransferReportWithDataLength:(int64_t)bodyData.length + block:^(int64_t bytesSent, + int64_t totalBytesSent, + int64_t totalBytesExpectedToSend) { + // This is invoked on the callback queue unless stopped. + sendProgressBlock(bytesSent, totalBytesSent, totalBytesExpectedToSend); + }]; + } + + if (destinationFileURL) { + // Simulate download to file progress. + if (downloadProgressBlock) { + [self simulateByteTransferReportWithDataLength:(int64_t)responseData.length + block:^(int64_t bytesDownloaded, + int64_t totalBytesDownloaded, + int64_t totalBytesExpectedToDownload) { + // This is invoked on the callback queue unless stopped. + downloadProgressBlock(bytesDownloaded, totalBytesDownloaded, + totalBytesExpectedToDownload); + }]; + } + + NSError *writeError; + [responseData writeToURL:destinationFileURL + options:NSDataWritingAtomic + error:&writeError]; + if (writeError) { + // Tell the test code that writing failed. + responseError = writeError; + } + } else { + // Simulate download to NSData progress. + if ((accumulateDataBlock || receivedProgressBlock) && responseData) { + [self simulateByteTransferWithData:responseData + block:^(NSData *data, + int64_t bytesReceived, + int64_t totalBytesReceived, + int64_t totalBytesExpectedToReceive) { + // This is invoked on the callback queue unless stopped. + if (accumulateDataBlock) { + accumulateDataBlock(data); + } + + if (receivedProgressBlock) { + receivedProgressBlock(bytesReceived, totalBytesReceived); + } + }]; + } + + if (!accumulateDataBlock) { + _downloadedData = [responseData mutableCopy]; + } + + if (willCacheURLResponseBlock) { + // Simulate letting the client inspect and alter the cached response. + NSData *cachedData = responseData ?: [[NSData alloc] init]; // Always have non-nil data. + NSCachedURLResponse *cachedResponse = + [[NSCachedURLResponse alloc] initWithResponse:response + data:cachedData]; + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES + block:^{ + willCacheURLResponseBlock(cachedResponse, ^(NSCachedURLResponse *responseToCache){ + // The app may provide an alternative response, or nil to defeat caching. + }); + }]; + } + } + _response = response; + } // @synchronized(self) + + NSOperationQueue *queue = self.sessionDelegateQueue; + [queue addOperationWithBlock:^{ + // Rather than invoke failToBeginFetchWithError: we want to simulate completion of + // a connection that started and ended, so we'll call down to finishWithError: + NSInteger status = responseError ? responseError.code : 200; + if (status >= 200 && status <= 399) { + [self finishWithError:nil shouldRetry:NO]; + } else { + [self shouldRetryNowForStatus:status + error:responseError + forceAssumeRetry:NO + response:^(BOOL shouldRetry) { + [self finishWithError:responseError shouldRetry:shouldRetry]; + }]; + } + }]; +} + +- (void)simulateByteTransferWithData:(NSData *)responseData + block:(GTMSessionFetcherSimulateByteTransferBlock)transferBlock { + // This utility method simulates transfering data to the client. It divides the data into at most + // "chunkCount" chunks and then passes each chunk along with a progress update to transferBlock. + // This function can be used with accumulateDataBlock or receivedProgressBlock. + + NSUInteger chunkCount = MAX(self.testBlockAccumulateDataChunkCount, (NSUInteger) 1); + NSUInteger totalDataLength = responseData.length; + NSUInteger sendDataSize = totalDataLength / chunkCount + 1; + NSUInteger totalSent = 0; + while (totalSent < totalDataLength) { + NSUInteger bytesRemaining = totalDataLength - totalSent; + sendDataSize = MIN(sendDataSize, bytesRemaining); + NSData *chunkData = [responseData subdataWithRange:NSMakeRange(totalSent, sendDataSize)]; + totalSent += sendDataSize; + [self invokeOnCallbackQueueUnlessStopped:^{ + transferBlock(chunkData, + (int64_t)sendDataSize, + (int64_t)totalSent, + (int64_t)totalDataLength); + }]; + } +} + +#endif // !GTM_DISABLE_FETCHER_TEST_BLOCK + +- (void)setSessionTask:(NSURLSessionTask *)sessionTask { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_sessionTask != sessionTask) { + _sessionTask = sessionTask; + if (_sessionTask) { + // Request could be nil on restoring this fetcher from a background session. + if (!_request) { + _request = [_sessionTask.originalRequest mutableCopy]; + } + } + } + } // @synchronized(self) +} + +- (NSURLSessionTask * GTM_NULLABLE_TYPE)sessionTask { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _sessionTask; + } // @synchronized(self) +} + ++ (NSUserDefaults *)fetcherUserDefaults { + static NSUserDefaults *gFetcherUserDefaults = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + Class fetcherUserDefaultsClass = NSClassFromString(@"GTMSessionFetcherUserDefaultsFactory"); + if (fetcherUserDefaultsClass) { + gFetcherUserDefaults = [fetcherUserDefaultsClass fetcherUserDefaults]; + } else { + gFetcherUserDefaults = [NSUserDefaults standardUserDefaults]; + } + }); + return gFetcherUserDefaults; +} + +- (void)addPersistedBackgroundSessionToDefaults { + NSString *sessionIdentifier = self.sessionIdentifier; + if (!sessionIdentifier) { + return; + } + NSArray *oldBackgroundSessions = [[self class] activePersistedBackgroundSessions]; + if ([oldBackgroundSessions containsObject:_sessionIdentifier]) { + return; + } + NSMutableArray *newBackgroundSessions = + [NSMutableArray arrayWithArray:oldBackgroundSessions]; + [newBackgroundSessions addObject:sessionIdentifier]; + GTM_LOG_BACKGROUND_SESSION(@"Add to background sessions: %@", newBackgroundSessions); + + NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; + [userDefaults setObject:newBackgroundSessions + forKey:kGTMSessionFetcherPersistedDestinationKey]; + [userDefaults synchronize]; +} + +- (void)removePersistedBackgroundSessionFromDefaults { + NSString *sessionIdentifier = self.sessionIdentifier; + if (!sessionIdentifier) return; + + NSArray *oldBackgroundSessions = [[self class] activePersistedBackgroundSessions]; + if (!oldBackgroundSessions) { + return; + } + NSMutableArray *newBackgroundSessions = + [NSMutableArray arrayWithArray:oldBackgroundSessions]; + NSUInteger sessionIndex = [newBackgroundSessions indexOfObject:sessionIdentifier]; + if (sessionIndex == NSNotFound) { + return; + } + [newBackgroundSessions removeObjectAtIndex:sessionIndex]; + GTM_LOG_BACKGROUND_SESSION(@"Remove from background sessions: %@", newBackgroundSessions); + + NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; + if (newBackgroundSessions.count == 0) { + [userDefaults removeObjectForKey:kGTMSessionFetcherPersistedDestinationKey]; + } else { + [userDefaults setObject:newBackgroundSessions + forKey:kGTMSessionFetcherPersistedDestinationKey]; + } + [userDefaults synchronize]; +} + ++ (GTM_NULLABLE NSArray *)activePersistedBackgroundSessions { + NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; + NSArray *oldBackgroundSessions = + [userDefaults arrayForKey:kGTMSessionFetcherPersistedDestinationKey]; + if (oldBackgroundSessions.count == 0) { + return nil; + } + NSMutableArray *activeBackgroundSessions = nil; + NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; + for (NSString *sessionIdentifier in oldBackgroundSessions) { + GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; + if (fetcher) { + if (!activeBackgroundSessions) { + activeBackgroundSessions = [[NSMutableArray alloc] init]; + } + [activeBackgroundSessions addObject:sessionIdentifier]; + } + } + return activeBackgroundSessions; +} + ++ (NSArray *)fetchersForBackgroundSessions { + NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; + NSArray *backgroundSessions = + [userDefaults arrayForKey:kGTMSessionFetcherPersistedDestinationKey]; + NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; + NSMutableArray *fetchers = [NSMutableArray array]; + for (NSString *sessionIdentifier in backgroundSessions) { + GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; + if (!fetcher) { + fetcher = [self fetcherWithSessionIdentifier:sessionIdentifier]; + GTMSESSION_ASSERT_DEBUG(fetcher != nil, + @"Unexpected invalid session identifier: %@", sessionIdentifier); + [fetcher beginFetchWithCompletionHandler:nil]; + } + GTM_LOG_BACKGROUND_SESSION(@"%@ restoring session %@ by creating fetcher %@ %p", + [self class], sessionIdentifier, fetcher, fetcher); + if (fetcher != nil) { + [fetchers addObject:fetcher]; + } + } + return fetchers; +} + +#if TARGET_OS_IPHONE && !TARGET_OS_WATCH ++ (void)application:(UIApplication *)application + handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(GTMSessionFetcherSystemCompletionHandler)completionHandler { + GTMSessionFetcher *fetcher = [self fetcherWithSessionIdentifier:identifier]; + if (fetcher != nil) { + fetcher.systemCompletionHandler = completionHandler; + } else { + GTM_LOG_BACKGROUND_SESSION(@"%@ did not create background session identifier: %@", + [self class], identifier); + } +} +#endif + +- (NSString * GTM_NULLABLE_TYPE)sessionIdentifier { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _sessionIdentifier; + } // @synchronized(self) +} + +- (void)setSessionIdentifier:(NSString *)sessionIdentifier { + GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_ASSERT_DEBUG(!_session, @"Unable to set session identifier after session created"); + _sessionIdentifier = [sessionIdentifier copy]; + _usingBackgroundSession = YES; + _canShareSession = NO; + [self restoreDefaultStateForSessionIdentifierMetadata]; + } // @synchronized(self) +} + +- (void)setSessionIdentifierInternal:(GTM_NULLABLE NSString *)sessionIdentifier { + // This internal method only does a synchronized set of the session identifier. + // It does not have side effects on the background session, shared session, or + // session identifier metadata. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _sessionIdentifier = [sessionIdentifier copy]; + } // @synchronized(self) +} + +- (NSDictionary * GTM_NULLABLE_TYPE)sessionUserInfo { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_sessionUserInfo == nil) { + // We'll return the metadata dictionary with internal keys removed. This avoids the user + // re-using the userInfo dictionary later and accidentally including the internal keys. + NSMutableDictionary *metadata = [[self sessionIdentifierMetadataUnsynchronized] mutableCopy]; + NSSet *keysToRemove = [metadata keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) { + return [key hasPrefix:@"_"]; + }]; + [metadata removeObjectsForKeys:[keysToRemove allObjects]]; + if (metadata.count > 0) { + _sessionUserInfo = metadata; + } + } + return _sessionUserInfo; + } // @synchronized(self) +} + +- (void)setSessionUserInfo:(NSDictionary * GTM_NULLABLE_TYPE)dictionary { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_ASSERT_DEBUG(_sessionIdentifier == nil, @"Too late to assign userInfo"); + _sessionUserInfo = dictionary; + } // @synchronized(self) +} + +- (GTM_NULLABLE NSDictionary *)sessionIdentifierDefaultMetadata { + GTMSessionCheckSynchronized(self); + + NSMutableDictionary *defaultUserInfo = [[NSMutableDictionary alloc] init]; + if (_destinationFileURL) { + defaultUserInfo[kGTMSessionIdentifierDestinationFileURLMetadataKey] = + [_destinationFileURL absoluteString]; + } + if (_bodyFileURL) { + defaultUserInfo[kGTMSessionIdentifierBodyFileURLMetadataKey] = [_bodyFileURL absoluteString]; + } + return (defaultUserInfo.count > 0) ? defaultUserInfo : nil; +} + +- (void)restoreDefaultStateForSessionIdentifierMetadata { + GTMSessionCheckSynchronized(self); + + NSDictionary *metadata = [self sessionIdentifierMetadataUnsynchronized]; + NSString *destinationFileURLString = metadata[kGTMSessionIdentifierDestinationFileURLMetadataKey]; + if (destinationFileURLString) { + _destinationFileURL = [NSURL URLWithString:destinationFileURLString]; + GTM_LOG_BACKGROUND_SESSION(@"Restoring destination file URL: %@", _destinationFileURL); + } + NSString *bodyFileURLString = metadata[kGTMSessionIdentifierBodyFileURLMetadataKey]; + if (bodyFileURLString) { + _bodyFileURL = [NSURL URLWithString:bodyFileURLString]; + GTM_LOG_BACKGROUND_SESSION(@"Restoring body file URL: %@", _bodyFileURL); + } +} + +- (NSDictionary * GTM_NULLABLE_TYPE)sessionIdentifierMetadata { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [self sessionIdentifierMetadataUnsynchronized]; + } +} + +- (NSDictionary * GTM_NULLABLE_TYPE)sessionIdentifierMetadataUnsynchronized { + GTMSessionCheckSynchronized(self); + + // Session Identifier format: "com.google.__ + if (!_sessionIdentifier) { + return nil; + } + NSScanner *metadataScanner = [NSScanner scannerWithString:_sessionIdentifier]; + [metadataScanner setCharactersToBeSkipped:nil]; + NSString *metadataString; + NSString *uuid; + if ([metadataScanner scanUpToString:@"_" intoString:NULL] && + [metadataScanner scanString:@"_" intoString:NULL] && + [metadataScanner scanUpToString:@"_" intoString:&uuid] && + [metadataScanner scanString:@"_" intoString:NULL] && + [metadataScanner scanUpToString:@"\n" intoString:&metadataString]) { + _sessionIdentifierUUID = uuid; + NSData *metadataData = [metadataString dataUsingEncoding:NSUTF8StringEncoding]; + NSError *error; + NSDictionary *metadataDict = + [NSJSONSerialization JSONObjectWithData:metadataData + options:0 + error:&error]; + GTM_LOG_BACKGROUND_SESSION(@"User Info from session identifier: %@ %@", + metadataDict, error ? error : @""); + return metadataDict; + } + return nil; +} + +- (NSString *)createSessionIdentifierWithMetadata:(NSDictionary * GTM_NULLABLE_TYPE)metadataToInclude { + NSString *result; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Session Identifier format: "com.google.__ + GTMSESSION_ASSERT_DEBUG(!_sessionIdentifier, @"Session identifier already created"); + _sessionIdentifierUUID = [[NSUUID UUID] UUIDString]; + _sessionIdentifier = + [NSString stringWithFormat:@"%@_%@", kGTMSessionIdentifierPrefix, _sessionIdentifierUUID]; + // Start with user-supplied keys so they cannot accidentally override the fetcher's keys. + NSMutableDictionary *metadataDict = + [NSMutableDictionary dictionaryWithDictionary:(NSDictionary * GTM_NONNULL_TYPE)_sessionUserInfo]; + + if (metadataToInclude) { + [metadataDict addEntriesFromDictionary:(NSDictionary *)metadataToInclude]; + } + NSDictionary *defaultMetadataDict = [self sessionIdentifierDefaultMetadata]; + if (defaultMetadataDict) { + [metadataDict addEntriesFromDictionary:defaultMetadataDict]; + } + if (metadataDict.count > 0) { + NSData *metadataData = [NSJSONSerialization dataWithJSONObject:metadataDict + options:0 + error:NULL]; + GTMSESSION_ASSERT_DEBUG(metadataData != nil, + @"Session identifier user info failed to convert to JSON"); + if (metadataData.length > 0) { + NSString *metadataString = [[NSString alloc] initWithData:metadataData + encoding:NSUTF8StringEncoding]; + _sessionIdentifier = + [_sessionIdentifier stringByAppendingFormat:@"_%@", metadataString]; + } + } + _didCreateSessionIdentifier = YES; + result = _sessionIdentifier; + } // @synchronized(self) + return result; +} + +- (void)failToBeginFetchWithError:(NSError *)error { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _hasStoppedFetching = YES; + } + + if (error == nil) { + error = [NSError errorWithDomain:kGTMSessionFetcherErrorDomain + code:GTMSessionFetcherErrorDownloadFailed + userInfo:nil]; + } + + [self invokeFetchCallbacksOnCallbackQueueWithData:nil + error:error]; + [self releaseCallbacks]; + + [_service fetcherDidStop:self]; + + self.authorizer = nil; +} + ++ (GTMSessionCookieStorage *)staticCookieStorage { + static GTMSessionCookieStorage *gCookieStorage = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gCookieStorage = [[GTMSessionCookieStorage alloc] init]; + }); + return gCookieStorage; +} + +#if GTM_BACKGROUND_TASK_FETCHING + +- (void)endBackgroundTask { + // Whenever the connection stops or background execution expires, + // we need to tell UIApplication we're done. + UIBackgroundTaskIdentifier bgTaskID; + @synchronized(self) { + bgTaskID = self.backgroundTaskIdentifier; + if (bgTaskID != UIBackgroundTaskInvalid) { + self.backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + } + + if (bgTaskID != UIBackgroundTaskInvalid) { + id app = [[self class] fetcherUIApplication]; + [app endBackgroundTask:bgTaskID]; + } +} + +#endif // GTM_BACKGROUND_TASK_FETCHING + +- (void)authorizeRequest { + GTMSessionCheckNotSynchronized(self); + + id authorizer = self.authorizer; + SEL asyncAuthSel = @selector(authorizeRequest:delegate:didFinishSelector:); + if ([authorizer respondsToSelector:asyncAuthSel]) { + SEL callbackSel = @selector(authorizer:request:finishedWithError:); + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + [authorizer authorizeRequest:mutableRequest + delegate:self + didFinishSelector:callbackSel]; + } else { + GTMSESSION_ASSERT_DEBUG(authorizer == nil, @"invalid authorizer for fetch"); + + // No authorizing possible, and authorizing happens only after any delay; + // just begin fetching + [self beginFetchMayDelay:NO + mayAuthorize:NO]; + } +} + +- (void)authorizer:(id)auth + request:(NSMutableURLRequest *)authorizedRequest + finishedWithError:(NSError *)error { + GTMSessionCheckNotSynchronized(self); + + if (error != nil) { + // We can't fetch without authorization + [self failToBeginFetchWithError:error]; + } else { + @synchronized(self) { + _request = authorizedRequest; + } + [self beginFetchMayDelay:NO + mayAuthorize:NO]; + } +} + + +- (BOOL)canFetchWithBackgroundSession { + // Subclasses may override. + return YES; +} + +// Returns YES if the fetcher has been started and has not yet stopped. +// +// Fetching includes waiting for authorization or for retry, waiting to be allowed by the +// service object to start the request, and actually fetching the request. +- (BOOL)isFetching { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [self isFetchingUnsynchronized]; + } +} + +- (BOOL)isFetchingUnsynchronized { + GTMSessionCheckSynchronized(self); + + BOOL hasBegun = (_initialBeginFetchDate != nil); + return hasBegun && !_hasStoppedFetching; +} + +- (NSURLResponse * GTM_NULLABLE_TYPE)response { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSURLResponse *response = [self responseUnsynchronized]; + return response; + } // @synchronized(self) +} + +- (NSURLResponse * GTM_NULLABLE_TYPE)responseUnsynchronized { + GTMSessionCheckSynchronized(self); + + NSURLResponse *response = _sessionTask.response; + if (!response) response = _response; + return response; +} + +- (NSInteger)statusCode { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSInteger statusCode = [self statusCodeUnsynchronized]; + return statusCode; + } // @synchronized(self) +} + +- (NSInteger)statusCodeUnsynchronized { + GTMSessionCheckSynchronized(self); + + NSURLResponse *response = [self responseUnsynchronized]; + NSInteger statusCode; + + if ([response respondsToSelector:@selector(statusCode)]) { + statusCode = [(NSHTTPURLResponse *)response statusCode]; + } else { + // Default to zero, in hopes of hinting "Unknown" (we can't be + // sure that things are OK enough to use 200). + statusCode = 0; + } + return statusCode; +} + +- (NSDictionary * GTM_NULLABLE_TYPE)responseHeaders { + GTMSessionCheckNotSynchronized(self); + + NSURLResponse *response = self.response; + if ([response respondsToSelector:@selector(allHeaderFields)]) { + NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; + return headers; + } + return nil; +} + +- (NSDictionary * GTM_NULLABLE_TYPE)responseHeadersUnsynchronized { + GTMSessionCheckSynchronized(self); + + NSURLResponse *response = [self responseUnsynchronized]; + if ([response respondsToSelector:@selector(allHeaderFields)]) { + NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; + return headers; + } + return nil; +} + +- (void)releaseCallbacks { + // Avoid releasing blocks in the sync section since objects dealloc'd by + // the blocks being released may call back into the fetcher or fetcher + // service. + dispatch_queue_t NS_VALID_UNTIL_END_OF_SCOPE holdCallbackQueue; + GTMSessionFetcherCompletionHandler NS_VALID_UNTIL_END_OF_SCOPE holdCompletionHandler; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + holdCallbackQueue = _callbackQueue; + holdCompletionHandler = _completionHandler; + + _callbackQueue = nil; + _completionHandler = nil; // Setter overridden in upload. Setter assumed to be used externally. + } + + // Set local callback pointers to nil here rather than let them release at the end of the scope + // to make any problems due to the blocks being released be a bit more obvious in a stack trace. + holdCallbackQueue = nil; + holdCompletionHandler = nil; + + self.configurationBlock = nil; + self.didReceiveResponseBlock = nil; + self.challengeBlock = nil; + self.willRedirectBlock = nil; + self.sendProgressBlock = nil; + self.receivedProgressBlock = nil; + self.downloadProgressBlock = nil; + self.accumulateDataBlock = nil; + self.willCacheURLResponseBlock = nil; + self.retryBlock = nil; + self.testBlock = nil; + self.resumeDataBlock = nil; + if (@available(iOS 10.0, macOS 10.12, tvOS 10.0, watchOS 3.0, *)) { + self.metricsCollectionBlock = nil; + } +} + +- (void)forgetSessionIdentifierForFetcher { + GTMSessionCheckSynchronized(self); + [self forgetSessionIdentifierForFetcherWithoutSyncCheck]; +} + +- (void)forgetSessionIdentifierForFetcherWithoutSyncCheck { + // This should be called inside a @synchronized block (except during dealloc.) + if (_sessionIdentifier) { + NSMapTable *sessionIdentifierToFetcherMap = [[self class] sessionIdentifierToFetcherMap]; + [sessionIdentifierToFetcherMap removeObjectForKey:_sessionIdentifier]; + _sessionIdentifier = nil; + _didCreateSessionIdentifier = NO; + } +} + +// External stop method +- (void)stopFetching { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Prevent enqueued callbacks from executing. + _userStoppedFetching = YES; + } // @synchronized(self) + [self stopFetchReleasingCallbacks:YES]; +} + +// Cancel the fetch of the URL that's currently in progress. +// +// If shouldReleaseCallbacks is NO then the fetch will be retried so the callbacks +// need to still be retained. +- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks { + [self removePersistedBackgroundSessionFromDefaults]; + + id service; + NSMutableURLRequest *request; + + // If the task or the retry timer is all that's retaining the fetcher, + // we want to be sure this instance survives stopping at least long enough for + // the stack to unwind. + __autoreleasing GTMSessionFetcher *holdSelf = self; + + BOOL hasCanceledTask = NO; + + [holdSelf destroyRetryTimer]; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _hasStoppedFetching = YES; + + service = _service; + request = _request; + + if (_sessionTask) { + // In case cancelling the task or session calls this recursively, we want + // to ensure that we'll only release the task and delegate once, + // so first set _sessionTask to nil + // + // This may be called in a callback from the task, so use autorelease to avoid + // releasing the task in its own callback. + __autoreleasing NSURLSessionTask *oldTask = _sessionTask; + if (!_isUsingTestBlock) { + _response = _sessionTask.response; + } + _sessionTask = nil; + + if ([oldTask state] != NSURLSessionTaskStateCompleted) { + // For download tasks, when the fetch is stopped, we may provide resume data that can + // be used to create a new session. + BOOL mayResume = (_resumeDataBlock + && [oldTask respondsToSelector:@selector(cancelByProducingResumeData:)]); + if (!mayResume) { + [oldTask cancel]; + // A side effect of stopping the task is that URLSession:task:didCompleteWithError: + // will be invoked asynchronously on the delegate queue. + } else { + void (^resumeBlock)(NSData *) = _resumeDataBlock; + _resumeDataBlock = nil; + + // Save callbackQueue since releaseCallbacks clears it. + dispatch_queue_t callbackQueue = _callbackQueue; + dispatch_group_enter(_callbackGroup); + [(NSURLSessionDownloadTask *)oldTask cancelByProducingResumeData:^(NSData *resumeData) { + [self invokeOnCallbackQueue:callbackQueue + afterUserStopped:YES + block:^{ + resumeBlock(resumeData); + dispatch_group_leave(self->_callbackGroup); + }]; + }]; + } + hasCanceledTask = YES; + } + } + + // If the task was canceled, wait until the URLSession:task:didCompleteWithError: to call + // finishTasksAndInvalidate, since calling it immediately tends to crash, see radar 18471901. + if (_session) { + BOOL shouldInvalidate = _shouldInvalidateSession; +#if TARGET_OS_IPHONE + // Don't invalidate if we've got a systemCompletionHandler, since + // URLSessionDidFinishEventsForBackgroundURLSession: won't be called if invalidated. + shouldInvalidate = shouldInvalidate && !self.systemCompletionHandler; +#endif + if (shouldInvalidate) { + __autoreleasing NSURLSession *oldSession = _session; + _session = nil; + + if (!hasCanceledTask) { + [oldSession finishTasksAndInvalidate]; + } else { + _sessionNeedingInvalidation = oldSession; + } + } + } + } // @synchronized(self) + + // send the stopped notification + [self sendStopNotificationIfNeeded]; + + [_authorizer stopAuthorizationForRequest:request]; + + if (shouldReleaseCallbacks) { + [self releaseCallbacks]; + + self.authorizer = nil; + } + + [service fetcherDidStop:self]; + +#if GTM_BACKGROUND_TASK_FETCHING + [self endBackgroundTask]; +#endif +} + +- (void)setStopNotificationNeeded:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _isStopNotificationNeeded = flag; + } // @synchronized(self) +} + +- (void)sendStopNotificationIfNeeded { + BOOL sendNow = NO; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_isStopNotificationNeeded) { + _isStopNotificationNeeded = NO; + sendNow = YES; + } + } // @synchronized(self) + + if (sendNow) { + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherStoppedNotification + userInfo:nil + requireAsync:NO]; + } +} + +- (void)retryFetch { + [self stopFetchReleasingCallbacks:NO]; + + // A retry will need a configuration with a fresh session identifier. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_sessionIdentifier && _didCreateSessionIdentifier) { + [self forgetSessionIdentifierForFetcher]; + _configuration = nil; + } + + if (_canShareSession) { + // Force a grab of the current session from the fetcher service in case + // the service's old one has become invalid. + _session = nil; + } + } // @synchronized(self) + + [self beginFetchForRetry]; +} + +- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds { + // Uncovered in upload fetcher testing, because the chunk fetcher is being waited on, and gets + // released by the upload code. The uploader just holds onto it with an ivar, and that gets + // nilled in the chunk fetcher callback. + // Used once in while loop just to avoid unused variable compiler warning. + __autoreleasing GTMSessionFetcher *holdSelf = self; + + NSDate *giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; + + BOOL shouldSpinRunLoop = ([NSThread isMainThread] && + (!self.callbackQueue + || self.callbackQueue == dispatch_get_main_queue())); + BOOL expired = NO; + + // Loop until the callbacks have been called and released, and until + // the connection is no longer pending, until there are no callback dispatches + // in flight, or until the timeout has expired. + int64_t delta = (int64_t)(100 * NSEC_PER_MSEC); // 100 ms + while (1) { + BOOL isTaskInProgress = (holdSelf->_sessionTask + && [_sessionTask state] != NSURLSessionTaskStateCompleted); + BOOL needsToCallCompletion = (_completionHandler != nil); + BOOL isCallbackInProgress = (_callbackGroup + && dispatch_group_wait(_callbackGroup, dispatch_time(DISPATCH_TIME_NOW, delta))); + + if (!isTaskInProgress && !needsToCallCompletion && !isCallbackInProgress) break; + + expired = ([giveUpDate timeIntervalSinceNow] < 0); + if (expired) { + GTMSESSION_LOG_DEBUG(@"GTMSessionFetcher waitForCompletionWithTimeout:%0.1f expired -- " + @"%@%@%@", timeoutInSeconds, + isTaskInProgress ? @"taskInProgress " : @"", + needsToCallCompletion ? @"needsToCallCompletion " : @"", + isCallbackInProgress ? @"isCallbackInProgress" : @""); + break; + } + + // Run the current run loop 1/1000 of a second to give the networking + // code a chance to work + const NSTimeInterval kSpinInterval = 0.001; + if (shouldSpinRunLoop) { + NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:kSpinInterval]; + [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; + } else { + [NSThread sleepForTimeInterval:kSpinInterval]; + } + } + return !expired; +} + ++ (void)setGlobalTestBlock:(GTMSessionFetcherTestBlock GTM_NULLABLE_TYPE)block { +#if GTM_DISABLE_FETCHER_TEST_BLOCK + GTMSESSION_ASSERT_DEBUG(block == nil, @"test blocks disabled"); +#endif + gGlobalTestBlock = [block copy]; +} + +#if GTM_BACKGROUND_TASK_FETCHING + +static GTM_NULLABLE_TYPE id gSubstituteUIApp; + ++ (void)setSubstituteUIApplication:(nullable id)app { + gSubstituteUIApp = app; +} + ++ (nullable id)substituteUIApplication { + return gSubstituteUIApp; +} + ++ (nullable id)fetcherUIApplication { + id app = gSubstituteUIApp; + if (app) return app; + + // iOS App extensions should not call [UIApplication sharedApplication], even + // if UIApplication responds to it. + + static Class applicationClass = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + BOOL isAppExtension = [[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]; + if (!isAppExtension) { + Class cls = NSClassFromString(@"UIApplication"); + if (cls && [cls respondsToSelector:NSSelectorFromString(@"sharedApplication")]) { + applicationClass = cls; + } + } + }); + + if (applicationClass) { + app = (id)[applicationClass sharedApplication]; + } + return app; +} +#endif // GTM_BACKGROUND_TASK_FETCHING + +#pragma mark NSURLSession Delegate Methods + +// NSURLSession documentation indicates that redirectRequest can be passed to the handler +// but empirically redirectRequest lacks the HTTP body, so passing it will break POSTs. +// Instead, we construct a new request, a copy of the original, with overrides from the +// redirect. + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +willPerformHTTPRedirection:(NSHTTPURLResponse *)redirectResponse + newRequest:(NSURLRequest *)redirectRequest + completionHandler:(void (^)(NSURLRequest * GTM_NULLABLE_TYPE))handler { + [self setSessionTask:task]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ willPerformHTTPRedirection:%@ newRequest:%@", + [self class], self, session, task, redirectResponse, redirectRequest); + + if ([self userStoppedFetching]) { + handler(nil); + return; + } + if (redirectRequest && redirectResponse) { + // Copy the original request, including the body. + NSURLRequest *originalRequest = self.request; + NSMutableURLRequest *newRequest = [originalRequest mutableCopy]; + + // The new requests's URL overrides the original's URL. + [newRequest setURL:[GTMSessionFetcher redirectURLWithOriginalRequestURL:originalRequest.URL + redirectRequestURL:redirectRequest.URL]]; + + // Any headers in the redirect override headers in the original. + NSDictionary *redirectHeaders = redirectRequest.allHTTPHeaderFields; + for (NSString *key in redirectHeaders) { + NSString *value = [redirectHeaders objectForKey:key]; + [newRequest setValue:value forHTTPHeaderField:key]; + } + + redirectRequest = newRequest; + + // Log the response we just received + [self setResponse:redirectResponse]; + [self logNowWithError:nil]; + + GTMSessionFetcherWillRedirectBlock willRedirectBlock = self.willRedirectBlock; + if (willRedirectBlock) { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + [self invokeOnCallbackQueueAfterUserStopped:YES + block:^{ + willRedirectBlock(redirectResponse, redirectRequest, ^(NSURLRequest *clientRequest) { + + // Update the request for future logging. + [self updateMutableRequest:[clientRequest mutableCopy]]; + + handler(clientRequest); + }); + }]; + } // @synchronized(self) + return; + } + // Continues here if the client did not provide a redirect block. + + // Update the request for future logging. + [self updateMutableRequest:[redirectRequest mutableCopy]]; + } + handler(redirectRequest); +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))handler { + [self setSessionTask:dataTask]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didReceiveResponse:%@", + [self class], self, session, dataTask, response); + void (^accumulateAndFinish)(NSURLSessionResponseDisposition) = + ^(NSURLSessionResponseDisposition dispositionValue) { + // This method is called when the server has determined that it + // has enough information to create the NSURLResponse + // it can be called multiple times, for example in the case of a + // redirect, so each time we reset the data. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + BOOL hadPreviousData = self->_downloadedLength > 0; + + [self->_downloadedData setLength:0]; + self->_downloadedLength = 0; + + if (hadPreviousData && (dispositionValue != NSURLSessionResponseCancel)) { + // Tell the accumulate block to discard prior data. + GTMSessionFetcherAccumulateDataBlock accumulateBlock = self->_accumulateDataBlock; + if (accumulateBlock) { + [self invokeOnCallbackQueueUnlessStopped:^{ + accumulateBlock(nil); + }]; + } + } + } // @synchronized(self) + handler(dispositionValue); + }; + + GTMSessionFetcherDidReceiveResponseBlock receivedResponseBlock; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + receivedResponseBlock = _didReceiveResponseBlock; + if (receivedResponseBlock) { + // We will ultimately need to call back to NSURLSession's handler with the disposition value + // for this delegate method even if the user has stopped the fetcher. + [self invokeOnCallbackQueueAfterUserStopped:YES + block:^{ + receivedResponseBlock(response, ^(NSURLSessionResponseDisposition desiredDisposition) { + accumulateAndFinish(desiredDisposition); + }); + }]; + } + } // @synchronized(self) + + if (receivedResponseBlock == nil) { + accumulateAndFinish(NSURLSessionResponseAllow); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didBecomeDownloadTask:%@", + [self class], self, session, dataTask, downloadTask); + [self setSessionTask:downloadTask]; +} + + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential * GTM_NULLABLE_TYPE credential))handler { + [self setSessionTask:task]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didReceiveChallenge:%@", + [self class], self, session, task, challenge); + + GTMSessionFetcherChallengeBlock challengeBlock = self.challengeBlock; + if (challengeBlock) { + // The fetcher user has provided custom challenge handling. + // + // We will ultimately need to call back to NSURLSession's handler with the disposition value + // for this delegate method even if the user has stopped the fetcher. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self invokeOnCallbackQueueAfterUserStopped:YES + block:^{ + challengeBlock(self, challenge, handler); + }]; + } + } else { + // No challenge block was provided by the client. + [self respondToChallenge:challenge + completionHandler:handler]; + } +} + +- (void)respondToChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential * GTM_NULLABLE_TYPE credential))handler { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSInteger previousFailureCount = [challenge previousFailureCount]; + if (previousFailureCount <= 2) { + NSURLProtectionSpace *protectionSpace = [challenge protectionSpace]; + NSString *authenticationMethod = [protectionSpace authenticationMethod]; + if ([authenticationMethod isEqual:NSURLAuthenticationMethodServerTrust]) { + // SSL. + // + // Background sessions seem to require an explicit check of the server trust object + // rather than default handling. + SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; + if (serverTrust == NULL) { + // No server trust information is available. + handler(NSURLSessionAuthChallengePerformDefaultHandling, nil); + } else { + // Server trust information is available. + void (^callback)(SecTrustRef, BOOL) = ^(SecTrustRef trustRef, BOOL allow){ + if (allow) { + NSURLCredential *trustCredential = [NSURLCredential credentialForTrust:trustRef]; + handler(NSURLSessionAuthChallengeUseCredential, trustCredential); + } else { + GTMSESSION_LOG_DEBUG(@"Cancelling authentication challenge for %@", self->_request.URL); + handler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); + } + }; + if (_allowInvalidServerCertificates) { + callback(serverTrust, YES); + } else { + [[self class] evaluateServerTrust:serverTrust + forRequest:_request + completionHandler:callback]; + } + } + return; + } + + NSURLCredential *credential = _credential; + + if ([[challenge protectionSpace] isProxy] && _proxyCredential != nil) { + credential = _proxyCredential; + } + + if (credential) { + handler(NSURLSessionAuthChallengeUseCredential, credential); + } else { + // The credential is still nil; tell the OS to use the default handling. This is needed + // for things that can come out of the keychain (proxies, client certificates, etc.). + // + // Note: Looking up a credential with NSURLCredentialStorage's + // defaultCredentialForProtectionSpace: is *not* the same invoking the handler with + // NSURLSessionAuthChallengePerformDefaultHandling. In the case of + // NSURLAuthenticationMethodClientCertificate, you can get nil back from + // NSURLCredentialStorage, while using this code path instead works. + handler(NSURLSessionAuthChallengePerformDefaultHandling, nil); + } + + } else { + // We've failed auth 3 times. The completion handler will be called with code + // NSURLErrorCancelled. + handler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); + } + } // @synchronized(self) +} + +// Return redirect URL based on the original request URL and redirect request URL. +// +// Method disallows any scheme changes between the original request URL and redirect request URL +// aside from "http" to "https". If a change in scheme is detected the redirect URL inherits the +// scheme from the original request URL. ++ (GTM_NULLABLE NSURL *)redirectURLWithOriginalRequestURL:(GTM_NULLABLE NSURL *)originalRequestURL + redirectRequestURL:(GTM_NULLABLE NSURL *)redirectRequestURL { + // In the case of an NSURLSession redirect, neither URL should ever be nil; as a sanity check + // if either is nil return the other URL. + if (!redirectRequestURL) return originalRequestURL; + if (!originalRequestURL) return redirectRequestURL; + + NSString *originalScheme = originalRequestURL.scheme; + NSString *redirectScheme = redirectRequestURL.scheme; + BOOL insecureToSecureRedirect = + (originalScheme != nil && [originalScheme caseInsensitiveCompare:@"http"] == NSOrderedSame && + redirectScheme != nil && [redirectScheme caseInsensitiveCompare:@"https"] == NSOrderedSame); + + // This can't really be nil for the inputs, but to keep the analyzer happy + // for the -caseInsensitiveCompare: call below, give it a value if it were. + if (!originalScheme) originalScheme = @"https"; + + // Check for changes to the scheme and disallow any changes except for http to https. + if (!insecureToSecureRedirect && + (redirectScheme.length != originalScheme.length || + [redirectScheme caseInsensitiveCompare:originalScheme] != NSOrderedSame)) { + NSURLComponents *components = + [NSURLComponents componentsWithURL:(NSURL * _Nonnull)redirectRequestURL + resolvingAgainstBaseURL:NO]; + components.scheme = originalScheme; + return components.URL; + } + + return redirectRequestURL; +} + +// Validate the certificate chain. +// +// This may become a public method if it appears to be useful to users. ++ (void)evaluateServerTrust:(SecTrustRef)serverTrust + forRequest:(NSURLRequest *)request + completionHandler:(void (^)(SecTrustRef trustRef, BOOL allow))handler { + // Retain the trust object to avoid a SecTrustEvaluate() crash on iOS 7. + CFRetain(serverTrust); + + // Evaluate the certificate chain. + // + // The delegate queue may be the main thread. Trust evaluation could cause some + // blocking network activity, so we must evaluate async, as documented at + // https://developer.apple.com/library/ios/technotes/tn2232/ + // + // We must also avoid multiple uses of the trust object, per docs: + // "It is not safe to call this function concurrently with any other function that uses + // the same trust management object, or to re-enter this function for the same trust + // management object." + // + // SecTrustEvaluateAsync both does sync execution of Evaluate and calls back on the + // queue passed to it, according to at sources in + // http://www.opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55050.9/lib/SecTrust.cpp + // It would require a global serial queue to ensure the evaluate happens only on a + // single thread at a time, so we'll stick with using SecTrustEvaluate on a background + // thread. + dispatch_queue_t evaluateBackgroundQueue = + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_async(evaluateBackgroundQueue, ^{ + // It looks like the implementation of SecTrustEvaluate() on Mac grabs a global lock, + // so it may be redundant for us to also lock, but it's easy to synchronize here + // anyway. + BOOL shouldAllow; +#if GTM_SDK_REQUIRES_SECTRUSTEVALUATEWITHERROR + CFErrorRef errorRef = NULL; + @synchronized ([GTMSessionFetcher class]) { + GTMSessionMonitorSynchronized([GTMSessionFetcher class]); + + // SecTrustEvaluateWithError handles both the "proceed" and "unspecified" cases, + // so it is not necessary to check the trust result the evaluation returns true. + shouldAllow = SecTrustEvaluateWithError(serverTrust, &errorRef); + } + + if (errorRef) { + GTMSESSION_LOG_DEBUG(@"Error %d evaluating trust for %@", + (int)CFErrorGetCode(errorRef), request); + CFRelease(errorRef); + } +#else + SecTrustResultType trustEval = kSecTrustResultInvalid; + OSStatus trustError; + @synchronized([GTMSessionFetcher class]) { + GTMSessionMonitorSynchronized([GTMSessionFetcher class]); + + trustError = SecTrustEvaluate(serverTrust, &trustEval); + } + if (trustError != errSecSuccess) { + GTMSESSION_LOG_DEBUG(@"Error %d evaluating trust for %@", + (int)trustError, request); + shouldAllow = NO; + } else { + // Having a trust level "unspecified" by the user is the usual result, described at + // https://developer.apple.com/library/mac/qa/qa1360 + if (trustEval == kSecTrustResultUnspecified + || trustEval == kSecTrustResultProceed) { + shouldAllow = YES; + } else { + shouldAllow = NO; + GTMSESSION_LOG_DEBUG(@"Challenge SecTrustResultType %u for %@, properties: %@", + trustEval, request.URL.host, + CFBridgingRelease(SecTrustCopyProperties(serverTrust))); + } + } +#endif // GTM_SDK_REQUIRES_SECTRUSTEVALUATEWITHERROR + handler(serverTrust, shouldAllow); + + CFRelease(serverTrust); + }); +} + +- (void)invokeOnCallbackQueueUnlessStopped:(void (^)(void))block { + [self invokeOnCallbackQueueAfterUserStopped:NO + block:block]; +} + +- (void)invokeOnCallbackQueueAfterUserStopped:(BOOL)afterStopped + block:(void (^)(void))block { + GTMSessionCheckSynchronized(self); + + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:afterStopped + block:block]; +} + +- (void)invokeOnCallbackUnsynchronizedQueueAfterUserStopped:(BOOL)afterStopped + block:(void (^)(void))block { + // testBlock simulation code may not be synchronizing when this is invoked. + [self invokeOnCallbackQueue:_callbackQueue + afterUserStopped:afterStopped + block:block]; +} + +- (void)invokeOnCallbackQueue:(dispatch_queue_t)callbackQueue + afterUserStopped:(BOOL)afterStopped + block:(void (^)(void))block { + if (callbackQueue) { + dispatch_group_async(_callbackGroup, callbackQueue, ^{ + if (!afterStopped) { + NSDate *serviceStoppedAllDate = [self->_service stoppedAllFetchersDate]; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Avoid a race between stopFetching and the callback. + if (self->_userStoppedFetching) { + return; + } + + // Also avoid calling back if the service has stopped all fetchers + // since this one was created. The fetcher may have stopped before + // stopAllFetchers was invoked, so _userStoppedFetching wasn't set, + // but the app still won't expect the callback to fire after + // the service's stopAllFetchers was invoked. + if (serviceStoppedAllDate + && [self->_initialBeginFetchDate compare:serviceStoppedAllDate] != NSOrderedDescending) { + // stopAllFetchers was called after this fetcher began. + return; + } + } // @synchronized(self) + } + block(); + }); + } +} + +- (void)invokeFetchCallbacksOnCallbackQueueWithData:(GTM_NULLABLE NSData *)data + error:(GTM_NULLABLE NSError *)error { + // Callbacks will be released in the method stopFetchReleasingCallbacks: + GTMSessionFetcherCompletionHandler handler; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + handler = _completionHandler; + + if (handler) { + [self invokeOnCallbackQueueUnlessStopped:^{ + handler(data, error); + + // Post a notification, primarily to allow code to collect responses for + // testing. + // + // The observing code is not likely on the fetcher's callback + // queue, so this posts explicitly to the main queue. + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (data) { + userInfo[kGTMSessionFetcherCompletionDataKey] = data; + } + if (error) { + userInfo[kGTMSessionFetcherCompletionErrorKey] = error; + } + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherCompletionInvokedNotification + userInfo:userInfo + requireAsync:NO]; + }]; + } + } // @synchronized(self) +} + +- (void)postNotificationOnMainThreadWithName:(NSString *)noteName + userInfo:(GTM_NULLABLE NSDictionary *)userInfo + requireAsync:(BOOL)requireAsync { + dispatch_block_t postBlock = ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:noteName + object:self + userInfo:userInfo]; + }; + + if ([NSThread isMainThread] && !requireAsync) { + // Post synchronously for compatibility with older code using the fetcher. + + // Avoid calling out to other code from inside a sync block to avoid risk + // of a deadlock or of recursive sync. + GTMSessionCheckNotSynchronized(self); + + postBlock(); + } else { + dispatch_async(dispatch_get_main_queue(), postBlock); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)uploadTask + needNewBodyStream:(void (^)(NSInputStream * GTM_NULLABLE_TYPE bodyStream))completionHandler { + [self setSessionTask:uploadTask]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ needNewBodyStream:", + [self class], self, session, uploadTask); + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSessionFetcherBodyStreamProvider provider = _bodyStreamProvider; +#if !STRIP_GTM_FETCH_LOGGING + if ([self respondsToSelector:@selector(loggedStreamProviderForStreamProvider:)]) { + provider = [self performSelector:@selector(loggedStreamProviderForStreamProvider:) + withObject:provider]; + } +#endif + if (provider) { + [self invokeOnCallbackQueueUnlessStopped:^{ + provider(completionHandler); + }]; + } else { + GTMSESSION_ASSERT_DEBUG(NO, @"NSURLSession expects a stream provider"); + + completionHandler(nil); + } + } // @synchronized(self) +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { + [self setSessionTask:task]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didSendBodyData:%lld" + @" totalBytesSent:%lld totalBytesExpectedToSend:%lld", + [self class], self, session, task, bytesSent, totalBytesSent, + totalBytesExpectedToSend); + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (!_sendProgressBlock) { + return; + } + // We won't hold on to send progress block; it's ok to not send it if the upload finishes. + [self invokeOnCallbackQueueUnlessStopped:^{ + GTMSessionFetcherSendProgressBlock progressBlock; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + progressBlock = self->_sendProgressBlock; + } + if (progressBlock) { + progressBlock(bytesSent, totalBytesSent, totalBytesExpectedToSend); + } + }]; + } // @synchronized(self) +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data { + [self setSessionTask:dataTask]; + NSUInteger bufferLength = data.length; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didReceiveData:%p (%llu bytes)", + [self class], self, session, dataTask, data, + (unsigned long long)bufferLength); + if (bufferLength == 0) { + // Observed on completing an out-of-process upload. + return; + } + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSessionFetcherAccumulateDataBlock accumulateBlock = _accumulateDataBlock; + if (accumulateBlock) { + // Let the client accumulate the data. + _downloadedLength += bufferLength; + [self invokeOnCallbackQueueUnlessStopped:^{ + accumulateBlock(data); + }]; + } else if (!_userStoppedFetching) { + // Append to the mutable data buffer unless the fetch has been cancelled. + + // Resumed upload tasks may not yet have a data buffer. + if (_downloadedData == nil) { + // Using NSClassFromString for iOS 6 compatibility. + GTMSESSION_ASSERT_DEBUG( + ![dataTask isKindOfClass:NSClassFromString(@"NSURLSessionDownloadTask")], + @"Resumed download tasks should not receive data bytes"); + _downloadedData = [[NSMutableData alloc] init]; + } + + [_downloadedData appendData:data]; + _downloadedLength = (int64_t)_downloadedData.length; + + // We won't hold on to receivedProgressBlock here; it's ok to not send + // it if the transfer finishes. + if (_receivedProgressBlock) { + [self invokeOnCallbackQueueUnlessStopped:^{ + GTMSessionFetcherReceivedProgressBlock progressBlock; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + progressBlock = self->_receivedProgressBlock; + } + if (progressBlock) { + progressBlock((int64_t)bufferLength, self->_downloadedLength); + } + }]; + } + } + } // @synchronized(self) +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ willCacheResponse:%@ %@", + [self class], self, session, dataTask, + proposedResponse, proposedResponse.response); + GTMSessionFetcherWillCacheURLResponseBlock callback; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + callback = _willCacheURLResponseBlock; + + if (callback) { + [self invokeOnCallbackQueueAfterUserStopped:YES + block:^{ + callback(proposedResponse, completionHandler); + }]; + } + } // @synchronized(self) + if (!callback) { + completionHandler(proposedResponse); + } +} + + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didWriteData:%lld" + @" bytesWritten:%lld totalBytesExpectedToWrite:%lld", + [self class], self, session, downloadTask, bytesWritten, + totalBytesWritten, totalBytesExpectedToWrite); + [self setSessionTask:downloadTask]; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if ((totalBytesExpectedToWrite != NSURLSessionTransferSizeUnknown) && + (totalBytesExpectedToWrite < totalBytesWritten)) { + // Have observed cases were bytesWritten == totalBytesExpectedToWrite, + // but totalBytesWritten > totalBytesExpectedToWrite, so setting to unkown in these cases. + totalBytesExpectedToWrite = NSURLSessionTransferSizeUnknown; + } + + GTMSessionFetcherDownloadProgressBlock progressBlock; + progressBlock = self->_downloadProgressBlock; + if (progressBlock) { + [self invokeOnCallbackQueueUnlessStopped:^{ + progressBlock(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + }]; + } + } // @synchronized(self) +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didResumeAtOffset:%lld" + @" expectedTotalBytes:%lld", + [self class], self, session, downloadTask, fileOffset, + expectedTotalBytes); + [self setSessionTask:downloadTask]; +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)downloadLocationURL { + // Download may have relaunched app, so update _sessionTask. + [self setSessionTask:downloadTask]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didFinishDownloadingToURL:%@", + [self class], self, session, downloadTask, downloadLocationURL); + NSNumber *fileSizeNum; + [downloadLocationURL getResourceValue:&fileSizeNum + forKey:NSURLFileSizeKey + error:NULL]; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSURL *destinationURL = _destinationFileURL; + + _downloadedLength = fileSizeNum.longLongValue; + + // Overwrite any previous file at the destination URL. + NSFileManager *fileMgr = [NSFileManager defaultManager]; + NSError *removeError; + if (![fileMgr removeItemAtURL:destinationURL error:&removeError] + && removeError.code != NSFileNoSuchFileError) { + GTMSESSION_LOG_DEBUG(@"Could not remove previous file at %@ due to %@", + downloadLocationURL.path, removeError); + } + + NSInteger statusCode = [self statusCodeUnsynchronized]; + if (statusCode < 200 || statusCode > 399) { + // In OS X 10.11, the response body is written to a file even on a server + // status error. For convenience of the fetcher client, we'll skip saving the + // downloaded body to the destination URL so that clients do not need to know + // to delete the file following fetch errors. + GTMSESSION_LOG_DEBUG(@"Abandoning download due to status %ld, file %@", + (long)statusCode, downloadLocationURL.path); + + // On error code, add the contents of the temporary file to _downloadTaskErrorData + // This way fetcher clients have access to error details possibly passed by the server. + if (_downloadedLength > 0 && _downloadedLength <= kMaximumDownloadErrorDataLength) { + _downloadTaskErrorData = [NSData dataWithContentsOfURL:downloadLocationURL]; + } else if (_downloadedLength > kMaximumDownloadErrorDataLength) { + GTMSESSION_LOG_DEBUG(@"Download error data for file %@ not passed to userInfo due to size " + @"%lld", downloadLocationURL.path, _downloadedLength); + } + } else { + NSError *moveError; + NSURL *destinationFolderURL = [destinationURL URLByDeletingLastPathComponent]; + BOOL didMoveDownload = NO; + if ([fileMgr createDirectoryAtURL:destinationFolderURL + withIntermediateDirectories:YES + attributes:nil + error:&moveError]) { + didMoveDownload = [fileMgr moveItemAtURL:downloadLocationURL + toURL:destinationURL + error:&moveError]; + } + if (!didMoveDownload) { + _downloadFinishedError = moveError; + } + GTM_LOG_BACKGROUND_SESSION(@"%@ %p Moved download from \"%@\" to \"%@\" %@", + [self class], self, + downloadLocationURL.path, destinationURL.path, + error ? error : @""); + } + } // @synchronized(self) +} + +/* Sent as the last message related to a specific task. Error may be + * nil, which implies that no error occurred and this task is complete. + */ +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error { + [self setSessionTask:task]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didCompleteWithError:%@", + [self class], self, session, task, error); + + NSInteger status = self.statusCode; + BOOL forceAssumeRetry = NO; + BOOL succeeded = NO; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + // The task is never resumed when a testBlock is used. When the session is destroyed, + // we should ignore the callback, since the testBlock support code itself invokes + // shouldRetryNowForStatus: and finishWithError:shouldRetry: + if (_isUsingTestBlock) return; +#endif + + if (error == nil) { + error = _downloadFinishedError; + } + succeeded = (error == nil && status >= 0 && status < 300); + if (succeeded) { + // Succeeded. + _bodyLength = task.countOfBytesSent; + } + } // @synchronized(self) + + if (succeeded) { + [self finishWithError:nil shouldRetry:NO]; + return; + } + // For background redirects, no delegate method is called, so we cannot restore a stripped + // Authorization header, so if a 403 ("Forbidden") was generated due to a missing OAuth 2 header, + // set the current request's URL to the redirected URL, so we in effect restore the Authorization + // header. + if ((status == 403) && self.usingBackgroundSession) { + NSURL *redirectURL = self.response.URL; + NSURLRequest *request = self.request; + if (![request.URL isEqual:redirectURL]) { + NSString *authorizationHeader = [request.allHTTPHeaderFields objectForKey:@"Authorization"]; + if (authorizationHeader != nil) { + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + mutableRequest.URL = redirectURL; + [self updateMutableRequest:mutableRequest]; + // Avoid assuming the session is still valid. + self.session = nil; + forceAssumeRetry = YES; + } + } + } + + // If invalidating the session was deferred in stopFetchReleasingCallbacks: then do it now. + NSURLSession *oldSession = self.sessionNeedingInvalidation; + if (oldSession) { + [self setSessionNeedingInvalidation:NULL]; + [oldSession finishTasksAndInvalidate]; + } + + // Failed. + [self shouldRetryNowForStatus:status + error:error + forceAssumeRetry:forceAssumeRetry + response:^(BOOL shouldRetry) { + [self finishWithError:error shouldRetry:shouldRetry]; + }]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics + API_AVAILABLE(ios(10.0), macosx(10.12), tvos(10.0), watchos(3.0)) { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + GTMSessionFetcherMetricsCollectionBlock metricsCollectionBlock = _metricsCollectionBlock; + if (metricsCollectionBlock) { + [self invokeOnCallbackQueueUnlessStopped:^{ + metricsCollectionBlock(metrics); + }]; + } + } +} + +#if TARGET_OS_IPHONE +- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSessionDidFinishEventsForBackgroundURLSession:%@", + [self class], self, session); + [self removePersistedBackgroundSessionFromDefaults]; + + GTMSessionFetcherSystemCompletionHandler handler; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + handler = self.systemCompletionHandler; + self.systemCompletionHandler = nil; + } // @synchronized(self) + if (handler) { + GTM_LOG_BACKGROUND_SESSION(@"%@ %p Calling system completionHandler", [self class], self); + handler(); + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSURLSession *oldSession = _session; + _session = nil; + if (_shouldInvalidateSession) { + [oldSession finishTasksAndInvalidate]; + } + } // @synchronized(self) + } +} +#endif + +- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(GTM_NULLABLE NSError *)error { + // This may happen repeatedly for retries. On authentication callbacks, the retry + // may begin before the prior session sends the didBecomeInvalid delegate message. + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ didBecomeInvalidWithError:%@", + [self class], self, session, error); + if (session == (NSURLSession *)self.session) { + GTM_LOG_SESSION_DELEGATE(@" Unexpected retained invalid session: %@", session); + self.session = nil; + } +} + +- (void)finishWithError:(GTM_NULLABLE NSError *)error shouldRetry:(BOOL)shouldRetry { + [self removePersistedBackgroundSessionFromDefaults]; + + BOOL shouldStopFetching = YES; + NSData *downloadedData = nil; +#if !STRIP_GTM_FETCH_LOGGING + BOOL shouldDeferLogging = NO; +#endif + BOOL shouldBeginRetryTimer = NO; + NSInteger status = [self statusCode]; + NSURL *destinationURL = self.destinationFileURL; + + BOOL fetchSucceeded = (error == nil && status >= 0 && status < 300); + +#if !STRIP_GTM_FETCH_LOGGING + if (!fetchSucceeded) { + if (!shouldDeferLogging && !self.hasLoggedError) { + [self logNowWithError:error]; + self.hasLoggedError = YES; + } + } +#endif // !STRIP_GTM_FETCH_LOGGING + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + +#if !STRIP_GTM_FETCH_LOGGING + shouldDeferLogging = _deferResponseBodyLogging; +#endif + if (fetchSucceeded) { + // Success + if ((_downloadedData.length > 0) && (destinationURL != nil)) { + // Overwrite any previous file at the destination URL. + NSFileManager *fileMgr = [NSFileManager defaultManager]; + [fileMgr removeItemAtURL:destinationURL + error:NULL]; + NSURL *destinationFolderURL = [destinationURL URLByDeletingLastPathComponent]; + BOOL didMoveDownload = NO; + if ([fileMgr createDirectoryAtURL:destinationFolderURL + withIntermediateDirectories:YES + attributes:nil + error:&error]) { + didMoveDownload = [_downloadedData writeToURL:destinationURL + options:NSDataWritingAtomic + error:&error]; + } + if (didMoveDownload) { + _downloadedData = nil; + } else { + _downloadFinishedError = error; + } + } + downloadedData = _downloadedData; + } else { + // Unsuccessful with error or status over 300. Retry or notify the delegate of failure + if (shouldRetry) { + // Retrying. + shouldBeginRetryTimer = YES; + shouldStopFetching = NO; + } else { + if (error == nil) { + // Create an error. + NSDictionary *userInfo = GTMErrorUserInfoForData( + _downloadedData.length > 0 ? _downloadedData : _downloadTaskErrorData, + [self responseHeadersUnsynchronized]); + + error = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain + code:status + userInfo:userInfo]; + } else { + // If the error had resume data, and the client supplied a resume block, pass the + // data to the client. + void (^resumeBlock)(NSData *) = _resumeDataBlock; + _resumeDataBlock = nil; + if (resumeBlock) { + NSData *resumeData = [error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData]; + if (resumeData) { + [self invokeOnCallbackQueueAfterUserStopped:YES block:^{ + resumeBlock(resumeData); + }]; + } + } + } + if (_downloadedData.length > 0) { + downloadedData = _downloadedData; + } + // If the error occurred after retries, report the number and duration of the + // retries. This provides a clue to a developer looking at the error description + // that the fetcher did retry before failing with this error. + if (_retryCount > 0) { + NSMutableDictionary *userInfoWithRetries = + [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)error.userInfo]; + NSTimeInterval timeSinceInitialRequest = -[_initialRequestDate timeIntervalSinceNow]; + [userInfoWithRetries setObject:@(timeSinceInitialRequest) + forKey:kGTMSessionFetcherElapsedIntervalWithRetriesKey]; + [userInfoWithRetries setObject:@(_retryCount) + forKey:kGTMSessionFetcherNumberOfRetriesDoneKey]; + error = [NSError errorWithDomain:(NSString *)error.domain + code:error.code + userInfo:userInfoWithRetries]; + } + } + } + } // @synchronized(self) + + if (shouldBeginRetryTimer) { + [self beginRetryTimer]; + } + + // We want to send the stop notification before calling the delegate's + // callback selector, since the callback selector may release all of + // the fetcher properties that the client is using to track the fetches. + // + // We'll also stop now so that, to any observers watching the notifications, + // it doesn't look like our wait for a retry (which may be long, + // 30 seconds or more) is part of the network activity. + [self sendStopNotificationIfNeeded]; + + if (shouldStopFetching) { + [self invokeFetchCallbacksOnCallbackQueueWithData:downloadedData + error:error]; + // The upload subclass doesn't want to release callbacks until upload chunks have completed. + BOOL shouldRelease = [self shouldReleaseCallbacksUponCompletion]; + [self stopFetchReleasingCallbacks:shouldRelease]; + } + +#if !STRIP_GTM_FETCH_LOGGING + // _hasLoggedError is only set by this method + if (!shouldDeferLogging && !_hasLoggedError) { + [self logNowWithError:error]; + } +#endif +} + +- (BOOL)shouldReleaseCallbacksUponCompletion { + // A subclass can override this to keep callbacks around after the + // connection has finished successfully + return YES; +} + +- (void)logNowWithError:(GTM_NULLABLE NSError *)error { + GTMSessionCheckNotSynchronized(self); + + // If the logging category is available, then log the current request, + // response, data, and error + if ([self respondsToSelector:@selector(logFetchWithError:)]) { + [self performSelector:@selector(logFetchWithError:) withObject:error]; + } +} + +#pragma mark Retries + +- (BOOL)isRetryError:(NSError *)error { + struct RetryRecord { + __unsafe_unretained NSString *const domain; + NSInteger code; + }; + + struct RetryRecord retries[] = { + { kGTMSessionFetcherStatusDomain, 408 }, // request timeout + { kGTMSessionFetcherStatusDomain, 502 }, // failure gatewaying to another server + { kGTMSessionFetcherStatusDomain, 503 }, // service unavailable + { kGTMSessionFetcherStatusDomain, 504 }, // request timeout + { NSURLErrorDomain, NSURLErrorTimedOut }, + { NSURLErrorDomain, NSURLErrorNetworkConnectionLost }, + { nil, 0 } + }; + + // NSError's isEqual always returns false for equal but distinct instances + // of NSError, so we have to compare the domain and code values explicitly + NSString *domain = error.domain; + NSInteger code = error.code; + for (int idx = 0; retries[idx].domain != nil; idx++) { + if (code == retries[idx].code && [domain isEqual:retries[idx].domain]) { + return YES; + } + } + return NO; +} + +// shouldRetryNowForStatus:error: responds with YES if the user has enabled retries +// and the status or error is one that is suitable for retrying. "Suitable" +// means either the isRetryError:'s list contains the status or error, or the +// user's retry block is present and returns YES when called, or the +// authorizer may be able to fix. +- (void)shouldRetryNowForStatus:(NSInteger)status + error:(NSError *)error + forceAssumeRetry:(BOOL)forceAssumeRetry + response:(GTMSessionFetcherRetryResponse)response { + // Determine if a refreshed authorizer may avoid an authorization error + BOOL willRetry = NO; + + // We assume _authorizer is immutable after beginFetch, and _hasAttemptedAuthRefresh is modified + // only in this method, and this method is invoked on the serial delegate queue. + // + // We want to avoid calling the authorizer from inside a sync block. + BOOL isFirstAuthError = (_authorizer != nil + && !_hasAttemptedAuthRefresh + && status == GTMSessionFetcherStatusUnauthorized); // 401 + + BOOL hasPrimed = NO; + if (isFirstAuthError) { + if ([_authorizer respondsToSelector:@selector(primeForRefresh)]) { + hasPrimed = [_authorizer primeForRefresh]; + } + } + + BOOL shouldRetryForAuthRefresh = NO; + if (hasPrimed) { + shouldRetryForAuthRefresh = YES; + _hasAttemptedAuthRefresh = YES; + [self updateRequestValue:nil forHTTPHeaderField:@"Authorization"]; + } + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + BOOL shouldDoRetry = [self isRetryEnabledUnsynchronized]; + if (shouldDoRetry && ![self hasRetryAfterInterval]) { + + // Determine if we're doing exponential backoff retries + shouldDoRetry = [self nextRetryIntervalUnsynchronized] < _maxRetryInterval; + + if (shouldDoRetry) { + // If an explicit max retry interval was set, we expect repeated backoffs to take + // up to roughly twice that for repeated fast failures. If the initial attempt is + // already more than 3 times the max retry interval, then failures have taken a long time + // (such as from network timeouts) so don't retry again to avoid the app becoming + // unexpectedly unresponsive. + if (_maxRetryInterval > 0) { + NSTimeInterval maxAllowedIntervalBeforeRetry = _maxRetryInterval * 3; + NSTimeInterval timeSinceInitialRequest = -[_initialRequestDate timeIntervalSinceNow]; + if (timeSinceInitialRequest > maxAllowedIntervalBeforeRetry) { + shouldDoRetry = NO; + } + } + } + } + BOOL canRetry = shouldRetryForAuthRefresh || forceAssumeRetry || shouldDoRetry; + if (canRetry) { + NSDictionary *userInfo = + GTMErrorUserInfoForData(_downloadedData, [self responseHeadersUnsynchronized]); + NSError *statusError = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain + code:status + userInfo:userInfo]; + if (error == nil) { + error = statusError; + } + willRetry = shouldRetryForAuthRefresh || + forceAssumeRetry || + [self isRetryError:error] || + ((error != statusError) && [self isRetryError:statusError]); + + // If the user has installed a retry callback, consult that. + GTMSessionFetcherRetryBlock retryBlock = _retryBlock; + if (retryBlock) { + [self invokeOnCallbackQueueUnlessStopped:^{ + retryBlock(willRetry, error, response); + }]; + return; + } + } + } // @synchronized(self) + response(willRetry); +} + +- (BOOL)hasRetryAfterInterval { + GTMSessionCheckSynchronized(self); + + NSDictionary *responseHeaders = [self responseHeadersUnsynchronized]; + NSString *retryAfterValue = [responseHeaders valueForKey:@"Retry-After"]; + return (retryAfterValue != nil); +} + +- (NSTimeInterval)retryAfterInterval { + GTMSessionCheckSynchronized(self); + + NSDictionary *responseHeaders = [self responseHeadersUnsynchronized]; + NSString *retryAfterValue = [responseHeaders valueForKey:@"Retry-After"]; + if (retryAfterValue == nil) { + return 0; + } + // Retry-After formatted as HTTP-date | delta-seconds + // Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + NSDateFormatter *rfc1123DateFormatter = [[NSDateFormatter alloc] init]; + rfc1123DateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; + rfc1123DateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; + rfc1123DateFormatter.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss z"; + NSDate *retryAfterDate = [rfc1123DateFormatter dateFromString:retryAfterValue]; + NSTimeInterval retryAfterInterval = (retryAfterDate != nil) ? + retryAfterDate.timeIntervalSinceNow : retryAfterValue.intValue; + retryAfterInterval = MAX(0, retryAfterInterval); + return retryAfterInterval; +} + +- (void)beginRetryTimer { + if (![NSThread isMainThread]) { + // Defer creating and starting the timer until we're on the main thread to ensure it has + // a run loop. + dispatch_group_async(_callbackGroup, dispatch_get_main_queue(), ^{ + [self beginRetryTimer]; + }); + return; + } + + [self destroyRetryTimer]; + +#if GTM_BACKGROUND_TASK_FETCHING + // Don't keep a background task active while awaiting retry, which can lead to the + // app exceeding the allotted time for keeping the background task open, causing the + // system to terminate the app. When the retry starts, a new background task will + // be created. + [self endBackgroundTask]; +#endif // GTM_BACKGROUND_TASK_FETCHING + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSTimeInterval nextInterval = [self nextRetryIntervalUnsynchronized]; + NSTimeInterval maxInterval = _maxRetryInterval; + NSTimeInterval newInterval = MIN(nextInterval, (maxInterval > 0 ? maxInterval : DBL_MAX)); + NSTimeInterval newIntervalTolerance = (newInterval / 10) > 1.0 ?: 1.0; + + _lastRetryInterval = newInterval; + + _retryTimer = [NSTimer timerWithTimeInterval:newInterval + target:self + selector:@selector(retryTimerFired:) + userInfo:nil + repeats:NO]; + _retryTimer.tolerance = newIntervalTolerance; + [[NSRunLoop mainRunLoop] addTimer:_retryTimer + forMode:NSDefaultRunLoopMode]; + } // @synchronized(self) + + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherRetryDelayStartedNotification + userInfo:nil + requireAsync:NO]; +} + +- (void)retryTimerFired:(NSTimer *)timer { + [self destroyRetryTimer]; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _retryCount++; + } // @synchronized(self) + + NSOperationQueue *queue = self.sessionDelegateQueue; + [queue addOperationWithBlock:^{ + [self retryFetch]; + }]; +} + +- (void)destroyRetryTimer { + BOOL shouldNotify = NO; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_retryTimer) { + [_retryTimer invalidate]; + _retryTimer = nil; + shouldNotify = YES; + } + } + + if (shouldNotify) { + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherRetryDelayStoppedNotification + userInfo:nil + requireAsync:NO]; + } +} + +- (NSUInteger)retryCount { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _retryCount; + } // @synchronized(self) +} + +- (NSTimeInterval)nextRetryInterval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSTimeInterval interval = [self nextRetryIntervalUnsynchronized]; + return interval; + } // @synchronized(self) +} + +- (NSTimeInterval)nextRetryIntervalUnsynchronized { + GTMSessionCheckSynchronized(self); + + NSInteger statusCode = [self statusCodeUnsynchronized]; + if ((statusCode == 503) && [self hasRetryAfterInterval]) { + NSTimeInterval secs = [self retryAfterInterval]; + return secs; + } + // The next wait interval is the factor (2.0) times the last interval, + // but never less than the minimum interval. + NSTimeInterval secs = _lastRetryInterval * _retryFactor; + if (_maxRetryInterval > 0) { + secs = MIN(secs, _maxRetryInterval); + } + secs = MAX(secs, _minRetryInterval); + + return secs; +} + +- (NSTimer *)retryTimer { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _retryTimer; + } // @synchronized(self) +} + +- (BOOL)isRetryEnabled { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _isRetryEnabled; + } // @synchronized(self) +} + +- (BOOL)isRetryEnabledUnsynchronized { + GTMSessionCheckSynchronized(self); + + return _isRetryEnabled; +} + +- (void)setRetryEnabled:(BOOL)flag { + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (flag && !_isRetryEnabled) { + // We defer initializing these until the user calls setRetryEnabled + // to avoid using the random number generator if it's not needed. + // However, this means min and max intervals for this fetcher are reset + // as a side effect of calling setRetryEnabled. + // + // Make an initial retry interval random between 1.0 and 2.0 seconds + _minRetryInterval = InitialMinRetryInterval(); + _maxRetryInterval = kUnsetMaxRetryInterval; + _retryFactor = 2.0; + _lastRetryInterval = 0.0; + } + _isRetryEnabled = flag; + } // @synchronized(self) +}; + +- (NSTimeInterval)maxRetryInterval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _maxRetryInterval; + } // @synchronized(self) +} + +- (void)setMaxRetryInterval:(NSTimeInterval)secs { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (secs > 0) { + _maxRetryInterval = secs; + } else { + _maxRetryInterval = kUnsetMaxRetryInterval; + } + } // @synchronized(self) +} + +- (double)minRetryInterval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _minRetryInterval; + } // @synchronized(self) +} + +- (void)setMinRetryInterval:(NSTimeInterval)secs { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (secs > 0) { + _minRetryInterval = secs; + } else { + // Set min interval to a random value between 1.0 and 2.0 seconds + // so that if multiple clients start retrying at the same time, they'll + // repeat at different times and avoid overloading the server + _minRetryInterval = InitialMinRetryInterval(); + } + } // @synchronized(self) + +} + +#pragma mark iOS System Completion Handlers + +#if TARGET_OS_IPHONE +static NSMutableDictionary *gSystemCompletionHandlers = nil; + +- (GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler { + return [[self class] systemCompletionHandlerForSessionIdentifier:_sessionIdentifier]; +} + +- (void)setSystemCompletionHandler:(GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler { + [[self class] setSystemCompletionHandler:systemCompletionHandler + forSessionIdentifier:_sessionIdentifier]; +} + ++ (void)setSystemCompletionHandler:(GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler + forSessionIdentifier:(NSString *)sessionIdentifier { + if (!sessionIdentifier) { + NSLog(@"%s with nil identifier", __PRETTY_FUNCTION__); + return; + } + + @synchronized([GTMSessionFetcher class]) { + if (gSystemCompletionHandlers == nil && systemCompletionHandler != nil) { + gSystemCompletionHandlers = [[NSMutableDictionary alloc] init]; + } + // Use setValue: to remove the object if completionHandler is nil. + [gSystemCompletionHandlers setValue:systemCompletionHandler + forKey:sessionIdentifier]; + } +} + ++ (GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandlerForSessionIdentifier:(NSString *)sessionIdentifier { + if (!sessionIdentifier) { + return nil; + } + @synchronized([GTMSessionFetcher class]) { + return [gSystemCompletionHandlers objectForKey:sessionIdentifier]; + } +} +#endif // TARGET_OS_IPHONE + +#pragma mark Getters and Setters + +@synthesize downloadResumeData = _downloadResumeData, + configuration = _configuration, + configurationBlock = _configurationBlock, + sessionTask = _sessionTask, + wasCreatedFromBackgroundSession = _wasCreatedFromBackgroundSession, + sessionUserInfo = _sessionUserInfo, + taskDescription = _taskDescription, + taskPriority = _taskPriority, + usingBackgroundSession = _usingBackgroundSession, + canShareSession = _canShareSession, + completionHandler = _completionHandler, + credential = _credential, + proxyCredential = _proxyCredential, + bodyData = _bodyData, + bodyLength = _bodyLength, + service = _service, + serviceHost = _serviceHost, + accumulateDataBlock = _accumulateDataBlock, + receivedProgressBlock = _receivedProgressBlock, + downloadProgressBlock = _downloadProgressBlock, + resumeDataBlock = _resumeDataBlock, + didReceiveResponseBlock = _didReceiveResponseBlock, + challengeBlock = _challengeBlock, + willRedirectBlock = _willRedirectBlock, + sendProgressBlock = _sendProgressBlock, + willCacheURLResponseBlock = _willCacheURLResponseBlock, + retryBlock = _retryBlock, + metricsCollectionBlock = _metricsCollectionBlock, + retryFactor = _retryFactor, + allowedInsecureSchemes = _allowedInsecureSchemes, + allowLocalhostRequest = _allowLocalhostRequest, + allowInvalidServerCertificates = _allowInvalidServerCertificates, + cookieStorage = _cookieStorage, + callbackQueue = _callbackQueue, + initialBeginFetchDate = _initialBeginFetchDate, + testBlock = _testBlock, + testBlockAccumulateDataChunkCount = _testBlockAccumulateDataChunkCount, + comment = _comment, + log = _log; + +#if !STRIP_GTM_FETCH_LOGGING +@synthesize redirectedFromURL = _redirectedFromURL, + logRequestBody = _logRequestBody, + logResponseBody = _logResponseBody, + hasLoggedError = _hasLoggedError; +#endif + +#if GTM_BACKGROUND_TASK_FETCHING +@synthesize backgroundTaskIdentifier = _backgroundTaskIdentifier, + skipBackgroundTask = _skipBackgroundTask; +#endif + +- (GTM_NULLABLE NSURLRequest *)request { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_request copy]; + } // @synchronized(self) +} + +- (void)setRequest:(GTM_NULLABLE NSURLRequest *)request { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (![self isFetchingUnsynchronized]) { + _request = [request mutableCopy]; + } else { + GTMSESSION_ASSERT_DEBUG(0, @"request may not be set after beginFetch has been invoked"); + } + } // @synchronized(self) +} + +- (GTM_NULLABLE NSMutableURLRequest *)mutableRequestForTesting { + // Allow tests only to modify the request, useful during retries. + return _request; +} + +// Internal method for updating the request property such as on redirects. +- (void)updateMutableRequest:(GTM_NULLABLE NSMutableURLRequest *)request { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _request = request; + } // @synchronized(self) +} + +// Set a header field value on the request. Header field value changes will not +// affect a fetch after the fetch has begun. +- (void)setRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field { + if (![self isFetching]) { + [self updateRequestValue:value forHTTPHeaderField:field]; + } else { + GTMSESSION_ASSERT_DEBUG(0, @"request may not be set after beginFetch has been invoked"); + } +} + +// Internal method for updating request headers. +- (void)updateRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [_request setValue:value forHTTPHeaderField:field]; + } // @synchronized(self) +} + +- (void)setResponse:(GTM_NULLABLE NSURLResponse *)response { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _response = response; + } // @synchronized(self) +} + +- (int64_t)bodyLength { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_bodyLength == NSURLSessionTransferSizeUnknown) { + if (_bodyData) { + _bodyLength = (int64_t)_bodyData.length; + } else if (_bodyFileURL) { + NSNumber *fileSizeNum = nil; + NSError *fileSizeError = nil; + if ([_bodyFileURL getResourceValue:&fileSizeNum + forKey:NSURLFileSizeKey + error:&fileSizeError]) { + _bodyLength = [fileSizeNum longLongValue]; + } + } + } + return _bodyLength; + } // @synchronized(self) +} + +- (BOOL)useUploadTask { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _useUploadTask; + } // @synchronized(self) +} + +- (void)setUseUploadTask:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (flag != _useUploadTask) { + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"useUploadTask should not change after beginFetch has been invoked"); + _useUploadTask = flag; + } + } // @synchronized(self) +} + +- (GTM_NULLABLE NSURL *)bodyFileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _bodyFileURL; + } // @synchronized(self) +} + +- (void)setBodyFileURL:(GTM_NULLABLE NSURL *)fileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // The comparison here is a trivial optimization and forgiveness for any client that + // repeatedly sets the property, so it just uses pointer comparison rather than isEqual:. + if (fileURL != _bodyFileURL) { + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"fileURL should not change after beginFetch has been invoked"); + + _bodyFileURL = fileURL; + } + } // @synchronized(self) +} + +- (GTM_NULLABLE GTMSessionFetcherBodyStreamProvider)bodyStreamProvider { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _bodyStreamProvider; + } // @synchronized(self) +} + +- (void)setBodyStreamProvider:(GTM_NULLABLE GTMSessionFetcherBodyStreamProvider)block { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"stream provider should not change after beginFetch has been invoked"); + + _bodyStreamProvider = [block copy]; + } // @synchronized(self) +} + +- (GTM_NULLABLE id)authorizer { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _authorizer; + } // @synchronized(self) +} + +- (void)setAuthorizer:(GTM_NULLABLE id)authorizer { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (authorizer != _authorizer) { + if ([self isFetchingUnsynchronized]) { + GTMSESSION_ASSERT_DEBUG(0, @"authorizer should not change after beginFetch has been invoked"); + } else { + _authorizer = authorizer; + } + } + } // @synchronized(self) +} + +- (GTM_NULLABLE NSData *)downloadedData { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _downloadedData; + } // @synchronized(self) +} + +- (void)setDownloadedData:(GTM_NULLABLE NSData *)data { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _downloadedData = [data mutableCopy]; + } // @synchronized(self) +} + +- (int64_t)downloadedLength { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _downloadedLength; + } // @synchronized(self) +} + +- (void)setDownloadedLength:(int64_t)length { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _downloadedLength = length; + } // @synchronized(self) +} + +- (dispatch_queue_t GTM_NONNULL_TYPE)callbackQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _callbackQueue; + } // @synchronized(self) +} + +- (void)setCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _callbackQueue = queue ?: dispatch_get_main_queue(); + } // @synchronized(self) +} + +- (GTM_NULLABLE NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _session; + } // @synchronized(self) +} + +- (NSInteger)servicePriority { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _servicePriority; + } // @synchronized(self) +} + +- (void)setServicePriority:(NSInteger)value { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (value != _servicePriority) { + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"servicePriority should not change after beginFetch has been invoked"); + + _servicePriority = value; + } + } // @synchronized(self) +} + + +- (void)setSession:(GTM_NULLABLE NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _session = session; + } // @synchronized(self) +} + +- (BOOL)canShareSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _canShareSession; + } // @synchronized(self) +} + +- (void)setCanShareSession:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _canShareSession = flag; + } // @synchronized(self) +} + +- (BOOL)useBackgroundSession { + // This reflects if the user requested a background session, not necessarily + // if one was created. That is tracked with _usingBackgroundSession. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _userRequestedBackgroundSession; + } // @synchronized(self) +} + +- (void)setUseBackgroundSession:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (flag != _userRequestedBackgroundSession) { + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"useBackgroundSession should not change after beginFetch has been invoked"); + + _userRequestedBackgroundSession = flag; + } + } // @synchronized(self) +} + +- (BOOL)isUsingBackgroundSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _usingBackgroundSession; + } // @synchronized(self) +} + +- (void)setUsingBackgroundSession:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _usingBackgroundSession = flag; + } // @synchronized(self) +} + +- (GTM_NULLABLE NSURLSession *)sessionNeedingInvalidation { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _sessionNeedingInvalidation; + } // @synchronized(self) +} + +- (void)setSessionNeedingInvalidation:(GTM_NULLABLE NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _sessionNeedingInvalidation = session; + } // @synchronized(self) +} + +- (NSOperationQueue * GTM_NONNULL_TYPE)sessionDelegateQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateQueue; + } // @synchronized(self) +} + +- (void)setSessionDelegateQueue:(NSOperationQueue * GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (queue != _delegateQueue) { + if ([self isFetchingUnsynchronized]) { + GTMSESSION_ASSERT_DEBUG(0, @"sessionDelegateQueue should not change after fetch begins"); + } else { + _delegateQueue = queue ?: [NSOperationQueue mainQueue]; + } + } + } // @synchronized(self) +} + +- (BOOL)userStoppedFetching { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _userStoppedFetching; + } // @synchronized(self) +} + +- (GTM_NULLABLE id)userData { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _userData; + } // @synchronized(self) +} + +- (void)setUserData:(GTM_NULLABLE id)theObj { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _userData = theObj; + } // @synchronized(self) +} + +- (GTM_NULLABLE NSURL *)destinationFileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _destinationFileURL; + } // @synchronized(self) +} + +- (void)setDestinationFileURL:(GTM_NULLABLE NSURL *)destinationFileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (((_destinationFileURL == nil) && (destinationFileURL == nil)) || + [_destinationFileURL isEqual:destinationFileURL]) { + return; + } + if (_sessionIdentifier) { + // This is something we don't expect to happen in production. + // However if it ever happen, leave a system log. + NSLog(@"%@: Destination File URL changed from (%@) to (%@) after session identifier has " + @"been created.", + [self class], _destinationFileURL, destinationFileURL); +#if DEBUG + // On both the simulator and devices, the path can change to the download file, but the name + // shouldn't change. Technically, this isn't supported in the fetcher, but the change of + // URL is expected to happen only across development runs through Xcode. + NSString *oldFilename = [_destinationFileURL lastPathComponent]; + NSString *newFilename = [destinationFileURL lastPathComponent]; + #pragma unused(oldFilename) + #pragma unused(newFilename) + GTMSESSION_ASSERT_DEBUG([oldFilename isEqualToString:newFilename], + @"Destination File URL cannot be changed after session identifier has been created"); +#endif + } + _destinationFileURL = destinationFileURL; + } // @synchronized(self) +} + +- (void)setProperties:(GTM_NULLABLE NSDictionary *)dict { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _properties = [dict mutableCopy]; + } // @synchronized(self) +} + +- (GTM_NULLABLE NSDictionary *)properties { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _properties; + } // @synchronized(self) +} + +- (void)setProperty:(GTM_NULLABLE id)obj forKey:(NSString *)key { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_properties == nil && obj != nil) { + _properties = [[NSMutableDictionary alloc] init]; + } + [_properties setValue:obj forKey:key]; + } // @synchronized(self) +} + +- (GTM_NULLABLE id)propertyForKey:(NSString *)key { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_properties objectForKey:key]; + } // @synchronized(self) +} + +- (void)addPropertiesFromDictionary:(NSDictionary *)dict { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_properties == nil && dict != nil) { + [self setProperties:[dict mutableCopy]]; + } else { + [_properties addEntriesFromDictionary:dict]; + } + } // @synchronized(self) +} + +- (void)setCommentWithFormat:(id)format, ... { +#if !STRIP_GTM_FETCH_LOGGING + NSString *result = format; + if (format) { + va_list argList; + va_start(argList, format); + + result = [[NSString alloc] initWithFormat:format + arguments:argList]; + va_end(argList); + } + [self setComment:result]; +#endif +} + +#if !STRIP_GTM_FETCH_LOGGING +- (NSData *)loggedStreamData { + return _loggedStreamData; +} + +- (void)appendLoggedStreamData:dataToAdd { + if (!_loggedStreamData) { + _loggedStreamData = [NSMutableData data]; + } + [_loggedStreamData appendData:dataToAdd]; +} + +- (void)clearLoggedStreamData { + _loggedStreamData = nil; +} + +- (void)setDeferResponseBodyLogging:(BOOL)deferResponseBodyLogging { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (deferResponseBodyLogging != _deferResponseBodyLogging) { + _deferResponseBodyLogging = deferResponseBodyLogging; + if (!deferResponseBodyLogging && !self.hasLoggedError) { + [_delegateQueue addOperationWithBlock:^{ + [self logNowWithError:nil]; + }]; + } + } + } // @synchronized(self) +} + +- (BOOL)deferResponseBodyLogging { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _deferResponseBodyLogging; + } // @synchronized(self) +} + +#else ++ (void)setLoggingEnabled:(BOOL)flag { +} + ++ (BOOL)isLoggingEnabled { + return NO; +} +#endif // STRIP_GTM_FETCH_LOGGING + +@end + +@implementation GTMSessionFetcher (BackwardsCompatibilityOnly) + +- (void)setCookieStorageMethod:(NSInteger)method { + // For backwards compatibility with the old fetcher, we'll support the old constants. + // + // Clients using the GTMSessionFetcher class should set the cookie storage explicitly + // themselves. + NSHTTPCookieStorage *storage = nil; + switch(method) { + case 0: // kGTMHTTPFetcherCookieStorageMethodStatic + // nil storage will use [[self class] staticCookieStorage] when the fetch begins. + break; + case 1: // kGTMHTTPFetcherCookieStorageMethodFetchHistory + // Do nothing; use whatever was set by the fetcher service. + return; + case 2: // kGTMHTTPFetcherCookieStorageMethodSystemDefault + storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; + break; + case 3: // kGTMHTTPFetcherCookieStorageMethodNone + // Create temporary storage for this fetcher only. + storage = [[GTMSessionCookieStorage alloc] init]; + break; + default: + GTMSESSION_ASSERT_DEBUG(0, @"Invalid cookie storage method: %d", (int)method); + } + self.cookieStorage = storage; +} + +@end + +@implementation GTMSessionCookieStorage { + NSMutableArray *_cookies; + NSHTTPCookieAcceptPolicy _policy; +} + +- (id)init { + self = [super init]; + if (self != nil) { + _cookies = [[NSMutableArray alloc] init]; + } + return self; +} + +- (GTM_NULLABLE NSArray *)cookies { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_cookies copy]; + } // @synchronized(self) +} + +- (void)setCookie:(NSHTTPCookie *)cookie { + if (!cookie) return; + if (_policy == NSHTTPCookieAcceptPolicyNever) return; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self internalSetCookie:cookie]; + } // @synchronized(self) +} + +// Note: this should only be called from inside a @synchronized(self) block. +- (void)internalSetCookie:(NSHTTPCookie *)newCookie { + GTMSessionCheckSynchronized(self); + + if (_policy == NSHTTPCookieAcceptPolicyNever) return; + + BOOL isValidCookie = (newCookie.name.length > 0 + && newCookie.domain.length > 0 + && newCookie.path.length > 0); + GTMSESSION_ASSERT_DEBUG(isValidCookie, @"invalid cookie: %@", newCookie); + + if (isValidCookie) { + // Remove the cookie if it's currently in the array. + NSHTTPCookie *oldCookie = [self cookieMatchingCookie:newCookie]; + if (oldCookie) { + [_cookies removeObjectIdenticalTo:oldCookie]; + } + + if (![[self class] hasCookieExpired:newCookie]) { + [_cookies addObject:newCookie]; + } + } +} + +// Add all cookies in the new cookie array to the storage, +// replacing stored cookies as appropriate. +// +// Side effect: removes expired cookies from the storage array. +- (void)setCookies:(GTM_NULLABLE NSArray *)newCookies { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self removeExpiredCookies]; + + for (NSHTTPCookie *newCookie in newCookies) { + [self internalSetCookie:newCookie]; + } + } // @synchronized(self) +} + +- (void)setCookies:(NSArray *)cookies forURL:(GTM_NULLABLE NSURL *)URL mainDocumentURL:(GTM_NULLABLE NSURL *)mainDocumentURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_policy == NSHTTPCookieAcceptPolicyNever) { + return; + } + + if (_policy == NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain) { + NSString *mainHost = mainDocumentURL.host; + NSString *associatedHost = URL.host; + if (!mainHost || ![associatedHost hasSuffix:mainHost]) { + return; + } + } + } // @synchronized(self) + [self setCookies:cookies]; +} + +- (void)deleteCookie:(NSHTTPCookie *)cookie { + if (!cookie) return; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSHTTPCookie *foundCookie = [self cookieMatchingCookie:cookie]; + if (foundCookie) { + [_cookies removeObjectIdenticalTo:foundCookie]; + } + } // @synchronized(self) +} + +// Retrieve all cookies appropriate for the given URL, considering +// domain, path, cookie name, expiration, security setting. +// Side effect: removed expired cookies from the storage array. +- (GTM_NULLABLE NSArray *)cookiesForURL:(NSURL *)theURL { + NSMutableArray *foundCookies = nil; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self removeExpiredCookies]; + + // We'll prepend "." to the desired domain, since we want the + // actual domain "nytimes.com" to still match the cookie domain + // ".nytimes.com" when we check it below with hasSuffix. + NSString *host = theURL.host.lowercaseString; + NSString *path = theURL.path; + NSString *scheme = [theURL scheme]; + + NSString *requestingDomain = nil; + BOOL isLocalhostRetrieval = NO; + + if (IsLocalhost(host)) { + isLocalhostRetrieval = YES; + } else { + if (host.length > 0) { + requestingDomain = [@"." stringByAppendingString:host]; + } + } + + for (NSHTTPCookie *storedCookie in _cookies) { + NSString *cookieDomain = storedCookie.domain.lowercaseString; + NSString *cookiePath = storedCookie.path; + BOOL cookieIsSecure = [storedCookie isSecure]; + + BOOL isDomainOK; + + if (isLocalhostRetrieval) { + // Prior to 10.5.6, the domain stored into NSHTTPCookies for localhost + // is "localhost.local" + isDomainOK = (IsLocalhost(cookieDomain) + || [cookieDomain isEqual:@"localhost.local"]); + } else { + // Ensure we're matching exact domain names. We prepended a dot to the + // requesting domain, so we can also prepend one here if needed before + // checking if the request contains the cookie domain. + if (![cookieDomain hasPrefix:@"."]) { + cookieDomain = [@"." stringByAppendingString:cookieDomain]; + } + isDomainOK = [requestingDomain hasSuffix:cookieDomain]; + } + + BOOL isPathOK = [cookiePath isEqual:@"/"] || [path hasPrefix:cookiePath]; + BOOL isSecureOK = (!cookieIsSecure + || [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame); + + if (isDomainOK && isPathOK && isSecureOK) { + if (foundCookies == nil) { + foundCookies = [NSMutableArray array]; + } + [foundCookies addObject:storedCookie]; + } + } + } // @synchronized(self) + return foundCookies; +} + +// Override methods from the NSHTTPCookieStorage (NSURLSessionTaskAdditions) category. +- (void)storeCookies:(NSArray *)cookies forTask:(NSURLSessionTask *)task { + NSURLRequest *currentRequest = task.currentRequest; + [self setCookies:cookies forURL:currentRequest.URL mainDocumentURL:nil]; +} + +- (void)getCookiesForTask:(NSURLSessionTask *)task + completionHandler:(void (^)(GTM_NSArrayOf(NSHTTPCookie *) *))completionHandler { + if (completionHandler) { + NSURLRequest *currentRequest = task.currentRequest; + NSURL *currentRequestURL = currentRequest.URL; + NSArray *cookies = [self cookiesForURL:currentRequestURL]; + completionHandler(cookies); + } +} + +// Return a cookie from the array with the same name, domain, and path as the +// given cookie, or else return nil if none found. +// +// Both the cookie being tested and all cookies in the storage array should +// be valid (non-nil name, domains, paths). +// +// Note: this should only be called from inside a @synchronized(self) block +- (GTM_NULLABLE NSHTTPCookie *)cookieMatchingCookie:(NSHTTPCookie *)cookie { + GTMSessionCheckSynchronized(self); + + NSString *name = cookie.name; + NSString *domain = cookie.domain; + NSString *path = cookie.path; + + GTMSESSION_ASSERT_DEBUG(name && domain && path, + @"Invalid stored cookie (name:%@ domain:%@ path:%@)", name, domain, path); + + for (NSHTTPCookie *storedCookie in _cookies) { + if ([storedCookie.name isEqual:name] + && [storedCookie.domain isEqual:domain] + && [storedCookie.path isEqual:path]) { + return storedCookie; + } + } + return nil; +} + +// Internal routine to remove any expired cookies from the array, excluding +// cookies with nil expirations. +// +// Note: this should only be called from inside a @synchronized(self) block +- (void)removeExpiredCookies { + GTMSessionCheckSynchronized(self); + + // Count backwards since we're deleting items from the array + for (NSInteger idx = (NSInteger)_cookies.count - 1; idx >= 0; idx--) { + NSHTTPCookie *storedCookie = [_cookies objectAtIndex:(NSUInteger)idx]; + if ([[self class] hasCookieExpired:storedCookie]) { + [_cookies removeObjectAtIndex:(NSUInteger)idx]; + } + } +} + ++ (BOOL)hasCookieExpired:(NSHTTPCookie *)cookie { + NSDate *expiresDate = [cookie expiresDate]; + if (expiresDate == nil) { + // Cookies seem to have a Expires property even when the expiresDate method returns nil. + id expiresVal = [[cookie properties] objectForKey:NSHTTPCookieExpires]; + if ([expiresVal isKindOfClass:[NSDate class]]) { + expiresDate = expiresVal; + } + } + BOOL hasExpired = (expiresDate != nil && [expiresDate timeIntervalSinceNow] < 0); + return hasExpired; +} + +- (void)removeAllCookies { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [_cookies removeAllObjects]; + } // @synchronized(self) +} + +- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _policy; + } // @synchronized(self) +} + +- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)cookieAcceptPolicy { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _policy = cookieAcceptPolicy; + } // @synchronized(self) +} + +@end + +void GTMSessionFetcherAssertValidSelector(id GTM_NULLABLE_TYPE obj, SEL GTM_NULLABLE_TYPE sel, ...) { + // Verify that the object's selector is implemented with the proper + // number and type of arguments +#if DEBUG + va_list argList; + va_start(argList, sel); + + if (obj && sel) { + // Check that the selector is implemented + if (![obj respondsToSelector:sel]) { + NSLog(@"\"%@\" selector \"%@\" is unimplemented or misnamed", + NSStringFromClass([(id)obj class]), + NSStringFromSelector((SEL)sel)); + NSCAssert(0, @"callback selector unimplemented or misnamed"); + } else { + const char *expectedArgType; + unsigned int argCount = 2; // skip self and _cmd + NSMethodSignature *sig = [obj methodSignatureForSelector:sel]; + + // Check that each expected argument is present and of the correct type + while ((expectedArgType = va_arg(argList, const char*)) != 0) { + + if ([sig numberOfArguments] > argCount) { + const char *foundArgType = [sig getArgumentTypeAtIndex:argCount]; + + if (0 != strncmp(foundArgType, expectedArgType, strlen(expectedArgType))) { + NSLog(@"\"%@\" selector \"%@\" argument %d should be type %s", + NSStringFromClass([(id)obj class]), + NSStringFromSelector((SEL)sel), (argCount - 2), expectedArgType); + NSCAssert(0, @"callback selector argument type mistake"); + } + } + argCount++; + } + + // Check that the proper number of arguments are present in the selector + if (argCount != [sig numberOfArguments]) { + NSLog(@"\"%@\" selector \"%@\" should have %d arguments", + NSStringFromClass([(id)obj class]), + NSStringFromSelector((SEL)sel), (argCount - 2)); + NSCAssert(0, @"callback selector arguments incorrect"); + } + } + } + + va_end(argList); +#endif +} + +NSString *GTMFetcherCleanedUserAgentString(NSString *str) { + // Reference http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html + // and http://www-archive.mozilla.org/build/user-agent-strings.html + + if (str == nil) return @""; + + NSMutableString *result = [NSMutableString stringWithString:str]; + + // Replace spaces and commas with underscores + [result replaceOccurrencesOfString:@" " + withString:@"_" + options:0 + range:NSMakeRange(0, result.length)]; + [result replaceOccurrencesOfString:@"," + withString:@"_" + options:0 + range:NSMakeRange(0, result.length)]; + + // Delete http token separators and remaining whitespace + static NSCharacterSet *charsToDelete = nil; + if (charsToDelete == nil) { + // Make a set of unwanted characters + NSString *const kSeparators = @"()<>@;:\\\"/[]?={}"; + + NSMutableCharacterSet *mutableChars = + [[NSCharacterSet whitespaceAndNewlineCharacterSet] mutableCopy]; + [mutableChars addCharactersInString:kSeparators]; + charsToDelete = [mutableChars copy]; // hang on to an immutable copy + } + + while (1) { + NSRange separatorRange = [result rangeOfCharacterFromSet:charsToDelete]; + if (separatorRange.location == NSNotFound) break; + + [result deleteCharactersInRange:separatorRange]; + }; + + return result; +} + +NSString *GTMFetcherSystemVersionString(void) { + static NSString *sSavedSystemString; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // The Xcode 8 SDKs finally cleaned up this mess by providing TARGET_OS_OSX + // and TARGET_OS_IOS, but to build with older SDKs, those don't exist and + // instead one has to rely on TARGET_OS_MAC (which is true for iOS, watchOS, + // and tvOS) and TARGET_OS_IPHONE (which is true for iOS, watchOS, tvOS). So + // one has to order these carefully so you pick off the specific things + // first. + // If the code can ever assume Xcode 8 or higher (even when building for + // older OSes), then + // TARGET_OS_MAC -> TARGET_OS_OSX + // TARGET_OS_IPHONE -> TARGET_OS_IOS + // TARGET_IPHONE_SIMULATOR -> TARGET_OS_SIMULATOR +#if TARGET_OS_WATCH + // watchOS - WKInterfaceDevice + + WKInterfaceDevice *currentDevice = [WKInterfaceDevice currentDevice]; + + NSString *rawModel = [currentDevice model]; + NSString *model = GTMFetcherCleanedUserAgentString(rawModel); + + NSString *systemVersion = [currentDevice systemVersion]; + +#if TARGET_OS_SIMULATOR + NSString *hardwareModel = @"sim"; +#else + NSString *hardwareModel; + struct utsname unameRecord; + if (uname(&unameRecord) == 0) { + NSString *machineName = @(unameRecord.machine); + hardwareModel = GTMFetcherCleanedUserAgentString(machineName); + } + if (hardwareModel.length == 0) { + hardwareModel = @"unk"; + } +#endif + + sSavedSystemString = [[NSString alloc] initWithFormat:@"%@/%@ hw/%@", + model, systemVersion, hardwareModel]; + // Example: Apple_Watch/3.0 hw/Watch1_2 +#elif TARGET_OS_TV || TARGET_OS_IPHONE + // iOS and tvOS have UIDevice, use that. + UIDevice *currentDevice = [UIDevice currentDevice]; + + NSString *rawModel = [currentDevice model]; + NSString *model = GTMFetcherCleanedUserAgentString(rawModel); + + NSString *systemVersion = [currentDevice systemVersion]; + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_SIMULATOR + NSString *hardwareModel = @"sim"; +#else + NSString *hardwareModel; + struct utsname unameRecord; + if (uname(&unameRecord) == 0) { + NSString *machineName = @(unameRecord.machine); + hardwareModel = GTMFetcherCleanedUserAgentString(machineName); + } + if (hardwareModel.length == 0) { + hardwareModel = @"unk"; + } +#endif + + sSavedSystemString = [[NSString alloc] initWithFormat:@"%@/%@ hw/%@", + model, systemVersion, hardwareModel]; + // Example: iPod_Touch/2.2 hw/iPod1_1 + // Example: Apple_TV/9.2 hw/AppleTV5,3 +#elif TARGET_OS_MAC + // Mac build + NSProcessInfo *procInfo = [NSProcessInfo processInfo]; +#if !defined(MAC_OS_X_VERSION_10_10) + BOOL hasOperatingSystemVersion = NO; +#elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10 + BOOL hasOperatingSystemVersion = + [procInfo respondsToSelector:@selector(operatingSystemVersion)]; +#else + BOOL hasOperatingSystemVersion = YES; +#endif + NSString *versString; + if (hasOperatingSystemVersion) { +#if defined(MAC_OS_X_VERSION_10_10) + // A reference to NSOperatingSystemVersion requires the 10.10 SDK. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +// Disable unguarded availability warning as we can't use the @availability macro until we require +// all clients to build with Xcode 9 or above. + NSOperatingSystemVersion version = procInfo.operatingSystemVersion; +#pragma clang diagnostic pop + versString = [NSString stringWithFormat:@"%ld.%ld.%ld", + (long)version.majorVersion, (long)version.minorVersion, + (long)version.patchVersion]; +#else +#pragma unused(procInfo) +#endif + } else { + // With Gestalt inexplicably deprecated in 10.8, we're reduced to reading + // the system plist file. + NSString *const kPath = @"/System/Library/CoreServices/SystemVersion.plist"; + NSDictionary *plist = [NSDictionary dictionaryWithContentsOfFile:kPath]; + versString = [plist objectForKey:@"ProductVersion"]; + if (versString.length == 0) { + versString = @"10.?.?"; + } + } + + sSavedSystemString = [[NSString alloc] initWithFormat:@"MacOSX/%@", versString]; +#elif defined(_SYS_UTSNAME_H) + // Foundation-only build + struct utsname unameRecord; + uname(&unameRecord); + + sSavedSystemString = [NSString stringWithFormat:@"%s/%s", + unameRecord.sysname, unameRecord.release]; // "Darwin/8.11.1" +#else +#error No branch taken for a default user agent +#endif + }); + return sSavedSystemString; +} + +NSString *GTMFetcherStandardUserAgentString(NSBundle * GTM_NULLABLE_TYPE bundle) { + NSString *result = [NSString stringWithFormat:@"%@ %@", + GTMFetcherApplicationIdentifier(bundle), + GTMFetcherSystemVersionString()]; + return result; +} + +NSString *GTMFetcherApplicationIdentifier(NSBundle * GTM_NULLABLE_TYPE bundle) { + @synchronized([GTMSessionFetcher class]) { + static NSMutableDictionary *sAppIDMap = nil; + + // If there's a bundle ID, use that; otherwise, use the process name + if (bundle == nil) { + bundle = [NSBundle mainBundle]; + } + NSString *bundleID = [bundle bundleIdentifier]; + if (bundleID == nil) { + bundleID = @""; + } + + NSString *identifier = [sAppIDMap objectForKey:bundleID]; + if (identifier) return identifier; + + // Apps may add a string to the info.plist to uniquely identify different builds. + identifier = [bundle objectForInfoDictionaryKey:@"GTMUserAgentID"]; + if (identifier.length == 0) { + if (bundleID.length > 0) { + identifier = bundleID; + } else { + // Fall back on the procname, prefixed by "proc" to flag that it's + // autogenerated and perhaps unreliable + NSString *procName = [[NSProcessInfo processInfo] processName]; + identifier = [NSString stringWithFormat:@"proc_%@", procName]; + } + } + + // Clean up whitespace and special characters + identifier = GTMFetcherCleanedUserAgentString(identifier); + + // If there's a version number, append that + NSString *version = [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; + if (version.length == 0) { + version = [bundle objectForInfoDictionaryKey:@"CFBundleVersion"]; + } + + // Clean up whitespace and special characters + version = GTMFetcherCleanedUserAgentString(version); + + // Glue the two together (cleanup done above or else cleanup would strip the + // slash) + if (version.length > 0) { + identifier = [identifier stringByAppendingFormat:@"/%@", version]; + } + + if (sAppIDMap == nil) { + sAppIDMap = [[NSMutableDictionary alloc] init]; + } + [sAppIDMap setObject:identifier forKey:bundleID]; + return identifier; + } +} + +#if DEBUG && (!defined(NS_BLOCK_ASSERTIONS) || GTMSESSION_ASSERT_AS_LOG) +@implementation GTMSessionSyncMonitorInternal { + NSValue *_objectKey; // The synchronize target object. + const char *_functionName; // The function containing the monitored sync block. +} + +- (instancetype)initWithSynchronizationObject:(id)object + allowRecursive:(BOOL)allowRecursive + functionName:(const char *)functionName { + self = [super init]; + if (self) { + Class threadKey = [GTMSessionSyncMonitorInternal class]; + _objectKey = [NSValue valueWithNonretainedObject:object]; + _functionName = functionName; + + NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; + NSMutableDictionary *counters = threadDict[threadKey]; + if (counters == nil) { + counters = [NSMutableDictionary dictionary]; + threadDict[(id)threadKey] = counters; + } + NSCountedSet *functionNamesCounter = counters[_objectKey]; + NSUInteger numberOfSyncingFunctions = functionNamesCounter.count; + + if (!allowRecursive) { + BOOL isTopLevelSyncScope = (numberOfSyncingFunctions == 0); + NSArray *stack = [NSThread callStackSymbols]; + GTMSESSION_ASSERT_DEBUG(isTopLevelSyncScope, + @"*** Recursive sync on %@ at %s; previous sync at %@\n%@", + [object class], functionName, functionNamesCounter.allObjects, + [stack subarrayWithRange:NSMakeRange(1, stack.count - 1)]); + } + + if (!functionNamesCounter) { + functionNamesCounter = [NSCountedSet set]; + counters[_objectKey] = functionNamesCounter; + } + [functionNamesCounter addObject:(id _Nonnull)@(functionName)]; + } + return self; +} + +- (void)dealloc { + Class threadKey = [GTMSessionSyncMonitorInternal class]; + + NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; + NSMutableDictionary *counters = threadDict[threadKey]; + NSCountedSet *functionNamesCounter = counters[_objectKey]; + NSString *functionNameStr = @(_functionName); + NSUInteger numberOfSyncsByThisFunction = [functionNamesCounter countForObject:functionNameStr]; + NSArray *stack = [NSThread callStackSymbols]; + GTMSESSION_ASSERT_DEBUG(numberOfSyncsByThisFunction > 0, @"Sync not found on %@ at %s\n%@", + [_objectKey.nonretainedObjectValue class], _functionName, + [stack subarrayWithRange:NSMakeRange(1, stack.count - 1)]); + [functionNamesCounter removeObject:functionNameStr]; + if (functionNamesCounter.count == 0) { + [counters removeObjectForKey:_objectKey]; + } +} + ++ (NSArray *)functionsHoldingSynchronizationOnObject:(id)object { + Class threadKey = [GTMSessionSyncMonitorInternal class]; + NSValue *localObjectKey = [NSValue valueWithNonretainedObject:object]; + + NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; + NSMutableDictionary *counters = threadDict[threadKey]; + NSCountedSet *functionNamesCounter = counters[localObjectKey]; + return functionNamesCounter.count > 0 ? functionNamesCounter.allObjects : nil; +} +@end +#endif // DEBUG && (!defined(NS_BLOCK_ASSERTIONS) || GTMSESSION_ASSERT_AS_LOG) +GTM_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h new file mode 100644 index 00000000..5ccea78e --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h @@ -0,0 +1,112 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GTMSessionFetcher.h" + +// GTM HTTP Logging +// +// All traffic using GTMSessionFetcher can be easily logged. Call +// +// [GTMSessionFetcher setLoggingEnabled:YES]; +// +// to begin generating log files. +// +// Unless explicitly set by the application using +setLoggingDirectory:, +// logs are put into a default directory, located at: +// * macOS: ~/Desktop/GTMHTTPDebugLogs +// * iOS simulator: ~/GTMHTTPDebugLogs (in application sandbox) +// * iOS device: ~/Documents/GTMHTTPDebugLogs (in application sandbox) +// +// Tip: use the Finder's "Sort By Date" to find the most recent logs. +// +// Each run of an application gets a separate set of log files. An html +// file is generated to simplify browsing the run's http transactions. +// The html file includes javascript links for inline viewing of uploaded +// and downloaded data. +// +// A symlink is created in the logs folder to simplify finding the html file +// for the latest run of the application; the symlink is called +// +// AppName_http_log_newest.html +// +// For better viewing of XML logs, use Camino or Firefox rather than Safari. +// +// Each fetcher may be given a comment to be inserted as a label in the logs, +// such as +// [fetcher setCommentWithFormat:@"retrieve item %@", itemName]; +// +// Projects may define STRIP_GTM_FETCH_LOGGING to remove logging code. + +#if !STRIP_GTM_FETCH_LOGGING + +@interface GTMSessionFetcher (GTMSessionFetcherLogging) + +// Note: on macOS the default logs directory is ~/Desktop/GTMHTTPDebugLogs; on +// iOS simulators it will be the ~/GTMHTTPDebugLogs (in the app sandbox); on +// iOS devices it will be in ~/Documents/GTMHTTPDebugLogs (in the app sandbox). +// These directories will be created as needed, and are excluded from backups +// to iCloud and iTunes. +// +// If a custom directory is set, the directory should already exist. It is +// the application's responsibility to exclude any custom directory from +// backups, if desired. ++ (void)setLoggingDirectory:(NSString *)path; ++ (NSString *)loggingDirectory; + +// client apps can turn logging on and off ++ (void)setLoggingEnabled:(BOOL)isLoggingEnabled; ++ (BOOL)isLoggingEnabled; + +// client apps can turn off logging to a file if they want to only check +// the fetcher's log property ++ (void)setLoggingToFileEnabled:(BOOL)isLoggingToFileEnabled; ++ (BOOL)isLoggingToFileEnabled; + +// client apps can optionally specify process name and date string used in +// log file names ++ (void)setLoggingProcessName:(NSString *)processName; ++ (NSString *)loggingProcessName; + ++ (void)setLoggingDateStamp:(NSString *)dateStamp; ++ (NSString *)loggingDateStamp; + +// client apps can specify the directory for the log for this specific run, +// typically to match the directory used by another fetcher class, like: +// +// [GTMSessionFetcher setLogDirectoryForCurrentRun:[GTMHTTPFetcher logDirectoryForCurrentRun]]; +// +// Setting this overrides the logging directory, process name, and date stamp when writing +// the log file. ++ (void)setLogDirectoryForCurrentRun:(NSString *)logDirectoryForCurrentRun; ++ (NSString *)logDirectoryForCurrentRun; + +// Prunes old log directories that have not been modified since the provided date. +// This will not delete the current run's log directory. ++ (void)deleteLogDirectoriesOlderThanDate:(NSDate *)date; + +// internal; called by fetcher +- (void)logFetchWithError:(NSError *)error; +- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream; +- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: + (GTMSessionFetcherBodyStreamProvider)streamProvider; + +// internal; accessors useful for viewing logs ++ (NSString *)processNameLogPrefix; ++ (NSString *)symlinkNameSuffix; ++ (NSString *)htmlFileName; + +@end + +#endif // !STRIP_GTM_FETCH_LOGGING diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m new file mode 100644 index 00000000..cdf5c179 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m @@ -0,0 +1,982 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#include +#include + +#import "GTMSessionFetcherLogging.h" + +#ifndef STRIP_GTM_FETCH_LOGGING + #error GTMSessionFetcher headers should have defaulted this if it wasn't already defined. +#endif + +#if !STRIP_GTM_FETCH_LOGGING + +// Sensitive credential strings are replaced in logs with _snip_ +// +// Apps that must see the contents of sensitive tokens can set this to 1 +#ifndef SKIP_GTM_FETCH_LOGGING_SNIPPING +#define SKIP_GTM_FETCH_LOGGING_SNIPPING 0 +#endif + +// If GTMReadMonitorInputStream is available, it can be used for +// capturing uploaded streams of data +// +// We locally declare methods of GTMReadMonitorInputStream so we +// do not need to import the header, as some projects may not have it available +#if !GTMSESSION_BUILD_COMBINED_SOURCES +@interface GTMReadMonitorInputStream : NSInputStream + ++ (instancetype)inputStreamWithStream:(NSInputStream *)input; + +@property (assign) id readDelegate; +@property (assign) SEL readSelector; + +@end +#else +@class GTMReadMonitorInputStream; +#endif // !GTMSESSION_BUILD_COMBINED_SOURCES + +@interface GTMSessionFetcher (GTMHTTPFetcherLoggingUtilities) + ++ (NSString *)headersStringForDictionary:(NSDictionary *)dict; ++ (NSString *)snipSubstringOfString:(NSString *)originalStr + betweenStartString:(NSString *)startStr + endString:(NSString *)endStr; +- (void)inputStream:(GTMReadMonitorInputStream *)stream + readIntoBuffer:(void *)buffer + length:(int64_t)length; + +@end + +@implementation GTMSessionFetcher (GTMSessionFetcherLogging) + +// fetchers come and fetchers go, but statics are forever +static BOOL gIsLoggingEnabled = NO; +static BOOL gIsLoggingToFile = YES; +static NSString *gLoggingDirectoryPath = nil; +static NSString *gLogDirectoryForCurrentRun = nil; +static NSString *gLoggingDateStamp = nil; +static NSString *gLoggingProcessName = nil; + ++ (void)setLoggingDirectory:(NSString *)path { + gLoggingDirectoryPath = [path copy]; +} + ++ (NSString *)loggingDirectory { + if (!gLoggingDirectoryPath) { + NSArray *paths = nil; +#if TARGET_IPHONE_SIMULATOR + // default to a directory called GTMHTTPDebugLogs into a sandbox-safe + // directory that a developer can find easily, the application home + paths = @[ NSHomeDirectory() ]; +#elif TARGET_OS_IPHONE + // Neither ~/Desktop nor ~/Home is writable on an actual iOS, watchOS, or tvOS device. + // Put it in ~/Documents. + paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +#else + // default to a directory called GTMHTTPDebugLogs in the desktop folder + paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES); +#endif + + NSString *desktopPath = paths.firstObject; + if (desktopPath) { + NSString *const kGTMLogFolderName = @"GTMHTTPDebugLogs"; + NSString *logsFolderPath = [desktopPath stringByAppendingPathComponent:kGTMLogFolderName]; + + NSFileManager *fileMgr = [NSFileManager defaultManager]; + BOOL isDir; + BOOL doesFolderExist = [fileMgr fileExistsAtPath:logsFolderPath isDirectory:&isDir]; + if (!doesFolderExist) { + // make the directory + doesFolderExist = [fileMgr createDirectoryAtPath:logsFolderPath + withIntermediateDirectories:YES + attributes:nil + error:NULL]; + if (doesFolderExist) { + // The directory has been created. Exclude it from backups. + NSURL *pathURL = [NSURL fileURLWithPath:logsFolderPath isDirectory:YES]; + [pathURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:NULL]; + } + } + + if (doesFolderExist) { + // it's there; store it in the global + gLoggingDirectoryPath = [logsFolderPath copy]; + } + } + } + return gLoggingDirectoryPath; +} + ++ (void)setLogDirectoryForCurrentRun:(NSString *)logDirectoryForCurrentRun { + // Set the path for this run's logs. + gLogDirectoryForCurrentRun = [logDirectoryForCurrentRun copy]; +} + ++ (NSString *)logDirectoryForCurrentRun { + // make a directory for this run's logs, like SyncProto_logs_10-16_01-56-58PM + if (gLogDirectoryForCurrentRun) return gLogDirectoryForCurrentRun; + + NSString *parentDir = [self loggingDirectory]; + NSString *logNamePrefix = [self processNameLogPrefix]; + NSString *dateStamp = [self loggingDateStamp]; + NSString *dirName = [NSString stringWithFormat:@"%@%@", logNamePrefix, dateStamp]; + NSString *logDirectory = [parentDir stringByAppendingPathComponent:dirName]; + + if (gIsLoggingToFile) { + NSFileManager *fileMgr = [NSFileManager defaultManager]; + // Be sure that the first time this app runs, it's not writing to a preexisting folder + static BOOL gShouldReuseFolder = NO; + if (!gShouldReuseFolder) { + gShouldReuseFolder = YES; + NSString *origLogDir = logDirectory; + for (int ctr = 2; ctr < 20; ++ctr) { + if (![fileMgr fileExistsAtPath:logDirectory]) break; + + // append a digit + logDirectory = [origLogDir stringByAppendingFormat:@"_%d", ctr]; + } + } + if (![fileMgr createDirectoryAtPath:logDirectory + withIntermediateDirectories:YES + attributes:nil + error:NULL]) return nil; + } + gLogDirectoryForCurrentRun = logDirectory; + + return gLogDirectoryForCurrentRun; +} + ++ (void)setLoggingEnabled:(BOOL)isLoggingEnabled { + gIsLoggingEnabled = isLoggingEnabled; +} + ++ (BOOL)isLoggingEnabled { + return gIsLoggingEnabled; +} + ++ (void)setLoggingToFileEnabled:(BOOL)isLoggingToFileEnabled { + gIsLoggingToFile = isLoggingToFileEnabled; +} + ++ (BOOL)isLoggingToFileEnabled { + return gIsLoggingToFile; +} + ++ (void)setLoggingProcessName:(NSString *)processName { + gLoggingProcessName = [processName copy]; +} + ++ (NSString *)loggingProcessName { + // get the process name (once per run) replacing spaces with underscores + if (!gLoggingProcessName) { + NSString *procName = [[NSProcessInfo processInfo] processName]; + gLoggingProcessName = [procName stringByReplacingOccurrencesOfString:@" " withString:@"_"]; + } + return gLoggingProcessName; +} + ++ (void)setLoggingDateStamp:(NSString *)dateStamp { + gLoggingDateStamp = [dateStamp copy]; +} + ++ (NSString *)loggingDateStamp { + // We'll pick one date stamp per run, so a run that starts at a later second + // will get a unique results html file + if (!gLoggingDateStamp) { + // produce a string like 08-21_01-41-23PM + + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + [formatter setFormatterBehavior:NSDateFormatterBehavior10_4]; + [formatter setDateFormat:@"M-dd_hh-mm-ssa"]; + + gLoggingDateStamp = [formatter stringFromDate:[NSDate date]]; + } + return gLoggingDateStamp; +} + ++ (NSString *)processNameLogPrefix { + static NSString *gPrefix = nil; + if (!gPrefix) { + NSString *processName = [self loggingProcessName]; + gPrefix = [[NSString alloc] initWithFormat:@"%@_log_", processName]; + } + return gPrefix; +} + ++ (NSString *)symlinkNameSuffix { + return @"_log_newest.html"; +} + ++ (NSString *)htmlFileName { + return @"aperçu_http_log.html"; +} + ++ (void)deleteLogDirectoriesOlderThanDate:(NSDate *)cutoffDate { + NSFileManager *fileMgr = [NSFileManager defaultManager]; + NSURL *parentDir = [NSURL fileURLWithPath:[[self class] loggingDirectory]]; + NSURL *logDirectoryForCurrentRun = + [NSURL fileURLWithPath:[[self class] logDirectoryForCurrentRun]]; + NSError *error; + NSArray *contents = [fileMgr contentsOfDirectoryAtURL:parentDir + includingPropertiesForKeys:@[ NSURLContentModificationDateKey ] + options:0 + error:&error]; + for (NSURL *itemURL in contents) { + if ([itemURL isEqual:logDirectoryForCurrentRun]) continue; + + NSDate *modDate; + if ([itemURL getResourceValue:&modDate + forKey:NSURLContentModificationDateKey + error:&error]) { + if ([modDate compare:cutoffDate] == NSOrderedAscending) { + if (![fileMgr removeItemAtURL:itemURL error:&error]) { + NSLog(@"deleteLogDirectoriesOlderThanDate failed to delete %@: %@", + itemURL.path, error); + } + } + } else { + NSLog(@"deleteLogDirectoriesOlderThanDate failed to get mod date of %@: %@", + itemURL.path, error); + } + } +} + +// formattedStringFromData returns a prettyprinted string for XML or JSON input, +// and a plain string for other input data +- (NSString *)formattedStringFromData:(NSData *)inputData + contentType:(NSString *)contentType + JSON:(NSDictionary **)outJSON { + if (!inputData) return nil; + + // if the content type is JSON and we have the parsing class available, use that + if ([contentType hasPrefix:@"application/json"] && inputData.length > 5) { + // convert from JSON string to NSObjects and back to a formatted string + NSMutableDictionary *obj = [NSJSONSerialization JSONObjectWithData:inputData + options:NSJSONReadingMutableContainers + error:NULL]; + if (obj) { + if (outJSON) *outJSON = obj; + if ([obj isKindOfClass:[NSMutableDictionary class]]) { + // for security and privacy, omit OAuth 2 response access and refresh tokens + if ([obj valueForKey:@"refresh_token"] != nil) { + [obj setObject:@"_snip_" forKey:@"refresh_token"]; + } + if ([obj valueForKey:@"access_token"] != nil) { + [obj setObject:@"_snip_" forKey:@"access_token"]; + } + } + NSData *data = [NSJSONSerialization dataWithJSONObject:obj + options:NSJSONWritingPrettyPrinted + error:NULL]; + if (data) { + NSString *jsonStr = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + return jsonStr; + } + } + } + +#if !TARGET_OS_IPHONE && !GTM_SKIP_LOG_XMLFORMAT + // verify that this data starts with the bytes indicating XML + + NSString *const kXMLLintPath = @"/usr/bin/xmllint"; + static BOOL gHasCheckedAvailability = NO; + static BOOL gIsXMLLintAvailable = NO; + + if (!gHasCheckedAvailability) { + gIsXMLLintAvailable = [[NSFileManager defaultManager] fileExistsAtPath:kXMLLintPath]; + gHasCheckedAvailability = YES; + } + if (gIsXMLLintAvailable + && inputData.length > 5 + && strncmp(inputData.bytes, " 0) { + // success + inputData = formattedData; + } + } +#else + // we can't call external tasks on the iPhone; leave the XML unformatted +#endif + + NSString *dataStr = [[NSString alloc] initWithData:inputData + encoding:NSUTF8StringEncoding]; + return dataStr; +} + +// stringFromStreamData creates a string given the supplied data +// +// If NSString can create a UTF-8 string from the data, then that is returned. +// +// Otherwise, this routine tries to find a MIME boundary at the beginning of the data block, and +// uses that to break up the data into parts. Each part will be used to try to make a UTF-8 string. +// For parts that fail, a replacement string showing the part header and <> is supplied +// in place of the binary data. + +- (NSString *)stringFromStreamData:(NSData *)data + contentType:(NSString *)contentType { + + if (!data) return nil; + + // optimistically, see if the whole data block is UTF-8 + NSString *streamDataStr = [self formattedStringFromData:data + contentType:contentType + JSON:NULL]; + if (streamDataStr) return streamDataStr; + + // Munge a buffer by replacing non-ASCII bytes with underscores, and turn that munged buffer an + // NSString. That gives us a string we can use with NSScanner. + NSMutableData *mutableData = [NSMutableData dataWithData:data]; + unsigned char *bytes = (unsigned char *)mutableData.mutableBytes; + + for (unsigned int idx = 0; idx < mutableData.length; ++idx) { + if (bytes[idx] > 0x7F || bytes[idx] == 0) { + bytes[idx] = '_'; + } + } + + NSString *mungedStr = [[NSString alloc] initWithData:mutableData + encoding:NSUTF8StringEncoding]; + if (mungedStr) { + + // scan for the boundary string + NSString *boundary = nil; + NSScanner *scanner = [NSScanner scannerWithString:mungedStr]; + + if ([scanner scanUpToString:@"\r\n" intoString:&boundary] + && [boundary hasPrefix:@"--"]) { + + // we found a boundary string; use it to divide the string into parts + NSArray *mungedParts = [mungedStr componentsSeparatedByString:boundary]; + + // look at each munged part in the original string, and try to convert those into UTF-8 + NSMutableArray *origParts = [NSMutableArray array]; + NSUInteger offset = 0; + for (NSString *mungedPart in mungedParts) { + NSUInteger partSize = mungedPart.length; + NSData *origPartData = [data subdataWithRange:NSMakeRange(offset, partSize)]; + NSString *origPartStr = [[NSString alloc] initWithData:origPartData + encoding:NSUTF8StringEncoding]; + if (origPartStr) { + // we could make this original part into UTF-8; use the string + [origParts addObject:origPartStr]; + } else { + // this part can't be made into UTF-8; scan the header, if we can + NSString *header = nil; + NSScanner *headerScanner = [NSScanner scannerWithString:mungedPart]; + if (![headerScanner scanUpToString:@"\r\n\r\n" intoString:&header]) { + // we couldn't find a header + header = @""; + } + // make a part string with the header and <> + NSString *binStr = [NSString stringWithFormat:@"\r%@\r<<%lu bytes>>\r", + header, (long)(partSize - header.length)]; + [origParts addObject:binStr]; + } + offset += partSize + boundary.length; + } + // rejoin the original parts + streamDataStr = [origParts componentsJoinedByString:boundary]; + } + } + if (!streamDataStr) { + // give up; just make a string showing the uploaded bytes + streamDataStr = [NSString stringWithFormat:@"<<%u bytes>>", (unsigned int)data.length]; + } + return streamDataStr; +} + +// logFetchWithError is called following a successful or failed fetch attempt +// +// This method does all the work for appending to and creating log files + +- (void)logFetchWithError:(NSError *)error { + if (![[self class] isLoggingEnabled]) return; + NSString *logDirectory = [[self class] logDirectoryForCurrentRun]; + if (!logDirectory) return; + NSString *processName = [[self class] loggingProcessName]; + + // TODO: add Javascript to display response data formatted in hex + + // each response's NSData goes into its own xml or txt file, though all responses for this run of + // the app share a main html file. This counter tracks all fetch responses for this app run. + // + // we'll use a local variable since this routine may be reentered while waiting for XML formatting + // to be completed by an external task + static int gResponseCounter = 0; + int responseCounter = ++gResponseCounter; + + NSURLResponse *response = [self response]; + NSDictionary *responseHeaders = [self responseHeaders]; + NSString *responseDataStr = nil; + NSDictionary *responseJSON = nil; + + // if there's response data, decide what kind of file to put it in based on the first bytes of the + // file or on the mime type supplied by the server + NSString *responseMIMEType = [response MIMEType]; + BOOL isResponseImage = NO; + + // file name for an image data file + NSString *responseDataFileName = nil; + + int64_t responseDataLength = self.downloadedLength; + if (responseDataLength > 0) { + NSData *downloadedData = self.downloadedData; + if (downloadedData == nil + && responseDataLength > 0 + && responseDataLength < 20000 + && self.destinationFileURL) { + // There's a download file that's not too big, so get the data to display from the downloaded + // file. + NSURL *destinationURL = self.destinationFileURL; + downloadedData = [NSData dataWithContentsOfURL:destinationURL]; + } + NSString *responseType = [responseHeaders valueForKey:@"Content-Type"]; + responseDataStr = [self formattedStringFromData:downloadedData + contentType:responseType + JSON:&responseJSON]; + NSString *responseDataExtn = nil; + NSData *dataToWrite = nil; + if (responseDataStr) { + // we were able to make a UTF-8 string from the response data + if ([responseMIMEType isEqual:@"application/atom+xml"] + || [responseMIMEType hasSuffix:@"/xml"]) { + responseDataExtn = @"xml"; + dataToWrite = [responseDataStr dataUsingEncoding:NSUTF8StringEncoding]; + } + } else if ([responseMIMEType isEqual:@"image/jpeg"]) { + responseDataExtn = @"jpg"; + dataToWrite = downloadedData; + isResponseImage = YES; + } else if ([responseMIMEType isEqual:@"image/gif"]) { + responseDataExtn = @"gif"; + dataToWrite = downloadedData; + isResponseImage = YES; + } else if ([responseMIMEType isEqual:@"image/png"]) { + responseDataExtn = @"png"; + dataToWrite = downloadedData; + isResponseImage = YES; + } else { + // add more non-text types here + } + // if we have an extension, save the raw data in a file with that extension + if (responseDataExtn && dataToWrite) { + // generate a response file base name like + NSString *responseBaseName = [NSString stringWithFormat:@"fetch_%d_response", responseCounter]; + responseDataFileName = [responseBaseName stringByAppendingPathExtension:responseDataExtn]; + NSString *responseDataFilePath = [logDirectory stringByAppendingPathComponent:responseDataFileName]; + + NSError *downloadedError = nil; + if (gIsLoggingToFile && ![dataToWrite writeToFile:responseDataFilePath + options:0 + error:&downloadedError]) { + NSLog(@"%@ logging write error:%@ (%@)", [self class], downloadedError, responseDataFileName); + } + } + } + // we'll have one main html file per run of the app + NSString *htmlName = [[self class] htmlFileName]; + NSString *htmlPath =[logDirectory stringByAppendingPathComponent:htmlName]; + + // if the html file exists (from logging previous fetches) we don't need + // to re-write the header or the scripts + NSFileManager *fileMgr = [NSFileManager defaultManager]; + BOOL didFileExist = [fileMgr fileExistsAtPath:htmlPath]; + + NSMutableString* outputHTML = [NSMutableString string]; + + // we need a header to say we'll have UTF-8 text + if (!didFileExist) { + [outputHTML appendFormat:@"%@ HTTP fetch log %@", + processName, [[self class] loggingDateStamp]]; + } + // now write the visible html elements + NSString *copyableFileName = [NSString stringWithFormat:@"fetch_%d.txt", responseCounter]; + + NSDate *now = [NSDate date]; + // write the date & time, the comment, and the link to the plain-text (copyable) log + [outputHTML appendFormat:@"%@      ", now]; + + NSString *comment = [self comment]; + if (comment.length > 0) { + [outputHTML appendFormat:@"%@      ", comment]; + } + [outputHTML appendFormat:@"request/response log
", copyableFileName]; + NSTimeInterval elapsed = -self.initialBeginFetchDate.timeIntervalSinceNow; + [outputHTML appendFormat:@"elapsed: %5.3fsec
", elapsed]; + + // write the request URL + NSURLRequest *request = self.request; + NSString *requestMethod = request.HTTPMethod; + NSURL *requestURL = request.URL; + + // Save the request URL for next time in case this redirects. + NSString *redirectedFromURLString = [self.redirectedFromURL absoluteString]; + self.redirectedFromURL = [requestURL copy]; + if (redirectedFromURLString) { + [outputHTML appendFormat:@"redirected from %@
", + redirectedFromURLString]; + } + [outputHTML appendFormat:@"request: %@ %@
\n", requestMethod, requestURL]; + + // write the request headers + NSDictionary *requestHeaders = request.allHTTPHeaderFields; + NSUInteger numberOfRequestHeaders = requestHeaders.count; + if (numberOfRequestHeaders > 0) { + // Indicate if the request is authorized; warn if the request is authorized but non-SSL + NSString *auth = [requestHeaders objectForKey:@"Authorization"]; + NSString *headerDetails = @""; + if (auth) { + BOOL isInsecure = [[requestURL scheme] isEqual:@"http"]; + if (isInsecure) { + // 26A0 = ⚠ + headerDetails = + @"   authorized, non-SSL "; + } else { + headerDetails = @"   authorized"; + } + } + NSString *cookiesHdr = [requestHeaders objectForKey:@"Cookie"]; + if (cookiesHdr) { + headerDetails = [headerDetails stringByAppendingString:@"   cookies"]; + } + NSString *matchHdr = [requestHeaders objectForKey:@"If-Match"]; + if (matchHdr) { + headerDetails = [headerDetails stringByAppendingString:@"   if-match"]; + } + matchHdr = [requestHeaders objectForKey:@"If-None-Match"]; + if (matchHdr) { + headerDetails = [headerDetails stringByAppendingString:@"   if-none-match"]; + } + [outputHTML appendFormat:@"   headers: %d %@
", + (int)numberOfRequestHeaders, headerDetails]; + } else { + [outputHTML appendFormat:@"   headers: none
"]; + } + // write the request post data + NSData *bodyData = nil; + NSData *loggedStreamData = self.loggedStreamData; + if (loggedStreamData) { + bodyData = loggedStreamData; + } else { + bodyData = self.bodyData; + if (bodyData == nil) { + bodyData = self.request.HTTPBody; + } + } + uint64_t bodyDataLength = bodyData.length; + + if (bodyData.length == 0) { + // If the data is in a body upload file URL, read that in if it's not huge. + NSURL *bodyFileURL = self.bodyFileURL; + if (bodyFileURL) { + NSNumber *fileSizeNum = nil; + NSError *fileSizeError = nil; + if ([bodyFileURL getResourceValue:&fileSizeNum + forKey:NSURLFileSizeKey + error:&fileSizeError]) { + bodyDataLength = [fileSizeNum unsignedLongLongValue]; + if (bodyDataLength > 0 && bodyDataLength < 50000) { + bodyData = [NSData dataWithContentsOfURL:bodyFileURL + options:NSDataReadingUncached + error:&fileSizeError]; + } + } + } + } + NSString *bodyDataStr = nil; + NSString *postType = [requestHeaders valueForKey:@"Content-Type"]; + + if (bodyDataLength > 0) { + [outputHTML appendFormat:@"   data: %llu bytes, %@
\n", + bodyDataLength, postType ? postType : @"(no type)"]; + NSString *logRequestBody = self.logRequestBody; + if (logRequestBody) { + bodyDataStr = [logRequestBody copy]; + self.logRequestBody = nil; + } else { + bodyDataStr = [self stringFromStreamData:bodyData + contentType:postType]; + if (bodyDataStr) { + // remove OAuth 2 client secret and refresh token + bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr + betweenStartString:@"client_secret=" + endString:@"&"]; + bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr + betweenStartString:@"refresh_token=" + endString:@"&"]; + // remove ClientLogin password + bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr + betweenStartString:@"&Passwd=" + endString:@"&"]; + } + } + } else { + // no post data + } + // write the response status, MIME type, URL + NSInteger status = [self statusCode]; + if (response) { + NSString *statusString = @""; + if (status != 0) { + if (status == 200 || status == 201) { + statusString = [NSString stringWithFormat:@"%ld", (long)status]; + + // report any JSON-RPC error + if ([responseJSON isKindOfClass:[NSDictionary class]]) { + NSDictionary *jsonError = [responseJSON objectForKey:@"error"]; + if ([jsonError isKindOfClass:[NSDictionary class]]) { + NSString *jsonCode = [[jsonError valueForKey:@"code"] description]; + NSString *jsonMessage = [jsonError valueForKey:@"message"]; + if (jsonCode || jsonMessage) { + // 2691 = ⚑ + NSString *const jsonErrFmt = + @"   JSON error: %@ %@  ⚑"; + statusString = [statusString stringByAppendingFormat:jsonErrFmt, + jsonCode ? jsonCode : @"", + jsonMessage ? jsonMessage : @""]; + } + } + } + } else { + // purple for anything other than 200 or 201 + NSString *flag = status >= 400 ? @" ⚑" : @""; // 2691 = ⚑ + NSString *explanation = [NSHTTPURLResponse localizedStringForStatusCode:status]; + NSString *const statusFormat = @"%ld %@ %@"; + statusString = [NSString stringWithFormat:statusFormat, (long)status, explanation, flag]; + } + } + // show the response URL only if it's different from the request URL + NSString *responseURLStr = @""; + NSURL *responseURL = response.URL; + + if (responseURL && ![responseURL isEqual:request.URL]) { + NSString *const responseURLFormat = + @"response URL: %@
\n"; + responseURLStr = [NSString stringWithFormat:responseURLFormat, [responseURL absoluteString]]; + } + [outputHTML appendFormat:@"response:  status %@
\n%@", + statusString, responseURLStr]; + // Write the response headers + NSUInteger numberOfResponseHeaders = responseHeaders.count; + if (numberOfResponseHeaders > 0) { + // Indicate if the server is setting cookies + NSString *cookiesSet = [responseHeaders valueForKey:@"Set-Cookie"]; + NSString *cookiesStr = + cookiesSet ? @"  sets cookies" : @""; + // Indicate if the server is redirecting + NSString *location = [responseHeaders valueForKey:@"Location"]; + BOOL isRedirect = status >= 300 && status <= 399 && location != nil; + NSString *redirectsStr = + isRedirect ? @"  redirects" : @""; + [outputHTML appendFormat:@"   headers: %d %@ %@
\n", + (int)numberOfResponseHeaders, cookiesStr, redirectsStr]; + } else { + [outputHTML appendString:@"   headers: none
\n"]; + } + } + // error + if (error) { + [outputHTML appendFormat:@"Error: %@
\n", error.description]; + } + // Write the response data + if (responseDataFileName) { + if (isResponseImage) { + // Make a small inline image that links to the full image file + [outputHTML appendFormat:@"   data: %lld bytes, %@
", + responseDataLength, responseMIMEType]; + NSString *const fmt = + @"image\n"; + [outputHTML appendFormat:fmt, responseDataFileName, responseDataFileName]; + } else { + // The response data was XML; link to the xml file + NSString *const fmt = + @"   data: %lld bytes, %@   %@\n"; + [outputHTML appendFormat:fmt, responseDataLength, responseMIMEType, + responseDataFileName, [responseDataFileName pathExtension]]; + } + } else { + // The response data was not an image; just show the length and MIME type + [outputHTML appendFormat:@"   data: %lld bytes, %@\n", + responseDataLength, responseMIMEType ? responseMIMEType : @"(no response type)"]; + } + // Make a single string of the request and response, suitable for copying + // to the clipboard and pasting into a bug report + NSMutableString *copyable = [NSMutableString string]; + if (comment) { + [copyable appendFormat:@"%@\n\n", comment]; + } + [copyable appendFormat:@"%@ elapsed: %5.3fsec\n", now, elapsed]; + if (redirectedFromURLString) { + [copyable appendFormat:@"Redirected from %@\n", redirectedFromURLString]; + } + [copyable appendFormat:@"Request: %@ %@\n", requestMethod, requestURL]; + if (requestHeaders.count > 0) { + [copyable appendFormat:@"Request headers:\n%@\n", + [[self class] headersStringForDictionary:requestHeaders]]; + } + if (bodyDataLength > 0) { + [copyable appendFormat:@"Request body: (%llu bytes)\n", bodyDataLength]; + if (bodyDataStr) { + [copyable appendFormat:@"%@\n", bodyDataStr]; + } + [copyable appendString:@"\n"]; + } + if (response) { + [copyable appendFormat:@"Response: status %d\n", (int) status]; + [copyable appendFormat:@"Response headers:\n%@\n", + [[self class] headersStringForDictionary:responseHeaders]]; + [copyable appendFormat:@"Response body: (%lld bytes)\n", responseDataLength]; + if (responseDataLength > 0) { + NSString *logResponseBody = self.logResponseBody; + if (logResponseBody) { + // The user has provided the response body text. + responseDataStr = [logResponseBody copy]; + self.logResponseBody = nil; + } + if (responseDataStr != nil) { + [copyable appendFormat:@"%@\n", responseDataStr]; + } else { + // Even though it's redundant, we'll put in text to indicate that all the bytes are binary. + if (self.destinationFileURL) { + [copyable appendFormat:@"<<%lld bytes>> to file %@\n", + responseDataLength, self.destinationFileURL.path]; + } else { + [copyable appendFormat:@"<<%lld bytes>>\n", responseDataLength]; + } + } + } + } + if (error) { + [copyable appendFormat:@"Error: %@\n", error]; + } + // Save to log property before adding the separator + self.log = copyable; + + [copyable appendString:@"-----------------------------------------------------------\n"]; + + // Write the copyable version to another file (linked to at the top of the html file, above) + // + // Ideally, something to just copy this to the clipboard like + // Copy here." + // would work everywhere, but it only works in Safari as of 8/2010 + if (gIsLoggingToFile) { + NSString *parentDir = [[self class] loggingDirectory]; + NSString *copyablePath = [logDirectory stringByAppendingPathComponent:copyableFileName]; + NSError *copyableError = nil; + if (![copyable writeToFile:copyablePath + atomically:NO + encoding:NSUTF8StringEncoding + error:©ableError]) { + // Error writing to file + NSLog(@"%@ logging write error:%@ (%@)", [self class], copyableError, copyablePath); + } + [outputHTML appendString:@"

"]; + + // Append the HTML to the main output file + const char* htmlBytes = outputHTML.UTF8String; + NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:htmlPath + append:YES]; + [stream open]; + [stream write:(const uint8_t *) htmlBytes maxLength:strlen(htmlBytes)]; + [stream close]; + + // Make a symlink to the latest html + NSString *const symlinkNameSuffix = [[self class] symlinkNameSuffix]; + NSString *symlinkName = [processName stringByAppendingString:symlinkNameSuffix]; + NSString *symlinkPath = [parentDir stringByAppendingPathComponent:symlinkName]; + + [fileMgr removeItemAtPath:symlinkPath error:NULL]; + [fileMgr createSymbolicLinkAtPath:symlinkPath + withDestinationPath:htmlPath + error:NULL]; +#if TARGET_OS_IPHONE + static BOOL gReportedLoggingPath = NO; + if (!gReportedLoggingPath) { + gReportedLoggingPath = YES; + NSLog(@"GTMSessionFetcher logging to \"%@\"", parentDir); + } +#endif + } +} + +- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream { + if (!inputStream) return nil; + if (![GTMSessionFetcher isLoggingEnabled]) return inputStream; + + [self clearLoggedStreamData]; // Clear any previous data. + Class monitorClass = NSClassFromString(@"GTMReadMonitorInputStream"); + if (!monitorClass) { + NSString const *str = @"<>"; + NSData *stringData = [str dataUsingEncoding:NSUTF8StringEncoding]; + [self appendLoggedStreamData:stringData]; + return inputStream; + } + inputStream = [monitorClass inputStreamWithStream:inputStream]; + + GTMReadMonitorInputStream *readMonitorInputStream = (GTMReadMonitorInputStream *)inputStream; + [readMonitorInputStream setReadDelegate:self]; + SEL readSel = @selector(inputStream:readIntoBuffer:length:); + [readMonitorInputStream setReadSelector:readSel]; + + return inputStream; +} + +- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: + (GTMSessionFetcherBodyStreamProvider)streamProvider { + if (!streamProvider) return nil; + if (![GTMSessionFetcher isLoggingEnabled]) return streamProvider; + + [self clearLoggedStreamData]; // Clear any previous data. + Class monitorClass = NSClassFromString(@"GTMReadMonitorInputStream"); + if (!monitorClass) { + NSString const *str = @"<>"; + NSData *stringData = [str dataUsingEncoding:NSUTF8StringEncoding]; + [self appendLoggedStreamData:stringData]; + return streamProvider; + } + GTMSessionFetcherBodyStreamProvider loggedStreamProvider = + ^(GTMSessionFetcherBodyStreamProviderResponse response) { + streamProvider(^(NSInputStream *bodyStream) { + bodyStream = [self loggedInputStreamForInputStream:bodyStream]; + response(bodyStream); + }); + }; + return loggedStreamProvider; +} + +@end + +@implementation GTMSessionFetcher (GTMSessionFetcherLoggingUtilities) + +- (void)inputStream:(GTMReadMonitorInputStream *)stream + readIntoBuffer:(void *)buffer + length:(int64_t)length { + // append the captured data + NSData *data = [NSData dataWithBytesNoCopy:buffer + length:(NSUInteger)length + freeWhenDone:NO]; + [self appendLoggedStreamData:data]; +} + +#pragma mark Fomatting Utilities + ++ (NSString *)snipSubstringOfString:(NSString *)originalStr + betweenStartString:(NSString *)startStr + endString:(NSString *)endStr { +#if SKIP_GTM_FETCH_LOGGING_SNIPPING + return originalStr; +#else + if (!originalStr) return nil; + + // Find the start string, and replace everything between it + // and the end string (or the end of the original string) with "_snip_" + NSRange startRange = [originalStr rangeOfString:startStr]; + if (startRange.location == NSNotFound) return originalStr; + + // We found the start string + NSUInteger originalLength = originalStr.length; + NSUInteger startOfTarget = NSMaxRange(startRange); + NSRange targetAndRest = NSMakeRange(startOfTarget, originalLength - startOfTarget); + NSRange endRange = [originalStr rangeOfString:endStr + options:0 + range:targetAndRest]; + NSRange replaceRange; + if (endRange.location == NSNotFound) { + // Found no end marker so replace to end of string + replaceRange = targetAndRest; + } else { + // Replace up to the endStr + replaceRange = NSMakeRange(startOfTarget, endRange.location - startOfTarget); + } + NSString *result = [originalStr stringByReplacingCharactersInRange:replaceRange + withString:@"_snip_"]; + return result; +#endif // SKIP_GTM_FETCH_LOGGING_SNIPPING +} + ++ (NSString *)headersStringForDictionary:(NSDictionary *)dict { + // Format the dictionary in http header style, like + // Accept: application/json + // Cache-Control: no-cache + // Content-Type: application/json; charset=utf-8 + // + // Pad the key names, but not beyond 16 chars, since long custom header + // keys just create too much whitespace + NSArray *keys = [dict.allKeys sortedArrayUsingSelector:@selector(compare:)]; + + NSMutableString *str = [NSMutableString string]; + for (NSString *key in keys) { + NSString *value = [dict valueForKey:key]; + if ([key isEqual:@"Authorization"]) { + // Remove OAuth 1 token + value = [[self class] snipSubstringOfString:value + betweenStartString:@"oauth_token=\"" + endString:@"\""]; + + // Remove OAuth 2 bearer token (draft 16, and older form) + value = [[self class] snipSubstringOfString:value + betweenStartString:@"Bearer " + endString:@"\n"]; + value = [[self class] snipSubstringOfString:value + betweenStartString:@"OAuth " + endString:@"\n"]; + + // Remove Google ClientLogin + value = [[self class] snipSubstringOfString:value + betweenStartString:@"GoogleLogin auth=" + endString:@"\n"]; + } + [str appendFormat:@" %@: %@\n", key, value]; + } + return str; +} + +@end + +#endif // !STRIP_GTM_FETCH_LOGGING diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h new file mode 100644 index 00000000..312abaa7 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h @@ -0,0 +1,196 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// For best performance and convenient usage, fetchers should be generated by a common +// GTMSessionFetcherService instance, like +// +// _fetcherService = [[GTMSessionFetcherService alloc] init]; +// GTMSessionFetcher* myFirstFetcher = [_fetcherService fetcherWithRequest:request1]; +// GTMSessionFetcher* mySecondFetcher = [_fetcherService fetcherWithRequest:request2]; + +#import "GTMSessionFetcher.h" + +GTM_ASSUME_NONNULL_BEGIN + +// Notifications. + +// This notification indicates a reusable session has become invalid. It is intended mainly for the +// service's unit tests. +// +// The notification object is the fetcher service. +// The invalid session is provided via the userInfo kGTMSessionFetcherServiceSessionKey key. +extern NSString *const kGTMSessionFetcherServiceSessionBecameInvalidNotification; +extern NSString *const kGTMSessionFetcherServiceSessionKey; + +@interface GTMSessionFetcherService : NSObject + +// Queues of delayed and running fetchers. Each dictionary contains arrays +// of GTMSessionFetcher *fetchers, keyed by NSString *host +@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSArray *) *delayedFetchersByHost; +@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSArray *) *runningFetchersByHost; + +// A max value of 0 means no fetchers should be delayed. +// The default limit is 10 simultaneous fetchers targeting each host. +// This does not apply to fetchers whose useBackgroundSession property is YES. Since services are +// not resurrected on an app relaunch, delayed fetchers would effectively be abandoned. +@property(atomic, assign) NSUInteger maxRunningFetchersPerHost; + +// Properties to be applied to each fetcher; see GTMSessionFetcher.h for descriptions +@property(atomic, strong, GTM_NULLABLE) NSURLSessionConfiguration *configuration; +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherConfigurationBlock configurationBlock; +@property(atomic, strong, GTM_NULLABLE) NSHTTPCookieStorage *cookieStorage; +@property(atomic, strong, GTM_NULL_RESETTABLE) dispatch_queue_t callbackQueue; +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherChallengeBlock challengeBlock; +@property(atomic, strong, GTM_NULLABLE) NSURLCredential *credential; +@property(atomic, strong) NSURLCredential *proxyCredential; +@property(atomic, copy, GTM_NULLABLE) GTM_NSArrayOf(NSString *) *allowedInsecureSchemes; +@property(atomic, assign) BOOL allowLocalhostRequest; +@property(atomic, assign) BOOL allowInvalidServerCertificates; +@property(atomic, assign, getter=isRetryEnabled) BOOL retryEnabled; +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherRetryBlock retryBlock; +@property(atomic, assign) NSTimeInterval maxRetryInterval; +@property(atomic, assign) NSTimeInterval minRetryInterval; +@property(atomic, copy, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, id) *properties; +@property(atomic, copy, GTM_NULLABLE) + GTMSessionFetcherMetricsCollectionBlock metricsCollectionBlock API_AVAILABLE( + ios(10.0), macosx(10.12), tvos(10.0), watchos(3.0)); + +#if GTM_BACKGROUND_TASK_FETCHING +@property(atomic, assign) BOOL skipBackgroundTask; +#endif + +// A default useragent of GTMFetcherStandardUserAgentString(nil) will be given to each fetcher +// created by this service unless the request already has a user-agent header set. +// This default will be added starting with builds with the SDKs for OS X 10.11 and iOS 9. +// +// To use the configuration's default user agent, set this property to nil. +@property(atomic, copy, GTM_NULLABLE) NSString *userAgent; + +// The authorizer to attach to the created fetchers. If a specific fetcher should +// not authorize its requests, the fetcher's authorizer property may be set to nil +// before the fetch begins. +@property(atomic, strong, GTM_NULLABLE) id authorizer; + +// Delegate queue used by the session when calling back to the fetcher. The default +// is the main queue. Changing this does not affect the queue used to call back to the +// application; that is specified by the callbackQueue property above. +@property(atomic, strong, GTM_NULL_RESETTABLE) NSOperationQueue *sessionDelegateQueue; + +// When enabled, indicates the same session should be used by subsequent fetchers. +// +// This is enabled by default. +@property(atomic, assign) BOOL reuseSession; + +// Sets the delay until an unused session is invalidated. +// The default interval is 60 seconds. +// +// If the interval is set to 0, then any reused session is not invalidated except by +// explicitly invoking -resetSession. Be aware that setting the interval to 0 thus +// causes the session's delegate to be retained until the session is explicitly reset. +@property(atomic, assign) NSTimeInterval unusedSessionTimeout; + +// If shouldReuseSession is enabled, this will force creation of a new session when future +// fetchers begin. +- (void)resetSession; + +// Create a fetcher +// +// These methods will return a fetcher. If successfully created, the connection +// will hold a strong reference to it for the life of the connection as well. +// So the caller doesn't have to hold onto the fetcher explicitly unless they +// want to be able to monitor or cancel it. +- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request; +- (GTMSessionFetcher *)fetcherWithURL:(NSURL *)requestURL; +- (GTMSessionFetcher *)fetcherWithURLString:(NSString *)requestURLString; + +// Common method for fetcher creation. +// +// -fetcherWithRequest:fetcherClass: may be overridden to customize creation of +// fetchers. This is the ONLY method in the GTMSessionFetcher library intended to +// be overridden. +- (id)fetcherWithRequest:(NSURLRequest *)request + fetcherClass:(Class)fetcherClass; + +- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher; + +- (NSUInteger)numberOfFetchers; // running + delayed fetchers +- (NSUInteger)numberOfRunningFetchers; +- (NSUInteger)numberOfDelayedFetchers; + +// Return a list of all running or delayed fetchers. This includes fetchers created +// by the service which have been started and have not yet stopped. +// +// Returns an array of fetcher objects, or nil if none. +- (GTM_NULLABLE GTM_NSArrayOf(GTMSessionFetcher *) *)issuedFetchers; + +// Search for running or delayed fetchers with the specified URL. +// +// Returns an array of fetcher objects found, or nil if none found. +- (GTM_NULLABLE GTM_NSArrayOf(GTMSessionFetcher *) *)issuedFetchersWithRequestURL:(NSURL *)requestURL; + +- (void)stopAllFetchers; + +// Methods for use by the fetcher class only. +- (GTM_NULLABLE NSURLSession *)session; +- (GTM_NULLABLE NSURLSession *)sessionForFetcherCreation; +- (GTM_NULLABLE id)sessionDelegate; +- (GTM_NULLABLE NSDate *)stoppedAllFetchersDate; + +// The testBlock can inspect its fetcher parameter's request property to +// determine which fetcher is being faked. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherTestBlock testBlock; + +@end + +@interface GTMSessionFetcherService (TestingSupport) + +// Convenience methods to create a fetcher service for testing. +// +// Fetchers generated by this mock fetcher service will not perform any +// network operation, but will invoke callbacks and provide the supplied data +// or error to the completion handler. +// +// You can make more customized mocks by setting the test block property of the service +// or fetcher; the test block can inspect the fetcher's request or other properties. +// +// See the description of the testBlock property below. ++ (instancetype)mockFetcherServiceWithFakedData:(GTM_NULLABLE NSData *)fakedDataOrNil + fakedError:(GTM_NULLABLE NSError *)fakedErrorOrNil; ++ (instancetype)mockFetcherServiceWithFakedData:(GTM_NULLABLE NSData *)fakedDataOrNil + fakedResponse:(NSHTTPURLResponse *)fakedResponse + fakedError:(GTM_NULLABLE NSError *)fakedErrorOrNil; + +// Spin the run loop and discard events (or, if not on the main thread, just sleep the thread) +// until all running and delayed fetchers have completed. +// +// This is only for use in testing or in tools without a user interface. +// +// Synchronous fetches should never be done by shipping apps; they are +// sufficient reason for rejection from the app store. +// +// Returns NO if timed out. +- (BOOL)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds; + +@end + +@interface GTMSessionFetcherService (BackwardsCompatibilityOnly) + +// Clients using GTMSessionFetcher should set the cookie storage explicitly themselves. +// This method is just for compatibility with the old fetcher. +@property(atomic, assign) NSInteger cookieStorageMethod; + +@end + +GTM_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m new file mode 100644 index 00000000..f9942c01 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m @@ -0,0 +1,1381 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMSessionFetcherService.h" + +NSString *const kGTMSessionFetcherServiceSessionBecameInvalidNotification + = @"kGTMSessionFetcherServiceSessionBecameInvalidNotification"; +NSString *const kGTMSessionFetcherServiceSessionKey + = @"kGTMSessionFetcherServiceSessionKey"; + +#if !GTMSESSION_BUILD_COMBINED_SOURCES +@interface GTMSessionFetcher (ServiceMethods) +- (BOOL)beginFetchMayDelay:(BOOL)mayDelay + mayAuthorize:(BOOL)mayAuthorize; +@end +#endif // !GTMSESSION_BUILD_COMBINED_SOURCES + +@interface GTMSessionFetcherService () + +@property(atomic, strong, readwrite) NSDictionary *delayedFetchersByHost; +@property(atomic, strong, readwrite) NSDictionary *runningFetchersByHost; + +@end + +// Since NSURLSession doesn't support a separate delegate per task (!), instances of this +// class serve as a session delegate trampoline. +// +// This class maps a session's tasks to fetchers, and resends delegate messages to the task's +// fetcher. +@interface GTMSessionFetcherSessionDelegateDispatcher : NSObject + +// The session for the tasks in this dispatcher's task-to-fetcher map. +@property(atomic) NSURLSession *session; + +// The timer interval for invalidating a session that has no active tasks. +@property(atomic) NSTimeInterval discardInterval; + +// The current discard timer. +@property(atomic, readonly) NSTimer *discardTimer; + + +- (instancetype)initWithParentService:(GTMSessionFetcherService *)parentService + sessionDiscardInterval:(NSTimeInterval)discardInterval; + +- (void)setFetcher:(GTMSessionFetcher *)fetcher + forTask:(NSURLSessionTask *)task; +- (void)removeFetcher:(GTMSessionFetcher *)fetcher; + +// Before using a session, tells the delegate dispatcher to stop the discard timer. +- (void)startSessionUsage; + +// When abandoning a delegate dispatcher, we want to avoid the session retaining +// the delegate after tasks complete. +- (void)abandon; + +@end + + +@implementation GTMSessionFetcherService { + NSMutableDictionary *_delayedFetchersByHost; + NSMutableDictionary *_runningFetchersByHost; + NSUInteger _maxRunningFetchersPerHost; + + // When this ivar is nil, the service will not reuse sessions. + GTMSessionFetcherSessionDelegateDispatcher *_delegateDispatcher; + + // Fetchers will wait on this if another fetcher is creating the shared NSURLSession. + dispatch_semaphore_t _sessionCreationSemaphore; + + dispatch_queue_t _callbackQueue; + NSOperationQueue *_delegateQueue; + NSHTTPCookieStorage *_cookieStorage; + NSString *_userAgent; + NSTimeInterval _timeout; + + NSURLCredential *_credential; // Username & password. + NSURLCredential *_proxyCredential; // Credential supplied to proxy servers. + + NSInteger _cookieStorageMethod; + + id _authorizer; + + // For waitForCompletionOfAllFetchersWithTimeout: we need to wait on stopped fetchers since + // they've not yet finished invoking their queued callbacks. This array is nil except when + // waiting on fetchers. + NSMutableArray *_stoppedFetchersToWaitFor; + + // For fetchers that enqueued their callbacks before stopAllFetchers was called on the service, + // set a barrier so the callbacks know to bail out. + NSDate *_stoppedAllFetchersDate; +} + +@synthesize maxRunningFetchersPerHost = _maxRunningFetchersPerHost, + configuration = _configuration, + configurationBlock = _configurationBlock, + cookieStorage = _cookieStorage, + userAgent = _userAgent, + challengeBlock = _challengeBlock, + credential = _credential, + proxyCredential = _proxyCredential, + allowedInsecureSchemes = _allowedInsecureSchemes, + allowLocalhostRequest = _allowLocalhostRequest, + allowInvalidServerCertificates = _allowInvalidServerCertificates, + retryEnabled = _retryEnabled, + retryBlock = _retryBlock, + maxRetryInterval = _maxRetryInterval, + minRetryInterval = _minRetryInterval, + metricsCollectionBlock = _metricsCollectionBlock, + properties = _properties, + unusedSessionTimeout = _unusedSessionTimeout, + testBlock = _testBlock; + +#if GTM_BACKGROUND_TASK_FETCHING +@synthesize skipBackgroundTask = _skipBackgroundTask; +#endif + +- (instancetype)init { + self = [super init]; + if (self) { + _delayedFetchersByHost = [[NSMutableDictionary alloc] init]; + _runningFetchersByHost = [[NSMutableDictionary alloc] init]; + _maxRunningFetchersPerHost = 10; + _cookieStorageMethod = -1; + _unusedSessionTimeout = 60.0; + _delegateDispatcher = + [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self + sessionDiscardInterval:_unusedSessionTimeout]; + _callbackQueue = dispatch_get_main_queue(); + + _delegateQueue = [[NSOperationQueue alloc] init]; + _delegateQueue.maxConcurrentOperationCount = 1; + _delegateQueue.name = @"com.google.GTMSessionFetcher.NSURLSessionDelegateQueue"; + + _sessionCreationSemaphore = dispatch_semaphore_create(1); + + // Starting with the SDKs for OS X 10.11/iOS 9, the service has a default useragent. + // Apps can remove this and get the default system "CFNetwork" useragent by setting the + // fetcher service's userAgent property to nil. +#if (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0) + _userAgent = GTMFetcherStandardUserAgentString(nil); +#endif + } + return self; +} + +- (void)dealloc { + [self detachAuthorizer]; + [_delegateDispatcher abandon]; +} + +#pragma mark Generate a new fetcher + +// Clients may override this method. Clients should not override any other library methods. +- (id)fetcherWithRequest:(NSURLRequest *)request + fetcherClass:(Class)fetcherClass { + GTMSessionFetcher *fetcher = [[fetcherClass alloc] initWithRequest:request + configuration:self.configuration]; + fetcher.callbackQueue = self.callbackQueue; + fetcher.sessionDelegateQueue = self.sessionDelegateQueue; + fetcher.challengeBlock = self.challengeBlock; + fetcher.credential = self.credential; + fetcher.proxyCredential = self.proxyCredential; + fetcher.authorizer = self.authorizer; + fetcher.cookieStorage = self.cookieStorage; + fetcher.allowedInsecureSchemes = self.allowedInsecureSchemes; + fetcher.allowLocalhostRequest = self.allowLocalhostRequest; + fetcher.allowInvalidServerCertificates = self.allowInvalidServerCertificates; + fetcher.configurationBlock = self.configurationBlock; + fetcher.retryEnabled = self.retryEnabled; + fetcher.retryBlock = self.retryBlock; + fetcher.maxRetryInterval = self.maxRetryInterval; + fetcher.minRetryInterval = self.minRetryInterval; + if (@available(iOS 10.0, macOS 10.12, tvOS 10.0, watchOS 3.0, *)) { + fetcher.metricsCollectionBlock = self.metricsCollectionBlock; + } + fetcher.properties = self.properties; + fetcher.service = self; + if (self.cookieStorageMethod >= 0) { + [fetcher setCookieStorageMethod:self.cookieStorageMethod]; + } + +#if GTM_BACKGROUND_TASK_FETCHING + fetcher.skipBackgroundTask = self.skipBackgroundTask; +#endif + + NSString *userAgent = self.userAgent; + if (userAgent.length > 0 + && [request valueForHTTPHeaderField:@"User-Agent"] == nil) { + [fetcher setRequestValue:userAgent + forHTTPHeaderField:@"User-Agent"]; + } + fetcher.testBlock = self.testBlock; + + return fetcher; +} + +- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request { + return [self fetcherWithRequest:request + fetcherClass:[GTMSessionFetcher class]]; +} + +- (GTMSessionFetcher *)fetcherWithURL:(NSURL *)requestURL { + return [self fetcherWithRequest:[NSURLRequest requestWithURL:requestURL]]; +} + +- (GTMSessionFetcher *)fetcherWithURLString:(NSString *)requestURLString { + NSURL *url = [NSURL URLWithString:requestURLString]; + return [self fetcherWithURL:url]; +} + +// Returns a session for the fetcher's host, or nil. +- (NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSURLSession *session = _delegateDispatcher.session; + return session; + } +} + +// Returns a session for the fetcher's host, or nil. For shared sessions, this +// waits on a semaphore, blocking other fetchers while the caller creates the +// session if needed. +- (NSURLSession *)sessionForFetcherCreation { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + if (!_delegateDispatcher) { + // This fetcher is creating a non-shared session, so skip the semaphore usage. + return nil; + } + } + + // Wait if another fetcher is currently creating a session; avoid waiting + // inside the @synchronized block, as that can deadlock. + dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Before getting the NSURLSession for task creation, it is + // important to invalidate and nil out the session discard timer; otherwise + // the session can be invalidated between when it is returned to the + // fetcher, and when the fetcher attempts to create its NSURLSessionTask. + [_delegateDispatcher startSessionUsage]; + + NSURLSession *session = _delegateDispatcher.session; + if (session) { + // The calling fetcher will receive a preexisting session, so + // we can allow other fetchers to create a session. + dispatch_semaphore_signal(_sessionCreationSemaphore); + } else { + // No existing session was obtained, so the calling fetcher will create the session; + // it *must* invoke fetcherDidCreateSession: to signal the dispatcher's semaphore after + // the session has been created (or fails to be created) to avoid a hang. + } + return session; + } +} + +- (id)sessionDelegate { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateDispatcher; + } +} + +#pragma mark Queue Management + +- (void)addRunningFetcher:(GTMSessionFetcher *)fetcher + forHost:(NSString *)host { + // Add to the array of running fetchers for this host, creating the array if needed. + NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; + if (runningForHost == nil) { + runningForHost = [NSMutableArray arrayWithObject:fetcher]; + [_runningFetchersByHost setObject:runningForHost forKey:host]; + } else { + [runningForHost addObject:fetcher]; + } +} + +- (void)addDelayedFetcher:(GTMSessionFetcher *)fetcher + forHost:(NSString *)host { + // Add to the array of delayed fetchers for this host, creating the array if needed. + NSMutableArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; + if (delayedForHost == nil) { + delayedForHost = [NSMutableArray arrayWithObject:fetcher]; + [_delayedFetchersByHost setObject:delayedForHost forKey:host]; + } else { + [delayedForHost addObject:fetcher]; + } +} + +- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSString *host = fetcher.request.URL.host; + if (host == nil) { + return NO; + } + NSArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; + NSUInteger idx = [delayedForHost indexOfObjectIdenticalTo:fetcher]; + BOOL isDelayed = (delayedForHost != nil) && (idx != NSNotFound); + return isDelayed; + } +} + +- (BOOL)fetcherShouldBeginFetching:(GTMSessionFetcher *)fetcher { + // Entry point from the fetcher + NSURL *requestURL = fetcher.request.URL; + NSString *host = requestURL.host; + + // Addresses "file:///path" case where localhost is the implicit host. + if (host.length == 0 && [requestURL isFileURL]) { + host = @"localhost"; + } + + if (host.length == 0) { + // Data URIs legitimately have no host, reject other hostless URLs. + GTMSESSION_ASSERT_DEBUG([[requestURL scheme] isEqual:@"data"], @"%@ lacks host", fetcher); + return YES; + } + + BOOL shouldBeginResult; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; + if (runningForHost != nil + && [runningForHost indexOfObjectIdenticalTo:fetcher] != NSNotFound) { + GTMSESSION_ASSERT_DEBUG(NO, @"%@ was already running", fetcher); + return YES; + } + + BOOL shouldRunNow = (fetcher.usingBackgroundSession + || _maxRunningFetchersPerHost == 0 + || _maxRunningFetchersPerHost > + [[self class] numberOfNonBackgroundSessionFetchers:runningForHost]); + if (shouldRunNow) { + [self addRunningFetcher:fetcher forHost:host]; + shouldBeginResult = YES; + } else { + [self addDelayedFetcher:fetcher forHost:host]; + shouldBeginResult = NO; + } + } // @synchronized(self) + + // We'll save the host that serves as the key for this fetcher's array + // to avoid any chance of the underlying request changing, stranding + // the fetcher in the wrong array + fetcher.serviceHost = host; + + return shouldBeginResult; +} + +- (void)startFetcher:(GTMSessionFetcher *)fetcher { + [fetcher beginFetchMayDelay:NO + mayAuthorize:YES]; +} + +// Internal utility. Returns a fetcher's delegate if it's a dispatcher, or nil if the fetcher +// is its own delegate (possibly via proxy) and has no dispatcher. +- (GTMSessionFetcherSessionDelegateDispatcher *)delegateDispatcherForFetcher:(GTMSessionFetcher *)fetcher { + GTMSessionCheckNotSynchronized(self); + + NSURLSession *fetcherSession = fetcher.session; + if (fetcherSession) { + id fetcherDelegate = fetcherSession.delegate; + // If the delegate is non-nil and claims to be a GTMSessionFetcher, there is no dispatcher; + // assume the fetcher is the delegate or has been proxied (some third-party frameworks + // are known to swizzle NSURLSession to proxy its delegate). + BOOL hasDispatcher = (fetcherDelegate != nil && + ![fetcherDelegate isKindOfClass:[GTMSessionFetcher class]]); + if (hasDispatcher) { + GTMSESSION_ASSERT_DEBUG([fetcherDelegate isKindOfClass:[GTMSessionFetcherSessionDelegateDispatcher class]], + @"Fetcher delegate class: %@", [fetcherDelegate class]); + return (GTMSessionFetcherSessionDelegateDispatcher *)fetcherDelegate; + } + } + return nil; +} + +- (void)fetcherDidCreateSession:(GTMSessionFetcher *)fetcher { + if (fetcher.canShareSession) { + NSURLSession *fetcherSession = fetcher.session; + GTMSESSION_ASSERT_DEBUG(fetcherSession != nil, @"Fetcher missing its session: %@", fetcher); + + GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = + [self delegateDispatcherForFetcher:fetcher]; + if (delegateDispatcher) { + GTMSESSION_ASSERT_DEBUG(delegateDispatcher.session == nil, + @"Fetcher made an extra session: %@", fetcher); + + // Save this fetcher's session. + delegateDispatcher.session = fetcherSession; + + // Allow other fetchers to request this session now. + dispatch_semaphore_signal(_sessionCreationSemaphore); + } + } +} + +- (void)fetcherDidBeginFetching:(GTMSessionFetcher *)fetcher { + // If this fetcher has a separate delegate with a shared session, then + // this fetcher should be added to the delegate's map of tasks to fetchers. + GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = + [self delegateDispatcherForFetcher:fetcher]; + if (delegateDispatcher) { + GTMSESSION_ASSERT_DEBUG(fetcher.canShareSession, + @"Inappropriate shared session: %@", fetcher); + + // There should already be a session, from this or a previous fetcher. + // + // Sanity check that the fetcher's session is the delegate's shared session. + NSURLSession *sharedSession = delegateDispatcher.session; + NSURLSession *fetcherSession = fetcher.session; + GTMSESSION_ASSERT_DEBUG(sharedSession != nil, @"Missing delegate session: %@", fetcher); + GTMSESSION_ASSERT_DEBUG(fetcherSession == sharedSession, + @"Inconsistent session: %@ %@ (shared: %@)", + fetcher, fetcherSession, sharedSession); + + if (sharedSession != nil && fetcherSession == sharedSession) { + NSURLSessionTask *task = fetcher.sessionTask; + GTMSESSION_ASSERT_DEBUG(task != nil, @"Missing session task: %@", fetcher); + + if (task) { + [delegateDispatcher setFetcher:fetcher + forTask:task]; + } + } + } +} + +- (void)stopFetcher:(GTMSessionFetcher *)fetcher { + [fetcher stopFetching]; +} + +- (void)fetcherDidStop:(GTMSessionFetcher *)fetcher { + // Entry point from the fetcher + NSString *host = fetcher.serviceHost; + if (!host) { + // fetcher has been stopped previously + return; + } + + // This removeFetcher: invocation is a fallback; typically, fetchers are removed from the task + // map when the task completes. + GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = + [self delegateDispatcherForFetcher:fetcher]; + [delegateDispatcher removeFetcher:fetcher]; + + NSMutableArray *fetchersToStart; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // If a test is waiting for all fetchers to stop, it needs to wait for this one + // to invoke its callbacks on the callback queue. + [_stoppedFetchersToWaitFor addObject:fetcher]; + + NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; + [runningForHost removeObject:fetcher]; + + NSMutableArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; + [delayedForHost removeObject:fetcher]; + + while (delayedForHost.count > 0 + && [[self class] numberOfNonBackgroundSessionFetchers:runningForHost] + < _maxRunningFetchersPerHost) { + // Start another delayed fetcher running, scanning for the minimum + // priority value, defaulting to FIFO for equal priorities + GTMSessionFetcher *nextFetcher = nil; + for (GTMSessionFetcher *delayedFetcher in delayedForHost) { + if (nextFetcher == nil + || delayedFetcher.servicePriority < nextFetcher.servicePriority) { + nextFetcher = delayedFetcher; + } + } + + if (nextFetcher) { + [self addRunningFetcher:nextFetcher forHost:host]; + runningForHost = [_runningFetchersByHost objectForKey:host]; + + [delayedForHost removeObjectIdenticalTo:nextFetcher]; + + if (!fetchersToStart) { + fetchersToStart = [NSMutableArray array]; + } + [fetchersToStart addObject:nextFetcher]; + } + } + + if (runningForHost.count == 0) { + // None left; remove the empty array + [_runningFetchersByHost removeObjectForKey:host]; + } + + if (delayedForHost.count == 0) { + [_delayedFetchersByHost removeObjectForKey:host]; + } + } // @synchronized(self) + + // Start fetchers outside of the synchronized block to avoid a deadlock. + for (GTMSessionFetcher *nextFetcher in fetchersToStart) { + [self startFetcher:nextFetcher]; + } + + // The fetcher is no longer in the running or the delayed array, + // so remove its host and thread properties + fetcher.serviceHost = nil; +} + +- (NSUInteger)numberOfFetchers { + NSUInteger running = [self numberOfRunningFetchers]; + NSUInteger delayed = [self numberOfDelayedFetchers]; + return running + delayed; +} + +- (NSUInteger)numberOfRunningFetchers { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSUInteger sum = 0; + for (NSString *host in _runningFetchersByHost) { + NSArray *fetchers = [_runningFetchersByHost objectForKey:host]; + sum += fetchers.count; + } + return sum; + } +} + +- (NSUInteger)numberOfDelayedFetchers { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSUInteger sum = 0; + for (NSString *host in _delayedFetchersByHost) { + NSArray *fetchers = [_delayedFetchersByHost objectForKey:host]; + sum += fetchers.count; + } + return sum; + } +} + +- (NSArray *)issuedFetchers { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSMutableArray *allFetchers = [NSMutableArray array]; + void (^accumulateFetchers)(id, id, BOOL *) = ^(NSString *host, + NSArray *fetchersForHost, + BOOL *stop) { + [allFetchers addObjectsFromArray:fetchersForHost]; + }; + [_runningFetchersByHost enumerateKeysAndObjectsUsingBlock:accumulateFetchers]; + [_delayedFetchersByHost enumerateKeysAndObjectsUsingBlock:accumulateFetchers]; + + GTMSESSION_ASSERT_DEBUG(allFetchers.count == [NSSet setWithArray:allFetchers].count, + @"Fetcher appears multiple times\n running: %@\n delayed: %@", + _runningFetchersByHost, _delayedFetchersByHost); + + return allFetchers.count > 0 ? allFetchers : nil; + } +} + +- (NSArray *)issuedFetchersWithRequestURL:(NSURL *)requestURL { + NSString *host = requestURL.host; + if (host.length == 0) return nil; + + NSURL *targetURL = [requestURL absoluteURL]; + + NSArray *allFetchers = [self issuedFetchers]; + NSIndexSet *indexes = [allFetchers indexesOfObjectsPassingTest:^BOOL(GTMSessionFetcher *fetcher, + NSUInteger idx, + BOOL *stop) { + NSURL *fetcherURL = [fetcher.request.URL absoluteURL]; + return [fetcherURL isEqual:targetURL]; + }]; + + NSArray *result = nil; + if (indexes.count > 0) { + result = [allFetchers objectsAtIndexes:indexes]; + } + return result; +} + +- (void)stopAllFetchers { + NSArray *delayedFetchersByHost; + NSArray *runningFetchersByHost; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Set the time barrier so fetchers know not to call back even if + // the stop calls below occur after the fetchers naturally + // stopped and so were removed from _runningFetchersByHost, + // but while the callbacks were already enqueued before stopAllFetchers + // was invoked. + _stoppedAllFetchersDate = [[NSDate alloc] init]; + + // Remove fetchers from the delayed list to avoid fetcherDidStop: from + // starting more fetchers running as a side effect of stopping one + delayedFetchersByHost = _delayedFetchersByHost.allValues; + [_delayedFetchersByHost removeAllObjects]; + + runningFetchersByHost = _runningFetchersByHost.allValues; + [_runningFetchersByHost removeAllObjects]; + } + + for (NSArray *delayedForHost in delayedFetchersByHost) { + for (GTMSessionFetcher *fetcher in delayedForHost) { + [self stopFetcher:fetcher]; + } + } + + for (NSArray *runningForHost in runningFetchersByHost) { + for (GTMSessionFetcher *fetcher in runningForHost) { + [self stopFetcher:fetcher]; + } + } +} + +- (NSDate *)stoppedAllFetchersDate { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _stoppedAllFetchersDate; + } +} + +#pragma mark Accessors + +- (BOOL)reuseSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateDispatcher != nil; + } +} + +- (void)setReuseSession:(BOOL)shouldReuse { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + BOOL wasReusing = (_delegateDispatcher != nil); + if (shouldReuse != wasReusing) { + [self abandonDispatcher]; + if (shouldReuse) { + _delegateDispatcher = + [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self + sessionDiscardInterval:_unusedSessionTimeout]; + } else { + _delegateDispatcher = nil; + } + } + } +} + +- (void)resetSession { + GTMSessionCheckNotSynchronized(self); + dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + [self resetSessionInternal]; + } + + dispatch_semaphore_signal(_sessionCreationSemaphore); +} + +- (void)resetSessionInternal { + GTMSessionCheckSynchronized(self); + + // The old dispatchers may be retained as delegates of any ongoing sessions by those sessions. + if (_delegateDispatcher) { + [self abandonDispatcher]; + _delegateDispatcher = + [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self + sessionDiscardInterval:_unusedSessionTimeout]; + } +} + +- (void)resetSessionForDispatcherDiscardTimer:(NSTimer *)timer { + GTMSessionCheckNotSynchronized(self); + + dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_delegateDispatcher.discardTimer == timer) { + // If the delegate dispatcher's current discardTimer is the same object as the timer + // that fired, no fetcher has recently attempted to start using the session by calling + // startSessionUsage, which invalidates and nils out the timer. + [self resetSessionInternal]; + } else { + // A fetcher has invalidated the timer between its triggering and now, potentially + // meaning a fetcher has requested access to the NSURLSession, and may be in the process + // of starting a new task. The dispatcher should not be abandoned, as this can lead + // to a race condition between calling -finishTasksAndInvalidate on the NSURLSession + // and the fetcher attempting to create a new task. + } + } + + dispatch_semaphore_signal(_sessionCreationSemaphore); +} + +- (NSTimeInterval)unusedSessionTimeout { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _unusedSessionTimeout; + } +} + +- (void)setUnusedSessionTimeout:(NSTimeInterval)timeout { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _unusedSessionTimeout = timeout; + _delegateDispatcher.discardInterval = timeout; + } +} + +// This method should be called inside of @synchronized(self) +- (void)abandonDispatcher { + GTMSessionCheckSynchronized(self); + [_delegateDispatcher abandon]; +} + +- (NSDictionary *)runningFetchersByHost { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_runningFetchersByHost copy]; + } +} + +- (void)setRunningFetchersByHost:(NSDictionary *)dict { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _runningFetchersByHost = [dict mutableCopy]; + } +} + +- (NSDictionary *)delayedFetchersByHost { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_delayedFetchersByHost copy]; + } +} + +- (void)setDelayedFetchersByHost:(NSDictionary *)dict { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delayedFetchersByHost = [dict mutableCopy]; + } +} + +- (id)authorizer { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _authorizer; + } +} + +- (void)setAuthorizer:(id)obj { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (obj != _authorizer) { + [self detachAuthorizer]; + } + + _authorizer = obj; + } + + // Use the fetcher service for the authorization fetches if the auth + // object supports fetcher services + if ([obj respondsToSelector:@selector(setFetcherService:)]) { +#if GTM_USE_SESSION_FETCHER + [obj setFetcherService:self]; +#else + [obj setFetcherService:(id)self]; +#endif + } +} + +// This should be called inside a @synchronized(self) block except during dealloc. +- (void)detachAuthorizer { + // This method is called by the fetcher service's dealloc and setAuthorizer: + // methods; do not override. + // + // The fetcher service retains the authorizer, and the authorizer has a + // weak pointer to the fetcher service (a non-zeroing pointer for + // compatibility with iOS 4 and Mac OS X 10.5/10.6.) + // + // When this fetcher service no longer uses the authorizer, we want to remove + // the authorizer's dependence on the fetcher service. Authorizers can still + // function without a fetcher service. + if ([_authorizer respondsToSelector:@selector(fetcherService)]) { + id authFetcherService = [_authorizer fetcherService]; + if (authFetcherService == self) { + [_authorizer setFetcherService:nil]; + } + } +} + +- (dispatch_queue_t GTM_NONNULL_TYPE)callbackQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _callbackQueue; + } // @synchronized(self) +} + +- (void)setCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _callbackQueue = queue ?: dispatch_get_main_queue(); + } // @synchronized(self) +} + +- (NSOperationQueue * GTM_NONNULL_TYPE)sessionDelegateQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateQueue; + } // @synchronized(self) +} + +- (void)setSessionDelegateQueue:(NSOperationQueue * GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delegateQueue = queue ?: [NSOperationQueue mainQueue]; + } // @synchronized(self) +} + +- (NSOperationQueue *)delegateQueue { + // Provided for compatibility with the old fetcher service. The gtm-oauth2 code respects + // any custom delegate queue for calling the app. + return nil; +} + ++ (NSUInteger)numberOfNonBackgroundSessionFetchers:(NSArray *)fetchers { + NSUInteger sum = 0; + for (GTMSessionFetcher *fetcher in fetchers) { + if (!fetcher.usingBackgroundSession) { + ++sum; + } + } + return sum; +} + +@end + +@implementation GTMSessionFetcherService (TestingSupport) + ++ (instancetype)mockFetcherServiceWithFakedData:(NSData *)fakedDataOrNil + fakedError:(NSError *)fakedErrorOrNil { +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + NSURL *url = [NSURL URLWithString:@"http://example.invalid"]; + NSHTTPURLResponse *fakedResponse = + [[NSHTTPURLResponse alloc] initWithURL:url + statusCode:(fakedErrorOrNil ? 500 : 200) + HTTPVersion:@"HTTP/1.1" + headerFields:nil]; + return [self mockFetcherServiceWithFakedData:fakedDataOrNil + fakedResponse:fakedResponse + fakedError:fakedErrorOrNil]; +#else + GTMSESSION_ASSERT_DEBUG(0, @"Test blocks disabled"); + return nil; +#endif // GTM_DISABLE_FETCHER_TEST_BLOCK +} + ++ (instancetype)mockFetcherServiceWithFakedData:(NSData *)fakedDataOrNil + fakedResponse:(NSHTTPURLResponse *)fakedResponse + fakedError:(NSError *)fakedErrorOrNil { +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + GTMSessionFetcherService *service = [[self alloc] init]; + service.allowedInsecureSchemes = @[ @"http" ]; + service.testBlock = ^(GTMSessionFetcher *fetcherToTest, + GTMSessionFetcherTestResponse testResponse) { + testResponse(fakedResponse, fakedDataOrNil, fakedErrorOrNil); + }; + return service; +#else + GTMSESSION_ASSERT_DEBUG(0, @"Test blocks disabled"); + return nil; +#endif // GTM_DISABLE_FETCHER_TEST_BLOCK +} + +#pragma mark Synchronous Wait for Unit Testing + +- (BOOL)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds { + NSDate *giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; + _stoppedFetchersToWaitFor = [NSMutableArray array]; + + BOOL shouldSpinRunLoop = [NSThread isMainThread]; + const NSTimeInterval kSpinInterval = 0.001; + BOOL didTimeOut = NO; + while (([self numberOfFetchers] > 0 || _stoppedFetchersToWaitFor.count > 0)) { + didTimeOut = [giveUpDate timeIntervalSinceNow] < 0; + if (didTimeOut) break; + + GTMSessionFetcher *stoppedFetcher = _stoppedFetchersToWaitFor.firstObject; + if (stoppedFetcher) { + [_stoppedFetchersToWaitFor removeObject:stoppedFetcher]; + [stoppedFetcher waitForCompletionWithTimeout:10.0 * kSpinInterval]; + } + + if (shouldSpinRunLoop) { + NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:kSpinInterval]; + [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; + } else { + [NSThread sleepForTimeInterval:kSpinInterval]; + } + } + _stoppedFetchersToWaitFor = nil; + + return !didTimeOut; +} + +@end + +@implementation GTMSessionFetcherService (BackwardsCompatibilityOnly) + +- (NSInteger)cookieStorageMethod { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _cookieStorageMethod; + } +} + +- (void)setCookieStorageMethod:(NSInteger)cookieStorageMethod { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _cookieStorageMethod = cookieStorageMethod; + } +} + +@end + +@implementation GTMSessionFetcherSessionDelegateDispatcher { + __weak GTMSessionFetcherService *_parentService; + NSURLSession *_session; + + // The task map maps NSURLSessionTasks to GTMSessionFetchers + NSMutableDictionary *_taskToFetcherMap; + // The discard timer will invalidate sessions after the session's last task completes. + NSTimer *_discardTimer; + NSTimeInterval _discardInterval; +} + +@synthesize discardInterval = _discardInterval, + session = _session; + +- (instancetype)init { + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (instancetype)initWithParentService:(GTMSessionFetcherService *)parentService + sessionDiscardInterval:(NSTimeInterval)discardInterval { + self = [super init]; + if (self) { + _discardInterval = discardInterval; + _parentService = parentService; + } + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p %@ %@", + [self class], self, + _session ?: @"", + _taskToFetcherMap.count > 0 ? _taskToFetcherMap : @""]; +} + +- (NSTimer *)discardTimer { + GTMSessionCheckNotSynchronized(self); + @synchronized(self) { + return _discardTimer; + } +} + +// This method should be called inside of a @synchronized(self) block. +- (void)startDiscardTimer { + GTMSessionCheckSynchronized(self); + [_discardTimer invalidate]; + _discardTimer = nil; + if (_discardInterval > 0) { + _discardTimer = [NSTimer timerWithTimeInterval:_discardInterval + target:self + selector:@selector(discardTimerFired:) + userInfo:nil + repeats:NO]; + [_discardTimer setTolerance:(_discardInterval / 10)]; + [[NSRunLoop mainRunLoop] addTimer:_discardTimer forMode:NSRunLoopCommonModes]; + } +} + +// This method should be called inside of a @synchronized(self) block. +- (void)destroyDiscardTimer { + GTMSessionCheckSynchronized(self); + [_discardTimer invalidate]; + _discardTimer = nil; +} + +- (void)discardTimerFired:(NSTimer *)timer { + GTMSessionFetcherService *service; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSUInteger numberOfTasks = _taskToFetcherMap.count; + if (numberOfTasks == 0) { + service = _parentService; + } + } + + // Inform the service that the discard timer has fired, and should check whether the + // service can abandon us. -resetSession cannot be called directly, as there is a + // race condition that must be guarded against with the NSURLSession being returned + // from sessionForFetcherCreation outside other locks. The service can take steps + // to prevent resetting the session if that has occurred. + // + // The service must be called from outside the @synchronized block. + [service resetSessionForDispatcherDiscardTimer:timer]; +} + +- (void)abandon { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self destroySessionAndTimer]; + } +} + +- (void)startSessionUsage { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self destroyDiscardTimer]; + } +} + +// This method should be called inside of a @synchronized(self) block. +- (void)destroySessionAndTimer { + GTMSessionCheckSynchronized(self); + [self destroyDiscardTimer]; + + // Break any retain cycle from the session holding the delegate. + [_session finishTasksAndInvalidate]; + + // Immediately clear the session so no new task may be issued with it. + // + // The _taskToFetcherMap needs to stay valid until the outstanding tasks finish. + _session = nil; +} + +- (void)setFetcher:(GTMSessionFetcher *)fetcher forTask:(NSURLSessionTask *)task { + GTMSESSION_ASSERT_DEBUG(fetcher != nil, @"missing fetcher"); + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_taskToFetcherMap == nil) { + _taskToFetcherMap = [[NSMutableDictionary alloc] init]; + } + + if (fetcher) { + [_taskToFetcherMap setObject:fetcher forKey:task]; + [self destroyDiscardTimer]; + } + } +} + +- (void)removeFetcher:(GTMSessionFetcher *)fetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Typically, a fetcher should be removed when its task invokes + // URLSession:task:didCompleteWithError:. + // + // When fetching with a testBlock, though, the task completed delegate + // method may not be invoked, requiring cleanup here. + NSArray *tasks = [_taskToFetcherMap allKeysForObject:fetcher]; + GTMSESSION_ASSERT_DEBUG(tasks.count <= 1, @"fetcher task not unmapped: %@", tasks); + [_taskToFetcherMap removeObjectsForKeys:tasks]; + + if (_taskToFetcherMap.count == 0) { + [self startDiscardTimer]; + } + } +} + +// This helper method provides synchronized access to the task map for the delegate +// methods below. +- (id)fetcherForTask:(NSURLSessionTask *)task { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_taskToFetcherMap objectForKey:task]; + } +} + +- (void)removeTaskFromMap:(NSURLSessionTask *)task { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [_taskToFetcherMap removeObjectForKey:task]; + } +} + +- (void)setSession:(NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _session = session; + } +} + +- (NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _session; + } +} + +- (NSTimeInterval)discardInterval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _discardInterval; + } +} + +- (void)setDiscardInterval:(NSTimeInterval)interval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _discardInterval = interval; + } +} + +// NSURLSessionDelegate protocol methods. + +// - (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session; +// +// TODO(seh): How do we route this to an appropriate fetcher? + + +- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ didBecomeInvalidWithError:%@", + [self class], self, session, error); + NSDictionary *localTaskToFetcherMap; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _session = nil; + + localTaskToFetcherMap = [_taskToFetcherMap copy]; + } + + // Any "suspended" tasks may not have received callbacks from NSURLSession when the session + // completes; we'll call them now. + [localTaskToFetcherMap enumerateKeysAndObjectsUsingBlock:^(NSURLSessionTask *task, + GTMSessionFetcher *fetcher, + BOOL *stop) { + if (fetcher.session == session) { + // Our delegate method URLSession:task:didCompleteWithError: will rely on + // _taskToFetcherMap so that should still contain this fetcher. + NSError *canceledError = [NSError errorWithDomain:NSURLErrorDomain + code:NSURLErrorCancelled + userInfo:nil]; + [self URLSession:session task:task didCompleteWithError:canceledError]; + } else { + GTMSESSION_ASSERT_DEBUG(0, @"Unexpected session in fetcher: %@ has %@ (expected %@)", + fetcher, fetcher.session, session); + } + }]; + + // Our tests rely on this notification to know the session discard timer fired. + NSDictionary *userInfo = @{ kGTMSessionFetcherServiceSessionKey : session }; + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc postNotificationName:kGTMSessionFetcherServiceSessionBecameInvalidNotification + object:_parentService + userInfo:userInfo]; +} + + +#pragma mark - NSURLSessionTaskDelegate + +// NSURLSessionTaskDelegate protocol methods. +// +// We won't test here if the fetcher responds to these since we only want this +// class to implement the same delegate methods the fetcher does (so NSURLSession's +// tests for respondsToSelector: will have the same result whether the session +// delegate is the fetcher or this dispatcher.) + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +willPerformHTTPRedirection:(NSHTTPURLResponse *)response + newRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLRequest *))completionHandler { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session + task:task +willPerformHTTPRedirection:response + newRequest:request + completionHandler:completionHandler]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))handler { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session + task:task + didReceiveChallenge:challenge + completionHandler:handler]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + needNewBodyStream:(void (^)(NSInputStream *bodyStream))handler { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session + task:task + needNewBodyStream:handler]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session + task:task + didSendBodyData:bytesSent + totalBytesSent:totalBytesSent +totalBytesExpectedToSend:totalBytesExpectedToSend]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error { + id fetcher = [self fetcherForTask:task]; + + // This is the usual way tasks are removed from the task map. + [self removeTaskFromMap:task]; + + [fetcher URLSession:session + task:task + didCompleteWithError:error]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics + API_AVAILABLE(ios(10.0), macosx(10.12), tvos(10.0), watchos(3.0)) { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session task:task didFinishCollectingMetrics:metrics]; +} + +// NSURLSessionDataDelegate protocol methods. + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition))handler { + id fetcher = [self fetcherForTask:dataTask]; + [fetcher URLSession:session + dataTask:dataTask + didReceiveResponse:response + completionHandler:handler]; +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask { + id fetcher = [self fetcherForTask:dataTask]; + GTMSESSION_ASSERT_DEBUG(fetcher != nil, @"Missing fetcher for %@", dataTask); + [self removeTaskFromMap:dataTask]; + if (fetcher) { + GTMSESSION_ASSERT_DEBUG([fetcher isKindOfClass:[GTMSessionFetcher class]], + @"Expecting GTMSessionFetcher"); + [self setFetcher:(GTMSessionFetcher *)fetcher forTask:downloadTask]; + } + + [fetcher URLSession:session + dataTask:dataTask +didBecomeDownloadTask:downloadTask]; +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data { + id fetcher = [self fetcherForTask:dataTask]; + [fetcher URLSession:session + dataTask:dataTask + didReceiveData:data]; +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *))handler { + id fetcher = [self fetcherForTask:dataTask]; + [fetcher URLSession:session + dataTask:dataTask + willCacheResponse:proposedResponse + completionHandler:handler]; +} + +// NSURLSessionDownloadDelegate protocol methods. + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location { + id fetcher = [self fetcherForTask:downloadTask]; + [fetcher URLSession:session + downloadTask:downloadTask +didFinishDownloadingToURL:location]; +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalWritten +totalBytesExpectedToWrite:(int64_t)totalExpected { + id fetcher = [self fetcherForTask:downloadTask]; + [fetcher URLSession:session + downloadTask:downloadTask + didWriteData:bytesWritten + totalBytesWritten:totalWritten +totalBytesExpectedToWrite:totalExpected]; +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes { + id fetcher = [self fetcherForTask:downloadTask]; + [fetcher URLSession:session + downloadTask:downloadTask + didResumeAtOffset:fileOffset + expectedTotalBytes:expectedTotalBytes]; +} + +@end diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h new file mode 100644 index 00000000..2f9023a9 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h @@ -0,0 +1,175 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// GTMSessionUploadFetcher implements Google's resumable upload protocol. + +// +// This subclass of GTMSessionFetcher simulates the series of fetches +// needed for chunked upload as a single fetch operation. +// +// Protocol document: TBD +// +// To the client, the only fetcher that exists is this class; the subsidiary +// fetchers needed for uploading chunks are not visible (though the most recent +// chunk fetcher may be accessed via the -activeFetcher or -chunkFetcher methods, and +// -responseHeaders and -statusCode reflect results from the most recent chunk +// fetcher.) +// +// Chunk fetchers are discarded as soon as they have completed. +// +// The protocol also allows for a cancellation notification request to be sent to the +// server to allow discarding of the currently uploaded data and this will be sent +// automatically upon calling stopFetching if the upload has already started. +// +// Note: Unlike the fetcher superclass, the methods of GTMSessionUploadFetcher should +// only be used from the main thread until further work is done to make this subclass +// thread-safe. + +#import "GTMSessionFetcher.h" +#import "GTMSessionFetcherService.h" + +GTM_ASSUME_NONNULL_BEGIN + +// The value to use for file size parameters when the file size is not yet known. +extern int64_t const kGTMSessionUploadFetcherUnknownFileSize; + +// Unless an application knows it needs a smaller chunk size, it should use the standard +// chunk size, which sends the entire file as a single chunk to minimize upload overhead. +// Setting an explicit chunk size that comfortably fits in memory is advisable for large +// uploads. +extern int64_t const kGTMSessionUploadFetcherStandardChunkSize; + +// When uploading requires data buffer allocations (such as uploading from an NSData or +// an NSFileHandle) this is the maximum buffer size that will be created by the fetcher. +extern int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize; + +// Notification that the upload location URL was provided by the server. +extern NSString *const kGTMSessionFetcherUploadLocationObtainedNotification; + +// Block to provide data during uploads. +// +// Response data may be allocated with dataWithBytesNoCopy:length:freeWhenDone: for efficiency, +// and released after the response block returns. +// +// If the length of the file being uploaded is unknown or already set, send +// kGTMSessionUploadFetcherUnknownFileSize for |fullUploadLength|. Otherwise, set |fullUploadLength| +// to its proper value. +// +// Pass nil as the data (and optionally an NSError) for a failure. +typedef void (^GTMSessionUploadFetcherDataProviderResponse)(NSData * GTM_NULLABLE_TYPE data, + int64_t fullUploadLength, + NSError * GTM_NULLABLE_TYPE error); +// Do not call the response with an NSData object with less data than the requested length unless +// you are passing the fullUploadLength to the fetcher for the first time and it is the last chunk +// of data in the file being uploaded. +typedef void (^GTMSessionUploadFetcherDataProvider)(int64_t offset, int64_t length, + GTMSessionUploadFetcherDataProviderResponse response); + +// Block to be notified about the final status of the cancellation request started in stopFetching. +// +// |fetcher| will be the cancel request that was sent to the server, or nil if stopFetching is not +// going to send a cancel request. If |fetcher| is provided, the other parameters correspond to the +// completion handler of the cancellation request fetcher. +typedef void (^GTMSessionUploadFetcherCancellationHandler)( + GTMSessionFetcher * GTM_NULLABLE_TYPE fetcher, + NSData * GTM_NULLABLE_TYPE data, + NSError * GTM_NULLABLE_TYPE error); + +@interface GTMSessionUploadFetcher : GTMSessionFetcher + +// Create an upload fetcher specifying either the request or the resume location URL, +// then set an upload data source using one of these: +// +// setUploadFileURL: +// setUploadDataLength:provider: +// setUploadFileHandle: +// setUploadData: + ++ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil; + +// Allows cellular access. ++ (instancetype)uploadFetcherWithLocation:(NSURL * GTM_NULLABLE_TYPE)uploadLocationURL + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil; + ++ (instancetype)uploadFetcherWithLocation:(NSURL *GTM_NULLABLE_TYPE)uploadLocationURL + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + allowsCellularAccess:(BOOL)allowsCellularAccess + fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil; + +// Allows dataProviders for files of unknown length. Pass kGTMSessionUploadFetcherUnknownFileSize as +// |fullLength| if the length is unknown. +- (void)setUploadDataLength:(int64_t)fullLength + provider:(GTM_NULLABLE GTMSessionUploadFetcherDataProvider)block; + ++ (NSArray *)uploadFetchersForBackgroundSessions; ++ (GTM_NULLABLE instancetype)uploadFetcherForSessionIdentifier:(NSString *)sessionIdentifier; + +- (void)pauseFetching; +- (void)resumeFetching; +- (BOOL)isPaused; + +@property(atomic, strong, GTM_NULLABLE) NSURL *uploadLocationURL; +@property(atomic, strong, GTM_NULLABLE) NSData *uploadData; +@property(atomic, strong, GTM_NULLABLE) NSURL *uploadFileURL; +@property(atomic, strong, GTM_NULLABLE) NSFileHandle *uploadFileHandle; +@property(atomic, copy, readonly, GTM_NULLABLE) GTMSessionUploadFetcherDataProvider uploadDataProvider; +@property(atomic, copy) NSString *uploadMIMEType; +@property(atomic, readonly, assign) int64_t chunkSize; +@property(atomic, readonly, assign) int64_t currentOffset; +// Reflects the original NSURLRequest's @c allowCellularAccess property. +@property(atomic, readonly, assign) BOOL allowsCellularAccess; + +// The fetcher for the current data chunk, if any +@property(atomic, strong, GTM_NULLABLE) GTMSessionFetcher *chunkFetcher; + +// The active fetcher is the current chunk fetcher, or the upload fetcher itself +// if no chunk fetcher has yet been created. +@property(atomic, readonly) GTMSessionFetcher *activeFetcher; + +// The last request made by an active fetcher. Useful for testing. +@property(atomic, readonly, GTM_NULLABLE) NSURLRequest *lastChunkRequest; + +// The status code from the most recently-completed fetch. +@property(atomic, assign) NSInteger statusCode; + +// Invoked as part of the stop fetching process. Invoked immediately if there is no upload in +// progress, otherwise invoked with the results of the attempt to notify the server that the +// upload will not continue. +// +// Unlike other callbacks, since this is related specifically to the stopFetching flow it is not +// cleared by stopFetching. It will instead clear itself after it is invoked or if the completion +// has occured before stopFetching is called. +@property(atomic, copy, GTM_NULLABLE) GTMSessionUploadFetcherCancellationHandler + cancellationHandler; + +// Exposed for testing only. +@property(atomic, readonly, GTM_NULLABLE) dispatch_queue_t delegateCallbackQueue; +@property(atomic, readonly, GTM_NULLABLE) GTMSessionFetcherCompletionHandler delegateCompletionHandler; + +@end + +@interface GTMSessionFetcher (GTMSessionUploadFetcherMethods) + +@property(readonly, GTM_NULLABLE) GTMSessionUploadFetcher *parentUploadFetcher; + +@end + +GTM_ASSUME_NONNULL_END diff --git a/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m new file mode 100644 index 00000000..7759bb15 --- /dev/null +++ b/MyExperiences copy/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m @@ -0,0 +1,1989 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMSessionUploadFetcher.h" + +static NSString *const kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey = @"_upChunk"; +static NSString *const kGTMSessionIdentifierUploadFileURLMetadataKey = @"_upFileURL"; +static NSString *const kGTMSessionIdentifierUploadFileLengthMetadataKey = @"_upFileLen"; +static NSString *const kGTMSessionIdentifierUploadLocationURLMetadataKey = @"_upLocURL"; +static NSString *const kGTMSessionIdentifierUploadMIMETypeMetadataKey = @"_uploadMIME"; +static NSString *const kGTMSessionIdentifierUploadChunkSizeMetadataKey = @"_upChSize"; +static NSString *const kGTMSessionIdentifierUploadCurrentOffsetMetadataKey = @"_upOffset"; +static NSString *const kGTMSessionIdentifierUploadAllowsCellularAccess = @"_upAllowsCellularAccess"; + +static NSString *const kGTMSessionHeaderXGoogUploadChunkGranularity = @"X-Goog-Upload-Chunk-Granularity"; +static NSString *const kGTMSessionHeaderXGoogUploadCommand = @"X-Goog-Upload-Command"; +static NSString *const kGTMSessionHeaderXGoogUploadContentLength = @"X-Goog-Upload-Content-Length"; +static NSString *const kGTMSessionHeaderXGoogUploadContentType = @"X-Goog-Upload-Content-Type"; +static NSString *const kGTMSessionHeaderXGoogUploadOffset = @"X-Goog-Upload-Offset"; +static NSString *const kGTMSessionHeaderXGoogUploadProtocol = @"X-Goog-Upload-Protocol"; +static NSString *const kGTMSessionXGoogUploadProtocolResumable = @"resumable"; +static NSString *const kGTMSessionHeaderXGoogUploadSizeReceived = @"X-Goog-Upload-Size-Received"; +static NSString *const kGTMSessionHeaderXGoogUploadStatus = @"X-Goog-Upload-Status"; +static NSString *const kGTMSessionHeaderXGoogUploadURL = @"X-Goog-Upload-URL"; + +// Property of chunk fetchers identifying the parent upload fetcher. Non-retained NSValue. +static NSString *const kGTMSessionUploadFetcherChunkParentKey = @"_uploadFetcherChunkParent"; + +int64_t const kGTMSessionUploadFetcherUnknownFileSize = -1; + +int64_t const kGTMSessionUploadFetcherStandardChunkSize = (int64_t)LLONG_MAX; + +#if TARGET_OS_IPHONE +int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize = 10 * 1024 * 1024; // 10 MB for iOS, watchOS, tvOS +#else +int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize = 100 * 1024 * 1024; // 100 MB for macOS +#endif + +typedef NS_ENUM(NSUInteger, GTMSessionUploadFetcherStatus) { + kStatusUnknown, + kStatusActive, + kStatusFinal, + kStatusCancelled, +}; + +NSString *const kGTMSessionFetcherUploadLocationObtainedNotification = + @"kGTMSessionFetcherUploadLocationObtainedNotification"; + +#if !GTMSESSION_BUILD_COMBINED_SOURCES +@interface GTMSessionFetcher (ProtectedMethods) + +// Access to non-public method on the parent fetcher class. +- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks; +- (void)createSessionIdentifierWithMetadata:(NSDictionary *)metadata; +- (GTMSessionFetcherCompletionHandler)completionHandlerWithTarget:(id)target + didFinishSelector:(SEL)finishedSelector; +- (void)invokeOnCallbackQueue:(dispatch_queue_t)callbackQueue + afterUserStopped:(BOOL)afterStopped + block:(void (^)(void))block; +- (NSTimer *)retryTimer; +- (void)beginFetchForRetry; + +@property(readwrite, strong) NSData *downloadedData; +- (void)releaseCallbacks; + +- (NSInteger)statusCodeUnsynchronized; + +- (BOOL)userStoppedFetching; + +@end +#endif // !GTMSESSION_BUILD_COMBINED_SOURCES + +@interface GTMSessionUploadFetcher () + +// Changing readonly to readwrite. +@property(atomic, strong, readwrite) NSURLRequest *lastChunkRequest; +@property(atomic, readwrite, assign) int64_t currentOffset; + +// Internal properties. +@property(strong, atomic, GTM_NULLABLE) GTMSessionFetcher *fetcherInFlight; // Synchronized on self. + +@property(assign, atomic, getter=isSubdataGenerating) BOOL subdataGenerating; +@property(assign, atomic) BOOL shouldInitiateOffsetQuery; +@property(assign, atomic) int64_t uploadGranularity; +@property(assign, atomic) BOOL allowsCellularAccess; + +@end + +@implementation GTMSessionUploadFetcher { + GTMSessionFetcher *_chunkFetcher; + + // We'll call through to the delegate's completion handler. + GTMSessionFetcherCompletionHandler _delegateCompletionHandler; + dispatch_queue_t _delegateCallbackQueue; + + // The initial fetch's body length and bytes actually sent are + // needed for calculating progress during subsequent chunk uploads + int64_t _initialBodyLength; + int64_t _initialBodySent; + + // The upload server address for the chunks of this upload session. + NSURL *_uploadLocationURL; + + // _uploadData, _uploadDataProvider, or _uploadFileHandle may be set, but only one. + NSData *_uploadData; + NSFileHandle *_uploadFileHandle; + GTMSessionUploadFetcherDataProvider _uploadDataProvider; + NSURL *_uploadFileURL; + int64_t _uploadFileLength; + NSString *_uploadMIMEType; + int64_t _chunkSize; + int64_t _uploadGranularity; + BOOL _isPaused; + BOOL _isRestartedUpload; + BOOL _shouldInitiateOffsetQuery; + + // Tied to useBackgroundSession property, since this property is applicable to chunk fetchers. + BOOL _useBackgroundSessionOnChunkFetchers; + + // We keep the latest offset into the upload data just for progress reporting. + int64_t _currentOffset; + + NSDictionary *_recentChunkReponseHeaders; + NSInteger _recentChunkStatusCode; + + // For waiting, we need to know the fetcher in flight, if any, and if subdata generation + // is in progress. + GTMSessionFetcher *_fetcherInFlight; + BOOL _isSubdataGenerating; + BOOL _isCancelInFlight; + + GTMSessionUploadFetcherCancellationHandler _cancellationHandler; +} + ++ (void)load { + [self uploadFetchersForBackgroundSessions]; +} + ++ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + fetcherService:(GTMSessionFetcherService *)fetcherService { + GTMSessionUploadFetcher *fetcher = [self uploadFetcherWithRequest:request + fetcherService:fetcherService]; + [fetcher setLocationURL:nil + uploadMIMEType:uploadMIMEType + chunkSize:chunkSize + allowsCellularAccess:request.allowsCellularAccess]; + return fetcher; +} + ++ (instancetype)uploadFetcherWithLocation:(NSURL *GTM_NULLABLE_TYPE)uploadLocationURL + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil { + return [self uploadFetcherWithLocation:uploadLocationURL + uploadMIMEType:uploadMIMEType + chunkSize:chunkSize + allowsCellularAccess:YES + fetcherService:fetcherServiceOrNil]; +} + ++ (instancetype)uploadFetcherWithLocation:(NSURL *GTM_NULLABLE_TYPE)uploadLocationURL + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + allowsCellularAccess:(BOOL)allowsCellularAccess + fetcherService:(GTMSessionFetcherService *)fetcherService { + GTMSessionUploadFetcher *fetcher = [self uploadFetcherWithRequest:nil + fetcherService:fetcherService]; + [fetcher setLocationURL:uploadLocationURL + uploadMIMEType:uploadMIMEType + chunkSize:chunkSize + allowsCellularAccess:allowsCellularAccess]; + return fetcher; +} + ++ (instancetype)uploadFetcherForSessionIdentifierMetadata:(NSDictionary *)metadata { + GTMSESSION_ASSERT_DEBUG( + [metadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] boolValue], + @"Session identifier metadata is not for an upload fetcher: %@", metadata); + + NSNumber *uploadFileLengthNum = metadata[kGTMSessionIdentifierUploadFileLengthMetadataKey]; + GTMSESSION_ASSERT_DEBUG(uploadFileLengthNum != nil, + @"Session metadata missing an UploadFileSize"); + if (uploadFileLengthNum == nil) return nil; + + int64_t uploadFileLength = [uploadFileLengthNum longLongValue]; + GTMSESSION_ASSERT_DEBUG(uploadFileLength >= 0, @"Session metadata UploadFileSize is unknown"); + + NSString *uploadFileURLString = metadata[kGTMSessionIdentifierUploadFileURLMetadataKey]; + GTMSESSION_ASSERT_DEBUG(uploadFileURLString, @"Session metadata missing an UploadFileURL"); + if (uploadFileURLString == nil) return nil; + + NSURL *uploadFileURL = [NSURL URLWithString:uploadFileURLString]; + // There used to be a call here to NSURL checkResourceIsReachableAndReturnError: to check for the + // existence of the file (also tried NSFileManager fileExistsAtPath:). We've determined + // empirically that the check can fail at startup even when the upload file does in fact exist. + // For now, we'll go ahead and restore the background upload fetcher. If the file doesn't exist, + // it will fail later. + + NSString *uploadLocationURLString = metadata[kGTMSessionIdentifierUploadLocationURLMetadataKey]; + NSURL *uploadLocationURL = + uploadLocationURLString ? [NSURL URLWithString:uploadLocationURLString] : nil; + + NSString *uploadMIMEType = + metadata[kGTMSessionIdentifierUploadMIMETypeMetadataKey]; + int64_t uploadChunkSize = + [metadata[kGTMSessionIdentifierUploadChunkSizeMetadataKey] longLongValue]; + if (uploadChunkSize <= 0) { + uploadChunkSize = kGTMSessionUploadFetcherStandardChunkSize; + } + int64_t currentOffset = + [metadata[kGTMSessionIdentifierUploadCurrentOffsetMetadataKey] longLongValue]; + + BOOL allowsCellularAccess = YES; + if (metadata[kGTMSessionIdentifierUploadAllowsCellularAccess]) { + allowsCellularAccess = [metadata[kGTMSessionIdentifierUploadAllowsCellularAccess] boolValue]; + } + + GTMSESSION_ASSERT_DEBUG(currentOffset <= uploadFileLength, + @"CurrentOffset (%lld) exceeds UploadFileSize (%lld)", + currentOffset, uploadFileLength); + if (currentOffset > uploadFileLength) return nil; + + GTMSessionUploadFetcher *uploadFetcher = [self uploadFetcherWithLocation:uploadLocationURL + uploadMIMEType:uploadMIMEType + chunkSize:uploadChunkSize + allowsCellularAccess:allowsCellularAccess + fetcherService:nil]; + // Set the upload file length before setting the upload file URL tries to determine the length. + [uploadFetcher setUploadFileLength:uploadFileLength]; + + uploadFetcher.uploadFileURL = uploadFileURL; + uploadFetcher.sessionUserInfo = metadata; + uploadFetcher.useBackgroundSession = YES; + uploadFetcher.currentOffset = currentOffset; + uploadFetcher.delegateCallbackQueue = uploadFetcher.callbackQueue; + uploadFetcher.allowedInsecureSchemes = @[ @"http" ]; // Allowed on restored upload fetcher. + return uploadFetcher; +} + ++ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request + fetcherService:(GTMSessionFetcherService *)fetcherService { + // Internal utility method for instantiating fetchers + GTMSessionUploadFetcher *fetcher; + if ([fetcherService isKindOfClass:[GTMSessionFetcherService class]]) { + fetcher = [fetcherService fetcherWithRequest:request + fetcherClass:self]; + } else { + fetcher = [self fetcherWithRequest:request]; + } + fetcher.useBackgroundSession = YES; + return fetcher; +} + ++ (NSPointerArray *)uploadFetcherPointerArrayForBackgroundSessions { + static NSPointerArray *gUploadFetcherPointerArrayForBackgroundSessions = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gUploadFetcherPointerArrayForBackgroundSessions = [NSPointerArray weakObjectsPointerArray]; + }); + return gUploadFetcherPointerArrayForBackgroundSessions; +} + ++ (instancetype)uploadFetcherForSessionIdentifier:(NSString *)sessionIdentifier { + GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); + NSArray *uploadFetchersForBackgroundSessions = [self uploadFetchersForBackgroundSessions]; + for (GTMSessionUploadFetcher *uploadFetcher in uploadFetchersForBackgroundSessions) { + if ([uploadFetcher.chunkFetcher.sessionIdentifier isEqual:sessionIdentifier]) { + return uploadFetcher; + } + } + return nil; +} + ++ (NSArray *)uploadFetchersForBackgroundSessions { + NSMutableSet *restoredSessionIdentifiers = [[NSMutableSet alloc] init]; + NSMutableArray *uploadFetchers = [[NSMutableArray alloc] init]; + NSPointerArray *uploadFetcherPointerArray = [self uploadFetcherPointerArrayForBackgroundSessions]; + + // Collect the background session upload fetchers that are still in memory. + @synchronized(uploadFetcherPointerArray) { + [uploadFetcherPointerArray compact]; + for (GTMSessionUploadFetcher *uploadFetcher in uploadFetcherPointerArray) { + NSString *sessionIdentifier = uploadFetcher.chunkFetcher.sessionIdentifier; + if (sessionIdentifier) { + [restoredSessionIdentifiers addObject:sessionIdentifier]; + [uploadFetchers addObject:uploadFetcher]; + } + } + } // @synchronized(uploadFetcherPointerArray) + + // The system may have other ongoing background upload sessions. Restore upload fetchers for those + // too. + NSArray *fetchers = [GTMSessionFetcher fetchersForBackgroundSessions]; + for (GTMSessionFetcher *fetcher in fetchers) { + NSString *sessionIdentifier = fetcher.sessionIdentifier; + if (!sessionIdentifier || [restoredSessionIdentifiers containsObject:sessionIdentifier]) { + continue; + } + NSDictionary *sessionIdentifierMetadata = [fetcher sessionIdentifierMetadata]; + if (sessionIdentifierMetadata == nil) { + continue; + } + if (![sessionIdentifierMetadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] boolValue]) { + continue; + } + GTMSessionUploadFetcher *uploadFetcher = + [self uploadFetcherForSessionIdentifierMetadata:sessionIdentifierMetadata]; + if (uploadFetcher == nil) { + // Something went wrong with this upload fetcher, so kill the restored chunk fetcher. + [fetcher stopFetching]; + continue; + } + [uploadFetchers addObject:uploadFetcher]; + uploadFetcher->_chunkFetcher = fetcher; + uploadFetcher->_fetcherInFlight = fetcher; + [uploadFetcher attachSendProgressBlockToChunkFetcher:fetcher]; + fetcher.completionHandler = + [fetcher completionHandlerWithTarget:uploadFetcher + didFinishSelector:@selector(chunkFetcher:finishedWithData:error:)]; + + GTMSESSION_LOG_DEBUG(@"%@ restoring upload fetcher %@ for chunk fetcher %@", + [self class], uploadFetcher, fetcher); + } + return uploadFetchers; +} + +- (void)setUploadData:(NSData *)data { + BOOL changed = NO; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadData != data) { + _uploadData = data; + changed = YES; + } + } + if (changed) { + [self setupRequestHeaders]; + } +} + +- (NSData *)uploadData { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadData; + } +} + +- (void)setUploadFileHandle:(NSFileHandle *)fh { + BOOL changed = NO; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadFileHandle != fh) { + _uploadFileHandle = fh; + changed = YES; + } + } + if (changed) { + [self setupRequestHeaders]; + } +} + +- (NSFileHandle *)uploadFileHandle { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadFileHandle; + } +} + +- (void)setUploadFileURL:(NSURL *)uploadURL { + BOOL changed = NO; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadFileURL != uploadURL) { + _uploadFileURL = uploadURL; + changed = YES; + } + } + if (changed) { + [self setupRequestHeaders]; + } +} + +- (NSURL *)uploadFileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadFileURL; + } +} + +- (void)setUploadFileLength:(int64_t)fullLength { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadFileLength == kGTMSessionUploadFetcherUnknownFileSize && + fullLength != kGTMSessionUploadFetcherUnknownFileSize) { + _uploadFileLength = fullLength; + } + } +} + +- (void)setUploadDataLength:(int64_t)fullLength + provider:(GTMSessionUploadFetcherDataProvider)block { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _uploadDataProvider = [block copy]; + _uploadFileLength = fullLength; + } + [self setupRequestHeaders]; +} + +- (GTMSessionUploadFetcherDataProvider)uploadDataProvider { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadDataProvider; + } +} + + +- (void)setUploadMIMEType:(NSString *)uploadMIMEType { + GTMSESSION_ASSERT_DEBUG(0, @"TODO: disallow setUploadMIMEType by making declaration readonly"); + // (and uploadMIMEType, chunksize, currentOffset) + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _uploadMIMEType = uploadMIMEType; + } +} + +- (NSString *)uploadMIMEType { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadMIMEType; + } +} + +- (int64_t)chunkSize { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _chunkSize; + } +} + +- (void)setupRequestHeaders { + GTMSessionCheckNotSynchronized(self); + +#if DEBUG + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + int hasData = (_uploadData != nil) ? 1 : 0; + int hasFileHandle = (_uploadFileHandle != nil) ? 1 : 0; + int hasFileURL = (_uploadFileURL != nil) ? 1 : 0; + int hasUploadDataProvider = (_uploadDataProvider != nil) ? 1 : 0; + int numberOfSources = hasData + hasFileHandle + hasFileURL + hasUploadDataProvider; + #pragma unused(numberOfSources) + GTMSESSION_ASSERT_DEBUG(numberOfSources == 1, + @"Need just one upload source (%d)", numberOfSources); + } // @synchronized(self) +#endif + + // Add our custom headers to the initial request indicating the data + // type and total size to be delivered later in the chunk requests. + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + + GTMSESSION_ASSERT_DEBUG((mutableRequest == nil) != (_uploadLocationURL == nil), + @"Request and location are mutually exclusive"); + if (!mutableRequest) return; + + [mutableRequest setValue:kGTMSessionXGoogUploadProtocolResumable + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadProtocol]; + [mutableRequest setValue:@"start" + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; + [mutableRequest setValue:_uploadMIMEType + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadContentType]; + [mutableRequest setValue:@([self fullUploadLength]).stringValue + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadContentLength]; + + NSString *method = mutableRequest.HTTPMethod; + if (method == nil || [method caseInsensitiveCompare:@"GET"] == NSOrderedSame) { + [mutableRequest setHTTPMethod:@"POST"]; + } + + // Ensure the user agent header identifies this to the upload server as a + // GTMSessionUploadFetcher client. The /1 can be incremented in the unlikely circumstance + // we need to make a bug fix in the client that the server can recognize. + NSString *const kUserAgentStub = @"(GTMSUF/1)"; + NSString *userAgent = [mutableRequest valueForHTTPHeaderField:@"User-Agent"]; + if (userAgent == nil + || [userAgent rangeOfString:kUserAgentStub].location == NSNotFound) { + if (userAgent.length == 0) { + userAgent = GTMFetcherStandardUserAgentString(nil); + } + userAgent = [userAgent stringByAppendingFormat:@" %@", kUserAgentStub]; + [mutableRequest setValue:userAgent forHTTPHeaderField:@"User-Agent"]; + } + [self setRequest:mutableRequest]; +} + +- (void)setLocationURL:(NSURL *GTM_NULLABLE_TYPE)location + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + allowsCellularAccess:(BOOL)allowsCellularAccess { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_ASSERT_DEBUG(chunkSize > 0, @"chunk size is zero"); + + _allowsCellularAccess = allowsCellularAccess; + + // When resuming an upload, set the known upload target URL. + _uploadLocationURL = location; + + _uploadMIMEType = uploadMIMEType; + _chunkSize = chunkSize; + + // Indicate that we've not yet determined the file handle's length + _uploadFileLength = kGTMSessionUploadFetcherUnknownFileSize; + + // Indicate that we've not yet determined the upload fetcher status + _recentChunkStatusCode = -1; + + // If this is restarting an upload begun by another fetcher, + // the location is specified but the request is nil + _isRestartedUpload = (location != nil); + } // @synchronized(self) +} + +- (int64_t)fullUploadLength { + int64_t result; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadData) { + result = (int64_t)_uploadData.length; + } else { + if (_uploadFileLength == kGTMSessionUploadFetcherUnknownFileSize) { + if (_uploadFileHandle) { + // First time through, seek to end to determine file length + _uploadFileLength = (int64_t)[_uploadFileHandle seekToEndOfFile]; + } else if (_uploadDataProvider) { + // _uploadFileLength is set when the _uploadDataProvider is set. + GTMSESSION_ASSERT_DEBUG(_uploadFileLength >= 0, @"No uploadDataProvider length set"); + } else { + NSNumber *filesizeNum; + NSError *valueError; + if ([_uploadFileURL getResourceValue:&filesizeNum + forKey:NSURLFileSizeKey + error:&valueError]) { + _uploadFileLength = filesizeNum.longLongValue; + } else { + GTMSESSION_ASSERT_DEBUG(NO, @"Cannot get file size: %@\n %@", + valueError, _uploadFileURL.path); + _uploadFileLength = 0; + } + } + } + result = _uploadFileLength; + } + } // @synchronized(self) + return result; +} + +// Make a subdata of the upload data. +- (void)generateChunkSubdataWithOffset:(int64_t)offset + length:(int64_t)length + response:(GTMSessionUploadFetcherDataProviderResponse)response { + GTMSessionUploadFetcherDataProvider uploadDataProvider = self.uploadDataProvider; + if (uploadDataProvider) { + uploadDataProvider(offset, length, response); + return; + } + + NSData *uploadData = self.uploadData; + if (uploadData) { + // NSData provided. + NSData *resultData; + if (offset == 0 && length == (int64_t)uploadData.length) { + resultData = uploadData; + } else { + int64_t dataLength = (int64_t)uploadData.length; + // Ensure our range is valid. b/18007814 + if (offset + length > dataLength) { + NSString *errorMessage = [NSString stringWithFormat: + @"Range invalid for upload data. offset: %lld\tlength: %lld\tdataLength: %lld", + offset, length, dataLength]; + GTMSESSION_ASSERT_DEBUG(NO, @"%@", errorMessage); + response(nil, + kGTMSessionUploadFetcherUnknownFileSize, + [self uploadChunkUnavailableErrorWithDescription:errorMessage]); + return; + } + NSRange range = NSMakeRange((NSUInteger)offset, (NSUInteger)length); + + @try { + resultData = [uploadData subdataWithRange:range]; + } + @catch (NSException *exception) { + NSString *errorMessage = exception.description; + GTMSESSION_ASSERT_DEBUG(NO, @"%@", errorMessage); + response(nil, + kGTMSessionUploadFetcherUnknownFileSize, + [self uploadChunkUnavailableErrorWithDescription:errorMessage]); + return; + } + } + response(resultData, kGTMSessionUploadFetcherUnknownFileSize, nil); + return; + } + NSURL *uploadFileURL = self.uploadFileURL; + if (uploadFileURL) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [self generateChunkSubdataFromFileURL:uploadFileURL + offset:offset + length:length + response:response]; + }); + return; + } + GTMSESSION_ASSERT_DEBUG(_uploadFileHandle, @"Unexpectedly missing upload data package"); + NSFileHandle *uploadFileHandle = self.uploadFileHandle; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [self generateChunkSubdataFromFileHandle:uploadFileHandle + offset:offset + length:length + response:response]; + }); +} + +- (void)generateChunkSubdataFromFileHandle:(NSFileHandle *)fileHandle + offset:(int64_t)offset + length:(int64_t)length + response:(GTMSessionUploadFetcherDataProviderResponse)response { + NSData *resultData; + NSError *error; + @try { + [fileHandle seekToFileOffset:(unsigned long long)offset]; + resultData = [fileHandle readDataOfLength:(NSUInteger)length]; + } + @catch (NSException *exception) { + GTMSESSION_ASSERT_DEBUG(NO, @"uploadFileHandle failed to read, %@", exception); + error = [self uploadChunkUnavailableErrorWithDescription:exception.description]; + } + // The response always re-dispatches to the main thread, so we skip doing that here. + response(resultData, kGTMSessionUploadFetcherUnknownFileSize, error); +} + +- (void)generateChunkSubdataFromFileURL:(NSURL *)fileURL + offset:(int64_t)offset + length:(int64_t)length + response:(GTMSessionUploadFetcherDataProviderResponse)response { + GTMSessionCheckNotSynchronized(self); + + NSData *resultData; + NSError *error; + int64_t fullUploadLength = [self fullUploadLength]; + NSData *mappedData = + [NSData dataWithContentsOfURL:fileURL + options:NSDataReadingMappedAlways + NSDataReadingUncached + error:&error]; + if (!mappedData) { + // We could not create an NSData by memory-mapping the file. +#if TARGET_IPHONE_SIMULATOR + // NSTemporaryDirectory() can differ in the simulator between app restarts, + // yet the contents for the new path remains unchanged, so try the latest temp path. + if ([error.domain isEqual:NSCocoaErrorDomain] && (error.code == NSFileReadNoSuchFileError)) { + NSString *filename = [fileURL lastPathComponent]; + NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:filename]; + NSURL *newFileURL = [NSURL fileURLWithPath:filePath]; + if (![newFileURL isEqual:fileURL]) { + [self generateChunkSubdataFromFileURL:newFileURL + offset:offset + length:length + response:response]; + return; + } + } +#endif + + // If the file is just too large to create an NSData for, or if for some other reason we can't + // map it, create an NSFileHandle instead to read a subset into an NSData. +#if DEBUG + NSNumber *fileSizeNum; + BOOL hasFileSize = [fileURL getResourceValue:&fileSizeNum forKey:NSURLFileSizeKey error:NULL]; + GTMSESSION_LOG_DEBUG(@"Note: uploadFileURL is falling back to creating upload chunks by reading" + @" an NSFileHandle since uploadFileURL failed to map the upload file," + @" file size %@, %@", + hasFileSize ? fileSizeNum : @"unknown", error); +#endif + + NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:fileURL + error:&error]; + if (fileHandle != nil) { + [self generateChunkSubdataFromFileHandle:fileHandle + offset:offset + length:length + response:response]; + return; + } + GTMSESSION_ASSERT_DEBUG(NO, @"uploadFileURL failed to read, %@", error); + // Fall through with the error. + } else { + // Successfully created an NSData by memory-mapping the file. + if ((NSUInteger)(offset + length) > mappedData.length) { + NSString *errorMessage = [NSString stringWithFormat: + @"Range invalid for upload data. offset: %lld\tlength: %lld\tdataLength: %lld\texpected UploadLength: %lld", + offset, length, (long long)mappedData.length, fullUploadLength]; + GTMSESSION_ASSERT_DEBUG(NO, @"%@", errorMessage); + response(nil, + kGTMSessionUploadFetcherUnknownFileSize, + [self uploadChunkUnavailableErrorWithDescription:errorMessage]); + return; + } + if (offset > 0 || length < fullUploadLength) { + NSRange range = NSMakeRange((NSUInteger)offset, (NSUInteger)length); + resultData = [mappedData subdataWithRange:range]; + } else { + resultData = mappedData; + } + } + // The response always re-dispatches to the main thread, so we skip re-dispatching here. + response(resultData, kGTMSessionUploadFetcherUnknownFileSize, error); +} + +- (NSError *)uploadChunkUnavailableErrorWithDescription:(NSString *)description { + // The description in the userInfo is intended as a clue to programmers, not + // for client code to examine or rely on. + NSDictionary *userInfo = @{ @"description" : description }; + return [NSError errorWithDomain:kGTMSessionFetcherErrorDomain + code:GTMSessionFetcherErrorUploadChunkUnavailable + userInfo:userInfo]; +} + +- (NSError *)prematureFailureErrorWithUserInfo:(NSDictionary *)userInfo { + // An error for if we get an unexpected status from the upload server or + // otherwise cannot continue. This is an issue beyond the upload protocol; + // there's no way the client can do anything useful except give up. + NSError *error = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain + code:501 // Not implemented + userInfo:userInfo]; + return error; +} + ++ (GTMSessionUploadFetcherStatus)uploadStatusFromResponseHeaders:(NSDictionary *)responseHeaders { + NSString *statusString = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus]; + if ([statusString isEqual:@"active"]) { + return kStatusActive; + } + if ([statusString isEqual:@"final"]) { + return kStatusFinal; + } + if ([statusString isEqual:@"cancelled"]) { + return kStatusCancelled; + } + return kStatusUnknown; +} + +#pragma mark Method overrides affecting the initial fetch only + +- (void)setCompletionHandler:(GTMSessionFetcherCompletionHandler)handler { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delegateCompletionHandler = handler; + } +} + +- (void)setDelegateCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delegateCallbackQueue = queue; + } +} + +- (dispatch_queue_t GTM_NULLABLE_TYPE)delegateCallbackQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateCallbackQueue; + } +} + +- (BOOL)isRestartedUpload { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _isRestartedUpload; + } +} + +- (GTMSessionFetcher * GTM_NULLABLE_TYPE)chunkFetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _chunkFetcher; + } +} + +- (void)setChunkFetcher:(GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _chunkFetcher = fetcher; + } +} + +- (void)setFetcherInFlight:(GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _fetcherInFlight = fetcher; + } +} + +- (GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcherInFlight { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _fetcherInFlight; + } +} + +- (void)setCancellationHandler:(GTMSessionUploadFetcherCancellationHandler GTM_NULLABLE_TYPE) + cancellationHandler { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _cancellationHandler = cancellationHandler; + } +} + +- (GTMSessionUploadFetcherCancellationHandler GTM_NULLABLE_TYPE)cancellationHandler { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _cancellationHandler; + } +} + +- (void)beginFetchForRetry { + GTMSessionCheckNotSynchronized(self); + + // Override the superclass to reset the initial body length and fetcher-in-flight, + // then call the superclass implementation. + [self setInitialBodyLength:[self bodyLength]]; + + GTMSESSION_ASSERT_DEBUG(self.fetcherInFlight == nil, @"unexpected fetcher in flight: %@", + self.fetcherInFlight); + self.fetcherInFlight = self; + [super beginFetchForRetry]; +} + +- (void)beginFetchWithCompletionHandler:(GTMSessionFetcherCompletionHandler)handler { + GTMSessionCheckNotSynchronized(self); + + [self setInitialBodyLength:[self bodyLength]]; + + // We'll hold onto the superclass's callback queue so we can invoke the handler + // even after the superclass has released the queue and its callback handler, as + // happens during auth failure. + [self setDelegateCallbackQueue:self.callbackQueue]; + self.completionHandler = handler; + + if ([self isRestartedUpload]) { + // When restarting an upload, we know the destination location for chunk fetches, + // but we need to query to find the initial offset. + if (![self isPaused]) { + [self sendQueryForUploadOffsetWithFetcherProperties:self.properties]; + } + return; + } + // We don't want to call into the client's completion block immediately + // after the finish of the initial connection (the delegate is called only + // when uploading finishes), so we substitute our own completion block to be + // called when the initial connection finishes + GTMSESSION_ASSERT_DEBUG(self.fetcherInFlight == nil, @"unexpected fetcher in flight: %@", + self.fetcherInFlight); + + self.fetcherInFlight = self; + [super beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + self.fetcherInFlight = nil; + // callback + + BOOL hasTestBlock = (self.testBlock != nil); + if (![self isRestartedUpload] && !hasTestBlock) { + if (error == nil) { + [self beginChunkFetches]; + } else { + if ([self retryTimer] == nil) { + [self invokeFinalCallbackWithData:nil + error:error + shouldInvalidateLocation:YES]; + } + } + } else { + // If there was no initial request, then this fetch is resuming some + // other uploadFetcher's initial request, and the superclass's connection + // is never used, so at this point we call the user's actual completion + // block. + if (!hasTestBlock) { + [self invokeFinalCallbackWithData:data + error:error + shouldInvalidateLocation:YES]; + } else { + // There was a test block, so we won't do chunk fetches, but we simulate obtaining + // the data to be uploaded from the upload data provider block or the file handle, + // and then call back. + [self generateChunkSubdataWithOffset:0 + length:[self fullUploadLength] + response:^(NSData *generateData, int64_t fullUploadLength, NSError *generateError) { + [self invokeFinalCallbackWithData:data + error:error + shouldInvalidateLocation:YES]; + }]; + } + } + }]; +} + +- (void)beginChunkFetches { + GTMSessionCheckNotSynchronized(self); + +#if DEBUG + // The initial response of the resumable upload protocol should have an + // empty body + // + // This assert typically happens because the upload create/edit link URL was + // not supplied with the request, and the server is thus expecting a non- + // resumable request/response. + if (self.downloadedData.length > 0) { + NSData *downloadedData = self.downloadedData; + NSString *str = [[NSString alloc] initWithData:downloadedData + encoding:NSUTF8StringEncoding]; + #pragma unused(str) + GTMSESSION_ASSERT_DEBUG(NO, @"unexpected response data (uploading to the wrong URL?)\n%@", str); + } +#endif + + // We need to get the upload URL from the location header to continue. + NSDictionary *responseHeaders = [self responseHeaders]; + + [self retrieveUploadChunkGranularityFromResponseHeaders:responseHeaders]; + + GTMSessionUploadFetcherStatus uploadStatus = + [[self class] uploadStatusFromResponseHeaders:responseHeaders]; + GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown, + @"beginChunkFetches has unexpected upload status for headers %@", responseHeaders); + + BOOL isPrematureStop = (uploadStatus == kStatusFinal) || (uploadStatus == kStatusCancelled); + + NSString *uploadLocationURLStr = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadURL]; + BOOL hasUploadLocation = (uploadLocationURLStr.length > 0); + + if (isPrematureStop || !hasUploadLocation) { + GTMSESSION_ASSERT_DEBUG(NO, @"Premature failure: upload-status:\"%@\" location:%@", + [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus], uploadLocationURLStr); + // We cannot continue since we do not know the location to use + // as our upload destination. + NSDictionary *userInfo = nil; + NSData *downloadedData = self.downloadedData; + if (downloadedData.length > 0) { + userInfo = @{ kGTMSessionFetcherStatusDataKey : downloadedData }; + } + NSError *failureError = [self prematureFailureErrorWithUserInfo:userInfo]; + [self invokeFinalCallbackWithData:nil + error:failureError + shouldInvalidateLocation:YES]; + return; + } + + self.uploadLocationURL = [NSURL URLWithString:uploadLocationURLStr]; + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc postNotificationName:kGTMSessionFetcherUploadLocationObtainedNotification + object:self]; + + // we've now sent all of the initial post body data, so we need to include + // its size in future progress indicator callbacks + [self setInitialBodySent:[self initialBodyLength]]; + + // just in case the user paused us during the initial fetch... + if (![self isPaused]) { + [self uploadNextChunkWithOffset:0]; + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent + totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { + // Overrides the superclass. + [self invokeDelegateWithDidSendBytes:bytesSent + totalBytesSent:totalBytesSent + totalBytesExpectedToSend:totalBytesExpectedToSend + [self fullUploadLength]]; +} + +- (BOOL)shouldReleaseCallbacksUponCompletion { + // Overrides the superclass. + + // We don't want the superclass to release the delegate and callback + // blocks once the initial fetch has finished + // + // This is invoked for only successful completion of the connection; + // an error always will invoke and release the callbacks + return NO; +} + +- (void)invokeFinalCallbackWithData:(NSData *)data + error:(NSError *)error + shouldInvalidateLocation:(BOOL)shouldInvalidateLocation { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (shouldInvalidateLocation) { + _uploadLocationURL = nil; + } + + dispatch_queue_t queue = _delegateCallbackQueue; + GTMSessionFetcherCompletionHandler handler = _delegateCompletionHandler; + if (queue && handler) { + [self invokeOnCallbackQueue:queue + afterUserStopped:NO + block:^{ + handler(data, error); + }]; + } + } // @synchronized(self) + + [self releaseUploadAndBaseCallbacks:!self.userStoppedFetching]; +} + +- (void)releaseUploadAndBaseCallbacks:(BOOL)shouldReleaseCancellation { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delegateCallbackQueue = nil; + _delegateCompletionHandler = nil; + _uploadDataProvider = nil; + if (shouldReleaseCancellation) { + _cancellationHandler = nil; + } + } + + // Release the base class's callbacks, too, if needed. + [self releaseCallbacks]; +} + +- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks { + GTMSessionCheckNotSynchronized(self); + + // Clear _fetcherInFlight when stopped. Moved from stopFetching, since that's a public method, + // where this method does the work. Fixes issue clearing value when retryBlock included. + GTMSessionFetcher *fetcherInFlight = self.fetcherInFlight; + if (fetcherInFlight == self) { + self.fetcherInFlight = nil; + } + + [super stopFetchReleasingCallbacks:shouldReleaseCallbacks]; + + if (shouldReleaseCallbacks) { + [self releaseUploadAndBaseCallbacks:NO]; + } +} + +#pragma mark Chunk fetching methods + +- (void)uploadNextChunkWithOffset:(int64_t)offset { + // use the properties in each chunk fetcher + NSDictionary *props = [self properties]; + + [self uploadNextChunkWithOffset:offset + fetcherProperties:props]; +} + +- (void)sendQueryForUploadOffsetWithFetcherProperties:(NSDictionary *)props { + GTMSessionFetcher *queryFetcher = [self uploadFetcherWithProperties:props + isQueryFetch:YES]; + queryFetcher.bodyData = [NSData data]; + + NSString *originalComment = self.comment; + [queryFetcher setCommentWithFormat:@"%@ (query offset)", + originalComment ? originalComment : @"upload"]; + + [queryFetcher setRequestValue:@"query" forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; + + self.fetcherInFlight = queryFetcher; + [queryFetcher beginFetchWithDelegate:self + didFinishSelector:@selector(queryFetcher:finishedWithData:error:)]; +} + +- (void)queryFetcher:(GTMSessionFetcher *)queryFetcher + finishedWithData:(NSData *)data + error:(NSError *)error { + self.fetcherInFlight = nil; + + NSDictionary *responseHeaders = [queryFetcher responseHeaders]; + NSString *sizeReceivedHeader; + + GTMSessionUploadFetcherStatus uploadStatus = + [[self class] uploadStatusFromResponseHeaders:responseHeaders]; + GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown || error != nil, + @"query fetcher completion has unexpected upload status for headers %@", responseHeaders); + + if (error == nil) { + sizeReceivedHeader = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadSizeReceived]; + + if (uploadStatus == kStatusCancelled || + (uploadStatus == kStatusActive && sizeReceivedHeader == nil)) { + NSDictionary *userInfo = nil; + if (data.length > 0) { + userInfo = @{ kGTMSessionFetcherStatusDataKey : data }; + } + error = [self prematureFailureErrorWithUserInfo:userInfo]; + } + } + + if (error == nil) { + int64_t offset = [sizeReceivedHeader longLongValue]; + int64_t fullUploadLength = [self fullUploadLength]; + if (uploadStatus == kStatusFinal || + (offset >= fullUploadLength && + fullUploadLength != kGTMSessionUploadFetcherUnknownFileSize)) { + // Handle we're done + [self chunkFetcher:queryFetcher finishedWithData:data error:nil]; + } else { + [self retrieveUploadChunkGranularityFromResponseHeaders:responseHeaders]; + [self uploadNextChunkWithOffset:offset]; + } + } else { + // Handle query error + [self chunkFetcher:queryFetcher finishedWithData:data error:error]; + } +} + +- (void)sendCancelUploadWithFetcherProperties:(NSDictionary *)props { + @synchronized(self) { + _isCancelInFlight = YES; + } + GTMSessionFetcher *cancelFetcher = [self uploadFetcherWithProperties:props + isQueryFetch:YES]; + cancelFetcher.bodyData = [NSData data]; + + NSString *originalComment = self.comment; + [cancelFetcher setCommentWithFormat:@"%@ (cancel)", + originalComment ? originalComment : @"upload"]; + + [cancelFetcher setRequestValue:@"cancel" forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; + + self.fetcherInFlight = cancelFetcher; + [cancelFetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + self.fetcherInFlight = nil; + if (![self triggerCancellationHandlerForFetch:cancelFetcher data:data error:error]) { + if (error) { + GTMSESSION_LOG_DEBUG(@"cancelFetcher %@", error); + } + } + @synchronized(self) { + self->_isCancelInFlight = NO; + } + }]; +} + +- (void)uploadNextChunkWithOffset:(int64_t)offset + fetcherProperties:(NSDictionary *)props { + GTMSessionCheckNotSynchronized(self); + + // Example chunk headers: + // X-Goog-Upload-Command: upload, finalize + // X-Goog-Upload-Offset: 0 + // Content-Length: 2000000 + // Content-Type: image/jpeg + // + // {bytes 0-1999999} + + // The chunk upload URL requires no authentication header. + GTMSessionFetcher *chunkFetcher = [self uploadFetcherWithProperties:props + isQueryFetch:NO]; + [self attachSendProgressBlockToChunkFetcher:chunkFetcher]; + int64_t chunkSize = [self updateChunkFetcher:chunkFetcher + forChunkAtOffset:offset]; + BOOL isUploadingFileURL = (self.uploadFileURL != nil); + int64_t fullUploadLength = [self fullUploadLength]; + + // The chunk size may have changed, so determine again if we're uploading the full file. + BOOL isUploadingFullFile = (offset == 0 && + fullUploadLength != kGTMSessionUploadFetcherUnknownFileSize && + chunkSize >= fullUploadLength); + if (isUploadingFullFile && isUploadingFileURL) { + // The data is the full upload file URL. + chunkFetcher.bodyFileURL = self.uploadFileURL; + [self beginChunkFetcher:chunkFetcher + offset:offset]; + } else { + // Make an NSData for the subset for this upload chunk. + self.subdataGenerating = YES; + [self generateChunkSubdataWithOffset:offset + length:chunkSize + response:^(NSData *chunkData, int64_t uploadFileLength, NSError *chunkError) { + // The subdata methods may leave us on a background thread. + dispatch_async(dispatch_get_main_queue(), ^{ + self.subdataGenerating = NO; + + // dont allow the updating of fileLength for uploads not using a data provider as they + // should know the file length before the upload starts. + if (self->_uploadDataProvider != nil && uploadFileLength > 0) { + [self setUploadFileLength:uploadFileLength]; + // Update the command and content-length headers if this is the last chunk to be sent. + if (offset + chunkSize >= uploadFileLength) { + int64_t updatedChunkSize = [self updateChunkFetcher:chunkFetcher + forChunkAtOffset:offset]; + if (updatedChunkSize == 0) { + // Calling beginChunkFetcher early when there is no more data to send allows us to + // properly handle nil chunkData below without having to account for the case where + // we are just finalizing the file. + chunkFetcher.bodyData = [[NSData alloc] init]; + [self beginChunkFetcher:chunkFetcher + offset:offset]; + return; + } + } + } + + if (chunkData == nil) { + NSError *responseError = chunkError; + if (!responseError) { + responseError = [self uploadChunkUnavailableErrorWithDescription:@"chunkData is nil"]; + } + [self invokeFinalCallbackWithData:nil + error:responseError + shouldInvalidateLocation:YES]; + return; + } + + BOOL didWriteFile = NO; + if (isUploadingFileURL) { + // Make a temporary file with the data subset. + NSString *tempName = + [NSString stringWithFormat:@"GTMUpload_temp_%@", [[NSUUID UUID] UUIDString]]; + NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:tempName]; + NSError *writeError; + didWriteFile = [chunkData writeToFile:tempPath + options:NSDataWritingAtomic + error:&writeError]; + if (didWriteFile) { + chunkFetcher.bodyFileURL = [NSURL fileURLWithPath:tempPath]; + } else { + GTMSESSION_LOG_DEBUG(@"writeToFile failed: %@\n%@", writeError, tempPath); + } + } + if (!didWriteFile) { + chunkFetcher.bodyData = [chunkData copy]; + } + [self beginChunkFetcher:chunkFetcher + offset:offset]; + }); + }]; + } +} + +- (void)beginChunkFetcher:(GTMSessionFetcher *)chunkFetcher + offset:(int64_t)offset { + + // Track the current offset for progress reporting + self.currentOffset = offset; + + // Hang on to the fetcher in case we need to cancel it. We set these before beginning the + // chunk fetch so the observers notified of chunk fetches can inspect the upload fetcher to + // match to the chunk. + self.chunkFetcher = chunkFetcher; + self.fetcherInFlight = chunkFetcher; + + // Update the last chunk request, including any request headers. + self.lastChunkRequest = chunkFetcher.request; + + [chunkFetcher beginFetchWithDelegate:self + didFinishSelector:@selector(chunkFetcher:finishedWithData:error:)]; +} + +- (void)attachSendProgressBlockToChunkFetcher:(GTMSessionFetcher *)chunkFetcher { + chunkFetcher.sendProgressBlock = ^(int64_t bytesSent, int64_t totalBytesSent, + int64_t totalBytesExpectedToSend) { + // The total bytes expected include the initial body and the full chunked + // data, independent of how big this fetcher's chunk is. + int64_t initialBodySent = [self bodyLength]; // TODO(grobbins) use [self initialBodySent] + int64_t totalSent = initialBodySent + self.currentOffset + totalBytesSent; + int64_t totalExpected = initialBodySent + [self fullUploadLength]; + + [self invokeDelegateWithDidSendBytes:bytesSent + totalBytesSent:totalSent + totalBytesExpectedToSend:totalExpected]; + }; +} + +- (NSDictionary *)uploadSessionIdentifierMetadata { + NSMutableDictionary *metadata = [NSMutableDictionary dictionary]; + metadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] = @YES; + GTMSESSION_ASSERT_DEBUG(self.uploadFileURL, + @"Invalid upload fetcher to create session identifier for metadata"); + metadata[kGTMSessionIdentifierUploadFileURLMetadataKey] = [self.uploadFileURL absoluteString]; + metadata[kGTMSessionIdentifierUploadFileLengthMetadataKey] = @([self fullUploadLength]); + + if (self.uploadLocationURL) { + metadata[kGTMSessionIdentifierUploadLocationURLMetadataKey] = + [self.uploadLocationURL absoluteString]; + } + if (self.uploadMIMEType) { + metadata[kGTMSessionIdentifierUploadMIMETypeMetadataKey] = self.uploadMIMEType; + } + metadata[kGTMSessionIdentifierUploadChunkSizeMetadataKey] = @(self.chunkSize); + metadata[kGTMSessionIdentifierUploadCurrentOffsetMetadataKey] = @(self.currentOffset); + metadata[kGTMSessionIdentifierUploadAllowsCellularAccess] = @(self.request.allowsCellularAccess); + + return metadata; +} + +- (GTMSessionFetcher *)uploadFetcherWithProperties:(NSDictionary *)properties + isQueryFetch:(BOOL)isQueryFetch { + GTMSessionCheckNotSynchronized(self); + + // Common code to make a request for a query command or for a chunk upload. + NSURL *uploadLocationURL = self.uploadLocationURL; + NSMutableURLRequest *chunkRequest = [NSMutableURLRequest requestWithURL:uploadLocationURL]; + [chunkRequest setHTTPMethod:@"PUT"]; + + // copy the user-agent from the original connection + // n.b. that self.request is nil for upload fetchers created with an existing upload location + // URL. + NSURLRequest *origRequest = self.request; + + chunkRequest.allowsCellularAccess = origRequest.allowsCellularAccess; + if (!origRequest) { + chunkRequest.allowsCellularAccess = _allowsCellularAccess; + } + NSString *userAgent = [origRequest valueForHTTPHeaderField:@"User-Agent"]; + if (userAgent.length > 0) { + [chunkRequest setValue:userAgent forHTTPHeaderField:@"User-Agent"]; + } + + [chunkRequest setValue:kGTMSessionXGoogUploadProtocolResumable + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadProtocol]; + + // To avoid timeouts when debugging, copy the timeout of the initial fetcher. + NSTimeInterval origTimeout = [origRequest timeoutInterval]; + [chunkRequest setTimeoutInterval:origTimeout]; + + // + // Make a new chunk fetcher. + // + GTMSessionFetcher *chunkFetcher = [GTMSessionFetcher fetcherWithRequest:chunkRequest]; + chunkFetcher.callbackQueue = self.callbackQueue; + chunkFetcher.sessionUserInfo = self.sessionUserInfo; + chunkFetcher.configurationBlock = self.configurationBlock; + chunkFetcher.allowedInsecureSchemes = self.allowedInsecureSchemes; + chunkFetcher.allowLocalhostRequest = self.allowLocalhostRequest; + chunkFetcher.allowInvalidServerCertificates = self.allowInvalidServerCertificates; + chunkFetcher.useUploadTask = !isQueryFetch; + + if (self.uploadFileURL && !isQueryFetch && self.useBackgroundSession) { + [chunkFetcher createSessionIdentifierWithMetadata:[self uploadSessionIdentifierMetadata]]; + } + + // Give the chunk fetcher the same properties as the previous chunk fetcher + chunkFetcher.properties = [properties mutableCopy]; + [chunkFetcher setProperty:[NSValue valueWithNonretainedObject:self] + forKey:kGTMSessionUploadFetcherChunkParentKey]; + + // copy other fetcher settings to the new fetcher + chunkFetcher.retryEnabled = self.retryEnabled; + chunkFetcher.maxRetryInterval = self.maxRetryInterval; + + if ([self isRetryEnabled]) { + // We interpose our own retry method both so we can change the request to ask the server to + // tell us where to resume the chunk. + chunkFetcher.retryBlock = ^(BOOL suggestedWillRetry, NSError *chunkError, + GTMSessionFetcherRetryResponse response) { + void (^finish)(BOOL) = ^(BOOL shouldRetry){ + // We'll retry by sending an offset query. + if (shouldRetry) { + self.shouldInitiateOffsetQuery = !isQueryFetch; + + // We don't know what our actual offset is anymore, but the server will tell us. + self.currentOffset = 0; + } + // We don't actually want to retry this specific fetcher. + response(NO); + }; + + GTMSessionFetcherRetryBlock retryBlock = self.retryBlock; + if (retryBlock) { + // Ask the client, then call the finish block above. + retryBlock(suggestedWillRetry, chunkError, finish); + } else { + finish(suggestedWillRetry); + } + }; + } + + return chunkFetcher; +} + +- (void)chunkFetcher:(GTMSessionFetcher *)chunkFetcher + finishedWithData:(NSData *)data + error:(NSError *)error { + BOOL hasDestroyedOldChunkFetcher = NO; + self.fetcherInFlight = nil; + + NSDictionary *responseHeaders = [chunkFetcher responseHeaders]; + GTMSessionUploadFetcherStatus uploadStatus = + [[self class] uploadStatusFromResponseHeaders:responseHeaders]; + GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown + || error != nil + || self.wasCreatedFromBackgroundSession, + @"chunk fetcher completion has kStatusUnknown upload status for headers %@ fetcher %@", + responseHeaders, self); + BOOL isUploadStatusStopped = (uploadStatus == kStatusFinal || uploadStatus == kStatusCancelled); + + // Check if the fetcher was actually querying. If it failed, do not retry, + // as it would enter an infinite retry loop. + NSString *uploadCommand = + chunkFetcher.request.allHTTPHeaderFields[kGTMSessionHeaderXGoogUploadCommand]; + BOOL isQueryFetch = [uploadCommand isEqual:@"query"]; + + // TODO + // Maybe here we can check to see if the request had x goog content length set. (the file length one). + NSString *previousContentLengthValue = + [chunkFetcher.request valueForHTTPHeaderField:@"Content-Length"]; + // The Content-Length header may not be present if the chunk fetcher was recreated from + // a background session. + BOOL hasKnownChunkSize = (previousContentLengthValue != nil); + int64_t previousContentLength = [previousContentLengthValue longLongValue]; + + BOOL needsQuery = (!hasKnownChunkSize && !isUploadStatusStopped); + + if (error || (needsQuery && !isQueryFetch)) { + NSInteger status = error.code; + + // Status 4xx indicates a bad offset in the Google upload protocol. However, do not retry status + // 404 per spec, nor if the upload size appears to have been zero (since the server will just + // keep asking us to retry.) + if (self.shouldInitiateOffsetQuery || + (needsQuery && !isQueryFetch) || + ([error.domain isEqual:kGTMSessionFetcherStatusDomain] && + status >= 400 && status <= 499 && + status != 404 && + uploadStatus == kStatusActive && + previousContentLength > 0)) { + self.shouldInitiateOffsetQuery = NO; + [self destroyChunkFetcher]; + hasDestroyedOldChunkFetcher = YES; + [self sendQueryForUploadOffsetWithFetcherProperties:chunkFetcher.properties]; + } else { + // Some unexpected status has occurred; handle it as we would a regular + // object fetcher failure. + [self invokeFinalCallbackWithData:data + error:error + shouldInvalidateLocation:NO]; + } + } else { + // The chunk has uploaded successfully. + int64_t newOffset = self.currentOffset + previousContentLength; +#if DEBUG + // Verify that if we think all of the uploading data has been sent, the server responded with + // the "final" upload status. + BOOL hasUploadAllData = (newOffset == [self fullUploadLength]); + BOOL isFinalStatus = (uploadStatus == kStatusFinal); + #pragma unused(hasUploadAllData,isFinalStatus) + GTMSESSION_ASSERT_DEBUG(hasUploadAllData == isFinalStatus || !hasKnownChunkSize, + @"uploadStatus:%@ newOffset:%lld (%lld + %lld) fullUploadLength:%lld" + @" chunkFetcher:%@ requestHeaders:%@ responseHeaders:%@", + [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus], + newOffset, self.currentOffset, previousContentLength, + [self fullUploadLength], + chunkFetcher, chunkFetcher.request.allHTTPHeaderFields, + responseHeaders); +#endif + if (isUploadStatusStopped || + (!_uploadData && _uploadFileLength == 0) || + (_currentOffset > _uploadFileLength && _uploadFileLength > 0)) { + // This was the last chunk. + if (error == nil && uploadStatus == kStatusCancelled) { + // Report cancelled status as an error. + NSDictionary *userInfo = nil; + if (data.length > 0) { + userInfo = @{ kGTMSessionFetcherStatusDataKey : data }; + } + data = nil; + error = [self prematureFailureErrorWithUserInfo:userInfo]; + } else { + // The upload is in final status. + // + // Take the chunk fetcher's data as the superclass data. + self.downloadedData = data; + self.statusCode = chunkFetcher.statusCode; + } + + // we're done + [self invokeFinalCallbackWithData:data + error:error + shouldInvalidateLocation:YES]; + } else { + // Start the next chunk. + self.currentOffset = newOffset; + + // We want to destroy this chunk fetcher before creating the next one, but + // we want to pass on its properties + NSDictionary *props = [chunkFetcher properties]; + + // We no longer need to be able to cancel this chunkFetcher. Destroy it + // before we create a new chunk fetcher. + [self destroyChunkFetcher]; + hasDestroyedOldChunkFetcher = YES; + + [self uploadNextChunkWithOffset:newOffset + fetcherProperties:props]; + } + } + if (!hasDestroyedOldChunkFetcher) { + [self destroyChunkFetcher]; + } +} + +- (void)destroyChunkFetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_fetcherInFlight == _chunkFetcher) { + _fetcherInFlight = nil; + } + + [_chunkFetcher stopFetching]; + + NSURL *chunkFileURL = _chunkFetcher.bodyFileURL; + BOOL wasTemporaryUploadFile = ![chunkFileURL isEqual:_uploadFileURL]; + if (wasTemporaryUploadFile) { + NSError *error; + [[NSFileManager defaultManager] removeItemAtURL:chunkFileURL + error:&error]; + if (error) { + GTMSESSION_LOG_DEBUG(@"removingItemAtURL failed: %@\n%@", error, chunkFileURL); + } + } + + _recentChunkReponseHeaders = _chunkFetcher.responseHeaders; + + // To avoid retain cycles, remove all properties except the parent identifier. + _chunkFetcher.properties = + @{ kGTMSessionUploadFetcherChunkParentKey : [NSValue valueWithNonretainedObject:self] }; + + _chunkFetcher.retryBlock = nil; + _chunkFetcher.sendProgressBlock = nil; + _chunkFetcher = nil; + } // @synchronized(self) +} + +// This method calculates the proper values to pass to the client's send progress block. +// +// The actual total bytes sent include the initial body sent, plus the +// offset into the batched data prior to the current chunk fetcher + +- (void)invokeDelegateWithDidSendBytes:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent + totalBytesExpectedToSend:(int64_t)totalBytesExpected { + GTMSessionCheckNotSynchronized(self); + + // Ensure the chunk fetcher survives the callback in case the user pauses the upload process. + __block GTMSessionFetcher *holdFetcher = self.chunkFetcher; + + [self invokeOnCallbackQueue:self.delegateCallbackQueue + afterUserStopped:NO + block:^{ + GTMSessionFetcherSendProgressBlock sendProgressBlock = self.sendProgressBlock; + if (sendProgressBlock) { + sendProgressBlock(bytesSent, totalBytesSent, totalBytesExpected); + } + holdFetcher = nil; + }]; +} + +- (void)retrieveUploadChunkGranularityFromResponseHeaders:(NSDictionary *)responseHeaders { + GTMSessionCheckNotSynchronized(self); + + // Standard granularity for Google uploads is 256K. + NSString *chunkGranularityHeader = + [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadChunkGranularity]; + self.uploadGranularity = chunkGranularityHeader.longLongValue; +} + +#pragma mark - + +- (BOOL)isPaused { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _isPaused; + } // @synchronized(self) +} + +- (void)pauseFetching { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _isPaused = YES; + } // @synchronized(self) + + // Pausing just means stopping the current chunk from uploading; + // when we resume, we will send a query request to the server to + // figure out what bytes to resume sending. + // + // We won't try to cancel the initial data upload, but rather will check + // for being paused in beginChunkFetches. + [self destroyChunkFetcher]; +} + +- (void)resumeFetching { + BOOL wasPaused; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + wasPaused = _isPaused; + _isPaused = NO; + } // @synchronized(self) + + if (wasPaused) { + [self sendQueryForUploadOffsetWithFetcherProperties:self.properties]; + } +} + +- (void)stopFetching { + // Overrides the superclass + [self destroyChunkFetcher]; + + // If we think the server is waiting for more data, then tell it there won't be more. + if (self.uploadLocationURL) { + [self sendCancelUploadWithFetcherProperties:[self properties]]; + self.uploadLocationURL = nil; + } else { + [self invokeOnCallbackQueue:self.callbackQueue + afterUserStopped:YES + block:^{ + // Repeated calls to stopFetching may cause this path to be reached despite having sent a real + // cancel request, check here to ensure that the cancellation handler invocation which fires + // will definitely be for the real request sent previously. + @synchronized(self) { + if (self->_isCancelInFlight) { + return; + } + } + [self triggerCancellationHandlerForFetch:nil data:nil error:nil]; + }]; + } + + [super stopFetching]; +} + +// Fires the cancellation handler, returning whether there was a handler to be fired. +- (BOOL)triggerCancellationHandlerForFetch:(GTMSessionFetcher *)fetcher + data:(NSData *)data + error:(NSError *)error { + GTMSessionUploadFetcherCancellationHandler handler = self.cancellationHandler; + if (handler) { + handler(fetcher, data, error); + self.cancellationHandler = nil; + return YES; + } + return NO; +} + +#pragma mark - + +- (int64_t)updateChunkFetcher:(GTMSessionFetcher *)chunkFetcher + forChunkAtOffset:(int64_t)offset { + BOOL isUploadingFileURL = (self.uploadFileURL != nil); + + // Upload another chunk, meeting server-required granularity. + int64_t chunkSize = self.chunkSize; + + int64_t fullUploadLength = [self fullUploadLength]; + BOOL isFileLengthKnown = fullUploadLength >= 0; + + BOOL isUploadingFullFile = (offset == 0 && isFileLengthKnown && chunkSize >= fullUploadLength); + if (!isUploadingFileURL || !isUploadingFullFile) { + // We're not uploading the entire file and given the file URL. Since we'll be + // allocating a subdata block for a chunk, we need to bound it to something that + // won't blow the process's memory. + if (chunkSize > kGTMSessionUploadFetcherMaximumDemandBufferSize) { + chunkSize = kGTMSessionUploadFetcherMaximumDemandBufferSize; + } + } + + int64_t granularity = self.uploadGranularity; + if (granularity > 0) { + if (chunkSize < granularity) { + chunkSize = granularity; + } else { + chunkSize = chunkSize - (chunkSize % granularity); + } + } + + GTMSESSION_ASSERT_DEBUG(offset < fullUploadLength || fullUploadLength == 0, + @"offset %lld exceeds data length %lld", offset, fullUploadLength); + + if (granularity > 0) { + offset = offset - (offset % granularity); + } + + // If the chunk size is bigger than the remaining data, or else + // it's close enough in size to the remaining data that we'd rather + // avoid having a whole extra http fetch for the leftover bit, then make + // this chunk size exactly match the remaining data size + NSString *command; + int64_t thisChunkSize = chunkSize; + + BOOL isChunkTooBig = (thisChunkSize >= (fullUploadLength - offset)); + BOOL isChunkAlmostBigEnough = (fullUploadLength - offset - 2500 < thisChunkSize); + BOOL isFinalChunk = (isChunkTooBig || isChunkAlmostBigEnough) && isFileLengthKnown; + if (isFinalChunk) { + thisChunkSize = fullUploadLength - offset; + if (thisChunkSize > 0) { + command = @"upload, finalize"; + } else { + command = @"finalize"; + } + } else { + command = @"upload"; + } + NSString *lengthStr = @(thisChunkSize).stringValue; + NSString *offsetStr = @(offset).stringValue; + + [chunkFetcher setRequestValue:command forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; + [chunkFetcher setRequestValue:lengthStr forHTTPHeaderField:@"Content-Length"]; + [chunkFetcher setRequestValue:offsetStr forHTTPHeaderField:kGTMSessionHeaderXGoogUploadOffset]; + if (_uploadFileLength != kGTMSessionUploadFetcherUnknownFileSize) { + [chunkFetcher setRequestValue:@([self fullUploadLength]).stringValue + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadContentLength]; + } + + // Append the range of bytes in this chunk to the fetcher comment. + NSString *baseComment = self.comment; + [chunkFetcher setCommentWithFormat:@"%@ (%lld-%lld)", + baseComment ? baseComment : @"upload", offset, MAX(0, offset + thisChunkSize - 1)]; + + return thisChunkSize; +} + +// Public properties. +@synthesize currentOffset = _currentOffset, + allowsCellularAccess = _allowsCellularAccess, + delegateCompletionHandler = _delegateCompletionHandler, + chunkFetcher = _chunkFetcher, + lastChunkRequest = _lastChunkRequest, + subdataGenerating = _subdataGenerating, + shouldInitiateOffsetQuery = _shouldInitiateOffsetQuery, + uploadGranularity = _uploadGranularity; + +// Internal properties. +@dynamic fetcherInFlight; +@dynamic activeFetcher; +@dynamic statusCode; +@dynamic delegateCallbackQueue; + ++ (void)removePointer:(void *)pointer fromPointerArray:(NSPointerArray *)pointerArray { + for (NSUInteger index = 0, count = pointerArray.count; index < count; ++index) { + void *pointerAtIndex = [pointerArray pointerAtIndex:index]; + if (pointerAtIndex == pointer) { + [pointerArray removePointerAtIndex:index]; + return; + } + } +} + +- (BOOL)useBackgroundSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _useBackgroundSessionOnChunkFetchers; + } // @synchronized(self +} + +- (void)setUseBackgroundSession:(BOOL)useBackgroundSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_useBackgroundSessionOnChunkFetchers != useBackgroundSession) { + _useBackgroundSessionOnChunkFetchers = useBackgroundSession; + NSPointerArray *uploadFetcherPointerArrayForBackgroundSessions = + [[self class] uploadFetcherPointerArrayForBackgroundSessions]; + @synchronized(uploadFetcherPointerArrayForBackgroundSessions) { + if (_useBackgroundSessionOnChunkFetchers) { + [uploadFetcherPointerArrayForBackgroundSessions addPointer:(__bridge void *)self]; + } else { + [[self class] removePointer:(__bridge void *)self + fromPointerArray:uploadFetcherPointerArrayForBackgroundSessions]; + } + } // @synchronized(uploadFetcherPointerArrayForBackgroundSessions) + } + } // @synchronized(self) +} + +- (BOOL)canFetchWithBackgroundSession { + // The initial upload fetcher is always a foreground session; the + // useBackgroundSession property will apply only to chunk fetchers, + // not to queries. + return NO; +} + +- (NSDictionary *)responseHeaders { + GTMSessionCheckNotSynchronized(self); + // Overrides the superclass + + // If asked for the fetcher's response, use the most recent chunk fetcher's response, + // since the original request's response lacks useful information like the actual + // Content-Type. + NSDictionary *dict = self.chunkFetcher.responseHeaders; + if (dict) { + return dict; + } + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_recentChunkReponseHeaders) { + return _recentChunkReponseHeaders; + } + } // @synchronized(self + + // No chunk fetcher yet completed, so return whatever we have from the initial fetch. + return [super responseHeaders]; +} + +- (NSInteger)statusCodeUnsynchronized { + GTMSessionCheckSynchronized(self); + + if (_recentChunkStatusCode != -1) { + // Overrides the superclass to indicate status appropriate to the initial + // or latest chunk fetch + return _recentChunkStatusCode; + } else { + return [super statusCodeUnsynchronized]; + } +} + + +- (void)setStatusCode:(NSInteger)val { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _recentChunkStatusCode = val; + } +} + +- (int64_t)initialBodyLength { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _initialBodyLength; + } +} + +- (void)setInitialBodyLength:(int64_t)length { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _initialBodyLength = length; + } +} + +- (int64_t)initialBodySent { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _initialBodySent; + } +} + +- (void)setInitialBodySent:(int64_t)length { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _initialBodySent = length; + } +} + +- (NSURL *)uploadLocationURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadLocationURL; + } +} + +- (void)setUploadLocationURL:(NSURL *)locationURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _uploadLocationURL = locationURL; + } +} + +- (GTMSessionFetcher *)activeFetcher { + GTMSessionFetcher *result = self.fetcherInFlight; + if (result) return result; + + return self; +} + +- (BOOL)isFetching { + // If there is an active chunk fetcher, then the upload fetcher is considered + // to still be fetching. + if (self.fetcherInFlight != nil) return YES; + + return [super isFetching]; +} + +- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds { + NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; + + while (self.fetcherInFlight || self.subdataGenerating) { + if ([timeoutDate timeIntervalSinceNow] < 0) return NO; + + if (self.subdataGenerating) { + // Allow time for subdata generation. + NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:0.001]; + [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; + } else { + // Wait for any chunk or query fetchers that still have pending callbacks or + // notifications. + BOOL timedOut; + + if (self.fetcherInFlight == self) { + timedOut = ![super waitForCompletionWithTimeout:timeoutInSeconds]; + } else { + timedOut = ![self.fetcherInFlight waitForCompletionWithTimeout:timeoutInSeconds]; + } + if (timedOut) return NO; + } + } + return YES; +} + +@end + +@implementation GTMSessionFetcher (GTMSessionUploadFetcherMethods) + +- (GTMSessionUploadFetcher *)parentUploadFetcher { + NSValue *property = [self propertyForKey:kGTMSessionUploadFetcherChunkParentKey]; + if (!property) return nil; + + GTMSessionUploadFetcher *uploadFetcher = property.nonretainedObjectValue; + + GTMSESSION_ASSERT_DEBUG([uploadFetcher isKindOfClass:[GTMSessionUploadFetcher class]], + @"Unexpected parent upload fetcher class: %@", [uploadFetcher class]); + return uploadFetcher; +} + +@end diff --git a/MyExperiences copy/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.framework/GoogleAppMeasurement b/MyExperiences copy/Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.framework/GoogleAppMeasurement new file mode 100755 index 0000000000000000000000000000000000000000..683f4f0de0b8bc67875e0fde00f7dee3e78a9641 GIT binary patch literal 41669680 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 z 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

RGq%27;b>e)m1~%=EvPs9Ub*s=0{v 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

wzME9dJWw4~kpN6;pFWY`2WaLpOX? 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 z%0A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 z

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

7p0m7V^YUAVmf!w$`Q1m$TRX0}H(*8EJKC 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 z z1B%4_?qk^|>f>aXKEDhTb-oDGXg&)U`z*=a$*B17P*i+yC=vhsu6>%!QDZ>$C`ykkSz%u%sAoCZ4oci6Ef zDprNl@wp=W@9x;Z{^NFy;lz$jR8)uKA1Q~|;RQR5a8N0q*@}E-tpA8U1o!{-q%9rm zJyX6`Z7!41Bw&Q2_cZfeO;Irow5JT`sF-|+GMuBrh5wlU3CdgVV9kAx0cDjz1=6%~ zt+OMhb0f6cR$S6gl&@8zMx844-9m~_5e--)H>GS#frg{~|0wqVH?Y(lgBMEL>!Krn ze4 z-p-oOMv`^_9xc{?_^Gh}LLOf(W_A;|BS~*W>3yME)mLIpT1{`CMcTHV+ik3I3vOQTYG0s-@*) z{rzIX+^c@dmIa+rL+lsyPX9`=eyqP{C%M~>xLB)q{FVt@^N~s4+BY$n3wbIFJvHFj zd}_cMRt7r)fm7{)p)c}W*?S9vCRYKZe8`;_w7Z-^#RVOx6zp;CGZ#d~)X>m?l5TS6 zAI?Tz?Ad);dlZyTz^RIC)6wHuMOTft{cBB;GONUQ|5u7~@Nmk%oHr<6ecqxBILCi{ z@_`xpz>5>`Jq`cU%LeXGhj%c+%YKzrX&Lxr0{IW*&kf@H>4E+Ugx~zX)@VyxfD!r0 zkec{x{AZ542R_+Mdm4FdQRM&UwUM;^Rln@S*cr4QTRc=BS$eGJ6S|-3{=ukw7<>J- zY8p#yN+HF!za|}|uHu$?ZBiac682(;ANpTk(66}s&Be`-1}8AOkb21DEFIGAzeeW4 zkD+BNSvH5uHzQJD_x<-jKW@4A}l@FLgI!HEXe~_r)L5)w1 zEb&_Pj_<593w5q%`Vjo{KCM;nVcI}Te7ioZ?=h&~c(qC8V7Q`(V1tQ`%d|F}Y`WmhN z2ASPL&(?Z{p;jD-6FJ&L&u2Fz8oy)lQqj8$|5%D+pzBSs`WKUL% zd>YDo<20Jo_J0j{cs$DBz=+l_7_AS*r}=CQ?X1xkfR`H;YE^?gj|3kRnn?B=j@4*VUrWej@ninSa`#~V$BH`UX*S3% zt#1y@M*Dcr;Jbmz-+8)=M*TLR%_9BGD@Ki0d&WpfW?zb3c4FL&8f|Y0@G|AK5!{IQ z9olszOKd?Zdo-4L%4@g!vV4mXk-+?q&C{CQnWtQ7lqum+7iFiN$~6;|(bz9a-9b85 zDY{ZOdup^xxL-R~({hg^xXwGeqxX1PNtrKWYecM%`A(Evi8bM-k5Bs2O$ELavuRbB zA?Ly1K=XteZ8CE>Z%eE9vJ)jUC}v1A3+FM4F#myTwL#Sr<>)^tgXY3Kz+Vu<_)GG( z5HD+DsX?3%@kk!rnbh1Vh`!`)b4MM|Z1XyMJYewg#Ntn-e; z3FP_O>Cuodm%T8x1M@#Ny330HW0AKI5qZc}h=`n6HaIsbWXtWN8n7$M|7G7Rr*bXS@;!LO z^E5gmYE>?(k}H08a86~;7P5nev!&9}cFy;k-CGEa?l$Wx6G@#|=fTFvvLQfn<|Nrz2u^3%yhH=>de zac49QW4=9_vfGVcw?zq)TcZE2Wgo%$f1(qeP>jI;XF9FIyV$XU$vmuxxEwxujdqMB zgY+%ctik>~BA*#C!Iqx6u`t~J?i^j=!Clp=?JRQnak^&h=0g8YAyNfV+L%zyZSWYrfRx#Wo& zwY5>o==egCw}e)Wh%ezYM#LBJZEFnwRQinnVx1&+#-+7J<9!=D>JiZwsZj@S$k_`> zrcuzpbk+d5s?ffFU}!JGo6P|?o$ zV?3UA5%!D+@**PQSB%G9z$1g}Qbd-rsG$ENWhcg^(|K|5AK%^Sfv=r`GuOe7Pks(N z_)keYSUI(CeXl;Jr$$|9V0W7IPLfKgTd@8!ewQ(Rey$~Dz=mg)7$;%njnK|??{WJQ z&*1JrjoP;?J4vIgE=i?q=twuiIv4!O29>56t*1n0F_jAYV5cZF-c;Ue$NcB|dEEEY z+_$8SVA||;o=F=M(y=>(o1 zVka5vKXT)p!1J$YNuxXxPU5M)(J~Uxm%0A$!vV-r)(AXx#xrLGo*uw?6p@Dr_W!M& zZfM^*JrVJsfm?U@DCR=hi3#aPA^l`YK}T@w8g;`0xy~Kc=XT3%7l(fd4otTKzD8%6x8Lt|3>lxMs=0D?pHN5s3br07`%<;t-zl&|EMdA4; zCjD29Y8i$ z7F*6%*|{Io7$@2bYgy0BJ{oO2P8hOxQR(GP6B z*OIng)#eNOK?hn}EJTM}yaj&f|B$J8=HF}7Mvp@KgvwN83WJV47FelxvtWTKYz>o) z^oQU{?xhSs@+M6K-8-Kgc%5N8Kct%2L%RU>U+CxMpZ?v^-!o9P87F1t-R)8>h!#Z-ZtWd4ilg2J#u?T>v$zjPHXZC6epX z&vG?Iu>aq&zeatUqRqs`*VV!w+hli>Z8p<;sNKhbkGwDEd<@R=I*R;Myq!fwsRf6$$^MRyj~i4y3W6VNxS^veA% z?q;M3eKVN~mx;IE5o+2AcM z!t)9680FJajNX>RQ91J*>@LjNN98&GyN{(Sjj&s?5qXY?Vq_5UMRc+ea*4cr{X}3?XGCODEA}Yt%$2TYs$nXmXiJndu6n{vB~(lL zEiPYJsMv1~!~d_=23m%nn*0+w!r1>;2BXgr*BAIo+r#3+A>w+N&;M7d0fsirVLR>$ z3XcwpKLMgL_!+k&Ns?_}Fxno%E_kK7=o@Y6&ZG$1?qh8B0GoQoUdqVhpJ!~ZHg0qP z#0y%zr5r5}!~d^Qn(kq7)YS|h+1EEnIYOQtRtLqO3dx|%sM76W zapO>$@8gp%q{A~Q((@KXrABr34D@dfi;^UqnL`v&BdsK3^VOP{ z^}DpMS%%Q>xMclYK(E%G^bp_V?29v>C%c9@N&YEe5{K^?#{NHj*O485XERZf>XjlI zo8BdJhr{B_cfq~-5v~!_l%OaQTPbV_bKP{m8bY?Iom`P_~?D^YgcT7aC$j0)NzS6ewkjsvENk^kztdzE$-5C~J z;-!d7gvH(Q(FHbNX$=t8xyJY2gr+9)lCo=BL5&P8shIfGpWOV%4E;q zMWYYQfAHac-Z$GsqClP^ZTo{HOy&(3f+QS z8j{m=meYc`%U`;E6d>dqR3D32Mx{DSk=)B9s}Oz)&A%Atkb`+_i_7*zAqBKn2Gee@ z*0!>&;Fh|782NKpTX~5^UOUlWapeTZ?;=V0JXWn;&$UYtO-kF5vlEivq2N9&6Xwo) zF-h~cV`pPTjm?BfwYIK=#+8uP(l#6T{E|`g1?;?6YfI(4=lE2y&x+>~GYMzW9+)qz)@%;ePYZpMc8$Yb1YyyOU()u;!bFT)!S z!~Z|KBmI;q{r35HzYW@BP89DQ-9hvZizkp{VDg`(7AunVuR*o}P6RN=q-+JkV1cFmxw-oWb8LJ}XM6MAOl`on_tZqqwGF)pUo&S=>)< zv|MunJ1g=u%Z-%|>lSwS(6>1S85gwEKb~nA7O@ERM|995G;8JlLbXP*2NT&w#vbI% zMXnCEfY8rBB3Yanx@R%9#j3$HleGV9_eE$HWic00 zVD*-6k=Dufh(~=X8xcQ_gqEuwcyLxTtWo5^%j^P+@1hRe9oVi+?LA(!?3{;l{8P3S z0D5brT79jB@Ffe>;wlXm?7xzw^knEOjA^9sC0jV@n0sf>?4Ra}Ce3_jMr=OgMoUFo0 z&_pvM)XOx`6KaCiO=ZGPg5T7%q%kZeMlR~2{>QV5n8!S5nA!$*yqOl58LsnhaLF*S2%rldOz~t8xxcO&EX5s`u0UQV;8M! z|3C%+*8lLu=<8_sM;+zru?5oWkkR3^BmVD<4Tr@m;nI%OWE9e3v83WpncMaK4og3M zUIYxD4AU6)^X_>mRxr$e?4EaAgS+tYLI8@N*|2jn5#{&74<}4^!UMLQ%2mRmJ>0Y3 zhWYWDld!K=RYQ_sw})Kxako2l9mHyN`h|6JXLGQxtqXR zWE<6X=WWd|#MzOev0H4IcP+?PC|ASa8SOKer97x}ma}d`T$wxvl%i&K0TUp`CKSGbEWaD}3LiM!}Gt=O%JhhT#d@J@L({MV$32fd#);|0{{dQlwJ{dQAU%f(V*08uwKM31BtKcbM zv6JC+=*T(ITDV@hkzot_A3ieC7u(D}o6O1&SSO}h1zODR}s zFQhyj_}X3=$2e zV-$qVR6R9VtzKx%XK6j;W8BrM%s;HgsREMggtZO*&*MvD8fylPr5CDzBjkmKkpEw< zdbw9S<>26)GW8souMD0Jl&i)3L}Ei_Uk0jix5E;Sd{nCe^hG_=DOAO8F+AyzID#DX zS&euCEzI6tQYVIR|G&joro9Mk$VPcT54EgSn#=mhwhCCiB^VlBg2vUiOyGB`6l9!SYg1pcIX;N;|n*?m@TlrY&%kRQtZIt498*-zQR^Nxn9sBzLGSi&8sGRD?+M^$gD7S83NVc5?I<9{pQRs!d~G zpjhF9hQx#LtwZ8I__HD8|5M4%I8OIC=dnaW>Xs!W(ze5fIN=iHDul!@5tDERs6$%B5XOyGOKR6cSgXzm<$vmG*Md z!XQa%L>qY6p!EWH*R4mYv_7VTh4*N{e;(^RL=VdNE(5DlrQHPUm2jf<#KGBDRoWZe zO6CEQgiPml=P->va1lkM6=9_lGIm-~6L$h4vSTBfWHXhrm_F(8JXgkE+$0~cyV8w} zvaCJn$S4bmSnTkCvY9fc^8c~7f{Zf9|0kpDf(bfe|CCX75OHK>;J(dO zxGh9U+PaP20J7gG=1{GtJ43ktuSy$iA^fYfhe}3{o90kRJRM8jRf+i}qlgJ9-4_cy zQ>C>T?Oy+mb~|Eo&}y}tAj?*!e#xu5k?n5p0{^iu9ujxPoE>G_#U;=@ptrPEO^35b zoD2!!{C^@hi8TG~Jvg7mv%N}Nx*G7YJG~Cs;BTJCS^X(_um#JTJd4L6>%hFtye}jc zA*Nx*tZIZmKL6RdPgH4ziX8FF<7h_B$g18R}af;ddv?j4mBt4{vC`qRF$Dbw)%al{LF?X}X{8xp@Aac2M9wr~e-UT~sS8~pP! ztr7IJDoc`C2uu+KF4DPygvLiTBR*)Ox&|vrdhH{LMbOC4l$nV#f}Q#Qdo)SVMe>q>>( zoX>P9i8}U##H^@k*9_42!$z{dr4-#-IFiO0?IG;{XTaJH!T%>tec4F$}9u(k)`5#F~KjFx~n*$NT{eOhnC*;3!CPYa5Jre(DZw*X4*oX42=CSS& z_WvQ*syyYtob5L1?~ll~C;KQQUVL`gk_w4uBGyx570aoyCi!&#v(kDZNc$qvUJ8ka zo*mAg`1YOI2LI7-nc4_x`#1QH`vykvKLY+Ew@BWzU8Y)Y_&4}(+#~eA@E@aP{zt(7 zGH}7<)7H)YU-%y}_zzD$Bubddvmyrn5nD|1|BUsS`5!U(kB9{L?x>q3UCAek=+jd|J&K^;6Jk4!T)4-JNOU({6N*W_z$nVN_~Xq_z3>P<2Lx8$Xw6- zId(s3=KcTr;tar~2#Xo`v@eRG33qDk- z&CKcHdFMc{a^6{3&L&IO!?>imjax&i~Uqz6bKAD3w|h+h_^Q_wwA4nBN7=yBZ}XX#eU?ExW+XYK^AmGGyG?oBTI4rfRFFW znAcaSUC1;7ZCGCo>xwFF>(kSB2YhLrd%5MMTs9XR2=V>@A#ovKgLmA!wD6}hbxtt; ztRw6+UkjN&XM;W=k*|Avm*f9fL@GiePgf@AeOjen=aD0x!!`_g7sI|#3g=90N9-ug zspJ0tOMN=-|HJN~=4R}1N84()%{hA#dx%?f-2V@M2IHH}oRb{a#YaPqcFKFw#ozEQ zJjd>psB!%b9KnN+MVVFeHTgaj;)Txd|I^|BE5(FVqh6~OPVfz$Cx}hWD7$3 zvn0|T+a-9im!JF=_uv=!(mQlUF_sv9YfYGM20(OGd^2}?1;EIcI)CU z+(4*{U&3eB#hpVoe7}9@=sv{=(M1bxD^&Wa)qf3D;`RihXJXvT zhwS?u+uww=%X5^{VgV_9q7EKEVO&Mty>VkEK_R%8f)2<7yk-*C zg*8ehWdU*zZagdDG0j3NKW5remWV{VqM_8zjpe2fT)y*x-}ivUBh2l@^U>Va$vsZy zmYIB-kh1@EVd1AH;6*sZ;!p3d)S^kQQjLGcJ=&oKWcf-TX=AzN11kR_u1ux7)OGP` z+%(mJQGFD*+M8#rn!0!yzN{{OAHN;)cAD!D z-URJ;{Nzb^xp?2&;0u9DSmTM+a)w;N)Ik?PHDj-sJYDLq3!bhnI&sQh7ww1&=(zv? zlYYnc2T0E>%b-=>kj10=%mC#}xO>V`D}WOV8R+#E^ha%5J>;0)U-N2Weesr4jBbgnTXxpR;L z>zsBC36t}9MD94jI2Rtg4*#FVbqGz4=OQcan2d z>jQrB9z5Pko^)|I)`-vNVjg@x!x%h`8~Akb zM9ksRMNdotevg0gf9-#C@mequZ94JBJsQb&c+-_yt}`*0sBAOv@@SU;W4t5Q@CfsQ zKdKzV`yFTTe#bR^V}qmi=;B7~@L%1RvOV)rWPG9Rk7FL~Ggs!RTsyV)sI_cORBG2P zx1Y+V)Ai=8ZS)q0RDr|3{sa(^EtL!x9Or5V?qW3bU{Td4SK=cri=1e zI`%Ad-2ZO_wx2c=wv}2U@6V@Rm&}1T6_Jlf(Gll1y5~<9lVe$3CdjQTMtWspEDfLI znVx6GGBJW&oS3ku?>y$V&+4yK?{9&TKX9*}F8bj`>f$K8Nbo;Oe0wiS6nrO||DF2`&NKEI zvb(Z?_X|OT9 zYUbn$w{ivI)>GvPI|nHBD?}fl|DypPX_t-2cqc1-))C5gpV3!oWYt1bonfiy;wRj$ zCAtV%Kb5M#WxiIzCuT`c`B&hsQ(h%--xkhbAoHbA7fW!*;Qc;js*e2sN}^xEU$mhX zo!|ebBmbY|uSby*w1`)>N^MekVvVK9pR{9fKZ~vRxHV_b3Z3@&XA7&!Q-4T~{;}pA*qD_|IH8i@A^+O}s11?tjVu%N5RwmJ0HxGkjGma^0!G z*c9#NJqWD-hNm4spPJ!m>*CZ1?;P_#a^DK_&#C2S@YM6+spqq&u8R+i_QaugBi(@V zb`r{)|A)Wcg?Pb2+h>_@VznrBP92iMp95RH)7d612a`8AD?sYDzzPEf|Qu4&h0w(|DDLd z({cYlWqH|nosqM2HqX*ZE^%W2hN5XY?*F6DEQ~Ahv(-)G|x9A&sa~eQue& ziHN8^+TRw+cOj12q!dlvHg#VLG~-k7a&>V4UhY)T<}pMByw6_pM5X$XOHw@W4QpZ- z*WUp@yHb6Txgzc6^O!1LE|InZ$;6$AKEVD9TiPqtpaF5yHz2MFSE_yNCy@1{}ES;?IFK~(<^FQS1 zB)g{{ekRf3!;o{ga;`F{BENe~GeOM5ZU>$J1pm3kpF^qK;?+<(>~k~E&foKs7eZq? zt+*8e>p%Z~8hh?|vxbT8f7SW?zY`YxKKQP>*b}<8--Vpep7Q*|9{lbOosHZ$_7fJJxQl2_&u#Z15aEA z{qup#rKe{-Ua59?N(_HoQhyY;%?PFO810~bx!)DOcGh5ZNLcbNKvICBsC z51uCUKRiwFUw7`#HL~`GPG9u6t<&k6wD+8SB=fNU;Z>5v-*$S_WAwXEA6^NSDLU@| zqdxu!Z`Y$f2w5X*s#UIqYRAS?|KC~0 zYIrYW)um5_rs&l3@!8JUZi7b*{_EuTVgDbWoAmE>c+_&(ZV8{pKHhYA+&cfIVijdG+Nw;*+nzs^r`@_*`@IMiaux>;K4%wgd{y(DB<$3^bCO)6%LBb!a z0c9@bcbHw(SD_{LO(+vi7vBfXiB4oMCRT4d^EC8X)T{tCW%omQ>6tcw$?3$FczM+oM_ zBdpLKX(VZtE6W9>Lsc0QfR+dr0LB&k9II6h;V=y2Zw%vIhB1dnFJWBBFrwT_?q#{r z*Gt&D7UJ-b2cLBRzYxz1*~#<3Z5<8TT*PuLCJ%Bn9R8QEC+e(_R*Mi1aV`|ywo|D- zSR(1M&WP*DHzU8;B#{44;|aq5)%RB#@9wD3Zdyk5DMCa!CJw*A{eKnO)CH7jMNhDk zjdz|?`A@ig3&wIAMm&>81MU2c5jS(KAM%K!Er7t*2#xD9e$t3M{02U;V8J`8KjgiH z#4a!0i!b2+6P|O20^pax{y(+7V2Er~H{?W~VS$#m0(SDYMj6MnAnBuR^OF@t!K`|6lM~1Z6=RLOUMB_v|LI<_3;h#(2^=Xj->?@DER9dB1RY^Jqd zuQqF;m2D=9)33v=+0Bbn@wOv@`~L`w#}Ok)?GR!gu%Re=2B>ntBPmVMyC$3<67c^U zpHcd=_8;&)hw*G3@!YE^3vJY^xq0zA?*gB-&DJi&9SnOte0LjQ{|r$88uwa^l%U;+ zeS6Q~_CWqKp{+T?QV;_Ef3QNUW!_h4Ignb#ggjtlcF{hu4eyW3 z#tr;JRB^99WI&{#O^bmgMP!61=?;~~T}u0!wtt1xa$Oz=KGUZEYF zO`}}r9pm?Eh5X&T#T3N&=b=2s0;~3BZwcOeFND?LtO@Y|A>y$V&>#{6O!sVFJFNWP z9(pzyt5lam6UeboULf_4%u*=EEbE8IF2qrIo&x@V6F%RAKQF{PF`mi8w=90goKa?-w0wz1*^EYT$K@Kg- z&4&LlF1W68Jp1<(*uP)XmmeIxM~I)tlyk3#9Nk5ceYUo9VKYlU{1o^2DT8-{zK`)u?_d4THNsPg*Y!ZU$yh-A@8i^ z5GCA%`!$UnPMV=L2&)WJH9zD^e5U{S{=M|dmTW~&(N;rRKIIFpyw7zd+INl^2 z@<{~p|LODPs4|%(=fx=T4+xz9$9%=HhLI-Cy;y}un;BO$1L#wDAp(u)hMCOS5q&r+h!K5Th7I2IJ}Fo)R~#3i$toR~(t=S0wRz2ltTSK2Y!P zaRbz{6?VSkzCwLN(n-5;3gsiA-w|ukM>umXu>Vh#IKcJfj#F^)bd>)EJIq47fj-7^ zA2iRJSClQiXn%z|n^$96;RXEv?v-Ei`;6>L zA?`~=Es$L)aQ`3G`Lz*u5MpaG?r;aKQR?}|7_Q@4mEfdTdxz&YX_&RZa?*H=F0Dds zEyI6P7?#2Zh`V8J>RF6&_<5}4|5vDY@_6L?g>Q$fdkx!)xK6UY5Pr814S*SU0T$lb z{b5pT$@hB*;bC~+N1ZV|$LS4W_ce9n4Pipej#Q{J$56hj1NuKgxDXzbxm^L{(cMDO z6Z-2c?ll(>pX6Ri(p*hS@#TFL>P^ONNh#1tDSL_P3Lud7kHU{tW+_wqk0vkX+{sv zl_b^^Gv0RM@ZW!h!2Z9-cS(N*viC1H{20O?>py&aA@&fSF7v}?cpKn9A_Hb%zYDwV zwr6Rrp4dluoILV5p3%GQ*<;6L|SfJ_DA-b5qAVEU1|Cn{8#15u$a zVf~PhbAj{!M8Q(Ib%p1m#{C|P- z|3pch>qrdi8N*u`XBo#K-0o)#?*)dAe$(VxK1aWYF>4Qzwd-|wP$!6tcp>ga9)n>2 zKS6EMEw^KpxJ%k=>h<&3pTd3mnSRRR^DL%3K7ssy%HtDw|DVN|x!*LU7_?|IcoRNj zEfiu2WB&uRs8BB+f&D_p{!K2C-Vf1Z9^x68{~_}HVgKV7W%G^P=Wr(PhWUEa9z?$@ z)Q_4a-EJ9{NJvEkzoo#!w#1ly6nQ%*SiE@5RfEUDtq9bFT@ELEY zgBJeAI5c>k;6FUi3L~FEa^W%_hvc2)!a`8vX=7Z{+jw7}1OBeg&LfN4R1BH$s^zS2 z$%e~=UGpkKe;Ls8fYFQan29&f=})2EfWcwPB!K;|(`oBJ_4|zbt}E1yvjKI4&bg0a z?FOtwrlia)TqNa%`IK0LH^UPaVxvwOz~}q!>$h#sc$8v#bXH_IrbjY!la8LUIbYp$ z7EUMA*KOJYw=PaZ7L;tsSrl z?RaBfH%0ZbIvjkOGykw16u4B+#92<9S#Bme%;6DTpyS3#GrwEXY{5IDgqVpjlAILl z>77(>GSlYTXXz#nI$NB$xvgq*T1Q}h@z-Ow{P}IC%hIU?Gxpj$&VnST>n2}XP${-{ zfj>^FL9*o2?!24`5n=HnDv3-2nkz(TpkFPh4jIwCrk3-7gA^!XNwuB$~?VO@++{@|H z%#Bj!y9}DjH)v_%0eH+6#yz5$_?B2pD%1xN3m`p3vSNqSU8$!vXY-AVn%D@hR}()+ zRG?n#Zzf*>mLlQ-s0+Lck%^DJ;p6|0y?2jqs>=GtcbYcoHBGq|Nb6~-2nramVkw|$ z)09>V6sU@b(zHowwU>~j&@zsuw9ta+6hy5II)y=pQ3pH7%%J0Fxac5*T9I)WM4lGW zK}E$%Q$Q}i@7m{_>s!D}-o@KJ%-hZN*`(Ee$F1Zq!57Kdo;RF-Gf?S`#FhK{ zrXg;^-HB%|+F`M0L_U#&SWg-?J(WcKOHaelGu(HK^x^&ggiG4x={?U0NB9bv>+>#_ zM?mjq3Fp=d)x8TP_LY(dS`l7KHk?Y%F475yg=0p5HX=q>Hd7Rl>I?cZ0{;!(q zTj!%Ss_%pUFSqjpR5PeByO_SGgYVkx#(82MaxHUBdIezD|Fwzu{|n zg!x}D4erY6`ND*elEuRYt(8X@h7sP55&jWgxUcW!OTX%3g0>Z>rtQ;vE^sZA>l*>;WYU$~MT;HkLR62scLwEk!2&r7trTDG0(TnHO z^qw+(6py;d_3cj)={RWOfOT{xgz`9DvqK8Xg86<|4@gF8Bh;06cpd&7VDuvBu-s)40c?*7^D} zFXj3ect^D5)WV?FDE{oJ2G5>G;Mr5{L|@-%j=_M9A`U5+e0^74(x6uZr`a%!%GWpK zk`_4wFGW5>JRE;%Ao5}_{g8j9_CJXk78bzY z^uDt@QW$Fr^PkN|G{9zw#G9Q5qr^Yp8xuEufCvGq@gDqgdM?w~xBueK-xKE;CC<^! zmbsRm%cLi)U}H1z+Fq5$*2l+lCzlU*8KCm2u#Zf5lq)bVp31U%Rn^u`KgDWBW@tqmsUu$&-Fd1B90NG z$nbQ)S|85;X~yrvK1HrCgO{SGi&%NCZwK)(*LYf#yNj2*1AU^Lo>~*%y>Tb4N7((M z9KLc!81aS!Utbm<-_6)V@%2r)IMcUNAl?o~8CI?-pXu9<8YF*0JLRzQMoZ!wFIxt6 z&h)kMJ92Iea+WD_Uch^QMH?vBcb?;s>pKv%%KPB|)0h~?^*Ap>9t2UtcY$VbHLkwB zKruKgJ=j}DvfL=*ufq47eK`N8`d#oVp`-a7vv21BKBGKhj9Pl1mw6XE1Hhw@YUkp+ z6XL9Q;HyDn+cl7~RLnfZPWkZtKbosQ!YhURU+{jTM|m+?PkvU%C_Sr#`M&@fr|{TA z=}8`XR>z0;|K;M{kknTcKZo)4J<73o7?BM#eRK3g(LENCa*1y=T1=;3@zDQu4Y@rX z#p+b5Y4OeH(KIG>fEBJE=E^{8+z zF~+-meaRPQ`kK(1$T!3#k>H22pq%LUbA7Q1ydC}}1Cll${Qq2Ex}c=hS@@Mcy#JqO zbtbi=zLj1q(vbGo zp#Q(uY}^SdeyyL+M@8*NaB98E+y4{JwsU>=0ei;A@vk-$x4rm%7`}>J$6FGg8l%=X z@fyz%wmn9UktlEXK;F#0Se`@iM)bs-uWvQSsF`Ee1TWdw*YJHVzHB1yZsz(UZ-}~N zKSc2_;SF3j@OifG+YxvfoctXpE=l|t* zekZokJHH3x2`yh=%J(0Co`@&329LaFcm%!kd)%0ycYc2=z4QCgE8h7X^UQC%h{}OE zAbvdu4-xVY578{00TDfkJL%1P7T?{V0lojl!y2TyenD7Y8r>3RlVe%u{ADt>NfZqM_4zGT|H%yH>Jd9(CI zV~KW=BJCE8RE_fWwZn7w!T*;iS9~SqesR7($~ED=fgdM?LF=MzBF z;pgX}{h{Y+K5~0LEL2KeEOs?~eNlYwG-!Baw*~ccds;Xq z@_wcd=l^v6>g#*_92oC`y|K?HjB@Ya6LTWgYfU6UnpZ=ly} z(dPZw@3;@RQY|}18ZDJBxuWzOlrBPPcc*I9#;#oc>@;DqKV${Y=6&D7`xax(MelVX z*IxcO5bPjB{;@xR`9H@-)puEZA4+}Kg|s+~w>Sh;u=q~$GGdFxyv4Dc8d&+bC8x&j z3D$qKI0G%pV;>dL;%WG!KAitUC->MmXIp$$zBW24%)T$UPqr-QDzuO-;dEkRFsX1wE!I>ASx28-=A=v5Bu*d8$~1Tz$w13?{{a3bLjp5{Oi3qAEr1q zdivhi_bWV2PtVc&`Zmbt@%@}NZRB4(H{i=7zP^<>owxXW#UfXV?;7y+{p>8A0gl1_ zCBT(>b)Jpeb{Fzs|DDb4xf#y{Qv4@L>={^xB(wE7i2uYHyl&myXIY`Crw9Hfjb4l; z!^t1CxEB6?ZqGjMCE*PdpGT%lK#MtiL|JFU5m83toqBdA-g%5R!z}nBo*W%Duzc`i z>eiUnF?pkJrMD-?Vm-w9-nyZ9dn3iFs_9ETbw_?PG@Dy$dr|Kt-G z1~PUZf(B%N-s_JGqpy4)0C&jt$t|rK#18i2{GW~1A~q^zd2Y{ZMxtyk-i|2Bp7;)L zlK9@fZ79c1|Fgm3J8lw7MW)hN<$c56zNar+e5qXXkS6Qxd;Bu(>FryFepI@jg>oyAC|TgIr$b7VekvJ&4^Vd4CT>T2tEwOS?)5ZM}H@KZVCdjV>IG8H&5C!g==Rp4^_J_>v#t z5zlSo-adwX3(Wr|J!0B>`_AFqdtql(+f^@UpPG+&<-(50c`W6swb4)Y^5_41@%(>y z?p0|21Wx7I*lGNUm&{IJ$uWtQTKzlDseAhlUW$8)b{2Z^{(nmEzodIg)7snj7EkTD zbOdkU!@HHD%{^V5HW5@CcD4%kq-|s`&j07-et>%0;NkY-{NIS{t@!re07QoM_Wk-& z%u~dDzXHy;bjrDHmnxx)M9Rz9Jj(lf7}(Gkq`0H%g_INasHo-e*SSW3I890 zXFC!5H)4OG~RmOi}(NC(l*0a0*^ef2N@jS1^K@ii0=wq1xI@IBL2S} zJvuKcW1KPn{8{_u9Twkxi!s+KdSfu@o5-BPlWdmhB*r@C-1{?podS)J?vm89@}_Ln z`(YiY|6=habLqACyxFL)&|lLyeKO&TTci_Si_gec4BCYdcO^0Zywo+=g|PUJ@Rr19 z=gMex?|B`)O1ldh;+cWiRp{;0V;&&?7cIVHpgVcC1tEQ3hL76YcLDyZ#kZH2N##$& zQoV2CgVKt7+64Lk3D4d4_8o?o4Q;^X+2X64AZl~bdK2dL_U%JIGx$@w;mj;WX(Y5} z_48alTM$b?2N*AqAb2S+1Op;&tODL&tQZjAxe(|P?I|2G7B`)=mn5V!;HHQO(( zpA^GD?*eM*7-a0l^Z)RZumXBKc$P-upi3bupn=cgFg}Zeco}gwrx)k{q=RFDYxD(+ zuh5ipD)D}i6OKu1tvEaLu*=zt_y5s5!tsq~2T{51>tej&nSTvx1iiQX4Bk&pCk>e& zS$w(vUQB5F==XWQ$5Vbmc?Z8A)n$>sqipdV;Fexs&8GMN_u~D3uvL4e^4So5_eGqW znbZ>5s=a-`gU^on|DNvv;`^=loDIh}T!|~&|7__g;?gLt{B2T1fW^1kD30<1x7BEm zjywqB!Ij_7=o!n$XTf*rl^hy|m_V{6d;8q}*nun0CAPu~(gU9o`1P1^wiOedpOYjZrS;i<-oFO@|2^%)X&bbUTYALz&{%vAgb}Y2 zJ+V7`qY7_xG&~-;wzqHS_XfoEK>j&pk8|uq%9ew&*}lE#kuihxj6iSSW%z`U|MQ7k zC*(#y(c9N|-h!`7N>AMNY?I`Js7LQ8gZ@81;KlH72dRdkuWoqfGkDBDY4mp`ezN#> z!;=+diJqqzz;*gSoPP|1JPw+W_}d}tdhz`~3!;j`QV5&uo;7p$JcJqW=0n;?^CrOx&}H%I*D3Sl*j+jJEp$y13; zjRaODcvoU?-$J}MvA1sl>S-J?FA|QXo-S!^OANyk5L`Fm+i#C)@NMrHuA`Ra#6A{* zCyL`<(C!)D7X6fdZQ^fx`!dnS0zNw=yIR2j&o32Y7=M0v+pvw$|9qyd!AxQOKd*h7 zbfR#61X4-of9S1liuWwiTNbs^ENNqMTXYxwAI|?D4(u=DjdHzs{-0Xz$-pb#A z5e^CsQfnSFSI`q~cx$HycQpgbAI!OD9_GzTW!XCHm1L_Bv!dC6FIImZHYt29!#hGq z2HVfg0B4N6m88hhGe_b;@x6R;t;u;he%=<(qyKU`_3)S?TeVwt;N!+~*}fy(S0$fm z0ywU>ul^ianoG`UK?fJUKOlX3V7K!0GBPM4EovjxxQEk>-oDt|cPD6O(7>00E|+OG zgVXFV*9A1URL<H6@wD`G z^3|Ho|KiGrU{n^2iuM|M@%=xd*))vSB0c%z$7u)Y!QQ^>IUZy2TtDU?`0*VO{vJZu z|2r)`tFuT(Xx!O_kvZmK$8<~2W`CY(UT>ccrCtomi9k-ZBIiusg*UJY2jzT+oH;=` zUm&L-D5o1aw+7`LMowZ-&U?s74&>ZH_ze%F=TSN=B>e?!cyUZ7UVd9h`Wb&ZyNK$q z^QXn~%l&Eb{%(I-yf4Pna+;w&Nh$Gcwa8^D#AQOxnLg)bOV4;COA)0^%qvIUeIa@G zBCjMQuLyaU;Qc7;-io|YA>~ZS3k%7cguD+!>W)R;hLF5eV? zj=XgtdFL-dj>3TI?hTPy3`6{W5jcB`w_X|J+ZyR)sO_b+nR)K=Sytgic6ZvGs9DV9Gj%RKjL z_WNKB~;hAg%Z2HS}1ket!}$*yiiz)ZtP=) z(wgeBibd!zP@$w=D798rR#Yz%?xrpsjzFn<*phV9EkesCa&k zP~j5nRStLkcoslw$@r^HVimiM71ao~3YWD6h}-NXwTpzxnnjDKPnX>-xXbMrL}g{o zQp&M99F-NNR(C~BwP1BFswL873TSJz%Z~B6-Hy!buU}MCGk#I!^>fNf3vY6cq2}$? z|6{G^1Ys<86f~qIc4tWqi2pw|sQ;PvbFCGXcAMa?5h|)H+!fZ!ie+}8+U{Oju7W-=aJ#fhx-GMAox0-h%@7U{nK`EUj?Zg_>Ho z0t1`XZB^iEuPd#rwSk)-8Aj7qe@q)$atO22v_(K+L^+at{uvaXx z3-%=-uZ!I-GA?e|?3H%6on(f@1pUeFlyWJYK4XpobuQ^#$^(Q6o|lY?6PVNPsByaI z0ztdYY^`!wD;8B-sNXv)+~sD-+5JVBQuJ8m$giGJ0X^UfqDdwj%_ZON9wWD9cex;% zb4eEj6_xHo6S>^89QNwqn*rJ`uC)`jsF+ZLa)QH&KTaqQiE0xRWWJ)XwajgIf?$3Sw%@vbk<|*`0+F>4Mt{a1`;J0OI=V309j+s6|ab>10YND^=BiJ%79! zrhw~hVpCdp}a2+DHsohAaJy;Znv|dq}FYB2{mPc z!|E=_I)?wp3U*Prg1LRd#7PqsO^A%cMNF_RTI94Z0=Zq|g_+hWtb<|;wR{fdmX_OX zwUu^uyQ8uOhOrYlNXBb< zTjK?(O*a;FVJS5tuFY~IP=BaYZLf1nHKd*VaF!bPoEVHC!64V6B$A6bQNT z0@)mbwNlhl_PPp}8`R?CE`h45vzKBfY&7dGX|y4$z=ZU4qfA0RT)8K{!i2PeHQrfM zHy%s+m@7n%hzixqM0-}*$Tnpam9(f-)nc4nMjZCiin4m4q{dy2si0MbY|9+`l8RD0tX*rhO~4vzt8vO% ziVd>Wu0KJG zYi6)fC)-}oz{*9Hvys@8O))hRCP7#PFG<0zNG*s(f(J#*>rWU_`Xn;V|67KGcI38X zvm?KnM3t8R5E=!H327as^~6rf1WWmk4c~7Ii}iwviflJtnB}a1>nJbcfv$)oK^4f< zu+n-bR8~|~z}lq6E4WMrtP5Hhpia?dpzUgICU8qeF@K@8VX}($1TW~vD2NkKC#V!7 z6#cwKW;iv$eQAv1Fj3qud! zw%>mvHt#1($STYaa!n<|@XFA$SUzB8@tqOc))3tml7jr4D~NH!4Mv4(;ftx?66NhN za!TQo1|gMIZQ}zm%kH|1@icdX;ARM+E40Gg60xM7NP-nNq!py5(#Dr-x(oGO>9_F% zO9X_AShh^S+`;DO%cNor5V@tF;(kNQ^>6D)$Ve-Y=w-_|%PUYo2Z(B;wASe)Lqw?! zILimIFRX4Swjq>WAz3}#8Ai*rpB35y%a_<4>#vT}a76Bsa+DzT?P1PP^PD9vROajPl7nvnK>x*>ljl-Ys@%LNrWThfE$ zS;*}gXfL8-xfLo{RF(1uF5fyGf90U9wYCacE6GxW2C23$mDnYiO|GmcQma<-FMhmo z1>aH%)yOwZn9K@mou!yUX)75<6BM|p!eF8;vO67cRIsG^iz(e&t`9H+w4~Z#>ydLs zOAU0atrnsNy{8~Kk;EbQ_TSOCyaM}i!^Btvh;YMQiLSWe!Z*kR2ttR;hAXX(;*PxR z^eB8~I0Am*{5M{mEW3W84VtMdmV%5MCNR?7993v(xO)QMFNNNKW`G`+_AIzWLVrux zvFrf8q620jyKMxwaNcci3v zQ}Ws9-t^lGB!w*As&GlkIij;)C~gJ>#?=39+D{{6+9pkxh)-c~uGoXiT4pD&%x>db zzL-UtG|@rjsLPw?oC4D;IpToDR1C5D}y__r83N1{>jclKmu?ySr-36W!)9huuAzYDGBdxrz z4Y?m3l8!?ER*iBAxQb;PKsn^Z>>ET%?C7(#1#% zigW|gMn!r%(gsEPJ*1Nq>90c4F@ItR5Eg$#uW?9^SELspjW1*JAKh<2I#rQ=9%(_5 z{u|Ot{Es1>rMNHb#1pWJ^tDJ|rAXh3v=aYCNGs=O9nvaA`SnQS^FI7X_#H#~dPQ3I z3ch))NZ*RIa=evDE8D9^TG{`@NRLp|{|(aDDbgPxovuhnzADC8Q5NAd3u(NXnExof z8fhhcUqO1H;{H2Gkwq_-hGMv*>@^o@$N?k|jGDALoBR?6QTqz5VPFG5;b|7oO^^f`cZ zvZDN#NGtWhMWk<0+@JP3W0Mr==a5#;_dcYRk-kQez7Odsiu7|x4_BmjA+4PMzay>GXWxh1kKYwMo(V`R<-Y`JC4WAO^aw?N z&m*mr-*=E!_TPQQvP=%t;F|3q;F8PAH6r2Khu#`^27Z|E9*amw6gxoNGs`i0%_%VhQ1lB->yYE zRnh+pq?P#AA+79h4bn-9^3Nl!To2wyT1k)7NGB@FN4*t1z8jEM%1a5-%JDpbv{L@} zhLryf=}blYn0q?P*TRivjX+e2D89|`+|*LMffrHb;0kXF`D_*<}iO+(tE zDBp;*vi&EKR_f;iNDGScUxk!c9l%p?xc{3Mo|oB9D*fYsJ`Y#%0v(a!-;GgH8h_>f z4@-G+OP#1QIvV!@p+C7!amYP9#KenMhU8PGT*srhS81KdV;;(no{N} zw<7Q(pQ0t;)G~_mp&e&9m-#uF{W?aHXVw2rg*TKL>Re>n>)@JT|E$_Q!&+^{MnNV+ zFv;AxwGIkF!AZA^dyCY6ZjH0b>ds`?6IJX_7F3ittcgNi&wi%SeoCUs>WYXVw(1`=Ek=*H^>}-fJbyGrrGa27tn^mnq zsGK4;2&EZzcX^GC&m+l*9b4eGezr~&)X7I+C5<)bhfCu=?I9_M6NDYr7Cm%q@c2n4 zZb?h~6a1864jmht>C_mKVp&{k1*dW*BI%tzqcD)jvdyR|ktXI&9C#3a(&!+&pn|ea zAi?Vdn3oro8tx}oEG=Tr(U(z!@cgtB7IAZ0+zUaFuhYfRmy~RNP8Nlz@lzP;gs}17 z;^Yp>2^99<%aL)HtMd#AZSkP;r-?6E0GiBSmeVCu-gfC%UrTC5RtnI3I5wNbwV=Nl zG3m-=&?)6KHG#9IpP(tR^XbOH3u#OmCUD}xi8NG8H63_>ZKwd+ud>#cAn1Z(A|X+T zzW^(6BGG2oPYQ&i{aYMdRn8Unl4f$f;2%iHo>?X&mR71C2w~*F{_))l=?4&&|25kn{%B1^7ZP5!^BuM7gSGBPy-Ro<&i`cD~!GxJ^-PkVkBz z|L}ba*$J3PySU#!v&N11eK86>lU3X8FdL+})_}xHDt_h<+!fV?yeZ10P?6v$UU?Gw zy~)JA_X^i-2sfKmW~QBZ*gq9Kh8mU<37;&DIB@|Fx-xlaPC({!{Dq-#rGOR~S7r)} zC@Lzz3V?%5YbB9cY$;Q0$ZnfkTO#iEWBC5{w4kPX5kV%y$tQI$o&d!jLF$Bq;(tx zBC?F%Dc~V7e3+yZt%zw3!i&)6tGT4ct58A=wPNC7cwhly_uK1nW>-;(u$Qz;qtb1}PFE-~)I zS{Z8XgCi%UXOg}UqsaXeCkCfWv8S?SE4Ctx=nF)T&tEt5j2~NlJGX7bGUXoTqnZNC2&;~e_g+f~d$W&6V4(k>{N27dac2L+}DFDRy}* zwMyxv?vzp>uAT5`C?Ye<7BB_GQ$;aay zr5M-=lW|bW%aYL|X-e4>mE2vwezm)1mE|K`G0R;D3n^0)U#^({y(cN#NAh2y9B~TP zQc3b;#4;IIqgnpo_E1t)Rv;h(RYkiS?MMxXN(#ONKj@|ol&)yN_k;?rs;CA%0%A-) z4;>JbDOOY?29z>>G>u}Uh^rAjT#l#WD5PDy4ab1+hx|+DnJ_8DIA(5KQrk6UWqx7s zOA+PBL-o&rD9u6HGi#P&RUiitJxQ&}1^R6)6M-zHWK7yg?!^<#fNv?aMFV8c+G@Vo zgCy2^t`xa9CR)XT$P;m#ff0}j5~CbK@9^lP0`%;1&#^A$;zZRlnc{}1;>B!vUBLWQ zx=~QP=c0+Wh_-!b3AtHi89#OWWbx-v!_?K4ck-bC@kkgS`jvMT{+yyMI8s*@_3w-L zZ}~YPz*iDy${N650{GeLvBpbgGMGp<1jHrKKU_EqbrN;VPX5p%Gy{ZCjD?XV6>)=7 znF5Lj4dl*61U1jfuE*Snv!S3h7a)Egyd#yA#hS+)DQ#D2=@NY=F7(;;7FbXmm1@3^ z1Um)HC;AS4i%kqdx7&jH#RFUJ3Q~03`{k}Q*Yk4Rd1i1JdS(d^Xm`n?nJGCaS?+wS zd38ZX9p6cC)mF(gcQ|X@HQBXg*f@Z-Q?+nXdcoZ6896tK+hgKBn7k^^5VyectIKLc zdy30nel^S`9@9+>Dvl#R2UZ+3Ou-My1R2--85UwgC^?0`lNkmLaEA$6{R)neYm1Ub zo+#W!7`S@N@X)I24?? zWr+)vnUv1=@s|dy9RB1VCb+C7;MoQ3LIlY;SWVgp&4%^Q1#vDHrMW*PAewA;2v0~D zw5%`SvGPsjx%JhhLGu^7V~I!4MPthae-_s>#1jfoL0n|12jVjPL5H(R8YLxIL^d9e z!{w+*E2c}CE!ukuMw?T!RKaVZ-azn19cOJf?Kt6~c*&t9O&i#*bKvP5IK)+%*pcvC z#F%%KpUWeFNw3Mz`b$$N=`-b;kV}E7S12dG6(@55LWoHzm1Dspm+(JTO4wS?<5hDj z?3H*F5yTXS^+RaNT&qMgpacTSL=swA^NS0FTscdQRFyLn`@~}R+}0-w7CEieF0vGB zs;Mw(UYh<{SlSnnBkbf6bug(BHfopSH|2mdhHU}4HeWoI892{@dgM{5v?p0lijQG6 zqkz+Z8w{C&D7y2@u(Okc{&{4o+>f#eX}|%|xxJcpj_4Fk(!=7R8W@E)LPu4I+zTun zWFu#?l1do16nrO(I=6O})E0N}{FG)c2vWHd!m-R=1nGvMEt2WZa(gxB%0L&g43>a) z3MbotI05}h+q)H_^&_o?+{&!AV~R3Ug@ zED+MT@ZTPhL29IZ-T$B{v7Pv0g1JE_nS=__0x6qnF=SmEmG@pp!ul(m1GkF*RrgDr;w?i#$!fGbIuGB)J-n}rUe ztt0&5ulV3^Fp;mtTcZ273@>w_!IdkcdX)jaSH$oB|CroN_McP&&e(>OPC#)mYsR+O zB0KD7*t_zxcdpzTC-(@fq8sbsT{-9>?d{DSCS#R=^ zDKC_MH`>WUqXJlk96&5Bi)?&pUEM-3p4$oi47QhbnN6}PFx@^_d#KV;f+bsQ@l9g<=UDpB>56gSfu5THk9}n{VWIsetwpIUPXT@p_y^!qK-fo!9|q(C?gA_ZJPddS@CU$q zfR6xufQ?5P+XQ$H@Cx8fzz2X&0T%#+K1S>mAPaC8paQTMuo|!p@OQws0Co)J05=2X z0*V0+Ks{h3;BmlNKI=ls0ww~o0e1k( z0Y3w@0$u{_1$+#+2+)6t7+63$U=E-XumZ3V@H*f);0!=_3bC#L6W~sO6R;leJHVd+ ze+7IB_#QCuE5scGW&`d4v;d9)&H^I8#&`fJfU$rqKq;UB&um1vmlIFCtzYa38=0 z7#pSnlLdZ*5`xooXFcK%6GO@cYW%-(H3(=V?+C)BkWyt~fxKb3q|p&jS$U)s4=m?z z!SfaJ4Q0Nve43)XGGAHV{kp#y9)B&jpZf;nM~w#XGXUg#-j0M&XukY_lMq^78e39m zzSNEqA8KD7*VvHquSqee%6|LaMj@$vA*8$t`9$10fCsP|@Gzhl-~faJ3IKV4B0wx4 z1JDFm1!w`x1LOcqfT@55fJi_&pc1eKU;_}}8B>j>kf$dV9!PL3C7U@{+&EQ~!0|%B z0g+-Znd+T6Y{|rQlQA>hl!14+l;UMI6OF7igL0Tj{If**Ghw1wj-jA*HBu@lW@KhC z6BzR!gr2O+>f+lh!%HqI?cWT4zOk#^g>MkZa%Tqw_7Xrm? z8O$aUgF4~!>2HU>u}98gL?fP1WZ#0>k{ZI?^OV>xSb!rhvtTr{~{Yaydg zV_g{>Au65tKGwiEFZP={gO%gKS8;K8WiSl%Is_EzpT%-%i7I)9*x` zF%WH&ojDzO^dnnswsbuT^{5T{U5D#=()Cnamq^$1a9tx^KZI+-i+*J9JtSQ>BVWF5 z!?oPki@07TmGR7Dz(xd&0E_}$2e=84C;cUSsZDB&Xh379G1FLSTm&xzXe?BQaHqe7E8$3g zss3Lj5GjO?@rwmuTDa|S829Nn3^>ZyGjaW;l>a^crf5{`W&qWr(m%s}np^tOUrcw< zZv}1*LJk4_c3~YV!t)kQisv0DpW2%VAm3;n+D`{z$iJz^_1-Aam!a|QKtb|hsILKW zXcyOyp^OLDKyxws~OfcnkLWNa()4^jKLCclU3 zzBNVkQ|S667D%$mkD-ivx@hlGU2lPCA5xhCGeom6nEy=Cbd3p3ftl<&C@HolZUwo>$oDF1AgXhTP6 zRcu=|d;pY*$Mse>=HeWl)55i_4t^xADSzriqW?ntxWfaR9{Ge%#&Y;cxF+5%Zo>Tk zmpGQAEuxP?<7$DyLH0Y9@vVVRgYrb5)<;A?g4*%4iZ=Fj=@8_RJ`_BP4M z=$9D7Hx~K)zK(1Cc~Qm>;(Ca5eFE24N!LDHUoTxpcECoGu7~4#rgS|P*9)cVn{iz( zT^HiofosA!?DxPE*Mw&Y@>`@bPF$~*u9xF_lT>CMuD#OrW?X-aYm%4kxV|Li@5c32 z-;4PNah-!}YX3N{7fAU%xF&fX4yc4Y*CF2mI+N^^KHGx4mB^coJo?f94)G!t({F^KH|wo014n@T7O={+C%G4 zrB39}2gs07{Ky|6pj@g;bD#l`9i;pn^A3%nG|7UuDx9xj*=Fyt8<9a}OJa>_k3aF; zvwi<~XvPPBnDzb6uRpnET#jmD1n#B8Vqff0tTkaNoVUmh(l(4-o3$@IU!$Kmd7Y{$ z_UeepVaeeSmv}~7!m`)JWalJI9F!56cw6+u%`JJYg9LMK%d>3Q#O&~VU2DSCdkeE> zH>~My{B(8r>|D+4MBt5%Mw}dV_A-8|Hugwj^U_vr{pjY!?b;>#nkTh3FWstLDl|KV z=1D@cyQA5S>+;6>7Hxfd^CY9TuDo$cq;{D}>ox3dNcwD(fh{*2v?lM)G92DyIO0j( zosx8TQ`}oAhQqk4GB!Jko9jnwJ;lw=w&wbBbzN(-GqKs-hBnnMPcxcwvI8h=P2R5( zj&>&<@fuE~7>=MRmV7KF>1adp{;cF9?S{iCNk>%e+WM`{PNrE}N0`({HZK|7Jjv6% zG*7#<~(0>a0v$rwo2rnn<1hLfr!=8DuV!H`)b zVUAHmYU@1BZb!503SyQdpG+~lWlh5HPjn}p++=vGA^8|6U^0BM%WzC|A^Q1fZG9a{7N!Za=D-XF3zR1r0@bBT zKDaCC-76Tf1w!peY_8>kNkWvUT~-GUQ7_)Abs4!#p|4J`?rCg9rx;Fj8}>IOA1MZJ zCwp9@35WW;=EX`@L@nrtt)x=w*@pr+HtAHi?ucMGTpYL0n%vb8_n|jwe>X%s?n6&< z=ceQ%S%xF+Nyi${GHxXwP$hrHgfDg_eU?HD->)3CEF%TdSYM}gaiz4Rjs`AkBu`v; z7(1*Pd5(BWRjxK2F^vxEs1$~%yps;ceMh-!K{c>F;gi$49wGiyqwb7Xcdk>@b6VHi zr8`lmJJG2*(W>*c(sh+F{#zmbOsD2E7GKq=>o&!oWNqe*jy+S?t4*!u%me0(7WI_% z<`JFdj4kRZJ9cF>si)vB`%JGpWsLun=}#5vzB9&GvG|@s-6yTO@6cwk?ld)}^GrtJ z1Ln!BY07Kn5p9iAo6OXdch8h9jZ-?!llPfNtXEIjVxGdz2=TpzI&YWm8(<>DcX#SO z?bMt;t^2%7ccxI+)2aE?tNXlDSA_yyx+<^kQ@!pprvLi1uBuh{b+PWd{_)?rXUdL- z%tPiWUXDKvM2R_7@6vU5{aE!~Q@8Ayywg0n)jZ-P5Z;5~jA&C&-H|n=Njwj&r|v*s zjW@4Xd$cSozFUa@SD_B`@(GLYWgE?e!#;E78np=%v2V}h_3CLm8YZtdXLOpU?K4k4 zpzhG1%2&nlOFK2)Ud{a`-FGa$vP1KAAyEt$XFR&zPTlcN%~z*s-jUlyI?`W9%nt9qzH3l+yhidYc#%Wt{jgHJy_wkM} zWjioBb*8^BJ(%`8z3w<>AEegnKKFuqiT>b2Kc|J$6l0D+WKehuN1o=(oY5LGSwF&N z3?!YlUTx(31F~oAFat>-oVgPdhndQn++oh#VIF}3JIy0H%#)iMB_;=Bx9ypVsp$uQ z;~ zw^8>cq)dqa#>BM*)J3P}cwzi!Ur|oFW zfE>L>Jb+u%Fii(krbCSov5Ynlyk8pjLg#d9zB{e^jQ4ozG^s5A?2l;uoOn)a3LD+7 zo0M3DHxeaPdVl!^&&2DIqW;$)G_e0Q2>-_oLbWx*yS-s&Wbr?{Za7TL7Y`lyzY6ew z7u^5z1(*Hu6xU{^uu-1Wx4M%~kmF-G*^tz;DGn|b49k6+4Er|4?Mq2Il|t8WTaITX zlcS`9rwO z6-^m}UB4f3TG`30O>te_NwC}D2Ey;#-;i{06CC8EW4n@$ zc#`(RJQiJMA?fHY!)N{D|G(bre}ngWteiON794TsdBcl5xocpTa`UNEJ>`UX1dLuR z%B|c6hDUJNoQZ1~t9u)#cJ^-!XX!qNNh#>y8dSl|Xw{v99SeT}rgFf!fYo#WrjCl+ zgyd+5D?ZH2$pMp(G)A$mN3Z(|O|kfIU|PdgfpJo(JJqWDigh+lJp})v@!$9tI~u0E z);MK{3f@OXo7zNnT~_AK#>qcs%zsfB{}qcT{P{o>m~*pmN)s6>KkN&9*Q)zh7wjUK ze1z~faFNI@(tHIQ$rIukVH8d3sa}|udnRAuSxktBiSis1qlI2@=J7?6922at2Pak6)hf#pntr3$+jMtgq_(d>Bg z1dZ|E6q6V8nOFA>2JWBzj)udRz;h3=Epg#}#C>XGmGCOdXpCDaCI!_8n&SgKHyk#3 zRH}`;G^w%CU9pq&_)h7fj_$-ploW(XdRs9Z;mxr++)6AnvKWVEMC%RW)?ce9svX;l zEFXJ<3vr#{AWf$(QGZsWX7nPkoBk|hXo)V1j zHKo*Ti!v9-4GgQyZk?fDz9=j~_|RzG`l5BWcj}(-Z1XeL-R;x%gm2!iDPQi59T;Bl zl)iGH=D?g$kqd50=^7Plm|dXHur2qF8>o3{?x;vZy0vTgqTSw(RQo1y<> z_3n<^{|awVH%5gG)eO|=&W(!Pm{^dQF@YgxdO_mON85~!$ixC+=ge4dakdd<9*x~! zyxjZLuBNWoQIW@PvUUkZlxabkj0r*`&iGadICI2?@5I!WXu-B3eBjkvn(*HzO`BQ= z4JcT@CZ;K8hJNEm232AjHh#SZ)w*!CUKP&b98afP)*H`VerWr~5Ap_f7MvQC^2oQd zJPna*ii^n>v>G8|doe2!;xvMGP6=BsBx!`GgEqFgcnuR`PA;Di=9wtO4X}H@+cIWz z)7zJy)_O)Cf9Sc9sh;jdTUYJ86cxoBrlbQ2;b*dvV@)ZYszZD74-T5W`^4p$t&wlA zNbQ7NRv2Z^=<=vfhG%z=s#rbR+Vjvgc}>4cd2Y|JPKQ^eP4h%A%AcDP_1NXhu@jQs zJ$-#k`o)1b#VL*`X{gMYz9IG2whNb6ZT#1-T2VUc^zIpA`?F3=y}Uf{gIhLXL%g^> zapt<`S_X`|{7~v5XZWIX*Bml9JTc>TbY{nZeBMayKGO|pEbcdAKU1<&FU&eo@Mzaq zv@mc0+uCgq@!Ar$`JwC;Dy;$h80FX_^^_NpfZ@(!O)oY(ZJ3HFPeI z$utP+uN=SN6n~?GtvfSotI!ZWa86f4US5;xWb*@wp5=KvRpl*}iJsMoBiYHw?9`ze z;p**GtYo(yCum;PiM@7lbPsi8EbobLO3T@I!{h`UVR+h&Z$_esX;7MFNvx?T?JZ`r ztd2F!JF%Z_vD_PLT7dUkp0GR^XDZ(E50;iYKh|Wk9cH%N<#DF+EpM?cxzEI!D%19` z6S>Yg1DKhIy91{e-H#ZO1Ur>bEzl zPPT;)_pHl*K~?_LYr{Mn-rk}*`PANFp3QGRr7GVrXoTna2{du=g(%Fi~oa)Yu`u63+a5`j|c+E9MM$n<%{JG5&T?Vq(wmh9yw+qK2 zUAn(KHb`4IHOCy?SsczzZd&FvMce@1n$|Q+XE2?&c~yI7>FCylO%EN+r&}gdTH$?1 zi-CdA5`F8cp$CXj60$2CY|Q%KYP5RuU3kN9dYBOslJlwOq(|MFSj<+HZ%#Eh*zHB( zY-;<%Ul8hrxfah!c4TX;8aHawr?Y6g=j5-|ky|D%!0og-2|CmAyyqiw@?t&V18j4K zrDGPeDl z;esjqaTSYSnYwwu(Ho&{oeeyet0RA#ZF28YsaxmRGm4wkEx%1Q7{eytu4&0lY-qnW zEN5hE(T&Wr_1fL+y0y1Q4C`91ZZ(BPrL_t#t~PpATW*gNQny8?Ab=v)bnhbxEPTj{ z+gGYu^$))_d?efYB5%9w{kt%jXOVws|B4T<-97!P*>_t!dE=J7Fi3xo!!%x9xB&Ox zxjph#=Y;#&^DpSHy2s(2?*2!j%2Yo%`=uDr)A#%?cIeI&;ngnBf|D<$LXIQuXjW= zLf!cn^}v|jGw29#`!za=(Fu>-dR;ghYA_9d`i}4x)_!O;OQ_f}e+*D%Y4d*l;aibx z+3&*jvn%bM$VvY!|Kmh27_jK>1mWPr)z?Mj3^f>8_4>QT;zhsycz^MS7*EZLL?U$i ze??EgOy%Y58mvZF9Pgc}usa9e8M#Wwx>)A6NPT|J+m90>t$CB@Z{z5(Lq~z$dmKH_ zqnk&JWaY2&i8wU7b_MZX`>(%TO(TN<3|N29WI`3(6DD?E5D>vf)!Rs0^2Gf_A`a|~)JNoA?w(OIYHq94MQhYrnXktyOKG{gB0TQhoj<1Kz~zRcWB+BkCUI z`g-7Q{ooD(OG&vGF_c}ZqArtnkZBl$DBaqDWy!(D&1+TbAR8)8>*!JUbqvr#7zdmw z9(HqP7hBz-N76ezJ>_>rEsyImgi+f&Vh^E`b)K#TN)@7=;YlB>$>A$Yp1yen&lBQf zX!;E%VF=hqm*~kEtFA;c?TOYQ7WOqoYM0hu#| z)iD|&dCY3!TUFk^+*^is>;~fRO^_hW$a$8XAU;3;t{CAF3;%kLfUOc zHm3d=(U!Ps?4#`$VkRaebX?H9uTMyAha{lo=#q7ROzqq6*$a)c9&(E@i*h@L4^qe~ zdNcu#-wxY0wTtcEo+yrMm1X{bpTEh8(SH4?FSZjI+0V~hz3R?YAa)lU@UlJ+D|t>% z*<=B9=1ep3WjzM&nb%a7LZsc0_s+zvwa~t0W2naA`%-Tj*u|E=Og(rbM>3Oh2vM{1 z;ge${K!0dV+oF^MnO&Y=M7{?$IWty^+>YPe^~y=h14EYYQ0w-sxG)w{3;|Qk*Bk_G z!^iRD(1iKXFM|W3e!s6174_rHn^9=>6JbCVBQ4pHNcwp|o{;tE6EvOs>}z|2d1usK)tSl(X+->+2RyuaoCb{6HFgK<++kyn6zW#-(Y3a= zYy&Yyf0RwcV4Z)ox1RE-w|?|8Uu$mp!@wJ(^21`YE2Fh>BNM?bcejvSE{Oh<9)t7b zq*td1%b{?$9$iku{MoIVkJx7iU*Tv9F%KWSdP&V=BA$(JCak~3o4Wbz$n4EeL?vlo zMBIedAgsMzqzmSB6=d?rxHlo9#xQnf{O|6LY)K32V(X|YD3F|*6mTU>lVjO=pq_WY z>pQ-wRoHLZc{zg~%E>!4@mzYQu5&2aSEkg1f6{|bJUNGI#%RE=tM+bw=&Qw;6N5hD zo}q=_oF}J=-3woZrMBfk)e|QsEf_#kkEc#ZRz`Qvi3Mr4tg^)1eFB*fzO;FN_6#5O z;VG%5`?nsUz@pzCFKoPR0x@Lj zkk1R&J&q@*Uf~pd?~IFhpS?Z$BzS-2c+z5~^ubkY#qq9x>||KxhV?K16-pjv^#1&u zTjeG{-EsAE5J=~%q-?w&g!f`KoAadg3$;#oKL4YMCbuWYeWP_+E^GbJe)zmc-E#lW z$V1TPEZ!AyqIL`|5^1)P9bC`t%Po0Q4e7`Iw6xUiQMcfN4II17)V!=*ySSryN_nHh zgP;dGKX&8b+^fFHgMW>255ODm)Ga$r`v}X7T4%e~C1|lFvBabmlenlVjt@yL7PNJ| zCsl{b;}qp->LZ;jdW^W#{V6uu@80+E#EZA(Jj$yH$Kzcnu*PaR6Z3{CdXp(;lUMV`>6lN7bvTj2krIwhuX`7bGz_^_HMG1T4lN(c zG90oR9>k6z_AYlN(bi!@+*{UUY$?*IfA>&C&(IzskF&X>bJz73!p1a(jcW=UabfrM zuQg_D-IH-)H_o$h+BzABa~-NFThw%nhr{U$VS!V<18O?YyAVdFs;zsj$9XLdT)lf% ze-2~@Wj74TZiw>&vF@b3SxIko58anyK*YcuJNoY~qr;qm?JcRt1{_9CKBUH;(bNuX zMeVsBJ1N-b0#?}i*`l8MVjG5;molh4Wzb;rN+1Dqj%_|m5qyMli#2zWBeJf1_2Fd4VzY<-~`mG!RFu_COULHaXLn1 zp3@zhiD4v4Dkkf#hNRurL~{hvan}r=f5ZT>Xk`{cO@U$6^D2)u!_hq>y!1VX{%y~jhWa~-ejD7&x-H9 z|9RPyA9a6wU7Y2Ok3W5K!no@n-t%40btiQ%e|P3g-KFT=-S0T-?tSvfkL)*Hyz%G% z`1F&W3xk^`{qob(uZ_R{Pk*a^^@SO%m7?jU2u4%OrZtUekxYP2h+JYSFHXsx7V|cx z5TAR>bAioXX&AarU>>A}!>Xs2uZZ-GO>3mv%+#Si9?_I|AR})%e?H1ntj*C4Nj>^< zYb+YaZxuvZ#nzPUn-vJ0 z3bSgiQXp_{#fr%D3IsOCH6^~QKw$5PA*rX72;8hMF?}Kg5O{E2i&u$2VpdDaBMJ&+ zl%!`+X>1Nt((OECrK z=e3xW2Jr;6Pb#dNyrJ;x-9~UYXTtWr4Vk+>USTDcuTzD{RB5sG{pL^2blPRxtvpc4=yFb}y>S(kX<)*G)dU2P~ zY#tCRH}%Yyx|H>eHi07piK|~a*}O3(-^fg;0*NbrX-fEGx^)c@H~cI9UX>e<=>4R^ zC{3|R6LwWvqYC9n^se306}`e5-<+06B}sT6NOU&~`~6r=X&;ullQHrRml+5DMClA*Ap8)J5K}41SU92ZrF8oT*vsdT|6uu-M#uw z`;?{tVuw}lFY>J4-MQL4AY2~WrP#4K#T6;TKoa~Q>}xcGu8pNns0fsie*4ywDTrWJ zANhdA?la}B2vF(I!-eOKM~_n=IaS`JD_@|FNti!B4^j8{0iX3R?TU!|nF62X|7@QU zzTQu$!>T`2c{+BpM+5k@zZy3-$DzQd^9xOaaJtF}%aDGmSB8$&fg?_NPTXYLnDy?8 zG!aoy^8APgwi%l~F~*rBd`35`ZyU05v0)|0hY4NRsl|Ee9HYg&EC)C8J0Mi%zq&TB z=r$Fe>8eOX$@D){r;u#Ykg5>o+gZWI2~-q zRm0ixvl_31Q(52n_l93L!u66Fzv$&Mhe)t_ZM}?<#k*H!y@L?ZXC*pP$&NV681H zvzJD0@v|1_V6ny(TA2rQA<`UHz5Q!P_wLib2*^VF`a!Rn%Rd)}VG_WFV3@n2TgJy; zH#sd!<~rwXyRw^}9I_4>_+e0MpF<;TouZMC(TGFQi2lLo$m?S#C>jZyy(>GsP0`3d zw=&IEBdmQQDlx#RqOIzpL{@)1*#|R{r||i61W)G?>{w_mT63=CR(P1Y?(;fP)(O)n@g7{GzlRjZ9=AX zijcKrn+VzN9d1arnyI942cb|ZO7;-fe*fp4dfqwx{(b!JZ=Ca-?{l8>oaa2}ocEo0 zC`Fu`Xub8IYBjB@M(!~CIMo5XHIKm@&Y5Oo)^RiwEtGm}96H>j7UuR*+;OYaq0Cky zh|zVhAfZggj4NyWkRlp@&RvT$#KXHN9&RWI1;f?r50}ih=T^+>iUBkQBusX7^TEv6p)3-)GyUtok+fd{3$Uz;; zZ;7IoAAy#CgPrBZy5OP?ztbM&x+UkJaJTQR*n@e%U;;arXzF$&5%RUTdVMI< zgZG5N-AoOEIHNS|ku{9vj?5b&IOvv)Cpu-b@`6ITM;&K)D{YGeN)%_5V|y%S=vtdI z6wvvHz~NDynW4H&rAk}4Op}Y$muav4rTq-g;B`%f>Gsj<3Oelbo663aIX%G6UUSuU zp7uvmV(J)EbyP_ieA_~EDvByUb{58pvacgIyV;}8x}A12NWz!vIWn}a8j2gKP(?-2 z7xt%h#5}p$jM5(c%Nd+XWX9xjZ!?A*n{oDTDbs^nr#7R|r>BUad%h2`fQ;E=X`&$` zA(yT1Nu<)6*}Rwh9W5xi@-r|nikOX(s}p5qZ00fq(r^~mg+Yb}@Y?xGFb>Jk@)rU~ zBmyZoSEk)vu^NGRpKoP*Vvwr=fw}y)Ms)~PZiKLk2q?wx7w9(gD3A>_v)QtP3x>L(GCL#fvAs>*SZ7dtuAB;*V36AU zga$bW@<6)!uo^kU`wPnUIs1B>I(|XdP3Rw+-g2suvnBsozQBMv8admqdypZYLTAT) zX`r(0xffl&NiU2n5(FVtIj?)0y0co5s;=`u)pKaQTV*Rxmlpqp)@$JeDJurC>;w1F z7z7fx06@;uAUwC5o#n=aKGX%VNqs@ME`6$>WL=MP_4s9x62=3R_S89z>5|-jTZR)A z1q@&FG%-DQAxaF^ zt$;L4txxrplFssHJrgo0&USSMH9R&@$#{vZ?dV=4$i~wRw1nv{(9?NDnQ!PQVAs1- zckYM@bOHNp`?bUROnbDsFF!ye`4esKnblpBeBOWV_Pe;>qSX1J-=Xm_x=|=U+;;cr zv~-O?w7O$)k&+fCs%Mss#^}{h#y*1Ef;1_31e*L!SBoA$ z_HXIPo%)PbH6qme82S8KO82CVXdeTA!Xf<&?c=NXzyf|I$}xPNZF$QHrEdiBfwAVJ zp>B!xShHTNVWykEjRm!lDv=2Ncgsdw9X}NIum1=6)jSlj=W=eNl(rv*M1zg4?2FV4G2kl(BhlEO(gS(91eZt5WEH8Iak>neTTYczKDkEoRk zQL)Uc2aqr5EC}OmOoy_XQMgY09Y6vQ$k~ArB?{qw_4(yZ`>jY&h&3s+$#P{KL6Jv3 z6F`(SNKiA!r=tN?XG4_$f2t$T@j1^9rk8}FeSf_%Qo?zt-gjxQaWxFiG-q{k?su(1 zySpF`?WVuk3$|wg+RYakfw%Z5Q#twsB2vpUZ$8H1#Z zPVCxhm}Yh1hbR^j08$llzVxlLZbf%@{(oB?yVUO?sn@l8DsCd9edE7ii?Wc>in9MF zlx?5HStNy~Ye#zmS}PO#FO+r{Y+>JJXnBC^L&4ZOd^gj>ALaAP)%~-Evi?OL_2D0| zNj0*`o6v}aQt46TQ7)6=?nX9Ip6EZ*junSMhCcw1xd>!aSj26)6gqWuQ*nn1tqzQSAFlt_Q&Ee&B6iFRcEVZOE3&_9b@cakeAk2ip2rAvfA7QC3x2`6 z50DeG2Gv;?M3ai6gq?4=)4($I6Usuj9=v0bxD*9O`R|@_!J&2PR95IZ$iyc5Y$i)p z{6U%4YGusEO*7?`K@hTDA>Y_G@vvL+1LPZ*kH~Z7s8uz4YV)*oPkiCp9EbGg5glZH z?AX?kPHdR2O{Eii)ak_O<4|shp{q=~sk(D^zU2hFscTQaGnJou3cg?)&VX=qj16N3ys8R+Ct`bMpZPX=fbiZp4z zR@vNLuor=Z&4OzMgM2(0=;F|dK@I~*JbleUF?hf7H@0970{Jof1-k@;Ts#%{i(i4N zC!Z?-vK(vDRN2q405vOyuR83e^%(8ZrlN>ritrqCe&@_A5>(LV7aA;=2b;REqEU2> zSPdX`2;|h|M5WvVx9cy=9OCVos_;Rr6WL7AOuA1w?TQJC{tBI}hVpIi4djt;g z_Mt&Emj|!wh$Jr>sYsGGg+!9-^5Y$D6L*br8{R&(+YGx9c%1(XxlP58thbz4WFp6$ zs91E*o_$EYEj@F;VYC# zteI0JV7yabg~}WDKK`sG6qFv;mU(HNMM0_TO+-nl_;0jX)c~T4K!jiIANaFcke!>J zz-EP`&1!CoXf9QrM2A02j1|47-nfwr?7Z|htLabD<2!H&BVV|1HP z#6I(?xiY*+J@_wHrKX1TtnHmeP7)}kwc_726b)hDasAFy);w(~24 zX(o!Vs2fne?lebq3Uvd%Ug0fr$a{y*_%l-jqZ)k1KUS4>Pr_}M$MFy-_M#m>ah12& zL54s=KLf}^1hV6oL83vD57MM*{b^2#T9a7a{+$s!l?4&Ic#Jw?PuqIIKbTRABDVAJ zI_n)VC}LZgIWdw=*y=9d;eM-X6%7Z_t|>zxfx%n9VmSEEQ{+E`rj~mppGW@lX27cV z3fU0^Vz!`2;7o&PUfIyO^;-uqVe21HB}dGS7qQ^av)soq>f5d0uSqewt!V4zvs!G@ zt^Yt6eIR!ny73*a0LV)OqA6;LkR*&kAfs+XN@N(sb)o$pZVOZ~ zIQ|lE6HB zm64*ml1^Ye;{NWer*S9x0x-NG7_r`+miuEY$_#Jq`w!VTq`T0MAqa7~2MQ7^2 z-ETS1@R>@w+0XDCx+AtJj<_X%MG@n2@T!DT8BP>eg%t^;wA;WP;p3Dxk!6p3Z}#k zuvI(djE(3hod-<{(Q=e8ow7#Mpq`b_+C6VMZOHQNS8pEHSKzirSRriRReJlJtDJ7D zp6Z5F8bSEJb;{Y$`wdp z)T@j32ze5CD;$-F(#tELE=D%wyd9M`i8Tgogyw(XR~OMn)UIE3vn&&KlN2CQlSsH& z-;?VM%B9|}X}+wduIg-mo8X#PG6u;#xawY68wQyNAi4;IGu9PqE(NZ+O7C2V2xdUe zOsYTOT-Q45v{-c*uW+(>W}n*AQr)@zdSt$}=3LadZM}OTuMt0;AN&%o%O(^b9HZ<* zb)(d?C=b9anP`@@nHILabVj465?fEedq;Sd_IuVzm$=l!Y!9mTiuM@uinqq$WSjby ztO&C(Flt8^Tui;6J7=!EskV=#Zm)^N`xCiqB0x5q8$raW_`i8g6p%~rQx@TcI zpV4xjJ-VfBco0Ro<13E3X{|zG;d)_Gds(qu9Ts>NF+;o?P*~vXb%WNf2xY>qQ2^4b zJ9)zgUTL_P^teonL81Yq6@g?{xS3919Y-CH%GF2Rk}*i_Wr%W|BIMHdW1yx+-kAA~ z0y%*|^h*H57-{mgVO67oaR`C9u7!3t1{pFYYb&9daVx2{`pRedhc)>LAek71J+>m0H415>`4j>U)};3Rs`qk_?Z~h*;-Ni`Kr&s&>P}+0 zpwPGNIV|TkT25~Jsz$j7R7`Z}I{+Y31j3m&)@L!x9cg0o1~kDSFFr#~Sd4N)=@$UW zM8t2`C?C{~R738B6m#fpYsfiL-a@Zgfv@2&L*pjO4P z;^RNsJ(BQ!asSr~w#GFClK)@eAcyQ%2;^S?i9jHw|NT>DAef9|#X`utZ@b2Ye z6zXsE^zsP~f+v0CnPcV}FX*wHQ}s0QKW z1IS(kQZd8YyMO8d^tkZrpb%@#B}kK2T-Q#qQEn|AE zXiZF=hThHiIjY*i3tK+c+-ur=?o(v>-7w2ZJj*}1RTioBXuV~w)fRHB>SK$dNKq($ z!Q(otHxsSb=XLJVk*UKi)eoW6$~L6OH4QryjP z%z$3`M|CnJ95^m(G|L7B{id>fH?0vUz%|d0yr5{nughd-ToO1Vkj#K_{sUR3QM?|0 zv%*cw5rJ%7lzdEHjPv7P0OCV~Xf7F~lh)B@c)z$8)SAUJ=vq@ccN2dbcQ$@@_t(}K z-6fXl7sPUE?G|q;$v_pJd!IRJ#ShgLp7g>dejs-e%6|)r0OS?jj+HTepXf5vHT+P8 zXKlV(B5P46Us9{h_FW#gMw{Q%;8mb^4ea*y9nwo@8rt)e$Y&OsdytREyUP87ol%2U zIcI#mbphJ*{BwOz+NW~Ro}Y~Y5H|!e!(HAItbBsfz-$U+mHMFARUZnmPyK1J4c;Yz z91q?MIu_?>@Qp8ip?>u>|9RgbBXzKI-COs}A`xr5aI9~*$QeA8L@Ca@@uoHf$jw84 z^&Q1XHbc#cl-%TFrDC|@>5IsH$0b25z1dKf4fUN6%HpFtM05NLFRcgY4yik|V@H|z z3Q7|)ci4N!E>kxVm6Lt5hqAsQw~L#2-A&6Gx!u_#$zSDsoUnWVP13L?X};-0S>K&) z;iWV9126do|30BtyGZvgdOmQ%m+Q`Yjk18@GhreZG||?R;NME@-}`r75@e%^GV6U! z@q4MkGe3yYi=6FOdYCcLJEx(k{hZ)6Px_@)rPajjVXP3OL(u}z!4>In@9*SV1^*y2 z`>tJ=1o=n@=uQ#H|@AlR*Y>D z2q4)AMCmp~Z&cnzb^WAkb=1HpG(i0xR{OT;+e`%CQG+lXz5$qf4z(&*xb%y1NJB-K z?l1re!yq}+5B3lgVUSftoJI`t&gF2z7*??BBqpcRpXIj)=B9?D?^vX~h_u#Rj_&`q zNMFBTAw(o{#)bJ)Ol_W_Gp;*x0LxToJql|juOK41qlgq34S}K!y+WnD2_UTqq+;1o zZ(E&dC=;oB6KO5Sngqtkvm0?6qs0v(@N;zp=JnX$Ba6Eby|Yj)znh|a30>VbPX{JQ zaz~@PV43@zH02}pUBH{RzsDZ#OAJy8AXhNR^MSvoi{>DZHvrOxLALGRwwK$ELGA!Z z0|t3D&}@^21c59YJtvJ*k2JZnpTC@szJ0=3F}2>h6oql0t4EXj+(4;{V-w8Mgl4(( zeqj10>rH5u`D5m!@$oF95AbuicTkJe_SNcfP5f7Hm822(S?$KImMF31|31JE z;C?~f&1e4tNIU{*`Z;j-CK1-8dF-4t53I?r1KS>QYhu;iO~1tI6y0XDoF-5GR~vIv z&@CM4vs%)IHJOzsE8>m=5Yq9@+q@%2SBf<8nlQ*^qvtwg6Nd?N(t@xi1$nT2tB>Jq&V+PF6ZNW$M`7Z3@g+*gD`t~x)19x23Z9lUoeR4 zPMu=(n0i{wOL$*^k2Se5ojZZ`C%Q&`*HpSCPe)hAzA-5&av^+!icW!^9K9s)_=Ga= z|E7m_`IbpOYcR_ywKuA4K8czwypE$78+}^-TExR|6T8o-x6Y44SzrGXAx=6YQH$|K zNR+kLTI94%XXLkn{ZZ;DTmm2`5lE~133#vh3@%<5MOi0ekSPW722uDwDF567ATk7! zKlMauf1Qgc+V5TxWi7`bacAN9#G>Pqd0~dBjS?N7{COw5`{~4BkT6)zI<%a)bG{zI zy10z41&|sHvSM(WnG(LmsMYymb#;+(pU36Oa)l#9gZc)8mYej)DgJUHio-(I%zEoW zw4ByWCz366YLQJESHg0zCUYkJ`FTW4k znyvxwkLcZVWTHpE3_sb07QvFb`FH8Ban#2 zkQHE%>H_{Q?l^SS_Sz4coI{#?n`*FKClGC4T|W50DYShrtIu?KE%DUxl%3@b5Z35m zvhpls!Z?^z%+?!q66K#h3r-mrc?7ES&tB(d$k|EoJplSkMb-C!CgqzI)eEqQSdkx#xD4mWi*bvwCUGIeTyJN_Cv) z#05ZsIT96^8&jqVM?t+h{`1%|NJFE4YF$Hfq?AEtXTB$@Jv({yzhqM z{OyZ73(9y{llb%Y-ga1%n*rCCv%--kFIR&mJ&`82FQ;rO&qVvnyAPVQVokmUTn}XZ zMBU$<^{>2=G03roozKeKP^BX^yJYX}fi%hNJr``^gfz)f07x%d6Y22f#hq`2y3G~A zyXbHF(O-RyxNh*bq{JIt>I+w|mNdLlrx(0Cmms5>f-t*#L#`STcAr6`7b&%E>!`^Y?k!Sh+H8Y}j z61ThB$A5e(;v|$IA0N3!^o9QzJzmOR1|Y=_1bQu>+ER{{GVm7zT(4Xb=>Ds||CK}LWxKLYqT+S- z^D4LG)u@a<+`covlmj627a?|EvG)!~TPmDAk2{Pt3W4aq0S{e?JoM-1l+&d`{G$JN z(1c5CqB-N6PH{))ZRa;*=)B#SM|a+MtFA)M{|)E-@3LZapP^{h^mVX?q;V+P(go`w zB&xU6jd$fLBzrGWvgiFBK$;QAw*L&0bf%+_c#PL#k$3@xL?uTN63ls|&Nn!A!S&XA z*Qhg}3e(fiMy0x-%x7QUXlu<3lq&o%niw}f6SZuW6M{``N(W*N$&wP z#7+f6duJiq$hes|+_a+5MxGs#>d8Eg9;#HDd}NF8EQdCVe({y)1;Ef4hj*MB1{sg4=z*^b+sq%Lw5g+SC ztfW*ww0-YKv{-muMB5kHThS^iMCoE?;C#rh(Dvz`JDoQ)^()Hsnw_Gpy*8okYv=<$ zz{NhW0YEMxkcu0plPz_Apd{_GOSE+&2AO0r(Jwd~^*WR%=9}6)#y;@afn}v*j`HxY zZY>s?m(X%zEftf3i_w>~ICY>&DbmE}v%{qRI%g2bv9aLN7(~dQ_*&$Qk~AS}A*72) z6J5g*CmnV8s1KYF3?NoWleG?tNRb#)X!6oQ=IDj>);DNPGzM;G+W5kELuHOGyw2|e z4f}ggFP-UNB#q8sb#r0rrfb4$D8Kl0qyIeatq31Y?aq|>*#R>h!{g|A`I*}+gQNub zZjz9}gOCSx?eZLvh+hpkh(6_B@QQGS--ryeJ1EC|cEZd=C+V`m1gYx119(sU^+-ir za2lk{y~wNBRSOpeS;{TCUzY(!$GhxKC)z|6V5c7BH*~yQxN`#Q0@QGtoh_~pb*xwE zp3xGuGN1Q=GLNw`DWFU>QYNI_th`6kb@Wv4hchUXjg=X?2>QP7(4mZY&KjKJX@Vx| zzfbg<{}?^UtT;O2hNVs~i)|jnytPrOKTConYV-0Q+>-6*hQ_GP8&VI-D7q-)rtk}v zqB#!>k7OnnbMj{j-ngCk;g@r_iq|JNG8~#WbSh3*Pb@&^Kv)rk>5{mkKN5 zk>@8jkMBBND#h1v^u5A=Ilp3kQne{{;mZceXL=v$k#w1@_VD5v3jbgsyxd7l$EjZu z%CXY4Lmpl{^HGaOXo&`VA%XgV+u+v{kw-VVvyQTuI!e?xI%55klD=`gSF7hLt?b=m zz?_Zds+gsC7%WAVJ!kCFnoyQ2>TMrfZ1}gt`ZwgjVW-|}#Ovm{+bT4vso(*K*9yZ! zsnGYL9XO#d^|o9I@9NP$WBvdtzuBwQ4y^UOw`D8*jsU^%AruPrb&kjf_k-A4rsh%& z^40X4mrS}v@-EG17*0|Rg5NaJes<6RooX;LIV{arQnxB(S?a?g{qn#&VRZ5s%WWda z|5eG=&Bm5)KdkqD$YjCqP=ucnww>j9_)Y$e+TB8_c%=$Q!58W@EOb9{J(xWy3aqR0 zrlH|4flssAyM$@W7s$GK^)S(OP=cm-IrESO2&OEB;hx+4J(blYhRbND_c71R7 zQIb0aRSjdWi0)*QdVVSTihZlQ%cS1X@N9rIaoP`<-|s1ShbCIS12PpU%2bqlBCw-vkt$Qk}_hGz_q@jjk6 zUud9k!^&hS8bo501uDNsEautB2ccLPo~_7Bcz|AH4Zk6J%g=z{PC$-{?oJoT&n(bh zCybD!lzCi1@o8-f#HT>C1zLB_olKMdLuXc*19w^t+-YPBIH9ZHI(p`!J|^;I>{sa} zG05@SZi;gGd(kn`Epvf0`vfcFB1w^pq4P^Toag==&TKJiPHDX|H_;ai!piJ}ZBn9b z;#924c5E*~tA6eR*U?TiQORh@Rz(9uN_wK|=lsQO=sa@1tb(FqDPGZf_VknzQ?w#} zjp#G~BoxH7c@5p*Cf|i7N(hFD+VDhyulb=tcp~>`C_`P)L|)g~A5#(_!q876f@;BZ z`Pg*B+$Qx)U4tfq?@b?*x4}bndPVIpQ7E1$EgBvhOOf}=Z?mWCSfb0SWHH!ZhC1&& zzc(@&w-Uuntv@Y}uoX*@XSSUMXK29Aa3h-QSP1qfnUwA_w;Q&pbC9+P%OzhGLFny4 z-s3m?Os+S2G@^CYBGn+t7fmEARJ4g|PzRsGjae$R@fwVdz>Eu35y3TZn~?4;$0f#W zlnizE@(*0hFwt3s>YUohtoI5fytYSL1=90xhsSZB!4V)yQ1Zh$<%VzU)o*6%zq40` zGCIL|5tDVgR0*vD8pQ0~@a^0XRQr{-%sJA7c?D%szL%?h1*Iv}+GhS0vwIk88Tut% zMgQ9WoziH5icJ2K1uhPG&}t+_wcVSGkTw5AD@u>gx>pt?N6OT_8@`MC87bra-<*Zr znehE_x~Dl?3CdJpWz6DsyRu|RnQww&9dVWJK^3+x807E_UL&NHvAhg--+h$&9m~tw zTFQYSPg~}6J6I+ZDN~v?cURA(mq?i0&K-my3( z$%zxmx+SVplGkFtdk`ENP;kgBjH|cKma2Onx*?+{S)|sW_}qB%xrJO$U;PWpUf&0h zRt)kAK%@vHZQbY_{ZlU?58o<#ZsDbmKuT-2e-ZFOTk4;^rxI0;#hTvhb&t5)CNU|3 zhsUCCVyzU-A>B3qS^ABkm+A$dt}=ZW{bdpulG$tx2^^IRCR%Tsx5n0?FN3ejZh^vK zZS}4TSfZt?D(EOEvGueQYwm1fKp(h6h{5;%7PY0whzD=Qs9x1!Fj9R!zIAZX)Di=M z2mfOfb6z|d?T`;+s2^3jnCc^X=it_5%&|A4hqoFrxT>@i#_6W|oPH+?($w-$NdTpo zGw|nVgGpkB9fd>vaBY5GHPs2$WOOt{fl|WJV_i*yG1T{$RqNo|lr=uc*5fd`f%-sX zFa)+^f1K;Bp-M?P6d@>W$HoJx{TX~7^*8u|g}1z)o@AjRri?@Vh=bCqw?DZCV>-SV zts3*?!^Ov13>{UO0b>%a?}WwMSPx+EJF;!nm?fVs8jR5pC#Z2sM?r#{^N||hRz|Y%(VozyMOhb z(PdrjcMtS=t;=9_?;NEi$h-e*(9AAlZ0irSz`905W+6)+!Xx+mgQNui2pTROxNx?1(Y{zIZg-U?3?IZ!z4_zI@ zzdGjbgz}xh=Q8JMXa)gR=eCya3M$@Yz@h#sR*4F1tF@RnCo_WL7(50wCy#5BK7bqP zrpdU=?0D=5F7#q-3FCNIcO9m$6Do!svFp&F*t{DIn^MB)9<9Yl1Z3?a%`6#GCCts5xAg)@%IaXRy+`X$u z-N{c%uy_nJc9i*)<@45dOLD9+WpG)Y_+a_q?m8H8keAc(1@r0oZ?@-D`|Zmy6%GGb&~GIYh%IGC}oS%>lc zI^_WB{&3duOxSCnbndlQj)+68vCE9|5v-i88k!BATEIzvwqL~Q2HUMrg+>NLrC7Wp ztL1+byS{{*>3N+|ETql^{D5K4Jm7~ir-NZTNnlvVbE0BADdjv-3aJ2mwR78oHYWw8 zm0l4k_p&(fCL!^|ydQ?lu<>FQbmvx!`inGjD@MCt?`%TS1CnRN-RE6sH#Rdw;4 zmrwbjNxL<~jcTp(Zi!?%M_{`<*9cl2JECA%EYV?fd@GT`$bJgO{}iJ#zJSaK%9pE* z&voq70gNAMsq-~_1cM*eNdn_P9K$Lv?s|wy;<-W>P#%7G)PIUO=|2?3EI1uUx-m3W zB)DJnH+Y^M;X(0LhmXP98ZTt|DFX%BQb!Vu42?rHSh8r{aHC-JnZ;;L+p;On> zy?9Pp1H0?#-d3|g!(sQwnlB&qu$Asw$lX5LPCBd-A zhv=+ClTzpC^DI_-Ll`3{Uu}(hXSqR(nOem_;ZaoZinC=N?1!+GorhVql|RpO)8r7M z+o&<{1MaFHY6 z=0$StQ-+>SI4!xsOZg8O1@JgQz2U&%rr`+HtjGRR29++I7eCE?Oix zxAtLh2XzX9@mt+=4x@NZ8UJA{>utjd2oW8l#4c>Oj9j*q4D6~{-dRf~KfGs`0Ci%t z&U_gpPUsGOyoU9m*pCrJoq5#{OuA@{&g_aVhgbiTLuff%wQz-bP@}}w+fHmr;8NG0 zp-M`1{l!`_U3D!O+>ZQC6%s?n>MRfrXYf%-oVK1-!T5tdN-F)Qecz&Caf8(*0pQ!h zZ{7v8&HzOP*cU!Jg+f;be{JWSU=6SBtn9m80&I0oNW<%{L9EX9fA^?yfZ5}cmtCDd zZ&bge>Hp*WpM7>By~ zb68#!8s+QM4>Oz?}9!D_!BQvm)G$jxCg@tv$_Zp?rg<(oCgWS%}#W&$nH4OT0PUIi;?PZjpx; zi1jbSN;}o1uA7-v4Tit88L9kEFo=!M&MXlBWHVU7og^4`J*+CIj}?PkN=S*;(^_{W zaCda?GHmhMss`4rZVVj(sk1+ngT9k!!#f$VbEVd;CTJT`Wnblcc0 zjYW_=WRMlWN#AFmbSfUKflf-)9G&3Iu?&8udRX2g`y^*RT&(5lCG^;kRnmt#Eb|Es z405X~i0uak8IG3lb^*T|T!;#8Ck?j#<=5eb%s=2ZC#em1$nAKu{DfnSVm`SMVY7Z* zWj*$QV`Ycb3k%f=qM}E(T0Pqtj?B>YVikVph5r7and46g-SE!}l62R1{0RSF-E!^54X(bn;A{Y%+TvU zzFbS78KfoUjn&W9^_8+J^Z5FwZs;Es>gN~gAK`5{x?{s}AN`Y&zWHhTC%iWtYtZLQ z+bWN@`ku(EJl1Q&K^aruQ5wtCcb4*)zDF|kGo`l7$`h|Ek5q3sRl4DbmfnVw3?pAo zuDS1_y>m|dVW`jHaD=)3zN4gmm7}B$Onsr$PP=lNw3w+sLMmkH|1P!F)}JN~V(L3c z!-Sp3d)73LPqp}^xjRI6 zw!ox9oV(eBA--$~e_F*x@Haju$%WNHNOhHauwL>RpPk^3?9>uJQGQ=msRx@Gv;zJl zg;^BQ2D7tRG>pV`3%eXvQx_ueU_LZ!hoM?nJk73B7(1Mv}>r z5_7_MCbF#1>{L@>vOL$3FyNn1nZoR3Bw4-`jU)`1BbYFlRv${7Iv8Q|zWK?T?Z8@0 zTQAMgWVCNduO>2DVLPR13}Fau`gv#(e2a$(-h>g@)bAV3Ft2Q!N*JNJCcfH4LZLTP zL$yQPm(rBkQsd6eVaKL*3!oX2IA>F`YkQUHQH0SZSszXq?CiAkSi;cN{=J4~JfCGo zgoT`xU1Us!-oDsAgmId;u@*7%Er=fRt&$Ij(Pm8;0fpKDnw^@;2h(FJ$;Zw2f;K7XF)4xhLp#T8E|P70LKxWwMY_X?aD-jAp3Kgfi&Fx_ z9S9?^BE^9)8p4}y5rg|G9NXBP1{YY|_xwp1;IuzF4+!_Ao%VEw+G#D{diEl|Nu3lw z?3*)aPY+7pC8mXv`pr%>B|_|7p?cx8&_nsq8?+GD@Q(8};>8Nfw;C3-P=uW%mKO5z z?Dd#d4-O*lIuU|{4DpJr`w#z=YFbF{H6(BZI*8fyu;QJN=#OCTNHQGuA(Up!`=Y&uFaU?6M}(vNB|8bDEoELP&6wMol0_Io zNtBFc#Kd;nM;KyBY#Yru;$lEhk4&IH!oM7Ko(vC{#H7)T#b@Y`c6aEHb6d5qkl~H)Kp#%`PKnJzj`jz_fMdxg4E8p=^v{F==OmvnHc#Vg z{~`=HuWf|E-s!JrM2?);rWg4L3JQ&gf_B05M~D=rWDMnwGy}H5j4&V~%VsT;z}5>xrKzm2A_5(3@QrHF%C@Q zM;Mv?XONGw^gUvF41}3kgaMvWOfz!w_2v==?8FzE@m!CNe3`oGE6ErzpB>GJO_M}+ zFl5d7e~9wo#%P>NqJoEw?FTwOn=HwlM;H~k=3Y7^aQ9zgvyd?Sg8MBY45npMBh7$N zA4?d5elwaD5eYcj<%IEcK=Hva!tg)X?+#%o`Y#V&Mi@UDtsW9a68w{3%Mqi6Fa$X- z>5mro8|g8i`3J&C>c8aR3L@+$GWP98meg-{QzT)8HT9oH7;x#Az^@4UMWQ4b)#hvVZd6wQVAn3o&E?;5k|&9;^8SF zW57_wgmI|Xq>>E6*xPLr`3NdilQBt)AJZSrD>XKgF<_c!gaO7Zp&2l98(}C`x08?a z?OWwri116fy|-THn)?ojJh+1}@&@iCAElx6M@S4q$Z$w~5_XX>;K-4L0ePF}Uc!KF zxIq{&f#yEMs3r^wie`YnJ|+x+(%4TV+N`bG2m?~A!~=v;EwcDQGps&n+HPZ*&2L7D-_tDZ0*lvw{sBp?TDp&1tSxqlHxq{#FaVSu{11%v@}Ofl$OtHPq* z`Yd5U0y={*1jaLRX$EXfFkygJP3MRN_d=)$wzPy(Q`5e+%}#t;3NjWCJYE5_X$Ig z^N@TzmW+YG{F*TOj*1k#BMfjmpYFu%`Y)Ha6UMkCM}L}O`L^UUVZd~22?Gwk z=MTbw7@{PMB-6MOI@<<`2Eu?-lJJX2Kqb~j7|adrf`7>IDbbS^AD*ptq8 z!2_ouhB3{605n_8u<1=RT5~PKXhvrGZeiI9c@8;zq22oSQP zs}4BYa=KK35FjTZXC6bfk}2rUW5^h|KPX3#>}Eo#P*bXo$Ay{8G5m_lI`D@ZhisIYmj zQtu2c1gUr>EhLr1@o6FG3N_L~lrI#}LU1A8p@pEz5Yj?|oEn+|7elz3VR2u>o>t+4 zbYmfn2FLLkEd=FhHZ266m8ceiN~(w!g2le3g`iF>#6p_G=$Sz15-l{T$+n#q$~7AX&4ByfkxWC~drFMvP4^lAjeC=91apHA&1guOYezGv z<3OWPHRD|x4K5BLEhM(NM>F6=&Y&4WllwFSGMw3Jh9oMMo(38u3@2J?yA3o0oYYIr zSpP**OQTVlB8>(OjeJ@N?u8Osh;pmPw2<@O3VIk-7mT7Oh0a+WJq+%gSQ@(_{GfW+ z^Y?0bD8SSVI16pGJlIA~%R?mR{6j1a1{Jx}lR~-tffj<>zLFM#-UFW&f_%40Ed-sa zc3KEBfjhJib!X5*R2njxo(a_ZObdZ}4{0HY7U8r|lC5u37ojh-5UAHg3xRr>w9tG< zpZR0xnGP!H2n@R?S2G~i|De$*msg{u?`fdXlI%1|9=X7bgc8PHZBg|!+ANM6B zGX8Yi4lcA9ViblXyqIRJob>1s;=!_bh3xo#dBw9dPsU!@lNo?7{kgXdSD9TSd9#6o)%r-ZO zvQTbU(hS>iO*8{q6ZZ)N>Wz#T{`_02Vzn?@6b zvkf0|N$tJ)p={GM!hnL=pJu=Vtr>(NJwB6sgwT}MSmJTMeyYU z_aM6LgAK~03w(%Kn%(HcA}+t1B`pMja4juFB}<)EdGW4;p4tIhdKrg}U*ad5JaAgc zxx*8*A7$AYhn;>EDBE`o2m>Z+KRPtrIBfeJKiQlm(@UZUPSbvLa*}b_7S}&ylVAQ( zVsgq~JK(|+7*PZS{h1|B#{#t<fvEEus^JD@7xIBfJ&YD7SZiQ@|GfZJD$!zTBcDI0kzu;hNhD(!%~cZ|b+ zpFUF-wP{YtjPr5Y0rek@!`3~W2_o}KOq|yPsFrEimO+6s<6Ge{ivslEn1-cK50ou< zyRziIOQm+ei$SJgr!EG9rmIS36x{$3chj)5-vedM?8uV)7nPu?w`o{OpEWo_!pkTyPz`_v zn}%g=qeesn;h}awk0oKxSC5zNJ8D@Hy?>=vK<~#!VT+~XWrsb@OFr)n(0Y_Gqi2|5 z(G=O_v@s04pc$uyq_`*{4Ro;``l1K*$6_jfw1&MmP{EfMC}RMp(!` zdBy^v2?#PEv{?e^I>7i21WUcJb)o%apK^CmBQyi7CNaalzn?05^L%Vcv{vs&Mmr3` z#s}HUEJ`jEM{B*%d}MSI2*p51xCn%IKqv+RXBdpQR2-fB2?$L<$Ob~=6(IZo!Y?4` zI?60WN+1ZBkBm$V!^VdKq472lCIG<)2*Qyv3ylW=Iu8h9AaI<3Pz!_wKqvqLW0cIo z^Dz)2fKU&FG$16@17Qsi+JVqUjd%})3Lw~a4;wFa2aJzExCI0cAn->j0y^O$O-as%aiB9$ff;|vwfMDGV2)_ft7YIJTfjx|Y@Er&rdcugQ07@C%{E<;4 ztmL$XMn$xi%_E~6u=g2@gsSLd{v)GG(C=>x&zsR&qaGQ(1>IP%90yp=HO3<&9=y$5 z2n5jx(Cr@}_yWPh5KJ->M$`Zygc<<^(I^;E4}=VA1RF41V8nAENP&OGVfG!5YaUc{@ga9Bc2SPCrIHs_;KoD641SJrJ6k!gGhylVgAQS_^a~_O{2f`0Z z#2iMf1j02S*mesWF9U+cDiFB^1P>taEI^M)7;z5>{y+!^f<`nDYJm_+iBNYA^+5O! z2%36eWLvO$CJ?;gl$ih_4G5xbK=1{EJrHWB5!-K+}CdhyubxAjDFH z{Xkd)gbzSy1w!KiAQS^ZAL4<}5LnA;AXEUMKM?YP(0B$2H-O*-gjOIV6o4N0fZz{= z@S$MBb3mvCLMRZFKqxs6ga#la1Az~5N#lZ;;~_7L9juXHplAAYsCN5M+rW(TCY-{| zaEJO}k0)NhJfX2p#q0*Z;SrdY9n3_J28uaYvqMs^gV|qsk&-;v!91b4MkQ&`!L;v? zlo!{lB$*wOhFbO%tds0KCE4WhPBkaaJo2 zwW(k?lr*U%b#hfqvt$)Bl&_LJ?)gk5sdH1s?6X6~jBHbx?_me*#%?`XltPw%d}=9c z!%L_+zjeSG=9ofo6172a+N{`dJj}g+Z!t8 zj&RkSv*kJhN>cBvirL>=#oWtRF*nHHsFtE{p;BnzB^5KjL-M%18zot#e_kayn58nG ztV6QWtHTHeM^((B&s36ynJR5xdc9H^!9cYur-s3=^nrC2cQEw@Dho|yWvL_`@>I+U zj+|QOAjM}&@)he4#T@Ert76{iFv1drYO|{h(^ZnAY*h+1C{=TAP`p(wh23Exm$fQp zYlpUH1T899c9II#y~BJTI`;F9;x)xw+FfP7p<_C>>|2NA2Su|=vb$=XLp@%r6w=(P z(zZwG7nLMuFlD}>UXxUF>aSF}$#CzEIXSBR9QqqeC26v?;~;sfv^`<;NVSyl9ZX&a zb3>`h`xbtInrQS%*TsPN*cOcNk$x2h*!l(paKm{!yUv+Znf2h7X2+ z2LsG^!dSH{LuUr6VCTM9&6)U{$`b~goK{KB?pWuN-!D;{edae7CHbm@c`ERRN;1+x zK`|eesiMh7Q`MZO=5`#xwGJxtef!O@ul9^D8;#=^ryTJ2?3td>kL}^Qi;;hQR?~X@ zMd=65i2ME0;OzQhuxNJE3dJ#4{C6|^s;qz0)tnIMSAJ}8~P1D zYQ00+f7Y~q`F(foFt5?{7pK)Wt!K5=HqB$$KGgI#8LyO2Vg3pV@af5!JUe4?u~nFX zNW*sVMty&~V1ts}oW&c{GSen(bTs^uWTe%*-_27kd-ggVt$KFf@r`BH$eg>)i~s$a zbL7yb6|3DQJy={lMDjdp^@TancRkx9FAjN7F=xfbst-$ZHut~sDmZ%9d81FPV(&EO z?MXffoUM7cFHPz$Z=CS&Ud!k$RTBuWpVKD!&(FnTsQ_R%)r*%{bO4jy6j zJ99{%3I2V}x8CKM-FCIG8Q8}{Tx#jz%?j>2*`qI~_sy#ImzRcgzw_clLE)5PubjU1 z(@aYi^qJAL@?d(J)3*a@`5ehMj}iCwkADq3DbK_^C#~c}+QMxXlfg7jPdR6=VB}q=;*V*Y z95pt1r0sM1oNcIk_qN!%VOamW<(7YIh+H3XyZtB&dGtjd^^<8m*{I*7M?aW+4Go^r zfMU)=#&6dK-JNyh$&(LfL-≤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 z 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

fykLdYU$`Ew6jL8)790CCHtyu*y02Y; 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®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

k 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

)EWU4lK=Y_BmHz(Tb4uxjtVYEz^JGhO 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

0nHHRvLLMx3U^Tn6 zVD?XV){Xrv*!rOwP<29sT~3}@sJs9HiZv0m>hXJ)JOf)rRPqddrGqVq@W>Yl@@AF% zXU^@WQT|6AIM|&$j3?o!+$vXWdBAEdmTIvX?dyx4kPW*nP*e2T8ZKXnZx+B!@{L!< zl*syx>K9;Kt3G_>h|WJj>Jhr#tDoP)M~qX`OYw1+^}l>r@XsNWPB=_S;e;39vEP1J zjB*CPsErrWt)cM?wewSz<1^-E-Xr$WRBUq3%n)9?GJW{l{5DqSpC+`<=wWSk5@i*W znVv4NvX13ngjTX61JY7+mL}`)!R?&1W%wLn#$5WmJ0D0GAETU@x+FCnANEgARnnVi z$|XXfl)_m7%0Rq@m@$7CUTY1(DFNXT!Qn$P7iOeoW#;0A2PLt6G;JXzju{^Fzyr$Z z(Hc!k=3;#35V{>8ji0$%sT>Y_y^gCUeiar|c8oiwP=(2kK73rI7kMRw$z17QlG0(rYRRC$ z0TB_OMr__ca&OfBP|vXa6(4*&Rq@W=;GmQHr=K}<zUSk=3AukE*RHyyATry9_jB7Or3+jBn4}cX%pJk18CG@f)Gg$?V3K z6=7Q#mbR!3X_Xwe2X1dkOb|%)o$CtcNF94;!F<=`j1xY0Tu(VGja zG@r+);$-rHk}7pj_z=aBrHaG8in6-GZ+6yYD4G?k-HT$JG^%DN)d6uqCGjkG4pz=_ zRyaQIX5zWm%Pv?Eznl{8s}rBt$t_acG9?Uj36~bBl?{|*bD_)R&EkJ*u9$MbEf%Xqci)V@b?kbfI+=HmICs$Qo z-7kwiy|ACd8$X09W_^?zxjN%$g(R^eH4&cLl=GXaLOvN5! zB#(0rPdXffXBN_iBW7)`G~jlbVizlrW0f39vK+y%l45UYDANat;r+zW4Y3MmVi;S6BySMIX^1Tv zLJTAAk)(`@HjQF;D@v+1mG?oCI_FvZ?sKgYPj{e$-VzPpeyL6G7%ApPDuUjVS9^u1 zOVOsDHTEfxu5$T3qDYS}#P8WR>5S;?qRQa;=UmWNCh{5V?EU=|v&;NOSGK z$mh4elTR1z>1S7)_Uzr``po}Z`s^bAfB*OSFZo~OfBe7CKj&}d&)U<+|3y82_IK*p z8O;%G@I7-r9#vxWM;T#Sj-qL0}O;c{pqvw5N zr#T-_<30OE7-T?MzO>{Mf1{+}yJDr+<=E|#hobX}RE>JI#M6vQUXvt6uOKwb3O)3i zBsKaSLd&es;$0G5bOoWcR%qxI!JJno~^5{xJb{myUl3yVTI=(k9T_pjiF$`$^_&;IGr?75(zK=eW1NH0Zt zL9ys$-Kg( z*(>3>0;9;_<<&3Y`GR$#x4a_zCA?U$K~(KEvtRw{f=!|yyz=_#Un(dS{l}}cpR$x6 zUQ)5h^D>MU&fLvPhb#m>&`X%l#j6pwDy}p5m`6U`5YXW}cih8p7s1_#kJ_1j zL`S~^h=kFp%LyxCVG2!V$oSSm7T6CpqQ< zr*xDr(VqcM`4s`DbSAtFcre260v~RL55qf5p$MM^9%hBl1s;U3E54^O%nE-IxC-GY z;Am22{+|M;{GJAGE$2^+&juSlZhZv)RW|r&;KcuT8~#rNr~0}dN+!8X<=O;%IKqzr zr*tO#OW;Eheg-(DGvR*#Cq29goYI+aA2b*W|I3EYMBthhCzXCXtaGAI$ z9nS~YMqK!oJXeg1(wX@01y1eeHC!h7?IBMC<8u_aH6JHrMttgUS@RhLoa*HcE~+=; zPkbH&PVx*9wda%0_|SJ+t@%6;oYKz%ZfeiO=Of04mYJ>P`G)a%)rQZnz(;`(eMd3U zN}d3`{7mxvZo_9ZaMHgW)=RDRKMVLs;P(TMu;OC`4i#~a0Y}p?>vvC-cPU#;7 zJ_4>uo)e4@z3Xhv=Q`uF-G+}8Oey^*z)k&*>T4`;k_X@1Z^!2`;8ZSZ^Vag@AP@yy z37qQ9B+q+{&n)29@_fnoWZLlg2{^UG7lB*1!(M2#B+th-e1-z&^=!i@9{6a`{|cPs zGRafK_zc8~ytO>9GCre$Lj<0l`tQfUVFI|vfs;KTK2q>J3LI6>>42lDn(?0*eF1Qj z-H<@=`ynK?`?bKW?LatiDi^)?ZY|G5M*oQoeF<>t=f{DY`WMN01UT8H+rUlsknnoo zsCsSy#&}b?);h?ooj)c+5_=<2{_r+jle?~J>j1NCwUG7 zH`#w`8`ptTdHw`$>hGjCPAP;P9NX)m4{*{$Kj7AS7{>77HuyM(kF&w&F#Jgyd@;ip z+2Cs!Zm_|3GJKm2{u#qRu)+Vu@ULv}-x&U*4Q>zRQ+fYmgZnVt1-iA?!w81^+2E5H zKGFtHW%wi;{8@%4+u$1+o^OM{$MBbJ@Glv@(*{4!@K0^<{{W}<^c`@My`uIr1dWgM z;NaB0yc&jk+u*Yp9%_RxVmLPPwA0)341dZ7FK2kJ4gN91@eS~He7<9NnGJr8;rnfH z(Ey=b$87L^48LT9hcLX^1|QFGId0^v+k=+j0XBF(!=r5QwG21JR7_Ucm(QY zIdB@U$UabgH326%J^=1v!cl?20fHU;CvX~{d3xXvGyH-Lp2+b3*x>mLm$|g(vyR~d zZ18s(9%X|cV)#@W{5-?yI~Ue+HZuG<8{BQ6P_9ijcp$^yv%xhCr|%Y8^M8WjKiJ?o z3~#W(S2Ns6)}GH!hAVCG&lx__2LGPnlWp*NhSU9@wVY0agz_%8!TlM&-Uc7d@ONzR z=?t&3!50FjaqA3l)A&y9>J{KYz#UxMk86j4Q#%U-PUEnt9XbvczB4}#IJ%60gQqWW z8eb<{(*rmCO!uhd5}oO1!Vd!5BgE^8dT^ z|EqlezvlD*7yqv6%N6rc+%lPeCj0PzxS*2%(?j=q=&D_Hg`Z{fa#MpdwKsQ6dNGwY z|2o6xV18YTNjTP!7HtP5e|m@Mu=TD#&S@c=IR4S;bEl1q8#is-CASNRR8;@{z<&^XR6! zLwa1_?Z2ehX+GUld`ORLzTGDpJI$t>CJ@r&Hemhf#!hqTrU8WZxB+zd)@Nr~g?7^h zLVMf>gl~d&%DY~Ppugz@hr^hG_P*jKxhOz>1knBZvNb4ZL%)a#G=FDQhbD9 zfGwueDvXoGO=;uj;pbPBV21vE_P4rY{BdT^M~s?8{)722~IWwb&IwMB)tX+{|bp@rF^f_C=P>rwtYy zA?T?CEGVi2ENIFW9x14*11#vO11u=311xB(11zYk11#vP11vO#4shqC9NBp(M|NJy z$j(a{*?B1=J1=Eq=cSD7yp)lhmol>RQbu-O%E-=38EIt(czyAAEnWA2Q%e*Esh$ir z!hk2x2c)MjSs1)HCpCrlBxf$nN=r}8<`EHp9$yzNS=sI!i#eG|3zFxuL)*GfN1rkm z$mgf#vR7jAyH8>|^+QO8kSW>RjLZyeZsx+YInf!*Wum_MVxCwELXg+n`fz}ZZDPp<9GWa$CtcJ%k; z4mr#pnePE}Yw~;Xw!Uq-H|ud$N3-0EbB9}%d$W(RJ?!OPd61SXyRIB;KJ@ z&Ckr7pPsr;)%L5K5NhR5NQpCoNg>TpelHa$N#Ejed6UdWr2s?AxPow^Y3*$sa* zb8&WZYR>S^Z6jXr8{W0O4qo^-%xb&CFuP61n^l3_%C2^s1bUuKhbhewk|EfIUG0_& zGppUwfb|sgPMp>>r&~I~sCG*NR?Mb$OV+`pc1sPW9W83NDHwl~LG6~-!rg37yQR-H zo5=39MSRVq_t31l6Y>Xd+?%hBExo6_7E{_SDHGXDeGjSI8Pa<(Zf{4srS51(yCsLz zomkOslbDTYw^U$kvZ3A5nQM>gn}4j+^BOcKxreUX8&GBvEEZI_O<|M9Zk~UzH>j0X z2hmQnO55=feEV0f`9oH-Q|IM${>n9D)&6!@I6Ktz(zfZy*&uen=-l+Q+|+DsdJaq5 z*~9wwGOz<@gIL13S(#}WV38A)kvTUdRhxoSth3XyIu#{2q?=rVLj^_ja81BQlXQe_ z=Xr*8muGm7^Arqu=UI&CE{ljBXTjU|&T|;qT@H~w&Vlt5-pbM7)_G>5y2~s?^>=fl zE{1~zJI^bm+a?jx^EQ!dw)I_P)NMNm>3KsiTN_@BU1Zj6iwNm?lb}+Whl4Ki>b7l! z^t^Fc4<}t@)osfN?Rm@SFv4`6Uud_DBeds@Ls(eoB9m?#M(BUhFwA307a4ZjIIzMX zj4r8`B?h6#!K|B~f}0+1vmAthhkyFk-rVy822FmuviDXgu^!Qdz>&5%{{*sqPNuWF zJ7knDNFOj4k8AF=a$#fClQT1NayzD{@oh@1?P3O_Gv{KpmcgRBUdm`c!eyC`?hZ=M z)TXEAB&VjdAKVx}L3gGMyI=TVNi21Ek4I4*tGw%bCV|#8`RKZ71c#dXZ~GZSaF}YM zIX_`3N_fN^X6k>o^r2nQo4S&jp79B{r57F)hnaeUnV#VhUC?*YK*Kt3pjZ#FTi zbWz@jF3KCxMR_ASl$Yfj(XlRjvWCKHlYchObK+M~%(j|M`#V_a&XZxGrK<>&dTlZa zjxg!hHe#en!5tz@8txEbQgMd}la4z?n3UWh!ldO65vFF32kL;@CBfBbjWLG7R z?5gCEU6nkttCB}{Rr1KLN*>u&$s@Zed1O~5j~r!gtGpWTu_nWag#qgx;~;B(?G|O) zkJkJYCp|4ExAS}Ax$T#5Fip{>Xmhm!+-^aK?XDX}x3BmjSm%#JxncMyS?(|_=y1bQ z(sH!;cGxh=VOW+nCnq(B86uyq%*mXW%MF{7 z!{?^P|6mFKZtOz5v-|M@2aYp}x%UHr-6!GRrZ9fx6zw4u7K`3 zusSO`3ZKJ8@|^-5)#FXjp$*Wv;O2Uz@G)G(?+~NId&Tb`0fw{0&2$vrgLpa{8}0P{ zy$HX9cnXugD7=ZqqrJcX3c~BG;wfB+_#>cy5b>)JUV(TDQ+f(7VDU2$pMfyG18hM$iQT^S7d-urDs+*B5luUvX~x`}YCs1v*pzrLY_q@pE8wdqC$5 zjI*MnaEnObcT*(Tjf0?T28MIy&31#rH*gWZ%Z%Q3e$(qB0+Zqbo(G* z9q4L-9ReMNsU9edZ$a?=a*#du{wE0UMZBqBQg{z8;!_5?3Z#>QZU?YeKu2NXL*Y$` zr~ddL;Q@@;t_-uq1Al}qZDLfAs z@tFy_U7(8x-E3gfKu2NXL*dDYr+&Et@iP#ffOu0srEnZB;u8tF9iU4A-56k@prbJH zp>Qzb$=GC_D%k@$mv(8R+z&^9I%nbQC5&6qX~N`sIGa_eIzl@f4xQI_Y=t_V`f^H(PXwXp@ zzj6vci1-5tXCOWf;V8sY7{77~(|fkWXAtO$fzJTlP+D9E?k?UxeX(o5J{&Q#b$@UI&oS_a-9nc_&JPcm8GcejK^< zT?~qsvUp;RcW7mBU}`u%Cvt&NKtkW0AUBA)fy@nHu9CTwAJI{MG)h;ky~Wi{V=tUdr$d3?~~;P%-{d{(1`F zZ#l#B7@o`UEQY5uT*vSfh9@$7Hp6E!d^*Du7(S8V@eGe;xSHW(7#_*+aE7ZG9>nlK zh6gZQ$#8FmdokRD;R=S!7%pYFgy9^+TUdW-hD#(j;gWvp8GeJ|R~dep;dKl@$M7=@ zKgIA`h96`25r!XPcqPLRGW-C;_c6SJ;ky~Wi{U#MUdHgP3@>H)28J6MzMA1B3@>K5 zp5eByxnHW`s}5v9U6dO$#a%)z+#7+w$mI&>VK1_|B*Dfux!THQ;J0V=Tj3uGy~t6vTnu<`Ax!=fHth{mOi zt3_EF$?sgoZH1rCtO8s9M|EuShoQVCKe;A@y;`iu*mxK+N$=G*S2Fz-d|p3Kr7?~$pnOSgMw)YR_5#SvRSJILKMvN32nXSaQ6p86JWZl= z*K;N8|HtbEIPoX@frM;q(9BJp8=f*MG9pEmY7O`p|opO=sx(`8QgDb|E29|@;7k<6VtKRJ1BYF=_`R_@$fZIZC8Zi>Y{0Mg@+ ztHpP&h(~8XHXxX{@(Qb&7RqCc$5qDT>UsWo3K5u!ft^SZ#RUm#}xSy@b*iXm5fo#vqoSkK`$__s@D zBM1L>9NSimZ@kZq)lAn|=no+OG6YWzVsiW_d_xS)!CD`*Rm_~omd8xwPxX>JSl}_U zPB=%woB$r{dLjF4Tb3;Fz%44b8a%9j?R6@=>6eitKgTNpIQ=LOx~OYXozXX;yZnI<(b@j$KeYSDuxp&_dw;4WnSa?y zcE(9={Z=Ts^+)xw3Q61}4Zew$4S4bq3&rXlF)HHPny$1t#AzA}Il`kG(%s>T@?!Hr zp=tDuMo8?WTNc~abfWE%hO-H$#|!BxKHPXJe#BZe9!*7T&Wk9aO0 zXVmvDaNRKY9mytjLoXGjQ8(NdLcBGN9!_wbq8pm+C?Dk>gzN&>aRYC~PN|Qd?(IK# z7;Ahnljp^)VGBUU;7Zst^>VMEb$}C z;cJ)0y6a@dwx&5&6py!&*3PLxffCH~%ZnxM(GBOs`Q#IGI#1)2`e^mCST7@|?Dwu? zjccj5QMt?4IC$6nMoDQ~Qv~vuz{}(VDeRTQjZQkxca(9i8`_!z!QB-!0c|q;_iMxF zRqJ=^<-05YNZ|ZR{o*vYjyr2^ee0}GYisHSJ`$0GRe2Tuqu=G$`Nti#61O=U zolCjENwtbnPUmRUG+xLesj04=Ae*aEQR=vb)0IR^Y8@ek19H6D>Q?HyC861mllsYw znuZc{>lnUPx}~k@Oshp#Ct5{uPDtmnRvPEDMfOTt(^su7;BmOswNxAz?d@FZx~?$V zJ?`j9XHY4W@^?7n=y%Wavh8aXWZU;0<@#Q0U@4X8?N&)#aGj>HArZNZAXzmHk|fe< zUhJ}1kxro-zOk)oQ|s`JR9EXjt!X^PODOiwi;ZqjnyZyvo(v z+e@WVCrq4NR9izzrFEh@uCDDD)mEurNU0Lshq3&JkaktWd8r4qwqA&bfoOrDcpR`H?u zANFzaX)@p?cgs+sm3J?u+5hRyN&VZJp1bR}!2VAq{GVN|P`5QL{ml5G=pQKA0>1w5 z)}@h~&ZkSeo0#_5RU@cUJ~P?P%8K;3%)i8_TTMfj%1FBAG>tPfLciy&VuLSlSsrPq zwL`3(lkOR`*8aNwx`)=cH9d4!(-5T+QiW^aGF$4TyAQTU#g}{-G_7g$=530glYWTv z=i~0@H8zNk3x0=UIc2bsbkmEEce`sJ7mQkRxmy@VsN-GIsN`KP3ngk; zK-S0HJ6$04KU*}76L`BWSl};O$aW3d?GUGoQ^R_xVZ8#u=>yQkg(w8;^)B=XyXB-i ze$5G%YiA2iIgjgO1ja?o~wkALJ z7HZIa{e@;urC1+^vC(b)1F-B0oqYW{V112J-5?zo;JW?{LS9B1g=FiM#@?F(OFgz6 zZ#I^ZUG@IL88!1@%iz-U&3e86hJ@yT1Wg>3KAhKm2z1}p6wLb{Xdw-?H4SdjG$<61 ziu2l%7mMDDn)2Z(?gRCJO`=VjhBJI?=!a%?#ZS?+_a7W1jv z?)2MI2)=jjP;EEgaX|i>I6v6Y1|Iq2j^`HpxPkAUZ#L>xaYN&dH*e6lHC?_Vi5m#n z>+TfAsgds79g_Orcc_J(zC%6mCtznMQa+dkBHhRW<3dF zxMEFXAa6A^jS&tAqix@34;O7$CRs)^3bbA^$ImUe4X{Bi*(>;Y#!K*jvZ#XWkx0`} zmk-xT)7XpW@l3mRydw5&+;cZe_nb#RIvdw(JGIH1w>6C%uTionRI9(s(&Noudc{Ugcf46y)*HPveil+WX&NRx0oPg6FlIJf8N!dkwbL|&KLuBg z5pgTr(0pASMYZFSy<|3 zv^wvK{yNw7uzV`nde~x>%lZMZ&YW(T&Y8E@ePFqrcxz6U+YJ`o(+JDW^;++5^xGI% z+MAyTdw=1MRyyw%+3S)rZ?f0=sl5H0eT&-vtXpK$X7K(;ZwdB#$}M$ck_yt%ya?9% z#W+vc-dLVS1A2Ab5TqHyhezG=*<_E|xhPTHI6aHfSljSEu;GEXsI3gVMK$Yx>jy}v z1UDZ(^?kSQ-%l=qL#RPuApLf&Wi(7&4P zV*^DOVc%+L{hEJH!P*mzB->IBHV|`Fua-^WD$q`$4ns$CRtO zzE8n`?S9*iH|JseAzi)6^L(S3bY0fW1ud*qH##UuIytlc8=Kv>^ylY5MxJ&}b3cSA zZ3!P<+3dgNK8yn#L_r*!7>8UwW>K>uK_HW%?@M|`syJjOLsnWOpAKGb|4^f0EGc#mpU zls*yX3ay4i2Y%Zy|7-R^?679HmehOEui@ z_|P}4utbeUK7~-PUVOdotXWZfwz#rbv&iO{J|gW(Dnb!@T!+b3mEtj)H3L1<>Bq3U?GE*d2un zo~<~7&+=9pwcIgk%`Xhby@Uc5VS^5QrRv64lHuB^8;_;JwO2QOo&r~*Zrqg!ms2+e z^HQlB_wjP58~4lu?tu8G;kuyi(%?ElXX$Wd2xq{Rs~h7Nz;$lMeTC(&Vnys7+*!2X ze&aUoFXZdhjoEze&mbh+OUQ7a(GU1bX50&*WqgRkoh8NueSe)NKfd){-yh@JeHhXD z7*)7GqPvhlBkoVQ-bUQHaJ`IlFL1x{cyq2k7;|0Wp2P(;fAj9JQYDRV6~~)*RGe>K zUN#eBNo&(p+*7tT{fzt3R^0!S|Hr$7q3hPBAMTw72o_;2s_hV5@{I*R*L zJi~(TFeqoM$KCKE{a{qY?BJUJ3}5uYkM9N;XT}A>w~tTzKJpRr-OY#J29KGzJ85m& z!H3K5uK7*$qJ11^^v7rt7UzMKoAES)+R=JE0YLx9-EM2s8svD6o)_5<+VX5{AlgYW zpT6MkKwh?I`OvbveYQBjjz9430~jr$X{6Gl|AXHH(8$yL{WJPM&oSk0pzc28mdK}^ zbGHcNU7(`1X(k_j406-hb-cN_ETDEssShY0;bY?O!j7r!;|6bc^cQVXHyqheDhX)bVI)!+^Oi*4J%krG^O_B z(|Pde+>x#(Zb<16@NnVtm-01df0qlIS*vcS<$ItntFPNF-o_!@1GkXgZsOh${l7(z zF^^K;;KSEi?#FnD`sYKJaK94c^+?w7+F$+#3k*Z8?8Uu84;3y%sh8ztb{g zyU5>@mv2Xl7hKFSLR*`*x2PLh71Wjnv65`$C0N%Y)b2}s=*5qTK3^8DOrS?&aEU zCSgPl!kyfRcU|zjw6$qQi#x2x69XU-tj22oNrSp^MF7GQ%m4$`jXGZM>c-#s5mw!p z>xVdzx-nxATv!g>18`wEBKW5d>c%nrQw)UpryA-;=}^Qws~e;Erx{(@kLK9tZk~US zdb4Yb8$W_Mp~fOHM%Hpjk7oeX_gb4;aSz;z`+o^*!;O6SuRE~X4Pz3B676m#Kk~Zt z-=d78k+Xje`akY{(f{vI-JQEbTKe}L($Z<%2e;z>pK`9f!vzR=AH8!Pw*34x=>pR9 zAv`H)ZK~o^eST+L>G;O|?Z#5CFHryB{MMgJdTM$@{31O${p@PJy0z)ePutq;JZObU zj1>(D7IGapN37Xk17;ULe1QQUkjvp$v!`S{o|*l0YWCE{sf$yixEO6lMrN*(Q7ALg z(v_)8@YOlxyv%HTbu%L+EjJCHy-Zi)tDV_ImX(^Fo6n_%s~=Kv_&{Cel2lr(r;n<{ zJeKfyTCUC%PLcjwtFb=n*Yt6(K9 zy_-sslA4~Hn`()*WYoS0LaHETDxZ~561F3Q6~uafhHW|6ejf{S8x8fi6pWEs8sYPd zLLHcjBna1KUirbwI4!=Tnxf3jRGNyfOYOY4!X6$|v03f2L>&s%ISWB!i?i_FZ>m)l zJ%$FtwoIb*(fFic%9ITA28zy`9cvWAP8%$pcUeY3pM1ll#bg`#1zFlltDKjexv)!q z&>1zFAZ2@fP#MgPTq&?ku_YC@#WB^fth?+fwuuGhv3`2Q5o?-W!kN1SQMe7^2&?!p z{e*XqOz~QT@!li*AyOtFy3F}e-y7pILa!#72!my z@LikuNG!6BwTfSYaGX{6GlZvDgrK*_n$oQl{(h z?a&mmAd|4(pP54S6U8me%t*tYO)foiK1EH0aY~QEXX$dZ^U?THQceCSPMe;dnarhu zoXgQ^vr|*XV+(^eBRQ3$7u4w!n?18v+LV+jNefbwb93U*f;8FL+WaV%l39e#?L#sO zk;_r*T1Tc<_r|;yUGd`MzN)EvmDlSW#4fWI4^Z0f^0Fw6)Fo+|i*u%15Hk-nDN|FRI>^fBn1SrPyf9H#I%K4Rla+TabDqATnlh*#q|!Z_i^pVbqv?{xV)7(8xdC! zuE%ku;4aNf;z#>gX#dZv;F0G~h)|wF_#?4Ni^@cPdOwBAL^O#w#GUq2(U0~s+5VIOjxhW} zr6*4170z|6Tqoog9aDK>1ZI>N4!9(lDq!QLH+MFD|JqDE@D5-J%#sv918}l)f|zGcTj|mS|=)&4YZf`^Od}qqz@P;j$Y>y9pE175h?Y0 z#5r_bNxacR8538slj|26Eg3I2t_?VppqW~*`eM<~FG$A6IZVaa_dFQ)zdERy&cqd! za%;Q{OO1~Cfrdq8j!TXhB8-NmyBwD)4cSUVgwl{(VaSDFSCn7km|tdyP&wx5ik3(n zm#G~qy{ij+u9SOoh2AH$zSSDQJ>E+i}|Ow~})p(!e|Y zfAc=i_kX_OG48W2d+oK?UVH7e_c=MKgiL;pz7(RenMN=td!ObhuC#hxGJ0P3@w^04 zjQ7_*URMgePe*xQs`701@w&vT5-r_bn#~B8U+eXCwey8)?@K&y(%;+>E6u4oe~DPM zq^IgPeZ0<^yiON-UeY`Tg}+YrMn_tzoiF)#w(-1}9I+@5U1r3jIeH-$_@oZp#ODc*7GeX}!NTnOiLM z`kFet7blR5<6)eM}g}$W!ooRk?oKF1@dC zxuKLkG)jMN65el@{@5bDo*=#6B)ncO{i&R;vy?7BC|n*k32!nkSxwSbjY}I-8KbVL zi`>Z9l*f!}j8T{IBR0nLZ;Dax1bqwbFJHCDn(6xiKc3DULW6)4$RXSsX*6jCBz^4G~Q-;SDkUH}WHP#zZg=6)ry} zNR2Jhze5v+OKX$#Mw76;U3#lU`Y=Iyze#w*D81Dr%>qM@7u zTImDZ`X8=~I9NF9LQI6wtUqJQL;L*z03=#6#irn(4Npe$x| zr6GKyA@U&FGK|^C*Nd1amsW+#cL`FA%eRcnkIdE>(xD+{)M~y41JO_yzL7urU}5;i z7F%+=2NC z!=w~3Q(W#TU0Stda9cib0iF=kzp*Z&(%fQA9d*28^fMJ}nHizY&iBdh`2Y1fnl=CR zy8m^rQ?6%b=wC8a3ygM6CSeMX$uyX7jo6ruFc|r*B@D*btB)BXF*{cCN7uxRIanBZ zEN1j!KITsNL0|fAIPNF5O6TNWzt(l1WcOp z2z?#FO+ZlvVFB|RlX|ClzEFsWQI~g#4?RRS2D5ndM!wSQJecX~gE3GN3XeLBSb^XW z6R?QNFdUBQUlS8vY+&OmVrgYvB%*;0{r?-{{sSRyI|a9=nE8C(zvzmI?_UUSBnL7@nhx%0M~ggYGds%Fg$fj&#ImuE!oIUczpJ^SCQSW_vJ^b+i- zRLY+TjMA)kh%S#87dhBf$NLqnaNXiis7e;glcU??WmRd>%tYDtj9O;Ixnk`WrN%8J zDu0iIo$o|>)ru_&&6fh+j=|z4duF8qXD~?Ig9gMoDpFSnHu&x=#(&=ySC_lH#jjuO zRO~xZ*3jU|lOw}-)F>vcf49tS@NY|sVjtOS)MbHodU2zxBDG2)l6oox8(Rj?U*(s4 z|Ft1;#c%n%Tj$ZFYcUoIX6Pz{$8J>q{M%=;^R1HKisH^cU5z${7xc=l11Gu;ivRVu z*s~8N$EkG+q@KPVn2}|{|LTQ9nKF%An{oU(_bIj4f17+ger=2YZ^c{qB5yUMo3MlM z^Q_eLb~Dz_x3Ekq7ys5Pe8WKXnG=e0#R8_U*cfi1#M#IGR=f(jV)MZCTVUzSGs6_W z^o`x}tAjJcWGbXX#!riN*zlW^lVbd9*B|$q3d8GK^ahcaG+yEIkGKvZ1o8NeevdT# z>^f%U;YnKtOsIVP+tV}8&fkgKvw5q^Pd*xA)Wp((wQOZ%pk}a}iK%Yr&)+#DS-^iF6M10?Yy(F?V{(+j%{k2SMgDZdMz$Fry%Uo*L$YZV#94e8O&koc?2h}mI zk|Vt6V83Y1fJ@{zwY~rM7D8bpl0eh6Eo!$pPxEtghW;`Td8?re*?2< zyeI$qp#BnBr9`DkIrlea-Kl~6)WOvf*_LBU%}Y~F%)aqO_UU*8%=viucylk3n8CHW z0e9Y#Woz|(k;~wCMzbiWh57WKOj60fS5G-5vpczP#R-Zu_zt^A#*UiK>~(>pBcmuENF&Xw^?%^17a?HXemR$Ryzsn>llRFBE= z(i^5P3;DV4%MDT-2I_m=*fAw>)ueUa*Hq&eSxt~2LZ>fAPh&rje1iEicjq1f<2Tbs z;;F7$UE$Hn=u;T@_;dcu_0>VL6=XEM%lP5cfYLSOXx==9WvYl?AL#d*er)Uyy?TEh zKlS^}*jsX8;G^JCQoM~2^KV+}pJiy@7<2J7K;EV4!bupY52IVquU@YXTr^K;nH{gy zsEh84X2iPx=I&Dx6sbzy5UKD=Xj; zMqcgnm)&8<}=dzej5& zYh9V*8h4@8GcIGTd!Ll1LcXvp*+=N5ZeQzJQEM#Z^FDQrrI_hopeZfL5G|@HjmR+Q z^w?z4COS92bg7XarpG^n^RfiWv^j+TSRUhSbvbFEYLa*9n z@0-{Onmlh7I$y8$JX`JE?BjX8&>36r<%OQ7eLNdl``#?{zV74Ik~~)axOQYy^w1W& z5jCcfk89P~2q2R`To+zr>b!nz7qQd4(9@2oZdF^~<%RCig?*w6Nr#iv5J|hz>N$NY zgxHPPXcy3A*B_FP8PvP$)Q_Vhup_84M9>b4-+y&oWRn5AiHNOrBat?kw_3EP`=H8@ z^vHgy*!~5vedwbVN%^8h38jl3t-#qr9*z{0rAxK^yf{&TA8oGl9@*#TV}ET1D@CE$ z!auUl#%X|}G^tWlP+pp=FYTSt?sP)q^p4)?piy|D-RbWN>20O-gi?A(M!Uj$GU;9H zHI&i^8khU#ZP5wr<1{Weuu;Okspgslz00U}*A@1$wlEGZu-|X;mLi7UZ-*p-NKfy)px<004wYzI{aCGI?we>&$Ys`T&ciSJmQL^Kkd-u;&R&4sD zb?MK&b4xESEhvb5&AzogJv{O+XU^Q+|K_h-KK}mxqNTs~`}peh;L-oeE4}!|(wWjX zPPC?lkDjyrL{Zbt_Pc|3-MaN*MC0DGXR>!cb{=`=*3Ye%CvG}%@y`Bb_HXREn_O`5 zi@{8s22rkDQjSwK(MHh~h4_>VGX~#DyQ6=J=W0lvyk5iT0V|q$KNgJ@M!)4-M`T7* z!{1VRN>Va?yqz5#j_I|cRJV&hW#fWyV20&b@L1AJw`lV;1w5fa?;FF_I=9BjS@?Ws zE%&Fc`mFA#6`|-GbwR6t!&k;AP(z%j2~Am7*fQjl(p(=}HD6CLL``3>=d@ZgVTpL> zItk9}kWKJR_MsX(M(@@1vEHQ6boM3hX0{>Os@AEAOT_PRwM^2s#Q|#hfq+*ihV zqgVOQxux2ErxMKH%|oN(+SVJApYLq+R>BhTF01Nm14hXUtf~)RT&lOK{^hOx29s6w zm5EEluUb{#6%Z*mT2-I3xU}4=diwY03_i0vTYvBQCF12))$0So%M#P{E{{{(PbxJt6o|hsr{KdDB(_zag;{bl^)2Gz{)W4gYowk2S^f@3(Xs%g+LZ=@o<#vlCcpB}UKD2>m$$;@BZ6htUI zoR7xn*QENHzb6WYh5ZyCDC?hf6SE9e5zhWWvgkn`LbHe>uY~u7n}$p7ugAN*FcBD& zv~0HFo-Adc2ad2YQ^3$56#GjatQXj^41Q_+*Cm1}<4brX0=9a1z%``1 z^o~=E6@%LYNU&mf_?_t!r~x{q z32-5Wl?%P^r&y*exAKsg?(mQaRvt3Sv9DV4Tc?MJeOKI*4~HK~t(D1mAR;BKTdqT2aiAPE))v&4k%x zWr`Jh^yPK3pw6C7eGWanC(hmREWojd^4>SyaOnHX{h9GCxhRg zz))+&Fv4k*T(Yc_VfQvL)LSu3a1xJ_4D7UF+`DAM=Q?dz{H5IhN5j!h6BWG-6D2>_ z=`EWN=}wu9!#e{`!7O-7WT&^>`cQYPwq|4}L(1$nX`vOvkt4eI>NG)}3=`(GNvo|G zR(_5a7-D~DY6B8Ew8HB7l9H5tld6WrvMkmdVv8PB{l|2T4X zit^6*&f)9hIXF)~VX%XgT?d<7q?-aHkJk%CY@}+Cie~1ET2t2}%;OJXzxuk&@drg! ze2{_=j3A=wg6E#4vZ;eT+{_5Of_ZTl?B8&0lR1nLO>Yx1a?21iib+L2Zf{A?Jk9VF z;1uJ-C}T%`QRv{HFt=uIp(O6Ws4^3Hh|Kcr`Kr+8NgkgF?GT>8NIdjslntFH8Zn5` zD$F4Cln?myZqqseLwSPvPY~nV?6v0&3droAwk+{u{z$xsPhtt==u6Db1n(`IEIj74 zNLzOOv|+KE#(dk-Tu-vDVX54(k=WaaQ7&{)_A$>($bT!~8JzGBM6RoV}c$ zVIRR>&M31V&0daf=Fem=u_v9yUXE$w&t@+d$wf(>*hTDRwx1}Qz06UIa@ot=IMGt} za*Eu(fW1U(uhFH`tfyD<4sB8MGece#HWxWM*Q}T(*Y=M#h6;+Z#Nx}cs6#%hGGjit zcrIL0^Nv>gY?P^@$S}g*VV0x&A$R}Gq1xuDO*QWrlbv1=zGY0YUa=n znx|&$dq+0++3J%O(Q8Mn@Sf%P^da|>%%Pqar^fAnrzZ8;>Qfc98%C_~o8|c2A@@U> zLvt@q6(4vtCJCNq?p>fhF|MB`$(qsA`>#F-I zUsFH&<;OpHHrEc7$Z_j_AQPM{&<9BtBZD9p@Qn^R{CIT0XWxx|<>JKGj{arg&qw|L z^yQf!_fPuksI8vwZhHU0{>ZppXU<<6b^L?jXKpM!vNle!ZbRbH#JKCe?@a3L7C!#S z@D;I>rv80~&$1cgF@n(lNFnr?nLxj>kkGf@ zCiFk!*Exh30*^+%`1IA<_WV~XPJF*0sP~AGrKi3M_PXkS{_}dgqRroAH$CFE!@@7VOA8kVyjFK6 zyWqvU`hdxAeU`R#bL6s*PR%d)<*xJqI_f#hOg$QT;@w+qJC5IZH=^$D{=NR2PTUxk zQk`sE{?=dSkJ>Wx(58z=^OlZrdFxDF*pUxj-t^sr_9Gt*>^qA&b4@%;Ed3(>g`M+_ zPi4ODIK!_<>t7h$a4?pytasxpU7r=7HLP2`cqhNCEGiQR#e$S=L!%{zvNF^AW$6R@ zy)H2d1p3%==Ry3XNB(ta(|fn_Hb4I0eCcy-ArqgOcK&YA&og)Ry_**H>fUKVyX#IR z7c700x8eN5hnKz5pGV&ke=XT`-?pgXCK^j_2H38pXg_&Z@P8k_A!5#bGPmvJUnS+()rwj zWb)J5KhN4b(0h+)u{u0{q{}x8vbSts{!!f>u$G?wrhWg`?E#;`I!7}`est@s?xV-K zN#ERGJk$Hno4!xmcH7i(CSg4Y-o?_-qS7KGM~vJsM=|g4obhk)&R%~zy9{0uzf7^R? znB9(E$Na-i+{oG!d1rg+-(aIZ5A@k1{C3IJiG6Rrey`vof0y&;?>&HBC*MjgnE8)B z@1L3b%j~e_UtP`JwkOKm+I1Y7Ogevl;gZTZ+cw=u___a!73a_2_!(9D-njqa>|HM< z0L>|p;5A8l{!A*X%ZHJ#PWou3;+4udBYU}ia_@fdakG7Q{qvWKznrI?6}E$(miUQoBVIQD^7p7+r=x#dUVpL#p$VeUuq!sFlPawdytv^M?G$R&lVNcz$q zox1;ts}F;=?|rfuIB1LT&Od&Jew))?+5BgV|3@y{aE6@}M}N3HapbqRMy2e?Qg%$P zs2_1kRdmMeD5C1R92xaJ>hGhj+Gm$sPRrhrsR=l6=HY!CruZ3M&jZh#nE|hzSu7a) zv!$1^BaH#)&nOCx&KYd@dhw`?$CjDkyyvqs*|OP|nc#F?^5Gf(1giLkOG)yF|C}iL zqV>A+xTN0+?(nSYmt+1S(~X7sGberakp_<2Xm|X^t(;4r+P#56-nuixv*w%cph0@Y z-Lyk{=WPG1?z{W#69c}#bmQm9WdYxxTo`tI^)9X`J004qR>q$&@x`&hy=Km=TPfqu z7oV99T#CwdioL)8IdSaOzX#8sd4o4V?=yJ7`b38frzY<^8u{+`iJLdwG6jy#8u@*q z$KO&lm1}R>Un_fkee|Vm?_vf%oVI<;uB%5MdcM&2!1=k`A}}A@ZsjeV-ruyBsbq(em?4E(5tJ3Z~V}H@L0TX4L5T$ z6JC9>!q9R*?3n+qU1xIo?)F2N6Qp}wD=4?zP;q;^#WDrsUR-eEZklaJ`r1CI6-npG&>I>1& zRbEqM2P8~2=+zLb+|e~A8a_~xLbGnFAZ zKS^E)o_~J#a|iOAXN6{6KD_wBPtLQ|i@t4mL-h|Qd2O*{-=NI4cAxq(w;@wM$oOHv z$<_VBvhTG0FtDL~z%%Rp=im1|y>Zy{`!jFdAGD$$4>>yh5XdT&DzV!m75w0Et^3(u^jEA7o}hW_Ro4x{l9L}UJH9Ou7+ zhu7jtbvW18@$>TOINzhuReGmf+NyL}pmf3Ud3%CXC99{W&+xz??scRqS4JE&Ke2U? zABjgQ=pIG8d!APGN`@#b1NUS^Vfs>CIi6A!<>5}kBYTKlqAyJnmoAct*no8m4b;U#v z@tyPW#8Z%0T0HSQ;BB6Fx_pWnH%7J^A{rBX*^X#S@xWt#<&^k`5{ zDZRnCJS?YYxE?6^=jqlH2G`_#uG*`G9z~>wMo+i)g>HCm6eD$-{AH;E?}0>_;vJ`m zDU*1Fd-#^G)0}K*$QY0yb`RPv_wae9p?pfFd@+xCMY;6F{`p(a`DV4p;#*P<*Q z>@Ww1ks}pZ$@B#*^Ea%_@8ZkGkLb-`5Ve@zO`VyBFDgt;%UztkV0v=q;xx-w5$5Nm zjfhc9$Aj(oLVz`Dd=|b3p%}j)ec}H=orZ4-pswX@f84Lvcf179_HX@JH}p($b_z8W zLoXmTi?XK1;A!z3Md!DFmdwRBFp_fS7vR_Z79^$NiwkBTVSJ3j{0)vM9exr}K`%g5 zlboLWk3#^0`hq5jhSU`sb`0 z{JcfDh3AWRS#xa?_ zM+=+#6k(T^kn(+8klwA?@db&(@sN)!Ge+E8qE|!?Wa{S$^y-ThikcB7&7REHwl?|C zih7+_d}ex63Uh0J?}KtpU8emAVN)QX>l+Cj@+Plp-l3vC{ERJsuKEP(Fe=wn-jz@M z8e^;Mb$#Df_S)A6V^-M37VdsQbEVT02ZIT0mD`Q1@^~QXSOfqT5q%RfCJB1GM#?)rL_=1)ReJ|N@Lm!V& zh22ZIE_Ab8kCN*rzO?&fy|l!+OfMB`H}vxl`gvV4e?W$T*Sxdj{rG!YRKG;kd8!Sg z<)Mlqm0XWoon?hT=oRvhUeN~VlopA6@x>9GBtwBxUPHGa=lE+ z^#8*6=ao-M`pbAvNsQw{ax=3B*9l`2M0`|#@y*93RKGyg>%JTOwnnGJk-Vq;yh17- zz%RN`DC>X(MOO-CTceUooy#rq&PEal;Vx2iIgDMC-d!Y6Ru>GU+=IZ z`mdzutGC4XV#pQKdv|K>Kgxq8f6_AJ*hcF=fzic|p2C)gnu}9!p|`#=@qlOc_uJ7T zsKuzlyyf+WBL@oY`9)fd+qXf^VS*!!@PK5qTVsF8pIw=^9eBzu3c&%vz2h#uw9dJ3uioSz^NHZ{7gdfQr3`aVmAff*%&DsjZn_==71~Tam2bUVEL+rE_nhr#v<1+2ApVe#K{rv4|a+wWZ+$hL( zEMTEyv1bGWg(n3?T4gW4xlVym@9DH$vrX~J6m6tJEFAKA(9lIr9NW+bPC<(fYm$em zl^AcKz@+!h94rr1dPAWN`J3Mmm(H|XP_;8;nNOke^!mM@7c=sSvLaXhT#Q|%!=~01 zZ&nU!77mj}$B0s^>=ePdnsJiVBKWFrhH&t*T7IVY<(WvXcZt1L&O-;u}7~-kjM-Hf4z5>*9L@lUZN)gwxF5sCWtP4@*b%74y1yx${ zXEJ{W~&z$V-K~t}ohv-!{*L;7(yslW+r?m$4QCA`8n=r$Xf-^;H z#Y$HPr9x=FKQOB#>H*lyf5{5`m>#Zr3C5e-H-E(Z_S#}dhEMz-CR*^@pzBT#?v zBCR?LXu)WBlNJoSc|eAzP4t)4S)ta$l z$*A_#oeP0s4g8V9Lc3dlopYGX6;n?UrM#kv)hf>@#ime&_DlQb3cHu*CiO3JUFzca z!J1dI#1o1?($`MaX`9Y?$_ENX_C;E}o)GJVW#kH@gZKa z^SKtg%x4S#y6-Q}g=@;h_Fta-I8>m%FEm?N;zr9{iw?e-ZE!ATwhU74mPl7;X?7db zhs}y6G?Stw=x0;^g&3EPB~&!pAtRH_Q^&)C>KqR$iSEB@RzKxyyl&oD}3MtRXWEV z36AF5V3+j?Vr!p&BM!s)(#bz6oV(l zinnKJ%Fcdk=lGGcII*CdVx#9YaZyzK2W7H&%tvb92W>vtzQXYxts{Ls4|6U-a#^p% zMmGl4BmWG*-d#|1Cl~nxtFIrcog(4M5-XaV&7kkCpz-5N+IF>wJ_1{ z+GfNB4RScixq;3l+GoZUN-GeJG1V0-r+TD2C@9a1{*Jofi7s4sDb{yFzV5{>4V3jM zT+#E1kH%{qQ=%O?C*B*q?lQUbNW`uvPQj*Ao?^E*&&lW}<$%vO`msigX4u|sH*amiC z)42KMaPhf#br2h$U4uT=#h6^Q$}0&~G4hSFHh;c>Rj|qXX49Xo{HQgxi1V2Zt|k42 z%NQ(5gB;49!m?pjToXM&zJl$;ntVB5ZROPmDXF8Ox%-1OT_dtmyb_9&p{l~}MKv2b z4OQ1DNOj|Eukd%hPJ=>wHp8c^g3MDtDcVdHpFjA_7-Qj6R%>f6<%ZNP32^l1r~B9BpV7J9Ur@_KTmR@G_F8$Ju}VC1i1ljKK@!6`cG z*rRx;$k5==9%!L$d#8tnLn zswy#@zY4|da6Zm*G!6;xxH1#8v}pP@muPC7eYE}UYC~hov&sh4s_Zn&#xZ3ZvQ`eg z?DqVjLHjeGU3RfT{`O2-SjC%YVeMzmz}M1xYdNy9WZ=WF-nP-gT0Y8rtaFyu+au=n z_V0L^*LJG9$GlYEGgnvAI2W#8MD^A|Rh z#kv>kaT>!y#aNe%roEC*sYJP0U@{IKHz;9+Dr$vgpY^D8=6jYSu~_VQbk327i-I+V z8S(|HsiYobTzdyZ_p-!o?6R#Qf zfp|v{e(rU3Yl+^@Ftemij3o+@UhliyUYhP8-Ql--u}17jJ44IDw`Qhzcjp2Sa}05Q z1#MM&wFX&5_O^}?Q?;q+LMv+y!$<8aG#_;yPPIJCEjWcvPD?s-wdPIQdM#x_58v+N z_}O#qJTEscT&5%ybK&yUp?=<+S~BNs@pP;7pnW8}=2Vu1i}zT?W!Yve&KM!O;9JjO z!B&gk#&~6>rmZ%N87Pdy9gn^5+*t@ROT`fF*9a$SCKBhU>>k_OM z-O|k+i*CC~a?>i=(5iSVaf+2?bG23W!^Sd1OOfVV+TEs{BnCO@+t5 zHJ+QyZH9GyRj$XZw5iU*SbTz9tm#i1WZLA^Cc7c4Q`jYMM^-TwL(4#4dV7$@r;n9_ zI#xm6c;g!76{X%DS!r;*CUp^;f%4Y(;f>;w(U#(&jaH4C7O)9mhRd6A_H(TK=lVp} zmyfshsvT)%=SPDTA99H%Q~kQWFLx69E0_H|YICRt)|_CCHm3AxuySPODAtjiL^H%K zR*tOPrmffSgCpOG@%LL)sd+p6bPBhYtG98}u<7I@kgZ}I|PLK-N8z*v7Tvki{Qg9QNAYc}ZzbD&;uBI;`ib(h?}g(KtZoo#q^el9%C> zygZrX=z4*zg>sySl;bQTwx@~h0CY3FKsgR2FHL>Grgs8c6D2RVDPzi~!^q>5SS5kY zCm4+?`hm@F4RoubtZ-@!*!GaLFQ6O$W$0EN0%wxx-S^_o_r;w$cKv?ZWTBen{?e{n;|r%nFkwo}8cVr1$d z#XhRjhc@F+e{B?>^X;Qa)^QD`r*YG_viIBy&5mg>!eVae*UX3#TS2p<(BNM`6yj)w zS&8tNx#Kyz7s`6ggaq?#k+$Bef1!Lc&KDb?uf+BvbcWF86|E&LiMSET>sNI5B|SfJ zb1z48Qgj!$y`DR=VWu5&r5S%J^=Mcul}trSb?&B7aX4JrmMWD5ZN}X*(Z=5`?%hg0Iz-sHI{2m020>^3z!V zlv;@(jY~%|JCfG@L(?5LTI{HBeND@M+Ny;rv|!2U0^Q=Cy5lsnF}9yOcTZGsNz4sc z#xyQ*s&Wo`wu((vUfEsWzujuQk|{s3Ed76_qo8ec6qN3;dq~H`X&BJJ9R)dW-px<6 zQl*~j?A^d#`3a6z&UdsUE7e7pS)G~HUF|rM3U3v?Z#8mFZ?Y+O+rS}$=d2oeNd27w z7yW5pFWKceZIxjE1p zX7cB$Qgm9#_mA%Nj?8IEpyd!KAgI?nj8lOomrM8xGb+dG+^qWeIon5La8tB$rPXfd zmY_~3nD~K-u^jX9R$njHI=!#ymDtNVZYD48h?}1;?TDKf7Ij_*a*=K75RV0laeNA) zhb$p9V{6OoR^!);v@3(Tfja#9N8-~~IiVtgop29J=3KXnu!^HE4Uw~6sDC}$>q}wi zuLE4mIWM^6%C-8^E-s$#_Dbb^G;cyjVwShQqt51)GmE$!aYx?P4*XEs!J6~ROZ)75 zmHxF*j}4@EgSMhNADy@CW&&!3hm{G`nlIi}hkDswFB>hFUwIMn}Db8arz7beh%Opz|XegF9M#PA&A0%Aa(GU z1K$_$B;ZLNr_V0nX)IEKr~VP%HI!k_08j0e0`Jc8gRuqpA%Ncmey|n4sFy{q33zKg zy?`e>dT&!Rfrm+%KLHQ-=)m6wej4DnfTy!`;wL$y(Mht;1K>OC13eRge;IfO2+6eKKLI@P zEe77Yzh40F13djH@GukukAF-KKImcx|Mx(W9ZT@x+9m!`s7&p>g-?f_q33kq$-j@{qrivs zB>sHhss1H=$WCTF6j=xSQ-FWKhx1$FuK}L)m+~xMpXK1@{9OS_V*Uc?+v_lf5lLq^pEJm?*k;spW20A z!}2fe!atMcFX_Uc4?OwP+rZO2pm7(&pVtCUes~yoxTP6S4p<4i60i~Yku2U70vdqF zKj!biV~8yN1O8SZNlzhUTK9`4HSrGw-kRS7c;X+`g?Kus2Yk$)NkEMjs0nf#G^7D7mK@SkP*cXi?a zj^+Qj3%?MHFZt(X;H~{r20Z!ax4>Kbryuat-=Dk4j{=_TBZCk$)iJ(WR{jX!t>wSO z$`1k3T7D7B|7;ij)hz$CF8n)zCw=AvZ*BkMz>_|D;H~w!!t!tH!v7=7f3OR`JA{yZ zJ_jEEI^v->@MNEhKw9e`3Owoaci^q{nG8JsF+#im#9E&PK$84{z+21D2cF~)2i{tK zIm;i_g?|gnKfVk9e&9);B;c*}IRiZYF?qmS>vJ1O(q}^#`4537ectRMU!t(&Z~Ls| z(0m*QJk9sBz~i#RAL0R!KKFpP)+Y^k(#IZ+TkBKI@(%#sntvP1AKr!k7|TDs3;!1^ ze^wX%hrk2HtipfR_Wu=l>hF5st?l2($HKq63%>$*;;-q#uLhp_dlGnS{igs={k;mj zb$@j%|1VwmSF-%BPEYdhX88kvx0Y{W`NwwQZ(;dUy72$Z@-OYeFUKH46{Z4sYx@iU zp8C5Tcx(HN0v=l=<{kz`1-v!C`#^@70{&3or?T=X4_^wr25=ehQC9dPz*GHGz;o*q@&6NeYVT{{sUPNb z3fJ5px5uV(1cyY);nRSJDLei+{C41JKgRuW_Dl%l&NRtKIeM0{Cs^z1`u{keAcB z5BEoYMt|Mmo4`NZ!eaiP_c(yEus=|Qc}z~{JJ6ioM-Md{MO)t zdFB^ROifEq%TB|OKTeLG5R()WA2n@Sl5bK}!o+F#anaPpnQ7Ubg!u8(5|gHm9XEFB z*hw*Ci7y~0H#;CGFfeKH0{Yp*)TFuTz(95qutDaU6UQdTB~6c-nlveD;@BiJYTDTN zu`!90r&`PEY{k<2M7+aeF@CfcZ>;Df*-#)TP-UYTv>x1TQy_-0iig@%Jj}L4bx#t* z%|yI;5v| zLT&42u~0YdSnTw>b}SaMT}Nfx2CANHpt5ZPRZlih*|veICmX12+d$Qm4OF&mpz6s6 z!OEmb(=bEl;#D?j_+i?)FGu6Ycwe@7YH(muQVM}dscAWLv*+vZo|`09Xi{2mQjjty zC^#obovjMWPD%?&GXJc2rp<8+wwTQJ7zEp%NWnc#q+pBTx{h_Q#bn*I6UKH)ZENxc zTTIkdVu-~-Y)cFYv`7pIvL!LZcE3V;>Q@LGAVO>gh!EQWBBZAP5fX0EF;rYjS5X1!l+)BDxz{8ihWziQh(2=A!};kHLHyr)qNS6Sv$c(ASc6mEOG!h0I8 zaJFCJHv1KBnZGKft@*1`+U$W!*+UOhN=pw^N?ScpDStOppZL+}9;cE@X>-P^ls(K? zmD1*trBYhP(`MjR1zJY6OW0BcTCCAcognkTsRC6t22K?i%u+*aQf>Duu%~_n+U{3i zPyMo;lBs%1$yByeGF4A0nJS3wZII3023dM*iJ_g@GZ#}4ylwwl`BI>Bv*{gk*|xF( zRZy3}lsGeiP0Tw6(u@jF1*v(NmXzH$DJCj$>@$<6&P*CVX7&`7$eK-n6s@sa9yK7Z0Xdy?K!3Fu#z{tYYT;^t9ahS!wX{c52xk~8P$E=|f) zCMAW1{0IBZrkwK^ee~=Bt9tyva7-5c!9l z1v}G)d1;9l$<)b`C;D6&5W@jbm=BA}m^k(1fxO5V>%3YQD zKh$7szHWYYS}Lmm3vun6+pxH;m4E)>mKN($k-XWS;`7sTsORPusaum5Jim}$%sFLo z+Tye)EzrSZc}rz(#^S7$ys#0;^cu?%^B3l*@vchcyoC$rWu|2%&mB2GA!Ff!w2|Y` zy%fC8b7T~pd};3dxj7^8;!CU3fsxY|F3z5tmNT+j1xNlnabP$b2LiJGlk>-F1T52) zjT{!>cSB_~cYzF7y49-@aWQfK(E9Y6jT14z;n5u{6(Izxyh_VpME*p9)v z6f3zP^6y2FC+l+NFb|ZCIAYPVOCYgW&UPgEqu%px1rl0fyNx8j)8_w7g&rdb=Zsz6 zvHM3``hO8go-jd2D8VY&^QopKd$CHHI*v8ttw_J$jz0O0UpQ_~4p!$J+wb^|?>q-h zN*p^Q5w8ZGYdHq>XUin4&sd={bK;Y10qeNASFCnPx`p!>K+hci1q(5ml2enY7dk6L{qAhGXDi~QRb{gy zbUw=xY-vd+v>iqb?Z#$d-APvWEIIti{yce9%U137kRnLgO{+nHJ+>MY)LlK!K(_6G zwS*(h+k)x`{a< zoRj=cXU;vk(HVWU=p2g9+0r?bnVd^&NQ|y5UPH%JuSxgp8YATJG-cRwu`!B?x?$&JL>K%pzhfM>W;ai?q=?&J0gO*n}~oPf3m%1h4~HL&Nt26oriz@GcsU4DtP=N@g;U4Du4=br0zSb!2r zTNVi7EMVD0+1Q7ecSkliB2UKrf9Dvc8_(*m=yS-AdhqH6(d7Ixi^6wa;^T3=nN!JtaCwFpllXElY=j7VnpIQzvo;V$6&qs5U zakQ6geul{UzY(ZzpV2WR@QXCLBd~*HM&SH}9&;H%@i^W2IYQr~ZNg7vJ;s+Y?)PQh zBbe$Fd>bD;BbIdyCF%b$`04v7qa2ximw-D8eu9ag;6tEa$Cod}pf>~F4?4j_CwMRD zGVq6j{w3f&pc71Vg5L$*9dIP*7Xa@7onWF9yd882TmKy3Eua%jbb>2Dj|7~7`b~h> zgHABf30@1j2JiyV&jMZrI>AIIxCHcAz`39|0xklbV4@Se9Q0%8557CK?=;{7&peF)e4SGG`7eObO=mft2x&rVE zpw|MP4m!a^CpZBg8doJs8n0n&>C2XV*iy!pj%;a%lE(QLeCLJg-$Y4%)55~dEKJ{# zCwfC4i{JdpgB^jZ@6+iw1RGhtgKW7QCF!$+g)3ROoGr`PvWP90v1KkwYLDItK>8%G za2yLqv#^?lgIIVN3;VKgKNfapVKH0&+M7AjO#W}j>=OX@OK;{qg2|o)-^VkKr1u?^ z)c#GBq|YT5e}OH}viMrai^Kd|F2eW%_c7!VO!5fc!SZiq%L=wEM@e$^s6PYzji_G+ z+%nWBnCcUpi4WkNyZ22Wyo<&LZkD?@b2U&Oz3-4s%EiAl|g;%lV zGPK)*ahNS&_UVDkMY{x(9SGLpL+z%s{4b)Uc4n~fB-FnG{$kWm1a1QA6HN699)}Or zAA^$WsZrv)a#=wv?2nT4cSniGRkIp;F-Pe6+5##39bZnX@5Q`FFv%nMDCh}**Mj~r z;6tDjOmu>GfbI!68}xSpZwH-Vq7%Ffbc&O4pjQIU2c3(X1m}WIaWW6|3cxzhxwuJi zCg|>aPc^1)YnV1kVPY;^c17%K^^-or{|UCxT9Kaxds> z0VjaY#Z7|aL8mx*5cJi6<3Q))Cc&|wQ=AL{eHCC0=v>?+I1=<=w*4}|YS0NL{Rs{R zo#N!js9yqD2|5=y3HAp)5%fmTivjzAPB7Ic*cWt)lUqP90;~X?i<<;{f==t$M$q+u z<)Cxx8o>g5$RF;zF-O|bkB8uUgfA!Fabw;inA#z@4Ii3cjVOt~9{dfUKL&pTa7OSG zO#B2NWBK-i?*jZ2-_7555V$?yBbfLIei!t5)RVd}`}PCg0Xo4%CwL=1BUg&|#M?He69>FhxEC7z+D1A!PGB;FR=V)S$-q<8$q{& z{FA^P13$sUPw-)qhkl9?m+Ju^Bzf%k5KQl2qIP$K&ky#^b7J=G1#Tz!2qrlMZvp)< z(>6HIi1*OMNQI}GjMx00B(qzBs$!DaZ6eU^cb^2_?27+2u(z{lmA1kc7t z0lqOTpWQpmzG&b^S@97Zj1SpAfGz#l(wi;iY$;(&Axi4!9U0~e`ZYkp?7NS^*(Sq$ zVf#t&HGF71uAn6TbKoa?Jw(5nfjbL+&VB^f;zN2IW6MJ*soqZ16GQHFw6hnuD%2yG z>_zZ;&?!z-x*~1@UJE)GHwZ4nhx8~yN%HbpIGcr2P~tliS+h}6`)bIexQlVwHvu^K zTSpuwSP44$uMYG$z<5!Ahd&eS2f9D>fsgGQ2Y3MJ1e3l5dxB2$3;wk)7O)(2ZoUyL z16>I^{CHn9U`Nmiruqa6Kxf$c8oEoVSk{4as6PhqL(tt>I>GIrQ{2aV z+9w5k2Xt;7Ah->5ii<6vM*_YMIu|DiZULRv9Y;52pB>;UpmXaG!Ofu4x+VY}KF(YK zom=M!ZUUX+swe1=5KtOH=i)5EwfN9D?LbN6v6U@1viMajT+Eis*)pFkv)M9}EmKjF zyl9l<2azls%)$XIJb*3xv3PeDc7(o^H#8vMmjNe)zFZzbFa<@D`wQM7M(x~3N$?#O zzQ)2=Soj=UHb^abrx0=ZEO7PG&b*W0WB5@251}M^H7H4b1&c3d%T;Vy%$8XH&G8`@ zCGn@Ar24a2cq$9Wvv4d6k740q(2M5fcIbt*ni&ASxOqyjH$J47oGsnhQo@!3loX#H zJ6qbnjgs2G&ca`^FuhBT^lM<@S{6QxlH~7a%MV!m7H8(jBfJ+T5%IhVxC&?HJ%VXo z5WET>YNwdxFJR$Z7EVWf>IdGru=?nmudyH7T4l(D_XVS zR#5Au(Gu41e$V6y2^M>Mf4}$r@6CsYnKS3inKNh3oH;Xjo+p4afj9aIg4Mv2U%)=3 zupIC*;EjHQ;1uA=FHrppfRlhX`U!#)fG58Y4*WU5^ME({34+JrqVWg-9mQXJL8nBS z59o~X7{Ll$WRFffy*=nD{we^yBg&+pH^yTGOL)3Q8$&z>SqnLo)!CThF@m+gQ~ZVf zUZEcE&3FvFF&-oME-tdCTS!UHOQ5fYy~^NMe?r*>&=XAdOK>sp&ESXqYvC!tM}a4p z@C1K@i|n!hDe>C_da_@+Emyb~WjjD`v}c010#Ekl1b%sdbAdP7AHi#Ik$fxpbU9Me zQ!-L&Cjlw76A3<^7>Dn`XAa7ygAc(Z7r|3``Usvrl;lFYnV=6xnUdt<`$2F3Pw&Ii z_X9n}SzAHxg)(>08{;m5U5Ow1xgGr+0Jtad15E7`+zl7WX$3lpfBe4S3Z*C$g3cHZ z5v;d{zlFXL%N5E1|O2)txKE*$@{2ywP6}JQ^2`Yba9U7XW(F;~MNslqkb_T$^4A z9)Jt%=J(_2ok8zGRq<7~3988F^$)HY8D#yZXXo)GOf0xkvK z==TWz4tNRrAqBo3@FCy{ruGRg0-pR}PvGkS7XWYciv;flp8TLM@RtDZ0p92r3Elxb z`9Yk$7Cr@>2fWcQ61)|7@`Dk;9|fEXywNWboC7@h!HK}10{kKHM!!h#N?bI4(MU<( zGx>BHUp|h9!}&CrPlNc>mroUZ>WP&236b_k+Kl(_5d0J=!H;?PHlJSS%dhb88Hpi2 zl3+hmj)pM z#PA!KhqTV$K-ncR{02WS2`us!fJpH2er z16T??!89KT#(tO0C%mJv&>OG?@W%N>Fb6!%AH1uvPyx8v$~2z{uD3GGr`x~}0{j$s z<9s5x7I>OJH-Ps7{0MmCd?L6Sc$z<2;ISv>?gDR|PXt#2PxI$4@ScEg0B@X61Xlo0 z^M~s91AGN|<9s5x9C(T=YJv9vd=7YHoI&t@D}%oCKu2)}-VIr}3uRkCXN)rl-iYf3 zjK^}GJ{j~BSBwVzQj{fv-WX>P9M985f{xC4a1K*A2W8ViXFT^IcpC60!Dl-7L<61- zJi#fIWaWjyJ)sxY&F^ zO8o3WPxg6;_H!tcg5GGa1X}=q6#NRnPXd?&o?vQ^;HQ=b`5yD>eWawPTS%#$3Z#9J zmRTacM?JiwvhV`RPFfpQ`7fX{`#U9mnT1D*{$!NiB)*MXJh)=H|rTQ26^eCTx!>4?Td7y z1>#o78}7mtZbjKT3&gE}sXqj-;ptcM^h-fc{wEUjYLq2|-sq1APUPvLL018~xuBbi zvPjSoOneER#?y@h9lbAaHRvXyY&7TyCOU$ZxTt@AJpBOB-vE9O=oKjQ06oD(Pq3V) zbKu)Q3OXm0$;{d(xLIW2`xGhZ;jRet6nyT3{sGEvi7-!jz66)!BE23JaodY{yNN}k z-=G}BKmT*2G)~+3GzqC3@Hp@#`_b-4|4=p>e2w-*a40Sucg+t%+6SpGQff!Rrvs1@ zUw0mM=3z%3w&GI`DfQ#2kUN|WfmZiGd?bY56LOysj88tnw}CH4zpl7)h1Gy>0Z%aD z39i6J_JQxq7{5}`(>%d?g$^jQ1|7lFAA;)z zhW2g?4F26hj((%;hQQ?C39i6JavniSau)IFUZf;%F6uvW!}y{8Hk9R{KEc!u!5Umt ze;(+jxr0CGQcyMrbOaL}!LxzCg0Y%|?<3~|o(??0geQ0!@JiUrjUuiv67Xc;2_`(j z<8YClf{~J3zMv<+s6l%{C{uvm=qCxLcbyZx94XODi5}yLcZnA|qD(^cygd_a0X+H5 z0`PMJ%mHuoqXajji1=tZ!}@m)boD5E#F^GVf~$GDBGA!#Ru8%|lzk35m$M2fWH9!^u+g*1%S5zPcT0D1aBn%fE|F}2Y4Ov=kWxmh+9yGSL3$%1%mOlB)v0JYLB!VQXEOp z*B}(W(mOS!aA6$2vZ7+5m6Fa;W>Je2yrk7UT*<=~JY3GhWjtKW!-sgdfQR?+a2^lm z^00=7vw2v}!znzRz{9aT9LdAecsPQG!+BWA!+t!h;9*Z5mh-R^58Lywgolx^{%%ET zh5qOAX%3%i_;d}QX7gz#pQ`zE8K0)`X%e3%@aa50jpfs5K8@tl>3lkkPbc$f1fP!K z({Mfw z5FL(qnVsP%RH_7w;}Z*#4_^&QNxn{iNj|s(3z84pdJA*;sGQ`Zaye2O7m|<4Nj@q! zmygP+T`D)q2avU!iMede2|290csH(q{k{dg)7K4`z!I_ws0P+x2v2#M`xGlsp8Ui+ zxF}CPww&mNI0JwX^lp4A_e0s2e7+n4&^zI&JQAIq0$Msd(qOVW^7%64qlqV!Q;WO} z<)N_hui+EWk=~MGj{JQ&Wa=#_<8FiZAAFwPTR#@`AY-4wX8Dg%Vl2n}ZOacc%cq;= z{{XR(ez(w+r!r%Cs2R;sGn$Xh%HKAlhmUQmJJGECnpyc_^ufsgbu&IqW;FEs4n~?H zGa47OJmRr7niezq;bt`V%*rpCm2>TH=xqP!)H6uq69s=RHhXv%ZzY=&za%a`de)@5 zW9A~C81oixV~k0B1~IX%m_5|g(er$NZl~i1g3aEJfJXlF!=^;^cOFmY49`e*@C+%B zF+A-Hb{#wcPmSQAUcBDv&DghR&54SeM(Po5f}{n&+oB#4$k=OHTT~>M*O#)nf@Pg{maLo|7)Iq@lKKdn%Dp0 z;b|HG_P}rZw}o)8goMnBNqI9SA!!zSTOq|1eTEDk?khKa6sD})kT?7vqEPty_{imc z{(i%}8BL`1-@37V*sv&npQxceL;U@Gh7BL;`=9zbGve!v7% zZn8VRYe0Q0fm~1z0r!yFvEbDB&pxwez4hjsW?Fle2h|S;Wj!_<#G|8+@$mrTW95c> z`Aw8t!NU`v690%tPPl+#H2P4u$UZy|<3r$o>dQ&+I0M;ZiILgITqd3e{}?#wBUCk6 zWg^y~?p=UBgA8)qg&h8X!PZO;{uy_^+Ozsd!X~&s0#T>ICcczwFNg85cLU9{a^#_I z9^#Nt1Z7lj?`T20-w&W#SS}YWGE`^(pXEXJAmQ=mZG&ywhr$6ov0((2zt7H}EI|52IX0KIZm857s=Z(<|W77sM&x zVg51imzjOgLot7{j|T8~5tTpw&pg_c@@!u`ym1}~9%X!Ao}w?CFYvF+As4v&M{>I@Z)oId~{5ajye-5U-9t7+Zd= zHejFSVGsL=1*!;#Ezjq{ylC9~sJCL`;^!=Qwl68XjXA?_Jo7Q@OZ>c9i&E#$UNCP~ zLJ|eK?QKjA9<*2U01xx=#1v}#(AXOo8Y~A>jKO=My9nf|9`SI*q16<^O%%|5DzvX- zcqHui^=NO1?G&9;abCEd_h|-S^Y)E&wO@;GG6|Giba->&Uxj|g5 zS6Xo007eB4%9Kz8k5i1t2~Y;tIWVku8xN}c4Y(7p{jKOwt#w+kR+~VQq=Z^RhW^0p zWE{4G19yN*z&)>3w}q8%BH6U1tcFRp2-I5Ln$Bcf*-G3qT95qB*@-S*t0ZU{dY*9JzoRrmgP>aQ1sskB>I zS#aH$DD*&(5}F#?s(V*|tXi$S|0_`hYjauKs=D;V_I;eI57uT+pjxS+oiKj0p{)q$ zfo!95tbL>;jJUMwrhdoIDcdi9S6VE1BC^;SX3_9lx<$jkOScxN!|cOcAbkjQ<%x8p z-V#y?nN%N-B6+yju9~gk-PS5=1zh({DWT` zD5Y`zt;G_0*~)0CjM^jFt6FGeSF>^&S;AT77+SpCLKNjKwtG}a&$X!P`bAoOPLc&{ zr>jyzk%Jzcyt!D}I)QtqSo?LYy2CB#)e!r&)aHSfV6AVk(2eA>UrQPmYFc%B%qX_E zScEC-N+W5Em0F+92A;un%Y##iyO4{u(u}VSRxS+{YdE>&3-Jld+*Vyyi)@SSXEqvp zw2_83ZYV_51{Yj+2y@BUnjqHd3wf9zr&YJ0MYdIddT+M~@jteO>@cRq2Km|OTdQtX z%S~v~a_ftjb)yxK-;cPd>VhT`FXL>7X4I{^QKV5d^)3{$V@@cD)?oLI%D|wAsIfM!8=L*+QQd=e-`VDi2uI?%$nYW0(oHwa4spMV{O>{jFcB@%5F^ zlIy(HA=jdk{>vbsZiBUIH%nRp1j;yroj-0Si61sw z;eU0r|+&GJ{L50EEElgtgE%bjKpEp>*rDi!~s>O^rf3)Ch;a8Sn;c-&% zIK_Ba{O%+;R$Tz>cSki}3%;@lb5gYG4mC%{9jn%$^uST>_}`gFpFl3Mw2zuC!c=uf znMQ-PM>cEHE!f&R0M`&)%Cf%+FoX2Fr~GoPV=n zwhU`l)z!<5vtcy_jQHlwhCew1}N&=1X)>(C8pD7bF4 z19=?kmtnSGuJn=RE)6|jBN<}*nKfqR<0cU-=V4Q@wm`(@iYQpSE%6;TSFo08FqhW$ zVDm+U`Es>Mww35FH_?14Z=#uUzKJaPOcTwQADU=3oou>UW5HJA<4t7KN1Mo|4>$c! zYwd|YjqPmZQY{;(){c=qYrzp$rDyecDVH0=i6IR zfqj@WPvJ}I zUt^ED4t-j67aAR5Bc5U1b8I(Y{2L{ju9^s}MheWH;>Kbb68I{>T!)U_H!ED zax>#@)<}2mI6&~s#`sEA-NXncwKlX})Zn?XRX48Db0c}s(T!?&Dz`8y3q@J0PQ_zJ zG?MRfWgHBvK@+V8+Hm+P>@;Bs*_AzW)p4BXsdAef*f1-%z6moj)x81@V~mDEB@bWaK!)H4L$Zq+*)gP}ZtD$YTyPkWQ=_2ZK(UnNC6#Mx9V>sDxg( zHP9%0)Ij;%2F`=5J*R??lnrDVBN}L&40JT67X}6 z4@6Hr?!_=p;8aoX!Bx~d$t&ue6``@JIw#hCO6cTzr&)qn!5+Z|PD7l9tVV0SV6(xe zHP%<)MgvuBcH9S1t-2@mL{nQ&ynh46k!#h})Enb%Roz^Qn)pcgWllxJ)*B;=)rX$%-}B(#TXm`R(5sf#Nb=D4 z+dMRfxhQo&sjyS*QtTIE>Q&mQ6z54)bs9!h4-Z^{agxOj0iP*M9}}5A*73bJ#6;os z23?2NE44D^`cW(vVKILX&D!vuY~|?1R*s}{XH6Ga-{5+RMDm&U=W36u&)3`Mjjv0N z__3}vVSHW61nK9dAjP zGXE*8SJgcg8vLgt^PeJ(UZ-m{Qs{NRW2dRqMnWGHGi)(N*xE6O8Auyktfj^fVOt@> z79+y8$kpq9YE{+g*}7z{Nez|mvC)X+j+#!fmY>VRggJWMDR32nuC!Hz|HrY*zllD% z9=By4&b?fv#f@kzCMTcfxK^-PuiI-T)h_VQ6Ik|v1OnSFsiEuQI>kD!C)qbMjvHHv zpEY=|ZI!|&>2)8pI^@1miTxn0oWoEL)+mT&dfA}YEpK()FfvT9TMD^U+C2$`H`s40 z>{nIi&Pp6Nq=d@BBfdi((|I1#7>{UHgS^)Gr(TnY$7ANBi3dgXdR=HM{a3X{;Qvdl zUH0g8fvxfmeUoE*-y{-o)Tgdn^*VRbiNcZbb8aPn^wa_0^Yd{$&U9=y7O1qJN3ru9 z7R_I*=L%j!ianLi#AH=zmtt>gigxYS>UA}Y_CDLO ze#fX%Ld$XX;u$spJgzhBRqR2@TTnX}S;+U8}gCDc2N=7U~W%qWiO z9W-4rUWfGp_&gcPi?CnS>k6^M*X#CS*ZUHzqCUbna>}|&reU%Vy>1)h@ew31nqa|p zF4R6n;(DEi;XYszJFwOT%rgmw(x}X49M9JXr{1g&#f}RriiFx-%-T(4GAzJp!<;+k z>x1&n*Vw-8u#I-$zpGW+alAC>e}N*5diy$S>mO$QpTJ7S>Gy}hziYQe7@~f%J!&Nw zQYnzW#M%kea|2a4vv4r$Wh1X+>g9`!mnZ5Nwd>AGdZWDv)_zY0cZarBS`Wr0xK22f zT2s{-_UPzoSZBlm=%>&#%+g)2<8Y#)*R^1esn<1PkBRx;qS7`hjhZI=eB8o$P7O;g zH}vw?7P6PSpt__o*S32Y>AQk)`WLX@weg@9&b8P;sz??13WQ`z+IR~)ci3VZAJW_moR3iYT1(f$@wJ?dJ8EAUB5xC6~U2j%tAG!CTHiSZ~C$O@}X<-hrox=uz2@=I>KvgVZKIzWwMeq^zvKmsw5k`z`yv(gX=7Y8f&WRmNG6hUxYb^ z86$S@f{`t=53UoL(Y?gz+RrTk=GH_e&v@3;G0mNF9kwa!`q7!4HRstF%GIub7s+GM zgTY1&V>+Bk<^##}x*^S+*TQmTojudFc(cLZ^=lSujQx-^YM16tn*OYBdR=!`;@B+P zEX9gw&mdcHqZ(G|xfoibybR~&7=MOu!ERQiRkmr3X8n^UvV&UMGiyB=Mu>gL`Fe{2 zhi#w2dvkJ}AkuBuIi0qOb1gTxgZf$%;!gX~v1{WrQ4+uxvA5RiE;JFpvrWo6&jHiO zI;lQSf2vdi3fn;-=ri7)3*&-K%GYh?LHj{l8`ZY7bD1|5Fn##CNLb=C6gNOVX`Zlab z;SBe3(;-+LtvOaz!GJh52G@Vt@XOyjbxWQuwz!%`Le#!JSQvK(rEC)8ym;h?dK@A zCLchjTOG&NdRp$ChQ*5o*O~xrn?!;$f>rrMDA?U&Q zItzn7+G1;!wszuQ#nztSyL|%buH)F+30x_*c5I~Bx^v^Rv9(gWBl6kUT2K30wkOc* z>Kl}Gp%XfatsgcJ$La=SY<;J}5L^G!K(V#5ZmP1Q*t)#I5L=(aZdO@0MoD90h^@sG zfoZ3*5<_gQtaIp)$3C9N=ZuGh)u7!@aGiwlaBt&bh^;qbpRd=gZ-~HuO#{W&A2j^8 zv2_yL>lyLfCvM!oYvB+8-5vBsCfebsKAtNj{Zb+Ez2Ahp~ zT_08^Z=f}@vj)C^)#{8jasa&ZG}Lln6m~cf=!}uGX^`Oz4*tJkTG#=kBBmd%K_2_l zx3bM82Vk#mWLE}1^%Of;%>R02-E23553|ip4OL>NrPtkOxI5U%!gI-~N5OTSc)zua z!7>(O3MUHOrQ5J_TG4o%t*6$@u>05RzOUyzZdK9B%hkT8w%$zf3;aLhd$3*=cC+5E zK!Vk)kd^F1OSZW-o0V~T?Eguwo!F;i9T6F(r(4$u47_{i_vywa5Ju2(m8BaTmfqR%8`xc`G z`+s$qU2co+QmYIrXp8Ow_PQ;)v#p-^UxpoTi|+eYTK{}5%5tUKG_X8ZjxBC<>YYUdtJ;cfhMfm(ofrf<~>>u4C;%JM7%Y7)!V4-fER-l-h`P(#&8SUT+m^ zCa~D5MK_t1OlY;)Y^`b0jb+g2Rx8x>W*VbNPN^Ne5Pf1Zt_Ayl(z;)(4QPDL$_L~A z0Fu-ed+ZjSC!^|%I~kN(O`8m)(_ReY)S3ZI3d0C-+8{vBIh;A%3RQX; z%5Gr~*`oUyR1SO$(b_7qqC5O>6u~`{$1QMFF5>9^9N_*E21(n8?zwv2XF+1zTXFGR z+@h)Y5w+;&+%rC&5e3kV+4xcF5Zs9rz|oCa|DoDAkhHIq95rw8f2svR@Y`AK+QR#I z-+C)1k$zxo!Qv!t{(|^8`~WbA-#wchlSn_n6}n(CUc(!}&0Fvmfn#ElW99|Sk6E+` zcPcS)`FsHG<)V8a133B>y2%U1#3jdYQS)%4ITr_>|G7R#zwpN4XVqBWIQnHU#%dJ( za144kDGt9Sj@vmEL=%!2!+wp8upi<%kZdw4x-e--GeHG6o zjGq%iH)#d{d^w)pbR11xj-p>AgC;r>m;Xhy2>h^4TuQ*4xOvb^a4K&=F^P!_690=) zGLDup<)E%N-yR@6rEFFuMN@R?Hmjj(zxHxJa z^-lF>5}5*&!Hde_cc|MB9>-gu>0WhEPc~R)TNwlmMdd3SLPm_+#vj7ZT(j>HRGC#vj)a{;N2>7243YQR- zh_*1ki=LGsZczm0W89koOqis$_7f6glH(REUSyKU#3O+Ft2?|?jbh>!?m75T!O4kH z@r$A`Xba*4xFw1Bc`2suc7`6nMaRs8d?6hg>YuE^K-^9@&l*gO;pYb1M)oFe ze!z7e*Ckv}aW&u)dfTrRkV;tIw!2G?R-`MAEv^%JfexE|vA1D76`A8yD@#I+e$ zF|O0NF5$X~>)*KO!RD^GJa7%iH5%6hT+?wa!nG3Deq85qwc@gVf#b&GO2UN~wD!7oS z`1l1$a!g2heB8X}x5oXQd;SCb{Qe%@kRd~jEiYUglb9-pAw9QkSi~SX*#o*x&Q>0` zNKP_G$qhfgHb~BV_kYRI;6?uL@M`T~8`JAYwpkOuv^<~2y(aj*Wa!N?cH%a^d<2$f@q5e)Ga4deY6%~JoK?bsChY0|j( zw=m|n_@lrtNkXIhM6&w(*ZH_B_2FfJaPlb)gfpGX+TCjEaCTJghXsPb0|`Ac)* ztN*2o`5#&gIWz#tV*~t#r%a4>1UL8_w?G8%0*ps`*oWYs0ehOk76aJ3658-yfX(q! z0Ml~@^kMt}ziI#(tOXom2K(Yc6Z87B0Ee65_W;Jy#y-Ta9B`l+EXBhKerE8?fX(q~ zfTx<_D*%r-gFOebcf7C?;y(s3{@UQB0L$BVa$=YMPAy;5U2G- zp56~k@fzjBdm`ooxdneAVQobM_w0wx2yPX3x1n;9%d--Ekp_np-x`Jj3>!CFs_@vb zao0}W)%V6;{(5}Vp~rVd4h$7|lZ0UQC9Ze{_6yp z(!Q3G9Ra&<T4Wi8Q&Q$4d5=82QbvV1jJOZJGD$g>jV zS-$eDq=Kv@vx0@DwdlXMt5BcMil+u4e@D z8&xjXi=FSfIbR1W&h?g?%Z)VGGb-2XdCnDXF4qNl;?zA^iJaAv6p|!Wl9lY4<*UwG z5-whnmzAi=^7Rxahi4_nik75^m&A&IO;Cu{30X^GGm;X-i*h@bztrVczU`HK*XsgT zlAm?NOmeC&S|SlI`K#*p-CQn|xSUCIzOL*Ifp0~*q9c|0w%6U9s|7CHB8fN|UFIYt zIeH-xr>L`%60#QkNtv@=S0xCkY2?ZK{+S< zcAN+T&sZdX-KtZHjzHI=fb5i)JL)xBa_O}UI4Q5G^H zN2EA(A`p_4h4>YPKu8E2a7Z*FCnKmxU_X83cNfk#7n?Z^ns zJrUHg{Eus8^YdhXl*?+F{L~RM$yxP7A%2Jcs=C6iCPDT%LUy;@su2R$%ATMjoZb9# zS(VbRn#&FGD?pb;N|IcFUicM@f*{h?KP&Tz(ymG&dx-AK?f$K_yQh#nttAcIj;y(?L{W)famWbn*9ek9tC8K|>@g791lc{M-F(!thZ^m) z5wa)TUX@>2NMOYYmm-y4K}k=|iJ)Rpuf1s)oxnrL2u9?Ej3~#kdn{1cvFH zKzSttQa;?N%dHZZ>uQ%XZqDZn z4p#1Rqr~}s$MXMwU-y5(*WL0Ya~jDd{D1$({PX|!Z~xEzTXtXka zWF$srCB=%>kP{K0(|?En^KC(JBi|M-w6w&TW04y?-Z{9_=Z0GeSqTVTShR_#CIJzS z$rV#`k*=4joNq8EkFW|p|F3-GQglHrPC>xwM=?@+Zuiq%OQW2BVyd{6#?}!mDEYQ0 z^IgxCI8z*pwp6{(2#Q5&tPYy2MV{iNSRm9{OF4vUkm0VI%PD~z5#Ze_3=?$DTG_%nYAQ=GE0?NOJl_g5mKgz6FsTq9fWGRA~oW9 ztV#+#<&+IPBY;a1vDx;A30{dU@a zt&(%x3Tz;~-NUWr(JL(0d+f->zdM=v8b^mQ>(>)z6c!bCz4=RQ8Ko?HQ$g?}hNpPuzB$=uw_fS)67uEn%b2 z%Q=dM)*tOJS4msb!!M7_N1Ikx)QYWr#&+&IM&BBG;mP=LzXUl}Vvn|x!P!17U9ic_ zRytG{kGkYIq4aL+_`731tn_Nl+#(XY`hj~1cAuWkxyr5%#ielul5rYIYZw3Zef-WI zmtV@X;JQnS{SBCK%h1-$)sPi0zvFtw8~XCf0C{8g&@K8-ws`%BT=v4KNuizAx7ygq zN4QK-9(RI@5`h|=>?FBMn;#wv#vPRjH-HBw;Z?v1k-b?lBz!Tz-atR$}t za+13=%vPtY>CD~DSned`)FQEGS&X6bdj)>!TDwe-(6XWaogMJj7Pnn_IC~JdPxhE3 zEnn+6L^;a4gc~@@Ms&ratF(N5=n&DMihhR640pgTX)}7>LoR)}k`hF@c-x%$! zoUyKqdv}zJ$g$sgX?bqY5M|7|AGnWCJBxDqeI+g5vR9#;pIFKrJ8dI!d||k>d~2q+ za`FB$?&fI+QO*l9q~+UoD3tGdpWs?f_ZB&NejqK+bM#iO*#AA}a>iAZ)+=w%3%Q-kiaTqnarzo`lLaAn_*R)6orkJox>ZkljtEl7__w2(}PwFgHZ;yD{ zFF_slud3oS(d4-nd6L~S`_Ex)lQ-PH@=sCT)Xrb{3nM&F^#6yrdP)yjgrBl-E~lQ; zwTiR+e9Fp6Vp;i@-dndT(-ON@Ia*#H7RE(!s4p~8VM+vC}~<4`L6*zr)EwO z@2PMSD1TV3mU4Yx6mro;d#!fwdChH{3r1zzhN>$9&hbm>zUhaz$Hj2!b6uyrc=EH} zV&%oJ-8nzywbcc4yUu^Hr2m7dD<}0hdhwutIwUP!>t{XOK4Rq*u}pJ#qLW`jydZ)x8B9*io_!&XejW*Pf(0#oZ_Dc>h-`Gs6;33w1nR=_B%X8z=JG z7aAIOHz?G{Ei>~&Q8xkSm!Nc-@7#y;yu;5jW{Xs1WapR1fd(&j0nMjV45IFz@&z2i zhbt7Aq5^Grw^2?}9v@_`nY!Wbl{EOey#Wc8+-9$gG)Q|7(hfLVpoO%f2LE$C^DnI# z-*?U#S?s>OewAmU`zK*P2sYuJDt>uur*{jfNE3ZA^@AO`p-(E6Tii$IHn-Y!dnH28 zy`O!%`_?(iekbG9-*3qF{9tQVcE3zbb59pBUP_E9tk^PY_yXyU{@XK8x3)$uw76$i zknO4OA1uwt&Mx^Pdrt5Vf{&tzgvft|JG^c+ODwa$h$)<)UeoP1x@IMb^OrgM!7c)wb|kIgJ1>&R)&ss@pl z`|3{)xq7%;edWI8^zn-em0sj3>fH;m4tenlr(tEq>Q3QKMp8;vYO!dz8h;tK%OYgh zOE1MnowHl25GUq|7sqt4aa%2%ud`=BXQQ2HA|kAh=aWP6{$Ge3KyqL>uhzr)}|=J`jFCQUaie>g$&0E zI2U-FAe(2FKaNus95LX)1?MjX?v3qaSg6P{a6_ck_443mVgF3wz)WE;wOQ{pI0*{z z+pC1kmaltSPS3OSMMqM^3nQ`?)~`U=nt(G$#D54nBQqA}iV?lhpAv=yUARL`2?HV|{d&O3F6n0PLb~q3Ewbtg52FDpPEjxaC zaSxiFD6xE9V(H77sSby#2s-n!y3Qx&*7-`Cd~@as*&}<|6NMdEK{NB@cJ~rwe-z8A z=pAMD+dG%u zP3nE&-@45+;Uezq!g#?1IlH=ka8 zI%Cs6&px?Y`&+-=H8lqV&+WT#HgQk0?clRDHQMH`nZ8*IhWn2lfBa@t^5U5rL+&j| zd2QT}cE7|QX+A$^)4hGZ0;LcU310YsnNE_B$2-%T(iA>^kB&2eEG{Qn~K=pSQZZ0V{s~-Dl zVCGAv>W;m;_ms+WOx0gL5>jhcJtpz968m6N>-9SVGe?@L=e*dxm$aW*^_fRPxDBS( z2QE5Xl3-T7Y*%1rgsHk?z}uWyL@&ys?iS0k-~EY`S#ff76fif_VV)X@N9wy0sa4wO zl~hK3_IP!Zv-Cw%tDYYp39&b8wciR&N#4j&N~6lApV=--Td^*m)tAfTRF>J)n&(%= zk@iIV%|k8v8y=Ss+?{J}=N>lBrL3x0S?Lg|vFK z5e&GP7no^A;IT`PXr1BQ7hjJFAb5dj;^pG)qLQ|;s1T&hP1so)`HD&F@x!WRf+_2w z5cc7(LU8fzgv}+DW)?ivw_4_AMvy;0;mgtlGY)zXsM-kRx>Ad58t&?Mse2<#-FsRJ z=}(wR?|lc-Pce1R=S<1JtWUU_`hV#j`ajh~kn|%6M7>P}i8bJ0Mo{!q$vrEPwTZyt zHxLAvI6VEi5@6oU12U<)sbt`(EFwt7%V(M1nsFLj> z!AjF44do~4U}F7-iFM9Lr8})eolLCL$L9xTnz6pJz4V?{h?&maC!y`vOl>=UF5GV; zdePMO=qYI1t*z|}LCfdrr={hiO&;XJl!9ud#%waS44D3vqJDydgrBYQEnSa<FmCuPf4JhqSROEVf183YoWfA~qi zG7*Glfncr~fs0LIgiT2Qu_AkZc8z{Z;J+gO!*yy}9B2T)KM;8_O&M}Jg4(3jW8CY? zQ&HJFJ>)dIXnhzwa9Wc5N(B8DJU(zc`@8K+aEk2T$-?MAX4%|ys~GK#oj(>Si*x(R z=;ikng3|{%tBhLNY38Ykb@X)Q>?nyD>wrOEU14G^_v^kd(J9)*y8JV+zR|`yP@dRb zv&bp7eFzj2%60Zmb>g*;*?~@;T#CmuNqAuP=1IAlFbNeK#*xhpmiBE#Od)1COzmu zkZnfb>}`m}5d0lQ}jnJ#;Io za;Iq&i$)}6MGP{H;_Y`1&53d{Bk+7FDJ#;9;LNf^_oHgf2$q2$!HgjBUFCzQdNVty zdI@&$$Yck3@ATHZ;S^yq=&0CEbQOme>dhR{E&#LO$4 z9~gBp%|6WJIVWyXhRs&)HhIp%S25Vx6HK1-Nng!6r%PsHG?5r@nu(FQ>Y<0#;?btT zJ`uV^^4K`oB{I){cJk=E5(Gx~=6HtW>|v7gNX+fmSEYSya&L!+UUVt_*5uw^j}ykN z%KzBp-p>1=BN1jDxwPfb%-IRMO%o$;Y*H3C*f=o?zV%2~Vz?gn?IEXtGOx=EdCQzm z_3tF(opSjHUDi8E>(^UII5I{!<@23h(sWX7Tj$1{Fa~*ZV4--MeB@~j@Nk-nr#q}d z_w-hL`o}24q8{6_>S4E)lTC{7NdNv1hZBK)1wyiVcma{RTRT)yVKEv0pX+{Ygq2j((JreIzTxpS&^e zO#u^HPDRD`r&riajRcJ$cHkn%rMs;g)V<;jP7p~1^ihPa`*r&&v_&6Yp4RD;7a91l z(qj8nyKH7sTR3lHAGB3FWAfs5ZGCp~{l|m2$N)~xk(%UA?yFKS-nFF3%JhNz2zLx0 zT#UQ*%xR7-75vtoX4c@n2RUIeRijU2_T+zC4sN#O__drOBW+WtEqph?KA?F#H~I^Kh1x_@6aB%iVQPj(Yj|U``^CLcR!aojW$a&= z21@KlEwFvip62krwN|n1Xlj;!Fu=DRpTYvc2krFZ;p)5P8uWvqVvHlRb55O_(o4zi zswBm8(zVKK*(-kL)B@1Z=e~!N`}akiWrqda3CPSokmozw_~B}H^CmCz;X@a1T5@B= zoQ0BTEJAh+8~*HgeR)J>b5OvESWEaR&{2xe#?%bwL=m?V@hAJFyIqpFo?ifCLi@Zu zriMTM5qu(XnI>t@r?P0 z%QR;d4iZ85i13j=OQ!$%YW<@#7utOa&*Mh@Bgt{(AOy< z#nL$pOFRLAU zJWyl|^;0_vCPwcO*7L})&5#YT{i%}Ap0K?o@6OY9jjZCcXf4W_ujYIbH^(py^l?6! z=3>Zx>Wn*O+OmS)hAgV3nX&>8LurUzos!RQ6J1w2h-su}D9LDpNp33917yy;8p){l4+;l#B zqF?-WK8tFlMgr-XO5Si@s?HcfR@wRI$+ra|F1yv%3%MNGq4gfMOu3rt z?|o&6>~0>P?QFB3von+~l;OnIkXr7_;FTi&;Fu zsN76rcJ!XiSibbtLz!`u&7PlL%l$m{uHc*ETcUZZz86=_7C9DtKh-lbF!KB4b&J$r z_It$rY%l!A&2wHzY{kmRLfiZ|dkN3@W^S0DJ^W|;O@eRSMvLb8$B8Q@$_sWzM!qU2 z*_fU_(9-G+YuPuB@_GHIRZOfb*jX9%s^H|t^!Eo^I=x}-^Nr)YdHpMaDBM~3=Bt9T zjp>?!mhNv@hkxUkGq1njwTYVjJJm6-s?Kf{<_@&T%xStUzsjSJG^4KRKmqLJ&;&%xSa`|F* z<|)0_;}O3h=yJ>H(q`+KDBXc^22jgKHm-+Z1>CE{p0S) zYre_47Uvz?oV@<>)2BbX%*lB0WWTe;rsGvH{v+(RpS}F+qSs{GcmI5E$;bN^7BBzg ztGIwIuYI%W+L7ecm+U?{dt&(Ey>D;&^-1mFy}gd#eCoYzAD{H;@~RIP;+5u8R+L#8 zRN){}bj}R^MLy!-%4>1j4i4~B-#Rqor_Cqgl4s0x{qA&(%V!nah22({myQ$ZBj4c8 z-j=)}!MFae?}#hzy=I!H^NwGCQUs25{qE*npAjv|S=auR`kHJ5lX-#dfrl|4`){3d z_1?XzkEZ{$_Wi}XBtxX`b33n0*c0bc!@1A4?-eKPnHKTFh*`UC-rb#ACj0T%BL*V& zRoklQM(h@NW*kzJ5Qh|->fkUk_tz+N|EHRPX!IO$FZ$0kC&F7==qh1o#3m4y<* zy;mn7*0CC~-s=c)W;7uN3?;<=M;`n0*M57e+opS0eO$&ayZZg3{qcR=+|`{HZs`^! zi4)=un%JHNzx?|4mJjD_{4M62eKWTGc;Z)W?btyNuitA3S~lq6sRhH2t=auB{D%Qu zO6|X#MI*zvRLoZYAMem9zz z?dLz9O|+k`U%Bbt)1d5a@tagnhi8BM&8C_kB%Gzn-EHNZ)vK~AtViX$Pum(fA$ZBL z@K+pdS4JId8Y@13Hc1nB-s*#2;uE)QTmJ2dc@gi<+?Y|R9e&hn_pe=T@5eNDU?~l| zn;JKMbygdDZ2I7bj<)IL_d6nj^=~?U?a}_}-QPd|H;4{=@40HFpy}Q3cGbkrxi)hS zuO6Bs2A%EyaHFU9;L9IZCBJsCj2olm!ZY1#Qisg6JFxhD`MQ2%!e5S9|7E{Sx07?+ zw_8t}wxe_QkzeAzL=Pfn$}kIu54$<&$C@hN>936UU7MNVv}Z-Ougc>qLHY_OpTZxa zmAM~Uot)q}B12x}zwF!7aZ4M2lO6a16LG+MC(b4=U0$Dj`Q8HGZ@sQoCA?$hFl6Dl zq4F-beTr|74$TR>5E9yDrEfu({-HZ2TD)BDI75_rxaFHo9eo!z^5)fp%VunR<>9@h zukC(Ylf1hIX48_h`^UJ07hK{uEv{31JM*W)6N?&)#_Znp^F99&H&#B}W8JfpYRA=? zLuX`$1=|R^RgCGCzt%qV1OK{d;Ylz55cyKrrqhd)8*0A$?%u=wL9Y+KdN#Q3oulI% z7SBfVQ;pN)Ut|0wgIG6QCuglc@znd8W#Y=8W4cuj9RJDXc$bXS%`bJ(<(Y3SKTFDf z}vZHa(8?sUSr{u{*9-X^hCVwBiZV!XSG3P%^Ndd z(1z~-efPXH_^c{{IljyH4%^(79y}{QbadXhJE|K0vX)&LrFs4{wk3ZuBhM``=#xp^ zXRL^-_-*-R)$dDR+a})pOJaGw@oPq_f0_DlBxp(6HtkdY->i22Do4B48TXS?ufLm| zw(?Q!vT?JL91WKJ{ll14*XZSERd)`4v~}0+Umh!ZP5xxlJ^3O2+sYf3)<;e}3K}tD zTgIhD_VBdtUyJcxaWTm0_@6!6jBT?nC;3dC>AU;)fJIxz4nDi0VRz8GJwwEd%B_FTJOF8ECW5&4!{vG@O8QZ>9UP$;>ntt}|eV=WXOR*Xh zePlV{?7ap48zu~O`t_he8+xyzhiYifRX&e@hx zR+BpI+@SS~?acJ-v)njkRDWO{NI&~a?f$LXmZWX1O5SWP^x?-Ptk-fjK~#@@dUae= zeC%dk(;MFnItyDkJad=NYVnDJpJ6cfV*<)Pp7R_j^A7e(dhhJj7=O>1m;*&&^Yg7= z$f}9c^>BQSe^cpvTx{KUpTEEV=%Za3x5%cF+ljm->$ezh!z`Km>6N2ncEc+#dTnOW zrkhE$SYGV40Rm0g_R=S3wcdwg2Y*`=&{mK*_sERpS8I-JU`wC-N`5i8y=U0q%b#hV zHca2R>GYMPZ-aJc{hZ)(e!`bBh;|4!Gli2XazE1-htqnbYkdT-= z(|j7ZMsGa+bH{7IQ8v@O%HP=b((apH5w8t;@9ZC44WqU5=9B$fW#;Qenb&&yP_y??D1VS)rJXB<6ksr&h8%qmXJCw|EAsQ8h>JO zLh7|`%dh_0*1aGvyMt$+?q9a=)1c8-i~an^AoAhYn@8w!)){6kS2x_#9-MwKI&Wvc zU!S?nDr)QHF>4Qag@(RUWV^B>@A4#1v3YtwHdW3EkKLl;<9`g+*r5}BGDtJ@ z#-Ibr1r$VHc8d`uZl1BL!*vG!stBaK6@{MR=TBKo^5&V(nGG}Ku<1EzY#Pi-Bl8>g z{$weufxA4k@{b3NfB)fAZ9CsFcSq&l(VX|n%a6Q!Ko5rYFJ6o>4>LMw_@5iy_K8=q z8_y=5ay=l33g~GsUUND}aB3b~s0D9&ug+AZdUO)6>X*LWv&MPNwR;82>WvX}dsk-% z+)*|=pS*fyl{PX<}2JGE`Y3_^rj%XjeSWxQlw%7hM-VeQs zE=_!U;5XM3AAWi0?iQOtTdU8+4g2Z!MZXQJn7w|!@AbI{e)GMNczOQtTT7q(HoP*u zOT6Fh)k7cq-CZ{+-v9oVMUVZfx37;6c<}jw#{rM_UycuaeB{aFz}nI-3xeE-;{dD> zH_L3qiPlhw+WBOa^BhOPi0lx*%oA&Z)#B6?+_1G!ipRfx!*f?^*-&Y)YiWrKZZMyt zuw-Nzz1V$VBk;)Gxs)}y6aO7N6d0bBfLrntM9C?1gHexjon^Q=sY+oNudusQE31u= z4YfZ>PxbvD_TB|9s_SYSKf??-;)tW7qM{CnhA85|a2YQ#!$rkQkf=?JCSkZKC;|c+ zlNiHIq~3zYT53!J##l{k3dUMYZ3G@LtI0?L78$)vQg$n^idCCcoh5 ze<6j3+Yq)no#OR=WgOnLn}ip?@c;TI>&`f9g%+=iO+=-)N~W}Fr_?qX-p<;Xw`gO2 zUMb!r!0Ek0ykJ_rap;)^{XUoY+8JID{1~sbnS8FI6{cXk|HPLg&j$G8?a~YFJo5jk zX5>=8`>l9;Zx7xxO9~PVv2VnSq-(40pL?USA1yF)xqPTUfbUeT*YH$+OTdV0DP9XV zlv-PwrqssW1B2W;G4)E^lnRhdTi){C_;}UE$Dj{hnGNohUse3@$2d2JH~f-t{A+aM z*%-X#IRq!}FG7K`m?$0#!y&mGygX<2$&rtOiQ{N8=T}KSH_bkOkow)I^!ZCWBxrxj zV}j`1#=dyjtLqJnOGBU=Uy{Jl{*)OIvn zenSIhHdo%C?YCMZJ!yXY(cx?NoDEueEq-P0n%?=*A*TH3-n}PIG_6d@Uy+e7|Ne^n z%|pl6t5x5Ko}W>;IzQ(D{#Mz%)a4oS&qqy&Gd+M`L&9$osado5xkS?}d@u1^au-la zZjR%Nh#}&`k)0n~48ga-S7)c>hvekqgWM_U_#Sb7R-U?|nJM|HtST-yJKG^joh$zs zj48?SD>?Y>n8(uaQ)I~nSx;oF%*sjTce`aGX;z#`{`s_+yu9oT6F)R*TH|PxDa;&d z4h=H}r)8()ESrEY;D&*YhzgCkJ9lMHR$i{-*CQZyLDotZj++=ae!OX6Y)lM(e?Z@` zWs6B#5ndwgYu0PpB-MXef&#(<`ndK z<)tT|9iKM7&vWBPKRfQFSD!6--8=2o@hiNaT{8aJ;bW@9Q`25wQIPfI=vULm7lftt zneyCl&x42hymMshoDEyweeK;bTMxBt&DmM4J&3i6FU0rp&c~Z7MZKO_lvjmUe48-a zCbc$|eBytqrZ3)R#3;s#%^mXGlHS7u1_t$ewaBljV!~_hsV>D!yVlAk4frW0{5})X zfx5XNd=|l{D7xzQ2eq@;M-~~jNIRwbYx@S+hnJj)D)Y+l(^P-&XrwuNMP=)xB?~TU zcAj~E=VMacaEZJL=Q&h;-1^o}w6ZLaSfJlS0Fvd@HYvxa#7@ikSWzOn%jG{oeO=!yIGM8oO~W zQRP6{M-CeJaGrgpVN*2xy;b$UG|&)j7~$6vZiqLhCdCKny)t7aH-*H+EX}iT@$;LnFNt|_ zZPlvA;t^rNdyTr%I@|L_g`YO~h1vFl`kTHq(9~+L56HvWG#Q{hvgr9#QFrRev}nDz*U%iJ zN9wMaStX9%t9WMW0d2_%2R~(3%tIdG8?>eEG>Ca04Dxk{HlV(}VVj@t{rZx|MF-~D zUg@;sx{8uf5xNI^ovLUIK<8fB7;Grc>oRQ7i$zx`Cy8?Y8N4CLJbX#sh7@7T!1apK zn{Uoq+Iv^=u(%06KTB%!NZM?hpg)qJwByQ;eZ%z?8Y{--lJdrDM-B0xtQ_jo^kKN^ zM?cRq}R}XM~QG z20VRkBi_Nri*S!OZ(Q$~!(1oiIqY5LS%!y^*||B(Qt<?@4F5B;v$#9@=)6hMdpQV^e!}FqaOHo|fIY&B`7nfAj7*cA~jrQ^yRARq2{OiMW zPKGp^Q*E3|zYJ>`U^pVf@`}Wqu6X-RU7&T$EQ0RxSHKx>p4GlcnMCO z`TG0m=3vAXbHtf87>yyyGE(FpYkRvmEZb%}AvsjgEZ%ZoktR(3U6Li`>}{Ig3;ke3 zhXj|H&xQNNVEyJ_ib;|_LaMB}e1}h0-SMDyQ;mm4)7bAc7v9QOW2?1CeRpLqsOgpD z!NoSdF-o^#rG7+U>WU5Dw{4YL$9*^~{AlEs1bNjxEU&uKd9J#}@~T_SRd;qK7vo_v zyMk=gW$FL4)Y2T>5`UwYdGt$pA9gNJtM z6{H*DuPo7hT6JE4wZg(GEteu zWfhUSEUcV!(cLNAC!fH8@UolV$unq*8;fJE7K%kw6YCW#*4MPU$(o=2wsZZ`c*WU1 zBg`LbZDYmSxhADI>JwL;N4w19upaz8>G>#q&P%nA^}^EDP-`<9E~l<8v;S@Q8%JjS z==ZtT+V=Z2_w_OChMvRXJz~ldlJ*(YYv%STn%|+$zJbN2`9UEiUU900r{j6ZX)Vg> zSbDBV|CL=@^Q(ZqpDtZl-nT;X^+Hx#Lrx~MK3|Hgl)j&P`68>jAG6L$xt}oWhFx+j zK=zQ+y$qpyYn!~{O$Rh0^Lm|%@b)UHs5!15Vb+Y&V;<;m z=NtUTCN#UhzC^QlPrr!Nq(vsZ*ON6^BV+f zE$P^HcjoK5w>u$KjUk$F+$K;uvv^t_E$;Yde$kg+aa(i^A&ud==938=@q;1Y(Hq;s z=F}P%p44yGpRR~WK}Ap?7kP2)51i$IRQ6q6)P z!atR@57QlU&|dL-y>#sL$Uls*4P1HO<9My>!=j|-cRW4+rt_YIA^DXuBx9cRk5!EV z^K**Ja3Z_xQhAD|bfqnCcc0*^Fbmd>HqUdqBSphrH^e5j1}k@4)9BwA*@N_524`Ea z*agj2CPuS9Ue_etnCTxHU)O29PC9=7Xi0g1zI1{%1@;O=+bYn=-6q^do`Ef@VU+mY zKhLOwA#5;Q%~{8+lf#TUYHj&S*5=sx~w?pgYFtCfnzv{5opTI%!NTyT&&= zPJgbv=y2bdn4vSIii)2M8oM}SN$IAuvdbwie!(?d{Fcj$pNWfK^(M#S=d||Wr5SZIp4ICWgo#|-Hkts4ek&o{>QyW*J7m64#?(OYw@b46+% zt1IhT-V(;>GHgFp)+f!@gt$DfA#iTBFL}h6*Y^2U|I+p#?s4 z6@U7ph;#oeKfUbMh7;`#)diEy`(uKP@jC7F$!hoLNTTgeh4#6n38o5z*XE)|qsp&M zy$b^HqcvP!+PNrc3}-)C#+Ap1E6)kr$|PpJ&qXQ5@cw=uWZC4bQ$;J!FzdWs^4SYV z`xNGK<&Z-Ilazbz8>NrLr)&g#c+nJX?i?)Ab6>KXDvWP$uGI`YS*)xYbyHfz!t&PV zwg~x_t>ZvH&Re#;dK}*tCYGu%CVx;-d_R_t;~V~bwKz(wJB?F*9})wIya+W;S*A#C zoRX!iN1E>I(Mg~1IYnHLQuJ8W9P825&h@D7<6dGt;{A3>c@x&71WX@4EH@EYHS#cP zuF(Yxhs&@NOUADOSO9<(fIo?s_}u(W$%SaS5IH>3Vpq=6@Seu zsnsz7QD2HlysIz#4bBD3!OXpmtr6y;SwAERH`NokjUL#%yZ2E|W7QA)c!zpcdtG`D z<1mj7dw7YjY+?K}Gc3vzivrgzECtY~lxxChc}?I1$6tyGCp7Wzfx3nA+zJ8@bIW_L z!5h=7t@`SNTJNVLt7V^K_THNhY8}&Uk4M>OzTf!3`>6i}M@-(sF@i;h@5>lv>z$1y z(dhZ1(f4S;Axyg;SQbZm*q4;PbF}=2E4M~`IBZ2wwoYvP)^obuHVaK#M@u)}qnGvk z5zJ)hW9c95A^Rd%_3%Z^0~<$UUw-2GF3;Zle0yuxo}fC>e4*BB5Vu@0wsXZXwVl)O zL~l*wS=x#7b=u{iV)F%Kl?Fh4ob99H80%``OvF58SFhZa&)XgQq{{H3o&8H=Vg2B( zt-V#7yrTn+iCnWcVWF-a^-=%YEhBcqM|EuXR!vcs>9;=fe_i+6yrz+IrGEIpMxH&% z+UYPJDK*D;_O5hwYpMUf zGang-8yo!%4HvB~#h+Hci>%fY$kL8DlsExdF@IuKo954ZSn3F~N=F1VM>hCe$lew=@?_$~>}{nZo40+Ky{&0v%bBYvS{!0% z_{4fm^VtDPy?R0da8%ow3(WeASvQM6D{6A+f>NU{Y-6bylp52uJ1#3p(Z)XHWiRlL zk9q9$C6CG}**4vNv!tw)!4cj~Ub@$Pw4wvjw#V)@XWPtwHcQWaZ1;ZC;xnY;0_>Eq zL1SHb?WpWhpTLd5ug~9lhh95+qfaldI*baso%z<_)IRD_QCU-T;nRjHukAKtjQ`+Y zZ&2SD&L!D0S7TMijUnjF=4&U6TbdNNZdDwID?P%u`i?+E#0ycB;eRif{1gG7(z5lco*M?y}X)&LIlWZ%BR$bj1mvnDHOz|nOE6KLa zv3;3mH$FMS@3*D_`oNY2qpq6N+XRbug^zjLFIVYr%^VY2U5mX{+XA?=+jJ!fUslbU z;;*?`Rd&z5rb(Sn?TW&d0rA4|ERK*J&z1oRcXh>vtlmp|@5N37CbMmh4lI31OCL?S zWAvZd_1Zj`p?Pk5a^Ao{_EJ0{Y!F&6 zZ$r>RzD;kADEa;ZL?}YwiJv=H^I-G$<2=NRIb!dnUi~-u1_vr?UVZPL&VSxNO?8vM9^4#Y zVhn92t|eY?;dV7gbw8`X{meu!5dL-P4-f%p0bnrzQMgg%;f|%}{j7rbvs2u!rZYMb zfe1s~Fx&-;`{KqXhbf8(J1O7xcw;M|H$7i}!v2n}PmEvo(B%PO{y}!YM{t*08)x)d z;`R7B$hn8nl97;8*$+N@>qfYzH%j5B-eQq|QBEbi^0)+47ZU`Sc>uIBf1mE``2O(d zFO5MHq=C5g*2>Ii+~K_Ta7UkrI7Uneb^}R+QN-2fh`h-$%cm05p|ytRikkm~S(L!g+P@Bz zH~hJCdw+cBQH=&;%45eI&0$QuOx${3y+5ikq%rRuZoW}M>-+1HKXrv4`%l*VmEMee zr^`Ovw^0>sEX3Z!u8pX#zB0dddA9b%@b(tZF+VK%UfOWumFm8sMaO*W{r~X?*X{b5{Q)EXPspKRN{7_)Sed#9MgSlUkhdYDb~>;aYJ6Kgz{Yqx&frA6Ho#*=_O zGNZ%vL%H`-w5fM{aTCYMpZXY7F?vp`ul{7dxgdLYTvGIkxW<;cET6{TS7DdK9n-lY zziN%Lw(uq`imsER$Fh`l&GzBOg_m+dO~-sq!?6L!a$7s>rvtIolQ%>9 z*fn69`D3gnU|2Ue#~Ggm;1DOqgZRf0Or%20sB4@vUYvw2bV%cd>r!en)^fTwaJpWT znIp+GZeZD$I7@4MA>ZzeX_Fu`U#WZ?YRG>nCdcnGD|5u*qZWDZt@P$H!@Y1z_x<8t z?iUj_^-*p0woE^-`>?3>f)j8hfECr)R7RPS2J}W>HF9Hoe8#)_#v^_8KPc2}_`R2I zOW-98H0vP@wEt=z8c>f(LY?kH-Q9IEdG9as##`=Ue;$Qik23jRJKR^Fuu7KnR=rs2 z{qBcHkbPiogK-rdK$$u;xAj6y%H3AX3qA&rCY&8>-5~A^0B9B;x-YM~d_{dr%4cASsf2mQzDxV?FU2HD{bWCTp6q9Xbj)qjX}H(YLt2NsE&JIH7u$cb zee;TGI0^j}&g_m^va;C25!|bYMsROTRFR18tvVX{Y4(Z>+ke_$Qib=b%jjDlkarHV zvl!l6EbnlimtF1yjtzyS|6>lny1h4JeDGBBv*xPSQTvZi~*G$lg%AJ zR30?gw$D^QWO;dD(%oELPQh_48vCBn5Uop>yp+Jjfdwt$x>$PHmM#xFUG1u5K3{ab zYyD_1H~CzY42tC+URE_GuYC9?eCV<(#pDrQsx6hDkT@O)NZlR?v?kh2tR#rRzNfb| z8V}4JQ6(b7)zd#SyskU5iV?m8n0*%m*IY53i{AL!%JbaL&Rr^f^=@OqaM?@E#lJ5- z`P?r0xl`e>7D(FqOQrC{lAhC`h`D0;QD#kHmQj0b`;U-STgt4ks^Lj=f#Dr*E%4L6 zQ8VTBCLi2HLntKC$1Q zGkW6@7vmyPr#JRJb?J0B?`=yG{HTTS-g581_gC#+=zGPp)z^41S|&+%<62UF0_*Dx z%vU4U#UQM&b~qKSa5*l$2fqlq|k zr@;Lv9f{>Rr5_y|Z?3)%a|!<`-KRzLXF}kdG!CXO)WK%}>*au*6-5I4QN-kfDw29Z zV0|faFAEnT#Ux3qu%HaoJt(gsQP5pit$RqjsWP(KfF)#mWVL-$jV~D6#e><-U|7<* z@_IvU-}{Hz@S9=!Hof$d!#}B8w&dgA96hzHXyw*c>BC_^(HxC@RNMStdg*!DwfLM{ z`O2wuEz*BO*P^%VTIjkwj)n3zJENbOqYY)PG%kqIX$Zy1>cF!=sJxZPb z;6qz^1-RPlM`LQshwpnpDt)LtO`myGsnYz+f+|&&Z+)Y?;w5(m=55v6<8*Iz`D~Y; z_87pYJMC3ia@U>o-DZb_xn9HNU9KbkfZ`z;YtnZW2YY;q2fmB{3Y(^oy7Qv9>=WNHB{Xwh=vH4h#y=;lM91ev zx)f8ee8ZI z)#p;lejcshNK2X1EN(#?CPXSD?Wphl4>S5*&T$uL?_YGXYxczckOw0m+Wzbd#&1-r zy*H<^RueNYJxtPZ8Pr^c-Rn;$8e--TTsBaNQs6PmsggY=5m6zt;Seh4JiB(UK8@@Pevrj|EQ=Y<6}99}%4anZ&U37Q(yGR->euQ;pK@QpLC6cFXkbFBaiKkEA)A)1>AVB z=+n!}Vs*1iZYd@^VzVxmS&Gr z*3#O$mx@*A#QtiQS;)TY8qG!^#!C z|EzuieoK3gJ^PGe>!hH2O4?L6>Mh?B%WHP(NRQ>Jk=8QK^m{21p6tcEXEdgZti{+5 z_xT4;lHGy_paK7F6 zrm|2Zjrxarq3CnW`@mEm!xP68ty|LK)l+2Eg9y}5pAesn9&Ut3@7Lh{l&Nv@rHW0J zZ!61S@q@~Z#`DpD*L8z`@&V>l18*ctFOQmKpKsk8_=lLO%J6-Bx}xfp?}g8?_bv1v z`G@bN4m1=>p~I3whb>GUh9~xpk^W=`Vh7@%W0X=?fA@I05l>V?~~6U^=D zWKzHogeGeHKu9}bx9B~er1#uJ@41-Xa}vF0b1%5^dl)lmWp3PL+8Jj& zE=M8Pn$g&)3@?s^WHY0X)y%yh=dNS!H0F+Cz07TwW0Z34)5vYQ7r6mJbmc3`(B2t* z4l3jJ#)qFdXCa2wMXqoT4LutYxme3hzdqL6DGj@(M-wlH@&bB{u+@((dKv^i*I zaWtEGqa4j#$7hU}5o0aC&K5mR^{mf8fdezSLHaA1PttDFSfqI-wc_~HJ_Y8bX{fGf z6skMd4=uXJ+=L*u==-vq{?MVChZ^R`qn2@dQOh9g)8aOBPcXkl2W#+Mei}?JE!x@ICdpy8f7#O3aF} zV8oienc_L`$?l=CRL0P(JZ}+Y3f6ap#!j8q$CSvir9nN*YQVV*W0N?;(ZEBisio;9 zm-Wg63O*oTvdH1syMpfJ@K-Lp6Y13)!Hcj6lZdL9&ZuN8QHuJUFE3SG~ z{u`ky#I@i2|9|YN_P%e4T|KIbT^;?euGrPl|5C-SK3lDhT|KIfU46D%9lLt;e@N`A zg=EXZ|v&7A$Bzhi;Hreb&R}@1R+$lBeFUK%gD2gT@~XA zm---U#aa9k$7EfaPKkE^6062~tQv-1=iayan36|Jh4SkKzm_9bUom3kco?>Cm98jJ zjwng<1vrx5!<@TO#h4U8(W9H z^m^xJ=@-v-`i+Sev0bg3@?Ku){k`nw3%1%Azn#Y5FYxgE9i!eu97TcS`qzM7>fn;! zi$$l~8%(Xr2B2Z;b(`8s9RpiKyFxK*i*#$g^xkXp(&9*}yg}YRP4SSYe{FhQ_fANY z%^JZY{qp9kt=A~CYSXm$DUT;$(S=H|Nc*K;Ib-?P2gE%yI6V8n zBZ|5ec%ju+q4hIF8(%kijnPehC&^E<6_JWsCGHXP)Rhu-q+(&P>C3J@SzqI$ir#JL zYDn-Oyw!1 ze4VbJVvlP5B;Bhjd(_tOh!Tu&F5O@EJ=I?CN|NmtT>-uNxavM#rr$i$8+*OHYhFdy zI!8ZaZZ>z~RI<_&%m6mzCtf%yV8 zUQK;ZPA!Y+U3@0oG|M)6mEE|mYX|uEZs$`Xy_-)edwcUUPaoKzdTHj;49y0f&l0=2 zelr{H4ZnZDr{>PxTy8|CIp34dM0e=@{M+r7Q~mwQ_+VNd;FYuQ)vE_MPMCfH#zp>qJ0DflGGzpC$-vV+^WX!%l}{)JGLD)WraL)6fmLq0Pj|j+-8u0C zkI9aAjL`3yo_Ce2%oQ+4^D={e4ePLm96da6N#(m6_SJjV_0>O_GGs{QBi<*s-Lpo2 zp<+w0amrWc0*Xfe(($wwN33GQd3;I^@ErG5YlfC#BP#jN{Hu6+y9#54v@X6C{ zdu?vn90%R8AKA%m@?7q?C2I^7zh8!k*%$wV@yOToSjmW!%!v zLj(y5v1_*Eyal!deN-;m+5}J?0+Tga>+R?xMmsxs_het#m4dybev89)c#C z321fYVAN&b%stvl?wae_*hgTonowG72zsG`d*Lhc_W75zXEND7mcJ5tuO2IKHGqvm@xh$kw?fS2Z66-5hC~S8`4B+E~9)wb>VdMoO z?T1Zf08;rQWWcq7&-ba!;PahR^7Y`igOBfCNmIaQzQX?u{L!Fif=_u0--tuL#Ai9- zM}W^~oU6fSONp0ElC%K)1ki`TpQ++M2R^Ehz677=w-xz62Y(J|A2f8X3h#k8J=jl+ z!RKpNGCl-l!RI-yeDJB4BIj=K!IGZF|4>CI|6cGP0lgFahXtQ{?h*KFPWZ#%<3Gt0 zFET(iSx)~bd_x^f)*A@Ey55W6)9w?&H>vRd0-rI2dEgrbpY}J7k|eOCWc&|Rced*; z@RxvI4Zd2>67W}o{~q|+0?&&60)8^+dte;9il2x)d?-wM9(>lX*vAe&?fx40{1sL5 zDd$OCY;QC8N_)xw5ia8X06zOck@GtEt3ZDPexBeH9~9ug=K!q6PXnKJ+X$xGZgauE z3;dnnj}>xg=K}EAe{X=#pS4%&tpI-<=riE+TmbpR9|oUx{2Tb{es2b!?KhwiYWsfx zKK1bjU#-s{!AFy%yTNDwDE0mee9lW7`1cFGWJ14UlB9y(4t|P?Uk5(zcpZF>cSX(_ z@M&isbb?}M>VFk{R3VKA-z4zl_r+vf0D2Di3k9D5JNOx(Uj#p0#eWNYwo8jj)$RH% z_?+iP@H^K5%%hLMXTAJ0;ga>#;U5^IP)X)7U*QLWPyJ(XDec0KNJ}fhr`;dH#dnK{ z*TIkn!H0_S7(v%K_`u%;pY-=}DRw5lKQ^5h(o!`p#Xgj82A}v};!@*h34EIqK2zYo zaKaZ0yk65?ezm}l0becun7~hU!k-iPhn(^!M_T;nqLh*`(ucQYF*Vy(sA(FkKy2(gdE!QBKXv2KKSbP{tbNUlLfxo z{(~_|`ODSi;G=kF|HgpN`LYds&Of=|0ay+`>3!gL&PV7|1b!g+$G|tK@O#0hJ|BRu z*5?=CQ=e<#tMxfA@O`!2@m~sj5cq2RfMAFG7$^LA@F{56PstmLAnOgmzx7CEJPP`PZvq_wKHEore-w-WpK=zcYfUoYacfe9ssAkS)%qV6_+%&iae-gvgl_|% z8pY1vhzFN=wz=z8#eE>e~K|MLnmx0f5bsc<@;B%aRAAGQ+0e!mb|19{_ ze;D{`{a*#2a?RkY^*ISX^_dC2TAz=F{B$Szp9%TdPVzl*^P@f`PWXP{Q=d&v_`ATT zKGoo>^|66ZeSQwUTAySgzs*U0mXLqJNq(`Af89y`ZXv(7p}YKJLjG9r)#IT_$PWcy zZO;#d{CM!y`ri=pmpI8Eh{4D9u64qPfY0_mp&6gfA8Nb|?HEf&ZHm z{ucu8+qb*^Z2~_Ye6{_*6!-)uyaAJo`X@W#$Ai!Iu5-f23;eTA_%wm9b;7R`__v+# z&k6h$C;SnC|A!O)w*v3y)4jb{1%4v<>h|`DaOgkR2_FPL+neTuj{~26X_1Q0`I`bh z=kN32n~-u|bN-eJ`M-3MzemV#Q^_Iz7Xtr<6TVI0_5Hf*|E0i>0be~n4UrE0r#j)s zgU|W<5culx9|=C^ZwmP8@qeGdKjwsgP~e|-!smj|@$dui)%sL`PkSB$Uv2*%gU|YY z4gMgc%6j-q@M+JB;F|=W_W1~W%Kyem{!Q>He~_`e{2@^ed^q@Oeazq!Kg$U}PvDn2 z;WGvPDJT3!@M+K8;H&Mq9emnzFZhFzD&ygx!1J9iHU4#hZ*aoDBk=F5@D%(z@W(;! zMey$y@_E1e7x=VKum0WJ>lf{4??~{~_Kyai_$f~KB!QprgwF+^?ac*Wt^ecTv%Qaj z4>da5yItV%E%$Et=LG%-PWaaa{#7UZF9rT}C;aaO{?|_Uj|BcbC;Z<8{*O+0jn$$5 zU!3qm!KZyZ2Xwb*IQSet{@|!C@|DconPlWsiC;6U}9C6X#gAY@5&c`9(({K44eA+{qr(pu$YhYLW zko(XT;B!6?0U!T4#sm0227e0ZabQkW_%PI0;7^g(-*z-POTfR7>B+1_&S!IJ)r|H0Iq{I|hJlcayD`MB3Bf66ltrV|t< zQiWdvKKE71pTa*0euTnAs__38?=VVF_WAF!vk9FN;KKe7fzSD;{3-qN-&OB_x_|Gq zT~FaA#__HE{oiiyo$CLew&$J7|DQ5W?zCNZivQn!bj+wbwZs3d@pGqo-YNcn`uMri z_TDM}PVLjvIQdW4d#Cd66o037_@6HSPTTvxc*nZhlYjXCntghjr~j|%d8hN}PVslz z-v70mW1Qcq-R=~Br~UXp9si%U&;M)k;}G8oRyKD?Ij{Iv1iq`d#AWaq2T}eMd{6wI z_K!W;p{II#!uQ1QNls7vp7igDzZ-EMSMi+l;N#JU{PzgrK>x(^0-T-w<6po@PL7)q zmzz^in37Yt0AH)gStfskW`4%fjQot8w2XPNv*VKE=Ef{okQ|g8lXPEvN@2>v$MZ7q zRh_K#l)~KnF2LMb3l=8NpFU&y{OO5t(}|b!?wh_aA^Cxr`N@ef_f2=O7EGTzJ#OK= z`D(NaY-o5`n9O#CM`pO|G8T7bB3ze=bXO+Ib(v^)Wvs5tOmb5u-0ZSUxH}t!hoeu> zf9YBLEKy4K_X;xd#rK0Azb`9iVSd)KWf}PkvsPy0t}b)~O^m!$ZTv9oFyO>0mqT?z$txBSZ0_B!HrlSLfuUtjtJHPFu=PC*>?l2G?O{ zMVZ6}iK|zpX1E=9DCFAy;qL5jaczH#JNsK)k3oyOF=&Z!(-G)1bk@S$xmjy6+`!OZ zoiK;-ERn8^XNfAnx1KW6XUQ`>EhDr$*_{f_#e`p&yCNeeIdK67RT{pil`%6rH#H?Y zHaj8;tm&p>khK*w( z>0!`Xr#a#zSxbENxcO4uN?r3#{#g%y@TrVdP?v|4X*UL$SyX7Rp zb!#KswKmex+OBznrCYU}yPCX_4of&s-blwFcRhI{T~GK(cN0F+VV~RTaag8@dK~t- zt&GDmJ(O|S$GJ?D!!oYRM1?szJSyB(hex??ZIrv#M!9Znl)KhOMXRRZg2I%v74i&J zrj~l^xGCSFhHINgyR&(;>k$_1&T7$<9HYf*b~Re8Vk}u*jwP$>v1D~OmaO7d zX?1z4w7PDA)m;m$uII=kcXMP?n2UiJfm?tWhy~%+0!w(lB`UvbL^|v=$)zPGSwwDx zD=SWN-ItTx_2ndoC6qyf(YzonGb4TVx87GKS%oT-T&Q9(yBysXvzyUvF*`=L#q4Ty zTg(x1eHOE;+qcE+Xrt2tW-&Wj=W+qFm>n&!m|eCY%ykRgIog&m(Sk6SEeLarS7#l= z9KGgR$1vCJ3Uk-4FvlpqtsXb`K#Oaa+TzZowuHNM=`6yrb=@A}-a6|R?#>3`u5BRP z-5%<3Z3B01t;MxlYjNk+T3oxe7I$u~#o~G#Slrpb;;?~gnsNgZQwZNbb@jJ+D;A5( z)y^V3L)Qir{-JY63D3}V8Q~w^R>qB2WQlOBXqE_9E1D(3v5H$FT&?03;R)VWpPNx2f~NJV8s8==Ug>{T>x9)V8{6a+Jf< zutdA^G%V2$Ps0-J>i%kp7NarRH$H_$_(~R+ zzLLeYuViuOD_N|O$+@Y^(~>h*<`q7koR$IyKu&lY?;ITA!*pLD)#B+Su79IT{yg zu{zy_-KjMlop@)KoEsB6 zeXbJF%+6l3GBhoBWnLEi!qC+P8R_WESp{-zvj-c?Bg*lmarvJs3zjX&$VpeRRUaTv zSABt8AhHoi%g~Hp@?A!ase5?lk>upah<~%BBVd!2vj))}S(B922-{@H+NhM&O!$t9 zWfb;cpUF#e^Ai!moBW7u-0ZBS8HI>cVP#9nFAU8yXIbUyvvRTuAIwNuA-}4L4^<}<8 zUu?Y*pmGZq5aPQV0Ru%g!FM%t8u}-{2SY!YRhSvaeECM-W%lIcNnzj7c>k7o^+@{8 z?Qj{O#s}`%2#%Jd{EVepYbP(w%0|dA_VIZLTW94=eni>p&&bbRDL+nUkJXke6GKk<2uu5T9Z$$XJ<@mx+O&jMyf^VKCNr9cgL*W*fSVJ{O7< zWG%zMPs>ipSr(d-pTFUQN9Ea{KpZ_h!&Ht{Zz+;r$H5olj>)Wki`Ht4OBe80OboMO6|MG%`!L)j120pZG z4h<{J#N(DV(Gybg^0G4~WaSoE!8I?-&0Us_$&@xRD=9NKCu8D_to)2r+}b9_U^G8o zn3YyAF(xlh_1I|Qg51^lX&D6*T{j$y!Nl)!PYhj2hs*sv+Tr#&2D0Pd;x4Vu=;1c4 zK;%2)zj?F$Z@N!ARB?Ty{*Gg!=NY29VRXMob={~P^>^K=9klbU`agKDc2s!#&D!1F z+EJ$KcI|#ae9Qq?-LR9pTSK{He@A=&TX)p|lXvXz+KzwsX6NFL?dF#4Dofmpu-Nu| z)BZnv*LJ0fy~|s;V+nKI!_j2-=X)G64J8}` z+unA-XRZoz`xC$9>g<&KkepoDJS9Du$2szZsLp_Z z9D_(sUO0WxLPf&LjKWMF0SQTC2^;_srw9r}SyxfX?m84?WXl>T#}D#yvvRPjDEJPl z@W7FqdU)i>WfPELabGT?r*e_*%SH86F4}!LYft4Sxh)rN?x9?`d%J{(y9tBcb`HrM z*7+ckYVbJ%W-6Cb=qeB1+eao20V$o*eZV0@=?+(;3EAirITXtiNy_LHrRT!J{|c(C*|9xU$1Lqt#GA;SH5h`@Mo%!LRH09XAGp-d*{Sr*}b zZHwq>ZHsWfwng-0fe7~&h%|Tapu`0{5cO^Lj#SL!+`33*qPU(9k;-(rt(;=69?B_3 zyRDpJt{%!MM!T(?Vy+&_DMoWH7o`js*X5#M7st4Wf+1Xui>RI~5ar$iQ9W58%Dn|} zWJ)!$)n}$$%;v6#fT}}NVl3Qd3HKI^n$&$<^&G|cwy_qinA}-|Xk`$(?u+QoIU3!= z9L0k_r@PMr*}M8yje6>fX!m^)-P34{c5lmQj7G<(vceXwMwPX5+*x}Vch;W9oz?xg zv!bn{ZZyti-95F+>b_Ohp61vjrNdqKE00;-K6bz5oR!juNj;cn63pXh<|Np|RWm2` z)ajGlclxC0?t=^yq4Utyw+*yOu%OTi#&V$*j$XN*o;Z9ZGF%!F$FGEB9Kh;9GVCDN zjYC*HAe4qXO-vlba$mR7DjddgEjg^GR=MAZ;7FFDGj|@Y>=mYrc4wW#lSA{XNvzlU?Zb%L02S*OOhs-PHDp6o*Z+l^h|hIhNQVAgj#!zBv$v`ND$uAcN& z4A+Cc%CK_o|4vWWb-7M|_qKA1;d&^iteZH~<$A`^-*v1bbZuSD$xhGqwz}Q7HR5&` zLw@S}ZMKcDxN%+3D5xP_Cyj6zP5pMZ#VV%SB=|xUyU%3?vXetfcf; z9S9!#y8X84`rKC!V~;+qn=#*$Ym3ug?#p$K5c;yN+8KrRi&mh;E)i(I13`Du6@uQP zK%f~e5uIZ>x`(kGt#p|42ypNC;apf}-96|}7f&{=vt)XFZfxG^_~C?@>sIyT_~De8 zd&!Yv|E)SG)~VucC&h#)N5s@c08hN7F>Rx*bmI3?RxQLmpPySp|izBkPWsf48G- z@`Fqas1$~k#M{4kKbUd&>%Y138+z;fCoz{sd(g1ITP{_*Uu6H9s z8HE#4QnRF#ytIM|%W_sr6IL$8Gg=3;Aa`k@G+|zWT%WD8*4zIv13%a~51+cQiFC3^ z!$le*(y<~niFBAqeMRam(y#HuXo-;bet>jr5q=+RZ7-?r0(fTwq=TgKS3|l5*L>hk z3H)*37b3qB_y+LmfhSEoX?_cZ_(KB!f=G9vTpM0ek3zZK;O#&;(kw@M3oe!`7x?wS zw<3Qw@Fn0q0X%8qN#`T~5ZV&1k?Pif&OttD=9A9EMR}=6+0Mm+UMT1ULB|T(3VD@~ zpM?6Rf)@dKq$!VdsK5mR*MNF z0o{On()g<({RS@9cLXWxdj)v5?;`Yk4ZQupEA1s+E%3Vqeh2W?Xs4HlRJRMfZNQVp zUk&MUBH$IflP<(XeRD*biInv`fO012 zc^rD%!JChAq^TF_Smbm39EaQl(9@8wj3?4omVumbq_X{m-ge+az%!}zCOu5xeFfeC zJjc%#tyIVFQR#tK#uI4?`E18N$kTzoHL|N+q_5$JqS>xbMS4Y~{1z7Z?<3`SI)jw@ z9Umzj%S3zjdP{XDz^jKm(rhnjeshcMIVAAag5E9YZGx^4bUsqnlP%Jvf}ezX_z{!+ z1EjhKz?+MDNV6W&Hss58g&ql@ry{@8uArlE$>SQSY**mf|Ea)_18*eo%6K3>OyGS5 z-T*x9Rt3BfJU#Hrcp!ZXKd4K+zY^)^BK-s@?R60;>pzE-^`9Pr@eMmo?St_R-l-87 z-@FaM}A>_K{yz?TX98sIq&OrBERI`Hy= zSH=bD9OPd>`yPe7CqOSpK55#Q^io`G-=j#`jzvf(Ae}Ghxk%YA8{|}>Tq5Mm0BInX!KPN_D5f zYw(v2lBRsp_-5X*lc-N`km~9|zlMC$%qM*S7xk}3N_jhgXFm=AeiwL~fLHpJbP@8~ zA^!o?R}Oj|@<~%3=^RntT$C>ay2zGI?_s2@FHzL@0Pyp{o1vy}7^d{t+ z(YL#CU*7?`4Edy)Pr3;Cl>;@B?k3h*(Cd&-n)#&H;9`50Bc)!C0?%eKj2B@3rsbneUT4aO2d#p7PJxhq?u3pYmCupsQ3IZ zv=e$AhMpI}Ya51k3Oz};;-Vd!ky6h$fxm@u73G6<5xh5mC(U+|K7xzwdQIS80G{(L z0{DI4?FL?%f24OIpY!!=_!WCW??ApXe@Sn{#d^zuYsL7q4VLP*fL8(>Y1T`6E%FVp z-zLp8v+P}d9^-w^Cv-$@_F z#rh73bU#wctwOn4$nhB>)x7{7zDanHH06@6KtBD3VlF4AD6NvLlmQr7DY zIS)h68SqmFfae7{q}dMA`~h+5`89qwocQZVNnaK8Ws$b|Nyls`mr8#ZyjDNyAZf}W zeOllefQtuz9dIYXI}RLa;z-vE+#%qmf?o#Q5%Bf{N18a&dj+maq}!0Py%i!Y5$QUS zt`TV-%dG5D@;fIBQ7l`u8{)@CfF4||X zz#D+)e#-{D5j;Kc%KnSAhrr(&;*kHjNG~I$oC|_(6Z9EDpAhtMLD!0O{}9K1$B6sn zA@KGN>Dup*-i?cP+KH6%w;^S_icl^DdR9Zv3h>sU9BJB{bRP0)r?HT`26Q&^6}yp6 z$3?l1igXcD%8f_4O3Vw4$GSxDY$!*Xa!Ff}&-vGkdZ&UmBVX~aNc*#1;GaNwen-`h z^@{SOjmYP`vciA!1+7QEGS5hVjUUEmJ8vMRJ{^L_dLYy94|dF>GpPSOcxMN9%_Guh zaIsy@B5gpL1iBt6OTbDUX&-z_K~i_#rk&${3bz{3Hk}7lwT;)9FZ;+ z`ST$^0rIXw{vz<^LOyBAC!HX0lY!$r@)#)9O#?3qIAvauHshim;{<*r@YPs9o`Bpy z@P+|TnsQ0|3Ov8D%XWGQ`qm%^{rMordbJDXzXGpgP}h1z`ij8458QE#n+xzuE`WCy zIMS?#^cm)(-iwfP9`tGE3q44`fs6Iy+raWZ&yMyT0dGHW%07>DHS#$gucMw?`&Q>2Rot`ImAaQlE;3tk>@q^URQY=L_iIIc@=z@>xt z0C37WMS3_AP^ZU&w>+kiJi zP7>r^0PhU&q=_ee8W;6FDe!Lq&vj!t@Na^56nJGFA$=GZy72p*Cuh@h1I)Tdp?i|`>2d)r2=yQ-X<&sVpxW&M+U!hyw zqu{|G@9byN^Knt%xdJ~8cz@u}0zU&hEAXT#mvjU!>KiKXCXo(CIgVHKL)|d&2B4fW zeo6b_Vm*41^4lDw(eHAC3oi zzY9nyuN8RKi?yfj9C)XJSM(r#3fFw#_)Qt&>w%~J+TpJq2k!{*iakjmLO$(x6Y^?7 zA3(lhPtw)6*sk3o-6_&dNRz-XK{_AlI;66lA(VX|uqO6L^2oz9-cfJV|qrStye`Q2m(%4lW>C3oihx16;{#KEmM#}PUpnN*|x!MoU3&1;q z@}#K`=~`T@Z=b+d0WXhZ+`spLw*z=(T$5gpi}kD(X&zG6vk2wvkc)4^*F6f}LX;!T zdPpbn0?rB?_x*DNq`G+U@a?kBH~{HTjeF8JF{X&Wij?>h{Ty+Cwf~gr&Vq;iUS}MD zbUpI9?_Y!b)1Z$aUx@>degPNb0PBI{zTZcO=O^H;1&%cJBwdJW9&p)6S#K)vw=k}D zz%O139`=EqaRAbba8b|s0v`)J=NtB(bqU~2174Ybq$eYv{q_L-f*GKrkgxP3>2O@E zcN}mwv;177&J5mI;7HTnr2Ua^fc-w9zYf|D`J|ao+86oU_wPhKCeTLYD{%nQ-nf!b zPlu1Ay%$A#PNZj%a{Qha>2ait4;&I{HBy$}Ez+GLEk`;7{6eJjkmevwM4Ik{brSmT z!}!Vs&+dbDQnZKkeB^V!XAXn^%`(U*&GwK^AO><`nTK>T@SNYvfu9B*;xwJ}o%A?d z)FTin_3#(zV3F#PE(HG@j2X(ki8K-EmA=w39qfoWQ(Xsm?R}+#q^Sq#7J)w{@W+AY zIGzf819j&GMv6a8W;g>yr9q1JCg? zj`wx&GJ#jd59xH|bG%Vr9%wuAmGMV92^Z_1+E?0}4LPhQp*Q>~@VR~mBW1svMB0Jh zdA5P(w?AhgJ&%;-+eF$T(o-UBKuSFi8(`jFm*i|yWqG!$tCQp#N?_=SRA3OQ^)_FZ+^;H5&2Vh_@fBA?>~aoM`%pcf-w zxi64jh>Pt>M9Oy05VTFuRzZi0G(@ChMLJBRzDTLxwLb9U(axwK+!yeD*sFcu$BTB8 zzJh%EJHy}~eG0lA`HKHT`aCYS`wUXbI|)47(}wmngVzAO(mv8hk& zeWYJN{HTlnB1 z_4wQy`wG}McntPg;B|OoUm@&G`U>)|qJ4P2Q+E~gMdXua`$?b2CEFV*<(&Y&9r<`} zRM!k1zNLJSH1VYC1^$r0zW_Yv7oJbm;TamAFLlm0(mRna_ZRMSdq7trU+F*6n{X{a zz3Y&&{W&7Fi!=e{*Wtb#a+g#$7ra=MCry1wPecAf%vBHEcN0NRMm}lgla4|@@53|j zyl@8SaO5lZWzwOzrlVebKvIsg$3u=6c(-~x?yrzQNHwoMmqCPY3mqp;MQPoE}U(}ZmIqN|$SJg*49T)wF zX~5B6n2oq5Y${C#PVpZ|N8n;VhKN*;l;imuy+hyYdg)jP+Hn>2+yw7)y>yT?+eNwq z*L}dB(@T5p!X96HVIK@W*XL76=OAqm=_aH$&}B$j&w7y-iZll)@tGn`75s-q`hZ9i zkq41XPdMjLp|ln0vfNS_q=dV${$Jm)XYvDCc+UN!K_{gU(^grBhw z^e*Hp^OrQvvq*DM?q=_Rv zU*Ki{*8o1w@zf=P7YiI|;z&;uxKQ9~q32rM_and?2OMeQNRLJSag-~EoN&-1kx!cW zq`Szo0m`Wf>qXdKQ1fVagH{S2D*kzS8{ z`omMyUpH@-Lu11L$vbUF!zv zuXT?8{v0XC#rrzPy0Jb)s=EwcEAYy?LAnL`2J}OO2J;;BDddx8eWXtypX~_yub~XChy*Kk0N_TsIy@O8Y*5lzPOY9OI{(Aa^!+Hk4E1siY?hTnKP&!0iDp z0=!`0NV9&@fwh;^lLJIJZ-Wy|1JLUO5*?T0(v+$~Qos0rV|x*SSK{pJR+; zkDPG@DfMjAI@YhxfjndDhH_OXhd4%EJb3U=4wB}6p0pJg^)&<606i+8M+A5w zz>&sZ4e4Nk^9Sw#`mF@_=RolMfFn&DX`A5*cps_fQ z0J;SEq?u289WIWuHApFMIpraLD)4#WEu}nxCv6wFg~06##6AFi#A5K0fFn)0q-W!z z+<2svYXzS3=TYFNffoV1GM`ABk`I{ zeR&&rWxy$RCA}UO<*pU@Z0ZU8INX?pEabX;iCRQz-<8^@$kA}@ce-zO&n=IfinPi0QK!eeMa!~z>%gtq;a^ zjlUYwRk&DhB~sQ`1pFT44+zHjGVs;`Pa1zUq}SkLeR)WUPX)dT`Qw0J4&I}{lg3{S zX~d*t`M5X8_^H6}M1CUhvEW&OCyl=v(&4x$KLjb|f#BiTL+A4n(s*KbL#qUiEUhzNDal2Sr0gyu64Y zYKIpU6%Ai%Ff}d+3I&LO3g$GI7lq0iGE*ySpvb>Jxt#j~S^t^u_j&%$oQKQaYwfkyUVH6*_St8jvp)yJm7aKE(ram4C_?BX z8}!h_p*!o12qz-cBSc<}4q-TGTr$WuV$-sZz7-*OnzJlyVc{tjHnXsag^esc%)(k0 z9%A7^79L<>4GZ_Na1RT2v9OATJ6X7cgPntYBdo3oR_%z`{Zn7O*gvg;^}j zU||{y%`9BX!Xy?hVqqc+6Id9}!Z;QRES$o^2o{F1(8R((76!1;pM^XNy;9=L!^@!oyh2TMhlFN zV6=(R0gUDu?a62(qjikt7~KUssr(Lv(J22Cqgxr>!sup3H!`}G(FYk_!{|MXu442K zMprVrg3%U67cx4R(HV?3GdhXUiHweCw7}>HMw=KNz-XS)o{Tm!TE}PvVtuKLG@h4=v<~miQaawF7U?n2I~Koj_yyuO6+ar+ z<1m;SR63f^aqcMH0R1#Sd>`vc6sI|04DmtJyfPT~?MuR&Ji!`?hp z2=g9}?pvFf%uetJl1|9CLUt~bF+=77W`iE-eOR2<{6?`jy@$J=l}l@m0W2>)SNM#{ zT*UWNuI@c=V96_7) z4o%ES`)8%?p}l>}0Uu`V1bkG0dEb{tRT4(>%&Ax;hu=E?@B>B^%d> zenDoZUz4@rcf++Y1=K$D0S!hf5V{#h#wBNDK7Gyv!@{bZl@1+A8ZCMqIi5j-(C zWW~hri7O_iMg*s&OqvK_!t}@xe7tcLyYHjm_>b3q!tEc2TQ2cF4!3q(2mRwE8qZ{% z9?b&Qa&Uh|A(jWkAFcDyk(^wRUPy~g?2vGjWJ(I(#eE~?r~AmW(>d-p#MW>Y3h2Nc zR=x;>Dv_WGiJlP%DE|Qbj^f@=d0^?mdO*htr4k9X$C}JFLzoA778Rg;TjSZHRJRDq z6`RZoo^P+C0~yIhH<*qC&_Q*=A-hA?A;af8)a5#K(EUCZuWSyoNj{hz3_zd!L)iXu zDo4+>#f88GG$iFa1UqoMjCC;wJFJ*P_Bs-vBLI1ln2uA>VP}$Dm;5#8#02GUucH7u z$RG6n7uhjrR*(M3T$_>y3CFrnpQAom#&n26cK?*^LWo}W{i6&zuw+H=uGt(;e2RfL zU+k^+b=e9Xv?gA~?C?fi#@J{h+r|DNgM&G=ExnV1XFOaD*2a{FGdt)54Fn@)Z$}Gs zkWbs8gYu=#cIMO6%!1{s($ZNW$;k-`chjO7J6fT`G8yZJ&_TMK9XMautWrv~*I^d$ zEE7pt(|gk)`Xe(tWo3G1&Wcs`b!mhS>Qkqn!|t%2FQbqk5mN7?I@4Ns7V3?qOs;Vb z-W@~d#!@FeR}&8`|Iu?d>hB!3M2XMb5d5N}<2Ci4OKUVUUirt(JHpQio&LgYGip0= zZgtL!LFiH#w?58yhAP9D@!@5apxSfu`-?X(?SC`l(`)K}(N}}-M~-O7sf5lEqI^-D z(CHhyJ`Ox}pNt3M24qZ6EcP6hQFo0SR_BTT{ce8${!Psc*BQ6B3Y|43sjPcP$YoJU zH@`n{^Ntxezu$k;b%xNnO_XsNQ5bjU_4UhD8A9g(o^ln&ag_m(dhRCuf957PibuE| zl)9$l9je#dF3qFGsGHDPChAz#!9^Fwxn)!>o<7v`z3JW)-xfN9m<4AC*jkV;T9A9w zg4}~d8CO^!d{>=M7E~E!3j~z8>?Zxc=jMy^RW-}HG>>$=BXkZ9hJ>mpu1|)Llsi-C z>}#cUan10;{HvyZ#P9TzipI+r zYdm@-765|y1?kJvGuJ{cCw*l~0b)GPx&l6RO-@=?I*&D|^ui!6MnUoT9$X$k)Yb*@ zHtf7~%vGo~QxHcgq{LaIfLoLqxFB#|;N8jg3Eebqs`CmK;qDCI^umMeMQL{OcIn+2 zr{|>glFcTSIzQgk6t9&yb;N_{J~*K!Fgkk`zV^8)kIP!Ml0NvDkiIrOYcj0L$N3wJ z;Y5y4=IEwg{3puU)_8KaeYS=x5|pNqHndVUK7*ZLtI5HaJ!$6P{_ebXr7E;2i?z+8 zOqt9%w3UKkt6eFo)WOkp{04r$7@N#?gX{(xnCuR^zR)$7L}{d>G0%1`$8p8r4Prk8 z99`F(9dx}!({dwGHeGY*$U^)8;w^}8MEq^U@5c4)NyO_BUxE0`h<|`My~A>h@wXs; zf$`~G87dznN7v-I5tBt!MEfX2IXHay}}dL%N=!Y>uS2k?6a zzgO_HAPrf>aUOwK&qKt(;R)SzEJY}UL?C*a#F?xRS=C;x=9@a$9aGQ?{+~@H1 zuuG%6ZsJhw;2!lXUstIu3MgM)rCr-t9$s0#ZjW{yU!KR8hx6qHHRT0}XOtFIXp5@K z!%f=4jMB9_?Rr65>s?>$bFtc+EAc*&;#(i>-BRs+#^PJ==hIT{e#Fna1*s}id9Jy< zC_rm5m*?#$FUn9CR+i^^mKW@RPIbPe9IEnw$mrdY;(JuZpKbFwQ|sOC=Y0mMIN$Sr zK4*)4k4F2Rsq${|^Esoc(iZJ0&*R+I6_O=Iy7ILF<>8j{b@AGDRpoh=<>3L^wejU^ zGt}z}wd*p}NX<2AExG0EGD-__wfQ@o+h6ZNN%2AT+uM9DReK*P_B{^|2;Nufyql`M+pFDC)^)gj3a4AI(-uXP=b>FZwS{}M zt=>mrL$vRS6f_Dd;(NT>`%<+#a@806UWxWSn&NAjh%6b}2M(5o>$KrX>bxD=LUZZF z-10nl43R2r!JhK9#`5rta_R%%)M(L6kzB?4+;W(m4~IMJ1JC=SC!8_+p05*2EcQ81 z6_;DzTjkvAR%OMBPKX-dw&RLtRu@ zzCKr*7obH~$&1%M5RZ6y_>S_zO6_{F^T5bl7~I`|8vT4O`gtEN_BmSZ4mX}C_Bmsw zUW(q;-2~_rMQBQk*yrQXIi(tv=kncMTI>={(Z2Q7q^h;e=R_T~1)P7h*ylvG54XOu ze0_k{EcT83%JSR{>d%FRXj3itMH!`e=JJA!@^A>`mWQMB!*x>YqpzCiM1WTv?5F-O z_*|*>LC=BxR1u}+)Om8tbI}kzXE*zvX!AZ>?cG@Ij!uFubP*i@9lOd0eW2OeBH~G* zMlEtJ+CrEV;b_doV&D1{?@v&D^k9;3*5p?rOYb~R3rLh1wHJb;e3Lv7hZXJW324ImCayn>Mg=SZ7RlUQO) z8&%xe`r)24xIp1G)vCv+>kY>XasFnPuvBlHVz3J5T8rQCGlK8=YTvWPuo(lI_lY{+ z6NuA!=i4sobaGzjp(E+EtI^OI>h-$v0y9oY41GB3yE|10wI-Sa{)96zW%_D5w>Sj~d+VjBg`an;$`>XbcNioqaG}ZdEMFsDENEcIfPj%9L%n*B zHXrSdaUNwgV>s>L6urxg@z&RZP6!){;>%YnhezbXHER!@@)~>&vHY)C~0BRfd0`msM8|8jw)AxnG%PuCeT}x60EW zH>XYg`8UG^jYd#^I%{EEpC@kKy!}|@qhYEK56|m=!t>W4$ z)@MN55U!2K4z+s%8tUp)6Du3$o)|R0zWwIBO5Gi?3FVeGkw{xV*y%E;S{{~9<}Z@^vnfZESTXFeQ|()qhxF3&^i@*kS9su<1RE>*f; zKYrHl+HVY80KXXwqXS|LrucSWDMO0N|MDLatE*}|Ofh{QG6|!{ga`qPO~Tkdp+evf zCL!plFu~L(SO|G4SO_aJ3E`)Mg^0Z-VRBKhFy+l)VOkNFf+az|@6ig?(AmYRv9ljl zO`g43HT$T_1M4t>{TG(#D;KWU8y6WC?ND*T!@EOTEiY|px4aA=A06rvaHRMXRqZE( zSKrpwYB_WzH#b)>kL0EsqpJ2lVXgmz53R4z_0eh<-CeGJRXurJ>5flSFFvUf{%-l? zXw8djgzSyRlapJXf1}tESz_*M-puiDg`D#7t~}?d5(?ipMn&MhY~<7vV;hQ3tG@lP zzr`h6H87A3tJ1iOv7bh)(gK{UwdzS0{FSucP1RX2UmvM`xwst6aml zGf+}ID5iLDOtCvOpO5xFmEsMxEq>k?Q)ooTfY&1U9&Pi!QtX2XQA@4Q`L-dAG$DeR z?Da>b-3moHD=p~cm>z*2tONfF;%PHqb6TXY5dEBRhWCmYYUTt|5ZPsGA5uo zCZI;;si^Ygme`2KhQ48_NY%y#wXXM=QQXFLM(rBU@?=ja#MDWI1useGeG> zW_9#?ufuSm%J4aQMXjOD|a-{ z`yoBy*s%*8hi>$JtKsUDsZ*bOuOzqdRqy9M{o;$Yr|14|?%&q@aB#}+`ZruRP4t-X zQF3%fsIGj{vFrHklgHb5C9w}~P1g!$i%~t^KU!Q^6>8Km>VExakMNRiKwW;!szfZR zYH91B;`mLtOT+!DS-Z&N2`|0*aqRjcu{wip)GM(q8`A>Bn_%5qA!T)SopJCiffJBy zylUxqK1y?MJU0JWklpgJYM6iB?X|C~OFZWG--=sRI*@B@-rhQ1k*j`JRGBrGS=)a5 z{haOvP9HDI*BJtqUE+-KDo?rwVJDGK;zx}texHkp7p>GpRec)WV)lH*U&rxChyFK~ z`<2Y{FC}SCsQs?EVk4~iN$rKrB(;W1oA^ndjU)OD5bxtle44$UEcVn*d0gLDlvh2~ zXIgyyot8)cuDMN=*X;_5@H{#KE`$?Ndh^`5d8VDy2Ly_18JZ~mwYM&r;~(+o<ea@Z858uh0p$NP2YxP{wi^s4J_<@?~jAr-i|M!7m&qXQCjz8 zU-iA+0;vsV_oV1%MGZaQ^y%S#|F1)}GVcS(lwCbhZ9rm6Nxzdfr6SnZOCm&tOyS>VHO%DkWYlfaMz`b73 zmpvEnM(Y`5YTEANMg8iN{nfNE!wJGt*N6Vd4K48Elgw`*8GLZ1+iI^#pnl}^I8a8IdUqGNB0U+%Lj zI*O|mn2cbGOTAX*eqKe}?WDuyA$OOJnRqJniogXzSBUQp-m5<*X?;e|Jfewp@l*wr zl?0T=jA{IRUO>t7`hd#LvC+l#0YY)fm|_=w)qDN95s7!1Hl4g0;uZJ1(j%RDJMMMc z*p{34c7n$f7+x-ozkB;%3Wmhr)EOnOz+s%duNwB6g z>XKEkmI+R2RGXOcX_wT&EP6**DT_WfpWhfFaUWY?at&qCg~CQTx+rmD7|Ry9qjVyR zPTr#qw?<3l=x+*LCo%4{OQmu&slqjaai7;Q3*FCfE~tv@XD<(3@|w?*aNi|w_%4YU zzT}PJOCtCs8#PP(27EU9wk0olem216vjMJ4{^<3YUj3O~^O@c)MkqNN5Y(s7*pY9J zTJNdib>43sx|rML@jWu882E1M0P^TaF`_VJFtc~#%sT#}J#H8i1 z)gQWVoD@;-sj7MLVLy++p~ssm%W87tkBt~we<6DOBN-Jjkbh=Tyymvu&p$tQ+|0(N zv9lNLEPL*yeZGDZ|2Xy`O}|I_^@;Tg96j1!Kdv#&<49)Z2M_6{H(35PE%{_Y*sEC+ zUR`sobA#`+?d7ZT7JnM_(U)!ci)W6V!@Gy{f8^cb8f)JvJ^$S+XPX}U+cG}o+}su0 zqcbPHxmo+cv2Q|r&>zh~d5dSxnR~4$A=Smr?4p}7-|yPIlYh>f{Iu6|CpWH{^whF> zZ+(z{=rJEgJ$IrZZ}P-*K_6Xi3t##d!$+6v-+HDgXvn#=``%ji+{uRQgO8oZ(e^ZQ13FOz+6iBafNmUTtxSKRIJ!Lrl#;F}4l2A4c*$+)lorpnQlqJYdl|4y|l^M$8V{0^IfJx9ek$-Lw4u z{0B<=4f3WDbwBP$A4V9evv?nF^IkDXHMJr(qO4(a43^ArbGu`;{vzjb&1kr8F@)-4 zeCz2R-g||~RTL{7hACcS?9|QbsZE8Ou^jdQCZX}=xmXv=RnsjoU+&e^-*B~(=4&}7 zkIy>{9f^ie<6&Ac#3FBfith^3Ls6J2Vv2o0J>^j8lrnWxQ^%mSX6*wR+DWv~rk!M= z^(I8U6%9C~Ft3Ab4<{ia>nDl+sYWTL+aMh$v#eAP`1;qbnQ)m%NTv>Db zq>^Uwkvqiy2OA=`#zs`Aqqa8S4q(cSlBiSasG0`-Uoy*clgjgQOA9jSZm9r^*Hz_S z#}|5h#d%ani`^NVyD6(H|nRf z$3|6vY}ovMUs}gp2YWDk#j?we;-#M(4OeRoUnCm7F^#M{5sek(Az1%94+F}g!wr}Y zQP ztF|FPoD`B`0SLt`_uFI6|3^-N$T?C-d>%( zQ+(8lN2}vw`McBe@-tWEC|R@U)c}4L-VOMf)P;Cpi@ees1cB^D3+syo&cC&#ENEs* zUMdw8OW$)BRVhB9S;NmKPt2 z;teZ2Af}fpcsvlMO7X#_AX88iiwU+TeSwSmvJL?T;OJ&+hZ!>%IbA4eBY5eff)Z|D(Uce#T097 zG6^wZ4V?Q4y*h4CsQwAR4^4u0Vgu)QQm@{c5UPK2z=y`bP%cz+Tpv5q?GwE^l>T{D z7Ef&G*o=Q>w-x3O;>{(mxF2b$KYM&>efyE6?ME-wpEz4`<L?AzSZa`nv8Gv^zxv>aX9)KY)^;*98^z?0!Gf3qNE`K$Nm z&l)){|Ak?rx&Q_&y^GPWFYcJvS+whua(Bc|#c5j;8`<1Ya?$$;7R|9{K#O!fm&Egk z`>RphBgtu-#9Mcq+;mGn1t)rC1NGe$^j&%|`nI=f`>JN>7kQ@* z$UWRg8qjdDKchD7&O1rLB9mble(rQ>5CFRt6B3a&LDt4uT3q$h@%T0(Hokma>o zuYX;?UFEjKZ9HE(zF~!>Zd+ZyCiAflFNhgSYmu5+RZI@Xk;04n$>HNzg^z#28mPyM ziS^UArYwmO*1euGY3s^ojL{Duf;@+ZaG!52J*ST0mzrw^ahuyVSybwQKdCgkhuu5E zxM`Tn4z6_ZCPB9+((@Ggx7GyzUajk2($BE=a8(3|4RyD>tS1*%div?ye&pPvr%#uh zU^3hh+%!Pf;HD|nb8d&lcX*b#)uO)Y{*`sxQmDSQRNq29>MMAmz9ZaGqlJR>5+K#5 zA8Z_`QGM)Md$7&?y~U^-;u+}5jV!gGkJ4?9RiDBKEYDxN^Ke0~OC0lHy-++-cx5>e z7o>8;HXfw5sDhQ{ILY(juP6t$-C8-TVH@29`gB4304yBvH3Vj1LnlBdnoo580&I7vo3ivivvT-v)XOe&i>S z55*HuDCMuf&r9Y*|AXKYU5(!mnGgBx;A1~KcMv~%FHhG0I`~xH$N0(iV3myfg7G`R z$JSk|d=NST>F=wu)jtz_((ebpQvV9@$)D4}m)pe^`dtz?c0-{3T3&2+lDh zlc#ok5`2Hqw}U@Q=EHyw!RJ9IfKT-n{RutSz$ZKI2cO!F_@rNr&QIl8z*n}5H~1vC z9eic`CNcS!?BrK7K33gq^gPV?Eq44D82@WK{vpP9!vLtX=VQkAvEzTm_=FXul-J@B z64h&t9iM0XR6Bko;}_ZSfqyKXE0y4nVSc0YWj&LB(@y>g#&5Rc6FxK9^Q9gCea8RE zj!(GHB!3&)NLjD%!5<5LAoy~>C42lZAXEGP27G$gN^E!ZlS$xHzq%iM>W?yiKI50# z@$YB+XYBYJ8UIx~{vR0sm>vI3@cmHU=irZ!%Y~h1z~@1`V*I3Z(H`)B1fT34tr%~q zUQy`u)c*+YP9BFv5D4(-kgpjOl0Ny6`450k=b3!Se8MsvFEbI!d>u~a+nw-%D=Ll$ za?-DrKLI^dANi2=s4%|#JM1BBU}yS&DWB~6CH~CD_!1yj3ZY!DH^HZNl@FQUlOKBW ze=yE-XYKO;SNWdm)ssJalK)TpttWeW>OcQi{GROWiBI?>&d$eq;G-*w$1?Qop%~vV z_kBAaoS)l!7=(>PK_S7x$!l_GyGfdLYf&<|A@+C#3Ur0;q=Z=u7bP#4K4bcV>GNWz zFHH8gey=?~`R?ci$>ImoMe&8x6Q;*5x^sb2T1>Eh5ncMYdPs0+kMb}pth;O!X8UGw zcamtJT6{VF)q0ZeA>f9ZnVNPsA*Pj&~lYq0@Nn0l_xHC~YyQ3E^ zS|Bx`9WN*(RC1>yU-G9TUvj7;U-GCUU*S?QQ9SQ$t(7Zg3oK&q?1bo;=?Te_jK2g% zuqrzjn{V=h*5s$Bsl@%xicHv5lUeZZ*fg?iRrk`f7-d_%6>J5VgA%EMNr(sv%A5;n z8)Jwwi=FRIS>`C(y+1`9-g=d=9o3wO_O_?RiFkL}%CXOhpp9Oo?Br$AB6dN>n(WlI zlg6jeD);!zRrwKE$~LWBwQ6NndUne437Lr*t8&sO%*f13Pff{BpAemsl2ufYxjcV@ z*w88YYoy&g6Be#oleauQe}WA10|A@e$wArwx$Yqi>(ZkMwkmUx2HtlFDJb9Ueba%nZCU=yx(W(@kyzFN&84{AM zGb3?_HlEY4joX1NOlEjF`3cERuf`$P2R!m_Z3i4K#dIn`k?1&~vZ@jr9M5I)^J$Z^ z^Jhg&mGw#`UcjV%#PZW7dCRtwx`@{;XA?DB8`y^JKp8YBcNLxu;rUTu&ME*IrKBa( z2K8L0rr`P?$`YKFLlZoOGaP1K%nqJCIHO(P4$f0d`|Qk?_jmsS*U>DocYDJndv9%` zXlFm|7Qe;pwkO6dW>WThYp0&nL!XUcPF0|pNX4KtMYAiTb!w;dx-<>2?POv%rJD+e zUY2FA)X8Mi&Q0QGcKdAhlX5A&2Rm)g2bzSk3Rn}wDV=Q{;$$41))88D6}UJ zh4$p3(4IUL8s=zZPcvC&rro^KIhSU$J*LP$w$p?>vXdQCWG_3Wbh}whb26!ARqSz2 z%M7)d)!Gh*;t5K?49*8b2FRtH1BH7V zh`?vYlb-RpxQeCcBX>&P%JhQqDXE!UO78Of@hfxIaO1PFH9bXQ=C4{&z>U8%Uo20+ z|CfRLZowJ{@NW0NqQZ9}fcs7~j%uQ}vGfZ_2lhR;MUhT)3DRkQZzs~}t!L~J-b*y) zC;C2?-WT7m$^pGXkxukINT)r+gOPqOXzV@S%kX5XiH^q)>)Y8e2(iAM9Rc}PJX5H` z_eZ9H7Y2EvsXU@bBRvlK@V$ur^#0}uq!Uf)L=zS%o;zg^Mo9YbJn2osXE_UfgyZ1` zd7??4Xcwdl$R7lK2GBnNewJuTC;AfLYsua+q<4VXj&#|6qL1T8_8(zkEkY{yb>wSC zIRoIgx4?S^`H03*P4q6Llik~(_a)F(NSEtD^waoJJ+>kweHD-=yYGd*$G|Ityj%~W zEl4N3YoKp4=nY7h>p^rLes~U-odh`x8Ah z9fx$PzdzCwK?_Ki{Xw(|KRovk@$v}=W*+25fQLHlB^pOH(O6S{GoI<;LF2K=UZQbS z^Y{mO4%HQLqw!os#K$HYY;lpNc=3u&tUvC z#y2zmQpQhW{6&nP$oL72kA5K98^`zp<4hNF=zh(kn-Q=k7Wi;L$A zlQ)AO1U|{pF$X_6o~no^gDLY96!Bt3ybX1fWjq!9FBN*OE8+}M^46x-cJPz9Ls#5k z*(J&gl#Gojlfwk}R?D`Xm)~kG<;2{Ig;|i22^iO(zpb~*I0esSSelN|m!e|D#vCwAMa<&UEPTJ2-;O8bvvK`%B zz{%~11kR^0O2pSufa5H4l;{Zy#))Y6l7?+(>Qz+PgPaK3EPvRlo$N&X-?p0R=m;B2 zlvcwICu>qT{kdO^8#vL#a0W%(z&L;=6~(SvlT(nN93C1PF)3wYWN_r9;E2$)<)(=A ziIM3m(t`n{5*EBX>}PQUGcf*fyfkigVEl4+bj-#41#%Q(h!uYrg2m%ja0A8fm?1xn zjRly%(0mG47z+h-C{{ZdZHtpf?}7v%We_ey7`C}MT>PXfk|@sdi05*T72M#MSjOzwiMq^I zDnnf1(}JR00*tlw={|HQnx~pD`B5IWcJz)bN#93pMdnSt>Ja;f^|nyDTkI~e9XhCg z;5*`CdtAN8S^wxAudf3-D&yc&=pbFrj-SKpv)~-dKt>JDlb&^mb+NuyZ(o;7&;e7p zEa2C3+Ks== zxtG)cJ#YRN!s-L|-nI~gE=9oV+cBe0#sFaTaV{Caq`P#p=2f9HZ^5Ts##)jPI&&5x zR12L2cO!H|xCCK8p>zFR2wjEF-1!Jq55$qK2jhMl_s_Ut8Kf~h-e=BF3QGgK=cr#w4M$mM{l38{)>q6(<%i9+5FCu6TZNk{76PKpK2*9#RcL zXQe15bQVtkiDD>uZTtp`>CSg?X83Ae7g2`a#{Cp`s*9^?L9K-@JwHAJ>AY$_=STI8 zoiB9tH5SiDU0n(7FCrRwM6|!yq$gqqz|OHEN9YWUDI$F?>wyF~AR{(O6&jmZoTLga zPRyN2Z7FoR#B!q`fi}4jiLj5*d1}f7aX(Nlz0mo|G=v7tR_lsi?qVAUh5u)B#f)Jv; zS^^#*Pw0wJW2$!-`XhQr73wX(1BujXXd`2NA~zx?5v{_z%#WF0Vr`k{#B#cE7`NEb zo9yWIc65#%ooYj4UBm90Uq%;r`vc=VU4t2#AbW-;%|L)rAG-#qvN;8DDMgbr^AoW{ zCUd#?0TWQMt8&=Jo5`s~(^ssZEj??~#Z)o7giuJ&nJG6eG)x*9F}<0bl9eUOGBUSY zH{$@$c2%BIBriQBi}3TU+JBv~-B5?q?Mkq%Z@1h6Wx@G&QfcYTjA)w*aUvci)qY<3 zI&uJ)mQuvodx5j{0_Wfb&fW{qtMCFK+o2U7zp-^Lmu#mu*->$_gJx_ZQ>w=M{pc5U z_|dhBt_yStrt1n_C+K>D`xV7})e#$!<{{1w(u2z=XM|#!BhZn9`1^?OL7d9`81dtX z{}1?=5T|c{e#GLVF@g9N@lNn}BkqoJNakI{>08Y|AdWReZUl=@Lp+ql=OG@$;`buH zh{badPiOH55vMxh)Zl17mX9AffaWbImOBf&(2hrI77yF;+Ce{U$GZgjPjYn*ZSY^4viD{PCmj)6c~(9lv$>ZNcva{NBOu7=9MyAsgu$P6xF?04c&j`yJ>= zfPaM05DB+2GdLtOI6O1Nlo=A184|&*4KYax%Y#Ff2Zw_Ozz+dDN;CwywZSZ}9oi$n z9nl-DV5?3$yfxLK&)RiatDqgsoOFJ~ z`~v*Si)gP~!msp}@GIMmGJa*A1AgV>BNh0Sk^jZ7bc((BU;N66x#j;m_?5+6jk{(( z*W&iP1fN~Ed9n~H?tg#{LRB05pnODXRtBeJ@ z(qzOB)J-{DI;A;w*beoS1JO}s*pjL?8`^3O-y|BiXhJY*6StFRV_$it;cBy+w5|Ia zZik3CwN))($7@r=lmn_M*uB0vc5)MR7Dv{`LRBPp5qrQ*9$#=qY=H-ASEtc%4S-&p z$Jap25cBe~M3L$Cz9>;ZEXJFK=LYL~e6zA<*#R&~^_*r)@= zv>E?^3aJr0)WX4rr~}cH50*wYIk&&f@O87>l|+wgoCn!2RzzVrWiO5@!$$aCvVT)) z__EdTg<#08B7?s+d7vU4&2AFrfF+Uu0bqFEO&@kLyOm=QULQ z&JM%%MB1wVH9Wu@zBL;zCK@`M-B8w#aJw(3nOaslWhb^0#}3=9o^nc^Yxn{-@E(^< zXcSb$1tLhIRg-)`{aJ|;>L$e#|`)#YC9RLN*Zonw`u9D)=`48TM zYJt{irixs$suj>bnSN4!RM9KW5uR{DuZpi z^wOia>%7OeiH2H05Wo`NqpjKSMYCH+hv9N7wGkTS3*dM)8?qtLYRCqlfzfbL>d)xI zfPZstzu2|N;kBauB9eo`aylJa4Q)U+=sA1clwA#xXg-{+mjDXU&}%P6E!sGb4w#fn zfO)pg1PDf1L&QFuP^D82si)F_fRQ0~SVipA9cXuS8p(N0mrgE!FX0(G*7~rTvrm;Cr3rkgv!lJ|7j z^sS~J-W%v&51>mDnNShtr<(6~nCXvqjk{U)aKB=U;LlyO$ELIhY4Q16Bn>s(mg_T* z-{I$4EEsj0k8Cpf9iJ+hSnm>l;*M$;&geZ^(^#S^?#vXP-{5H+^Nw5E(aoyrkd?wq zWuC@yx4X5^-m0owkRrSi=4Bio?3Q+{RMi%eD!k?IX`C?1t$j|pO7*H=ikl`TzG0AO zVz9eug}^^n*0f1AX5n(7>8xjE=ma;-Ty?pZQ8#98s73gAgJ1KS&0JO1EZsdWF2(Tl zfvMe2-oB^2qEg@!-!Nz<6u&!?dtY~dpNcxm;WfNb7Z)@$X^xEfP2HecZ&kq7kqJESrq+C{;{LC(C{usjn9OfXtlF4pR-3w! z8(l>(!1CL&fi5U?!%luJL8X{*e$q7w$S)U79$6T0a|vYzXJeL#sDhIXL*aV>A;gt~ z^B8xW04fL1Rt?Ee0#pK38eq(IJ_Ija?0!T7q6E?k;93A(0h}5@;iUN9-AuTY3<|Ov zq_KVqF3bd5(=eq*6}1b4iwKc(!)3}LTm?n4Nj(gs;SCoWGAbJ;h=@FsYa1TE+>Mr5 z3&Yxc4oCYOX&VBBV_??YUF8%8vmW>w0HB$2FgD@N37Y0c#1JxJ)+3POI%r`NPyeRo#e`t0lBd0H~WwyW>CtiYF)> zATa}Ny{8r=92{K3FbDcZxP=xR+6_DeSYjTSzU8@z>xGI+?~t@z6~^cL*S8-SeEjS0 zpIVkv{+B<84f@yG?a4?$HH$qI&a)o7XDCMSkxUGK0SB+%|Fhyxc|OmNNbBKdnm8@0K+8?pgLYLyOjEc zZ83{?!ay*rj+voruhiq77%K?CXY`&Hm+NW{pnG|OU*zlDDvbSV6X~9rvbV&z8>0tX zs&zyo`{^0Oc$e{9thnzL@Pb48hYOk{Zqo=#2WH>((U}(AYn*;M(F8jAo3X*3Ge-7t z6IV=1d=lTzD&q|w2;$0#(YTr)!E>DXqOfTuy&tq?ScQJmiFgz61xEQ9d@*b6&S{qxaklQ`L+Cytpg_NWu9poifKi>hH;+ z5USn5Mf>ZjhR(8Z0%+9k%-+1x;)z>0l?60v_s}9&ZR!2~b)s`nySMhvHf;Jd-bKUg zIehnRKKh!+HEMB90p2?h80DGTZ9sGO;zCoC!hr8yxo$qFFks}0f7Drq%`(Xbz+bM&C;FhfJ&%mELVp^I+=h7RcRjA@!`dR_j?!ZWx6|<@a%1_w zQ1^v4Hpf3&2J4)CvNdmG^^`5V+}y?Y$G(8x7VeFoAb9wwo z@7jhSu2z0d1w_cFzZ8CStMAC53^CR)d%!>E7!{Io>%8qQKJF>tz7Z2f1QXBEIMu|_5y znpppzJObBpmbz{k|I&I-yvV0#Yi9(AIeAdM1%Q|)CImpt)6WZTS2?a!G!X1M3<6a@(r@>rAe~bgEce)atj-Qd6HebIgtsFP@^h+Qf42Ce@}Im-@c3 zKB*?RzV&@|B_tXtdlmzSCvJ)ls z<--mYZwZjgmhB6Jq4n@n+;Wvs|RO_|1PL2-0 z9zBf7j@?%xM}4o>v8Z<30T*vc0NJ8hv>Z71aufy2(Q$`de3&xdtI;e94JC3ErpwX5 z!!EugTQdHQzpTBn`~kx&bNij%U7q!6-0PP|eD?a|+5c>O{n50~=Dm_V?)2;1vsB#c zaRWZ{e`Nf`zkD~)eE+%qPwHD{558n_5&C#H9@VclMMWL<)4TUC537muK2w9+$;?(nv-f_h>l_N%Sub=X+H%AL!esQX7di1l~7Y-ckw)Wn6bCbN!7DY}>DYl3S zG0!0(8@QTJ1Rjol@yg}Pa{|}g_5GZ|PyTWAz6rq}e|+xGi#yG#{&h8bOQ*-G8!oDg zw+Tbj?zu3W+Z=bLZ|3(&;w8Q9?XPx!^ysP|YJ#?JKUa_%@#i@oRj&z-ni_QGSk7BP zQ-{BM?z>kuJon(+Yc6c~YgW+jFK0gRX2yiKFE^|^H}}*2nLg&lhaS!t{ZRg%75B`X z^Pxc)ycy9gpZqY=C24e-UqtzRqeC($>^hhE$>*(_AkD<{uvbi9r~MA z47rv*>9^A`fhh1f6tv=h{xbc6({ume@wYXTmi=bivA=ab|IXFjAC-Uo)-x|ZvArQ{ z{aed?Dc@s>535#&0PJ$k=O=;}PhK(Sm^ssH{P>2)Xa9r0=6meewO5`YmDk_=$N1r& ze9`&JGxPLcuDKj}KrZ0Z7r$(HRZ*phA%bsY&l9kJrGFSXm=|6|39 zEo6M&-n8w1wU~UyKRWC$X`k;HKfd%&*Y8+V!ikA{KL6B#^nZ+f{we?C)lbiwaNpCT(jymtvTDbN)G|MA=z96> z%Vi529#hvBgiSmVLBOBqVoFXfiu3oIHWznV z=BJFCTD@O-D!#&f<^Oznd&Zti0hxO*j~VN}y5f}!yDzxueEwSXr`O(j|HD!KhC3Jh zZP%hrPp_Co2%vKeUp}C=DhmK|IPWE|eFjMrKdkwE%28t;;!hd?{Yaf4m zTllu!5yGse7T#7m>#YmJ67Rm}-iK2j+xVx~-h8L-{SQ9;>&K_hwSDpUQ!nm)a{rp5 zXRC`ZU;D?mKm1GO*4Hp#@QV9fa25D3e&~PkL$S*Ci||9&q2K%rerT3wq>6ju%h!tk zGG^`xw}yeLJO2v+dJ6!ccz075AGDe0UpAG{G|J@!usW>Rera0HIhE~rL`qKQkP`zQmho*!NLSw6%xF%y*sJ?0Dho(TY@S&+J+A}d^z>X?s z*qwWhzEzX(nGJSl>wgTpQ$W9waV7D1n=9D=FHPdv!B;6B+W#F(dwsytj`Jz%5oR}w z?r_Vwl%#%tIN171gIgTl-aD;L+3e}5)s?8Gc+W7MHFglZrY>6OD)xMU*Vnmj_X+1q zGP(FWjLSVVBc*JK?%Y4LsaK0DHA9vXa_7q`{-&^bs&Pka$uYw)V{|yD8BwucTR(7V z?r9X;;%14{1b-(~mh=mX$`Ul^fW@hs<$4(AiFZUxHZ@#&T_68Rw%6bnJ`0J62G*o6 zBJmU%jYtwjf)L4|NH`*e6q$xdMYK_xyr=Mzu7R3p5nq$W;Iuc!t7+E0$hT~@Hf5%M zkiVv`%6F4s>O10g6Ys{6f0nq_qU@MYcKkC zTJu|~@ef-rsDmH#yXvbe&aF!yBLJMUR#m##%}=+)E90sk-A6l!{F zeCbe4N=>@Clm|#?wz*)5TZFFOe2mvd)7vBx{%IV-ff~(=+Enl8mZ?UUwvuBDES?SS z#VR1k0A4T6=hZS-wWe|v)8K)!+a*_- z2djnesOQErSHJCPSzJ=wrAGJLgYGv+m73H%m^Wn!`Z})pcjVD~m`B@PG-x_Ml2@ry z$!5Znlln&-)p8{HAQe8iRfomGVQwbT4Q|w7k5E@zVJrijta}N&!%X2hZZgXGS-8xzcdZddm3?a4E(p&AIfl~@Y4G?@_9<< zSJ@sFSKwQ*T9fj>eM4Rb7UD#Z$O+71g zpA%jh8XT!=R{e<6k-|&w_9D--zar05zar0*zar1$zar10x0+`)d_eD*iMYE{Uo>>( ze`SgO!4Po$h9&k%WBefZ;^|)+Gvd68XIA&GXdhZU>+Sw~%Dju`e9Qn235z!h&IKM> zYb5kgAEbAz=t@Fk6w!(J(LrGXez{n-rSp_9*$h5R7WI(47VqtwL7xRb zh4D##CHPdIsmxZn+$!)Vfxiy?2!;Ho;Ew_QXYj`=`1JDl2+*g&AF1Gv0H3fdB{x!-%lZ51U|{#4L+)4)w7f7S#PK3UGNE`^;z(Fh5R}2<#*wR zF+Ocj)x%lDC*Dw*kGyw*Pxep5kJ^FkCydy~!6(^x{0K`_(WPelkWZVcZTx zql^d7f?pthBu{(+{BfZ7;V1i(`1gY!1l}k3Q9fDzDe#G=Ns3a>5%4Mh1n{YSWcd#8 z>6(-TKGlQxWItiJ5@v5U_*Or_et+<(pV3%FU7zH2uqPaR^2<};%k?Eb-T)EhUjg69 zjEYKegk#!igk*&5rNG`1CC(rJjk5?`6lI%lH%Q`00#4-H!iT#$RH`f0FT6+wuRz z_~mx|_rVW<{m+6g_d^ZZ{Th=$Vkhs4PDb@TYsdFt{7yUmM8>DSq4dLC#>d`y8-6W2$_}*G>va zPCjIQ0Ay)=lnFKH5p7_7C-2b$mp7j4xeoyV&lb(NMYa6tYL6QmXsLDyseSx1Nng|8j7_0-fq1CMM6&nv>g$-0$jz)sI8dmYRRk~u&M3ZmdQGGLP)sWJA1-hv9E-P-6E>& z1-H2e80H>On58aar#OhgRXeaH|2VKExM~Ns)J+`Nl8YSJ&f%s*ouf^MPU`lZs7c1z zQ@Bi)um##v2#DvV4a{Co;L(aqR`BS!|HP(V2~nDX_9(%iZ7uk98-Hz-OTf|p4zDGsITt8*=-TZ>c9O4$y~$1_?RP6X5y1u73D^EQ>_o)&^6Nyv;i~II z#{OdKM8xJA`@e#tt!Q0_qpjflhtCuz_(LM#w5k@s}Aitg~6NEkf+Ap?pg&==uJ`&JE5GuN7xokOK@uuljA9yjM|&*6&r?z9aN1 zY||&0d+n#Ny?8wcVDTbek>ch=DzE#Fqx+jGOp)UL#J1h7fL0Eu)mipRWu!ZW|Ls}} zCtZGleKrwzTbW03!{lJ6ogW-Po5ed1+Zy~r*zFzwv1P1gs{!n8$a(w7D9v`#GDNeL zEzQLpz{4eWa1ZF#!99Rm2RmR}Gd<3|gu5f>##<5U?aU08QK{|u4z*?F_E6p6ZanIr zxlM9zUq}yr3F*NvAwBpd#KA9;-61{rCB&f*F!^wHD%`?76RVNkorbl;_WW50@uaZJ z78D|T-XTGDy+eZB*X$FlQ0fi|vR54vWVbpb$bNN5kR9ugAbZv!LGE%636rco7n7Xa zYcYWyZ?#xc*xYQ{Ua_p;b^jkQ&HuOY%uCeVn}l7HN_gaWZU@|)y+q@vCOQx4gm;sJ z^tGUYv9p(GN+%lM4Ska^a@He#1!&;$>?NAgiC%#8R?wS}em7`f_v|H_(us~iI$`l_ zLHZ2P(~wRyr4t>3bi(g>4(Z{bgOE-%r4xPKMatiTbb68IE0^y4L|;KV)d%7JpYVM4 zBGTph5q$yaRG&*ozXAF@(&hRQeFo`NALQHrBWPeLTkA*k38a%f(6hf2^l_xi_7M%7 zc(MNNNbdrD1nF}9iGGQtqh9-82EAL6PPB!kFG6|+=naZ=qVteW{(_(PZvvfzblHDI z--mRnZyM6eK%|X&o5$Upjh@Qgq??Ji% zIzpkJ=&?vAf9ytj5a`iJm;FOD$I5R(x(@UW;K|G76WvMp^~nDT(%nFRMfmlgsr`w* zf^@3yDWq#aUqHHCf1=MLo$S4V^h+wVC(>p6iN*_|qJLa~t9}tQcA#1PL-YZbKM?5$ zLBFiXPc-ndMf=7go!+O|jda;QqIV#j>KlRdouIcOU9LaTX)J#p((eNe41a5WqJiHn z)^9D+Q$Z&pU9KO|z`B;&59t}8XCPhnAJH*Lr}|bReG%wsNSEtR^kk${|9B4Rvq6U= zT|PgE_GbEPkK-HCx3Jx zy&aAE3DRZ%5PbwcymKPr|DS>!o}KT17rd7tM>LLVqEn%V^yVTx1N6O$a)`bM=~S=v zNY4R%H`3*L61@QFqn>y@;mv~>x3;0b`hth&zI%zrQB5>n$#}CF<kt^j8w2O0kWNjPXs3Z$wD_1%cSlk`R->U(m?nsoZeJ$Gn28VSLO%xPP)Z<}2KzES`fn<|CpWT<_@G!WndUZy5&nBN@c0 zvy?JEVe(NwB|hQuVeAy+gw1yc$?Gw$A&uU5GvEO&VF&Mnj0b4K>m;8JM?M+{{>b7q zhCxK+)A%uh#c3>}wk3HQcTTf7jbR@!ox7lu`ZwjLW0)e2>$sJlsfZ6mep%k(>j8?p zZ1G`k?*jIV7QIW`uATHQ>#%szySV*YUGLI1%O^}!x(VoBO<-)?$T~c(l@a{yK1-l* zUAKhw_SNRI1ig#W%`^Kffl^Rf6_M?A{hv zh={P|>8bKpB98xf?I&DPMEo%tvoUmYarBRu#&G&BkF(?O6}%e@xdRAsX%c^UHA_5h z<@*o?cxjsQcAY7%F%EZQ33v0KTpaS((;s?ia9g#&qn@J^fJ2QAbs)y9V_Uw zojEHdj-CA=OsI~VnRpPPvrp}v|wyy+3OH60jBv!)d*IXfhuVtV$EUw z9)h@(L!UXd*O3Sv-jJ_hI>MlXe2Rlqi-+Qy3iJrX;hPFs(9wwNcoTFe4^+>3FdaR9 zry|TB_m+^}iWjyiUl!~bjSz0Ow}T%2hDYxOT%gi^>Ywt#>SBE~VBbHk!wz~ce-Z3Z9!h-*pE~_cMW0d9H`y|OUWc`l*ws-QRk^?W_+;y^r=FPyt!+9dRh1Cw@CX$0O_-3O)uxy#8z*1E>u8(YZJd zKb&Gc9tF^Ydp(DPefz?-q-O98cYNLA`hW#9GGPm!K>C_AOP5>AE-3aju7KQkN zMRONt(PczK^1@A*88MyTnMk5APL;uf*K)J!Rn@39t%m(7Xo&u9MR33jq~j|NTt`9I z9siHBH-T&F*dE7k7LtG=1XK*GmrbK021I1DO#pG%xU^5jB|*TTED;cawi*Z!RJ6DO zD%D`A+SXcJYN^`FR*Qlbms+%H!MfmDiafv#erM+1kl<_I`~Ls;!zHtvIdkTmGiT1s zoqGo$e(E&~mvz=*ydmvh;1dlHUII?U=lKH;3$>WxT7)LG$Z##&d$XXHNV=A=w`$43wPZmpWH@TcN4>pWAKP-|~j45naNuN=aPUcv*ldlBT|Q##<}3gQgnDJPr<>GED#XZ1KX z;(^&mVW{+^UURQ$O~1Et+RO%64{>rEF(zo7tWzOtK2rAHF}eQTSvx2y37!`Uiq;Oh@Ughkfb z}43S*wH?VhTVYS|R*VzV&H6Vmj{&JhjT!Bz(=YU z3Svl)7*jY9>c18RIdFQ5i;BecoA;2ILNitLEPx%RI zDF0s8KC)l_={IKKgcwew@p$sUpfOqH!f-8*sO3q*d$T`=hRV9_m|*Y#5W|v{5QqNWStrP(z4z#y!?NwIK>BBMJg)( zVp+{!-b!;vVnSO(Rgp12YnUp<+%L<@ucE7S?aaktL?R|}`U~ku}*Kn55 zfN$D(6ap7DX!||ZFABVk0{Y>^6^|N;{4}yRP zX6T$J7(ooJ*7mj96Sw+2#)sOATFukAhK~(L_yF^U-Y)ys;0%l32Py2AGQU7Ivw_o0 zn$rVb%Q`pX@-y3y_p_|bUA57k<~`N+`hIOc`wF$a<`rstl9&lS^N1wfVW5sdkHq`2IyLER{*Be4^!GhA_<~) zA*wuI>5s@dAK^4vyU@m9bE#hBMAL5f$^)eMVKXW*@KtY@HO42v@;Hvmy7rAEESyI` zUA>ApB5qh7j-JXUY z3;jI=hh^-iB2E};`We?$iPO^1$!Bat zdkJpA&X-7=3SUb4d@&@mta1)$k`v^te~IL^9haTaS=eXY7~oq9RZLf6t7|w5^E>5b zGw9J;3<-AdKiUxWQhm(w2phB!G@U^7$=YA`$)ECS=HNEWdWrPzGKQggL!%o3c2w5R zH)#WsSRl~d+co~Bss2fzUCeUo)bungi-id`@b98RzZJq8KEG=p^cVDEKyt9^EiMP zd>TYa`wKbz|MP_wdi-lO)kfR5+SvR8X~eA;z}NO?7=~)&FQ~__MD0Wpx$px0KmP(@ z{pkhjZM7J8)e9+ve|SOr&d|qD{KN}FJgL!8r?k^2(x~l-qWzE`);Oc{vi!6PQ3V>P zVyQk2iN9=lgpXUXm8Le03Hi83B8f;lZ(xZde#Q6^2h+3vtkt!={(GJdb@gX$=NT=!lj*0Xlj^! z_(uYMY3D+GYM{C51Aq_4@Bu&%YT-Dj5oxve3&Lw%hxBWPN7Ms`2l6fy*gHbm3HcBtf>DXPTcH9|F3tWI<9pabvCOUtQDqfMyK->paknIV;h6k zSpw^9Z`bK=(~}Fc$~DkqcLA>QZlqb&a;gm+&?aw4{j3{l0B9Uemv**=7&Qb@u%o;2 z7zJ6-jU>=0MdiK0_Vsq@x@GMrXOFap6b2cN&ai{|A8u_1v=)_4?Viz@Ao0O|jI4eB zY>XSE3f5eYILlHoNTNUrkV?Sr3tk}_HMxxpl7&OeMh^BJsF~p`%nfQ>r_OJbwfA73 zVMZqppZten*}%;;usGT6$VuIIgIq*r0i&FD-uT0m?o*e))soY&cgh;r>myd*I+^0_ehX@q@5KZ@Y~m4d%BL`Qiq|G zti1rk5FXTca|uQPY3E2>OIp}C7_ozzW$hPfJZb&#gg|Ziy~TaCNoc64{h)ffGH`8c zaBZ&rYP*bUYrtuE%;AxMGqM-`U)n2$|J3|{aW{Ko+xHBQe?LHSLsF1p4{1hcpdGY~ zw%2BF*=vSdPggLOfq(@GsWSq zfZ<_}8T61InExZMsBctiA4bzV-5l`Ht>pYoE6?>HT{E<@+nS<;(^rbIjr&$B%X^Sr zFqAk;m1u8GH`K$}#(S$oQC|tf|4O>V$-WZIZRUSN*@u`iO{XSt@+c2Et2C|T~XW$%ajqC~IZz%QU8}RB%db$q0fmxe0JA`|Q;V}o#*q8*uy8Dgg z5p&Gxt!frJ{}k}NJ^qhmLOS$^o~~?MZzfR0B3+;~#nW_Hg+M%7{YKhpp{8)S<1&V| zs-CXpxMUQRly<(x^itfvinzZJ`8z#b@4Z3)=fFxwPuHwBga_i-G>Eb3InL79C?Xl& zaEeY?ni?CuhKNmxj!!1=k)b4hctQmelVX?0CeZ0>WfDAANr_G}g)k9RQruv_=scK_llcFP) z$Qzj%NrjU`*WI}8lLB_96#t|h6&ko_4;p%93D=j%i znXoL{i=?nECCJ!hGAVl1YCs!BDifj*lHvb}BQb_VPfy61bLUde+Wxs5ej5biO-W27 z;}R2=dy(^0(PX?bEjE62JP9Ycs}qw_pt`u|gyktJgvleSuRyX2GU*a4K19$3o&7MBhyGpl}vyeDt!!`1t6gWziI=6f6x#rX-REPQ8s2 zXiflih>bGAfOQcuLYV+c^L8%oYm|%-APL&>Hc~PMIB%o~q`EpT3aO^6ht$2FepbcM{S`lUfbBM2Q*IZ`3LbMk$rC9*Vr=*o09Bz5(JECh;8*NBa!Wh2Zx=d=M4I@oymxfA~WA7a(F|5^sjM;k!gAzXRgv zyI<%+@c|Gaag2(4LLBXFMHkAS266PAIdq};N{Abt*P-}oh{F%QQ2Zl^o3=L-;)ds@ zC_fkC0u%Th5O*_)e+O~H^J)Zt3gU+6hbVp>;^@0z=tA-55I3c7AbdnjLS^IpFo=7b z#8V+Y)+GJ~#7*(lLL5E2M;F5X7~*57D2_XbsP8%&^5;T)v`Ky@#NRWC{|fO{Ch;jy z*)o&(R}hCs%lJa|-GI2CN!%LtTD)r#pAB)-`qn{wyh;AI5J%5*3*e)KdbrEsu0$Uw zq%XA3;O#3uF(DSVz7TPV%hC3y>0p-Q0^_5TlaPFFNDFBJbl28>G@MSQl%#BVV;#a3ABjcbNbvludm=FTvaKC)8l;AW( zM zr9)`g4~$X9#;s1G_)8=y6P8BPfCo37WW~;tp@)GjZFU)5h8DSbPA?0Bt0cM z89`G4kW<3)z8a<^&p?|4lTa13|3NhchzF02ZiF14BL6>YO^S|BOo65(#KbO#qBE2U ztCew-H#ZMNy%NUyi3v!|QII=v6=Vhyu-yTq2uzz6oett%9SNRitQwjOJfA~*02J?` z5e9lNae@Cgo>BuDlFWMv$+625qNAn*12F!%t7E{i2qcoBR_uGtOPm584Wz_^@KgMJ z;WsQ1+766>t`Q6Jgi)>^Pp~VD8PiXY{|VDK^8J4TrW*QpsPR~fkpk~96@hD@jW`8Y zfnpd4?-&e>O{V-FW4ZpSM^kLfo&sL~-+~yF5LY@2PXhiH4(M8=Op1z*`d@(k5dI^3 z`a%6~ZvH*^Kl77P@%O;xl%;?!M6OPW{zp>&2KJv38wmNoq5fNF3V8zR^na%cR1fQ8 z$v=|2EpwIcM#n3;7)`)7w#=^7sGuJ?vrpo zgPRME#dx^q!o33SWVqMC{T19N;ckMv1@4z{Taoa-0^AGXj)r>;-0R?Wfbq8Ztugnm z!NDMm*J()myZxv{s=rhc=u0f~_Cdc=e`1*rPLcY@di%tB`^EZ5mc;r1fR8T)KqW(( z1Pb|4X-go{SWxQiGsW9)Szkd31q8_e2hIobH^Ge{@<{OYU_+RKNwrZ3VR*L=^T!^- zTOo{i^=w zAHokIyaMX_0m4q;h@yIf!GR8^!$}ZMqr+toK1heJLHIfy=7WR%k`BLya3(?d=mtL> z?Wsij8Q;D%kN_;~^N$hS-(AROyIna1Pa6=aZSD;&Skh_M|C6PKmQkPP$OM$RT zo1Vu_*X#Tw+%%OomB-DHaw{FHGo9|k>vLI-mz8ihtYcHD;|+~-wTn|zspVNXofdK# z5}jJ1OBZuB3SCmME?vb+E6^p0bScGvla;K|0jeaT0Uu?1oyip|eqwIwWL>I? zwI+?bM#X|$wS=ot>(;2WDQa$V@!!*5?R2};@@lE`4TdwKA2-B=a#WnPhR0p=--_RN zak^Lq2lYDMkPZccZ!4XlA`lcwE2vtfXRYnnF8HtxE!q zK|s$ikqXqyvyr&IK_A5P2DD9gv+24F5YF*yjwIa6{pIy9(Es>2w=4+#r1g z3v9rNOi>Sf6L}r6$CC3G`ZzMHk)t`DDP}9KSB^c4609o2^5Fz@ZSZzD3Y`^nH`D=+ zSHG$aD!`|$!`bsqp@9&FW6^81!HuB~#jN1tGIaX5o~019RHBpS37Oy_99~We;1K$F zsZ~pX;7KFr524@*({)9u^rB-mPbG%#t=K?<^8nwY!LjwqH&}pCqj#my1f@9GuYl6zOL5=8Wb_Y0u zxhyp3cxKRPZP0NBdT5OxR!?P|e2sa3p0&?dL4gd^&Mp!TvF ze}X+BTN?~#(j%dS0;v{zY?D;VQgiTm z^)M{q^Xi5Cf$V+7LiRxBvTC7Y9otoC6ICtb)n!8#u#iZl{J9E`A zUj0~^f+W_H1n~#p@Nwl?pmXd8x|e0cKl&W|0yxK>Jww>>lOsa}gN9jyH918hWwWKM zU#Vl~dxzHtZ1QDXsGVtjSp)|eXQpup?ZG8vW|17-H!dLnG`%l*FJXSVhU-r4)b-BfY<=sQVcJ-LU zkncM$RQh1@+%WTPz3*;${(7K|Kwv{WpboX~9iFsjoviHP-bQdOLIYFO)Uo!x0|U0X z`PaW&dcV2(EL<^MLi0eO%dn|@;2XO^tZZL5d~$a0`jT_jCHIyJV?&sgKL=2!-cL3Q z>&>>%YFUJa%{xgQJ3sVuO)EgX9PSG~B&g}$t)LJ2Fo(2-SEXwIrF^kUsD9L{1F`Lo=M z#C9$%LqF7}`B35nDXx81L@ho<+l;vJ5V1*U`ixpMu#>y@hv&xD`uxg8k zvF;X+VX=35vfOuCv%+@TkBtGZs;r*xuW#5Mq`v?H3LN0wY_5>*o#^kcZ?x6~Fy-PJ z@k7Rr!cw+Ad*)*#z0W6#Cg^{0-R>w~X%}uKX#GaW;&MF(MHFOewcrI2tX-pjs;rWk z6B@=Z*OVR2nuGy9YIQR>dkX1ypNaha#oqc`P*ujX=4oe8++U(^&f+^dZr={?#5by~ zIa3c-hyW+ogOjpoL#CEBi#64mSM0{yPrxawNnSP2s~EB&%Q~82Nh`Z-fHxxQ>OIi} ze|TjkfPCyjI64YbU8V{IQzxI|%emaz#d(*sEOEP6Z7YzK`L8?8&HC)xKeu4zeE0fb z6`u*jh0QGcOf>pkf6czM~T^Rpq)Ml~%2R!4Ek%DQUX&O4fJ{{An#e z1f$a^$N=k4SY=4KNqTNF$ptf%D&yATu3Oce z13q6WxOx&@x`LHDnVTU-PETsLSy~$SJvds-^#j+c+bjvZG*Y*;n43|cOVQ{CUjbr9 zWHU!+GaWQQSandIHZZ?tOaYkqQ2#?xRNX?c*&=Q*UqYVa@BI<*RUEvqPO;9zx| z8EY@r4PM>`%pCBUX25aG%s)xNBZ=TlBO29OrB*KpD;R|SkXUt)c)V;I03&^e9613` zBvzvi8e2*L898f&+|?r8QgEQbH`40{$0OuMNzuq9f+s>a>e32Of#Bjut9xp}zbgeT zq*YwA;Lo-JcjbZ>so)G%DPc9rK2^c}K*b#o4bdacsNugnLz-7W`b3rG3HMo7-%S~E z@z1WEixYG|eeFBwO={87v&T<+3VyEtS|8MK@yeAyUX0@D#@Dx`FUBVi|Jt#*=;Qk5 zL%gS3&3)e1{(5k>-+E<6@h)A_SIX2~j{DEtJM71h!lzt_AW|aDYni!~Bs5?x$R>#p4s+Z*(tIo{H;dPi)?InyQ zKQ&gpR_PM*##r?}%WV6LCRHcS&r_IGeV28F<7=$CY^bg4O_QocvU1rbW7RErIlOL@ zs%Hq}RVG!ZM!JOb7^{vPob7Per0TEc=jlzVzH0VYZlJMh_c6AvPfV)bE~`|On;@4g zb7A%xk^4A=@j1c9;&=UQT{}#QUtWJ+(decC_9Hf?O25&TR5eeUBE)gvdB#s6?A|Hx zc^SBX=f3aGvg3cihFK8K3hG6BZ0WIS2*!c=%*{ ze(84jS^|n!2~?Xs!-&!-n6$$M`tbSo9aW8!DxoTr@I+H&UTQwx=< z1IFSHe|2JhVJI#Q%`R|jDXBcc3alacH>8bytxd}>r^sEujNrtRZ89IUrh^IE!uMJ^ z`BNjt0J{`j!N_xR{F)!M=ZR0nb{E}N4Pp!Gtlz{mI%V}$SIAenc?USwH zeYuqn3k{$T(3>Y|r`e^5&3SZxm4Cvyj0MReeamu^Kjt`i@}BuZ8!6fGKGIIJ&0S+8vf~U8`L&VAJe_u< zZEm^|!1pHrC^rJ|3R$(boD8F2vg^TUxf!$!n)!)#n!`<#W=`SWa;Y^T@`%8zKaoqg zL;Dl?t+w87tr0`x2Y{i@1cR-WaFOWI2&3iO#I7su^r+LX4o0-kTLuhMrF^tuYD$r@vwtMIZ$KZ=uIw9 z#9w2?ApR3DOgCa^e9SEx!+&kWQ1==zsEimIc@{i>{u?6(l^MKPIMawhF0v@{=l2>h z@T_v430D{~$VXf70{AXF`s~8NA%H<{#LyUQQ53*;+hOdo9)O|Sy{{FG3oME}`EAB3 z>c#*-oUw|=1dF@?zPqssRWMXB$5@4Yt;LW){xD+|yl}wq(pZIjw?$DPf20v0Zyo?7 z7^{$1SQPo4o^2zLV0rYzYdxptP%wO`TMNcG$ z<{2^k0vPH{FgzHw=zMvo(XhS#SF1qwudSufeQ^(dTHeTDp+#NFI`clxsdwTO8Fjzo ze8?K!TBGjgeUdZ4{;Y{&P9AW}<%x-6mfLzQ5}!sHtaA|dH~VTFc@DRU8oAl7EPsxYRz-I!INOXa}sV4C>lA;S?)EsbpRN0rR9!JcEH%0 zHxC<~s=qe0Mw+lG-;Dud`@tn#iHgPW+^WPSfiJ&2(RA08n=mdTwOlC6H8SqP(>7E6 zo1Chvx2rU&m;9yRmWyVZamXC#?6pcHHENIC%IcO&wh6!l=iBfOx&j)AXh@Yl4BpO= z5S0WTvcMoN%8*JU+e~FYVSb(@)I|0f(y+*G6Mz%|keUF@`=GyaRCV=hLhFyZ$9#_5 z*oC6*hpyq>F?J!mo4c?mczXAds<6Q&yF~wHfmO4cooyfKZVK1Ap-VP;p;bgaE=-|dwhTGJsa%;V@qw`yOXuP<&cridm~qs)@bG!4P^6< zil|8Gmqt2=Pg~R@=`f*luZPzfQIrW8w`^dj@h~A{_4$ z2^p7{-f`8*%8X?EC;>7GOvq>~uBcSDnK*arrZ2iFG4W92c2-nmZZ=~0W^5H_yvw2Y zeB42V$eGiZ47;Wul$|s+7gPbr(A0W(OkxIRZhGiJ_49&t1DDG!vI0CpkN{I=WP6OYJ`B9%6mrI32+CO}*Myum&-`ku3@i+2lH$(# z+Wn31XF0h(4fcKmbU?BOK|%zLX@n%qzNUKQ021$f zLJ36f@tcQhOE*hlTPI^) zwjeif@;>(vmfTu8F`UQ^Y-n-3%s`Rcz(yCR+jJ0~aCXzdGI(GQ1)~mXogXoVQNhsP zUNfmOF^*HG;~WBO82!4i*m+P=L!Un-p~L)4_{c=wQvsmo(t^dsY-6 zt3HG#VSDr-D#>l|yi!BZ@@g|347H6>4yFLKwkt~MVCZj=bn%h{wsh{0jM5=gux7|w z7e^`>>Ub6&Q{pBfOipyr>6(i(9sKP+jj5^B>6w8hkD*j9Yr|_gN$oO3O7j2!!{}g? z(snW(>@FReK?h58o-}gDvsHBP4}K$@Fir8=>4uCB)}(jRWztHAbko6F1^*=-d_Qxr z6iYKV@O8`3FggeV45x$B@3>EI`V2elpxnd2yc8jmHebdWVH zGQ<#cx~!ywp~GUb46s9cN)17$+f|03!=_C+P)p#0{m?@n|47PhDFQoZjyq}oImTxH)JP4p$xxt14DcEmDDdfQ~ z7!=6k3>u`~l>%uzVNQWm9A;7=f1aX2_|+tfO7a$IEh#8a@?feUxj{lzyV+OH@}Yy{ z6xy+L@I6INAWc_9Mb5wI;G(*m2s*g9DQ7Vql<>4m>7bgYTSW(9PMF&5urxR>-m9^6ZMAy3MPxD9ud41VEW5(2+)M~5;Z?!g@$mRTxT(rR`aSNU6^ zV?@JaBEo%egu5uh-6_J|Il_H(g!@HEY9u0Nv=I@`wh_)lBAo3aob4l=9V48FMmUoZ z&Mpzot`W{|5zg)r&ch;{hetS%h;SYi;XEe7**n5{Y=rZ;2xq?tXa5N2fC%Tn2Ib4MAj1I;00YaFUv<%3I{4@Vgz-B8BSL%77z z^{7O{bd=!}gfcGY;}XXbz-M3yeKk~-JU9M%`OBAKN$R_4aUigg=c-HC4 zeQ!hO(cOY1-EYzFHMRuITjF=%uRsXBIGzBZlkXL9b_x|TpDc3wh#U0@fvuxw?Y;6W z+BIv{u&m@=Oz+7dpYQwr$$o9KGQDE){-S&2nu^8mTR82RR{#9y%_YM^??oruFWvLF z@ba8vtYP{eo$r|0MiIk?yIOpOtIg8gYf0U?q)_`rnfm>7+mY`*hz{U+t*fa|%5c6b z__lu3=vrTE>otTmIX$e_W}vcl-X~B;#cRtk^$*hvCNvx_TC<`ghUK0Wq~QsNxkj#^ za^OflC;OpFx+rkiw4dT`ALobLubA;ud(w5wesvvszj(UyzMA&7;w6PYZ+kXk@t)MZ zt5+QP{n>M&Q=#ssj-$Z=iG{!2IlAb;wfVWM>J(qn%W2zZ%T65U-=9&hTCpkGpPW94 zbw}g9z$eC`UUB<)ez>Crr{>$;CHoKj{!HR9Z?BQgMo{7dw=6ghzZ=&ubK58XPF=9a zIiluC#)9R71J_rlr*{u4T5ZVHt^V%x6XyrI#3a+)yQR0=o(?-9+vGk@MzH_Xh&nn7Bh8TLmp zpLgYw#((6I8O`N0y31z>kIWF4ZkxdW$=mkM@7h)NQAztI2&cpib2>1{e*V?h>4N8P^>K?&1@G1Ue6MBq zqHEvOKTq#obS+j?{Cj)q8MbRIrZ?O`qZJZx+_mko(}$S zTYcb)%fA1Wf=$0CWZ2F6)%q%rm@?W=$gC!&=|pw4PEs~+p!Jd3vf|(;?-cF5?-J-~ z_3^{#?`HQT%&JfMBr@^H$>9ACzqdyREFCuM@tqg*_vBt#z2U;c_T#TS8@MfPM|YQ` z?mdu_e&eHS);m_*|Mv9a)u7lbcWpNG8o=VTAiiy2VXD5v(S6KMk7Lt!@-0rC)30j! zXrHz=x*+JnZNZl5`ch5KVAm|w4W4jNnfGZ9&o+`AeL?#4Wr@J1NR~J@Z;!4>cJbkM zuUV&l-j#Xd-vLg(2XyyR8Yj${q^%}Xcg`GBzkcPW998~9dCg|%h{wk@k}lcnPj@n$ z@2~mo&lA)3dGFU&4ibQx=k=`BHYIjlH`}+bUY{!3oAB#z`gAA3y84IFK6#5%_dZm~ zGXx{I3>I8YURnIfFst7al6LJ`d#dKiqtl+c^S`$pE!p#J?)85kz34de*yHy0wi#ZJ zCr|%00GWobV*_t=7k*ol@=5sflW8-H4%}M)DCps^qQ3%NulN(6Js@AcvfTCQ?@1>I zgiS1xJv|+rX-=Yftrg;(mMgr}aobLA3nX`bs!M@rhxKis!v>-CjdpU?U*|!Q*T`GJoR(R@xxAM$JRd^>-5#94_cx>2`GvA z^&VEqhmIP|zqO|xwj6ipNImwP;@<<$f>XC`i|!@cwvOiha_jEV58qi^U!VMmw&SLK z%z<-L#((d*1{303cI95|s!x`jz+7-jC|Z4Ay=!q%5wb>;R4-`*wk;uJ!85_JPg+tJ z{3`fkXLQ%j&DSnHZ!=|Ehh^WOBL8T~9_`(G=?fCZY?Gr(c z58cvnTJ*K<`pJpH&yx=-TvSoeEQ=jiW-`2?EmX!7mzXc3( ziuu=r==1{6#~)W`Tz`uN>J^-cA6%co{SNSmCveYEBXWQ4Z!5XYptKv zZFBq4fK6*Mw=VCBfG!|wD-XWub)`P(dzSpvI|sC96UR>|N!3>CZNB@_>&nCE0CB)a zYh#Z#S^6HXzZc!*Z)JbxT=bASXOLmofuw>xFyi@MM-u&?dc5V6Yt>gST-2WbW6i0> zg&)^rJ;Cf96m#tNE+4zFb$zw>lfYtq*>BFE(fao8TM0$?{_v>-9X6l!2V?slZFPeD zM!XepSf2hm;oJK5Rd(C=7yXtzByWS4_GU|}U5DS>;=KQ@<2>gxzdb$rA&BqNpMksi zV6gVt$nP>eZgqmi=2X?Rt4~cIQ!jf4KN*1n*>}Mu+`h!tHpj4aXJk*ygRG`rsek$% zWf>&zAj|M9BVtjZ_I6C;X@Ty{y$&CW7HpmR+EBj8`J(oI>_ca zz|+w8$X0`!*W5n-wC8~bh-3UOey&e0I2}Bu{%N!i&uh%?D``W->8WS##dg`5dQYxb zV;qk$l!5lb2Qz+(iaL0LYE6K+NcX%ERMPK%tU7d06*YR#-Gmk@J?{_r^A zq}PNsg%3J>`U+gzSrePOc!~25=c1ilzMzL+!TEbF!KnDQj-&_^o|GM2PS^JkyxV7z zQ)q;qmHx6M^>IUs?+=s?v*g0elUNg*EZCHd)~I^gJ_^x*d6_c{#`e_ zo-#v8$f>xcOue)u^~zgmmg^HdD-@b8$RD(l40@1!LnT& zzWC&eJLkUmvi$rP!@oLl=ZjH$*S0?zRbFkg((~BGkWpWK)3l=gt8be(OgsEt>(R$v zr`s>D9P>ln$N>lSNprqDe0O`q=I`#8d>}a4TDE)h$w!Ay2~IsZ{@dnL&rZJ*oNlXi z`1o{tLy*j>;B*Z}K)V|g0K+7`!{L5vA`q5j!5`5_u^dK&EZU&V*L z#MJibvHTF{>MAGL4<92j!(dv62G)eS&A%}Px}8?Wpd ztkF*I7Kv4Y#OjYW*z+tHE38F3+u>z|YNd0GWIfv24O`)kvtTQ7FxsKrHpsYp3-)kn zbm{_l1A?0hyWwCbTAFT+Mz<6eAVm0Wh~i97*kt~!8Epr9B4I_szC5&L5C6ZZbUg3k zSexl|Udg#ufOcY2`>_KmYW!g*c^)fhdkyT=3x1sybd?oUUc>(>R;Qk?OHyl7RA^UY z3cO^Y*V$d1YxRtUooB2pn5sNwdmnEd%c{ba84^a^~e|{Tph6 z%0njrLta-0-wh4QgJ@0uj}|&uF6gEt+9G_}AQ zsdG%W%nxmsgT0LjuytG_NWfd<=$&*p<&0d=EfL%!tU3w=f5I+t3G2#P*xLxgt+Kpa z>eP&0b3iYooNpNd%!GGRKvL(?vT-^I?*zebr1NAlG>>l=VCP=2MS8ZbPUR}+4f5F| zvU8bKS1|iSJsigLfh2v2Lt4pY_xQH3Iw%vLm};Ih-jhrkZ*D$j41AFxX=QX0{>lUX z7I;!L`U;0^HN2V~9TyERM$d^(S)G)CUzwx6GZ32^Jvx+pA6|%tmzqtJro=0kN5eNL zViNyH?p*3kYU)ejp7aOR;qB?=(XmkY@6S#&t!R=mDH2r`niv;Hp)$?IFNl-$>xQw> z$!nIu3(iZ?CnMk$-lfs-hAxiCr-YLDrE_?rFD{y#KK=a}B)s*F8bx|byd+-UqxUZj=?})_sgjhAacAStxBD8a3<5A(zF`=VIk@G@ivZXWU&OxtL$HFH@ z;GO;e_y?CHi>RyPG0EX>Jk5rDlJNA&A{x%|m_j!A{I44S$LSs%DPRzBSXKZn7flsO8zF>YEoARo^|k z=dQB?9<|=Sd%o#>_5Jg8W#?NT-Mx9Jy6MsRUDbE5oxdAyemK9W>B)^nH*VKG zYC6BDp{e@f{cu_N^xrBjzM7+4c5G$x6t_{ypE`ID@HFdluxkUL{R1pueR7S4n=xNq z96ABIeL1{eQImBaR@E(G<1T1Cya+_~L*f!Vm_d7rxD9xVE*J;2bvGCcMFDu>FRo{N_MM}Y1)t=Ta@>e{k-IgKyA`3{C%$;Vs9mb_BsEk*`VGkb9l1!85i$v4;SycRiD$ms^>f1z7<un$Rqj?OcWacp^)inW=C>Fp%2Q zD17C%51wDJ@iZWR(uZ7cC2BCHKkZ8|n`N5*tS|lG$EN9j_N5>C*)+YaFTLE#&IJEo zed)(%p>)>bXen3YC{`C#FseB^dyz_B%#d-kBA!Ahe8(x@nx%!_Qn{(sJlBEwD?_`0 zv)_EPe-ou&yp6BSW6T}z?A5ON3AEc0R6R3cer6lT*aIi_u#d4XN`I933dYJ;i7jjS z^R{PRRyEMP`mu*+V9%>#6uV{fTQ3%bNYN8~_>2t^ksAUk#@e?9boLUcQnLzlEzcM9 zOOABPYZEBlE~IEP5ts<&idb4mj4FU4GD|){mc#q25xD_K6Q!VufR!MWB)q2#zXRE! zSO-ykV8)1vv<-9E5w)>)nZvl~jb+OmK8tdgIPn(Js1B@LEtGOaIr66>D?xSUN?w&Z zl*j}FL9%Nd`4)XSr?>D-`gT9#GeMKbXZhiVp#tiC>J^AD_Q$K%VQXSbTP8qSmj4}ksjMie{03KkIaH~XMMoFkb>x6*oFy;(|InxUDiH=N!`Q1k3c~Uw)0)7Xw z!?2Dc>+36F%9-vfVO%DNNqqz5#3$^IX)yXVt3Va+WQnrYiV}DNNpUm}^pi@g7IW4? zq75Vp`x2P}8&G1Qq(VW)nCE70W(<%>g$72)Ek8$+;9Q`0*CRMp(8e0fXEc5k;Kus; zKo-7~B%E0Tp@Hm0m{!#H+46#VhKH%2;lqUSA$oUZ^ll<%w=`zACcMw(fQ}k+3H3`~ z+(myu!4w?4j#CqGlZhhJ@u0@Ch;8sa=C@M5N97b#-y>{)Ki{L|<6$Pc*E+DlW>JSD zzrC*qs7Z6i3)}^FK^MG{RwxDT1Ov*2q5o5j;4C{KC#D74y9qXyF zo9FFS6gInlWazaThq;6JzF=Tt;_}WW+C)uX>hfaw;_l&3+1BH=IpJsrTRuxx~#C- zK0)3|SjN~L9994Y>&vAsTXG^RTv}Pc@}_b{Md_f+Tz;;@be9h+_1TI8 z4o%#(SuMGr4yx32HY?69XWX&a^Exnx@T?07(?t%bp|V3S!;t6e^M`xwDK_+%59_RaczF!`?XS0eH3B(ddB`A4Mvm8hxqg#@oufL)^{0ob>c-Sect{L1BG6Q&z}LGiwD$N z9IV(`rmApBt5g)W@UmJsUm_1h$$KXGUCDAS-pMHTAXP;I&ZU7@Mcz_paFn0V-yX*E zd!c`Q;deP90iTA?kFgWDiV_+}g33rXD4H})J*a~s&nFXg(2kaaM$K^jh zi3oalQ@QCNt=_B2K!dcH4~|fLRA^;jWWjv!Z>{`6NFCrJ&O4b(OY^FD`zLC8Q1_mU1X%)!e3pAYk3k^0G z5Lgisz*qny@K{nUMFSOfgv2nG0Q>Q!Bw-gdga)!FnaHKEo`DC1C<#*vu5~JSJmB|~ zg`7Ypa}c(kc*<6Wtf%w|N(CH$Nhq7{idH>1Y}g+QXNSRew;VX*M68uH<(!oY##n2D zbo*3&sc+WPJyUu#1?9_lB- zll>%E@y`-efdrTRlLY1bdHgbIUI@(Pq$H0M-SSSP+XWjDYp_;c%tRg;B(7wL^k*SOMHRyY&3(ZF|m7pHGOJQl^XRrn%2LkySderTk5Lg=O_CKI5r$AlKg^&7Y z35@rE94;kE?No)Y31Io6F}F{&$C2RfVi~s4GW@o0>^FM`bMW;H!#H^UCLRZ=sqec- zf-dfZ5y(Q+;4>&xdI0f09|>@R&<#d5d*HY@Pa{WyLKEGp55!YU2AxwcE}YO zsyV0+OhM}Y*%oXtpq!F~ZwSHfK=uq1Kcb|banHp1z)Vw$^j!y2$&K`aMOo-k#F{9h zHJWGCe~Nb<7$A}Io%;NUiQVk7sf2b8VuE-EXzOCng&OmZk}b!x2LszAGHGL#{yoEx zE*ZK(XyRo*7$_fwMxjr^ps7Ay&I5fGfIf3v$bX>{lfZSCI$Ry7uCZi@G*$Gh$?O$* zjL#lu7>vrno=EdWLL`8t**_bX5g6|>&RwSG1KOA6xq5qgHc{N?Acw5YHmnuA7?JD1 zE=LBm49K`v$wx+2lBHy2St^!;MHJY>2)zo8(0q_5;Rh~&SKmxvEil zbm3iw9lcm0DIHgb98=^QM{r!E;FltQI}?qG8q_Z*<9>-c+%DAN3ebot20g1O19dFD z3}9;H*f%0|j6>=eh@AF4NFBYAquy_E1b1{i3diBG5>H7hkyoD^h=4U*R8c!xNns5| zz^xc~E$-!m3ls+Dss4@n2wSf2Z@)KVU553ykhgUikE~FH__eR!=R9M(Pa?Eo zM!j{MD>V0Ff!@NBgwG(Ew4sWeV9-M0kbL318p|r=FXssPw3(muMsNI3aLnI?TeCixuN)qe=ga)!@*e0MI>}Avxh!~&dwZ*zp?~U3y z4SHL_5Vj3}rCZ62Ei$|YfyTCoToQCdi*!U;M@_A;ovFq+-@`bmH7xtjP8wH5!OBSN z6uaecE0DD*0&BxLVZIA~cEG(23oCkKt)0R!buqCxzSvs7#MaulhV|nM_P0jE^AZgA zLNkNmc6dlnV3g3I6nw+t>9>|JNARXssjA+&MlVcFd^PA8`%0ed67<*YxzF;TCsxAR zMNKLD7~eb+)?yXqXy#L3SoW%%MK60Pt>3NptO~dbzm*#v-*8T5L7A!6!^UE>3#7>Is?zg(=mNgL}bJFpvStn>3sq116DL zZ+$&W8l{$qcR(&)ak$GB@v59mjIjHl2Aj#O!McH~E=Ye=hV5%CksqzGWZlwKd9uct zv7B@+M?$hJew0qK6K(Z(Z|vPFjwgRC>S>V&iLi}Ws>#l-QBmU4Lu`jvcZ%Ul#VwB{jupHT#;UK z+`x6OLF>5;zT| zV4JfVsdyEhCgdT{KX*1>>a{=yYNiV^P$SU-o7xPSyRVUfV%X9KN=d@^^l*Qei2DO& zpAPl6Px}~ymLW$H+h zdPn0xP;Z@Is}5~Ly+a8W=n{H-GszlE#+(K;Xw&PV6;>cC^qP0N9 zyUxRfCf49DbA!rP4|g5Q6qO;Wq_JQa9#ywzh1BhiFKia60vh#F7SodL%Nw*zA6=hx-+vk3z7qcb9N+S=eoe*wSqNdad|y3d zqR9vc3+Cna@YKd0_2`i&CI`A>@A>W7V-&4>T;tI7Cp$Zo&`vcfJ^8-We9c(!J*>g6 zaF%j}rZ^zu~JhgpVI-oLC3x^(t{C_xy>0cYC6 zMU>F&Wtbech9GB__l1D79#7-ZT6t5k=_GLeUQG&~#-ryM@$*9q0wWt|8$8*^;K{m| zIq?^MW_Ucf>WF!!9gIux6^>*4_166HC7Ix=d$N+)@aWRM{31LiBw^)Ud&B4*rI~t1 zO|zuYM(?Ov!BgohFE%^SzH0eiWg%%Nwu{RwH> zNl}3YL?i#;05dQk*1#ZQp^}={%3=l>gO+~+D!Sg{pF(CWxn^i?VVP@f+d{df<`$^y zvZh96W~MHbx@u~yxn-@%@B5tdp5e^l%oyE!Klk3x@AC2Zp6C01-{*ba=ly%$Ie)JB z_)&YuHg2!=k!%lp1iyz(?fp*LIksaM>2$ufET*4Q?xIU7e!38LsT=u?A_L6;E&Pvt zC-@)xM)E(vICd6nI=5@9=X$lh>`~X#f5O_zRsUGqd#ud;Dg9$K{3MRO{cuiWrO)>M z9{f7c%uhkwqmHq$-(}sLsnpbHKRmZO&?9?CsJW$Lp4wXPt6F_wr8)4*KjxRbf+o;J zzYs5NO|R^TwVX&4TglE*G-=58y?d@>=ZUL&;d)hG))cljHDD~@FDu96f~j>r=7qYa z_0cKVQE)#m$o09IXR?2a@1*+pIVnRcs^m7KKGJ%+v0s{1okG>?Zr+mWldi>6pljcG zTp&_;lOEyAn-O#C@)q!QJB=TwXu}J?CEJ}xsf>~Q2qmmH_#G|jZiv%0(cXbGJj5mS z%v1c5n(c*rG%4d`;@*KtG~cypwSJE4cK?02VD?aBs8NSE2GT^CiYtlskb4JXSQtXr zQfat#An>nEs)Y|=OM!}(u<|a|Cv+`OKO0tm zw{@%Jw?XSm6^nbutNf`}j8}eQOT0wej=1fh^}(hO*;T+VTJJhIUKO1YUAHH6fJcP3 zQ7=-q&0I%UJ-CeoV+!3X;Bx(0cM9uDLAhXpu>KknMC`%<(_K+GypO#BWor z#x~VM-qE!3EcRwUz#&OQd<}Hy2eZQx;D-SZ|+KZ(Wx(?M?h5I`BGeWCzf; z&9`Kl)|-C0X)&u0b}SNR5xUqiZOWPI=jZL++A;pysf#7Qf>b?0v#JXB$~^UBRN6p| zcW2MG_dL(g9Ua!G{0%g^@yQXo9n|Uvcve}hBMbFj@0R-fbvPOozujHaF7Ad7N^Zjq z6YWt=)h(J;2|;M0{LXk-jW_Ll3*TgUXeG6~y|nL_MEibC{O^RcC`+V8SvXBn{Mzjv zT4U3-ek-lrIDUrO!~ZlINJ(_n9bhitH&F)C61|C^&SGgg<9tZfIoc?<1k=?|6Myxy zlwV-`)85Y|zQNu_4Yo_XV*uZHL3<5_ozWU?Sj`uz#*y~b z+s}uzjHv2TtqBXfz0p*4RdsMw+U>e|RsU3dG&=Wo>myayRj=RCaJ%k_svlGYowEZ?A8tx~Y2cPIW}Z>s6H=e;OMRq5XYTwa4|bX%Q_us#bV3j?0ZOzgt!7 z(KfCwqWA+EHSrF540b;bzBYX(q%y9h2{)k6^cpRJmJ>ms)OzNBT5?l^EBXAmL-vmhan-Q)Co&=okuGk5j z#t{38iYAMhy!J_@`G!0CEc)UysaT|fE;2>FQkD-0hd!<&H99{VWZR3_h0jK=#0Z#c7pVQ&}>A+zwR{(s11iu5{6}T7j2H@!uyaf1E$mf8k zN${P(Q6w%BKVnn zvP;zOsT00mv>douf+qtfc{lJR30?(!GUOkD-zCA{2Tt})LgOL7iu(J73UU>2sh`t< zTfjR2oXRcoe+3+_<}_%Gs8Sv$``-Xgys^NY`~#fiBH&K`K_j91_#<#>y;lG?16Sb# z3P}jXd|QA|gPaVU>Qlt~qmfa0Rs)yXp8=fYqrfSh$Zr5{f*g##885-{^==-YE5oU5 zRL)-k$3I7T!-1n{{GSg0lYX@q$_gCA21l5h;a>1zF>nO@3q8;zc)k}1>lvTwO3HtQ z@yTaW{=1AnU&jA4IKcv?I z7w0>&=g&;fIGLUgnVuM#p1%V}SLdby$B^Q%M|Fqb&n%f9U*P1=$7Fg&0jK_60o>8w zVb9&bLx8^koZ_jx)PGk2r+MNX;50AsI27*(PU#N-7wsYbZ4rX}C2$PU4t^wXOaa^v zz-fFH^-l**{u<^fnU7#kHt;auJ_GW~ksRNf0R{WF16x#%@Zp`w1A*D(AJoa;m! z25bRN^)VH=w7&K*ewK`X1~}D66>zD4egsbTtOqXjPtaI_zg@;R0w?|<8GjDrUzG6+ z7+=-TS^sLr4*@Q<=T*ix%J};jf0m4Yit+Pg{2PqFQpUe+oM8WNWPAf~EV;N{z{U1V z9X$;=`S}oV(a(hE04IN*m+Aj^roUUJekHsg|*9w{bNZ_RBWeK0kl?q%3d?#>9NBxoT1;DAi$0dB4-=ARm zzn1BL5jffJ=i_YuR^XIx0C1`OEx<`03*52(L|ZxrochJxz;y`4@!>ktpDEMtfkigy ze^jP_1aPwd-+@cpTMTe2Cw+TL>i=25$^K@U{`pM*PMQ8PrvF2k{->G#b29yJF#VpW zTxtDoXZn2sO8s+~=??`iwg2x-zX`b1e(y-Z{`-OBpJTk$0w@1G3{a{+0yz1n6u4AB z-cQB*XBBX%ekoh-`0vU14Zz8tp99A~hdnO?CwsmGD79x7)BinisXZSv{o4M{ z_FQHB3BaX%--&|#DKh?8;8b3ljBjE5av47hINARkaH;+Iz{&pK0GHZd!}Px`)BhW$ z|A0*YZpQz+jQf|2b|jZObMUn<$D-EU&ha7 z{Aw8=zsd7{Yn1U{VElJv{9TNHRL1|9@xPMsuQI;c*V%qw>`#;Zw*wc;OZJZi4i#J? zaB005fK$Ds0GHNFI&iA@2W9&0O#ece{u-wL8JYfPnErJ#{ab+F0sU_PAA^v_E2@`6 zOwSRSo==&c6EZzt14onQx`3mLJM;uc3-$;5Ir}FTIQfTOW-j&5{lLjT_W_ssClfgN z=K>lvT!3YF@Ah4G)0@!thL4*C8L_*jIZf6g&IpUCudF+Hbb zdekw3-QNJ0&KDuTX}(Yobe=EFz^UFNfJ^(u1Hj2|cLSIDtsFS5tLFo!bfTSWnEpjF z{o8<(pPvIR^}~C>`SAg`)X&F&>%e~-IOQ+u{}wpqcLcc9PJe^Iy8v8jXC!dqduyEe zQyD)PxRk#DIJy{@031VzBj0tvslDa_A1%Rm1E+F516*3J{lKYQ>wrtkb(-AsJL3-nF6Dp7@JJbcp5aquxGGM_cfJfC!SGTU z9>efeGCZB(n`F41;X7pb;|%{$hCk2nb27Y%;XlgozcM@k&L1Z6&le0IC&T~6@MIYt zU=sZBfDE6&@M0OB%J5nlp2_eRWq3Km|0u(sW%xlE{yM|Il;QXs9^X!Wkl`m8J_wCV z>W68j zA1}=rqbCdWd{uV-Es0bny@jBqBBFCSI{~up) z$^ZFB@WcPL2lwsaVGITn9KEQgf4u~p#tHFH>|dP#u{3e~iFjZ6|6Td^wLSE;Tnq0M z#x>DFqJLbK*A?E^eE*Lxc>F)Beg0RslfKqhU+r<#uKKFyzuM0K-}L`aD{o)z=_~)g zy1n()p8wzY|JDBQtNy<7`&wUp)&D<@?`qucs~=qH>1%oWnr~nEeYK~r{Jz@LSAJjZ z=_@}T`$`ewViF;xr$1MA{tA4hb^Cu7-q(Cx@%xIqvcIo-{fP1#!cy!{DP0%u1dg8+_`ip-U-d`qx8vU5Eti30W?E7$MTMnh zw!*U6WhHrqkMb|(oMm5NFR>S9+apWMN+P37#>_>9g|-5FPG`_8={!zC?%^5QG!*5s5nK1z(TY|@GpnK%t%_z=MJrkrqfg41o|;!;&%$e9GfM0W^2&um z#3-5>6Ak**qM}Fhoym$;#~6s5?!F}EOTbglCl-Jk%pLf9#-N<8VvfLyals_7wbA~?QIYeMJZ-v zh<2AzjB*--yEI0jdJVBkE!YsJtWj{Zi{c8tkkmqot;{xOX|Wx}&dagkCBwW@o}g58 zqqDze%(mdAySD5yd&z9O+iHw77?r(dbmujrve%66yk;~i`o$RQ#?wY+UmD%{(kS@S zxoP61#Da&E{U59BgIISyh>a;tx0k`gQdgHwE5y5z%j`M5qZCUY>&|1b${ve#=dsv0 zp>4*Rl-g#jvTx$t`6e!^G-FX#eqQzr%sz@`RgP9HZ=5@i#>EJ>#~GAtj}yEh_K_L0 zg~^i7#$~^VW5ar!;@}r2v?F;_iE}qHnb;I$QXJb&LiywxO+tTBZhR&-F)2>*29r?R zy)+6v!-YmRU6~Z8t9YTdp4kQ}MT>$^fD^0OpP(D-Nz`ldwwY@n(l0LQb~zz>9jI?K`9(D8($C* zTo9ww^Nle=Rrd_!GZqzOVa4ihZD))T$}I16Z279(>DUUhC!>_S>@s||z*e%OHQ`GeJ?%_#iPXzd zVbFHKa~{ZG7gNqqq>(LRd%?n()(ci1yJLlx*o&>)29+0~Mz#obDB&*vVW6y=@X~@+oU`{ znUqVZys$K~g=H_@%B3_JRr$hIdN{k{r-U<8X47@Q*mcoWg)2^x3l3}7vt|m{;=QQ7 z+P{)MNnZ%Z=U;>lB4#3V9G4jg^NC66g4<|Pt__n=8_NCPBy_p-q~s~-;^s$w{^Ekj z?4p9=ynK5}o_$@=# zxQCSduFEUTE6YQzF0()Eijr$9on^Y&F?S6I_z>O8GV-lr8}u3lgTigaTVR zJ1awx6BgL=^0AR*Dax_mQkOV?k)Pb^k-8`oJCyb^S4Co0_FSC0)q4vqeBJ-&6jie5 z<4f!0CTelgshk+4x3Ep3(6Nf_t@&pt5en^O-z~K8>pE`ozSN~Z zqdB_J)Mxj&(9`##;mXlol9%20gqB4m^yAu6esXfE4Ss^LDSp;Z_}X1rE-qIW$4#)& z=kO-v6_uLs%{%?0{O>shw(N;{8M#G;_KD)}K@*eU_oZcd*`*Wl0X@l&D-&lIEy6HX zI#FCrfuOJoi!7kUnS2={T!9GdkWA<0LC->j5-P4lq^VsjMFa|4i->%FF(S)OT#aBw zCoBjY%aL2JMqDry7b7mXKW8oCUX?fk@U7b2lE&FZ{944l=AXC}aj!&Z>pyML6Zg79T%LQD0r-!k#|Ylk1hoEsEiC;UP>X$}5k|Tiqm-p2_c! z&}~AQbEeFjgO3GgV@ASVLgQJOnV*L(Vq1P`dZxm!tGJWM@s(lm{vxImHy0@;!RsTSA_KP>iHxWy7mR2JLpc}RZscGnTZ&tb9E>;@xtJUb7nVjlERA+y zX|%)AXcv}7J1mWMVQI9((r6c!MmsExc429Zp2je7{V8nch^32hVS7w8rIFs0!QRlCSlJ~+*^kt$uc@!650FC7)PV#m-YBeb!jQ? z&ni{^bT(7vyqW6gPr}ZVy)2i8P=#K_Z*MB?Hago-YR~5_VBImZxG0a7S*7C(i!yWU zwjA2j$}3hhh3=VR5lZ>cT~iWgNN$^Q?<2Z#%0+$#G-;RRLOQe!aqCxd9~dIg(A}j& zE8)j0g8}VbVK_1v&=!<6qxrkj952L5+KPC2g&|(p*JkyhW8YKH!JSr2C!eZ!Bf>pW zGRHdKUv1*9iA2I?o7iyK$b;mD7#xoo*CcrE|}rd#>E(7wgI| zvF`m68s6+kd#_yhBi6kiV_o?%*1aEN;YXo)$HH++%{$hW$Ku?3EG{b3#m!hf zrSG}Ql-{i6!UJ*cJspP@D3l})u2L#VoYA?%iMs$SKbJi!&N0!&xfu52#6~A?RdJ&8 zlm|hRW1=>>nCwhqq2-!QVuy2~89oraVRA9enZ$6OCO#N%qcj+@owRyl50 zlShc=ilc`kb1_9PuZcH*^(wg-(W~TQgsYO%s#|d$qeZxKgxLM%=F&1-Ifbinv-h&w zaT}WpRkYw%%!Ah7$`P(g?pT1!%VBa=a+5J%$m6Hn(I&g{&!(p?S#o4}tDD>$WpVUP z$;j2SyTF&YXBwNC^_V?d%te4*-sL8a7<3t-G^UtbRhmg`uF9j8No=%E_q#doOY!4J zeqL#r^4^&6tFP1Das1ED7$9sp*g;_rx3XXY?P2BHIpyEVxe4}yys`<{P~#@#5$%gWd~Rmv ztX)bA@M60ucvapbES$%}SqLq_@4AiKnS$r!Z)mvY6krLraj%h#zfB|?a7+b{z70eC zFz_?*(z`mLsHc6eFa3a+&-H($jZK257nFEMN~JJ;{`w>ENdTO9Y=} z;*)G(ys_Zb1Ahd(NMK{YBbj(42jL(;4?vg-{a5fVL9*){3p-eNf`vyBlKm}1g!Zuv zdiMj{J*207kh~oS+1teUTfis#@XpNU*MYqZzGyGW8ySBc@kmZ)JQH{=z$?H@1ZDt_Wa5!L9tY(+0wMX;3nA%0KbYJ32HM50Pr2qR zc$wpw!Q5*kQ#z765Z?qnEzo-j@=3&#Oz|Wi#zA_vgSQpw&O^^`U~hp(GVw@$6Y(`j zw;y_TL4Fe$;+9Z>(EmNxm==$-B&Q;NIr1Mfm}{N|IT`UJQ#{GhIH=u?MM(O*!KZRJg6{_mFTQm6 zf#e&51V3&@eqNBj9n|ATlCL7Z3HiT;czO@%CB&0V`H_4c2jz1byp|CdCoo=o0qi(< zBomM1qln)OJNChjlaSjHPcp@md;ka4?{xKJ_Yu*fO1NdUSkh~7@R1c@2 z?`6nq5HHpX$u&4gPcC@WE)t-p5Lga)Vml$(ig@ymc?j2>4|zV~#dbn+3J&t;T`V*q zB)#L2jzhaY=*uW1Qj3wE-d7 z^9=Yjp6r0WwZQN$VaNDF@=C;0IbMXmHIS1AeTt=ko*V^@_Pb8(ihJ7Sl={901J`uNgjcC8t)2`Ul`;7#Eat} z$yywwPmPf3&jTUpy{_SQ?uPxlp!X);UvgE$y+$(GN%9pO#5)IG3qIn~j&^hj*cafD zOgxfLGTspuwlRJe_y>XQk?=`=5Ai#Y&lTjmAM!55lT7+ZehUZXy9K;r;CsM(9oWm@ zkxV?2H{zgnP{a87;8VFnPIAp9z;eMC{XlXK;;Fv0Lot6swjy4vKaw+Wke}{hVG2UB z!-RAl=!cD1MWAUb=Lh-5z@C0d@+G`@hV*+rT54cqH#bd@k}|3wzojw;-NmiYIv&4)XH`gyf$!OkRbM%2k7q>{$*y9hi3> z9Ef%etQ>ksCOstQBfcE@dJIGTK+Z)x$rMj=4&rH@dkJu^vxMj)he_<_F-cD)EY z2Ln@sPcrdI_CkCP?99NrP74_?0(y;PiYNI8ybp- zzS|Lwc#_FZl0$G%y$7;T3w|T~T?hXL0P_Q%Wa5*272gUW{zVoZMM!q<@D0OR=^~m23<*NWzj&vlG zJtXHMp8RtJdJ7@vAYSwr$&cV5f6YV4`xkuj57vauvw)?6FZzpQe9MLRR|oWEKsF;@ z^cTqn9HeIqc(h)@JM5ds0}BIBT)&VUf_Pf5JU$%b9OMy*7uPQ&2jCz*HwFmv=(@jQ zJq7IgfS!4j?Sz@@w}Z#Z-yL; zc+qZ>^*G4xu?WfT5b()P4ftWeMu0EcO|lvX`OkxeH}EYaO8+fFN`JAxuzuTy^j*Nt z_3v4~k=()fClDIJKZcO64;Jo0$kzw-v}0V+Qhfk>3wlVVa*_Nd;y1(2i^yj?rGY1|*GR@Uu=w_x0zDa!&4?GJD??@|lbjTK0L9UoV?r0%(HB>5Z;Dpv2+6)Ggk;}x7A|ICF+$4sLFl9Q)&YH1U~{2Q zY=0zY;2=BiVf?$mr}lOU{1jjb;EU~#;^;>B@^6q9-i(9%yAmP! zw}OSsSXhRT@_Ph&$e$;nCkNPr&?EYn;N5A;%(K^e@SJ98;l(z70tJ4JSVQ8IJmh02V@g=3kP(^%nLC&v^^`g!RE#?*se7 zyJw$}JgIP z>R4FC!sQ4_Pd@aRkgf%K%786^9+F89$+HkoemsZx2O*~;Ui2%;W*p>)1can71bp&S z1lAAXz(#;C`i`dY6G$hH_qo-p7HJfJZX%NPY|l>CHh%dLIE_3q7wxZx*n5 z;FC;zl2aMq%=ii5bBKQr{JVe|z$cmbB#&V{9e6t6*TD-1HUd17iAVBvFTvg`Uc&X@ zvfHta28M5@I<5yvKErq?z@zJ+N5DG`>==0BbrH$!jJFRwT4%4py66C~7VyM%H_5vZ zpBRpL1A5vZ??61sWEaVeI8x!C8ieG}<={8rx_B(w6@4#uG591CpX5RuQ^=o;KOg)? z#3z8C1#B+(Bom+H48}_VuO4^`cxk}y0*_?kk(_||{BZbFhjA8iEaFL~c#`!v$j&hc zDgQtg4rZYr3pwbae!Sxx_9KDa@a*Z=BwzOw+QU_ZRNjjSN#AKt>?0uEF{Jwf*a@T~ zner$37!C_~hgrA}{4UrZ4!^endk=h)iBIw_#OH?NdLQN419>~*Nv3#`-@-xpzJbt! zuo3(m#P0%s3$TsglT3V)*WsXcT#wL#um=43sQ1HI@2vt>0Y1sZCwV#Itw?_q`syGr zMm)(BPjU$k3-mmOknDH_eEOYa*56T&z#ar&{N04)xi~2Q41^YhX$UD@BGS>kRg83I zU?!v!=P{BEI4s~rkiE!%d??oCz{1I1W)J^8XT}=}-aOz5;Ee#L1&?I1n`A#6l&=>; zvgf9Upufw5+c^ik`AByS*d-6{HIgYE$>(qozk~6QfuDi+67Wv|I|4q*#3%VM4$5ag z;(DFrLc~*leh+$e z5mJ9LAtbw_5mJ5;(ANfi4PmG!U}4ZlGTB9P5aSI7uNe4T@P-1@fJZX%NFIQLuP5;I zusX0#*)}?|z)}Kf|k9e#-xq8H3f_w(?B$FPJ zPa@t5c{$=cARk9O$rMj=JK{4Smm~ftGR2d;1Mzyu z#faYxc^l$Mrg)OyK)eoeKH{4oZ$&)G6i;#^;9)f zP|w1#2&p{`g+5w`gpcBygMbZ&K9VV4lKpT{`|(DI&*c?(Af$BHK_L7pLXywnv(g5n zOM#wCz`np|-$=&aCX!DhJ_B}VVVy|B?g_+`jK57JAH_lX4kJVs_BQZ4;2-#~`5>@8 z;FFBMO(bu_LFIcBA?3djd|Gdxx8_$1?R6Upf~$j)T&XrBKT`KAK93p{b& zC)vb!5#Y^%f5Na{j0A=xuaS(uO(g3OPve4LIQlVUEJYmS0?8U2&{t6IL0yvbD#m|i z&~uq=W%4{GXD~U9$z~?g_`sWHR*~;@2}7{fL(kGtEtAzu=9odsKqhOMtY$I-zPx@2JyAb| zQ|QG)1iVb?C!t*gAWTF^deA4Z{fRXKLQ02&Plwm^6HI-?Z!JP^s&^KyW?>x*Ygkyp zLiBH*U(Q1GXI?I5VLl6US(w8@D+|$|dHy^W&S7B&3)5Mc#=;a9npudl@#$eZ9~xMw zXW@7jMzAoPg*p}nu`rN@0W8$A(2s>`7J9J|0iPe~1ILT>B;l0w+>Ma*P)K?xp3+l1 zrJu}0g8!)>4M6-Hgv6u%LNd)S_~%9a1lyus282{E)L#f6&v5EDgoiVn`VaAGjv<`- z5&n4vFr4}m;WYmcPW_7bUJNIY@Efp`@aqVPe+?nwT@1g(@be5m!|)Dj-^%dK3~yxkMus;qd@aN48NQm~bqudzcm>0k zGrXMPWehK7cs|2(8J@#%E5qkAd>+H+Fg%0d=?qU}cnZVK3{PaZiQxu@>lr?t;SmfE zXSj~xK@1OMcmTt-4EJNWn&Ale@n9J$c>qSragZsG2{>q8oQQ++j=~X*BL>GdFU*H3 zHAihXqMvYX#h|<%akLLg*E4UjbGjz_fSuFz;Td*L*PQpVv}2*K8U~ThH8>vu9d!O8 z8ekSXU+aVK+cHi)!es*l&RE3%$j(nAd>lMVy9JH-aipj7lQ_4q^CtXOw}<8XASQJW zhOfqXBGZ$P-^#bM^A~ZBJvLrXJI?9%9Mb6xhxTLk%*Fj6$qZkO^R3M0_i(@Ll5}aRSoXt4D%xpM@bJ}Mm{eHOb3irD3=QnVU>jzGQ$~!ZLUkmf+%SUruJi~Vb zKTP$4a%k^B+36hi>Mru@OwJ#&8S9;g;D0(#!}&ezJO$?|!2FRf{ZShtPCD>5)UiL{ zgW(+a6+7?1`7BI65c$74*dU&ND!~^@&R>&o=z3A)ua|K8OU|Pt=TE~Hk-q{b;`yVJ zb83qso(rqQ^9Lkp`$;$yFLH7u_Jm0|EfO2zB{=O(iD}PD&OIgP*w1osR!H(HmT-P4 z$yX=AIpH4Vp1Y5G9%|v}ISb_n@cAg`_XY5f^mPCNz@GM(Wdp^M2l6?E_abph59|VT z{j~%{DnH07N#%+ly8~PL7_7{4@hzkb?zsuP=LMx)?-yI~z7QXxp+{Dn-csij%Rgd6 z?-lHzFO?*y^)w=LTGTsGF4~F5XA?edk zP6W}D?jA>SN^tAP=A7tm9xCd^lRs7DMBoi{dj6?*wBrdl*F3pB)I5ZT!g~2uc%zz| zTzWlc$Lc}(H8M_>3#YeQ5rR;rnoU3>A^t>q76-Dvgbgszk z<#aCIIi&Osq+4im>MB1Y{jJ{xb_)Y~-mKR9EoMJC>3_~k*=~`Y3#aq#*7^OLw@~Ed zb4T~?yB?)ctM6KF{XVW+6h|<_X$b zNKE+oN<=R>)y&T{8Q{u&0CGF&;XPdJ?*cj3B7>2Kd;{4N6?g}ChH4_uD&f0>zO_Hx=xVSmB{%AzEM zbx2F;aaqL8OXj%W5$wfPP(XiMSK979`+PlHMr+itoX~G61Gmj@q%R+|8 zeHw_0q_%+jT%G=2(a?^PDugG76q9PX`k`cu%sKg>%cd0FVbCIj$&tSrSS3ySCT zCzi!lMo+-@)npe1>NbZjv(4mHo^kkN4Par8vVSZ-m z(t@m_{LJFAl3qS-fey-l4s=NCLh9Gih!+%6ZX91gYg4T-**&CQm+BGP{oTp#eyOWcb*Y{>Kh|BH zYQ8#$PpiS%GFy2H^r)6XPybx)v)$kQx!Zj8F`Iz(&+Y#1Pu+v+%~!`eax-7eki@>( z?E%ePsPEeD@3!*!zS`aLbp|)$jf&L!5M%!S&;axI9}b9sMGf7DE~vHhQloIb2It;d zGtQodb>^!#dHth)SDq4;>sxcZ1xKUnj4Hy6QmWmi_E1~m-XIP^LEG+xi?0%6g) zjG0}Wujqq;K#n?W)Ii$fkOo6)a!CG=UUW#qAgy*tw?SIwkOJ!O=`g2y!E2Mck2jmI zMw%%%?RxTg_jgg$ zk(&$NCeJ>JG$bG3Q~d?;fzY`3X5czIEH^n>zJurd5ggT8^VKhO9uiyiu(biUZh@_- z9qPBuS2;ed=&cQooS);hthwpG-YZp~8U|ZeBaVC)&HHQxU)rjhq3}Jm-haQzMcjRD z(jVX*9r;GoxbP`W>~j?(gooS(VB~JaO&gHz%UpWjZkzw^3jzUrsvMp0=4Uo20d)Q7GIG^uic^|{WuTEmp@XA>G&}N|DXEN7d3j~N3!wLA7dIU z-&zMjGkSb~^mz4%{vR3MFsFuNT>0%k0x`n;={z^E>rdU^wf@Mx&ksiCUzszDxM`0T z7STI-b;aU$10!{g#i))ZQC(iCt}rh@QpYdBc!;yu3JZ(MbodN}t<0{o73%EtElAx0 zeD;T(7Sl>CQYUN(^eE?*A*D?xyb9P!>-~klC@fkcDsvd5qqn^Xx-p~Dw`|E?N2YvE z_@Gc(kxpDELZWY%<3r`lXkM3KI+eW*^B%3Q#Cd|`ryyf0 zU&M3L;l=y}Y|NHop5#9R!Op?Q3t7v{61cq5DGL|b@^ONcf?le<1g;d{ROXc@EGR0u z*S^%AGkZ~1X*S+@L8%xS*9x(Q9xZih7|itBA+6bH9z6;Ut-t7x)^hYmYbp7k4nT?oKix8nU#-zxeGrvQ`jRazr;PxJ zmgT1pe{S8DSHJu8iRmBzapu2vT>0|u2`Q>*n9PNOTnLh{M=0N3@beYtQ#tC{q&BZ< z-rDH+HL4oF(f!oJL%g2Ks?bgGNM7Tc>@_Glz@!emcR+MiU0QvB&XQX9DmOej*=w4n zeo*+njHLT2S9eyQUFDUO>U|#;9H}VW$n#^acjHghz&#yUyQJP{X+-V9MxVuPwXyZJ zOSbwf(bbmdYGZY^WlgnZIM1zKTIaL0u{KukQ=VJBSnadS?9&por!x55rXa2==!h+3 zPg2nFO+hCrLiU6PAKx@^e`wHg#H#eQ#n#%T5k3{x+LDIarMaHv^|d8|wPg*^=~-G) z3soiDL6B`B2UNO~oxvwsg3g2noq#GX=9#p#8RB6#q*NiHwB&9G!S`RgWD51^)j{3Qd4aS>Lt*pe5+4K&;i(x6mrCdNDc`^3)kENSp5w^kdAYfIoUoHY8BZLM9bt&PpCr8WSh z$p_UG&($p}u7%m9aJW(%csT?u;e<8hbSs}@W$QHryN5;syPHJ>M9iO$t z?4vXPmXy_dC$&{4uH9>D_ndUbGO}&&q@&f7>Mim0mXY2Mo+7zvqkd_o>NJ-!GzDh=&U($IcJD8>noEe~8Z4%!y@_i* z%}tj0gL@OVsS?{P@vAKf2cfevzQqDn@pwOp=91q3ET_HFr75s#u4*-xp^EeWx?Xd| z?0;70Uyz}>RIjckq$q_vijEqf-m!Pmwxom|)$s?F?eEll-R^xwtGS~0NA6wi-j}tSYZaP`_!`ei zu#>By><(HIHdaqs>j|^(T3emC8)YH;M{cvgZwbytF#DqjU7Y`g4$a?tY1;=knpW>k zAXn@qvsZgg-dzoCrlZyI4SXq(*Lmby&S|e{HCKx@XU+ZvdQDe`e@pyY*ifCgd9R7{ znp{(zxX}_%m12RZlaEp*CUU<(l6K9v#XbdEO@5R28NGj3i}x=&G-tasS8!tXKcC@$ zS*Iyz*L-c(oCRX_Kgao(a@v1(Xui>E&cX9aPDq(dRo0rgyPD6@6Fxz~#Wv95{faP} z<$9V=SOZl}Tv<~khVswNI%;Ki;}M&%@99j{5F2z4w=qep9a(4R4qH82wJpQ*bsIQS z^}renuEwTee5C8`AvNX(t=|xjtg4K_AzoiJXmvxXa*`X<1J|rruM7W+S7_cC^^@4k zc~Xa)9l?(dQxDMPtneBVzPSefeOa@qK45Tq{c7JDuj$&heLxT8$x6&62jL)bkHH~!XtaOW_tQ-`P1 z9*o%A+Nv_v@11@m;J!U)x@Xj@@3y4Z#x!J>PsDP*jE)^zEQ=+#paq7CX=ZpZ11f4;Gm!& zZB{5u+n&~}_3`n^-)BnY>a(W-Y4UD5emtcAV5H=Rj9+H1U6$*!u&H)ZZgp`527a2@ z%gSq)ws^)>;9vE?<>-Iynq?RWIsavPpOQwOQk@TaMs))>U_$1<}$5M zNdAl-f!dorZB(9JBQ_N3Mj4|dc0%UQ9xAvSrUKxCZ zpYv&PVViQz_kHt#O=e#_0r!5F@0V81HyGY9Fc)jaoq&?cfaJ=d$&~}4`E*jyQCkqy z9uEyVXA3#ADd?ar(Dr#@b?Lv8dU#;-n#+UbNo#vum^S)klNvrur?~hpmQ&Yaa#|iJZ zXfE(`6itRrUpRZXGk9N8@czzWSWICJaz6C-j!kY{-S3}0uC~IAF3lH>nlIsVjNE$v zYfV|?u}q4j7bdNN(78WzY9N-u3nem%FY%xANt`UAg)} z!@B4H+`07o+sbM`Te@sn;uHNkyB5SJ{^5fUF2D7{%?v=n_(+2*d7ac@pw z@*TMHi8K!nTB}!BeYOod6}lri8tZ&q&Ux+Abm;oyaVYaOmG`Q~@V!vMr+WF>5B$8P zsm7cN-R(#)Ca^M>56Z(|JSR2(D4pST7-Fe)qmZW;~ zf7i=9a%y4d87~nG2ieJ8ae+*>%aP zmt^|xC&3;Q#F937?)ihSzxUdnOs{2~3O(ABsV?^2Yt}SL@>h-pS4on4yz_x(<*$2^ zmld4~Jt;}P!E)W2A+b5}(a=2(o0~k>y!(Ow%IA8LuU&R3v_q2on`*Po`ee9XD01!- z8A%vrFICLd??|!bO03EXOy3M_a1g&43|A-kUF!(&YDn`&BjKCPwP%t>Y_8G{`D+F5 zFYTp@;^?h&lj@($N#gO2V1Aq~3WgRq$DKW6HF zFN;T@Dx&RIVG)(H#(h$etch6dF}B9TFTy8mUgwfF>()_PuEn3byRmwcCdO3l(dF6V zzcQg+H&8=p;6;6P%skv>e#5%eGVoZV>IT;ZVr*`;S|E1lG-Cx~eRcc}fw)(5rO{I$ zCbm`k3&d+y|2>>=dZ|ORpPk<5@ITB>Q)~gp*lF6PfaC1c92#(hKh1w`{>p^9Fiy}L zS6mMuW3SM(}d0@`?BUk`ldtXrbE`I zL&Z&p>YENVH63bcI@Hy4h-*HiZ9b%HK4cE{3Sam5j*9wuKU^4`oOR(ZzfeE<>Pr*D zs#;Xzd{>XjfA+ytt}e@~LZ8aD<@j132(tNN`SoPRI`fE}u-oph{>Qslw)lQCWyzl& zURQe|@4N3eYDrmN{MR4sTD6%Z^WueAmoNt$VK)k36G!=Yun^Y_4DY+Y6r>f`455+Yj^JiJV+}?9Z33 z&HFpz5|-_H_{ER+7VOYOPW=4iuYcIMq44>?Un?H@W_9h^&c*8=S@+>0uWk2^i2wE5 z_f1Jk3Ew=M*-Y-=bT#hB-;WBLUJ*51yX6(t!kn7c;NZ@TfHP^+>T+M}ID6sp<>4O< z_I~JSO;*!wV`5Y1Zn5t_dghwfZKI7-?zb;m@!X=7>$Ys)f9%}1-ox(j;hJ&HvonCl@856Td)=2nT0hXEg$*+Puge^v#&DvfX(|@JzXFRm&x%v_L^{k zU*|b#?Ov=J6K_;aI_f#8X|La3@@k9c)s_@jm*vt5y9}FMjkUuM&-TB<`CrY@oT=A* ziERpgzamB#5qz?hHfoN924Sb`WJeJ8d@ia&76jgB!a@_5{0B3_SwXC|*wiX-xG()$ zy+3&%@r-3s9mKt>|2&{} zX+!N2*n{o62%nOM%K5@R$=M7nE=RQ9+HRta!2_Mc;7sfdqNWbe z?6FkGaWx3DLeg}WI=|uZ!^7*JHSce0%MHs=2SmRZI6QP}Tm60W1MgRHztk^%WMuiq zBjE*jfUszB|B|@zx{|p5{U=V;71&CCVK32P16s%b-YeXBE4it2mc49INg;oel(1Qy zx7a?xqMM6vjp19+QfM0eRIHnZ-->S$I~)7yNGtrJJf8h%?)afu`Nh%FjHcR3vM4J{ zQGULlN*ZgSue0f}EnQ5%I@n8>WarvSGE4K8;cd}{nRaaP^Fqcni;myC$LEyu?K=9A zU5DQ(s8BlL3(dL+{5Vkf=mgx|5`}Lw8)733cj7`=ZH`#2;~Mo<-1SzqNAZABYHlom z*Yp+P`TaF51w-umLKxd+sBwYH*Fu`5fdg&(Im^vMmuEvwknN zHJc9i#o%O!*IcY7I4&56SBB1>(R5MuYR0yUs?om-F?){U%3?jtKHK|yjN;B%|7Euf z-#%KqeRRSNhd-cWeVIj%qM$aiz!*_H^QK; z8dUwII!UkfS>HG}Y)6N6s^5T7UagHo3&VC?f}r*CYUP4+!|JMkT~R%#dJm{uSNtYW zZP4tmOIlN*3p`^P9-w;XY-_PaH^i#{z}&C(#gV($*YzLZ=iQIX{&1kpIwU6QUY*~Z zj^xQ{9a_IR-1oY8)pPq>bsw1m14j5%U;o0|{z#DDk*BJYmM+vU=)baZ!2H14w87qE zD;CzJOlka!HG|Wy99iY#w_x~yu)wGY4GL2-@2UKCjg5C?zu_4g5n&31BUDw^df(DP zjeqXvGbt-05as`)d01=lUh@E$Werljx`#Z0#GdusiV9rmh$X!Wr5S`jtL@iX;`@-f z-z4OMl2?~B`r6j%Mnstc5W7ab;+3iuohz+FTdez9GR#`Pqnjevy%Sidek>HG1>`i? z)3zYSgqV`fi5qrEoM|4l<15O~6P^va9@a3rZo%-OTXYYKhPR(gw)%)=cs1&jqzu*( zt#z#n;pm2xaax;xb)e2iU8TBbn@31ZQpVGP0p4gS@pY+s6j`VCKC2tCcYKl|%NhaU zqISfvOusm`9ZzLOXN-c;seXR_yjsn{GhX@psm_%hK`qvGs%0L7YxxF;45!C?ZPugh z;q-Fj2wT^%QQm(+wX_W0uG^ZV&#It^h-ZB_w|gfAu4bn1NY&q~{U}~Ejq9JOKGRWE z9UK+08a43Xj;F2r8t1{d)1AhH61*L_IUaaQR?wgs zM8tyrFISG3udSUD6tb{l-=;x67XLLY*5~sy&!?(Ct*Ahq`nOrv+3L|3!c|H7HlH$c zzggG&Wp>ndu564&DJut8l~z}eUMAKTH~1^)$EX zNY}_c=)s6vySFF+og5Cy(7gYT0dISKV(u5&=wqHHf*mT~fAjs-z27XDk-dABm zX{=en9+m3;_~|G!FtXx=*aN@SF6jR{I!bZGng;K&*4D=IoDo}10S8jHh(*8Fw!(3G zeZ@%V6TFi&8KvaCd)3wufSyTovSz#XqmlJ>(ts`F6jl+Y5%T&Hp^ww12z3 z{H=lyxZ$6#3q7!Xf~P(Ip_OAnm2)zXMK|i}*s|qab@BuP_O| z7C778W6r}tAy@ppmKJ#F^@$F%OyL%*rt2005j{XWj?AJ1_Y zn4ZNlJ@k$>(qARRJ>eTF*E7JSURCk}aLQk_e;n{o$n>Yf!Q=2rI&kdK@fc2d z+zSRThA<5B9XQBd;?o1^F9Ih$^sKRt;cDo4A9x7l`8enqP?0|XX()X;4*D&h$DuzJ zIIRVq!Xes8`k%u=@@5>AzsP?R`0bG2#X)NrQU4*}Bp=5i=1cZm1WxsO4Tlbg$oE5G zNq>OKS^sF@q<{t$_zyFFri_nwO!9Ut2TtXqe94{$;AGG9z;z6#^6p~# z-vKTy@5fC4Vc=4Gt^%ju=jeG_BzO4d25`8Q`vy4mA+fvxAX9mE0{=!slEpVxS+JKXP@a{1u|8y|@^v*J=J>N6^f0gN{cNWu+Tjzjl5%PY6VtP+9 z`T1MmQa{tXmdQW9@VQifC2-<}0hjjEKLL*iZUl~ZfH>-900x~1$VI^Kl;C)GHm|n< zxR@`s^D^M1_xHfbUfxdV7XQStp2AQOL@44<1IHurjz1AU1$=@7?cv{!JnvAzZNTx% zu;WkE(^vlg_I&&5=f3)Jdz>SQFiF3(Eq=}Cd-_U@YXfu+9yEy6g&Yrm5 zb|G!NVtxj_oBRw>%4q}_DU~TQ#t_qEM`k#^H$w7yhn^@U6AcFC?2J6@BD+|=Dq{?B z3UwJ{5FF-QA+S;Kg|bGY;1PKmqu>h{X`%%yj4?`97=?04s!iBfO}@vH$%9JHFbbva zWk#$UXBdUX(<_bO1sA3(w~JVJ?IKpWUBtR;7qKydi((B*E{atyZLGV}#tNks+{%9z zv!{6pEsyUTift-Z)-d?bRH}O3vXL}r%G8;&9>|b+8I~!T%0%86_8~?2*O#JX2&|Of<`pf1v~ENVAou=GpUem_Feyb`%WH@E6$1%IrCg=ND$+26kcp zUHPkzj}{d@nr|<#Wlzk@$So?gPZZxcGcl>qmcO(tFS~Riw)7=K&BWP7i%PQXr4z+h ziGZN+aB5^hUtBG`oks9AzN0H~wlv0tx5Wg!yPe;2BXzhCqu_Dj1sMf)Czp%)@;>Kt z5S=b&CwQG2uCm*2`T7g?VNuMM{DZIf=_XrvBt+r6z6yOiD%$arkN6C%{6#~(rr2}| zqxazG(8sqo{#lL^`+`#CpOBa;=P}Vy5~08Q(+T=HS}}B;#)r$un?Z->V>vg~=>TWFfwF zz{k@!4u}_y5Zh%1AqcTwRd5sU#1FuplAovWO#^(x;5Cv-zZW>yaD7VY@C^b!+|I%# z7QX)f*n1PWrmpRO^kg6j5JDK#Fd7gM5iuZD#GwgL#IX@=i&G6U7%eI);!tbDjAL;| zt2Q{&)_QTMrFIHKEh@G+)Jq*&v|7<>i_{_x#s7DmoRDbSdw=);fA4+Xd!Ktg9L^rr zUVH7e_g;I^<%Vs81Ed>rDc~)9Ab%EKqH`9$lunN?(UpiVm18u%M1LIc zkUkFV>mC@1uxQ{RKjlmQNW7Fj9A8QwfG_qlW|Hn~!cRK&=_|yS@ZE!M_I*gdANU?( zkNp?uW+y-4BmYl$311_=2%g!%`On}>>7fggEmsTD)1H0}(p${CwKGTRV;VS{YW&~(Ouz`cH^}t7d zJf-AciFgzEAALqj1WHzO<)EU&@cZgowVBFMWmF7a!J7=}}%b zJ&s6N9olFvYWw`=Bn>yryP%9-e`>Ok4gO zY_q*-4ox(^Jx(Li{(o3xCd!T}*T&{aY=Yf4wX4xB4@m+RGs-W8$DDj+8iX z+fM9F%!E`Z{z`>jho=iVZGO_+6pkc|I?bmxEtvmgH>QJS?2ZcQEqgB9s`StQp8tuyGH(n5lpfuW8QFlj2MIPIW59p*>DZs? z@IS4ujM7g=Vj*2Juz3id<@vYz$}m7Q0+?(OQ@Y!2=DQ1)^z^l?Lg;2L?a!E(5>|*w z5ZpoV#$uo$9CZ)O=iP9U2xlJ-$KUEJ%L9&Zls_FfY@esg!tV0?t-i7f3+plc&(e{Sl$pe4^K4m2XE~K60)m|Kj(uc4vuA<1e_UDS&Bqnxzv4$Ga8OlF z;&9{v2gD~m&(bkHD~Vny4NC6r!=Ql2AFxe68uQEp@*DPrgT&Z8}n?v#4F8b z_NqWLj$Q5MyJsvg_mAU82I;{e4Q|ikSOOeWFDV?3Pl1E#1w;C?^}=o+{1pxZheOZd zsNrw`jSY@}tplzYICKYa9||~#p1*p~Z#f0Z=GbR-z%`%7JRVUE|NK`t*#6RSHUC+D zBtmXUfI|)0^UPyYmVd1SP6r%RhIrtxZC4^2gwzMk2q`zK4!An-jzTCMx}dC zd>(Tc0u}Yb&T;W!?^Dq{59=ESY-8^U;q#ZzIcuFf75~>d;EKvcaq_q=(CPFmG`dwl zAKA}O3~_DKpWMIkL|Ck8&0uwvX00 z6*OHr==p08B$jI>2!G{?8u6#vq=qN=#{kBagOTdP#;e8xlnxO|(#2!p1znbo4U zD3;3O2zrmE^7M$Ylj~a)Z^Wu%bM7#28}2YGf>6>xwxr$IlDczL@$^(857ZHTJ3XlY z@4f58#wWxHOBm=)lOl~rqqsyA^#Pc`xgdeGjy*Zm*ajZF798-*offafkW zlU=^a2PbYr-w5s9qRLTK%MYKR{k;*R-zm3nr{QUbjWDf(@kG?=+k0 zp_Wql#ew?>`wEb0Z2Fhm9F(Lb3_1XzRZY`6j@62$X=#sPbp{GvXLa>ac|KrupS_2a zUn_gEloKw|&x`|UAlr^`C7X63+5%}N+t6Ne;6fYjQr$0Z&-hr=%4hSVkVUbYmZfZ6 z+v`bVoq^S-_C~t^I?NWcn&B2eTbv!Z_T>KDcG7n@yPY(irL%F<+a>#g{-n!{>p^w} z=rfvDgPcmc7Tgjhu;t*FKsTPbjSd5)w^;3Hn$~Nsfa7agTioy!Xj+>*@U>rr`hPw4 zL9C`V!P}l%fYeq0IMz%5T^pmGpLj6wx5U8MOKpt&{2j*8ZXMI@RGZv@wq`tahv&#_ zcyeFSE-HtHHM{1|h^kR-!c_(3)FYZ0;9@i_bJ^BNH7C-`ZayGT_j(Mzf`%+9s`Y+y7X20DbYPu=Rf!nt6;Qru?Cy`2~AS=DHK) zvOj|2%3013mK-((6TA?-Fpht%{>lACe^76K%b;ng$Uwf}*ATW}TBVHs4^2z$93D}{ zW6;j2^}dR*k~wy4+c%D<7UtQF?Fj;V{p)CBqmk>A`y&9AH;2-hVI*wH%&l-RTehe_ zsE?(wIaApvmFkcB1DckXp9%{^*&I+dr_-92U>l4_*g7*~bVr__H8rcB+;{#=)8fEF zA%9m3e~E5Bo9mOucF5=P<88?2Qj(RvL>p{(9vjCy_?hwD_|)9Ca;ROk4C46o-cx!$ zgHUr5*!0xLzJ5$v1W!H|LYBtYg9;t-)>3<4JVx!cWIh%4;bYs{>(i)dk+bodmOU(1 zYke45+}j?b=e6wOU_v`+iD@lJCcUFXk0(bDG%6}paeRNs|HmXN-h6Cs8?QeOisP4? zTcj{f! zEk`s@bK~1b#0@3KzonXIxuI?inFnkvH@-kV<`N$LMALGc%O#;BjhP$j)`wHgr8C3s z`ouDCDJajuOawr~_wx8)Iej0qUK-OEJ))MH z^+^A*Ic|?l+-q!{{*m^;ll!TUm_U*zNsm;JWM++)<`j80DH7NeFFq0ha^xc>^xA24 zt8S{2+&+)^D0?g$Pi0Sx6GFGGEAa9+GR-Rti8LQ6e{$a*xKJ+~o|oC&s3w_iG(JrL zrnZM90kfr|9??KBj9yqQ)2mzMy0DJX z89HDe3ZXTXFr5Nc{zeCsp@>ayrV%!S|@C5;Evt+lH0Y)uNbm}iXpSv>DQ$T(mZXYOUvzLYL3?sdpljQ^*49C}|ekZUwz4Aa5r*3_Zg)!G}9$UXhxt5RmwWDz-<^laz zv$+p`fcm{D`0&^bC?dPTd_l4eTB}>bxtwbKpU$cK19hu@4nv`=p4}(+y&qt1)w+v? z=lRi$Mj7|s_$T+}fLx#P!<`;pL^JU-D7GGRw0pl?aikTM)8!xT_djKl!49(*w+u4`LUl&`(4*Y3l|VxcyT_(Omoj1Rf$mFWj%C_A62*hqGh^M z3M#t;D7mDy_#ENe-{FJy@YYEkK4=zi9p2%S!nd!(2YunK6FPj*lir%r;e(#>)~pU+ zXZWl-)S;2Q_2rH@5BLUk_`1W_ufyjK-=|!!W%O?FwRiZu;WLlNR3b0Zf?JS3Tss*!j3<=e6veDewNbw zTDE;j1GIRb&matL9EOis3`d~5yjw~8{e!IUA4sc0+V@#s8CK+{Zt}G1mb?r;wSOk2 zwJ;g^7rR4Cb~|*y6YK`8@7tjRoEIIxUvJ?HbYlB=A{O#y4&yf zMY*+ccIY$h_j|MD34YSGBq7cply-ljMX3K1(l@^Ih2v-C%E0%S;{NaZmdFv?8T?~{ zK0Hl1%b#3s(;4jix^7iN7kc}B3Cj~Z@IiERZ=(t{8bM8@}r;Ji}{CK8HySkik3vYAB;RmqP%(U(g);! zuARyoj-7}0`+eG9DH+jP&d&KPI@J|lwBPU6p14o@%w7bo&`|%M)2zLqoJNFZwuhp< zN2C5a#;SJG0nh1ahlF9*HyBaaoe21Cb|TQ{r4MLLj(v!;ZA{~1NKWiUsCFcdYvUEu zPQ-P^xHg#yvY$=;EykADv0u?Gwqp;#WZ45a)y5Q~{{Ik_mw%?_*8Ef=bz;U)b?Ys5 zZeaC)-{F_ABNmNM1b56TadPd04loTi3GXXD}i%dSz_;{h~kAt&6c4MXlKq zwiIEwjbIb@SyM6iIQO$D$;=d-X5dJVnUXSf8Z!mXc?g>~9q%lLy(7mdpHERPfOd7I zMK`&!LtVKtDGhgJmC5sQDgxE?9pOwuYEnA+Y?RW^oIfv9Ih9ppj~llAA}ng-=^O*_ z$*Is&lY(3FSxM>BQ$FBJvUXEsfXJ8Fl9OrKBbU9#1;qi`A@@1@i?{r=&|Nw zU;mJVkkKJ8PvK%%+WsP%4Yx9CTnd-W8f0PfIExB+rUU5DQEVYn>B6#^7VB@FEcDnw zm^J&8#vEo`GKd{IeI5>gIVCy_>ilUP!Lh85J#%3j31y5Ee(sE% z&DOFBPdfhT%+hjBK>n`qTh2hpAMi|kk7wdTo{8@Rzktht()WGF-~So^K==pSz%PQo zkB$Fb_;KXLK7{Wp`03n%9`av%DZ6ZciR;f$|6|h#tZ@SvUC3C3Rx)#T zCJZOcN}E27nZ@=bE&YTIonU@4G*6|zFpGY3m%>3$ zI|B<(H&*DyN_~;F#sJpB7=zV1!vB$p1stG3MU@%l)Ak);wHRUxtiXTN)cjPID^xf( zBI-Y|Fu|Ip;7nOepEqLqtdtki*vl6v#60d6$vph-VAeD)BXiUEw?-ftR`A8aLWr3& zR-TM98@wQ8Us3;w^^E_q)eOiMi}eii&sLZe*7Aj=0Oor^Npt5WEiwlsrKDJhq!vMZ zoPeJP5p`yt_D`lTtWh>LG4LxUs}Ljpb%-s*SlkqDmRks99Z?Jjc!r^9kv3v2G-V1nt!P^&?{zl>*hj$9zS$IqEZpXU|?;*UO;;qGd7cbun zcL(uCV57&zpoY=5 zA;viaB(J^>Yui-&gWrf`)DbGPQIcd>CkgA960S-Kk5u>V2jG4bkphqoyCuny6vSki z1Ck>dN@O-^qUNH^pA_?l#_K;_Uh`*chH)mvOgr5Z*o$)0eF%E!OJSBLA0E1|K`%XY z_ktcRcwqYwA6)TLoqWi_d!yS!*tRC(LxEtW6`nwAEQVfvS5PlQx7Px^=fgS!ImaJc_~dp#~_TFP?{mzD-2TnJjvqW~i~ zm@K#xIClZuufXjHn2m75xCZOq5BEF{<`~@gqx&{Y5%O4ya96<7cu!+I-Dz2lu%0$y zOAxm9nJ@#wN)YxO;Am{8_5)4x%+6=RC>+-`nF$z!lkmQd*MPSK?+&~l;{6KmRlIlb zI^(XBC*Iz8`{5mmcNE@FGolc@tiT54kM|GG78mJCaNO1_BdhWXcarDsLmS>*` zE@0#{anH^PY;EMI5189o^nYL@ryg^W|B;QH0JDvpfDRiuYyV^;XN|3moMC1gIds?l zzczBzRvSP6wUP7xn2nrlrrb$*mo&r(n$uOw$jky%_ocpR?8QRgzm`t@j-0y@hEXr^XI-uCONrJ4w*%-(lT{HLxU@2L-#NY*%2la-h$h3kA4( zu>o{K_p9RHn0G2AqXCynok&+~r8mPixighMFyrvo^ph>63}^}_vr@281d~M>MseoT z)}(a4XRdf(D)p`{b%M<#XxBwqh<>9FOd{1kQv?`cAhQ^-CKdT-Y(HiDRwa3#XIb%m zHmiI0iVv(Y)s*_yReHnf609Gc(R9Vmg}`7Wb;I+5#EbR0a}0%x8R$C(4KQ|bjHhh! z0~x3$DikyeHUkbR~FP=%U74$gK5>_sgU&kdrG*I|dL zL|}lit`eBJBF_I66K+B4E}Fp=pE@>2sP{#|JM2;Qlh-mjucBBqxja78AWF73*p>BD zjD(UopLEq0ULrFi_xng{g3mJkVesjeqi|{0X*4@&toSF;NxO1O8&To^OT7qrJ%phwUt6P1D+Pnj31Hg^G$@^Ks$fP71#!LsyBzf* zq`IPZ{$1&OUFB@@gq^3uxq~lhyz&HI`*;KD1cS;eJu6}cK;t$Xus(GT3Z`L+s(K)_ zVXKjwHBb#IEEH=m1!sb}OD0y?O+2)voYN+9wiSbu6 zdeeNfiLWQe=Z@|+O5OLs*u02i&+|n7Qv3|gAWx}e5{iX_B3^0apRA89))olFGOciJ z#=3|X)~g5WdAjRC9$uqT{tvFKCT0!8Sgii~V5gM4HeN@x4# zD-mWRVLjsWo-EsX+-2)^SUSTmTjfuiAoGsI$uPgD!d!~3?;4sc2GLYG@mm8}duV+^ z3;}|e#i59 zy8^n3W0)T0wp8O?Fv=&sbTgGY1sRaeRq5XFRw=r zQStT=c@kF0ZQ6IvDb#PeCNp*?@}vOK$z6tL3sQo52xRgdVSIx-jGWczCAyW2acK7e z~M&#nMhyU64^wgSSSze7IP|DB^0C*O$3?^r9r*E(hnCNqjLY%X8{VMwyx)S>9v{ zpZan^+zMIoq43BFnFiwq9@Le}1lQc(8i|r-3&cgfn&9L3dOGQ^)w%>6W#PPyOH#`-8<{)3Y7iAN=8L)G zqB5|Uj}tdd@nF0o)jY>A!V*y~T_y82=1gOa=)F0k#|+oCLPcJKyUa665vdkC&S^C9 z^46;ynMn$>MLx0-*i|{|)tInY;mD%1F0Q=-^5rXdKwaR>D~=6U z`#2=rG@-S5`b4TbpKNS0@v0It`xM7S!sO>Z{ok0XD-$n-c{+==I+y{TS0;v0URbWf@@k5*a4rn=!lE5)*2aq$ zCWie{)u%W*s6INVoTsocmj^?wk+szh5io*h%ug`cP0%5``~`CHd`00D1rWmYhlI^-X~u>{))Xucjbyl&j07jnArpUxwGI_($8;M5bYv{fATwJ%`Fq=UIS=!vDD$<( ze63EPva!WC2X<{?UN7-3A>So;I4pOtMc$0LHzv$5qX!#zCK0U5z>*&3y+6WIi%A5l zFkiq-DNNNhJO0KR9&9e(@i%txVEY6s<^N+-c&@P>rtm)hzrqyW%i$pWhLkcitvzPjTPo(blZbmdPt^vc7w)Qu>)q)`Nm$7j|S_)K#A2 zk1b{1b;%7$LWku!W7OtzIzwrIl2L+w81^e$>l6K!)$*LfrWH;ikKufaVZXdSm;Kt} zEr$ID8n=9WNmpW%JpHUsl}+;D+Z<&gPiu1Fkjs9CVV2~#yEdp@$W&a0MCzSAqQJu9 zyrG-CrO&O$)RO9?Qr5KLXpCfCN)WpX3>t6e)mIv0tTohhJX+XbWz(*NO+M0r*5pC^ zj>gD4k~dA%X8Tvj8?w}gb`Rit1hCdo$cEvJe~j>$+rwVMZZ+rl$d}D8R0ST_vPTwZ z235BcM3;wI88Pj$UvWoC1{x>)$Xpp>;L%nzHG?nT7D?K8(s=Ts1p4bk)Q!$MH8xXO zF3(sXGSqi98Q3-lth|r}=Kdo8I=}-zp#v=dm?+xR zRhni6D2f0;y#;_@&|{pD?K7<&hU{*QnvRB}^l}Q-D(Zte_@#YYblGp0l_ScRoI=Ma z&e#A{0HDkU;7unJBX1HYiaBD7zY%rul@77eQZ@^;q+4h~&%7<_(o_1H6(Hyh0Gzi0 zuovqZB`L*FZbMI{tafGYNq13yE91_61;+KaFs@P-zbV(TQ-KYD`!@hcw*u7e&V|88 zFDr&|=K(O&3J`xdcSNUx0ak$Z7XdKK3Q+rb?ut$YgRB7Ot^#1T6(IhUpr(^($nYGt zP9S0eZe-_64y=>1tp%l!e4FdoxnPJD!@Zw@A;XHH=!e`D&Z00YK*VnVm}3FpC3Oup zw~sTQLW6OOE2kSD}Y3n|BL)58-QL8n?j^ZtpG*d z0BEuShj;B&jH}J4ZvcDqOQ_u>pO&M&=5OEmlTWG zvXHUP&zHMCXL54Vcu z%va0hrCHYDvGTKwcdOJkG>o3oB&)Q+u;vQ@Xl(#m0dS=QKp7ZUlgluMcNHE%e8%8Y z93(3aks8+v?HTh}5#L$t;9c;_@EjotICQ3z)z#f)F}=I&j~h;UVzj^lzZ?bMG^a-onYl3m|~aNVW@Z*mn~;smYHX86PVSYZGoT zhyuxvTw?d+D)!~pk2qdV0mR&q^V{mwy3&+HHb9cNe@(Xkr}BoTe~dA=j8nJOA67Sx z7*=eljjyvRv`L1Y0a~gJ8j6<=ob;>8Ft($O887&RW+-$$?cFWS`H>9raHh5A=<^C4 zy$ceD^X<68@2aluM+`Gs$XL3lVq8-BPHO{g z9W-g7>ao^J#zx=J0g4Q(V3&_~?h+|IWJAV33LU!?jI)ZPfQ!|3GC^-E8N+|Ql92DW z+Db-tTgI2w>d{s*W-Y0xNh-H#<+FxNx~p10)-}j7@k;2rf1#qr+IQvuaNZQ&FxpDz zqOM@qBr8Di3FlV^Nq<@|bl}=b(Cxz4d<*7T>CC%dz1tzz+uBwZ|B)oUt%=`jsl_aH z%kz^CtBS21-{>9?x9q&WF{_HkFdLw&Gq=;$CZ|%ow&_^Sq>az0{FyUYH|2XCLe6|cy zzb@Zzy$uhn_G77pJLyx2&zTbqr%1KYb96fvWC}7Cw5j}v}KOtff zPiR2RDJjGxpZpe6285E6*Rp&reuvm!P`-QdIufsi_LBez#s5uv_bz zuh**W6k1uzbfH1Aui3HJvhV66S8$IgP_^ovYc2 zP%RhAlU>Q+oY~?jPaR9-)qI+@x z-gT80XYju0U=EF0{|R=s{d4kPYTSfsAt&de>=&Z~&n9`3`3l=M+cg35IdW zf_L#pnw?(_G{taE0OVSnJ=a%RoJcl`OV;af4(BWk-p3!!g`xsDCuqpFgu>La#Tj~y z{~`w)nHR%3fg#7@j9e*5Gy@DBR2yS;=5o%$gAk@{`!K+SD(8fO<`T|XRu#OJbJj=q z-o-f^V}_J*&e}@veVnryw)Z$El2vfdrs^Rk&RLT?sFrg+7R1+a&LGFh9EI^kv7D0_ z#yJaz+^*)FUk$1kylRFe=5kIduEh!K$`&WsIK>PL3^5jGNL`M_+51uz=R}j{={eZQ zl`$44@LHUpfpZQWSW!K~3@aWZGQW@cB22qU?m_bJV z#)0^ps}!4q_BT6xz?hv&o5f#n&K)X;A35iz^^U)C&d-}2AF<9OYu5_WUm7EBIQX8d ze158r&hh6c)A^UO4823{FcV+7$U9PAAxNJ-U)*rDMOHp@qpxn_ox!Ho&5I3p4*kwt z)ZgYEIekHpzV~BsLzLpcsGSPkBfl_Ht89khgLfL3i_tZ_BWW^0`e~)8;ox{_`6$1n zw{xod<*%IS;C<0O`bf{R^szyKjIUTK2XzV7h_MmK9MU%D4oK4`$am(NweCzClyYK&T89T z5V(?&+j)nsmH2yy@MrY#&T(Dd$GgD)y*}Q-TWb4wFW=Dwi>zBDD(}@hf>hqcTjEvT zYj@~X-s>kUS9zB#FH<3Ht;&1L+*>N|?aL)$-p1uYVct7V#D{tBI-w8q-m|dhrW*HeQ;Q-eXaLZ zB%4?iX^4`}-ztbQ3aK3yi_?`4-yQPc>WV&}KM^kPp)P9Q>D-M8;IHs4dvE#nMdk68 z!K<1!iyb@dKT`y6BJcfGw+@IMJ0HAI=KFeCjf8C+;n^qD53UJZ;_jZ_q>O!1I=6n1 z;A7yFQs(E{`o%A5G317v#C?#(CAiQT;x@e!qO{q`)qBQv3hW z^Tl`0&e}F$YuZ1rU%&G9r1L#FpzW)#Uq9&Oxv}tK>f-UUoDTh*Y6IlrI5_v-CC{|I z$A|U*EM!69cQ3sD-KaNDoV{^);xyUb@8&OB)E2mD{LK52N;@MvxddI%_(aCv>E1bmnr|uo}j@WBeu(9}ilx?&Q&|MMIq5IT__72-aTP>UuVL@xwc^lfU_ITz@@f z{1?sTgD!=hJ=rqgN@AeDVw!*C-k$PgkJzhQ_xStU&+$zCDfQ@K@3gaL?;Kp6dHcNl zOsur0oF^TKbNn$bSDsUs%LR8E_=%l|HbiHXrCo?lWQJY1I-4nIn5yKTPi^4g_+KW&Zg8a3F))xvN3Gnpm*HlZ=Crh z;t!N$Z|0&4Z=7Evzy4F|!?F89-?|y~+r-a9Zk)U}ee$5LC(mXa9X;T$uqYQ)Ob+yq zI)3ubN1r`*fB$6i(Yw8;Z2T>1n<30YzGvs6`%`X=dz7{5^*6ST{;~g{H%Fa4UC(jh zVFL%B|F{|)*gk91je8kh`*Tm8Y`yo%kiB~@ULP>{ zQo+xSNsB5b@7Z*Ho{!&{+r3}j^i}4M&(ImBbQ0y=)T=K=1`3X)r+BOkspd`VmvHce z+kkaHz7*T{gBHfcBzJQe_P+Aet{?l9Yiokl?z{%a5cksIB_o$E|Mq&=*I&K_{HU@xjSYndl!CpFY^;=PT}<{S({(on0w*(0X_ktxmB~Y7e;+_ zdXjO+XSes{UP7Ev?^*uCjn}rUPTP1V^~nCo+rO#4(b7CB^ydrL9}HR&`tz~b{Xbi| z_viQ%{zWyTUCt<0C=+gIE2Bep?B4T=%c;ZhvCPRlm2k{=FKqGO751vGv}m%Z(4q5H zyUxoSuD@xJ=!%vV1xz;h-^d)kY47D}F5}14`lkK!WZZ*K{$OiuwBN0g>nT2G=S?3_ zw`cFg)T$lhE^ON~LJx z&8j7*C(qt=J!$cUH$LBUv#ICck$ryte(L;1Bj5S?*sn+5-rp_MQ#|aW!F8k8X;P`j zRaUoTc%?W)I&>-1_xa=|HKVj_s#~YIkQ}Q7t&f(Vt<)X-tnU1WCx2ViHp%z%24{6z4Uwa6vyFMxoGo=HGpCN9^!(2e9$%%XOIC|&)+lBko4v3d9q7Z^3&wx6s?Vf< zJ};;1JG-3b*Ude+`sRQGA^YE1CKY`@#>4xU${WL@aGn6YvW2-zc&i$U{@2D8V5JQ34&_V5p`Dc#kXEnnd+<2|2+SC;kn zU37i(0^h|q-~Gt<^*bNm_g#`AE__`QwXV6$&V9h%Q&EFM(l#x-88-NjtitPyTyBoP z`KJGlXz$@OTndT<4U5L@SUWyp*0>u3>ZU*_Cd*jeA0ElKF=-O{sm)We+~or30$W+hJN1G_?coP7Ak zNsIw+^KZUjw|wi_o|Cs{z4Jmy&y&XwF1?JdAxfJ1!y9ea_x`Z-@$Wafx>QyA=3Wbk z35sl0_*HE-goGat+_^9OWN39r-&6g5+}HP;Ap)nJ?=(29+PQkrL&>hd&l>@opEB=-fatS9pAem$Me0QovWjRd+sioajR$9 zj?pqpUeWlU9Rh2%t zpPZ($W5II0Fx{_>8N5<3xNhOf%nb4CxC{`FTh`*m8G@{Zg&E31k2)9G?PA##mGdkd zlsC(owX(kQ8lUg|yc_)J5Ijw_Y#?rj*2fGuEEx1DU0xkn*X*996Thw(_opl3;{FD@ zAf2HT<32!En;phGXr6jsF zU6YM_>7w(vaatQQpoINjQ60HHCbCE{aD8?8j$2$Ll8?!j&FQyx_=1aVNl|fiB_*Q9r&-i&?%J#j~NH@lB@qE)1Vq<$}b&I(!vFxM^80+Xl1{tx>cUR_5LeeaAEs< z5Rj+oC%Y||{gNS@C6~3RWV0G&zcxGms+8SQ$-ZDizR=3rRI=-g^Sxr(uZ_SUIC~6t z5>UC7PG?GetQYvNbOCL2#~wGsX)|Pz(yZrps&Bk9rby~Bz$2h|jrv$^t=?ZNaSz|F z@bDX2TRbLH2?GkRs}{ZLwQ%d1fSJv)blQsFp4!jtAEKPw-`>7YALY!Xxv$}8@M*K> zD)IACi$ymZZQnMA+swat#Bbeu$0%RM&$jVnY}=q=Gn1yJD(PpM|0Z@Uex-`EW(}_} z?8Ro>q4@Q$&AixVG&E`MRLUx5c6z!Qm2E8hV^k&V*JY&6&77V(Z$Yv?X)aU)EKZ#{ zeby9Gpw4=38xl;Fg}M969pkQA+OTUNr_|n#PsT=92c$8n149hO~Nc)sbubjZ@~p@;+AT)TALX z^pl@Y6Wf27({k261tYE-v@3VuR&;8?U}Nqebns$!hc*dqmh1tz2@^s9%KmO$XjClM zK5r1MWY#m|gN5N(=e(VhCu;~)m5)-YUDKZn6Klm6-Cd9Lj7%R}+pxz}8h6BA9sl+R zfj==1)81b;z)U%_9LzKb= zQKQbS?jq09X-D`dx`~Q}Il5x64f3+e@JsTQJVjl&Fh=cU2)iWTN*>7=_4nDDu=%=` z3Z8uunh~d}F3ERMY-|i%;u(zSkkrnlUg52X9VDz1qXl1lF~oMASK zbgGl`PP}cE*_wVoDlpD!H95se9V94bkA`U_-PNO|HFwH+F6*n9 zdLKsd$yv4N{g|jOiiRYCzd~flxMfm=se-|mw-?JB!>?}7n^5+dqR|}7*m~k&N$9$C|EA4*DYA{GLk{Ep_ znKbHsl*?p9nln4y^BQvm1E*@$eiBh%n049xZFbmH-AJWG^mDdDj0zEO4m=%QlMz$y z2>zA_Rlab2V@_Oh4RZhps;cs<{DQ<&Dy;3HPOBPW0>xd>0uoK~0mf=8Q>zMc#`DvR z{6NK*iTW-w>DmrT{4?Zy*2h!=?S<;jc}BJPVZMb>|G5%}@Z7lEpNOfEL160r`g}jR ze!py`iy)7$Q5C&4Ig+2`W2v8-c;m->RV$;B<+$YX9W<&E`-tJAo66n271g3VlhjnC z;i1lN*Lc{ayh1Ht4Sf5=11@RM&@Ktk?%pwpl0*2{)D(Yf=va3Qg5%mXMmAupO zxN^Hn9+4nD>>a>cHbuEKr_JT+D_|Vkbv|{8Us=uJ5c+JeI=5M!yQ}Tl=1P^nV|9)@ ze=2)EGO^&xwj+a6P3rI%iJk=-ag_bXuh z?pSHo2jV8wuriqD0}(o*A)o zEy;5{(c5m7=#DFO?-$U$cN{XZy+Plp(+nw8@s$VCS#l1(*E;;Z%#D1Y4`mvmV_(ZSQ{R(BFN%Nuj%j?nDX zGzxXMdC{(ubhCP9MCi9ND+jCfIgWL`?N*CEI|Hd=(m}@D&mNV1sAqv`@&e0{(L>uK z-cJbzJ9m^b7Ugt683L#!{vBHZVRkQr@PKvUteEQFXkUZ(eqrhiJxqICHGKILleizmg*xfx+XAOpHR_;~;UD zDx-}nxpA&>lzJ&eD8@ptEmqNpq=rCL3VDB=CYh;4=^mX{U?5UvSK0}tZd5DE6nPlp z%mS#vzJ3hVrdikhL=n|zEOnhKIO0%Xs?PuvMu&D>WnI5qn{}o4i;^r8-yH&rWvW(6=?->K1lZFqlGjv1Pr>2Dei%;jMOh zQ6M^u!jIw#zi34EyJ07F!ed36Ff`?@Uw$vFcH-G#)GU(M&(q2K&^RvYl%tami&pRH zVA7ir(S~hjl6pp};y1D4m|DwQ!zGfL=Akspf4;;MvVJ#&d7}|yYs*g894;)Okac>C_FoeKSL&U*lWSnB#`DArD^udIW8}| zFec4jervbj$8rp78B{3`TtwLh5k^z@9G%MTV~nQk#AWog)v8O%OH#;s<1hRCy+}WLix-vo$ zgkD$q=A@z8en}>KbCs35y+5zcRep~Zv18CKZx8KkSM8)x7}#EBP&6s>c%6jf7>xZi z1?{2RdqPR_gsvR?ML#2X5(2g^1b-Q-9;y|po-1$&Hoh^jU?ghvZPaK5YBVp~!eW-k zgIFHNvOFf66;|0|w9djK1K95Ntxb2UcCzQAA4SWxb9D8+I{J}cw0cnobKg`%n~H;Z ziXJ}Zu_G$PPAsY<$!VZweD|)T(r*>lb|0S#8=;bi@Dzo%z+VzD+ve|S?0Nl0sB~&6 z?3ocC3Mxt7aB@|F;zy$RvjY);0*CV9-cQV!R|5=&(_jPIb z|8-r`#)zA6y4(?$Wau}ZLZkF|fx{SXb?Kqt(TJi`nhQuXVQs9+yke54N6d~cC>CXIE(`fpI7pRcT+d?g=JL|8x@3AEk=%L0|48tyS9RT`5pIgGkM= zoQa-yiZrF{`r(o4kkIM7N{d8w@fFq1R@^#)^i-wL);UP zmyywoy>bTHZJIGtHexhY*(pE6gc7tQbs+_U1kOQ>dH&W@J+?B-|qPvZ8 zt}?GyZ`XLaSVrL40d=m$m0^}uK^A{C*72*`&=Qnj~jj}zmiMoS`H8m~z$U1j930P~t*66Ewm5sl$7 z7{jHQ!UWNhs52ZY4CaQzm}=6TvjmgR404#@D4&ky^GU4b6||0~`6RpKkEgYKnFe^y z(;_6j7*n1BH0`7%{}mZcJ3E&A%>))p`R*jJu{8e-23U3{fYs9`K!zP=r=R8kEJcHP z(?F{hXG8}9bo0OgxAp${&2?RW3||p4&_v=dGx*?hzEp!Et3qOw!tUC++1(*mXw3Pn$g6M~I%Rg9 zy{SPU46HC+N@&!NGak3ws5cK=tygE29k7qzMCudinoSQ>nTi)CDED;N=~6m%aOJBHfjG*p|4wt?g#YRxsY1C>e*sBgW^+V?U$Uzy6zS7?JqXmtNw zaKbWQaq{9>Cn>Uv?&(K*Hl>ek)ONcl%s67-W?t$fuzTGNwA3*!X7{?;-J7dyu;c>m zjOVf|pequlCp%$rqX|p>3p8O_f12hoGbtE*;vxLTuY&4gDjgQP*!L)@r zbP-tuWLnky9Jkz#eO2B--b}Hmv|}Z7x`#0DMT=ODO;QTG#9o?*EkoWJ>_QgD{UDrX z?3-#ChO!4beoGq+#S5_$8=ml-M!5S_MvS^YhAz2CQ|=)fd%4!hP9(Bpj-^E=E_CZ( z?KHPpq{}#;eOX%g+U(}EzTT?O-+g;LKgq~%a#9)j!}khuGjE!Vn2Z$d!CHE^Aa@+R z&qt|hx5=arcM5Wsz`Gzy75|n@I^$hIZsIMIF$2KsS>WW2Iz<_C>*{XPLANmoH$yEgZc+|#dC_eWu40Hv70=Y9h~j3 zqwryL`6`7scK$1i^7scZVaX1mp?!|uT)nFl+&*&hwWaZCdoWAVpXrc8&#J8oOQ6+8bSFl*-YV+3oys@sQ3+8d9{S7!la* z^yvKJ@i}kJqVYn7WV!k-IYZDV$myPxZ<0<(LchY+YfH|X{NGD4RNG_fHdvn&o_nQ0 z=?#wfX=v*V95K1PTvkVuM?h<oMvpY1B_#uQPAUw^ny9 z@5|-&nWS{*8|c`xutkFO=VQ7Yj8M#ye9gnS=NZV+=K68|DXGmAA<`W)9Xc|2b*ucx zAssu$GW$b9?`_rWOa|3)(?!PfvfRCu9Bs22rTo>j! zTN+C2Bl*25^Px`cV|jCxoy&q6<|guq|FK}IUqI81u9$W^2rJb?&t=OV+GOl9w6aKZ z707EPgCw6CWjEE)m^nLUqag;`jdNuCSV(1rmbXVLeP0o6>3Uh5I?w-BT;ML)YEa~1@;MK0oM_aG_8J#g%pivo}H#dkgnEdhl*<3%$ z*`Q9^*l0posJS>8>8l3vJ0Ng@B^q^{1WjJOFq0$TjKYyDTE<@MvE<*DR!c*Ba6 z#HeMziKo2Iu2$HVSG;?jg{)~V>T?0sOkj@)>`elTCu{-8ROO0H zl{CrOO4ArEO=Eh|jAawR1TO+CiRLqEn$JY80JgFh0Ct{^GuVmEN0`{;P6AjdO>8o{ z0L(-ao2Gn#Jtk~MI`ueBVABES_Z+}Xp2$@1bVmT*(UYWPnEv?w2j>RpbP&P+;Teeg zXzmQ;r;Yrfxq6zvS?3v{wO`#F&IhDN9&L^wJMEfY|Kc?m^@Eb#CSyv>XO<2K;umaV2g}c@MFZR9# ztf?z&`vj06V!%rk6=+bj)FK9m5D?pNQPHBMO0CzD2vO*8i4YN};}=*d+oLN+2@j-0j@_m`u>&Rx3##DI{0fbrdFUXY{|=oD!fLQeIk2#RDy5Ah2p=; ze(RU+Tm4<}7qV9$uJSeaFF7asL3zNpYh=lJ*(Lw8zRK|>7i2fb2KsemmRys)Kfcya zx2NP=*^lE}{I~-p-^n&ScGa)?V9EEg-#-TB_!w~C^I_be9qhchs}?lfCU3!FmD(K7 z=p>}{q4WnFSHVAw^dwUJahLFq=8@^6@Q-~+jy_>%1eN;=H<_PC%I~kHoW zqx;^Xo^IeYUVaN)CBYws5o1Ar1{~&Docuw02>%8kwkPK{04H~gxC}xMfvyFPKcQY2JPbJ5 zaReaQCCUc@C;g{@OZCTtK$Ex|5m`WdAwf#24kC1dc!Mdw`@*#0>zcU2Z5OZC4&}l6wd^ zl_PmFcs&S;zlp%f-y%-?(R+c81wKfE?*UGB%mt1=i+nS1+KM{^pq~Wq08Vn{_$T%M z9pGfoHsHuw^mxKqRNn#MRKM6RC2;aHeUvzO+y%c237qB#!a(x43mlscocsuvTgDgd zJhTBgJ!1~XLFGsf$-fR9RdV!{d&r++@}Jnq-(d0`HuALZKAOP& z8#vi3w)YX>+xt7F|0Ns!N0|N^8~tAbr}BRSZi!nA92Xcv?K%Zq9FJuGEZ}7ScQ*Q$0Vn%i zuuzcNzn01S1DCdU8Zf+~gFW8?C;zShF4{x5n^N%a%fKOGkq-nO z2>M;%;(3kalYo=`p97cLlL4H{Uj;6;zk!5&{r?TqGX=P`y{=;fI~Ur> zKMb7gTwx>sIFo zIKofx116F#;546v0+-Gwv__$RNdPYOk3Vo~Z;Fk6Et6kuBfo&jZ?cgu08aJQ0hh+- zE5ND0{tR4+RP3)hrvI{y{!f_xdp7#7GWii`tkizlSiyc3aH)Tkz^T2nY~&-Ee435? zd?sIPBfo;lSJ}u{GWic}v48h7{ePCo)A{`~rvJQ+{+qz*Jn>K9((|wTBZB^+Xq;4k5OA_z4P0vf zRN!R)lfb3+rvWGbq~o8|KiR;^KStnE|Ey#B*8!L6|1H!1HgKu_KLIED5ODE)NB;Q| zIQi!ca3xaFKmTU>@7U-c7AV+15MO4H>YoIh+B+V&)SlT)KE_5qi^)G{BfpNxue6bW z2RKaOHUf7O?Sy0g0G#~u7I3M5{sNrrsk71F0i68*7aRTenfxUidGALB`G48SM*yem z7jImwiPtIQ&l$jJ-S8-Is-OHxcq)^R1ukA+P`tejoa~+h+_L@${sC|*zYMt4pRK@Y zy!{%ubRFw9p5uamR|21aRP4tD;Ak565pWc>;6~sS$5()h@$ee#d>Obua3@^EQCyIo z*C|dI9w5PKU2zXMmUi4U;N(}aUVOoT_k#hr=m%`-$*F-;d)EM$&Kolsz6rS04?5sf z{`bJ8ekf%4pKS1r4F9VQ{vN|`*x*MQ?u?69ss6t+e54J2hv6YMxF?)Xb|%>1fecTv z!DASnZ-Xyn_y!w1kKsFP@bwHoY=ghU@OB&gPYl0igMYzrdbwKahc1Q>x54{Q5ZW7T zgO6tTR2zIU!x!7&$qdi4!Lu0tk`2C&;Wak+ZyA2T20s9t;`lS*SbA9E^Bj}EWh4J1 z!~0{9O8wvwEVNf?gO6o+gbn^U!)M#z&obO#gBuyX+6I4-;hSvm?Z5-jo_B%cRBUP2 zG2k@5J_9ZtN9Tdly!172nlJfrip(8`|H}sVnkdK*!Q>{DAJ6c|Z18x7$JyY|F?^8? zUcm4?8+;?fU$((_GyHcp_%Vhbw!u3Xe#!>F%kXb)@S!T9z0R1_rR@!7_$V7Zf#G2` z_)>;HX@jq3c&ZJ)1vt&aF8~+kVVYO#nfx2T#q|c^CxBDG?gfrNOTT-B26Og)y5=;!Z%V<~3& zi1kbU&&4ew2VC-gX4*Qs$oh1U1tN7UaNz8mtm zq_KQ{NxnBdy{&(GYgcdfKWKX&RQ`Xu-rnr_PvQU5_CKip2W{7XN`G&0*qc2MTJM9( z|EKEhtzEs%WB(r)rmp|n{LouJ_J)6j`!bHM6Nlmc%RtNQY`spG;!AKp=4l*w2QmLR zWK&Y&rp4uC=b7}`rn#ovjO^w723&It%M7`O>{LT=o+&qFWp=hc%aE3mx(pOVQV0#6 zDbVfutDyI?3MLOVVR6I}P$QDiLQ?WDSQsNS0 z=FUwCNQp_B6|XnxlM9W8dHT$ZG`%S&*D8=WV{UTFoT<~M&Y3zpZYs(1yjfF|6H?~I z%t@IYGi#~<&7GP!H7@z7IZ|l{vcX|t5j^Zj9!!nnGLe0hQL7x5QHS(Z#?A?|4Ens4 zxrQw4kH(kd{bS$!;4pQV&f=491I5pqi z^tsO@QGfK(Z^2=c1lKvPVv^uMTeBt!uIr_Y;G7v08+>f>Rt2Zz6d02 z;xqWY0rk0seBoXLXp-X?pVU{3hdYk(@V;U^+%Cp3z*h>c?$x+($I%_$mlMMsJ2AX3 zCx#17v(0!Gpc}BSLVZole0`jsqk@aF$&e z!A-rC5u9aLrmx8|!f_x)^c6@N$AP5jE08q8*(*%r==2q)aok!>U#-- zT8Eu*%I>3H6Y>}%eObUbV#`x-Wpj)zTTU&AI+@Q`hoMD{f-A|v^e zk6NX2aPm>BBm)3b_UyT{S7t3WuB1=!V=l%TGs3pLR$oh2!h#ULG7eUUIgXex z8}}qHNSc}=%M_N<0Vzpyo=Scy?y1C-8MEgm$6)21LL>gE__-LLaXH39T!%Oi7GzRL zmjgkIP8#GkN)lsYrzTo!bs!-$O4PwF9QXk$8e;X&oTnsfKi)-Fo^??u@g3FY*r9Ns z%?X(I6kvxFt~$(SIEm7ZV<$|A9r7E0H6u#fM2!dwQDc!7d)Q`lFlonEC2Dq6Vyi@L z(@Lh>@wJ9pZPQ9o+NPDFB{r=Tr5(4DU3J(Q=(v^a0>W0>@uh>BT{_rF+w>)~dy?Z; zI$pA?CxwfF7+^nYa5}M`Ozf(6>vH|BE=pTJYg?GzG=y)N)SIa|1(P?EY;QnBEpaGjxu)&O&&add z(4%0U!DQt`EkVO#($c2p=1N*FttTUIjzOPEJz=Xw#BJ-1H!NMb+*X(edrIol(&nb- z8VuQ1@AMQf=H{4kc>gV#9W(o>xdwJ4l@T+tP2p;m=a<)FK=S(VLkFguX}LLB);lMB z6zEst9;AVf3fo|z-#{?r>ghKa=&lQ;e0OCTvfwnnqk=QSD0C1eS$dPn&?7!9prt(& zILyHK9E=Hr)UjeeFU-j{^lZ0qKdXlaX(;soEW@e?YB$7saxJ0K0}f6tC`d`ey|CPs zsU~3@=8=zZ37nI?T=>lgQ#vl(@*^hb=|>?ZWaQ*&@XHUX1f8p zX&JeOr5JA$W3u&`g{F+uyovZ33CZ2hiF0#S=B66*CW^O(A;3=}Jz;iIO2%Tj!wNO=-X~c5w>4El`TtqvC*+tS! zv7?2_MZ#cniv;1P771;gStOwS#3E%{;zSxIJ*O4H50ZH$<(D3iCGro$Qc{wq&QHdV z;iO`I!j)+dOH(p4a35EnnU|Pie?4#c1s(CZnxHFqk|W{ZaK;S@amWq{W&DURhx`b& z$akzhLew7-;kdj;EFbBRuTe3+#<6{xP+=j?)@&3k;^b<1=9VZCv48AjaTkAr#E<*r z<>eZd??pr+~ecga3QA4^Pa{590j>$@57t&@X+Jv+p0t36T}$ zJI}sn=z(BwwIb~LsujT~J{EKsR(LSjn`Y5Lj{T>O6zY}48$VOA9#pd5t-`ZjydN5<8}6u%aA>bRWK(6ee)(o*xO5r%gjM^6@iTyf!;|8U($t zEVFDce7gy^m(H5hcNk1U81S~)xd5|LUoMCcxMC+;?qge5)2w{2kvmBYBfF~m9%tcV zr`nba7rWDOT!!0^Gyaj}FWDL1+XxHq+qL1nxi-9S*M>9K+C_`eavJTW&%#BI_Tm81 zueOeh5IyR+T!iS?Ub`|v94~g7Mc?(JS@fV?Inj5$loLH@S5BO>dMPJ5$gZ5|8pq}6 z6zg!5&?&c%QKAu-26%euc#_rh<^fIL9?$ynL zHI6+ODLTlmoES2_loJETuAJzwUdoAXvnwY$te0}4+w97TA=67a_(goc>9B|Kh||{N z!ZXfa@Hn1wS~NS39X#oD9F=(1*;iEJX=hK1upnfQJAcupUc7`yo_*J7vm~&bE%@uF zU#c}k3^AL&!IRHEYqc!Q@$}Pi--Pt$!H~W^7}Bc;`KzyAY*24*4C&jAA-xPjJPhsA z5uu`=Y#kWd=ODx*Q85HV;VApds9<%d=qEePeGWG~8f6CCmFwFBcs$B3n61x8g|idVSQsJlXeDyzP@%CWkxz!oyw3V^+rM{W)yUwK#u^Br_w=6qK5y&otzv z8q#`RcQJi}_rwaNPi>iiwahy zR@t>&EYVxb)xEV`-CN5o*KW4H>g}ox4|scV$t1g$vvyc6j_m5NYdLG+r0`5}yxP4T zAx3F$R`lkZ-Y$gjwAWS@v%9xTAUyH4Ey3 Tpt%FZ`p3AKGo?H~KH>TDh|I!5Wy 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%0ATuwJs)Uy`tK8sJCW7 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

%>ynh3;wh~Y7a`?HLH7x8^jv&en3$nA-ILp=Vv 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⁡6j(5ZLQ7 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≪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
    wm$GpZr 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

    q5iB2S|G_SCDp?z+dTrMY0bUKE=M*3^g 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 q( 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�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

    (cc7es>r_T!ZPcT2U4?R+ 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 `3^gSuOPQ%i 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ɻ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�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 )M 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

    S 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‎QgXJKf9Sm;mP|z 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%0AjW{$$$=OXVuuG}4iH;75OaZ; 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