From 450ed2f48178a7280f71cf1a0ea7a0a0d517487c Mon Sep 17 00:00:00 2001 From: paras chhugani Date: Mon, 28 Dec 2020 13:24:11 +0530 Subject: [PATCH] added CoreData as database , and used only on homepage --- Podfile.lock | 2 +- Pods/AppAuth/LICENSE | 202 + 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 + Pods/AppAuth/Source/AppAuthCore/OIDDefines.h | 51 + .../Source/AppAuthCore/OIDEndSessionRequest.h | 107 + .../Source/AppAuthCore/OIDEndSessionRequest.m | 190 + .../AppAuthCore/OIDEndSessionResponse.h | 64 + .../AppAuthCore/OIDEndSessionResponse.m | 118 + Pods/AppAuth/Source/AppAuthCore/OIDError.h | 393 ++ Pods/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 + Pods/AppAuth/Source/AppAuthCore/OIDIDToken.h | 91 + Pods/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 + Pods/AppAuth/Source/AppAuthCore/OIDScopes.h | 46 + Pods/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/GTMAppAuth/LICENSE | 202 + 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 ++ Pods/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 +++++++ 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 + Pods/Manifest.lock | 38 + Pods/Pods.xcodeproj/project.pbxproj | 1982 +++++++ .../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 + .../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 + .../GoogleSignIn/GoogleSignIn.debug.xcconfig | 11 + .../GoogleSignIn.release.xcconfig | 11 + ...rship ios-mentorship iosUITests-Info.plist | 26 + ...rship iosUITests-acknowledgements.markdown | 625 +++ ...ntorship iosUITests-acknowledgements.plist | 675 +++ ...ntorship ios-mentorship iosUITests-dummy.m | 5 + ...ts-frameworks-Debug-input-files.xcfilelist | 4 + ...s-frameworks-Debug-output-files.xcfilelist | 3 + ...-frameworks-Release-input-files.xcfilelist | 4 + ...frameworks-Release-output-files.xcfilelist | 3 + ...ip ios-mentorship iosUITests-frameworks.sh | 211 + ...sts-resources-Debug-input-files.xcfilelist | 2 + ...ts-resources-Debug-output-files.xcfilelist | 1 + ...s-resources-Release-input-files.xcfilelist | 2 + ...-resources-Release-output-files.xcfilelist | 1 + ...hip ios-mentorship iosUITests-resources.sh | 129 + ...rship ios-mentorship iosUITests-umbrella.h | 16 + ...p ios-mentorship iosUITests.debug.xcconfig | 10 + ...orship ios-mentorship iosUITests.modulemap | 6 + ...ios-mentorship iosUITests.release.xcconfig | 10 + .../Pods-mentorship ios-Info.plist | 26 + ...s-mentorship ios-acknowledgements.markdown | 625 +++ ...Pods-mentorship ios-acknowledgements.plist | 675 +++ .../Pods-mentorship ios-dummy.m | 5 + ...os-frameworks-Debug-input-files.xcfilelist | 4 + ...s-frameworks-Debug-output-files.xcfilelist | 3 + ...-frameworks-Release-input-files.xcfilelist | 4 + ...frameworks-Release-output-files.xcfilelist | 3 + .../Pods-mentorship ios-frameworks.sh | 211 + ...ios-resources-Debug-input-files.xcfilelist | 2 + ...os-resources-Debug-output-files.xcfilelist | 1 + ...s-resources-Release-input-files.xcfilelist | 2 + ...-resources-Release-output-files.xcfilelist | 1 + .../Pods-mentorship ios-resources.sh | 129 + .../Pods-mentorship ios-umbrella.h | 16 + .../Pods-mentorship ios.debug.xcconfig | 10 + .../Pods-mentorship ios.modulemap | 6 + .../Pods-mentorship ios.release.xcconfig | 10 + .../Pods-mentorship iosTests-Info.plist | 26 + ...torship iosTests-acknowledgements.markdown | 3 + ...mentorship iosTests-acknowledgements.plist | 29 + .../Pods-mentorship iosTests-dummy.m | 5 + .../Pods-mentorship iosTests-umbrella.h | 16 + .../Pods-mentorship iosTests.debug.xcconfig | 9 + .../Pods-mentorship iosTests.modulemap | 6 + .../Pods-mentorship iosTests.release.xcconfig | 9 + mentorship ios.xcodeproj/project.pbxproj | 13 +- .../CoredataServices/CoreUserProfile.swift | 70 + .../Service/Networking/LoginAPI.swift | 5 + .../Service/Networking/ProfileAPI.swift | 2 + mentorship ios/Views/Home/Home.swift | 29 +- .../mentorship_ios.xcdatamodel/contents | 10 +- 225 files changed, 32854 insertions(+), 8 deletions(-) create mode 100644 Pods/AppAuth/LICENSE create mode 100644 Pods/AppAuth/README.md create mode 100644 Pods/AppAuth/Source/AppAuth.h create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.h create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.m create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.h create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.m create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.h create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.m create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h create mode 100644 Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m create mode 100644 Pods/AppAuth/Source/AppAuthCore.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthState.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthState.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthStateChangeDelegate.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthStateErrorDelegate.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDDefines.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDError.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDError.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgent.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentRequest.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentSession.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDIDToken.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDIDToken.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDScopes.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDScopes.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.m create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.h create mode 100644 Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.m create mode 100644 Pods/GTMAppAuth/LICENSE create mode 100644 Pods/GTMAppAuth/README.md create mode 100644 Pods/GTMAppAuth/Source/GTMAppAuth.h create mode 100644 Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h create mode 100644 Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m create mode 100644 Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h create mode 100644 Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m create mode 100644 Pods/GTMAppAuth/Source/GTMKeychain.h create mode 100644 Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h create mode 100644 Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m create mode 100644 Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m create mode 100644 Pods/GTMSessionFetcher/LICENSE create mode 100644 Pods/GTMSessionFetcher/README.md create mode 100644 Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h create mode 100644 Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m create mode 100644 Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h create mode 100644 Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m create mode 100644 Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h create mode 100644 Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m create mode 100644 Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h create mode 100644 Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m create mode 100644 Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h create mode 100644 Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m create mode 100644 Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h create mode 100644 Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m create mode 100644 Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h create mode 100644 Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m create mode 100755 Pods/GoogleSignIn/.cocoapods.yml create mode 100755 Pods/GoogleSignIn/CHANGELOG.md create mode 100755 Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn create mode 100755 Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDAuthentication.h create mode 100755 Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDGoogleUser.h create mode 100755 Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDProfileData.h create mode 100755 Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignIn.h create mode 100755 Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignInButton.h create mode 100755 Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GoogleSignIn.h create mode 100755 Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Modules/module.modulemap create mode 100755 Pods/GoogleSignIn/README.md create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Info.plist create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Roboto-Bold.ttf create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/google.png create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/google@2x.png create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/google@3x.png create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings create mode 100755 Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings create mode 100644 Pods/Manifest.lock create mode 100644 Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Pods/Target Support Files/AppAuth/AppAuth-Info.plist create mode 100644 Pods/Target Support Files/AppAuth/AppAuth-dummy.m create mode 100644 Pods/Target Support Files/AppAuth/AppAuth-prefix.pch create mode 100644 Pods/Target Support Files/AppAuth/AppAuth-umbrella.h create mode 100644 Pods/Target Support Files/AppAuth/AppAuth.debug.xcconfig create mode 100644 Pods/Target Support Files/AppAuth/AppAuth.modulemap create mode 100644 Pods/Target Support Files/AppAuth/AppAuth.release.xcconfig create mode 100644 Pods/Target Support Files/GTMAppAuth/GTMAppAuth-Info.plist create mode 100644 Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m create mode 100644 Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch create mode 100644 Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h create mode 100644 Pods/Target Support Files/GTMAppAuth/GTMAppAuth.debug.xcconfig create mode 100644 Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap create mode 100644 Pods/Target Support Files/GTMAppAuth/GTMAppAuth.release.xcconfig create mode 100644 Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist create mode 100644 Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m create mode 100644 Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch create mode 100644 Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h create mode 100644 Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.debug.xcconfig create mode 100644 Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap create mode 100644 Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.release.xcconfig create mode 100644 Pods/Target Support Files/GoogleSignIn/GoogleSignIn.debug.xcconfig create mode 100644 Pods/Target Support Files/GoogleSignIn/GoogleSignIn.release.xcconfig create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-Info.plist create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-dummy.m create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks.sh create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources.sh create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-umbrella.h create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.modulemap create mode 100644 Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.release.xcconfig create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-Info.plist create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-dummy.m create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks.sh create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources.sh create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-umbrella.h create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.modulemap create mode 100644 Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.release.xcconfig create mode 100644 Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-Info.plist create mode 100644 Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-dummy.m create mode 100644 Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-umbrella.h create mode 100644 Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.modulemap create mode 100644 Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.release.xcconfig create mode 100644 mentorship ios/CoredataServices/CoreUserProfile.swift diff --git a/Podfile.lock b/Podfile.lock index eb91726f..537c3f7b 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -35,4 +35,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 78a8cb73e37727fdec10b33d5e8d32bbbad8444f -COCOAPODS: 1.9.3 +COCOAPODS: 1.9.2 diff --git a/Pods/AppAuth/LICENSE b/Pods/AppAuth/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/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/Pods/AppAuth/README.md b/Pods/AppAuth/README.md new file mode 100644 index 00000000..5f54c2c3 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth.h b/Pods/AppAuth/Source/AppAuth.h new file mode 100644 index 00000000..4f779df3 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.h b/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.h new file mode 100644 index 00000000..99ca4573 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.m b/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthState+IOS.m new file mode 100644 index 00000000..9f3a4e8c --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.h b/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.h new file mode 100644 index 00000000..c6e14f19 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.m b/Pods/AppAuth/Source/AppAuth/iOS/OIDAuthorizationService+IOS.m new file mode 100644 index 00000000..05ccff5d --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h b/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h new file mode 100644 index 00000000..d98d4413 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m b/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m new file mode 100644 index 00000000..fc9cef5c --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.h b/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.h new file mode 100644 index 00000000..7261c050 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.m b/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOS.m new file mode 100644 index 00000000..728f0868 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h b/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h new file mode 100644 index 00000000..2032e8c9 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m b/Pods/AppAuth/Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m new file mode 100644 index 00000000..51d2e56c --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore.h b/Pods/AppAuth/Source/AppAuthCore.h new file mode 100644 index 00000000..c30af464 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.h b/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.h new file mode 100644 index 00000000..68697d2c --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.m b/Pods/AppAuth/Source/AppAuthCore/OIDAuthState.m new file mode 100644 index 00000000..fe8a1622 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateChangeDelegate.h b/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateChangeDelegate.h new file mode 100644 index 00000000..2570df13 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateErrorDelegate.h b/Pods/AppAuth/Source/AppAuthCore/OIDAuthStateErrorDelegate.h new file mode 100644 index 00000000..91a9b1cd --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.h b/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.h new file mode 100644 index 00000000..594f01d8 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.m b/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationRequest.m new file mode 100644 index 00000000..ccfacda0 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.h b/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.h new file mode 100644 index 00000000..e7552fe5 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.m b/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationResponse.m new file mode 100644 index 00000000..a8f92c75 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.h b/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.h new file mode 100644 index 00000000..c8fee535 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.m b/Pods/AppAuth/Source/AppAuthCore/OIDAuthorizationService.m new file mode 100644 index 00000000..cc749a3f --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.h b/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.h new file mode 100644 index 00000000..39ea2d62 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.m b/Pods/AppAuth/Source/AppAuthCore/OIDClientMetadataParameters.m new file mode 100644 index 00000000..79ad4676 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDDefines.h b/Pods/AppAuth/Source/AppAuthCore/OIDDefines.h new file mode 100644 index 00000000..8ff4f19b --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.h b/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.h new file mode 100644 index 00000000..4087e9fa --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.m b/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionRequest.m new file mode 100644 index 00000000..1e9eb0e2 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.h b/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.h new file mode 100644 index 00000000..ab69b930 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.m b/Pods/AppAuth/Source/AppAuthCore/OIDEndSessionResponse.m new file mode 100644 index 00000000..bedf0cd9 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDError.h b/Pods/AppAuth/Source/AppAuthCore/OIDError.h new file mode 100644 index 00000000..5131f0ad --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDError.m b/Pods/AppAuth/Source/AppAuthCore/OIDError.m new file mode 100644 index 00000000..87c8623e --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.h b/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.h new file mode 100644 index 00000000..3380f6fe --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.m b/Pods/AppAuth/Source/AppAuthCore/OIDErrorUtilities.m new file mode 100644 index 00000000..3b3c0607 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgent.h b/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgent.h new file mode 100644 index 00000000..c4eb0a90 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentRequest.h b/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentRequest.h new file mode 100644 index 00000000..8ea40cb6 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentSession.h b/Pods/AppAuth/Source/AppAuthCore/OIDExternalUserAgentSession.h new file mode 100644 index 00000000..3b886a6c --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.h b/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.h new file mode 100644 index 00000000..f0a56fef --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.m b/Pods/AppAuth/Source/AppAuthCore/OIDFieldMapping.m new file mode 100644 index 00000000..f8436560 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.h b/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.h new file mode 100644 index 00000000..6e650047 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.m b/Pods/AppAuth/Source/AppAuthCore/OIDGrantTypes.m new file mode 100644 index 00000000..2b193437 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.h b/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.h new file mode 100644 index 00000000..6fe84d7f --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.m b/Pods/AppAuth/Source/AppAuthCore/OIDIDToken.m new file mode 100644 index 00000000..57a7324e --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.h b/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.h new file mode 100644 index 00000000..e509c60a --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.m b/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationRequest.m new file mode 100644 index 00000000..9efd18fd --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.h b/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.h new file mode 100644 index 00000000..df623906 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.m b/Pods/AppAuth/Source/AppAuthCore/OIDRegistrationResponse.m new file mode 100644 index 00000000..ec0411b7 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.h b/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.h new file mode 100644 index 00000000..405ef938 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.m b/Pods/AppAuth/Source/AppAuthCore/OIDResponseTypes.m new file mode 100644 index 00000000..78eaf187 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.h b/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.h new file mode 100644 index 00000000..c0a5190c --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.m b/Pods/AppAuth/Source/AppAuthCore/OIDScopeUtilities.m new file mode 100644 index 00000000..a0bcb8c8 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDScopes.h b/Pods/AppAuth/Source/AppAuthCore/OIDScopes.h new file mode 100644 index 00000000..da8bb189 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDScopes.m b/Pods/AppAuth/Source/AppAuthCore/OIDScopes.m new file mode 100644 index 00000000..62dd707e --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.h b/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.h new file mode 100644 index 00000000..a072a478 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.m b/Pods/AppAuth/Source/AppAuthCore/OIDServiceConfiguration.m new file mode 100644 index 00000000..ca48a8c3 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.h b/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.h new file mode 100644 index 00000000..57770083 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.m b/Pods/AppAuth/Source/AppAuthCore/OIDServiceDiscovery.m new file mode 100644 index 00000000..ca81108a --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.h b/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.h new file mode 100644 index 00000000..00e0c6e2 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.m b/Pods/AppAuth/Source/AppAuthCore/OIDTokenRequest.m new file mode 100644 index 00000000..bd27dd48 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.h b/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.h new file mode 100644 index 00000000..b446e944 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.m b/Pods/AppAuth/Source/AppAuthCore/OIDTokenResponse.m new file mode 100644 index 00000000..6995fb91 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.h b/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.h new file mode 100644 index 00000000..fda89854 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.m b/Pods/AppAuth/Source/AppAuthCore/OIDTokenUtilities.m new file mode 100644 index 00000000..3280c856 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.h b/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.h new file mode 100644 index 00000000..054b11ea --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.m b/Pods/AppAuth/Source/AppAuthCore/OIDURLQueryComponent.m new file mode 100644 index 00000000..07050c90 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.h b/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.h new file mode 100644 index 00000000..28e91169 --- /dev/null +++ b/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/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.m b/Pods/AppAuth/Source/AppAuthCore/OIDURLSessionProvider.m new file mode 100644 index 00000000..fca17fe7 --- /dev/null +++ b/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/Pods/GTMAppAuth/LICENSE b/Pods/GTMAppAuth/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/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/Pods/GTMAppAuth/README.md b/Pods/GTMAppAuth/README.md new file mode 100644 index 00000000..e2c02fd0 --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/GTMAppAuth.h b/Pods/GTMAppAuth/Source/GTMAppAuth.h new file mode 100644 index 00000000..ecbdad60 --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h b/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h new file mode 100644 index 00000000..f0b9ffeb --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m b/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m new file mode 100644 index 00000000..e4910a81 --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h b/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h new file mode 100644 index 00000000..248223c8 --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m b/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m new file mode 100644 index 00000000..988a87b3 --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/GTMKeychain.h b/Pods/GTMAppAuth/Source/GTMKeychain.h new file mode 100644 index 00000000..b4d5d062 --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h b/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h new file mode 100644 index 00000000..9c0c5bf1 --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m b/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m new file mode 100644 index 00000000..5e56341b --- /dev/null +++ b/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/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m b/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m new file mode 100644 index 00000000..ab64882e --- /dev/null +++ b/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/Pods/GTMSessionFetcher/LICENSE b/Pods/GTMSessionFetcher/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/README.md b/Pods/GTMSessionFetcher/README.md new file mode 100644 index 00000000..478efde9 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h b/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h new file mode 100644 index 00000000..ec3c0125 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m b/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m new file mode 100644 index 00000000..0f65310f --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h b/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h new file mode 100644 index 00000000..451e1323 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m b/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m new file mode 100644 index 00000000..f4460c5d --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h b/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h new file mode 100644 index 00000000..4e306428 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m b/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m new file mode 100644 index 00000000..6f95dd54 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h b/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h new file mode 100644 index 00000000..0504aa75 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m b/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m new file mode 100644 index 00000000..3dc64597 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h b/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h new file mode 100644 index 00000000..5ccea78e --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m b/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m new file mode 100644 index 00000000..cdf5c179 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h b/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h new file mode 100644 index 00000000..312abaa7 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m b/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m new file mode 100644 index 00000000..f9942c01 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h b/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h new file mode 100644 index 00000000..2f9023a9 --- /dev/null +++ b/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/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m b/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m new file mode 100644 index 00000000..7759bb15 --- /dev/null +++ b/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/Pods/GoogleSignIn/.cocoapods.yml b/Pods/GoogleSignIn/.cocoapods.yml new file mode 100755 index 00000000..64a82b1e --- /dev/null +++ b/Pods/GoogleSignIn/.cocoapods.yml @@ -0,0 +1,5 @@ +try: + install: + pre: + - git clone https://github.com/googlesamples/google-services + project: 'google-services/ios/signin/SignInExample.xcodeproj' diff --git a/Pods/GoogleSignIn/CHANGELOG.md b/Pods/GoogleSignIn/CHANGELOG.md new file mode 100755 index 00000000..4c929073 --- /dev/null +++ b/Pods/GoogleSignIn/CHANGELOG.md @@ -0,0 +1,132 @@ +# 2019-11-7 -- v5.0.2 +- Fixes the wrong error code being sent to `signIn:didSignInForUser:withError:` when the user + cancels iOS's consent dialog during the sign-in flow. + +# 2019-10-9 -- v5.0.1 +- Fixes an issue that the sign in flow cannot be correctly started on iOS 13. +- The zip distribution requires Xcode 11 or above. + +# 2019-8-14 -- v5.0.0 +- Changes to GIDSignIn + - `uiDelegate` has been replaced with `presentingViewController`. + - `hasAuthInKeychain` has been replaced with `hasPreviousSignIn`. + - `signInSilently` has been replaced with `restorePreviousSignIn`. + - Removed deprecated `kGIDSignInErrorCodeNoSignInHandlersInstalled` error code. +- Changes to GIDAuthentication + - Removed deprecated methods `getAccessTokenWithHandler:` and `refreshAccessTokenWithHandler:`. +- Changes to GIDGoogleUser + - Removed deprecated property `accessibleScopes`, use `grantedScopes` instead. +- Adds dependencies on AppAuth and GTMAppAuth. +- Removes the dependency on GoogleToolboxForMac. +- Drops support for iOS 7. + +# 2018-11-26 -- v4.4.0 +- Removes the dependency on GTM OAuth 2. + +# 2018-10-1 -- v4.3.0 +- Supports Google's Enterprise Mobile Management. + +# 2018-8-10 -- v4.2.0 +- Adds `grantedScopes` to `GIDGoogleUser`, allowing confirmation of which scopes + have been granted after a successful sign-in. +- Deprecates `accessibleScopes` in `GIDGoogleUser`, use `grantedScopes` instead. +- Localizes `GIDSignInButton` for hi (Hindi) and fr-CA (French (Canada)). +- Adds dependency to the system `LocalAuthentication` framework. + +# 2018-1-8 -- v4.1.2 +- Add `pod try` support for the GoogleSignIn CocoaPod. + +# 2017-10-17 -- v4.1.1 +- Fixes an issue that `GIDSignInUIDelegate`'s `signInWillDispatch:error:` was + not called on iOS 11. Please note that it is intended that neither + `signIn:presentViewController:` nor `signIn:dismissViewController:` is called + on iOS 11 because SFAuthenticationSession is not presented by the app's view + controller. + +# 2017-09-13 -- v4.1.0 +- Uses SFAuthenticationSession on iOS 11. + +# 2017-02-06 -- v4.0.2 +- No longer depends on GoogleAppUtilities. + +# 2016-10-24 -- v4.0.1 +- Switches to open source pod dependencies. +- Appearance of sign-in button no longer depends on requested scopes. + +# 2016-04-21 -- v4.0.0 +- GoogleSignIn pod now takes form of a static framework. Import with + `#import ` in Objective-C. +- Adds module support. You can also use `@import GoogleSignIn;` in Objective-C, + if module is enabled, and `import GoogleSignIn` in Swift without using a + bridge-header. +- For users of the stand-alone zip distribution, multiple frameworks are now + provided and all need to be added to a project. This decomposition allows more + flexibility in case of duplicated dependencies. +- Removes deprecated method `checkGoogleSignInAppInstalled` from `GIDSignIn`. +- Removes `allowsSignInWithBrowser` and `allowsSignInWithWebView` properties + from `GIDSignIn`. +- No longer requires adding bundle ID as a URL scheme supported by the app. + +# 2016-03-04 -- v3.0.0 +- Provides `givenName` and `familyName` properties on `GIDProfileData`. +- Allows setting the `loginHint` property on `GIDSignIn` to prefill the user's + ID or email address in the sign-in flow. +- Removed the `UIViewController(SignIn)` category as well as the `delegate` + property from `GIDSignInButton`. +- Requires that `uiDelegate` has been set properly on `GIDSignIn` and that + SafariServices framework has been linked. +- Removes the dependency on StoreKit. +- Provides bitcode support. +- Requires Xcode 7.0 or above due to bitcode incompatibilities with Xcode 6. + +# 2015-10-26 -- v2.4.0 +- Updates sign-in button with the new Google logo. +- Supports domain restriction for sign-in. +- Allows refreshing ID tokens. + +# 2015-10-09 -- v2.3.2 +- No longer requires Xcode 7. + +# 2015-10-01 -- v2.3.1 +- Fixes a crash in `GIDProfileData`'s `imageURLWithDimension:`. + +# 2015-09-25 -- v2.3.0 +- Requires Xcode 7.0 or above. +- Uses SFSafariViewController for signing in on iOS 9. `uiDelegate` must be + set for this to work. +- Optimizes fetching user profile. +- Supports GTMFetcherAuthorizationProtocol in GIDAuthentication. + +# 2015-07-15 -- v2.2.0 +- Compatible with iOS 9 (beta). Note that this version of the Sign-In SDK does + not include bitcode, so you must set ENABLE_BITCODE to NO in your project if + you use Xcode 7. +- Adds descriptive identifiers for GIDSignInButton's Auto Layout constraints. +- `signInSilently` no longer requires setting `uiDelegate`. + +# 2015-06-17 -- v2.1.0 +- Fixes Auto Layout issues with GIDSignInButton. +- Adds API to refresh access token in GIDAuthentication. +- Better exception description for unassigned clientID in GIDSignIn. +- Other minor bug fixes. + +# 2015-05-28 -- v2.0.1 +- Bug fixes + +# 2015-05-21 -- v2.0.0 +- Supports sign-in via UIWebView rather than app switching to a browser, + configurable with the new `allowsSignInWithWebView` property. +- Now apps which have disabled the app switch to a browser via the + `allowsSignInWithBrowser` and in-app web view via `allowsSignInWithWebView` + properties have the option to display a prompt instructing the user to + download the Google app from the App Store. +- Fixes sign-in button sizing issue when auto-layout is enabled +- `signInSilently` now calls the delegate with error when `hasAuthInKeychain` + is `NO` as documented +- Other minor bug fixes + +# 2015-03-12 -- v1.0.0 +- New sign-in focused SDK with refreshed API +- Dynamically rendered sign-in button with contextual branding +- Basic profile support +- Added allowsSignInWithBrowser property diff --git a/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn new file mode 100755 index 0000000000000000000000000000000000000000..12c05067998d9ea7321514bc97719d40481d3a1f GIT binary patch literal 3532688 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%0Dg@kF)gwh2? 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 z%0A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

  • !gXQIq(eT0gUugeHo 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 z zk`dUfESbrzu3$K<{^FFn6nZKsd8wH~`pPA8`?Xf}8Dq#fu3N@OR4w8yc@MPVMs8L_^m;7L6>el)hMWDfI)ujXKuZ-%?K{1D*&#B}ze?LW$ zfS5;5;@zQT%|y4hrzdS+J++!PIocxvN$kqHgSLH3K`CoXj99>JP1k6~H!tT7ndP!k z-D7RqZN$67Q7n%R?8e(mu`e5Q2P}bdqZ^IklNI|L+S|0@?}_y7M1x|!=3L;KtugaQP0GFbmE!SBBODc)LIoFiaFjN|6ci8;FhyIR5}@mvyJf<> zwi|yL7J7Pl^A{CC2^x(i#@PFlBVqUTo*BF+Gq)-J#)t{?2OEMEiogf8Kdan+=eCCT z2Y=bW=H{?r3dOKf70)Eh-lY3>aCFLlysJHOWnr<=Sff==NEY-CKECz+QCmO%r76=m z(2bv_)}c+;q>mnET)Bl$_wMMJ-odOxXOxF7-`$)LE$gV$9D4et=FrK5bEas&`%&If zjYg}D;SS6f49W@28m!Ct=$;OlEV@2n!A4&4_A$ndH~YW+(RSSF(P(rDHcgi1y_rIS z-hiAV_jCks##8O}+!3?GXty}BLb=);LxCgrwP*PBg9|rTjw=b+^7t<%Y}el$rqisf zH9Cy3@9T|I_8N>+Q}o8T=k-S2Fulj>= zJu3@eW;7m~@R~}ieO)m@+o=z5?Ee4@0>+|Mbm!`g38<0dO5>=b%Hq7*E z_dYp_Q~WrnE;(T1U5fOG^pS^u;i~F;k7j1&AnET?H77=C9vQphQ)SNUs=}3u{Ylwe zYyQ}qpDL9VEu6L|L$!aDD%3Le=%>p5PSuJ~MMJWtH9+|jM}5G)l*#90VOvsaw4~5Pxwm;#q{ahtLCk=YP%+C|4&BCD9usL zm*FzwYu1`cTJ5n6q&(Vci$=l&&2MT}C=`W74>ijWyL7K>^whP+rnSYvD?6KJ6xUZc zf@?4@F0QYtXE=&<7Guw$ogUw=Ase|qGB)3+a}jqJ5V zolTGW0Q2A4k!LUg?}$1U9dV|1Bqp}&Ya=j6?mvC|+1jWx(UGSte;9kC_wIp=J5L2n z>+HGvM(>Q~`qY-byD>gsnCjvOiq4+ogYudE{IGu`V8(WS#GrXr-|*Dy8}hXqOzj&? z=KB2W8&+$ASA{p_$E8EQ+XR1&S&q4XzP8DZi-zkP*0cv> zl3TN6RM5MZM(i;S?=p_CT^jMOPW=t~a!jTw)Hb*Cce~YJ@Y5@r$8}ElZio#lbxne{ z)yYk_eRTJYfIAxkrZohNces_V6@6!B^3Gz|9Jojs_@FW{5e2CUUTJDt31fBy*I?d_ z=`&QB<(TJI?g+-kjSrh^huVBe{b{@Uvr8jB>sFt}?DCZQ^Z<49pXoxbV1k1Y>Cy;H z2{Avy7==Opu0yE1+A;HFw-?t^g`P~0IBJPlj|&}KveZUhmPLI~JMw@f3fB<0=s9%y z_G8ifr4N6Z^?(WP+O8SCM>E{Ukr`iU)#r6;`0XnUCdQDvUUC(XbE}}7;Gd#6OAb>K zmK@&pupCZ?&D}wmhX2(Rask6yHx2vmV${L}`O*lXYA$tdvjkUnHdR;DSL5OXwTbHh zW$>?q8-idfihU|2GuyVG6uIh39KSTS%j{WBAPsV6C zEpTPE@zGtQ>T+WGu=0yP<7b>^BOWykE{bXxtNQF|g@Ru)=uzj)j7iY+PaKPDdi?4l zHIL=3(6!GARr1R=iW%+UpC~Oc8!cEWz~3?1uDO2*%3K>$%P*4{JLSWleNvM%VJwz2 zaHWpquZNfEcFe&m7-`i9R;}z9FvkA8D3-L7RaXmodIqBAYRM{2bHTBsabm;9oJJYv z;5dglxFKk={_^Au-Qz_V&6Rxew+kQd;oOp+YMR*ajF{Zfq6m+Yaoy_X zmRZK`jnT+~xB1D?@S{Eay>{5hb;`&6<}-EU^&G6v07s_V7u+^ZdG=|%_kw_>+Pmi6Wyz^;#I6y|3Hh=uotndpHhbdW|54?7Nv3BbmgRtrZPu9F~ z)7<@YSN%?YZ&ckpv3@({p)@DaX6>yJB!=m@PL+jJiTpDVNputVx z)AzeK*2~;H@V>QsRGnKE_7A%Q>U)x08lGO>J*wADAmDJfz1}j@CGbfxG`MB4@uTi3 z8*1H*>{tOKb6rMG_)~Z4h7LD@FCK-FZUVbM>7KVimgUM~S1Gb^3K-99Xh!`xJ{d8V zkF=cia-}-xS`OZ!A;eNlZ%@_m`p06@1E^ZjKwde`sh6Z{o-Q&`m{1e=b;Lf|kIrNp zgf^krzC7n^|Q!tNPB>D2m^b|M9lQQFH6W zOvCUUC@88}qW^NFA5ct(`RugLOnXQ;v)H~<& z$bK2uNM!m2nER_X2NbG}yjQ3pW0m@)yVHt zYY*1)>3E7G`kBXvYf?Fxjz{UA>UmpU^T#r!1C=KHkljlG;q7t_hZZXQx?8`<+n~ei zy66cg{-<eP(vrTA$L& zPGM6!JByvWWsbj+ulStk0<0b60b;D20 z>=b&7*=bkcQU^Qj4}7?pot~55qhqJK`uH5d34J3^o=WGP@YIZM`AESD-*t!db98F^ z<4)UO_u0PewOu=4`$xY`{zu!04{ag;VUwlVUTCoW`&QfUw%hIru-!A&n(-! zJ8YAJY?ESalVWX?rrIW@+9qY#CS}_uEwD{e+a@itO?tpK=|S71M{JV{Y?GGRCathd zDzixIA>NkLMzTa6C9>qd%2-E{YcDx$rs*_A09kwP0nfKoeS@b znDP_DhQ3L;ziIAyb8i2~A3Qz|H$)2*j=09u{&tmys!yw$`eM-$Mbk*U?%`PV+)=?( zs*dmZ`kUY_36HLSsbf*olfRh%*tWU9JG*?`8gu&g=ARcX?!5kW-+Q~F6}tm9v$;1n zbaETBCcLWSj@a_zr#4Kn7{0ypf#=?<`p+rdyW7(+q^!phn-n#F@ zPR+#!-#nI?(@=+NrLCW8)926sQA&tzqRDysE_{o z_Se6=_|ljC)=3xtykprC;iA4pa)W81mOv%G(cl`0Ainq)3rVC5<7w>PBZ=S>{Ht?bwKUuzV z>IAG-n17=zQTVzf?R3J7smq?b z_C)g&%`pKZLo?d;H5N20+qO2_^Hd*PUpaQc!gv4kPYIEKQ@!=a)HNw-kNs}d-`D)) z#i|$nl6w3n0VS;^!+O@}&VSPVC#~_G51#x>>GeN9T>a5sKQg3EMRAKP>*qc9oBv!M z8Ca6I{;kvHt3R3l%e($kvikX{2N!;EdCxy~el+!O3qB&}^e@1~IA-sKmwxl%7rU3v z$$WI!h>V11k~JSTgegbu>P^=vZY!B|_gjCtdU^5AxSxOV&Gs3w&ozCMn)+a7D4cVY z`_!R}oIi4gTKUo8*tt(%*%$tL(#X|x|vgg+y*q>j`4=KbW!^4_Wh z?NjY}ug-h^BmLVa;(qkkKHUq`)Ia|dkA0c5VtjtrYmaGZ#pUrGmvUaRjeTR;p%?GF zO?Gs9P`@Jx2wNC|M{1&#H5&KU^ zEDMv(Y|cz>=xfQ~@1j(;tyBpM`M4(#ugbuEj7Z!zS*8o*#p=iN*RwOR@^`SNrK*Cz z8p>&^s0dzLA+N4!s?au#JvfS1?r{ZIrVIJ(5*Gi|@tXaSCvn*oP1o1UbdS?gJ(dr# zsEIXTx*Wa~R&5UcX>o8;G1dWslN?RBAyZ+-&86V#>w!?a+R>DcTRq|Y-LtmZskDZA zO8s|Q>y;Pa-U}|(5Ay#{Sm+{se{JLkmY|QZn2iNyeql1Dt1lUM2Abtq5560j-l&^# zR6e7#PxW3&Q^gY83#zXwrd5b4+>~o?8hdDQ$VDv1o77li#*LKI{QZG=Z7lAL(S4*N z(Ge$VqfVTPICDDkyew*2_I^PvPe-1F0Xbu5bk@(@Q$N0;FS!LP#C>U9Jt7-=*=hPboXOx{dnA3ajl*A-3@g%hOLE&T7}h7NzM88BeuF|LVGNx%}So z7kbXDDLu7v-ZNc2qh;LUtb4T&VBZCHa9~G7+44Axy)aIA^2^8LPV+7HN3C}3kr-xA znyR%Y4I6g%-P%%~s9jcW*J4viVZN6JJUh0^UiN^+wu)`7D5nc7_JT(PBB;1gk5-iKP+$O6l>dVQQOPN$9KsnhWF zbYOAu@o~v_mY0^5RFqd?&x)4xE-oph)R}i@-gTEYFC#sjo2XQ#wP<%X{H#T*{Zd!w z*xsiM=v7Zt_Rj?2D_xy-%ynHK7kF4zAESy_g~~qE<@_O`PdoNKm3%{PylT-R5Qb0h z(@s08s{eyAUh$!-Th$ZacdE5#dY>uCTJe64xz12f_{O7^B|n|`YT;d#`oa-2UKl@n zZ)fhGyAJ)MTYFn#;_nilOW18ldi%aQ9bObA>`NUn+#ZX5Ab9PPiZO+f58R)A! z8*xCmON@KYSl;2=7k600zh8k1KA48vgj><*aq|!N7;x98k0!Sk#O*%7(TasrATI0IQ`8#hi8@iw0ibt5F6;^7dW{>CmlFJ zUpi`9?asc~gIW6&yVbwajXoUOpW4!!yZ>HzaQIP;YWV0neStYPS{W1=qnH@<2Th&X zp?+=D_DgStVG-BKj2|^DJxDR5z@&oYIpcWQhG9M7`s7U-Mg5lc#_naHg_)vTW%XfU^g$EcKbJ@c1l>E?FmPiS@og&#B|rw@#8S}{GRzV2t~ zvfgt~%FmA5`Sk5QR}aYQpFDc*$;>h1U)SHORpn`aJ&+@Nd00=|r0}3At+UJn+1k$w zOb%V+_<%swva!P_gzIC&V8$xr&r3G9YiAcE1VqQiYQrZ6H3ig}yGLVpTZN9n84 zqF~?`8r5z%<6Z|0dbTb#`2O4L0~%122(#{w?J+&g=^fCzQ@%do4aM+>Lw_|&nVv3# zgLJS={>!dI=AZ-IAv7H6}}lGQ3O~VQ8}& zH=FlsEk=#1tT$vzLU;WPcBlgAZpeOQSmf^DXJ$rR%a)p_3Fnr=~VXYg#7A5p_ZcYMx|e8>qb-&fPW)&JBJi zJXsq=&w6kVHELsFq`A3gvxO|LC>9K`XmKqF{%A!epFdqy7ManEZh!NRJNB%2;YYZN zjURQ@fwokX-YGVeb)(L-zTFp;)vn^kDu4Cok+YZXn;mrf44YBW#|^C4w2YGX$^piXZyD))0O;bC$#mDKiZ-Mv~T z()h+4Bi6KNThl|0`>9^G!Lc1wFQ>@c&2@%jhMe@Vwz03whaCMZTK+vtD39PzTCmG2 zd|^?BRqP-B9VcOrqJ(ddXCK$t?$89h*>5bkQyZRjhoW%*DHEdNSiq>dNiOH=o^)KO zM|%#Rr>v7LotoJy>v<|XEE7oTj%?#~suUF}#SyVRy5AM?ODAf-=Nn{bomqSP5zW%E znhVY8`UY)yd%cZyI-Tm*EhsNk^`!1=%t*>$s=9x)+g+6njfd*FepTDZLLqQJwj^#x zlTfDXjKQC1HY=NDqfyp}8lzFqatrFYgX-B44nO52AQE+rh`wA0MG_-XY724>10c+_~bX)d(`g=(bT}xB7=@ zXSdox-Rk}*#l-Q5Rvr3I`7d(Nuj+-+K$JD^o=Z)E9~U2Lr1JJr zd3&7YHBoOfmFhU0>i9|2anKypab^)hA^iy4qAPXlbEaK?5$D$%3<_uMwaXuM z2K~#HGa2Yj`Y}|UQtupPT9ozobY1AgV}eF)@SPerjh`rY%z?)AUi2L&vZgB*?YX^g zq^!izGc_|*@%xqS^ZM?N?FtXmwwz2}y2CQ=4MndpaCc;`@oKtm*|5gi;Y9{pcKc_- z;8{llgKO}-{^at_?d_Sa!Sg*iCIYt?IHG$hGTVbN%9*vY$-8ATWSANBhN^FrIHS5r{%r)jW6dw#hjDI*aV%XhUR4Z3!?o^-sx|Bkf-{<*I zV-M<5PUFpKs!Ip;YfGpulc_GXRF}_CUCyKSI+nOOaw7g;?0pMBR8<=Pod?5!I1WmN z3Umia(GZ7+$jf$kh-jvy)@ob9ASe_l0xFnW!$U!%LZy~kD=;fvzwh32XYLF$qwco<-TnVNdO7#}?svZPoyR@*+&ka-zU9>YNjjqJ zZlecMLQeZ*#IyGATLmQb<8;#anQF0IWdA2QhrP2zw4sBZe<7t{eOJq(F2OqM)T3j+p#aOh!yP9vqJ{ffM-?z-jyw zt_^`6E$~pJp8-Bz!o%P{12`##90g7viY59#0f$K`?i6tPJ}uy&hrdkD7istv5x#{> z_&dPq)AvZ=bX~$f18zWiJaAryYatw^X8@<`L{C5{aMGL215V{je69vg>E8mk%7c2% z2R;S(Cg3rQp7_)Pr}_O=;3Sv82lT%OPS5YZ0gqxh(Z2zF9MbgdU1}e~zX49|90gq7 z&IU9xm6r{CDq>0gUjv_j^aH>r%5V#Cs#iO3dA;rjPPWx3&>l%aPBrYp0;hEjVRW5v zG8Xz1aLP|*QvC!R9Tx|M9-^IvgZfjVuLVx!F2-Rk7yKUv&I2pMLFGvFF9E+C>HBd= z^knqy9pHh${(wW0ljJ!C+yLwV4ju>bfem$T1UBE%SU-jXNvoXkz^VT}$079#@yP^E z<(|bMFLxDiD%V$GU+xx09|l}b|0JVNa-e?|IEvxO?jgw~)ED)76F9X`HgIWNkvyLQ z$7R7TGF_MGe*#YJRR?-`zl_m~^gDpd>7#%X{Ywt?*D?B|4)pnqe!zjg1~~OA*|jFQ zq;_rsZa_K&_!SH%`P&$t0-Tr8e+(Q$pIZ!^)_PLC{tlel|5o7E_5>d#Ze}X)PT=x- zjRsEjx(~R#9b$ox1HK#hm52rY7yv7P6WzPO=_8(iga7l4|9}Jk!;HTM^S+$_0HY5E zE|-V=Uy?kr4)o)IQ+*czm)CbPaH{WbfXnNf2At|!PI|csh9r&+h^xGWh8yNjQ z2l}TO{SgQHgN*)j2YRxXNb=CnSMvJO%}@0W04{GI_-PdAV;$&Y82uavdh)qS{Nbm; zjz9b`3j8e&^yCYc=(jr1Z)5aNJJ7c>`a=%%J&eBJfgXMm1^)CBCaPK)J%>tx({o9>ABUi^sJ$KnPUR3z@)!V8`f1?ua$|r~JHG;)@(FwZ%whO@4)_v= zf9-(Z!EjI9jB-BrGd$1%|0Bbr9Pk4SpXq>q2s{$>O_lHtdJql>u(z-e3v?S}IS zD3scFi5$mTLkiNGkK#!Zh*-jhU1~f0yX$+Y^87+Cjtp1x$^Ux$ z_~0QIDh+h!O9a1=apNt3(XKQ)k!-<#5xsHY#ygQ9Vs@FB&4ey{SFe(zdnNoq>F(Y9x1l2 z^8&>-b{vah>pIU7EmSyiijxXQio?Z`+f+eb=iHn&QKXwDiV~a1p^PXub&PUa$0#>- zj1tF@V;SNIa$1ilr!|jqQ}ZaNHIH&r^Ju3vk9Je@Xs0!gc2o0cr!|juQ}bx2HIH^v z^Ju3vk9Je@DMr!waBg8yX?f;iGmMN#ch(@w;kJ82Hg8*da>1gE>6r?vb!_oQqpNo2 ztnICjlt}cTW5wCql6D{;B-({rj!SF!_UZggaJ&?nvh$F^9s2HOYp`2JY zcPLWIB#wv+_wVea$l}Csxsbguw-DA&!;6ghvElhqk&Z0oX~7D$4RCJXTOl)*>{uPLTXeHi2BL`4 zV>YuiuXy?D3vqI4EXb~XL=&v;_&8bz5)Jj->@JJV0+L&@!A6VRlDjr&!yShEY3omWt+PihI4TC|NjdD})Y&Mr{Z7p9$>vBO!QDEROdPR%qvOB^K z5XP?zaXx@AG=7~kU~<}z;0v&FK7j3-NgTm$__!FrZgR-RuNx{S!`BV9o6+kgm;K}6o)g~M3J%p#av1B;TdWy>>ja?Lq#+yLuvvP#L`65ZD|Ji=)O z!Xw?tM(>Iju!}!CQ+Qp>Trhp%0yG1wxRVALyui2CTzbcJE?~4f0jD_66XPz=R8i*e z*x8wbg$j>z&N0I1j%9?4#*J{>x)D(>%5q!fh$)WUZ+&@W>|DQn;){a&*H6|o5ojYP zZ4-eebGCMhkQ&X|01uBe+6(OJVZp`&FSAZPs6w)rQ|s^%76w*3)R%Dc;$4;%;9PF0 z^XzZ=@JOlKoaaL4v3FXhZ5SzyO-HV1a-nUVb9K@3k#1W)N*c5dWktEIca)2IN4c$c zlr(4^%aU$Ur}c_*(Hc>1TO-OvYeczijc6CG5$(1$qFuB`wA~dD$M^04^shp;n??^r3dHV48JsGvS4s zfe!b@ltJT4dg*pS?_xwvkw%o2zx3+uf{!$o9O+{Vq}IOZw{J1SCBJ?<^b?uPcOk1Z zf*oXyF%FjX!Y}14&qchGGimJJ%IzOF!gwbW{mvgZ;zD(?{2iXXi8; z@mdxaBOm!Fy1;krgDy|x#!N{x}S>M-3#n6=qXL~lqNkQs>cDu zA&6TMQ@*{(*A2Si$oD)j=ppT-H07i8E*v4CdmJ&*WBb3@UW?FPz#2erZ7-zjaGjh{ zmw{hB(zUoQIHv|bN*CdPUSi=A#3WA^V&c01`LxLQB=X$|ECcx{jnGW#SvW#Kmx`F^ z6G2b7p>$ajSL2Yg=wwg>qrP5CIj3kS*ZIHTVRdeX5$`|WN5 z)(Cn^6FsFjGx|D4Z((x5Kk07L(OWB%i_+-F=Uza5wCC<>q)Ty~(!`I_x8fkVZ$eCR z-@xKIh)J$=#604w!H34xM({}n77sqsIHPn74$5z2aVTQSAB>ptk3{|fxIbdg$+)hdpJ*7`6MgAud^WcyB@wwx;eh&1y;M&AkgYK*Hr9^CFOVEaK&X`-j}3%K5o{G)OG0Mh$#ozirj(vRZ^M!8Ka z#yld(QHOlJpu@beyB=6A@===dQQCsTfPBk9M?Pj!HQeq}V9-C^Nok^^^b%ZuANep3 z?Jh<-8`mjK*C~Ayj_V#{0i?*1ZD&uN)sPS z^SDlaNOErCc84Mzfa{c|>y(DS_~*JX&bQ${8i%wWu2Y(>Q(BMfJ&>yfa*{5t7S}0F z*C~BYA&#$p#L)jMd{-gPKYLLg=>X$?vd%x0?!plax&tiUi4?5|2LFqaiRQ`IzJmR&WC*3;KWw!;`D$r9Jq1l2z#kk%9erdSA2I*zE zPHBW@O5ciu_~jtx5ibONE3V%Hdg}fKpr>~KJH9+XG=gUDl@mna>8>omXO8NM5QNmtQ2-%^^Y z>W67VjTrhDf(9W}ReT^fO%H0wE5wjfh|^h|%3>3X6Io0$QNCyvla48+!&n^3Vk(<( zp2d(;NJBm$hD<`NXE6yz^dv9EBrnB?gqX@jH3fh3;Ne5%P?|?fY2r(1;zw!XLuo`p zn&iP&6TweC_9qDRPz~`RIVh%lbe;0ib;<~RPocfg`~n|}yBS?4i#rfQe_Y+l;vI;+ zk=~A&3SVvx?aohYKB`FzLw!-3@>GP5yJ}@p2zSUhG#MSCWbF$ z_yUG!Fnl({(;1%1@KD6m4k3uCUV6kNH|ikBtwk*L3$+L7tdidHIe} z%TkN@Je*Hr=Pfwj!DyBtev_T|Aikf`lp?-^;bg-<148H^SSy73J<6kV@*{9N!+D&) z&Tz8dzl5EW4gbHPJRS62$tTu9I)^SQ`L;R-nqjC!11j|-_*{WXl8=BZaZWh-QTQ0= z_%DP3jfEotn7Tf?EKfVa|eH__S#R(t)bN~iTLZ>pe*7`GK29>H|R5i%}KBI9rVKQb+$|w z_nE*(Z!Lu0FWr4vaHxr^j{;6==92W{-$o^QZ4Ku32W2M2CBK!Edtdh-haFmB&V1{K zXQ}@O{|3jdh(F-Lf!iR@)8g0L(&feE=Vtk`r7VN10^Uq?~HbLJQN|8$|(lKm=}p@$i{$eO}RWLkNtA^iwP3qMsh6tN6YG9$iSD1`l~4nWVsY zxb)>p?{!pQt46GgALJmpz|v6;>xXYgIc9?g){9&>c*uhjIi&C3gX*#r#OO}$?-%Cb z(s$_&@CZShgkexn+0m#A-X-h;YY&&cOS>@UXq`uXq~!9;nOJ}OWuRkw&>D_DN8SV; z@*w9YA0N*ApUy@nP(O4tIku-c8z1idpW?d^*BXcKP2fSioP`VdKh>jCevOO`$?kXv zPd1nSPnUuRHO1e-!y#D5*p;{-Cg_f~`7YgsdItgVOUL^pDuE@hU<&||Ku>uvR)zg| zShikrAkUTX6e@VsGo6|@96s}8z7z-GZPd>IjQJ=$eqOszjH5Ys_{=4YB49Ru;Cd*@lum*IK~&iin_ z4(Ex8zrulUlpNU)_y;?WM2zotf(-P{i^?FmXx_y4K5h#R3b@2|12Z^a^zC~xFxnGO zq%<$l+(0~N-t5Qm0}c%?1mFn8Q4MB9NAl((6V>M|WkxVjMg;mkO*B*=;wSII1&hPx zh0O`O!LDEJy46ZyhsyhUfkU4#j&c%Ve9L{~HDT^0nUgQUH{NPYe;4H&FF^E-*RPj+ z;}yH{jaMx9jrVFNWFp^q3bf%bzVUwXjpzSA=Nr$L8D}zUcNw2LtuwHLCB%^G#~j2Ei?>nD2}mza2q zU)M&((6_TquLO+hj_?csw0V0Mr;PZf+H@#huT@u$tT6E>v?kvj>L>5<sMy%^H~sHaUi#8mUcmqHeJyXkYw~Q&fvVOJ^tf9 z+p=xG%2Y<1%P|kZX;#f;g#$xgHhDLjhBUX@dGmtvt#6EE$sHax3*Zj5h^)r<@xuyw zbzcn(>4z6i6P$ht4#qh59>v-M$%nEVk7C_$lP0-LgJ-xGs$zGv$HJsL9MqB-`u4;Y zh0O!pS*6W|XqRdX9L}Cq!r>_lR8JN?#*lq3+$eVu=MRT!Fb(gynp{77 z#`xQOwq?pZ#+5Hz;oP|z-0Z@#zi5@-wP(0W=dHbNMVaSnxLsZt@zegv^~s^#$)PO@ ze_Lgf<9kwKJKHx>2gxK~fh=&fTvSt%Rb@MeW&d{Brw0R?Z&&#EEATPRx1!MDBA5U3ct1apKRne|hT&xaaCs$F4HvwvtaZ z@kO&u7wQL}YNf$m8sYsCp2{ZWRA&r%%_Mw>f+Mn{&BLqA<2Pq<7EFzB&$Xc=O}n?A zeniLXYnyJz_=%DJYi!x;Zz`zfWZ7?gba+*TJo~F@+CNL#75`8L(=W;K-Z^Dpn9vke z(Umo@AtaRJQ5al8t&VJN8yGP&i!&h&VHP|#uPQ0bCd^N>;B{?LNSh!GJTGng-NB)n zXVR4_dI^VXriMs3`BvT-BG^qQuTuwqKebo=`*czZ1A*nZYC@1q3|6L*elEDASX>Q|2 z+62x%h>0=WCh$Y|t<$6|45?61>p`B+uYz~7z3G*bce3c;+z{lmVv|}W3Gm`E%dqO_ zB!RO$I~K37_-x~R(y0Q}{_pHc@PA(>;l4#B#vL*V*KSee#Cl|zg#IS?cT0D+nMTeu zN==$PSy!*P%%Tv!GNON9dt{|&`)_Pbn%vfUs;VMymY~H}KU++CwWeDHQ zD=gp%G45Vc^w9qL%WaOiN~5w=*XzFv9wq)H0_T4lG;oIj8E>_=Ir^9sqq+!S{>@7RFd|?EPGIJd?Cw zh)MX=A<)3B*50A5rjZuXI$>e`?5D=;NK$Yrbf*v$#+>Ir>h*D8)!(iN>{p7aCqxFX zQ#0>ZEjaFB=Q3-{9M8OgA)HZSujf+6y`?+cdpVaSEKrbrAmuzlGYHl!1@Jsb= z*p_4%?U!YW>t3U_Xj207>NP`^-r7)~mGw!Z{I#KclTm3rV%98e<(n*){TZI4x3{gg zD3#tRfh8tSvqe13(!=AgkgK-MUoYf3V$dwMh82xp*yBH{arAd5mg-O)C>j-3K+ zV5eu=u4rVZ{S`q??6gifVY`iX2Rm)3oUqGA+rmz_Dktt?r(KG`1teD1ZS}jSyx((c zNx_TpdvmV%&A>gA8ehHP{l!DLmiwmne3w|TZv5VBE`M*XrEtW78zQr=n$U7zK+mk< z$BjypSHQztdy4iI-`cLY>h+d)G0 z_Z%|$anH^^9%Yy_c2hocxRh2fF8Ef9$8X1VaUeRJD`_k@3Z;*>Eu zY}lVai!aVs*1ZOQMnh}I`s*wem459>d7TYQMyJN;cRYUEz+4G4$ zLtk(IBJ#zsNB-Wm{D*-r9)IG4Z;jJ_TJ`tid+U0mM;y**t&Y7rvbAw2{32QQt(d*H z>)z-QzKZ?T3pyfywc=XedZlk`dc%7j`Qw6>)m}SmZ?3&ln_UyKM7R|eVOYTqie6(!M(VK@s;;Dhx`|L1nDw#F=UObNz!rr`Vp+Ir}*QMqD zqwlYIuVmK8EuB5-vjXl}U%X+1A~5c2pU+QzIdE#*yQgyc~1I&-8a(2 zI=(3-6RwaRGgjiEtyK>9hHoUG{4Qf>u-o6|Ejc9}|L44Kw*AFp=j06Zu;SO(J{06wJJ6V^)%jmSxd+c2^aa z3YsB%F0Y13GBA5(q1 z=zHe)WbNXP)^s>_@$T3DXbMdWR=qaQt-H`cepf)j*51NPNent{OFUd{qLUPx4kTqz0!?Vh67^fVqtxB(gE0MYo zbz76M+G0zXsUFCfcE-U1IMQH4h--+rkR0ht=TVt-W2=6Gr(HLm!kPytg_=Y0U z^?16bqjs0*x@&xTu2HNiAm#i$hcq7ECOD3fCs${Cd3GU4@u_e!$BR_gCO#>(K(7 zev>Agd|vbehdEoW4!B;zaf5sdob=jhUnE@@=z)8pGYm*S1)P`Rp};2~{RVI;H^3?XgTO;&_-M2NrS}7;@}+W< zffGIHlga7xffL;bPkT8x1E;o~1{`}sto7Xid>qmguEat7)tD^%fRkPlVf214;E*xQ zTg;yXjBZQ;$9rlXaMF=mfP>~biT=;PvG;;2#37YSz9bF-C!Y?LI4GY)|93|JkORFE zicv)Wv;+MWz={7G4)igM{$mIF`M{~)f5Ktychol*IPG!JDQxm3%I<#J{XjQXFA|x8BTk*7LjC+=y6epWgx}oxkUR({%~| z1MrDR9|unTFW`{>9pKdOzPKkP{#38O1E)0YTa(LAHxa7G#Q~>$0v`bW44>-%UpTf$ejZEpliEch{KM6;L?gUQv;Zoo0OKcO|DQJQwqev-#mM;CNIBfoz5wF^^#_TRanpot+q0%CI(~!A9!r&F5T% z^>C}P6oHo62X|_H$-(NYNbk;`uM=6q-B|OD8MIkSVlZgupREO48rqfe%B{9KSdtZM z;9wD0w1*QX*<^KTO~^q(S)zBf?aqN*lFnMQ3-`4jzFr8#)Oi6AK*&#b`zk|Zg z*ss8dw&gHm$nx~XSuU2Dvvn-jZkLA4&aPYAweBk7bVEl;yq&RMMJY&~6wy9VHl9vfZ?f)pwf3#lUjIMn10Gkl76@H+1q*<%Z0DP{|rl zHmbxKRGgneGF{DM4yNnKmK!q`C*&NwdUIkn?tj9>FsqeyMZngQ40gVnbe_k(olNI> zB%6j#%ZXvzL}mUP#Lk1T*43A5i;VWRC$0N;2N|DqluUSJ+h>+G?p`pj*m{F3FS6yT z(~`pD3dCAn?0VH+#+=?!517Qgw-7K!#I^1eD*>NBZvWm%; zoP(@lvVkX!A}b$8@4_l(gfxO2>0MY@C40NV-?eBGhT4TD4Pl$y3VyhOsk<~ zhiXYCmM>VSd}4K8G(zuyK}qG;oHh-*fgUwLNldL;vl+y{M11z zs|!GP99S>tD2>oe>GyFET{q~+)vO< z_~NscQ2%-0OTQQRfKIAErM0+D?G*w(^qp6Y>r(qs8s!j;U|S8pCkVFHkWa9!Mltvc z*Fi(SHwd=X@cR;q5%xiYofs2V!A*vU8k5wpHMmeEY`Ew2Qhx?RBKs$2K4x3 zuRhJ<0T!QR@o^USv$z{Ee)?2*A*OOV5#tlJ`UQsXWB4A1?_l_LhBq<10Wm~S*CQr= zb%=>yEyJrBZeci$2cj=ycqzk+7+%2eJcj2mJd5EsG2Db$3qFa6sU1QQ6WT9Kp(}< zX%GDK#1oYu+aG_Rb9}5N8y??-W*E|BgW+8qSD#JLt0gmf?`H|wJM6`>lr23OlYiOV8d(7|m*k?^#IJRQIR*L4tjR&f z)du}AU~iI3Zr96UAo2Du^K#2%j+FLa&F*A$ z`UM6bZQKd#G>?m~HkiA-5ynPLjxqAKF!)?VB8ZLmSu$lxc6RKP>?IK~(Q&!iQB&iLQ>K`sneDSfKYnqJo->$gh4~Xx zH5WpEcrm>T^RKgTCyY0nKu0m2X~H4>7I!gr&(e{H^3$B%Iu`Rg6{6-W6j8X4T`S6e zEsk1}RTeOPTLXA3A;(RyZYTtCxo*A8HR3b_M-O;VzSt09onj-v8FNAI8I_{WT9XWD+t@zc?P`_hXRV zGqNj9eYyU^Jgkl4*d7_+LF=e`)*g*$4;o+c!0KZ4$l%DM3p_%R!3T>cYJ)T2L2WD# z@-}s5v+Oi@sF5L>@rb?Bx;~)gl@KyB-P?haxaD{}=0!5ZT$EoTpsQD}c7&D|mE_#UEzQrFGzGpBNrg)YWQRN*XOd0_rD=^$ z_ZkIC7b7NJCJK~ZhgfO{O5cSv&5fNndT?0RII_8x6J^E^0(r}e^VbN*zUJo^ugWcE zR~9V4Eq9q6a(zi|@yumQmNSr<@6>^uPOHTT$5F^HcwSvRCYs%_9*W{^6 zEHyEC*xl_}%5@n6ddxuw6?~^5@R%W>qayHN^U&jlfWsAmN3#O;eN9nb4J0fp!~S+*H+x=HG4|o-d0K+{n<16|`+eXL&~FGh z+8l6{3;NIy_ZnQ}*WPjff@V>k3jWwmQo~wn1{VlfNm(`Rz zZ%>jOwJ-$qDuN)=p+UmbmScClf6Yo%zrJR5lhAkQ#5~oC9iAn|n&NuuuhQ5lRN zJy}CL%|X2tL*H#hzn~3=zH15UZVoz{6mYaD@WTpl#-*SxMbI&h|GbSxLKhm`SsT`_ zX+)P*m6v&zP>G(a%4i@-y>A)1Ue66N6&f{)h45^Wbe2Y_Fm-V=ansXWK4QJee;mHR zY~Zoi0%^DQP8#ZPTlH(_?_A%gTYBd5)CbRbVLezAUmZV#Hjth@zhUcVkJJ}ojdfhK zV{(3c@x!7W6MUIVPp#P^=6|H~fq=F}=e(xWw7>ev*JWu?4>oR_r)-?Fbaf27g=rcu07|m>G3<0Rb11ycV>zfTlOo{ z4_^^?z8aHeQEb`OyV`4S{9a@+WC%YK##UZ`W!s9}S1egOBltx@KDGA`S3Uh{>jBJb z_Y{vRYPvZnV8^f5clMcH4i3=y1;AoSD?LL0z$JFAQ^DCoZprbo^La%aC3rv*kPpGYmuWO&YCnc_16~8Yf7AGxj zv7*(HeeH2)l{PCSUF{pA>`i&B)_bn>ugS!mhpD%zX04^B*o{q(BQ}dD7Fp4C?FswZ z6T90togn5WdiXC;)b_$dJb^dzwPxLBp0i-&!S2GQifZlSHtQgrI-lHy z>q4{~kIS$gvDReRKOv+F39JWORFxi8qZS&xl)~B%CK)DW)LOh>8dlWxaM+|MLS1W|Y1uR>HO-#*Lmm@Aq zQS_P>)7!721r5z%t;a33_%3ex+ERxlaf|BcFs)9LX|toTCwNPMPj5YDIa;Z-={jeO zi}&Ae@bYGoW^7%!%2=B+TraG2VZ&nn?%u33>q2;`qA%{(l=Jl|k+e|4awnmwVNq3# zzSJ;^Rwa<(u&&_+$Twt=S(QQY9>COs%sj>wkURW8e$R$@HVD z=77x#0q6P1iqy%CRea6t=R-X2gr2*=4Sy8Ioa_mqeipX!CV2hq#K$xaG?7omoKe}C zvUq##_062x0(vp=gWf#eqz`!Vfsl`i0u~$AwwXJPM|`!MUSsm_Ht(p?eam`5b7BRkDQPPcg6(Q`{=!Aifqi9?h5h!H1drFW$!j2Ir}`&D(v>?0|Lh!H=` z+un0fvExL`Z`)VYt>c1HPkGcB4$Qhg_lNbL_zzJe*7gt4rQ9>AZpLW8jXmS^1tW$; zztz8W+@Eg^Z@eb$L0|4@Z_%Sa6}7%)iS5rzI@R-eXc~7sN@;r3m&?AJ%NTOm$PEjg zx$dc+qnF+HZr*}tuE*JZw=9ee7@FrX4l%g>%M_PsO`^R0OA zw^~vc`17KNX-PL$q6!!JsjyOtd3FznxSmLLc zR+|!A-CmcBWgu1ojVpYPal^jQlVzkRpX8wZwAcw)V)PKms>TR&8L6yhwWTIgTeHF+>pQGiE5g1U z(0$oU)~ik$RoR`*SQ*g*2Y=r;2OJcay=Kk3nElAul<;?7dn_zU)v6L2+W-IB*N?8| z%6Y+G6;~XT&ZpG+jPfduOy|c|)NR`IR%(+zG$%14GWni*!=w9*3Ch>|%L{u~%-XUK zQ_TF-Yn*L>cfaf1{nh{FJ@MRFtz}FdUtbwl$8*b#m0We3R%z6X)p7vKJbEDq$sVYg0^3f^ZFvfaCxAPOaeAckjCA zsjgS*CY>x;){y$(j)Tv)%)VwFUApq_U0ruCYskVQirb0j27MnH;*Hn7)fU(sD{4%c zh9TX8bxV8Yv48`3$xEVJ^_U^>xFPVvwm|MJJnHCv_v}jCUX`#F179_*sVY%0t42=` zGcUdqW8ZEVJr${((w1wr867bOoN{9|>-3dbdhb8-b^d-z>}?Ni+1~;pGw(E?9{G~~ ziG2RZXLgrw1$hagTsI*JNmf#@h?;u`I@yAg{7`gkL}{qXpP2%NrMk=<`Z9IOv;^fa8H(4xFCbF*qonL|*}%%BA0dDW63DJ4R1!C8vLc(cj=e|16`w z)q(y+MqlJW|2A;?ZMhl;^c941sUlzDAUPkwAusoP;Lro$9>XEE5B=z`!-p_hN<|64eye+Z{Nkg>pNe0+=p`Vm%q9;3$s$J&q7p0v-K${V5(ztIsN!pWBj z;q<#NeY=xzHH0R4=o=WdtAqzIe1-!~-+r$G-Oa#hTnO~2R|#+$H?&`uu1oksz{erI z2l$l|j(WWdoXYzfaH)N$z9$*|m%ztM^x!`nw@on8mtnjaBpme7z-b)B0GE%SmB6W< z>2e(RoD`&chGOC;1qsgsPW>PS3IAWG&%rndl`4f;s#h~`YHuk>_y;a)4*R8* zb)~r=Bb7w3*2vk93IdU&gdypdNQF4lS9B~u%IlK3ohqZKJ|Op;F5e>~{!h&Nlf@h?Jockm4>{ze;S`$=8o6%K{+!NlQEK^7+xr&pl_EKVj)uf}E$o*At3 z3CkJhG-rg-Nmg-E88oX{)y}Oqp>&TiMPKpu5oQ8wg9$&=Ui{VtCz+++?=QG@L71!T z3%`#5stuoD=wiR?wxTH1Wmq$4-|P%P*(8w1iW6L{Bnf z8AY!(^zI|%C%*Ka1l=P+M;bJOjx>Jn7xK|{qNnR57}j9K#u^jdTVO8f;;PUfbWU}p z-^uBm+9L`F>CMt_^WE&6ep}zk&WV@Ws z4TDg}5&I)e=O=NFQ{g})$U$iel{k^km&?xST}r~49;0;YNVgq>Z3~+axU6NWu$M5E zIB<716F4c!DcQwM1Q*gJmCYHPlLv?Ond9uD@Kmu=3x)Ovoaz3n+L#ww&dW6wW%9EH ziNh+vJ+TvY6+1=9!R+O$6&h3jl-^>bF>a9GR=6O>OG8O!ggJM~;we+&7B4pDm~*BY zBVvr%akKpUZEKCfpB0x62iskEp~#E^3y$2IzjxdfLY5T zFu)%ykmM?dgLLdDKeBPNF`3B&ZhLF6EwV&Nd^TAx3wFS1UMT|)%69}GGcc#w1?hoZ zU@j@4ov)5OLQnxzgWJJ)sPQ3$%>y)L3W4#E)+~eSLi>hRgL0SKx(E+cmp)&cz=I~$ z5LAHb;sZJG9H6=1Q4Z_E%Ta%F7kJS352HgP*te-5hqQ(oRF@aQgWma*F3iKF?&A^g zSPLEtSzSU<7vX^cObV<`UFtq&KM8P5FjE zdGNd@EflE(=S}$AE_g(3J#S1?wAg&2?t9sEN-LCUI(3V(JQW(5$~CE8c_WbHNnAUr zAkVPyE9-D=>&r8iFJD@aJ3oKvvYE>`ig@gDU@^ZM4o`WJLTVh+i|j-~8rzh92We`3 z3Y7i;vGh$0ikX>9;4L+G_44A|l2#JN9hdGR&5h_P^ICSk3+EL$XnfH@f#xBa0~~_|0F8g?9w54l3K*O;AIL)}(m4#1>t3EV zi2ZRXx|j4j#Q!bb%NA7P7yq8W`1kyu@b78aQxPhm zJF1%+d3AerE4P8i^9i_Hoy=C5PG-zS=wxbD^Fm&+_*ciz6x1g_@*3WEIoHP@&~j@U zpoW=I9pY3Cv%#4frfFT6pQ9S4iMf-Lt6}Elr3_ZXR2?gR?xtAI^jWK6u5zslHB6He zHOy^;)i900hn=Zm-ei1CRWsX84b!_u6&bf_>h>pg?-uUH*hzk=sIxW#I2 z!s{)G0kw;KKJ07#tG52Ce42s#0hs?^8{+;D6Q7wHdm? zZrz#zT_HDYjnNb8hb6pcVU}){$x}??q%dokLvjW0Std}f(R&tKJPY-@HJm`-t@#p6 zx;4+>Z_CfEuX&X8HJM)HV0}$e+%X6Bn1Y~Q{&_{<{-mIu)r>hxW-(h=hVsXG&~Kd*ZI9s?0MU z^Ryl}YCU3X-tyL!L%Rq%_Qsm>ES1gs+8Ga<`g)^h3^d!%ctGm{icOiK=Qc~tW$>%? zvT4X;mLYqbIoSJBuY+Sb*Z$-_w%3U5V~U>8TZMA_al;k8?i5%(zO|{wWlS(dtXM?rZs%Tm$~gj^+Gqj^%V0>sapL!=L7VUk;CQTnN_6CoQcOUK4Lq^GwwY z58fwJ^Gq-{7)Ea9ISb}BXqbMjSf~AyO~X_>(q~D%Ov7}q$)F4isRAul+NNi{7m#}A zkDiBo>vQO17?#?rObHPY?O`Db$%$I=T_^Qt_)%DUV>MG5*qy)NR%5kIx0C;{N7p=T zb2Ca81o&XaE1IfUTlVZtU+7Os*_97_rzV2U$KE+jO3o6PvCFi~SeIh+_*V2lZL@B3 zuT-12u9@z$%BE);nj04D-)ZpD32y|D<;{h~#s-@#P0uG)#p@3lMxo&lDg!gV+FCJ6 z`(nND6%+5xUS7!=eV4bsHm_2w`Qb++jHK?sY#v_EvnenrXNE-sIcf>YZCbA z>vx-iFF%~rk}~d*%Brh53zl#~u)q`8b0bfCngn@7EM?qB*~tp61&<+u7 zTFEskvNWas3jfcus$%l+b+k*+JGCggIAc|_ZfaST)~ITQf@|yq?1QG;AG}8s_|aEUe|cd` zh0mS73LkUarl+raqeUM*O2K>U_I;@L%)F{D zsT-z#Fy${V=3iIdoG~>p24`ODJk+NeZ)s`G37S82=K`OeuU0fZ^zQFooBw>`7gvw@ z=u~dppPs4t+qX~O6EyOf*W-#kyw~Cr>cxpkr;hl+Z4^@r* zv^y?%5%hj9HXQ|it_WJ{-Hos>X_&KGEw=w(363fY;fvZHJSB`ui^L=?nZ2 z0;G>hXsMdEr)o@fdu&}w9Ck45Ym4h_PdK7V?9!?VX)^~lh`f(2Pv(I4g#`iI=V2h^ zj^=;?==mywL{-OQX3gHaY12c()~YevQxaOC<=7s(y&ZoiL;n{#lGQk;Z+GQ9$8AJ> zAwAe0(|FZ2V@|foRAJ@1u=w7$Y-zZ;STY+b`@)_xFSm4M@iO5n{I%xd+j5Hwm#^|F zo*Kp%PxbPeJee;PKz_;cVqW;ZG{_pLjKSROTXPqeif*OcYt_2H`aiC7OWL*DljG}1 z#kP`bgwCx6I=2?mxxLlc-m8AoM-}1|<)iQGGMc7GL+AEYpQ>u;+-5|+VKi+7FzK+5 z>Xq0iDCb)0)Z;?O#>D(3=68FiJ{`X|^75#?Ezdl6o!^sBhljl#^G7??+g8=TOYb%s zV^Gq&#rI_H$nI+m`Zr??rfYv=&`v8{hhfU)2dwI7(!+7mIm<|8q^|1SK4WCu$=W1C zHSd2`5w0GqN%O7DYW3Dev+H8Xd)q<%O?>}Mf@Wb!UEAz=)<+ih#yA9jfm+* zo#Rn2(9-V#hk)xDPI|)z;PkNj5IB9iBzp2Y6b?KT>Cb_WmvGSE0G#wReNhha6X=1H zzNG=_VBowA-vFG_*l#FYCwc;Q0>@7@9Qh}~CuyskZ!IOrR&B+n=mHU{ZG;-Eg3=<|S+e(|d~B>p7-oxriBT(BEQ z`6T+SjQ)EE`ezuukHV(+Oh4dv1E=;Pzd+W0M8kdzob;7rflKm`UN8M_LiE=Gm&Omt z6NB&CB%c|$yk5n?N&Zsca``s^M>avvnEF9#hh~O90(v?A9Psg=dlop2N2$K2fsaG_ z1K@OB!bhWS!AN6CZ5?lF$Uhf2@x2nbBoEaqm(j-qA1mWi1DyKtX5iG`0)Nmy2Asyt z8sPHrb__VxpY-yrINeYzNcSqm1_?wg;gc~ws2`*t;s0*>7L+?lDipC)?kV8Zu2PV2 z(jTX1h!iCJ-%YPWe}_tiB9_X%2DmdhUCDE)^u6Fu{VfHlTvvD^8wdX?{d3^stY3Zr zPV+Sd(tDmx<4x5tj^@$}DN2xnp%cYKpqHxm?4XD%{(fZx2iu;O)O#KEkeyjoc0%jc zvxhT!(NTai?%}b6^d2P!gVY{{3o@lgiBPPCOVw$oULag~(U8=aU1}b(ALk@Go63>B z6*xvFiD<2hGb^18P|shxh=XQm;dQ`Bsv3poJxe3SI-O4s3lZg$~X#CV?&?08dL#L{_)@tz{MZ>I7Vg5POi;Jf=K#0$WW(g@9z zPRI4_D4*t9Z&|1Zh89r!+z{rFA%nPbgw6an(Fxta}BWbV{QvA+2TC5eaFEy+KDfUSa6fPlySp zbPi%H>D4C0_#z|d&{LYqLGe}{cphn@hui`VdFgwC8gdFal~43O4429y*@-XZLmdQp zp<^fL&_gakZn{qNbe-e_4`O4DiH>YLOFH!JD2UGMLDSF9ci}t=hYrk0zp9m;Q)4~E z&Pgu{{U+F(w%|O4&e4dZgZLZJ3`0SrH?@YHlU`LmXz*VM6ieq+f9ZS+PNZ{-?3~7p zgwy-FbUsCP{+W!%SB5)i!dsQ;tuv{0=CWS8$XU~Yv*Xg$oqj!=&?KdKH>+cb~d8nHlv*)J!@HBTow*m_Q|#MB~o`QUEK4` zUT`dL3r5>1tV2-{|4R0PBO_wTY%oHW_ni4+LtKUN5tWgYlapVXkLPQqIXYr-_S7j; zqoSj8jgi??rtBduECDIq{LyLis63>jhVO@5d=W=;)goPC1{sqP{s! zB{3u(F7@6|Bjb0-Ap3cqQUX8W1b>(uF7@6|;#+VS=+0nrBsoGL2k9rHYBD+8?1=N_(|bHdkIp(!wBLG@SuEaA%{lF%wpKdEh&*<;u6LNP+v;jEiaq;NDA_P zab^R#6bz{17WZ{=Ym2!WJZSE&XLZ?yx=3<4$l-Dy0I5CD^LU3_IfVCfm-_&Afrkk^ z_AxoSAcq4xX?!d;m(uEw#!G6_f+R^wtewDvWIw}r_+?n1F|zUDUWcFV#|#K^7CeZT zvv46DeiQok*T^^<_nK=SLVLK>;r|_Y&>G-T@NfvSx-2WmEGaL{US5z{R9ZZ!J(?Jg zUEm=fWAd?jC76p0X=btQ0|-Iek*$Qr>+p>p_Z{75fP_GD(E(V%Y0cv*1R#^VY>AHc z0hmr5F+#tdGo3m#4zZ>z^^R0Uo)KFA1A+$s7tsAToq9o_DZ>@g=Kn;v(u-XHlzRWX z>C{%n<5*-F)8AL*(Jp{P0_E$VxFfHI zkgBZL=FJ^QPEu_8+Zj%;Fmjs|Z)sXAFQ%UQqbZ*x;L1|Ze_wh2^k-E2Nhi3W+gl3K zmVcvEKbEFOO%DpY8qg{Rp(cv*R1SL^{3FG(m!wdcYfz?F-WdEFyG1c}_~zkHp8tN4 zP@5a5Eev8!v+~P9b^iO=!j+llTffTSymzUvJHqtC8{VcL-t?x{n}!_A4EkX3RgCxp zO4}Tqrm6SJQ*Ju{{p9oboIX%tv84Glsv$+p7*GxQN2=-6Y<}(l=ZzFffl%txMc6(|X@DBx=_s*UF{%_|z9`FG24$j{` zXTe$bxvDh(-CjEv;{4z_`uplR+6B^aj_TcZ&U7kgNDK7{YUKU3!h8Spmbdl1@&T^i z`$_|WqkMN5R1C~vhU=V zeJB6j`%e5j=r{LarZL=M%{ILyS7jDWfG3Wr{e-S~nvQY_odS(TJ=>B7YsQ^|`dzmw zp+98|sr12wYf4;w%9#3;_@0z_obPE%?5IlYP8rjvO5Br_Pz}3;sw`b!tL~c&9ham# zVI0;c=r0yRk+EKPvRfnS5q`rp3hMj~Dic)tpfb2ekqGs^I+#8N&x*L#6tIfpjzQ_r zIP6nS{{`$tcWa;r`5BOI&37538Tl1ItgvX<2@_d2#pkf;9DLCToc_5|!6 z=%#%GV;WQmP$lF}^TWQ)(6#pJzUtN-ptz)3=HT_^y*G$=uUNOK5f;V=++g2 zpjTH2Wk+5xwy)AKjd)z*uVUI)L_Jl6y?b%0?qZWPKumOlvL>ou!g@Hj=XkqR`^{WzJP)&pC zWH&l7WlU|#w8pBqhN?vL*Y>Kb8&nogE(u*T?6VBrX>|1VY3dzu!5?`k>p(35_ zaj-IpzJQg~-hpAS>uFv~QaOI-7@{ZYHH+)P>}43WUM%ZigzYfvH~XQcCw+ z9Xr?!1&qD#HwU~cG{uK7@NQc#H^cl+0@t{2>BG2Ck6DtQG+FDzag-vdFTPyOolytTZ3aO7z`i_E+&ehX-%#hRPg=*R>d~gA4g$b zU+|%E2-%y5o)ktqhW*iA8s6kU1FjXwb%xQiTw4PlATgGj)#$z^!AS)+MWxrQ;;`@P z^X33c8@b@ny6rc7kv8x{vW(!$U-` zJJG5uG}4nAPgn~)3*ey>2W$2X?TL8$*wpUDCs9glz3s6sJcisnKsh`trZuRH!jlmX z6mrCX=lcsO@%!*d!ZRoddi?QwQpSK_U&Q~i@QRB2pkx6`mS6gJ#!bY#8sHCEeUTslkOK^VW!0Zvq zTlWvlen;KcGEP5i#3E!D_A$SNI5Jr4&F8FBj|kabjX$4MH`n_OpIu)!q*{Hg{*1bO zYlz@X<}3AvfgzS6JvP^Rbouhp85*ThIgzi5QyTZ#HZ3o$JyE2I*6Z~lru~aV7c9R@ znOzfgc1ZBG=c_epwa1P8T_uw5m-2I7UTU>hZ_$?M=?%so&X0(D^JV_<>A86(QyH%f zjurXBm&|LvTR(jyBgNF+ilDEs@Jafl5niSh4+{BS9uczteCnZo?V(eXYoiT{=1Tpc zO@jZJ858**$1k`^ujly??!dL8K-Z&daD@QDL%}LcJnQ6TKo#VXqlY;Ts}M#^)kUkv|ws(Qy%`n3+aXY`)PHKgwuI zJYX`>uQmK5iT-?3gFoNwmu^%kmA;ofB)0x!ZiG43_q(}T1DBPRS6gdpdenz++U{d$ zdMrX|dGKIws>w8WELWm#%2*#dLHXd5DuqIE{bl$H_Q#F->83@wwZVMTQ=?O_`)fc_ z#>UV}MfGImUuMx>^R>E@7O(WNPb6!CM~~&wcWD=^Q&-(Bv}?ebxHqEHxcWuDhYo1J z;PW?znopg7nLNAjNX$y{1+{$shkKl!XxtB?Fzd$m$|^^aGnA=nijw~P}#6nWk?HuStHJ-Iq@%Ls!)QK5M% z$zm~?(oO49V?F9Uw3lndE}$;hA#cnZ@YN4|?K_^v|9^T<_%`yi zlWy?KGx(7YpT0oRHO&ER*v2{+i`+JN@)?R1*`a1Es{{Hg$dA_@SW08T+jqI>@Tb@O zFZtf_j>pbzeqBb>x{NGr=U&Hr?_dR#g=H7qR(Qr>H=MA9!TLH=wxYrAZY*{(d2*&z zd}dvF6C74}mM!$vygV>uPloqC(~tt}qc+-H47uL99sHx63@fm8T;PV4?|=24a2MT& zbu<=n|A)Odfs3ko|Htnv%nUFL!=i$MT^0!ybwE^HvO9o?h>A<5WikT{LZXa-h*mZ; ztfm&43oaFy87-eaqnVjy4NK-8E)}U2n3bCPAu?QY`M;k#GcXd?x8L&m{9gZ8S1&_k!a-u3M8g5yzl3~#S@Rjz~a*ybN!FAX;#DBBs zVsV08vNm2QpiM)d0R_AF3OFAffn7vM5NFAm0PN-EbMw>{HD=Fo9HnA_A#^r6T2$4C zzTU=x&&OBBy(SSQ1{?WjSP)yga-}jqfW8NTSbT8(^t3EheXJ)CYrqeXA@8qc#vZG+ zNNY{LtXNj9qOD6DHHy$l@?kz{fzC4i$qkafl9a*jj*YNByAf~hUTH1qPiF!ZzVc2FbQarF9n}{#xE@gPb0>7ZvM-|0*k?7z7{Csl-&2g0?JlQ%UPwTu&x8&4 zdD0>IU42ngdvg7Yn%W@jqzXPbCY8yaxFz>Xf zegTFUyLm@e?jF&i*}p89B|A{<6g*O8Z1Fshgb;7%#}1hajUgR6uk0~a*4&}<`A@=B zK2th$PFlI3h*j8&topLj#FEY%PE|<@C(;{9_>bCoa!8qb$xHDrXGbG<_453Pc)Fltu-Zn_jU*=K1-zRK@rR;sSYdivSx_v;gdQS_)?|h8i0evW|E!OaB|RvgQxErF>bI zD6EHpXR&Mbbg!f)Mr`2=NfD|v(>Kf>C$>WcLx9(HiH1{fyb4xbV?vaQU5_(Dt1L?A z6LDE@sX_&zi(9EM!t;fy3@J;mmN9$=5H(PGWF#XX4lv@7Z#X!-`Yen9g*cu9zXG4v zyywcO`l7NZnUaawR-xF5(v3qxN=Bvo*TROA$PSMt416+6x%0mZf9P%Cwd5&G@KBle z=<#@LfzgBc2sHQ+U>z{6qJ0FR`(FqQeQ`%2;a@<70@Zu^(xQ|FU-07Tm$%vC0H_vn4d;?=_m3}EUe%1!tN^}?;iRp(%;SP#IX@M$Hv_3 z{>g>^tZO+E;W-W!ukJO{EtyzJGk+fX}~Mcw_h5 zPi=Z*aly>75pPPqU-Zp{9zQO>vgE@s_Y)_s{5oX9*hv?(OJ-i{{??(?o3n;3{py=M z|6^|lX^+RMUOAB%w%X%oL&~DpPpMd}0X@I2PFwon1?X{E{{Epoiyuq=(&MP&#I*9~ zyXW_8kp{i&!L+Ksug+ZguL&y*R(}Z-+(s&7CyvEu1c`j_l&O@Nfm=S$3|Ur|#K^Y> z`fXl4`hv`3FjJ$ht*w19p|)woI+eWX=-G2W)*n7^-m&|gJs*8+solSG*S>=nFI{PA zz1nvD=B+#N*pKTl&kr&5#vq%Nldad~-_@CpP=a;Ij_qtr2jV*2-Ir$wvPz&wlZw}L${nz@2y%_@^&bFED1 z=^7*}3j^U@m5FuTrK)3`j>!wj34^ELh${Y5;GDq;gQz%huzboC5L|}Tu>(%Z3qR$^ z34=vmGq|p)ykIJ5U(*sq@=z(H#hUCptn-{=Z2@cj@;C1%m?Pg)4PxUZehFe z?iwO@L=4+A*`)fvhJ_Z5c5C-tfY%wAVD0Z7T+*)T5%qI6nYg965ogTp6Jx>+lctnE z=4uL0(Wv0g;NNQQNuzh| z=drbEr!`RS+J6Cn*^op%@a_5tTkhqabuNN%{yo9RODxL50fm*zYSvY$>NSTn87XF6 z{Lt{mh|m(BEZ^=EQIe>e zOeR~J-l!gds?nAvV5rcNr+(v zd-O3{YD2Hq25{0mpP{TUm08lvZWTqzdnwfs%wE0ENr8WfTbagRQrSaMKcb?}Ebw4O z4X&jo|9WksLH4}hd~xA1#UYS65tm_9mGm-6<>|gf?Ea$pW92I(;+o3dKWYblT`P7E zZH$;!L*MMvp=B8Wky7~*dHc~qH&P|!WKL5;gCCJy9U|n!yZXAPY0#iNcRk>->j7V} z4)=55p=r*hR`m;LWZsz|tjEoo;X-Z`t|vi&9S3{7VSr5z$5xAluCJ=RYCL6OD{2$# zN1%7QJe0{^tm+Mma6K85O!6;kiJYHOELxvYq$w!%C^W%M$nN5GvN*Ym5M}R?RC`e* zT(4uddn@HjtWBCllh!ypG-=LDJsR!XFbXkEO`bJA=j(>q+FOIC%Mr>Wo<$xNmJ05< z{hHkYq0Xub-3(J@f5n<{$8ro|A{J7k;c> zz^UToazt7}8rh6Exe~YBgI{tPj-Af1oH`wcPA3>x)Lhc+X3?yxi8pzOiUev^lk>3a zm4%8377kQ+%Q)?^S*EG`$!K(9AN1QT?j@P^l^TfHUo`*;gM?~Th0|W8(>yD+!8pLw zTw-vCV8L+2#~?nVbeHm+W*y@j9!eq>Wh~cPna>&rl-WcSe-v6g-=>>-Q29)gc+e{b zLvu-G5X!A~j+1-J#5GLFO;&NZNpXqoR?{Ct^GDd5y?uJ z0JOQsO9IhW>$GJx>jcLz1~iCuW}RM+F<{h2i~;>(Fb1p(!5A>40kKLc5zlcL4`TeY z(5fvW8YG_PhY|F45i8$a|&L>7!S59pNVyP!X4r-OeZ=v0(bpyL~`b~$f@PQE#Q2Hoy! zgXGtNPIV`6Vi?we{~YL4{s7Pi+UUdpG-c*tgeQScW#k{xfSv?8>Aezk%7@nz@-slE za%}~@yEWQ0y>y_r`w)Sgv7l3VmVj)u0pK!=T&SA(i)I&`H0k4s`Mz za{_c0^f{nYJ=n|jE9el%6oYQhm+a|^$|b%{pgY!AU(kvF{Z9O98~>3`{K+={3!V5E z+4%2v;$I6om8TcRGJAU<{oepR0Q7;NKY*)U|ARL96F_&=|Ex`ZD(H^-Qzs$)pY6o& z13Hy=Z72SrpreWMV=IQ1cKbgJI<<%0;BRjau>W+M{3D&@&$r3{zLWeFHhy|1*-`(k zHvVo{%Q)&^3p(+IgKp24?9&K3=@|#QT~8`#Gw9TgCxC7rm#BVwVbBN${Rz;6a3y~k1h2iS?Y+UYLn=MQ#4PXs-(3;N&X zKMgt5UhRiHUnTk*%@g*+PXD{||1SUE)#txux4&Di|CXMA*Peg3Tz{AUSM>8xd!xeD z-mdOP&qP1$s{P+D-}~|3fE*gH?T0t{6W5=E@FIuuc#6Hnk_mZ zCfV+z!T#}U$EU%6bXH>bAo0KI!O03I+ohwAh`;*KxNFB%U1&6LFi-3DK;Z~E_%kjuK`pV}|ixEDQkM5kupSa)(x7w<63adT3)G9*7+dZO7 zeCCL*@{jnFrV!C(TZs6R#t<hUo;p?i@xzYF@eXdn0Ye}sZv*DYjP;7FV zE;ltNQx6cl*U1V~yZb))|q~KvyR)So zJ#Ea`NmFLp`Zt+*QtVU|!1{4oa&Yp!AGvpt^1i&h-Ztkg_H2T?boONz5qfWCec3KP zW3xK@%F0aF#JE~d@N8>m-hM)4of+8kCndh^P|r*`-8SLMjo;qlY_y=(6xsA=zpM>KfEr@^Z5O7?YNniw_gAc}v4DuQ#4bz$pLQ4%Y1T+sWqx`B}3^ z{f`>2)k9i)3+rgT|403;wad4+U+Wqr9gWi7j{lItp&=*#SxZii`KzXEOKxwr_iAFN-nTX1w>c-@)1IyRTO0I0 zKIH81++D8${?Z|h6$!l^A>8IEqzhc}KQ7`! z{@gKMa@Whuzkq{xSU!*!Pkyaw%bj0`bhX;-TDx%7pB3r;fa!ml%5J94D?Gb}x-?(- zkb66Tb?NyRr3$}~XTk74buAbkbsuBcUH5gVU<6EMTZSek|FH=TjELx3YJ}Y!T}!na zrIWED{G_pudvCNZ z<#c%&dGIOlhfF)CwJnP6_0et{`)W7K+E)JlV%OHuS-Tk=oG3a7v(Nv3SS#D~?7RYQ zA3pd}+C12VVTN6prOgSOpN-i-o0d!?i{3ior^5XMmSQ;rvCgx)vxWN|Z94?+|8>8G z_Pqk~`;R@qdG$j0`5S{h&uC`*e$XsJ`1wN^M-_$l;KW}1yq&h|JGLv~4B*+uydtD; z!F?LGb<1#Fiu4qw^b}r#lhWtmimixw^Kr#C$Gi+&u}v{=7OvQ3R66VcOahZG!%XkcOm=^;_Y^$@XI(!?-k$^BOUCveKlw$ z;G;0fp|A-j_O$0ci7S;i4OdF{7}C+hn9WG10c{%6@egN^j>1Vc{sbF;B>1V`(_@+K zBS2Gu-`)-=9ESL5kmn;}wi8A`DB>whdQg}}{4MM=okV{0_H<9gQ<&l@+#T_kP+r(+ zdvAn25l>-?r|@;$U~hU}EBr%}53P5gM;mCD@VJ7)II1XYL3|PN-2*-LA^Z{IDU73v z!n?`;B=`>^{c(hMBA&uHswiwm{2g3XXs-uxeH-x<#!*G#YFqwINMDceR)_p4yb&k% z=;xK=O6}}9+tq|C+5c%=$^LrCxsLKLg`WAKJqbA!#!*G#bezPm!Ik)@gFhDK_!0b% zftCb*3gf7va3bQbBK>B>PeV8!@f5~UMd4VSq|Yc^N$yZwNp2X@wSW)L4z{Drw6FOF zg>h6-I1nfCqYd%=O7NdYy&Oe7b_Y!kehTBLqOc6{5=*M`2v}uuVrkp6Dds#m0xn8}cxOF%I#1;@N_nMHn*f@dpb2d-O!}waaPO z6Ulfv^jwAPriRjXzn)&U`?Rdc1!cbqJvHbzTe&#H$*KGIaa6Jbe{O6C49q!))#ZLdX1D&1~ z+39q(-}^(B{eFZ4Jsdw?to>hpiHTIhn;x*+?@JvnIiC)+SK&zoKB4R!J`nv69EHY<}; zGv+3zYcsRpL+-B^cVOyjv-AI)ztT>-ckMd!+jaJm+kRnF&~XRKPR_EeqvoY$WzN@i z=KAAC0jh%EJJQWd(WRy7(gx1UPFo1j^?QGF*w=kzr~jQDJ?7qD`OJNOy4OV{P-u-`=-9aT7Ip*APYW-i;VC^2-op+*t++fsvnReMRh+~K-+ zYv`}IJK@;VYb5RdSgjscS^oIry_I73$2w$K)KDu$<1!(3LK5tdnw_SL(WYkTl82?F z>xK-88XB3R9imlfQ=-D*nKd;H|01<1LxvA^aKzf#4=cuZMk&D`);i9V5uuCY@D8kR zz-Pvlp7+y9^8_9L6F;o@Vr9)Irt^l8XwMuKXZa2yVjXFnjrw#i|oSbx0OV;M$+ zxr7Gf6(~HV%Yq(kM>KzD`}x%VgXIr0u&Adwc?Eu4@G_2C*94AYY%+2eVk4M<4?4>z zgA7b#%ubt(w;=;+(LvKXf7oQ)*Dvh~$jHJxyBjhbk9+OG|7yFhU)t+f$gDu(VEka9 zbUUF(5UyxOo%O)pXKrp+WuZDHdzfu94u8(CH$ZWe@#j8esa?`Ki4I5oZ8qWQG#Fqs z;qU2BXPdqaJ!oy%Xw$>5!P?H-6Yy!QzhbE@UHPRw4;j=iys@x!JREg$s2BRZ4?Sq} zp@aJtWK2RZ^si;K7pQYt5}`y93SR&jl=n20g`RCY9yUEP^R+oVxwDK0v0kJzg$&hZ=mHretE&TbYn$z?vB}AaiPI-^ zaI$D0k0O|evFH9W_`1EXU)n{GL2Kn#A*0jb(ANLlFRcMGR7m_bWH{QChG6^A2RBxM zG|IX$eQn`supNtgO6P-fE5fsJm4Agkj0HEA!t|SnKj@t`Ix*z&?>9y8)UN;JK@P3) zJ0Irvg#Ruwt6RV2y?t_RSvm0fDO?=81b#m~Gmcz<`;O|n*Dk>yEfX5kpl+?T`8&1x zpl!OVZr#DBWEU)sWqIGTUxK!or>R?e^1fY3nkLsdLkW+qpYa}B>*4u!d}}N34_4i( zw{hnL7VsW!iJyU|S;pBl!y_Xwj)5MGGkG?xzDs{!gFjob*}Ru@H<`t8>eet`D|PFe zdBxwae)QZee*TOPOy3S!AGtuy7xWgxft zcZJAne5--imVCkrRMKPPTeI53cdyOjJ?f5con|Z1V||aIX zUH8UillaDeYAeiluXVrcQtkp@uAY!k$-I_8Wpmj;HeoX4i#^J>#CxvhS_F*O`hwUa z*QYgjm%E~df4>vE-KD~i5rw~krPsqDCh)f_7S~^{C~wApA_x?1V4Cp5y6>z8re9{m_||AK z(ukjqWiwhn;Mz)53|Wcy8T`?m0Mz&0A*@EeRtB5zyu+~YQ+#K9tEUh=HXB&uw%uVf z)U86^Rtar8`S!}SzUj4?+79nO*yW`o7o_1#fMk^iq((>?wZZ?zOTz>ediO zNVZ45f((}m(*2n`32j^S$UmIuxWdyigSNWhj&Bpwk7;?{z_ndmz}J|-rDAccd^PzV zPPyaK#I=37Kt$3U=+p0TZDu`5Qnv>3+S}WsQy}FQcSl&xwQX4->6C879nwI)>fty! z{1XqpBLbI+mm@{Lu!-}%Wa3-W|DgNHu6!);h*{LwSBkme9L_DBnGlX z406;fxVGoDWJAv8)%m^K32i<3K1uapZTD~Ojn72?-^=0eYkR2&7|mQ;8qdYGeVl^y z4*h=3ZSt?Y3c7P`u{NGKJ`d`X68O({&WHeq;WpDJX*(Mi9_Jj0B@N2E=(ZC^I<)>i zq^tgRXq>>@vNxeEJ&9_R^x*blk3 z$9NsMwv)UJd#e%zI-^zfy3Muqp3Jvwf%9tX7~+BQC$yd9teOijj>E zD&X4sF?|1HuE!R{b}MhZjyH!hNY3Yw^Dr;*;4Kqs)8yU~Z(Nm8u5rc(TX(Nz-Lh(zacc&z zWg7UB;vPc(kF!Z_p|OLXJGj=~{Fp>@$dXv6)$quUa*c179LH?_Rt5`xie^k997mzIq-@loa$;ds|;?{^g3;m25gqMK#E^3B&oB zTQK#Ksz1%132k8^h>sjGiC#tF(3+IA}`--Nb(wprk?C&I#nwsl@h_*npV z-Kl4h4!G~;Om|KNvB$47l?iQc^W4v%4=#-zknt4wn2clB8M9}G+iI>YGH@ty3;Uw> z6sx$lC#eTJ^~z|t&KRD7re5&+uAdB=pnFCrT4V~}8+(C!aqN)`E_;q#a5wqK$zODT z^T-7cU#9?wX65n@6rIF}hjT zM@O!Eqko9sB47E|-X>YQI99fbYrV<0WXM@13ZOg^+Ac|;mt-kc9bSBHO5}EipM&hH zh`ZM$zYEZ2M8Cu40q|3Q(?iL5Ipu9c031R=G4AzJ_4Ye#NU%^!peuC1pnMT3AWNGYh@3(@YG z)uJ~=7=d^3-0$8D$Yl9;^3Kgrq<-tBcSS;L;{r-$Z{5OAx|!|%=r`S@)u15GkfDE< zYcufDxz=?Nd>g|0foAMwyyOyIk91o}tf&i5-{e}4M=+tJH`i(jr(CE$WuJJ&@%{g% z6^|j~=ENo$X1j+PxHdmq9ufEC@hG3iG(HdO_+}rE5^OT!ZjNh< zz9_o)C*#@%+vr{m@}_ZZL+o4)VIOdnz2sw z+GFdjPDV4KOyuj4n&DcjbEu5=xkDIu_u8EsR6D=lcr(Kg_vCi2b()QHL=fMnMNiSV z3yzC7`ejmlq%FQ*r}$GhfQF!F2*UvR#NLw+R)MRdA!9$E*QYly6STHzh?C*hHc5!v z!^gdULxQ+7d>r}~Vo6`F^~s`7Gz30ne`$s;YZ(raE2fH;wJe`3rL`H($ zw7Z+!L}CV>?eLpj_8Qhd*{Rwryswo37XX=fW{y`Inen>Ca0ZY$p8I_86J+rGeBhky>^WJwf!Hb>Xx}TeC!eaz$0hv^Q+fOZ8{)uym>+)3CG<-t6r@|Yd!yhNQgH*dPtr3Pu73+#}z+-ccU?ImJTwe!b7 z#f5m!Hz^wiSv-R8IwKgodYPijp$t)s5sa-X@tx?NDBT=bh)K)jy?|(Q?g1c4&(1+% z+mS@D>&w4PJgp1cKm=Yqek2!2BxB|y7hD~6NQ5tj5ik}ZlK^T2Qgvxl7p7R>lLr(^ zc6QcultKq9jIe5Vj~vp0ikvWY(nK3qww?x*lw9z_%P9> zjpHBXVC1on6H^I_g&CMyP+)x;voJM}Nxn}bPe!xrJRvleGFP8zknaQ32s9p_M-<8aQw zIUi>(&N7^9aK4B00M4^GX(G6e^EOT;2A&}}r{YYEwBF)A@N4Fu+p%(R~OWMo=Ak;C=+|sm>@ZhkL3+x(~yIL-k1V z4`MQ*`lS0)$aoIq6Hf@{5nT9ZU$i&A5cFO|z(Hj@3EE1~{6VAngU0wq(6)8rI|JHB zooG#<9q5$y9B5yGHo!sNdC-0aZI}a%_W3CzWHpflOA%%+z&`0WSr(7a0aL{a!X zW@4i@L2b+tr^g%n?Zg-TH*k7ZL9hQ2PEW8Erzf}_r)Tw_;Pk9^#OXP(A370E&k#)5 z|KRleHtt7$_*{mSC#_$BBw&CajONmLQU^0m2S00w=WIArRd$LaRYY6w>AE_ z0ph~ND*yT_w^Pmj`>Xswxm4rVq*X9mdY=L017I+^M%SnYOi1a_iqb_YKw^k;HKmJy z7|{;%(5R6K&CE$j%60m}T~Iz$X@%;syer6mjz|wM&i~+2_`?PDVF3$w)TdbgGjLPg zwW;-`i!wwDt4s3@r9%NjqLcy^V{yBw`Q#S=+L}MZK`C4uUz)4u0Y4fDNCWsHUE+My z5~2psHEIRDn*h|&?Dq#$l?o|vWfsgR9cqv+E|4w>EnQFvaFNoX%F-n&DezGi14krY z`b?-4@9dfY8PXd-DdzzeBItcl5LKE39m-4d{@-h^J_2g4uMD?>rUYvO_ci;UgYR%H zd7*Btas$lF#Tx1$K%Lni;D0HA?g0;TR^1z=>k57bz$yT7;VX-3Enb=rQ zbq73^AGN(tF+A!|0BX>W$MpfAi(fmS%YPFM1)cg&o63&?{zq&4380930C+jyqAV7_ zCJZJ4Jd{f=$_ppxRzMdxBbP}F45fMc(%e4)%%t=_AKrbX=CJ>i>#@>Vq!}(pT z@jF~am@dc*ct3bGLAFFDU5vH_tQsF_LAA8W?;vzg_dc%mb8K=*1zenqREfO}Ly#mx z`qb{ip)vy6!N6DmNFKDt0_h^$R7&&EzmxIJh+>WB85g8e7M@_s?BY4vdufI1+PT8QInwWBfbLBt4JpT-U{OtMP zpRYNUz?`MpXq%cVhqkQvmF`6&gs z=c(L(Vcmhd))f{Sp!E*NM3spM#11fQTSX&x)pt|9IfEWyS2X?{tW(Ap|g<$+_xPYwUH;v*)9@P(d-NfcwZ$|u3QQ;_{+ySj{ zg=o}CkzVlwbYR^tr~p;y-VTO`RLz|GZ&ZoymYztmv+$ua>Rv^nUT+J4fj7!r(-Sy( z9~F+o4FHya{8t9Br8+`J1f{WXxTVgIiG65y-Ke5M!er_S8F8{ZRhi2DKN^DH`_ZEK z4+`FnDQGqph&5kx95tzjnG=#g7lPr57wILvR$L&WloM`q6Zc`}n2pu4COMDIgV(JX zuOhBODfbel)F%1VihB=K*A$jkA`ixtPm z8#fVw@jQ;ti-hCzq8-O)HE?`_Cn(SD_Y?R8;|H~BtReVQCXiz?EDNpBDt8a$ObnX9 z4czguSb91sX^X7w*cv;XG)v)Xy93ZJ8 z*iyQw0~yF^)wXA&@iUPP75jGv0?KVNlq&p3?D67h-)l^*$NXGdlLT2EHrtGhV7tu0CWf>0QkN@edEk#+8-N$q7XL za0!XwLb%f!Up8*KoP97=%&4nEeIpFp&ebz-rr;+%Y|0qk+4>oCFlUt&H0kqaE_ny6 z43A?Px}S{zT2GIgIcwWtksj8%8zYMgOFX2ZNfn2ExYSlHv-ZGhL0CSFo=_yc8sW$07<$`aiwHDo{K=Tu_$a+0@QY@{R#D^|GN~fz zH4j7JtPxzrMSYV+aC}7xSNEDoD*Mt;5V}UddC!b|OR~OtI_hCK_dd*h@R2eIJ-_9N zN3E55_smxTwM9{GN-b>qTR#z#9CZFs59az7jjmCBj&bW>_nL>adWP>n-x*^*`%z{J zoRtuFFcf{?g$b<_jFX=K+MDy0_(gHYA$-g9k|(8#^7nFPjX(j6{!-cF0R#O}#+_@M zS8o;7AL)tb22tiB+2UTpP|>O~TU%e5+lj@@VqVx>&P}rxioWifN z>{G4)_Gf;}ND0WNcGYiP%4bH=$oz&esMG&8K2o3@_(&O5-g;wq!bj2q4XHP9EAiv5 zQPXk16kt2X-dIJ~8vTFNj=Adk3FlJ9xmH;SiRgQP#d7YgJVa~%ZOPZ2rpTNglQ|7# z9KeoP+H=s)I7a+il`cD#E`(gvqBvWr_`b#U*Ch8AOkS9SAj%@aEdNuI`z58K)gl25 z-X|Pk)1CtxpG%AR?7ccS+c2F@RngCiGXZ|MxxeyG{4NLU3pAyA0A7}t<^XC*Bf@@2ZnYF>m-oSRGTw{nWVg)s7Dcnl{Z~Nh z0>0NG`CjD?KwKdB{?y`nshr30GWEcrC>07nmNv+>fAYTIX)Y!XK z(EFg#Z6Dy0@H?o+|7dfM#sD4*6DXV7-qVvhDup36{=+IRsuaML0?aLJe!n`6mp+B! z+^71*3+Ne;IPuZuTT5U0 z`iK02TM048vKQSLGN$wgUF-50yI%k7hxA7O(d$p^hTVQ7Yx$wHoDH`&e*AOmf*W51 z53Opx@${{b^`*_>doDfc#RPMh7ezvm$>&y(vyk8GHTf%jJv8BHmvKKCsOQO$_N>bjlFC$rJFr3H^1AB@;%zD5R6$}gTnFUdt><+spwKia-r`Pl+EpHZE0(DB)`3S(S{ju+PaCXKn$p`)q) z73Gt59Z|%&GpkfB4#|HxtI#?W@y4TLU84UZ$4ba*p;O^Nt~-Y8qKYE*C74h1tz4 z_|BuB0-Ph+)$+ql-AjJkAYpBcTh|%ax{7}9FsSf|VPsKvyRwEe&i(_jgz`^XDtVyK zIdud*S0SBPKew=S<)+|JYCF{W=l9f?HU)On`?MkECXME$4u&Q$v^X$aA7Y-RWnbxF zi0Gv+EpKl*4GYzEm^jU%=x>@{ElP?n;f;-=<$Y`%BaLxrrWe06j1>FZHP%Si)B%X9 z?nXzEmVA#QIWX)zXdENIyQ1VXo6lwWuc;X%yD}L4hs-Q^ zwO2$fZl-0M^&SS%B?C9=dZ@A6>So08t>SipW@TN==#F~7II2leHP+sEH9KR9m*eS@ zH0?^wSZ8y2dl#xcCwj|Ia-*a6cK(Xm8*Q(>8pZi5qUFB(LfZRS($CT}0k`5K&>)}> z8pu_5;IlpE&M;njUG^l-4Zm7z4j~GbzAyq+@_hd9>!uV)Zi}L(8(a zE&jp{!G!|qcj%R^GXt98TNy(QRUcZ;F5x~`5k1PIZe&rM&n_)0ZZNbaa9af}m zQPavQ9gK2y0e4mFI&d`6ksfkB_M`?@yDA&czcd8G{wSqPDrpgNH|Fh zp$-hKU}$h)NXp}yH2Rl1lvItFQP$MX&@e4%OEjA4<16J>`%jnde?a1$AQan%Zt**H zk0|PHb&PX+zS5>hc8oLG8Mf{a^(-o?j6P6lx9qw6DA7>m#0Pz?PsD}k*_hMc6!pHC zJZNn=a1(`o?t3XxVQIN{h!2{>SJIt$BAVC>8 zuACo(&^Z#;WE8GZ&JMLzAr=FhJyR_b;l-FA4F>rAJHILl>dx^zd<6h~@nlH99n@d! zhfls1oLx4@7&qvh5!Zqn2NMtos~CQG{mM z7`EmUM%aXwMQc;+Tt!??KUO4B;z2KC;3+_}d}#T+NJe7~G7Qyn&|_(@3K)?!cPyn; zX=jf`%L{}|315Lo2z#D;eas_0Ia`Y&SuxvY4%m2t5ppoEJv-yv?bXPxy-E%B5@T%% z-nN;^R)Gkd%uolMOrc7cRQ^DpB-xmx(BjF;Pp7GVNDBEh$=eAyQPoKXai1xYK9ir5 z=qC4cno=eyo@x*{-JJZ&7rSq}2hSB7WS6Fm5SlYi<|&U9$t*=tD<`(L`rXNY@u!p5 zb{-!1!iDS)=D(gCplW8y_kGwqIPkHefIQ)I8|yOaaprezGR=A%Q{4^bTTT{BN4wb$lSkACHPXu%}-jU%0=8PC55rxzNc}`vE6=9>6&l5O?*{qO)iiwu-I;!-R~x~=l`%R z%V!yv4BKtKUg~Sj{i^YS0&DVLq?PC^yv|ye*YzE@X4`GE%fA~sZkudbL21^-nk?LP zCuh4=dvCL;_dTchm+cmtLEG(04|Z)=I>~lB*>#uRcDq1v-fX*F<+`V(g8>ghcnzU! zgY7mPJ4v?NW;};*w=z_PU9)9%HOc+9?Y2$te%E&UOp`RoW{m6Q?tN^xw;J60+is!k z&<<;jw%ua)O4C8r+HR3Wn(Y?FonyNVS>XAk?e=J0cdJ@j>7pjvt=d~}i-phycE-Uy ztc+^!JR7N1!qcltQa?G<5`o!{Ao9T z&7tulEW1wR8RotIGxK=LDZ#G#U81a!3#5%x3e4S#d^L~9M_Q&&o@co1DnH$$->yM9 zS;^wBKi2GcMxgsW`cPZ(`pd4PPxmkhb`4^)e7})2K3{J3ukq20G}Y!86t&HifSQmZm3S&yWsQU5B8 z<(jYNDLe(m-+PUW7keL_^dm)Z?@@%fm?DC_MO`*W;hZfsHPfD=8Bixb!E+}EUHj#mrn z1=30X; z_AU>u@s;t?dQMRKy}2Q@PR3+fs`?mTuB~B>m9^?BvQKG8Y#gd;_t$0tt_460Zhsyr-M@+%cAKEA!koZ)q`^z32A6ezjGz zeH3$E|4a*n`H*b~#thpV)}!RJpWnUp#G)4$o{Xtu6GI;U^w%9{X0QACM_vBn#AgpJ zyrTc`?WdN1@k96%uWLEQi8_Gw{%iB-mnLoBGiuw<-|7jf{^x@^Hy(fI)dz0wKXm#1 zy|=tSKa}&-%y&+F_C)sbL#=Z+KA-;aH*;PZ&8^B!NPOYKh4)8>eZD+&e{Yc>Y@d39qRYFS7W$jLO+@vPf0bm>4@v;JQ3g zxM0M(DVd8lE}d}V*wiHzvtRl7`21fVA3GVJ&>l1yn^Ye+N9~Kgo<8ShUv`{nu+r?+ zx8IngB9nT_ouc(WXqTLN=H(xMx|%aGe$KkO+&%Awz4H2Z^Zg&0dB8b@$+Wid`fd7Y zIbWSVyW`fzZLhvKf60wm>wcaVSbCxP;;74`dwlc#u;G_S|9sx1XVcc0X_LF{jhVSC z*W}D?Jnmr_^Xj(3jF4C+q&^cub_SJR_yOhLw(ax}TQ|*Kce?IU=BbAUj{I(s|1-XV z%JAn_)?L~1(BXGVFX+y1da3tM3w0md8t_%$HiAyx^UHwbb-(IbcMg2{gbo_N3U zlc;-E1&!W{wUgUTJaNy3Jqx#r%F5JPTb(n+rlX<0qOJ=|S)w9f$ z3o^@=$tTp2UV#j-p3}yDuz15A(qqrjTk8fLx)HJXu^yj))*89_ouE-Sm(~5cW99Tb zEMOuQC#-+{o1b8|rL|}*PrVcLP|uHsULP_ev*8rSj&_me?m;cM{(3xOvwv?e{!}n) z{h>ow7A(FKIq5>{&fnku@bwGl`x5x|!gF&1-W@!Z?-Eg5luTHpp6iVls_NC{lIF9g z=9)hZIi0ohi}cg;c6;D$$f~jGh@D?N%dGw?F*a7-iw%uCmvn?HYdL@9{qGE}6L&X< zdMJLVKEV#C)%1U|=z`^uM`u6dG<`-aF@+7=9qqYr>GP zi%zIznc)~hkxl4 z-b=vFNu@{Ma1@E<_!?aQ!LI%XyV`GQfZspZ)vWE4H0vi;R?z5i^MDP((pN}-5j)ii zIBoT&WOqy5?wF`+=gE#4jn(F)P*(qsVplVZSFpQF#osp0>Bz^m;!%IrBk-F+4?+NO-_iJ~jH7 zrXY>#5Gxk!<>^VF@2HWhA7GVRBC<##K`N=? z(@aB}T>-!rmgd)2DuK5A1TXpmG*0HCb^p$9L% zR?$b<-K7lPf}r=~C3V2H7Ht8}tTr4#v=+j()|(=LX-l})ETPa&NdipmL9oTVMsT!) z!B*}B=-UQ@zRe=w+T9cIpn^ZNtPP`6tmf@Uk6t_M_f^)g-y{t~$$lq~tXn<5-EK(> zH03fXZ(KK%M$@ZAnWoo_mAeFpYbrx(`|SVG;>pL3MQmj+7Y|vGq*!Uv7`%Rr4xU05 zhkxH3vUpPbm}%`6U)gT)kD4Qml6q2*>hp0)4GL37K)lU_ zemibAZU2ZXB^gEYJUk!MoetIw3}HN+^ zfSH|Ss0k}nii0HkP;h??Q%J8^^odGO!){HtQ@Zlu=JhLv!Gz3`YYI@U)4lT?3 zPDa_S^+>y6MK#pqSDFVzr~Dp`%|35GpZd|#ePzbU#jMY)Vx`i>UW0o7Xznv(coxUj zGFBA?6N|=I3c{`Vm$YN4Ysvl`**}!poX7Ac@-)?{-7^9dv`8rv4sSx~?(hjjBmO zjQ1fbf)NX#1-mva5uM+BdE2*4!W?iz{$P)fsSgL|w>Q1BeSE@0ivY&GJ-$bkyRzhw zDh=l|UlsvCZXZ*nyHfth0nL#qmFew7qLgGv->0&5UW*ey7TkK=T9~i3wp?EeC8LNWdOh4JGep@?`O;lJqX0ot}1dcVtV7#1Z>DHNqP8d?Ih3rb~cFwcGjP z*+|d0ODdo0^=0MkA9cWr=d{e8_l<6s#!yt#Y>GP7H2W|`UDY6}#;xTwin1sqnnr^v zQOmTtO}|`*AKI*sdCXx}u=1EO+%3Y$9uL!NrFvyU&oRE}2NIJ;)nlO73Sr;aeQ5Ir z*5~A>hs5uSyI!cqBQiDy1d5d z&o_#~jrvW7rt_8x$p%ijz5B1K;>ogzD6_ru<#?6*`TLv*?IsKS%GCRfO0n#iR90OX z;k)LvcU+j0be~xe;4M<6B*`$0M{OTQT^Pk_s{fXS2!=+tr|KG7G95<3TOk#FERueT zvnis?%Cirak5_E8qFR_05-+38K)pt=Q#-o@;8> z)i@tSpQ8bMKlQl+wQrX1Xu>Yn@FSv}h}8s5UNS@mPK$&X&Jd1yT`xjBHxyQaIY$Xm zRo;YSUSSFV^Hds23@*exg>cMc`uosS!sD2mHNZ>{=uXTH(U?t2o}hkjaizIq2@S@D zgJ=wpNlA^fJVLr3O)eFMgpj_F)G#YZ@+mDO7mg%^^ny}Sqs>envaN@fN$1K`+ zw|01jdB(t6#z}(KnM8#Lf3l!=yotuYJG97f{K13h3cC<`zhEsVN#-&g$ zsSh)%lETXcEG8Z66nkk)mQpF==gp3ByNc>hLlqoFl^RMF`Lg4@N&NP?gPsdTS^_up z5%k$qcHU{)?kZK~z#zP|0J@g7ey?ojCA&pdikWeKjiWi)xikzHB}{|Chqn{z#L-SJ zVD=J^=jR7JRN?KUXbe%ACm1xFxSHuJJhf&l&$ythWbSLzxE;?_>3%mYJNotfi*D?a zAZE?yG#C6vCghlTSeTS^v@oH0;3~}nhhrP1Z0}c9UfKr?1uJS3>l3i*bs6l@pCZpK z)cno_gs#464XO!Khi50PkSdv<2XCbLo=nenZ$9fbOeUaNAwiY2Ug5ww{n@U5(@24CalZ`=QYRAwM?1f2Jhlai7!*uEQz6MM-XnB zpWU=iH;V>eH;LhRlcn;;a4Z&|cM;bZ9^TK%o|7vsS=SRMiw=s1OYY>O7Rm(Y+e*Td zdgS>IWrZVr4D+)?3m1;-QTqy7mZh3g$`9AMRkDSmkr>cWs39JM)!j$g6H11Zt{X4@^sgtZvl~{7nB9`Z5WA<$_mPGv+UVk~?#fGSa)i%ztXb+L zMM-jteYE|Wtj&+MbKbRDO)zougdw(JdBM6cK-w6dG+dTPXV7kde zL_=-T@`??8;%{!La!=fs2E(%5C59Qz7Pc3y!mWm#sFpQ2*yq?#^=i{6{;)|3BkQh^ zW8MDhpq>+(b+gm!**o-YlSMF+5WoXlftKVA}qF-}BtLKUt3n`jI!pmCR@{=9|8SAOk( zl-B;Q)7sz7IyumIKZJ(G7JhO#%hFisN5es-h<-5?(Bz3>xqV}54V1uKl$CuJJL@VAKB%)`m$@Na9A8;VrBHdPkhqD zG;{d(^4fr-)HuDH^mAqdY;74hT-crX>J_|&Tz8eC%x?hK|TfoJwFi4*zn|Y zaWx*reMY*p@~h$Nh5Txm|4Fy#z=I;~-ou)N({<#tC$YzAU05S2F*TYRyAof_4yPzyU_MbK=!LI>MNrs@s< zKK+;=)oDaAtY zmt*bc`;u??|Ht0Dz*SYH{p0(<@o+>u9F+x`J%rP@EryO(oVdIqcni3gaBKUouwbwpppUplv z{(tj+-v9gg{mzHY+RyiS*0Y}Vtjk_&?Y-AdOGKAzd}@_dzhU!mJ{0QsL)L+2BNTnN zzwl7-IZy4Z_>GSG=p6o9CrZO#?YZy~Mo%Ff?L)RU(LiI?b~gH?ej2ut91L^+Odt9x*4PHdtxg8BIgUTAgM@!SLhMX(h7}ZF!Y2 z_${Ae)@d0?_y`l8$hsCU>RLKUxGIPYILkCYNy5Q?WXw7?qMb#Wi=D$?&#@$IW1ZIP zjnsGEOu|PhX+--F6K2ETV(PS#BdF``V8Z*TJG2InaBUTJv?bJc*0SO6=QLJMolnb8mw>oP9Qhwp}I(^x-;M_tg*Jw3te(bC2B5x02Rn)O0pj zwXBh9_{q^}!G{+#E_!N_VVxhw5fv?195|%&!;ILf(|tDhrki9Fnoencz4_4ddC#?< z_0*o55jFP>zwN^@f4;+x#g9nshKXLO2Ct>4ju^f^7&=HBDGjqbo;R%u`$Nn7FMXC^ z#=uKlJnFbL%jj4hx~4ag@z`Z?V)<*87Y&GBiLOb7c&> zqe}ON_Cw2Gg6gcz-nwwV*DNx7@44*+E}wWr26dClttuN=Bh9BMpJq1Mq03S_UAJDN zYt<&Y@=d1;m_Koi?9w>j^_o=0%4!NLD_V~$YmTk37kYS%$o{$Vlde@+!uJ@>`eQg7 z3C4VI4%vqYUuxHD<}A|MO{}DzqLNy(g=Pi2Y*c_|f}!h7fPZx?<^?UZKC|~wu=Y<; z+yM;{)(5@b@-?V_ zhH4obbM|DXd7A5r(mX?C{nws!nsL*p`*aj7AYjp~z51gRX|fX$t&=K3*r@O!Mo;>b z!$Zz_&uMD7^;DW!RMr-nlio&ynBP;gK0>W?8=7wgt&z6nLrm}_ZZ@^)3ZGa+*+4UE zT?`Fz+H_P^PGzBnw2myuK}zC$h`y^N6(OtT{>KG6Q36<=r$n6?MDkFWevb8gh3!1n1hH=|!378w7E3F}bL4cngvjp3H? z81}KE@n#CAGZ4~`!gdP5|2@LR2r1t+2=7IBOjJ9RrWn0hbRE=lS#=wqO#3 z?|@U=Sr44%frRTrv2Po2K*Co1qc+R%aJ)&2gh*~TaNenA{%<+H z7C7mX^y_aC^Rp8;_3zAnDDAekOIc^o*|eG^(pvL_)PYxm2nHPhTwbsK z1f1&0oxmOS0d~F(oYI{QP@e9Gzjy+;h`3e|E&->$fH05@r;j6! zgz+$4Ko%YT(V`!*0H^gYR1Fr7^pkuVaI!NI2gPGJ1Rvq@)VEMNlKcWLf4@Th2`>Mr zLcW^I7c1oP2qLqmS|PuM%db_)@8R+{IeK1#i#EnQhk*4zY3h{&8@&uL=JiSeh}3k znm3cbC3!z6r*x+Sm-;=jpI*2ldD^#9E`JY~w=3jrz^VRi1|H1y(|2mua(P;d!>Plb zzk(qBe*-Sp|2>z#sE{87r;z+04_En7z{&n#;Bx&|;HbXBWZ+W2LG~1KJvN1&Ra_6g z3+$rjPh5VJLjGMY->8uP8<#(#kpF?pf31-Bh4Ey64{(Su|4>IX4j`4^NQ~Pl-&9@* zgjC>E-=cv_exrQN15WjADsZX3QN#tnO~5mNQ-4W%h9KfSeL1Wx&l z1uoC;d@es3xa1$Q^Ksym?rh-lda@BX$t?mdwMVkyb>P&GSL2-eb;)m^bNxGj%k^L2 z`kR5v_4}B_bWZ`7%9r$y0Zx9tigQF|`pM7t0w+KCW1(HHe?D-sKLWU1e+6)ozegdz z5je?bDdhjm<)2Ww%eee_;PU+bp3C2>kbjlSXDj4C0&YgSzXm=YA(f*)?Ee|~ZJ>7oAI)*9 zZ^0pAK0gI6^`DgANx-RIeg|B#ll0624ppoY%KcCZocwSrDyJk*_3$^q$qy5N%k%Xz zaFUw|TwV|Nas3N`%k{T&{i_uEuW-prcN3S71TN3-9^h1;rU94x`518W=K|pJ{Qk)GuTtnA6e`;P2ZjDSfYW&5 z&%mYYBbDQ1;H3YsLjNPcsl3i9^e+WY{^?cd-@x&a=!B$pP4#CNaLP|SaMDNhjqs0v zQ-76#e{h}H-XU-tIMu6P0hh|1`houhPVozX%l+wz%1ZWB0+;(U7&whDUj&Xnrl0aV z7C71S9{?qL2u}eHvxI%X9rF(0b2xrff#(9JapT{CJI0NWF9A;e{SLTeJPdpla7wQm zxZM61fRp`0VXWN#ce#87aJl?vTs}o1{{xrLQpn>GZl-^!LjHE(Fhy7oT<(7}aPt2~ z;Bx=p&E;QH$Y*f*Hx=>=fm42I-)g!2PXed>wgZ>v_XV!MTcLj&*H1SUTA8`FfOg`lH{DaGf1DD(XGnY?N$PW(_%l8rBUfdq)Z$p4n z`OhG+V8W# zN&gXr{uh9g{^JV$Z*uwX6!QDHe5XSG3ofrmW7Ny+InCvbz~%N|1y1erHsCbhmC9?- z9b!Km2VC9{j|NWi8NjKZkn)=eoaC~A%l%Leocy~CxYXa0e|7^$kqK*o!vs+e488~) zRaDpoocK&X@SDbn^N7Czr~1Wk)blvtl%H$BrE;YDKaJzQ=$st$N2EI+IN3Q0xZKVs zI6hH<|DNMB75Hl$w<+)sIsT*qZwHP);W^-ACHs*tZx9new*Zgf_yE{H3pm;NlS0p9 z9QQ%zEVsWJcr4^c0VjRrAJX#}I(TKkqc$7@ft>L0Qdld5Vz$ss! z07ua|(#_%WR}}J(14j~qFDehklkD8a0JH`g?t{zFDUSpz>%~t0F4EwVm(AT?f`)ymJkITLlOsm1US{d`+!T= zLFxwvM~LlVp&a*tApc2gqZCqomwpmH9)l!Ab^Ij!|H+Fkap#|#FlnKFNcu^BO94*h zDg7jTHE`;Oq@RQz0#5B!`bqeIwfuHm4F4zC`TzVN){GnV!~c}>{lCr5|0((X@2YSA zF8@$JdL!4n8_nqxrp2{r|3Vzfn8?yVAW;|JABH#|EuNQmCKE$>rRima&(8cW6-WPZZ}~bIG9)Rd6@tGZV={)o*N4H0?W)yPEE$A zAIq|f%EYfVCKuoa zzAqzl)|6C|WSnVJ=A>obZ=IDn-8yZG2+f|7J|%h1j9DZ%W!9AG$x~*l$wov*GYx9u z5s@(}+9M(-^b;eN@uX}_pFMq1S^k22@ms*+_g$R=EGsheR5KG18P`v8@r>u1{fNi} z_c5Z(_f56-_kmft!D`B*BKuJ;7NWwOsD3;grRw3Remoo%>-t^N2v^dTidclNo6cGE zSYA=)^x0@J^Gou|^6oBJl#^YMgin(`#_D5KTxMntQS?32`6cW;Jg|_v7v8D3?#NMl6#)>+A}b z<`rfa+ZL7NvCKw`g`p^-Xt5Yn8$t90neXsr(D{!s*GW#1`z$6iF9x0~b-GS9PhuNU zPfV=rQu~p01MHim{rWsw)#uUu_&i3{=P~{GJVv#K$MjRfV?@_VIhsB@!}($4ezOxJ zHUdRS#q{I67}0sk7@}KL-5n!3M-gL!=oZx&6CxkOHW${ivJ!l19N%}&&nd|J6~1?# z!M`FtJFjexEx$A+kG@tuqo`oH_+{zzMXKKcj+nm)FTj+SF-J^EoAW@%6m;p+XHO}g zpU1vi?DP=ubSs*$L)=}{o1j`m6Z$El3Cbdx&b~11Ok1UaPf#tL3H_AL1l7`+&`;@1 zP%WLfpc z@mOp^-w&BbWTUd?=PW79D^+1GUXoX`ob`-xW|bjJoT@|P`f+GnG&K-59&?=BomZ4s zl0To?2s-IpsRhl(H`viiBoYk@UwAJgl6@!~{>hf{cw=K8Q@A}&EDY5Gj#I6uas5=( zI90dD_2c%q1m?kbH4nx|io7Tl@5ZZMjN<#rP5cB=TdbNk(Qao|p0=bc8{N~tSfk^` z3@Th3-_PYELG|*H(9h)~L994V6X|pAs0R7j1^Fwo>2vP=Hi!gOe)#-n6`z5E-WfKTRMTm@4ls3CqX$r(iMJS)SP^1|t zv-`|nBsuVT>a%9Jo8~xW`kM!_>!iB*5s{IKqF}ZH7K@@!&J@*3l2&x_60BOKA|qp^ zJcedYoj!Yx6*I0(ckW;gpGp(9zFCaOv}Kp7j2EQRlTGxHBSl{&*(kPUw<%z>pIu;G zQig#`8K0cd{$A=yD6Yahi72r;xJ?3?m_jf2=H(_~$h@!wU3;#oemkvKP*bf*>6q!uCJt={zaXz9 zVo7OUu4ddrO3kMHqWrRXtg9(3T{t_hD0lXf;=Gb57Mb7(%sEkZa=IWdyEIQ8Mb0E) zR836Sm{{(tys{-FMQlW%mV9nrb^)sMJk8j?rnydr=VfL_$NURY;#@etXes8+PQ$XD zCSAuOm+7bInbPG&=!vO0uw08|d45@@*hj-(rHhJi4Mb19)SR1NTAW=r-(&M$L1a(+Q}(ZY!AlKE7l)Jjyn`xqIM;ETjh?rkqE|%Gn`DOE*MNvwvY&J@=XrZInXvK(0V6eWVFfTGP!W>~P zvtdTKG;SREGjCk}qS81*7cN?~umGzo^T+3B*cKJ#jh}7HMt?tEocvD9F2ZJxg{bx8 zrxfPo<>rDjd(o1T`FZ1&eMm&1N}Xl>ir79}I+jeQ{bJAJ0AC6)`jpUy?a1gUTN z7dnmq4}FWwF!jzw#Ue#Rmh~poxrq6e^)71NOQxf!<^78jRdz5=4)0-ZxQlUWaO#%& zn0`8${(2cTmDJ71eCpEAsJPNiH={1;=w(#c*Xd+bV)Wm~h=nHWWJJKx%ZPb&>1N!f zA=yoXpLvX3sB&XDH%^rs z&$$Vz+(98MAY5E`?U25pRjf z?(4|ziSbrQcg3!ETa5Fi3M<|h<2iRzC2(iVjcfWXvS@S;Y7UL=w-}a0am}F1{j=-jE=FoMic*Z}*QGI1kE4tw z`AXeR$zzIG6C_`$#+neB*>{D%-`i;z3(*)}Wqpi>IMV$z(PwHm)LgykxTAI*Pfl=C zb`$z7y9s^DPQ0;py~NxU+k}3LZGxL(o6v8uO>k3evHccXtW?nzg&ixoNwu(Jqg|ap zeYW$?#C2Q}EA>0d1SMCgC)no#PPg2ymy{bn#`f#SSXynTiYXs(%kI3XaoMdm-r>f< z-+c$J5pixD9oMg;FX!Df2f*Ox`U`> zu&FQ@ed@V%D^9BD4tGinH+39$5_yLIg&T=trrq9LQeWdz_&9%Qc8R-O_33#f}+W^|KCROIz_NtbVTDtLeB)||&=HyhpQ;KQKn>Tup~ zbf?K()ry*Mot(;UI=a&>^|XCTB(6YIE~}mH?>ll?vCXMATb{nljYpMrlY;!xGWE47 zaTU?!HYK}5fSxFu7Qv(!C3rZF7Lf|_1oc}Q!nnM`{IYRa(GtdCotz$@8Asa2(L6e@ zR2Wy5U9vE*Y+QCuzK~r!zjWNfq9ww(8Kq3QMUm9MM9#uP?hj#`trQ+k7&L0(}^KqKQxRK^&y_eT1ZU4?@!W8seEC_bB4+0=5nD zh^BZ%Zvo#3ItTn6pf`h0H1UbXei3im@xsR`ozPSddIR`G6QAg(aZq||5K?+iK>i8v zyC6?{P?STSXp$$ogv%Fj`3E7t9sCq8p(zX4{g5Y`)Ay0Nc z2fg0_I|X?uA4H!3pX|0nAMK5E9DFGsL?6VF1U-$AtK9|p{}7sX1KSBXqA6XXx8b1t z*7NW=gk(o8Lb788;?F@kZAixs4EqATOfAN5Dln;|uXnGjfEXYgwB03HHEW|fJ-*nK}x9DY}NgvS`@asUQfu9aK5qzSFPjozv z1f*kz+#%$%cDv9N11ubJM3WrRp(G2r050#x<#$5fADB@lPjt^fQN9Zy`KyD6X9kMt zoI<>_z}g2o(;@m44$A-M2r2(>zq6 z=cj_d0(6OtPjnFu%9jlxn0=(FH&0R0^J z*Fb*_KGDP{`YZ73IKKz<=in1fe4>wmznSwrklqpSi6%bLhrq7~eFXZ^R)hoK6HR=g zo59}-`XKlxLGJ~hXyOyS2mI}z_ke#M^ltEpCO*+Sage{aAtZml2>CXY`xsp3wg9Vx zJkcai^ak)BhQId0UzjBAkt|%S-Inj(Lf8yahWx2X@rUX$R4VaNGs?{Rk-^@9=OJ54R$u zd~HHV`Kp9Is!zCvHLU@*68fb2Mf3{rsXh+%L3;s>>!qW95?zdg^wB*^!GWDr1j|=A4?}r) zGeWY%2O-&UNhjtD;xI;5v_=8Nd_;8VUZmTI~J`YiZFlO05Vjf3=^KuG$IKt2O} z?EBSp4A>#a6HW3&@8@#6AXkt4evSOU1MD@(5lwPLZvmh7!hR8Yc7T2ne4>d@bR7;# z_i2Qb?n=nlB0h}+Rs&lBd7??4=o0YL5dSFjEd^Z!KGDP{+J=MlJ%W(*r9+;|V+{1o z0+tGSseFh|0-wsG3;ON>eJA)*`4Bx3d@2u&)0;9t$AB-D57A*b*!Te83*@69 z?+vVb0LItcKBBu&*QuVK8GwEg?d$kXTu*?tLyl<52hk^SkiIs^T^Wk{1%00bI}ACZ zNsj1)T<$H%Z9qE5A-5OUF31s0aztZa(zpFVKM4Lipm%^zH1Ubvieoa;D}fxfbH7)G zrgC6KkdxXy(T{>pc3QxH0`vm#CA*2nb>Z!G;130VDd>m6Cz{eBdJOo~-!1^3_GrBg ze5wB>Isgax$AFOX-;F)HC_Jwf-cE$QsRp5`6WCd;@G{Y)m*_L#$AeA*zXNnT_(T(* z=#x08UK~eA`VK+97X0@ie-zjO$P-QSL^p#U13DM{BcS(!Pc-p~-i3qg+=-CNe;dN7 z2sa_#UgU4YYeLhDz@9@qqA4EH>v2%}YanNWzNex8X<*nt_hq68!xIR}j)R_xjV0>?ejXMh})-frkjE3ASab4(H=M`-7XI? z-P>UQH4pT^9?o=$K96GxK!4fOlq6HR=g z-vPf3`SBPcG#v*07WhOHpXf#$R1da5j_e%Th;jnyH3I%cLIxr9ML34 zv7;j{utkIig7q(HY?HhMjX@_rsvm!6%ydM5o}O^_@h>QGN;_ zX90%&=pFeZI-KjVgKq{MCeuT-3CI1=V}P6=((i`de!#pTM>M5Jv=00=n75ap9~uhU z1AL;1PjnAX$lq5Gl0VO5t9~Qmk3jx9ft?kwj>Gj4{WT8iFHUj!Hpo|lzXS5013LnF zqVa1W`Vjb9(Ba@82Ymp1qVa1Wnp{Ka??g!H*FxS0{1V7N2W&0miN>#i=+)rsK^KF+ z0dyt!MB~>$^h&Y^N;~1Vr$MhEdngg`i7vxI_7@?f^s-1E@$sFHrUk%I7ajH!jXKHf z-;DHfLC*nSvY+S-9Hb`&asu@1f*kr4!2&s=@oOMD5eLadL9Tl!`T@wr0*ing(fBnG z9g5?A$N^&IR)GG?AD97hQn?ZB4L;R#eCMR;X3#qDrFu`a30<0f7fztJ9M>5tUvy>K z4ulqbE&=7r=ypz@;55pU@lkG!-^}SfoNnawc23uGx{lMeoL<9eJEzMzUCe14r?WUc zm(v-XPUEzN)A5`(b2^OECQkcv+Q?}=rxCFHkYC|LZ2&@)l@H0sA@t)R#Unn&Bfb`4 z3_=6~hAKp|a1BBX$+guywDa%@9+vZv>KVxu^RR%2HXi2kFpGz%cT9dR4^ht;ox#I& z9;Wdyg@+a%QvIUz;&}+$8ExiaI1j^k7|KHv56LeSpZr3h9}medM3W;Z)bmiwLj(*b zeMrm4gfJ2z=|kOSejbmI^hF~ieXzxc^i4oW`o=Xg zWq2sZsoy1e>RU;Vk>frb7dYMxd&pl`5R&|Pgd~5K<7YU2g5$?I-p26*2%$>bjF95( zMM(PgaC|q%8#%s{ctp?M}K4_c34H1)9)aU|lf;z-7EFAhq78jk5WX5b*ZX5x4s@eCSD1#4I6bm@FA z&VR&O5uH>0cnlTK03KcEFTof(r)&Ez!m(~lANnD=Bj(NZg9=H~vBG8&1>3Iuy6Fk)JO(PJ3uCr~IOTw%>#~8rh8VbU(}+ zIG%-bTEifG4bK0}W&9v-q;qWQ+ktbMqZ)<^f(hxyLEaZM<}5-m!dnrZh0IK(OXnwW zZh>#<{1nb<+)U?fIRA>vpTYS;j<@67%+HVG9BVpEe;MM?yy@0K&B9KU(P4g0<82zt z-Ksex(DzL+c4X&`IB$f1G=c^HQLm5|`HOxlW#<_8I`G$!t|WskbRFj>0ZRBUvU7~j z9Jrq>?z6J<;WC+L;S)*EkFZZV$2`VyK1_y>m7VXB>G_My{*5vm>vIl0FQOhu`suqk z()pb-8@8fMCH#*vyj7+rU6$5-+4=J_o#$k}x?QGI>_05vvazKjtzojXsPC3+pmr~v zzb-ppD)U2H9;H%(Jq%)IKGg=Je9}UvMIw{|$MN&IPxR z5(?sddFS&jeV#1qBjJ1iQ&4%ruipo8B|EP3B(5S!#{;)6>Cv_yqz~H_I9^^8obL)b zo=(rCSG*J&rN?+U?0iUw_R$fa@DbBuk3&jUOV4?*hlZUSq+n+`w=bj-ub=l`!M?9( zSw3C`o&9L~qc|_YTcV|SDNn(e<$z`RrI+{mFC*%nKj=k{R}H_z!@ zFPi*07cQ&zv~?fL`aC{(y@b@CU=nWR1r}bj#Fs_?h4iGlA-H{WgsK8wki(8?^KFl1 zF38R=P_3=vJB}nQzEbY`o`@6ge+w~nIobAX5K!IR%>{S9jlta^d%ut)ju#9$EqiZ| zBkHfIa;E5C*_->a*W}%a$Y1Uk6z`-swsR9)UshDqDcM7Q?2V7>6|n5lCt0D%Uxk&y z&Ynkn3ty2oo?yoV<&Mm;caN3XaHtRp_>)S7xdr(}h~?5>%*vy;t*>Xi)a;y(hDloU z_$$^Cg^O~R;PEDv?wl&pjqVP>;@s$_35dk{HrZpUFq1vU_b)v(<`fpMW%LM|+NLs2 zx$ADYq9{07rAem!H#l2<@#rIR{YTj(dz@-ipLmniFM1b^T-^V5rhPgh*Z19=Wz8Su zmtF4^5B*bG&W>y0lI)V)>s2{)z~T$qu0Lgp>+UEP1!ga!)$@>*9j((j-hjv-}nibJAg+arX}paRFM5LGifJA zP9P8;gLl$&Mr-C2pT_Q2@Q~6S1Zo941@x1>s?F&X>l`aP75^b(7|!UMk(kyA7A#<4 zs^RkEI!dJ%xW#8@og%dEK-ufyI_%Iv_TWcLB<#m^NUw1B$qVi=2)U5F1Re4p*(CiW zJH(f`DQ~WMsf7+oa4zO(6mJdeAiJPaX@}!QX{C;Oo)@~ePdc`{&x_;j24%Tyg$_*H zg#zf1|5WlKz01(YAAg39+Y$N6>+4`IFi<+mytG5d8Q|M_UK)`X6A8+G+^6(_K0}o{ z4!~%t59?4l<@U=|AYHyi0tc1;pzrSDezLHED!A+?*T?N(KBWh-m3H`GZcAl(oZHce zMKffNezLO7$uFC~C^t{UVOM(k{nI!>g3!^71>qCWLAum_$O|7liCm?QwitGgNT@?w zbFYJSQ2B+}oQ5tE%Dmi;woX312px)_BQK-D5D9YHVCH*&ob5rr0}$%rP`ba2B`~%= zh=A50*+F(;DU0zC+|aM%P0!b-UD5uwvQd|6Obtx!z1-DnPYpxZ**hTB()oz7xl<4< zotHcidX%TENYU7gwvW#VSvJVD_v%vjG+8=Rm{fU+)@Df!27bJEv8^~ukF!sD!x-{W zZVsT8tK|ken3YEhWZ!u4d5iF6h6oQJ35|(l-WcqAuz=ZAT zLlBp)QKW`+Q6IAw=c^E6In?pZ2kO7taVUQjm+IDR@ZRTq8^VupoB@ve*i7dsod24i zx8t02lN+fosRVuu2hpVK5KeHP+y$eyL44{rKEv@nj!qoakfS(c$D24OI|G2zZw?RX z*#eRw9o&&~EKU!E&kCO&e!t{m=3x~!!=V8BziPgPni$K&PV^m=c2aWlR}+vaYMD7c z=Fs0ix9z3NUpzVQv)wa(zWn`jsS|$dU$d;%Yk64B z;(D*8hiYPLYnE;IT4t&#G1bJHYRVdG%5ZM0TE50>d3{Z+*{j@EwN&r5!s68&u)iYk zn}z_PGT>Nt(0*&ciH3la_MrX2fhQUU9}EsS0j|beQ=C<^Jj~0URZ~(|v)txcURzV* zUsF~Got~xk8mKA}jzBm&=&;6gGC1&5!(iw+3Z!B1`G$al6+vHFgHE;w9jgd9s|mz| z)B0uQWX5uR&C;-%SbNQ~G_Pg#H6^t*v0+|I(`uFqXRSfsH3ZmO0>5e)e8d{Gzaj8& z!{GMQfyY_`&o%^{X&8LCBJfy4;K}B|uUZ06+5-;<2OQCuPMr=sX$m~m67UUTX@XAH z2kx&3YIE9OT(ivPxnz6IQhQBoeNC~^3#l)6T29fM1NXPUA#S5rEl;Z{EoP2wBZHUK zsrz$3S&m%n*95i0A*TcS7*pr9LSM6ZF0${nyxeOAl^qJPCe~Q9!t7NV=CvH6Wi$c)^eW!`9DS-{OHD&%@c4VZs2J$OV7GX8T^))L{I(1%IgAwIq zOVEY-!TT!)e{K)>MiX=*Yw)Rt0C)^1D2VSG0uM9{K6yIuP(uKa^DP1G*#==t&?(e} zmH;?h&4=4j6KZ1XYL=N~!yJdvgMXcUg?a>SZh8*4m3Rn)injg~NvEY0@8 zyXSWkAT(=Cnqe855s`+ACg08s!#^y(=WBfnO}-a1d@ooG|FjqiErxShzUOe>ru)(8 z+iCGF%rbPe>Ap7_F4+zCglf-8N0Ji+ZNk>p#OkW}#^i+En#tA46C0C9u1k(@1lKdm zaJt#>V}=2r{rsod_s2F}hspP!X2UtNFLZt*_(Ihgp$@{Wi5omEyOSsGNgfG3n}H;c zJdvER&U5nKs>Izblec;%w0TYxiUs3^4g<{SG#b9oFcb>D7i$d{EWZCV`4(mv&es~g z7uu>4kHe~}Nqdt=)>S1|Cr{dtJhHiU($=a;ZOI9Tl1FavoU}E0((Z~$d#fhx)_@yd z=V{r~I%&6c;-0F6BZ%dhxZ66Z+H-Qf)Be+ji*35^GJL-mdNj(8?Ewv5=5oB)sE1O;(CdD5EXk-J+b z)g~tZIZ>6++!`RHOx{B^Aps6o^WjWi)PzE_@5L;ZVzc2QDw4y8jVNrvG|@vgJQL)0(C5YH?;*=J8_TaMa^z6}3cJ(__&u7!4Qti+&_| z;^wMJ{H3q;LE51_u(`lH=F4PDJ((wNi`YO}HZdcvV6j zYk)}WELv!}U_^;@qC%o$F&jEEe47(Cz=o>Ct*!C$dW%?SjK`^T5{1VQrOnV)>{Vzq z6g2A2n0-5%b&sJ+!(%u>L7$j~LdRygi)K_cMHjkb*WORB@Z}fq(_||=eDR_nB1Ta6)`L&f+hN6+YwcFx!yY#iaEs~Tc8g;wjQ4YikS zikY&(e0ATj(EYul$oMre!J3)D2e|&U0V%!JYX?=>Euq3Ux8<)5%kF$~tH+inty|Ci zvCVGDO)Fh5YG@SJU%LC~UBLq?EJpphgR70fM<JH@|t+;Cm>y;YiXvxNCN zZROqX9rte=AF1<8*VGI*t_dCzZMPikHW^FS38sJgYb-}*8K0|O@a*O(CZm1@Hw;-D zKht+eaD~N`AE=-0G4pO=ZPw_vHw{{kie1>1ap3N8RZFJU7Y*Mz)Z^D)9!Vmx*OaZO{#fG1n4Y)ECv>PsV3_3$s1`@l3i-zDk_GtSpD=Tik zM{|p#eWjI`MTD`M$M$HtjomUqT9pSgC6l5iEC`P2m1T? z+Sc($JSQJYp4i;FHWu0BS+2^wvTB*pYl(kNroY!xea-SZjK{r7>%1@+FNv>Nk%eKJ zS1d-La0rHJrkYF)05O8I*W6?y&kTCWK4`a#XAI|!h9Awo=sPjiC@>p-M9+ueMzLXE zv*DbDoJOOY#;<+g2U~+*amCFi;GENe2dseyPv3G9qeV^N+2C8-X>b?tO-0ZdHV$2h zfpbOBVT?>Mw9g*!le18=U`B`G>w3dKItKj%{TY1ju1r^9N`X=5P1&xN|3fS$bj-~< z=Xu8IY z^eq^o?ym?~DVD4z=>C}V&4#WvLs1*`->4xNKAf(BQzWI5%HGz z^$ida1k(vkQ|f44a$0B$n~Pc+J-vVTTjQMI;ppYjxGMvVPtM6TuSvlRWVBYKomB7t zH+_ZQ`U=FwpXn7#iUmtvk5u^l4o@(7<&Lc#?i2cqR>v(o^zdyl{^=nD4eY8>8JO{Y zeai^_9nY`_7zK=v!wQbthg}LDPRfyDh;May^-96(Gp{j;FgvieH?7dTJ!PmrPu=9d zPlftZ>H@NyH|K+v=Al!Ir7T}M6jGHPx;~4tOu1`Wze?9SHMB(|XaoVdi@JT# z;MMEXuttE~!KDXg-0bhuBXjAt&+P{7^J(FLI&!1 zj@o|xK)Ja&WoUrppPPqy=AQM;N`ro8;i3iST8zV-g>uiUgRfcYp31clpR&-I+R&0Q zbZWhnh4c&8sw!?$NH__l!nK##4PMyk!$hZKP}Xg zrHDMP*caJe{cC3yLaQory*;Lfwu%ClS=xbHYlnFRMg1+iR`;6tP$1bNXw13SJ`gGg zm{{pC$R7OJB;C+)lr*bl`0ukZDQZm-9=>B3;aP`5pVd4&$ikK`SRz95ZGZGRP%qdk zh>xFL@Qgsw5L&`FDS+|4$Ly@JVa5u)!)cOj|c1K+eN_-M>bnmiGsM8-R#i$uqare%eM!M z8b@rku6Ae~Aqt*o2`m!@8@wJDbdESCe)@w~y_uhCblDbuI>dWR20#5&S7agm6|bKD zpzGzF|9q+GpNCJBEG*CnZ-wi>Jh}SS@dw_r<@}t`_>1;L(9D9-o^P%9cxYv!<2C51fx6wp z!bgnoZwt}y)*kaaIy9{+{a*dis%LD0=Y)_PU&WtvaJu^*P(4Cl*`ko=zR(bIi6X`RLK$ zH)D)#_rAP)(zJcs&Yitua{B9^EXn`#)mQ&i7u8%hSpV6l_V}#y)acOTpPx9nW_9w> z!K41xb>*djbzx5xzavaJdTv9+jCVf?Iac_?sA;E-zN;oq`tEdn)v&2|eZ1ZBOzFgz zKKks!8*4`AB|Px?#mzz6zWCPf_;0-Z68>ZMJBi=l`J1`3o_jX$mu-LlCT{S|HP4O; zF(k(SKKFqAH?>!mEdO=Is;6#x;J1OnkqMKnQ$`QIW8j403uf zx9MewXAnl~?Ewc)2Q2W@OkR^5U){PciLKt0)-CoC*AuWb5$%(N^^-s>*DNp(U}9Ax z*@$5>CL>46*Oe7}J+Ak{I#O}5*NS4#rR6jl7=C03Eg+mW`xcpfarN!UFhm;<1b&5q zOK{-+?4Skar)b3hGaAgZFfFCkj}E`3SzeFZyy9#a=Xu51>5^QWg+(o|rB?<(?J|2! zCYG4|*{WS#ML13C+G%uk-t3u!3+kDMfFtbxsq6qOpdF|PJe;lj9CKuT*Dn?6*-IbG$droR>_4zQrrg$#apsLDjG|DW)VqksE@T0SRF9!ily$#4h;aA&X}0J3%62i_QX)hvTO7<7ht zmDE){{0|H}Fmc9$iFs7ZF>BBn3<^&Negy;4hEHm&n!LMeWOZx&I!szy6Zf8SgykkdcphO%P?{-ujnD9bB~fXnQ5EZ+dFIoUdSh5_Vq{d()3w2W zx?)-AdGE;cEoYV&wlBWt**z`8G{WqZdrkM_`yTkV74Dz$FJJU|R!aUL)U@o9$MQ-F z7cCuF5*KbNi5oa@{CHC#15Nm(go)k1>Z3vSwABo@uUY=mym84=(sF1j-TE?3#qEsi zaIsxHeUeMOLl!RGjFfJisqe-lPw4LKk{n7Zc~L=us7lUFrtPpzcvKP33Y6vNl`g|4 zeo8V+^H*R8rXqYSWl13;GNvY*(({()67AWlNU@X0CyyO#nv-O;3ZwM;pmnA-$`m|anE@64<;<0V4zp5P#FOg5I;y;jUEuEXM0D=p5nwN`!;a8O*G z##%QfNUVJcpJMEXTNr}ZkwmOkZbqZW8YGrIXv#xi9lc6{1b$_lMdOSiCN$+|H53T;dST)Y`PfxWxcRKPw)<;5q zPGeqOWz>nN4D0ZM;o;MK-tu`ML-&wwTv*k(7_zvALt<}XhwFkON zEss9*D)}bVsQbG%d!4_3n!eIHQ{N&vB~e>FtU59$%M`5Foy+pE>Z$`H!>Wy1&$*2? zSqJKkNk*R{>#ge~hdypxs$WCpLHDE{THOqrtLkA)g&8(y*kH3I7I&}2U$#knP6c*( zSAXvrY_9S7{9bEmfe|;zX@L09>fkWyljxUia+TFzN7e^%B)yOgos^RmiY)A_H?%}t zsxa51paLV!>y6r~%&eOFTi8HyG18zq7G*GoRF7%(xw7SiJ*shV{2O1|V-C_yZT#|} z_%0ZS?{jzD0h;oP{R3FM6i#O#q#uR!ZcP^Ww;`mx1nAz|(+KZHIDwqReAp5njAq_Y^k3blu&u~4)MZhUO z-fLujVmJ)>7&zH?4-Uy5E#w1m+yZPq4k=xF0Wcak=`P11<%{GqaF9LE;*jjo!yejO zhVVulWS3;m+rUZx5gc;;w2uzOKaE4K|9dXqt&rCa6y=9#T;+p-Q@PXqdPlj#o@n6Y zm&w4T{F0s1xcvRVrFupAtpQH_bHF7(kUg|d7B$8m;8J}idy0XR-;8K`l037MzC#2Tpbjg-;yi3;AB)RL?@? zI56oa^_3Koob;3MT;P;%=_ldafKz>xeiD8bc#H%hl<*ssUkBU&JJO|h6~k2Q-^|;m z#FFy$9dPoy^t&ETd^JD2OV^#>+}ZQ*l6R-aU4EybJ*ef&ogR1g->4pU_6$ZHr+!iT zN#*kI!ri6o4nGEa)ao(@vu^X3fYDtA=&XoLOScRbcq07E7%U zEEY!}IKk;S#$!!ZSqmf?^_{Mr_POkH&GxCD@BRb3EE@a3uJRF8*+)FZm7qoR@~q2u zGUcDi?DN50*RSP@>9{-?+b03pi+%FNDrYL{F9*7Q098z=RD5kmjYU;K@d;Bgj>{vt zGUH?~DT<3h>ic^CJ3dv)3{iZlR5XsBHSSYFvM(TtMI`oeE@k8*)A!S*E-(IwNx2r1 zOZpuCriYb(pArqVOhD#B$T6zzV3+V^Pvtt!r-E=L!^j4pWBc|8S3JF zKZnBQqm=R-k1i0)@?RKgh=Oj%24XLyaB)9hEa_7fr6I_5(xE=hO=eU+$Krkv!gVMH z5snJy{HpzZIsU7^ z#c>VuFsvIEUf|&ggjgplJcQT!8JZ3(1^S4_uYu@999Xw1#2Vb&VZbjTT{AGOLB32h zehoxp4eD)r9}{~QHAR390-tF78i=MfIjn;f(%L75p$M^5!uG_&dI{UB4eJGLuQm!v zj`&#iq4gBDM;q3$Fe7G1cUKFlAru|%n@=D3~XR1Sm}BZM2Y1qdmgjq`Ikp2hKp zIX;);b2y&C@pO)-aXf|NVF)Qdp$I7-Mue1}4?;>0hry`1vJ-w7yL;^q!W6pVPZqe@A@6>3yv+ zI1E_ip!YLJ(zyZqXT=~b$oqn(3_O6~RydH}7mMcS^gdZVm+?bLdJ(W6h0?jd?A$7o z*(}3LWq1hekm3%O;lGy2zb!i_e@XI+T_BwM1NFHMD_GaLJh|ONfnCER#Fqud;lDT) z;IGrm#>E^_ADwfi7}w22Oxk=RG}C>*@04+DnBo3P<`fpM6YkauoN^AOZbik5ur!=e z4tDzAg@gH0O01ttmm~rs_^?X33x}vlDi3kj7RBZ)ob0o!N}rV~MU|3eiEk_-pP0LD z#lXxkxlWqYBud4Jm>P@C#9a4>5Vg8a6V;=t%vn{pdBDAj$ng`ROwQl+_HBrbi;s?F z;#uC)XWus~eQfH~)G3+S=D580+??!~xOi;Zupl-sHyWE%%s0nJN6t@(iJairu|c_C z18#Q;DfG`Iwq@+WuKF{ziT9QL5Tbu&2i@>G$Vt2IaX{%h`Wi_Hp&Yy3`}kzT9}yu07iIa6Y?6M^v7nT_H7p|H$V}qm z84nCnOwe)QRxvL}u8Q}eoD$>@v1a0Xjr0*n&~v8Dr3)GVRb$|k3tyZuNr)J_+QD>` zy4&;NEaEmJS{eo*6z}{sw)d+5wRGuYKW+ybPL|{?C{^ZVdoc0>N&W4jj)HD>t)#dz z9XX|?gz%qIhd;_iyo!oCBssXq@uRZEwJ&t-VFPDDze5i*GBMsK>=<7?#9F$AHdp05uRDW9NK{5CFN&847 zbspDX2M5jal!3P1%a_>R3_oDkhNRABmt7ma#eNMQVPii_>f9k{LTJwiX+MXPEY26$ zg(9i5mc_Aly%SQNLiP{))4mdW zdTB3+H?bFlxVMD;%|+05kIb_F=(XM|m^|-@-={Iz-xK*`Wc=rQz2Y0M**h!)?QCa? zq)wxZyN21g3i+~jT`4B(tzEGW8^wJomiFqKMyL9dyv$&-=}3`w&qzc5#9c0u_mStvof8HRfGtn3_~c2Fn$RnR&1$oDCApwu zn5Ns|Uu#!5=d@iB>Mf}=5oaV)@CY0AnYC+Zv9nyrrv?^p5O(}Pp0mU}hYXdu>cWS$d4=Egsi^&YkG1PWc4ZJ^Yb>c^9r?QFuGF#ZLTDsB zwUgcJ`3p zgu(Bf?ZEyYFTF4MuA;FDyPx!4-rPf88S2n77ub5H<##=m;B;qDzRA7}a8^OHM_34a z^-YG;SHvl2ahAX~Yu6DL$J*Id;$OV5i&_bM64!+|)b3 z4`KXUd+tcpff~sue^^fC=!f!(V)DYKaj9ygoae;7f@FMD$J>#zwf<#C-YDU zvl1;d5-~L8Da#RqdgAfSrtn|v7c=bMuU5fg;p)e0g{z;eB^yofTydn4`eDtmR}g3Y zm{eWuK%4fN-pfOOse410>Qje40=06Bc}9oeEtc;9n@^o!vrGxtr>pC|+|xa%F5}7= zLDO;Z3YBH((M0G3#)WvQ}=X|&K4;t@XQ@;MpXwq&JYQ1;p>W007^6y4o!an&_ zx0$5=#$-S5rt^&}8k}%X~m3?}^kt?4~phfV;n2tUK>_>uarDx0%T{YnPzN z|LaVCXSerGuUeBM?^JGEx;3drlTfQq9q`PsSF{_++PZEb%-Uubb6t;q$%I@F5_1iI zA|0_r%2PxiWWWalVAT`M2V*U!R82<#^Fk?d7S^P%yCXFUdJDQuZ+q2+qz>GO_TNn{ zY<~BkA2fqnr+f*Ic<&HuhrROmb6R8XCbbh5QmxwlGquE*e)epq6dQn2_`=U7{NMC5dEoh<$*UWF9#xm# zIc70ZWFwk^HvNc!pN8%XOASTa{Er{}(MqWecf5!8|Fg3N`^#Ez_4nFWb~d60cZwqg zZ`OOIcOK6YeL*dHENjv8n2itqZ0&3>nbFltsd{|a_2l9eDcM=USU;;KECF?Q3#={)S+wE&L}1`Xe0HBy_ff0qguB2n$N}ose)<9 zD?@6{sWfhSg2-?c)*D6^%dF7fAp4_I}XxKrey!G1IH(vPO@QS5tPYHQD19m?E zyzbhcFC2blPm^RhZ1%?aCYA$lDKArZXyIeaT5vZZKi)UBTe?=3$URU758QRB^mU5s z8jE5GJE#`sTq8>|uMMu#|De&^r}SPbd);XAMDI9s$AG$#=pAQ53zh7Xmqxr!z0A~W zV^J$NSYffFR(gLLzLVX?L|sRtx85h$SzMQb%30HCa11xM0JX zFK@m!Aaxqb)Zc|Si1GCBs__kL=Ytu+tjDo*&7IFiH=d8Dc-U;n&*iH^-J%Y`x+ck| zO|x;ZzqK>oMbEcaS0xSpn=pDfOF9=(4pXD5bk;bh|rh#jG0UAYp zb#GH!7X1~*;!1Y?=Bf}jsSRz!1+@eH6;PuKx`b&jfp%->HM8h-9dbwWmxYX%do?mu z3o46I^R9~h^aIHIUb8drR6k}w;$HY_E!QJ@DTT$eB89Uk#UtiBcxfC?b}bF_RbdlK z!%~^#^C{&!3|<-2PG_TV7S=9=!1p26&g~BE)cf7Uv=4<<*3P#W$J*)VxUNR=p4Ed% z^e z$p}5)yU^^t6213|l*d!d7{3@V7$1G>r?f@e_szJJwm^6e*MD|(J#dA5%dh#J=YtWK zjd?UX1e<2mK$`~RqFqe#^(&N%qb5iQQPcyE5lglG3iz541# z4SMMS55{S!*K1B;_cbD2K9+X zuf3NivzQZEPH$#8wRWBu!fFEg3C~d&t94nTV3Wr{+lmzJdXF6+pYwRD_i`|c7sPzI z(?~Xt;U3bUw;9T~zVHy0?4T=D8}(P{DmviG0Q5sX8pLq)L;m}EE?>p$ROcAm_FVqK zF-Kj+eb{sP+g@vD&P`4q-Z_M{Sh{>BB1BHdj6&#nZ`aOZgl>GOb>qVx%>VC7?ZNz? zeAsijsaNj93&TjWx(|CU|AEDk6g^O{JW#L5Z#|b+G1*GY->scx zO!i${dCHhnjZIV6b9pJ_ma-Xp&*eqf>9Xf?LGN7r&+paN-P?6M8+N$(Z65qKK<2mm z_R+dTMI&0BW=4l*AjzYoYiZuxb2+tF(`aXHtD3c~p39TrQ+$(8Y+LZob3+f&$wqWha|tW_k`j9-+Mgam%TG# zor_;S#SBvmzjRo7E`RjC=o3qqc5z>y?Cp_!LMtLQj@s7PW9hn-C)GAfR~z%arRzoN zg}g2Qo4q%IZ>m}zfNz$jY3Y(KlypIF7fM-Ll5{T!Nn1*R0)bX`Xwo)aAYJIf14Le$ zE))c;Sh4IaAfO@^L>?$=H?eF|7O`y4RzX2g5qW@!_|4oUxeaOc{lDM){{Q#=%#X{x zcg~zSGjrz5oaOeMJ4cG(4w@OMhIXIT@BKjW&$Yr( zDpf{})gRv<`WUr6=rLMh;A0VJd!oux+g_k;TaFdFnr2DN`V@mccRXv>r-7<7<(-L3 zXnpF_X?^}6`=99ZB8*iZ-@ou1t=RDI${{@qMYJOAROBrp}r;OqG@l2ow_UV%hcd*YbB=TcDqS*InpK^-l z5JsPayXmtt4k`DfPj@P(3+VGuw(K3KbE-a-civ<9i-p|aS+YZsit^5#(Qvm}6#qO# zyCv~VbR1Z$

    N7EI{#aM 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

    Z?B3RqvFcm$EC(OTu{Z(DuxoNHS~ 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

    0~hQ643E=yd1Cw;@X??@4Lp)Bm-_8!e8@cl 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Ξ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%0D9M@4(!XN&9~KpKE~Vc@VIPmV&lXYfDX)iv)+ZDi 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ℜ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
      F4rc%E+H>0vxQgr^4p=TLhXnklHK@-7Cl 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 z

      BVoYN=E=wESqu8baqAfR#SYS5|PV!g04fzwyY=yp!uD5GD)={scf8qiJ9 z`x59d!RxoJpd*BY!}h-762e zv`N?MgjBw?N%T#i)A3N+B>MlzGmnJw&k8u5{4Q;h-yQ;Sszd}z^d8WuUrL)qAB)De zNJOASzZ>*_g`V>*_uno5pQ;!6^?c(0-|dJ0ZuXpSegC`J|DTGh^Yz=mTRxN@&X<0^ zc6x9SrSlJIlg6=7dj1S~rSZ^&>kT^oNt>i6l>Sik^DXy$o=Y0JTs$D`I z@BW9*{2a<}q3EyUdPeE|_D9fh>Eqp`anGN=7}qy6pM!gu7u^NPqN2P@^6+K&8Z4f` zKCUi4L_4o+Nm&)XnO;VVDJm?c32I8J0zFM!d@)^tV-YzS3Y<)llcm71ikxf(PO4dC zr7GEwnkKG{EUw~NlvEV(WpE!yT={bTRfR?KW?wQNVj?GSS;deGEc>)D{efTe_Hlz( z*HkDaB{e-{K`E&g#T*#}X@^RHd@g zSc@sHd6~w%6WB5-Y0NLmIWol9NXt}+n>6MJxi;njWo^t4vK;Bm1ByA)Q^oSr(-g{2 zSFBC?0JTYHZ7naKwX$;gigipMppNO;qQw@og2fia7PAb{Viv_ZS_Y`2h1F4tr?~~Q z_;L>e#*#%b(k%l-x3{*9mBHNN%fbfxf%7nTNqGVnx*0g9VyDR*pwncgvIQZ_mbq)z7L~Y4%FDzO;Kv-v zfGg&+mpyz%7m14qOM>}D3v=c%Qc9+*8N_vnReb5=q#~x08fosV`JoOGk}B4AEDK+? zSh2}6WnGo6eVnNnrkS!%%4MxS6AS0fT`)IquA`{niunt2uE?8RB$+EMXAxL$u0iH` zM$IxS=w<4PNMe4Gq>~*7y=5oK7;JT61-62I@xU6m5{H6RU`zb0xXft(Wj+*44`wS= zz+Xr*kXa?wlgeq4bb2h!{lS-z)s0h9DK8sVml>EaoEk0 zMJkU6S){V4&XPqcmz6~-msK1}vt-f7WUY#Ws8z9U)-=htNx^|1?7;%+@v_EA;fv)+ z4d6d4SY=LPRkSiEDJ$bE?kH-LxshvQZdBIh3Rw6>QK`(|Tq*OnveJOHe-w4f+J))N zX6>S^(|-XWC6(E%`IIvUt~aEZU8$YXm<2hx4h%=ZEsefd$Ohz`1qIJAX}4%u_0sue%dyHAUe8SPmk{4q^%wDH)?j@;l%n)nt7@{$Dy0Rz7KgN* zE$9`@XKRJ|Rsai@V5o12{q282t1j2JHgLILanBIch8m{8{Pc#*S%!bL8?qeV`Z zf<;c3#fqFA7%FmZK%~f-vOtlu1LMTcrG9}@^m7wNjv~62EGk+sd(i^C;9Y_QR@Ixr zv8WOY4_3JzS<`9odN>{Wp8_Ft03wS#gxmQ$R)zzx%z*qMDs-!eS7F1;HN{ttxR3S{NDY_~p6~PkH4JoMz8l^LtR0Pogxe!c>xe#2T zbETOXQ;MO$88)6%WGc?FDHoZB9y36ZlFI_)2QzI0=7P)kY@1?dNt2u-*DAS1v4PSg z=g4xUqw9sPK|1;)pLtWXB|St9(+8|!x)c<0TcmJMtU-E+dZ!Oq?{w6g&%`O#z=9eo z1(RjKmbHYaw`IV3TQUMe&^IZ^Z3q>97RfO(hgl?-C_2m{IYypK3I)Yn8B##Va%D)4 zQqCp0OP)(|lyWY~UGiK~fGFq640I!(tNR%rW@O28;WQ10(Vxp^4a|nqvO?d|)IXP5 z^0cgenUaqc>xX%}pou$X1k`w^KBNf_e-qfnT;TCZ9P9@=K*?kdBXRWd^doDGy6uuJGxS#T{N#?GtG5QY z2K<@HLb)lt$e>1N^el6*YASv1EctvP^P#tVzX?OeQJ8SUc{E}<@Gy^);hGhd71cFU zN>;ck%c@JtN&`+-U?mKNv$x`lFm}TTjyLw@Ray%uZ{F`dZT}nR9+_+L1{qPkXToJ=u^^vC37Y zY`Zncm&^xN%Rq(j%f=8YgWSzk^23m_-GNt}Av6ay4A;z$Im(&?E>=S*4r)QBIGdjX zD=YTD&Q;c%ojQ;g122U`Xi$iW5L1*~fjAW>2B0`esZ7N*WhjQ!iDY_GvZZDXVn~OK zAcoXjK@90cD~KVrgPeg$%MkXanx){n z!9+Zb5DzAbACzM=8{UadoFBO8LY$EUrairn(s*~K(iiC}%LJvVGGS`jvWl9ixY8D; zmR3}|iZP8wQ(IHrxP&dM7N*v?s+N}3Om!7k2&Jy7)fLO#C7{l&7PZ^GWzbF>-ao

      5h@*p}o#Pq!<9YB;0G|VP11}T= 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

      hks~Zq&I1?=?{5Y*utHSZ75=`9al$0R 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

      0{k3U8ILnZ$%`Y{@O${G0CFP45B1|QO| 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 S_ApHXwiwl>&A6+X&G!Fq5MllR literal 0 HcmV?d00001 diff --git a/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDAuthentication.h b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDAuthentication.h new file mode 100755 index 00000000..3571c6e8 --- /dev/null +++ b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDAuthentication.h @@ -0,0 +1,65 @@ +/* + * GIDAuthentication.h + * Google Sign-In iOS SDK + * + * Copyright 2014 Google Inc. + * + * Use of this SDK is subject to the Google APIs Terms of Service: + * https://developers.google.com/terms/ + */ + +#import + +@protocol GTMFetcherAuthorizationProtocol; +@class GIDAuthentication; + +/// The callback block that takes a `GIDAuthentication`, or an error if attempt +/// to refresh was unsuccessful. +typedef void (^GIDAuthenticationHandler)(GIDAuthentication *authentication, NSError *error); + +/// The callback block that takes an access token, or an error if attempt to refresh was +/// unsuccessful. +typedef void (^GIDAccessTokenHandler)(NSString *accessToken, NSError *error); + +/// This class represents the OAuth 2.0 entities needed for sign-in. +@interface GIDAuthentication : NSObject + +/// The client ID associated with the authentication. +@property(nonatomic, readonly) NSString *clientID; + +/// The OAuth2 access token to access Google services. +@property(nonatomic, readonly) NSString *accessToken; + +/// The estimated expiration date of the access token. +@property(nonatomic, readonly) NSDate *accessTokenExpirationDate; + +/// The OAuth2 refresh token to exchange for new access tokens. +@property(nonatomic, readonly) NSString *refreshToken; + +/// An OpenID Connect ID token that identifies the user. Send this token to your server to +/// authenticate the user there. For more information on this topic, see +/// https://developers.google.com/identity/sign-in/ios/backend-auth +@property(nonatomic, readonly) NSString *idToken; + +/// The estimated expiration date of the ID token. +@property(nonatomic, readonly) NSDate *idTokenExpirationDate; + +/// Gets a new authorizer for `GTLService`, `GTMSessionFetcher`, or `GTMHTTPFetcher`. +/// +/// @return A new authorizer +- (id)fetcherAuthorizer; + +/// Get a valid access token and a valid ID token, refreshing them first if they have expired or are +/// about to expire. +/// +/// @param handler A callback block that takes a `GIDAuthentication`, or an +/// error if attempt to refresh was unsuccessful. +- (void)getTokensWithHandler:(GIDAuthenticationHandler)handler; + +/// Refreshes the access token and the ID token using the refresh token. +/// +/// @param handler A callback block that takes a `GIDAuthentication`, or an +/// error if attempt to refresh was unsuccessful. +- (void)refreshTokensWithHandler:(GIDAuthenticationHandler)handler; + +@end diff --git a/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDGoogleUser.h b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDGoogleUser.h new file mode 100755 index 00000000..17e6e5ea --- /dev/null +++ b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDGoogleUser.h @@ -0,0 +1,39 @@ +/* + * GIDGoogleUser.h + * Google Sign-In iOS SDK + * + * Copyright 2014 Google Inc. + * + * Use of this SDK is subject to the Google APIs Terms of Service: + * https://developers.google.com/terms/ + */ + +#import + +@class GIDAuthentication; +@class GIDProfileData; + +/// This class represents a user account. +@interface GIDGoogleUser : NSObject + +/// The Google user ID. +@property(nonatomic, readonly) NSString *userID; + +/// Representation of the Basic profile data. It is only available if +/// `GIDSignIn.shouldFetchBasicProfile` is set and either `-[GIDSignIn signIn]` or +/// `-[GIDSignIn restorePreviousSignIn]` has been completed successfully. +@property(nonatomic, readonly) GIDProfileData *profile; + +/// The authentication object for the user. +@property(nonatomic, readonly) GIDAuthentication *authentication; + +/// The API scopes granted to the app in an array of `NSString`. +@property(nonatomic, readonly) NSArray *grantedScopes; + +/// For Google Apps hosted accounts, the domain of the user. +@property(nonatomic, readonly) NSString *hostedDomain; + +/// An OAuth2 authorization code for the home server. +@property(nonatomic, readonly) NSString *serverAuthCode; + +@end diff --git a/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDProfileData.h b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDProfileData.h new file mode 100755 index 00000000..f07d4752 --- /dev/null +++ b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDProfileData.h @@ -0,0 +1,37 @@ +/* + * GIDProfileData.h + * Google Sign-In iOS SDK + * + * Copyright 2014 Google Inc. + * + * Use of this SDK is subject to the Google APIs Terms of Service: + * https://developers.google.com/terms/ + */ + +#import + +/// This class represents the basic profile information of a `GIDGoogleUser`. +@interface GIDProfileData : NSObject + +/// The Google user's email. +@property(nonatomic, readonly) NSString *email; + +/// The Google user's full name. +@property(nonatomic, readonly) NSString *name; + +/// The Google user's given name. +@property(nonatomic, readonly) NSString *givenName; + +/// The Google user's family name. +@property(nonatomic, readonly) NSString *familyName; + +/// Whether or not the user has profile image. +@property(nonatomic, readonly) BOOL hasImage; + +/// Gets the user's profile image URL for the given dimension in pixels for each side of the square. +/// +/// @param dimension The desired height (and width) of the profile image. +/// @return The URL of the user's profile image. +- (NSURL *)imageURLWithDimension:(NSUInteger)dimension; + +@end diff --git a/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignIn.h b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignIn.h new file mode 100755 index 00000000..12046159 --- /dev/null +++ b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignIn.h @@ -0,0 +1,170 @@ +/* + * GIDSignIn.h + * Google Sign-In iOS SDK + * + * Copyright 2012 Google Inc. + * + * Use of this SDK is subject to the Google APIs Terms of Service: + * https://developers.google.com/terms/ + */ + +#import +#import + +@class GIDGoogleUser; +@class GIDSignIn; + +/// The error domain for `NSError`s returned by the Google Identity SDK. +extern NSString *const kGIDSignInErrorDomain; + +/// A list of potential error codes returned from the Google Identity SDK. +typedef NS_ENUM(NSInteger, GIDSignInErrorCode) { + /// Indicates an unknown error has occurred. + kGIDSignInErrorCodeUnknown = -1, + /// Indicates a problem reading or writing to the application keychain. + kGIDSignInErrorCodeKeychain = -2, + /// Indicates there are no valid auth tokens in the keychain. This error code will be returned by + /// `restorePreviousSignIn` if the user has not signed in before or if they have since signed out. + kGIDSignInErrorCodeHasNoAuthInKeychain = -4, + /// Indicates the user canceled the sign in request. + kGIDSignInErrorCodeCanceled = -5, + /// Indicates an Enterprise Mobility Management related error has occurred. + kGIDSignInErrorCodeEMM = -6, +}; + +/// A protocol implemented by the delegate of `GIDSignIn` to receive a refresh token or an error. +@protocol GIDSignInDelegate + +/// The sign-in flow has finished and was successful if `error` is `nil`. +- (void)signIn:(GIDSignIn *)signIn + didSignInForUser:(GIDGoogleUser *)user + withError:(NSError *)error; + +@optional + +/// Finished disconnecting `user` from the app successfully if `error` is `nil`. +- (void)signIn:(GIDSignIn *)signIn + didDisconnectWithUser:(GIDGoogleUser *)user + withError:(NSError *)error; + +@end + +/// This class signs the user in with Google. It also provides single sign-on via a capable Google +/// app if one is installed. +/// +/// For reference, please see "Google Sign-In for iOS" at +/// https://developers.google.com/identity/sign-in/ios +/// +/// Here is sample code to use `GIDSignIn`: +/// 1. Get a reference to the `GIDSignIn` shared instance: +/// ``` +/// GIDSignIn *signIn = [GIDSignIn sharedInstance]; +/// ``` +/// 2. Call `[signIn setDelegate:self]`; +/// 3. Set up delegate method `signIn:didSignInForUser:withError:`. +/// 4. Call `handleURL` on the shared instance from `application:openUrl:...` in your app delegate. +/// 5. Call `signIn` on the shared instance; +@interface GIDSignIn : NSObject + +/// The authentication object for the current user, or `nil` if there is currently no logged in +/// user. +@property(nonatomic, readonly) GIDGoogleUser *currentUser; + +/// The object to be notified when authentication is finished. +@property(nonatomic, weak) id delegate; + +/// The view controller used to present `SFSafariViewContoller` on iOS 9 and 10. +@property(nonatomic, weak) UIViewController *presentingViewController; + +/// The client ID of the app from the Google APIs console. Must set for sign-in to work. +@property(nonatomic, copy) NSString *clientID; + +/// The API scopes requested by the app in an array of `NSString`s. The default value is `@[]`. +/// +/// This property is optional. If you set it, set it before calling `signIn`. +@property(nonatomic, copy) NSArray *scopes; + +/// Whether or not to fetch basic profile data after signing in. The data is saved in the +/// `GIDGoogleUser.profileData` object. +/// +/// Setting the flag will add "email" and "profile" to scopes. +/// Defaults to `YES`. +@property(nonatomic, assign) BOOL shouldFetchBasicProfile; + +/// The language for sign-in, in the form of ISO 639-1 language code optionally followed by a dash +/// and ISO 3166-1 alpha-2 region code, such as `@"it"` or `@"pt-PT"`. Only set if different from +/// system default. +/// +/// This property is optional. If you set it, set it before calling `signIn`. +@property(nonatomic, copy) NSString *language; + +/// The login hint to the authorization server, for example the user's ID, or email address, +/// to be prefilled if possible. +/// +/// This property is optional. If you set it, set it before calling `signIn`. +@property(nonatomic, copy) NSString *loginHint; + +/// The client ID of the home web server. This will be returned as the `audience` property of the +/// OpenID Connect ID token. For more info on the ID token: +/// https://developers.google.com/identity/sign-in/ios/backend-auth +/// +/// This property is optional. If you set it, set it before calling `signIn`. +@property(nonatomic, copy) NSString *serverClientID; + +/// The OpenID2 realm of the home web server. This allows Google to include the user's OpenID +/// Identifier in the OpenID Connect ID token. +/// +/// This property is optional. If you set it, set it before calling `signIn`. +@property(nonatomic, copy) NSString *openIDRealm; + +/// The Google Apps domain to which users must belong to sign in. To verify, check +/// `GIDGoogleUser`'s `hostedDomain` property. +/// +/// This property is optional. If you set it, set it before calling `signIn`. +@property(nonatomic, copy) NSString *hostedDomain; + +/// Returns a shared `GIDSignIn` instance. ++ (GIDSignIn *)sharedInstance; + +/// Unavailable. Use `sharedInstance` to instantiate `GIDSignIn`. ++ (instancetype)new NS_UNAVAILABLE; + +/// Unavailable. Use `sharedInstance` to instantiate `GIDSignIn`. +- (instancetype)init NS_UNAVAILABLE; + +/// This method should be called from your `UIApplicationDelegate`'s `application:openURL:options` +/// and `application:openURL:sourceApplication:annotation` method(s). +/// +/// @param url The URL that was passed to the app. +/// @return `YES` if `GIDSignIn` handled this URL. +- (BOOL)handleURL:(NSURL *)url; + +/// Checks if there is a previously authenticated user saved in keychain. +/// +/// @return `YES` if there is a previously authenticated user saved in keychain. +- (BOOL)hasPreviousSignIn; + +/// Attempts to restore a previously authenticated user without interaction. + +/// The delegate will be +/// called at the end of this process indicating success or failure. The current values of +/// `GIDSignIn`'s configuration properties will not impact the restored user. +- (void)restorePreviousSignIn; + +/// Starts an interactive sign-in flow using `GIDSignIn`'s configuration properties. +/// +/// The delegate +/// will be called at the end of this process. Any saved sign-in state will be replaced by the +/// result of this flow. Note that this method should not be called when the app is starting up, +/// (e.g in `application:didFinishLaunchingWithOptions:`); instead use the `restorePreviousSignIn` +/// method to restore a previous sign-in. +- (void)signIn; + +/// Marks current user as being in the signed out state. +- (void)signOut; + +/// Disconnects the current user from the app and revokes previous authentication. If the operation +/// succeeds, the OAuth 2.0 token is also removed from keychain. +- (void)disconnect; + +@end diff --git a/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignInButton.h b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignInButton.h new file mode 100755 index 00000000..795f5698 --- /dev/null +++ b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GIDSignInButton.h @@ -0,0 +1,53 @@ +/* + * GIDSignInButton.h + * Google Sign-In iOS SDK + * + * Copyright 2012 Google Inc. + * + * Use of this SDK is subject to the Google APIs Terms of Service: + * https://developers.google.com/terms/ + */ + +#import + +/// The layout styles supported by the `GIDSignInButton`. +/// +/// The minimum size of the button depends on the language used for text. +/// The following dimensions (in points) fit for all languages: +/// - kGIDSignInButtonStyleStandard: 230 x 48 +/// - kGIDSignInButtonStyleWide: 312 x 48 +/// - kGIDSignInButtonStyleIconOnly: 48 x 48 (no text, fixed size) +typedef NS_ENUM(NSInteger, GIDSignInButtonStyle) { + kGIDSignInButtonStyleStandard = 0, + kGIDSignInButtonStyleWide = 1, + kGIDSignInButtonStyleIconOnly = 2 +}; + +/// The color schemes supported by the `GIDSignInButton`. +typedef NS_ENUM(NSInteger, GIDSignInButtonColorScheme) { + kGIDSignInButtonColorSchemeDark = 0, + kGIDSignInButtonColorSchemeLight = 1 +}; + +/// This class provides the "Sign in with Google" button. +/// +/// You can instantiate this class programmatically or from a NIB file. You +/// should set up the `GIDSignIn` shared instance with your client ID and any +/// additional scopes, implement the delegate methods for `GIDSignIn`, and add +/// this button to your view hierarchy. +@interface GIDSignInButton : UIControl + +/// The layout style for the sign-in button. +/// Possible values: +/// - kGIDSignInButtonStyleStandard: 230 x 48 (default) +/// - kGIDSignInButtonStyleWide: 312 x 48 +/// - kGIDSignInButtonStyleIconOnly: 48 x 48 (no text, fixed size) +@property(nonatomic, assign) GIDSignInButtonStyle style; + +/// The color scheme for the sign-in button. +/// Possible values: +/// - kGIDSignInButtonColorSchemeDark +/// - kGIDSignInButtonColorSchemeLight (default) +@property(nonatomic, assign) GIDSignInButtonColorScheme colorScheme; + +@end diff --git a/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GoogleSignIn.h b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GoogleSignIn.h new file mode 100755 index 00000000..8ccf7cd2 --- /dev/null +++ b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Headers/GoogleSignIn.h @@ -0,0 +1,5 @@ +#import "GIDAuthentication.h" +#import "GIDGoogleUser.h" +#import "GIDProfileData.h" +#import "GIDSignIn.h" +#import "GIDSignInButton.h" diff --git a/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Modules/module.modulemap b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Modules/module.modulemap new file mode 100755 index 00000000..421acdc9 --- /dev/null +++ b/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/Modules/module.modulemap @@ -0,0 +1,13 @@ +framework module GoogleSignIn { + umbrella header "GoogleSignIn.h" + export * + module * { export * } + link framework "AuthenticationServices" + link framework "CoreGraphics" + link framework "CoreText" + link framework "Foundation" + link framework "LocalAuthentication" + link framework "SafariServices" + link framework "Security" + link framework "UIKit" +} diff --git a/Pods/GoogleSignIn/README.md b/Pods/GoogleSignIn/README.md new file mode 100755 index 00000000..4418b664 --- /dev/null +++ b/Pods/GoogleSignIn/README.md @@ -0,0 +1,18 @@ +# Google Sign-In SDK for iOS + +The Google Sign-In SDK allows users to sign in with their Google account from +third-party apps. + +Please visit [our developer site](https://developers.google.com/identity/sign-in/ios/) +for integration instructions, documentation, support information, and terms of +service. + +## Getting Started + +* Try our example app with: + ``` + $ pod try GoogleSignIn + ``` + and follow the directions [here](https://developers.google.com/identity/sign-in/ios/start). +* Read our [getting started guides](https://developers.google.com/identity/sign-in/ios/start-integrating). +* Take a look at the [API reference](https://developers.google.com/identity/sign-in/ios/api/). diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Info.plist b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Info.plist new file mode 100755 index 00000000..290d5343 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIconFile + + CFBundleIdentifier + com.google.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Roboto-Bold.ttf b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/Roboto-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..68822caf2421c331497581f9b80e49401189b996 GIT binary patch literal 127744 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%0AmbY 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 JPDHLkV1h!Z?2`Zh literal 0 HcmV?d00001 diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/google@3x.png b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/google@3x.png new file mode 100755 index 0000000000000000000000000000000000000000..d978ed26a231ef362d6897ebf208f3f1f4f1c7da GIT binary patch literal 1622 zcmV-c2C4apP)0n7a+ByQ8!ahvZ4Bun~Qz)$OQXm;|AK-T;yJkwe z5lB|-2hb?eu^!N_zrfEgVCIW(%}c{J?Gjx7CO(zGCwvl-oT+PonEn~#mX1?^fxYJw z%=Xzqv$hLRB7d5d9l|!{41P_5HFX(Ksy6wBJ0M#7YdYKUcVVkK4M-1e<+#o-o6eMa z0gxV>{DQWAqP|6~-v6`N+#Se>@Q4w8xC{T=*3SmgYoji>YtO&On*L609Vtygd%^KQ z>GZe7G!)2)_8%I{^3RXnyORiyS7dL!X1pP8plsB>XEl}Q{nS+6MXdGq5mki)Wp2L< zfwC2GX{yK@$D!IZF6l1n&N?X3p0W@qn{lDW^8DvG&?d^dh)B^MBIHoF_&^wT4A~7R zn~|7FdF#r%RCAbE);zVHsG2&sJs5AcK-rEOSLUl6Adz+RdWxFk`{EW22%xOL`H%YMPC8pf4E9&##ZKi2xLSif>}$VUjc%x?9wU|49}|s zG9oj<8h(TST`*|)3y5#Us9f{N`v}O0jLw*J^C;_517t*on#b2bSkztKlx_E-tovR- zdS$5HzX=FdmiLVG23^+Wcp$wpG-G}s;t!ZIq1KdjZFzJ-|5-qKnQxEoqKCCKIxdA7 zD+L6r?4l$K_2-H{;>6iDq57PS+RVdt0m>u{^c>k>_M*r!K*XP(`BV`v)Z5E;6Jz~T z5XueUb>9Y*Nf>a2Y%s^o^#=kGO3ZcE2v08TCklKn4%E)%ajsTo9<~=yCSXtMYb$DK zl?i1jZuk?3apB{RedACyWj)1(b4PKIm=vFT8BiuzN+NTm*H>}mX&}ahgrJ-?EAoHg zP+zUsK}?%9kpm>8c->b3btG)GF1b)`GZvi;#JDi}Vfi-KFIc>v80nwE15eK5Zq&^8CW3aW-p^Bmb^9>>&h!Gc7=pWWY^*Dc(3ANFBYgWCk(}B{-Tv~SkAB|Ev zN)<@6Thk~4+8CEj6!;7GHTj(NF$2i?TJg9q zQoYmn1WKgu%)`2>K9@uFI-kXwUE6jItT8e2;g|RnA$6J`dq-<8pp9|ag5oPYjQ@dQ z9_RNM_)Ol^;cD)r_wF4t-kZE9CVKtwr;CL3)=>Ol*x&4>(Fs7C;}R1O07Pdi zc;QT8zT?Z-vsDzm6DSrgG4WbaJg%oZKOA_E6r&$ly7?#N<%i7_c|fsniHmNyAs0>I znXCv0!yms-*h*`8?Y(WjA=n!z9xh2?ZIot9xM9y+^V*2p!hL`e;Ua}wIhsMFlY>3U zofIe;F4A}_P<_sqGrz{%wS0I0lEo!ud`2|++`o5xC})f6aXrVIH&80L=yJf)3EfOy z*I8&T-*rHsMtpzCNaJkCGx`+JJl>Bq_B20Ul-pn21`0ZNyD04`wR UaJO?$Q2+n{07*qoM6N<$f*zI^s{jB1 literal 0 HcmV?d00001 diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..efd53fef --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "היכנס"; + +/* Long form sign-in button text */ +"Sign in with Google" = "היכנס באמצעות Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "כניסה באמצעות Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "התקן את Google app בחינם והיכנס אל אפליקציות באמצעות חשבון Google. לא תצטרך עוד לזכור סיסמאות."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "בטל"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "התקן"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "אישור"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "ביטול"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "הגדרות"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "לא ניתן להיכנס לחשבון"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "מנהל המערכת דורש ממך להגדיר קוד סיסמה במכשיר זה כדי לגשת לחשבון זה. יש להגדיר קוד סיסמה ולנסות שוב."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "המכשיר אינו פועל בהתאם למדיניות האבטחה שנקבעה על-ידי מנהל המערכת."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "האם להתחבר באמצעות האפליקציית Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "על מנת להגן על נתוני הארגון שלך, יש להתחבר באמצעות אפליקציית Device Policy לפני הכניסה לחשבון."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "התחברות"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..3b7cd1ff --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "साइन इन करें"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google के साथ साइन इन करें"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Google के साथ साइन इन करें"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "मुफ़्त Google ऐप्लिकेशन पाएं और अपने Google खाते से ऐप्लिकेशन में साइन इन करें. पासवर्ड याद रखने की ज़रूरत नहीं."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "अभी नहीं"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "पाएं"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ठीक"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "अभी नहीं"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "सेटिंग"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "खाते में साइन इन नहीं किया जा सका"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "आपके एडमिन के लिए ज़रूरी है कि आप यह खाता एक्सेस करने के लिए इस डिवाइस पर एक पासकोड सेट करें. कृपया पासकोड सेट करें और दोबारा कोशिश करें."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "डिवाइस आपके एडमिन के ज़रिए सेट की गई सुरक्षा नीति का अनुपालन नहीं करता है."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "क्या Device Policy ऐप्लिकेशन से कनेक्ट करना चाहते हैं?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "अपने संगठन डेटा की सुरक्षा के लिए, आपको लॉग-इन करने से पहले Device Policy ऐप्लिकेशन से कनेक्ट करना होगा."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "कनेक्ट करें"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..32b6cc3d --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Prijava"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Prijavite se putem Googlea"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Prijavite se putem Googlea"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Preuzmite besplatnu aplikaciju Google i prijavljujte se na aplikacije svojim Google računom. Ne morate pamtiti zaporke."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Odustani"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Nabavi"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "U redu"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Odbaci"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Postavke"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Prijava na račun nije moguća"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Vaš administrator zahtijeva da postavite šifru zaporke na ovom uređaju da biste pristupili računu. Postavite šifru zaporke i pokušajte ponovo."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Uređaj nije usklađen sa sigurnosnim pravilima koja je postavio vaš administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Želite li se povezati s aplikacijom Pravila za uređaje?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Da biste zaštitili podatke svoje organizacije, morate se povezati s aplikacijom Pravila za uređaje prije prijave."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Poveži"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..9359cf51 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Bejelentkezés"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Bejelentkezés Google-fiókkal"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Bejelentkezés Google-fiókkal"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Telepítse az ingyenes Google alkalmazást, és jelentkezzen be az egyes termékekbe Google-fiókjával. Nem kell különböző jelszavakat megjegyeznie."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Mégse"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Telepítés"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Mégse"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Beállítások"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nem sikerült bejelentkezni a fiókba"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Adminisztrátora biztonsági kód beállítását kéri ezen az eszközön a fiókhoz való hozzáféréshez. Kérjük, állítson be biztonsági kódot, majd próbálja újra."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Az eszköz nem felel meg a rendszergazda által beállított biztonsági házirendnek."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Csatlakozik a Device Policy alkalmazáshoz?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "A szervezet adatainak védelme érdekében a bejelentkezés előtt csatlakoznia kell a Device Policy alkalmazáshoz."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Csatlakozás"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..9b66ca3c --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Masuk"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Masuk dengan Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Masuk dengan Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Dapatkan Google app gratis dan masuk ke aplikasi dengan Akun Google. Tidak perlu mengingat sandi."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Batal"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Ambil"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Oke"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Batal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Setelan"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Tidak dapat login ke akun"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrator mengharuskan Anda menyetel kode sandi di perangkat ini untuk mengakses akun ini. Setel kode sandi dan coba lagi."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Perangkat ini tidak sesuai dengan kebijakan keamanan yang disetel oleh administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Sambungkan dengan Aplikasi Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Untuk melindungi data organisasi, Anda harus tersambung dengan aplikasi Device Policy sebelum login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Sambungkan"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..9c3e576a --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Accedi"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Accedi con Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Accedi con Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Scarica gratis l'app Google app e accedi alle app con il tuo account Google: liberati dai vincoli delle password."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Annulla"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Scarica"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annulla"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Impostazioni"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Impossibile accedere all'account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "L'amministratore richiede l'impostazione di un passcode sul dispositivo per accedere a questo account. Imposta un passcode e riprova."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Il dispositivo non è conforme alle norme di sicurezza stabilite dall'amministratore."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vuoi collegarti all'app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Per proteggere i dati della tua organizzazione, devi collegarti all'app Device Policy prima di accedere."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Collega"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..6dab02ca --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "ログイン"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Googleでログイン"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Googleでログイン"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "無料のGoogleアプリをインストールして、Googleアカウントでアプリにログインしよう。パスワードを覚えておく必要はありません。"; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "キャンセル"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "インストール"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "キャンセル"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "設定"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "アカウントにログインできません"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "このアカウントにアクセスするには、この端末でパスコードを設定する必要があります。パスコードを設定してから、もう一度お試しください。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "この端末は、管理者が設定したセキュリティ ポリシーに準拠していません。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Device Policy アプリと接続しますか?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "組織のデータを保護するために、ログインする前に Device Policy アプリと接続する必要があります。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "接続"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..b596605d --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "로그인"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google 계정으로 로그인"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Google 계정으로 로그인"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "무료 Google 앱을 다운로드하여 Google 계정으로 앱에 로그인하세요. 비밀번호를 기억할 필요가 없습니다."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "취소"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "설치"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "확인"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "취소"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "설정"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "계정에 로그인할 수 없음"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "관리자의 설정에 따라 이 계정에 액세스하려면 사용 중인 기기에 비밀번호를 설정해야 합니다. 비밀번호를 설정한 후 다시 시도해 주세요."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "관리자가 설정한 보안 정책을 준수하지 않는 기기입니다."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Device Policy 앱과 연결하시겠습니까?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "조직의 데이터를 보호하려면 로그인하기 전에 Device Policy 앱과 연결해야 합니다."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "연결"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..700aaf2c --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Log masuk"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Log masuk dengan Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Log masuk dengan Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Dapatkan apl Google percuma dan log masuk ke apl menggunakan Akaun Google anda. Tidak perlu mengingati kata laluan."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Batal"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Dapatkan"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Batal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Tetapan"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Tidak dapat log masuk ke akaun"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Pentadbir menghendaki anda menetapkan kod laluan pada peranti ini untuk mengakses akaun ini. Sila tetapkan kod laluan, kemudian cuba lagi."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Peranti tidak mematuhi dasar keselamatan yang ditetapkan oleh pentadbir anda."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Berhubung dengan Apl Dasar Peranti?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Untuk melindungi data organisasi anda, anda mesti berhubung dengan apl Dasar Peranti sebelum log masuk."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Hubungkan"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..994b40ff --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Logg på"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Logg på med Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Logg på med Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Skaff deg den gratis Google-appen, og logg på apper med Google-kontoen din. Du trenger ikke å huske passord."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Avbryt"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Hent"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Avbryt"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Innstillinger"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kan ikke logge på kontoen"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratoren din krever at du angir en adgangskode på denne enheten for å få tilgang til kontoen. Angi en adgangskode, og prøv på nytt."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Enheten overholder ikke retningslinjene for sikkerhet som ble angitt av administratoren din."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vil du koble til med Device Policy-appen?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "For å beskytte dataene til organisasjonen din må du koble til med Device Policy-appen før du logger på."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Koble til"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..fb539e08 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Inloggen"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Inloggen met Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Inloggen met Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Installeer de gratis Google-app en log in bij apps met uw Google-account. U hoeft geen wachtwoorden te onthouden."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Annuleren"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Installeren"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuleren"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Instellingen"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kan niet inloggen op account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Uw beheerder vereist dat u een toegangscode instelt op dit apparaat om toegang te krijgen tot dit account. Stel een toegangscode in en probeer het opnieuw."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Het apparaat voldoet niet aan het beveiligingsbeleid dat is ingesteld door uw beheerder."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Verbinden met Device Policy-app?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Ter bescherming van de gegevens van uw organisatie moet u verbinding maken met de Device Policy-app voordat u inlogt."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Verbinden"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..6ed4b576 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Zaloguj się"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Zaloguj się przez Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Zaloguj się przez Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Pobierz darmową aplikację Google i zaloguj się do aplikacji, używając konta Google. Nie musisz pamiętać haseł."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Anuluj"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Pobierz"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Anuluj"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ustawienia"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nie można zalogować się na konto"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrator wymaga ustawienia kodu dostępu do konta na tym urządzeniu. Ustaw kod dostępu i spróbuj ponownie."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Urządzenie nie jest zgodne z zasadami bezpieczeństwa ustanowionymi przez Twojego administratora."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Połączyć z aplikacją Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Aby chronić dane organizacji, przed zalogowaniem musisz się połączyć z aplikacją Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Połącz"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..3207312c --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Fazer login"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Fazer login com o Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Fazer login com o Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Faça o download do Google app gratuitamente e faça login em aplicativos com sua Conta do Google. Não há necessidade de lembrar senhas."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Cancelar"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Instalar"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configurações"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não foi possível fazer login na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Seu administrador exige que você defina uma senha neste dispositivo para acessar esta conta. Defina uma senha e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Conectar-se ao app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua organização, você precisa se conectar ao app Device Policy antes de fazer login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..3207312c --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Fazer login"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Fazer login com o Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Fazer login com o Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Faça o download do Google app gratuitamente e faça login em aplicativos com sua Conta do Google. Não há necessidade de lembrar senhas."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Cancelar"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Instalar"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configurações"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não foi possível fazer login na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Seu administrador exige que você defina uma senha neste dispositivo para acessar esta conta. Defina uma senha e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Conectar-se ao app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua organização, você precisa se conectar ao app Device Policy antes de fazer login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..91d7a258 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Iniciar sessão"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Iniciar sessão com o Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Iniciar sessão com o Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Obtenha a aplicação Google gratuita e inicie sessão nas aplicações com a sua Conta Google. Não precisa de memorizar palavras-passe."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Cancelar"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Obter"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Definições"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não é possível iniciar sessão na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "O administrador requer a definição de um código secreto neste dispositivo para aceder a esta conta. Defina um código secreto e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo seu administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Pretende ligar-se à aplicação Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua entidade, tem de se ligar à aplicação Device Policy antes de iniciar sessão."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Ligar"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..34b4239e --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Conectați-vă"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Conectați-vă cu Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Conectați-vă cu Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Instalați aplicația Google gratuită și conectați-vă la aplicații folosind Contul Google. Nu mai trebuie să rețineți parolele."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Anulați"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Instalați"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Anulați"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Setări"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nu vă puteți conecta la cont"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratorul impune să setați o parolă pe acest dispozitiv ca să accesați contul. Setați o parolă și încercați din nou."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Dispozitivul nu respectă politica de securitate stabilită de administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vă conectați cu aplicația Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Pentru a vă proteja datele organizației, trebuie să vă conectați cu aplicația Device Policy înainte de a vă conecta."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectați"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..6d6c98ab --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Войти"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Войти в аккаунт Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Надоело вводить пароль?"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Установите бесплатное приложение Google и входите в другие мобильные программы, используя учетные данные своего аккаунта."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Отмена"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Установить"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ОК"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Отмена"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Настройки"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Не удалось войти в аккаунт"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "В соответствии с требованиями администратора для входа в аккаунт необходимо установить на устройстве код доступа. Сделайте это и повторите попытку."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Устройство не соответствует правилам безопасности, которые установлены администратором."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Подключить приложение Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "В целях защиты корпоративных данных перед входом в аккаунт необходимо подключить приложение Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Подключить"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..eaf2f7f2 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Prihlásiť sa"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Prihlásiť sa pomocou účtu Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Prihlásenie pomocou účtu Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Nainštalujte si zdarma aplikáciu Google a prihlasujte sa do aplikácií pomocou účtu Google. Nebudete si už musieť pamätať rôzne heslá."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Zrušiť"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Inštalovať"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Zrušiť"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Nastavenia"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nedá sa prihlásiť do účtu"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Správca vyžaduje, aby ste v tomto zariadení nastavili vstupný kód na prístup do príslušného účtu. Nastavte vstupný kód a skúste to znova."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Zariadenie nespĺňa pravidlá zabezpečenia nastavené vaším správcom."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Prepojiť s aplikáciou Pravidlá pre zariadenie?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Na to, aby bolo možné chrániť dáta vašej organizácie, je nutné pred prihlásením aktivovať prepojenie s aplikáciou Pravidlá pre zariadenie."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Prepojiť"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..3192e071 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Logga in"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Logga in med Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Logga in med Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Hämta Google-appen utan kostnad och logga in i appar med ditt Google-konto. Du behöver inte komma ihåg en massa lösenord."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Avbryt"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Hämta"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Ok"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Avbryt"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Inställningar"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Det gick inte att logga in på kontot"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratören kräver att du anger ett lösenord på den här enheten för att få åtkomst till kontot. Ange ett lösenord och försök igen."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Säkerhetspolicyn som administratören har angett efterlevs inte på enheten."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vill du ansluta med appen Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Du måste ansluta med appen Device Policy innan du loggar in för att skydda organisationens data."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Anslut"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..353394ca --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "ลงชื่อเข้าใช้"; + +/* Long form sign-in button text */ +"Sign in with Google" = "ลงชื่อเข้าใช้ด้วย Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "ลงชื่อเข้าใช้ด้วย Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "ติดตั้งแอป Google ฟรีและลงชื่อเข้าใช้แอปต่างๆ ด้วยบัญชี Google คุณไม่ต้องจำรหัสผ่านอีกแล้ว"; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "ยกเลิก"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "ติดตั้ง"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ตกลง"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "ยกเลิก"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "การตั้งค่า"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "ลงชื่อเข้าใช้บัญชีไม่ได้"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "ผู้ดูแลระบบกำหนดให้คุณตั้งรหัสผ่านในอุปกรณ์นี้เพื่อเข้าถึงบัญชีนี้ โปรดตั้งรหัสผ่าน แล้วลองอีกครั้ง"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "อุปกรณ์ไม่ตรงตามนโยบายความปลอดภัยที่กำหนดโดยผู้ดูแลระบบของคุณ"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "เชื่อมต่อแอป Device Policy ไหม"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "เพื่อปกป้องข้อมูลขององค์กร คุณต้องเชื่อมต่อแอป Device Policy ก่อนลงชื่อเข้าสู่ระบบ"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "เชื่อมต่อ"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..414b7b9e --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Oturum aç"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google ile oturum aç"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Google ile oturum aç"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Ücretsiz Google uygulamasını edinin ve uygulamalarda Google Hesabınızla oturum açın. Şifrelerinizi hatırlamanız gerekmez."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "İptal"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Yükle"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Tamam"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "İptal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ayarlar"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Hesapta oturum açılamıyor"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Yöneticiniz, bu hesaba erişmek için bu cihazda bir şifre kodu ayarlamanızı gerektiriyor. Lütfen şifre kodu ayarlayın ve tekrar deneyin."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Bu cihaz, yöneticinizin ayarladığı güvenlik politikasıyla uyumlu değil."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Cihaz Politika Uygulamasına bağlanılsın mı?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Kuruluşunuzun verilerini korumak için, giriş yapmadan önce Cihaz Politikası uygulamasına bağlanmalısınız."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Bağlan"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..faaa0bc6 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Увійти"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Увійти в обліковий запис Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Входьте в обліковий запис Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Установіть безкоштовний додаток Google і входьте в обліковий запис Google у додатках. Не потрібно запам’ятовувати паролі."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Скасувати"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Установити"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Скасувати"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Налаштування"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Не вдається ввійти в обліковий запис"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Щоб увійти в обліковий запис, потрібно налаштувати код доступу на пристрої. Зробіть це й повторіть спробу."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Пристрій не відповідає правилу безпеки, яке налаштував адміністратор."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "З’єднатися з додатком Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Щоб захистити дані організації, потрібно з’єднатися з додатком Device Policy, перш ніж увійти."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "З’єднатися"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..94f858ce --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Đăng nhập"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Đăng nhập bằng Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Đăng nhập bằng Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Tải ứng dụng Google miễn phí và đăng nhập vào các ứng dụng bằng Tài khoản Google của bạn. Không cần phải nhớ mật khẩu."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Hủy"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Tải"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Hủy"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Cài đặt"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Không thể đăng nhập vào tài khoản"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Quản trị viên của bạn yêu cầu bạn phải đặt mật mã trên thiết bị này để truy cập vào tài khoản này. Hãy đặt mật mã và thử lại."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Thiết bị này không tuân thủ chính sách bảo mật do quản trị viên của bạn thiết lập."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Kết nối với ứng dụng Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Để bảo vệ dữ liệu của tổ chức của mình, bạn phải kết nối với ứng dụng Device Policy trước khi đăng nhập."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Kết nối"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..0c087f61 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "登录"; + +/* Long form sign-in button text */ +"Sign in with Google" = "使用 Google 帐号登录"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "使用 Google 帐号登录"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "安装免费的“Google”应用后,您可以使用自己的 Google 帐号登录众多应用(无需记住众多密码)。"; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "取消"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "安装"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "确定"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "取消"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "设置"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "无法登录帐号"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "您的管理员要求您必须先在此设备上设置密码,然后才能访问此帐号。请设置密码并重试。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "该设备不符合管理员设置的安全政策。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "要关联 Device Policy 应用吗?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "要保护您组织的数据,您必须在登录前关联 Device Policy 应用。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "关联"; diff --git a/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..748468f1 --- /dev/null +++ b/Pods/GoogleSignIn/Resources/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "登入"; + +/* Long form sign-in button text */ +"Sign in with Google" = "登入 Google 帳戶"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "登入 Google 帳戶"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "只要安裝免費的 Google app,即可使用 Google 帳戶登入應用程式,而不必費心記住密碼。"; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "取消"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "安裝"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "確定"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "取消"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "設定"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "無法登入帳戶"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "管理員要求您必須為這個裝置設定通行碼,才能存取這個帳戶。請設定通行碼,然後再試一次。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "這部裝置不符合您的管理員所設定的安全性政策規定。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "要連結 Device Policy 應用程式嗎?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "為了保護貴機構的資料,您必須在登入前連結 Device Policy 應用程式。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "連結"; diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 00000000..537c3f7b --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,38 @@ +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) + - GoogleSignIn (5.0.2): + - AppAuth (~> 1.2) + - GTMAppAuth (~> 1.0) + - GTMSessionFetcher/Core (~> 1.1) + - 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) + +DEPENDENCIES: + - GoogleSignIn + +SPEC REPOS: + trunk: + - AppAuth + - GoogleSignIn + - GTMAppAuth + - GTMSessionFetcher + +SPEC CHECKSUMS: + AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 + GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 + GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e + GTMSessionFetcher: 6f5c8abbab8a9bce4bb3f057e317728ec6182b10 + +PODFILE CHECKSUM: 78a8cb73e37727fdec10b33d5e8d32bbbad8444f + +COCOAPODS: 1.9.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 00000000..771c5021 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1982 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + CAD3534FC55B0333104E5117C0A9A324 /* GoogleSignIn */ = { + isa = PBXAggregateTarget; + buildConfigurationList = B0030D626B503D8EB0EA00BB772D6396 /* Build configuration list for PBXAggregateTarget "GoogleSignIn" */; + buildPhases = ( + ); + dependencies = ( + 2857566728641F74273DD7DA9E370771 /* PBXTargetDependency */, + 314A9E36FBEA4C73491669F15EA30E5F /* PBXTargetDependency */, + 74F3D34B7F14020AE0A57D83A7889F98 /* PBXTargetDependency */, + ); + name = GoogleSignIn; + productName = GoogleSignIn; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 013D945A6EB50B6FC9854DE84D18E44A /* OIDAuthorizationService+IOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 26FD7859CD2E03E7FC8158229A0568A8 /* OIDAuthorizationService+IOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06953BA616880F876D31CECCEDC11105 /* OIDAuthState.m in Sources */ = {isa = PBXBuildFile; fileRef = EEA01564A45AE0B2D7B33D0A173EDE68 /* OIDAuthState.m */; }; + 0725D5B07457983CE2485610920F40F0 /* GTMGatherInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 2886E3CC8B435722D172AFD44E448283 /* GTMGatherInputStream.m */; }; + 075E34225D4CE71C2F2FC63FB9CE0CA3 /* OIDAuthorizationResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 32CDEF47E6D0D52EEE7CB6FC86090D58 /* OIDAuthorizationResponse.m */; }; + 082620B4CAFF07381D466C7F54CDC435 /* OIDAuthStateChangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 09DB544D3B1B801F759CC3577F7BFAE2 /* OIDAuthStateChangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A83C33151A74978B5009466B16AA320 /* OIDExternalUserAgentCatalyst.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DAA0A5F9F8461368D30F0690494CEF1 /* OIDExternalUserAgentCatalyst.m */; }; + 0B764CD79758A19F877947F521050A30 /* OIDTokenUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F30E37336A67E34D69CE3F6697404B8 /* OIDTokenUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0E23750FE124E07AFF21DB9AC9542BCE /* AppAuth-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 716060E95444EF216AACA0CB19A8327F /* AppAuth-dummy.m */; }; + 152481DAFF8FA47F61BB412784DF31E9 /* OIDAuthState+IOS.m in Sources */ = {isa = PBXBuildFile; fileRef = E58D2E563A823896B05C184A88BEC5F3 /* OIDAuthState+IOS.m */; }; + 16F96D0B2EE7EBED059FF327B8E90E5E /* OIDClientMetadataParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE775C88B3DFE4CE3E1358EFB6FC3CA /* OIDClientMetadataParameters.m */; }; + 17587A84F44BB3F9BBE44E3F0BF91929 /* OIDScopeUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 1125054B815CBABCD555A9C85116A8C5 /* OIDScopeUtilities.m */; }; + 19A26781E567CE6B5034148C70558904 /* GTMSessionFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 491A043663A145B4E13044E1C11DF1B8 /* GTMSessionFetcher.m */; }; + 19B49E9D25674FD49D6819A68C8B48D8 /* GTMSessionFetcherLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = DAA391547896D3DFD85B0C72E39C34AD /* GTMSessionFetcherLogging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C61400E88FC471BECD871E263FFA844 /* GTMSessionFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = E9C487C6396F4F34AA486FA681B36E7F /* GTMSessionFetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C885217C92D9FFF2AC1765CBB300E4C /* Pods-mentorship ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BDE780ECB5DE32F67CA9FC18B0E78C80 /* Pods-mentorship ios-dummy.m */; }; + 2095003DC22D3D86A334AA1A1561900D /* OIDErrorUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 60899ED9DED004E7B0D816E6BA0FBE17 /* OIDErrorUtilities.m */; }; + 218BA22AD876AB6E19146F5A9ABC8F5E /* OIDURLQueryComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 58675B60CB9308C7F6CF1E590479D63A /* OIDURLQueryComponent.m */; }; + 22BA02A9AF9DDB1A405D82C84953B295 /* OIDResponseTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = ACCBA4B91DFEFC2176100A70B856BC6A /* OIDResponseTypes.m */; }; + 243C0608B35874A4CAB88E3951BAD348 /* GTMReadMonitorInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 29E999D050BC6AC2E2B4658E5450C009 /* GTMReadMonitorInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2808F21DE383D3C9BD0DA03A7B95F6AA /* OIDExternalUserAgentIOSCustomBrowser.h in Headers */ = {isa = PBXBuildFile; fileRef = 17ED11E753F5ED39DCB3A46E8455EA0E /* OIDExternalUserAgentIOSCustomBrowser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2A793266E8EBA0902699FB04A0BBFD79 /* Pods-mentorship ios-mentorship iosUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 26978B4C518564639BE8B2386D94265E /* Pods-mentorship ios-mentorship iosUITests-dummy.m */; }; + 2B268B1D89DDEE445606464B1105E0F3 /* OIDIDToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 51B30FDB0F55755AE165583A4942695F /* OIDIDToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B9DE014CBDC27683B204852475EB8A6 /* OIDExternalUserAgentIOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FB2DA57F1766D527F365AFDF52A72D6 /* OIDExternalUserAgentIOS.m */; }; + 2C034AC52FF9090141709228E7A67121 /* OIDServiceDiscovery.m in Sources */ = {isa = PBXBuildFile; fileRef = EFE65E9AF53F83E24423FA1FCEC50885 /* OIDServiceDiscovery.m */; }; + 2D56A3ED5FE2959E984D12CC08761F44 /* GTMSessionFetcher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F6ECBE22F5655207E067F9EEAD60238C /* GTMSessionFetcher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2D8D67C396A0A1A33320AB9924E9DB42 /* OIDError.m in Sources */ = {isa = PBXBuildFile; fileRef = B5C23FDD115D6C6944C9C16DF0A248E4 /* OIDError.m */; }; + 321995AB5C5DD22B2DC924BC8F2AF053 /* OIDTokenResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 27B32EA1466E95564B5FAD5E821AFFCB /* OIDTokenResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 355CF2719234ADB11A1993E2120CC373 /* OIDTokenRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 18492EC0DB790FFE76C1FB289EF489B5 /* OIDTokenRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3989F5BDEC4A21202F727FB35ECB9E4D /* OIDTokenResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 493064774FA103423D33D9F2E8489FF3 /* OIDTokenResponse.m */; }; + 39D4516A2DB8E91D2A1C0CDB79BDCBCE /* OIDURLQueryComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C28FCC1CEF4208E89FACA0CB2FDCB48 /* OIDURLQueryComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 39DDFC3157A616235C548673C91887B0 /* GTMSessionUploadFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = A7AA2B0D2F921EFAE386870CD4175555 /* GTMSessionUploadFetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3BFE8CD59118C4908BDCF67DA762C118 /* OIDEndSessionResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = EEF2E161EA57E8FD07C267755E8004A3 /* OIDEndSessionResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C8B38097E676E0CAD4C9EDCAD691C9D /* GTMAppAuth-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A5671479D49B01EA29DC81E86747A24 /* GTMAppAuth-dummy.m */; }; + 3F609DF53628B2F834F882C40F39C99C /* OIDTokenRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DCE7187E04CC451FE91221AF6E4B56 /* OIDTokenRequest.m */; }; + 408352680097A53851035145970371B1 /* OIDAuthorizationRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE3EABEA79A11C08EB88A403EFA169E /* OIDAuthorizationRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 40FC84D2AFB6832635DD9A929E516BAE /* OIDGrantTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 25D1D33BE58E2175C32DC08C25152B91 /* OIDGrantTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4480D20BAE2A84682B5DE51F51A5DD4D /* OIDDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AFA720E1B4DE82D628D142989729554 /* OIDDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4609E25A2C08EDA3E3729934BC90DCDE /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B74456FC79B31A118299C8CFA29E02F /* SafariServices.framework */; }; + 4870D0FB963B09D3D9FAA4E3DC9263FB /* OIDClientMetadataParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 221BBB3F1D598981E3CDAF4EE8C85BB7 /* OIDClientMetadataParameters.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 487B398FF6DE0468B5E8E4FEBB432327 /* OIDExternalUserAgentCatalyst.h in Headers */ = {isa = PBXBuildFile; fileRef = A0E687C93BF9BC8A38F9F3D5C019E6D0 /* OIDExternalUserAgentCatalyst.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E03547F2FCFE772ACCDA5A0F2861A21 /* GTMAppAuth-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 301BBC564FA7E1A935A554E14F038BD2 /* GTMAppAuth-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 527B5C1B1C9E916C516A73E93CA8BB62 /* GTMSessionFetcher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CACC84D9888E5F02DFB66C1EFC6B53C2 /* GTMSessionFetcher.framework */; }; + 5C43E64B8DFCE99DD92F62D538C0DFF0 /* OIDFieldMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 861F1981C779535A562232F6DECA4B4E /* OIDFieldMapping.m */; }; + 5D4BB578718CC33E5E14170F3E04B696 /* GTMAppAuth.h in Headers */ = {isa = PBXBuildFile; fileRef = F8DB658EC192A6B16FF51B90CA4F0AE9 /* GTMAppAuth.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5D8C1D8B1B94C05E1209CFADC4CBA523 /* Pods-mentorship iosTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BD49343D0716132373053EB4843C9F3 /* Pods-mentorship iosTests-dummy.m */; }; + 617968B11188B95B6117BE9A51BCC2F7 /* OIDErrorUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C6E88A1D88407285CECA9C9E47BFB6C /* OIDErrorUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61D9C8902B2B3C97CD30023D322B8BAB /* GTMSessionFetcherService.h in Headers */ = {isa = PBXBuildFile; fileRef = D92C3A75664A17434FB87EAA1C9F736F /* GTMSessionFetcherService.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 670E2A31490D13725DFB5CBBF08B12EF /* OIDAuthState+IOS.h in Headers */ = {isa = PBXBuildFile; fileRef = EB9B60E189FAC21B2C9104C7DAB0D65A /* OIDAuthState+IOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 677020069CB1BF19DC94430FFAA4DE64 /* GTMMIMEDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 41C243F924B1681C225C02C7D6137956 /* GTMMIMEDocument.m */; }; + 6B2C401E08F2AC0A87453061CA3E8E2C /* OIDAuthState.h in Headers */ = {isa = PBXBuildFile; fileRef = A1A2046586D911B298FE96991C14207A /* OIDAuthState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6F5E49B223BE8067ACA22E443E6125A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8E8CAA1727B3C595EF995FFA650CD6 /* Foundation.framework */; }; + 705E22C52493D0AEDE135873802B54E0 /* OIDScopes.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C04B2D71B76EC26B743C01F9E9BE912 /* OIDScopes.m */; }; + 71BCEC30B9A618753E543ED8C606B9F8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8E8CAA1727B3C595EF995FFA650CD6 /* Foundation.framework */; }; + 75E674393E820798B5C4A708746E4E49 /* GTMKeychain_iOS.m in Sources */ = {isa = PBXBuildFile; fileRef = BBF941AEBADD9F6AD4538FE8788888F6 /* GTMKeychain_iOS.m */; }; + 77F8771176D9BE429820216FFD687D1B /* AppAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7AA99808D37E94902B0E4448AB29ADE /* AppAuth.framework */; }; + 7887F7AA5B1214BF90AA09CE6CC4AECC /* GTMAppAuthFetcherAuthorization+Keychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 476A4E97C23078E3B85FEF92AF4D6F62 /* GTMAppAuthFetcherAuthorization+Keychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 79117048A3C4F245532CAE57EE37901A /* OIDExternalUserAgentIOSCustomBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = A63891EFBD9E2B177549512671020B36 /* OIDExternalUserAgentIOSCustomBrowser.m */; }; + 7ACD06125D4ECC1EC05EAF68B2DC0C99 /* OIDScopeUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B96527396460EFCD85BCB4CFEA21BB8 /* OIDScopeUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C15A5740A2F9022423ED5583A2D578B /* GTMSessionFetcher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B1DCCC57B7C242E3D54FFAD8890F1CDF /* GTMSessionFetcher-dummy.m */; }; + 7F7C8089080C1BB6D4AD94CE2AAB1749 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8E8CAA1727B3C595EF995FFA650CD6 /* Foundation.framework */; }; + 7F99EA6887D99503660FCDF1DD7A3E04 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72CDB17148C70EAFA425064D46E0AB43 /* Security.framework */; }; + 8390E44AF1A51804ECC9B7DAEB30F30F /* GTMReadMonitorInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CE4F8EF50120F68B743B907FC614C98 /* GTMReadMonitorInputStream.m */; }; + 83BAF0108579702991C01C961439111A /* OIDExternalUserAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F32C739DF04BB1DCE9756B9874F9B55 /* OIDExternalUserAgent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8417CFCEA12E96E62CFA4A646672BCCB /* OIDServiceDiscovery.h in Headers */ = {isa = PBXBuildFile; fileRef = DE6C8BFBB00A11E520F0E20A4B44E172 /* OIDServiceDiscovery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85AC70140CF3718AA932C21689BF865A /* OIDExternalUserAgentSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FDB4F9D06C19DAFFC1DF358C8CF570E /* OIDExternalUserAgentSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 86C6E9D09DD9A2F765ED9CF5F981560C /* OIDURLSessionProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = DC804BAE68E3036FAB3CA483E3B5D4D5 /* OIDURLSessionProvider.m */; }; + 87A2AA12423B55AD7791A99D79534D46 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8E8CAA1727B3C595EF995FFA650CD6 /* Foundation.framework */; }; + 8953999C7727F2F912F6A737FD0FA0AC /* GTMGatherInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BA1D24E57164F99EF8C7E3CA1804BD42 /* GTMGatherInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8955CA20EEA55F5D75CDE87F0CADCF83 /* OIDScopes.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DE351FA8C920C81A50ADA6FF5326C65 /* OIDScopes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8ACA9C8B657C3C149214E3649860AF76 /* OIDResponseTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 42F35D3AD5A478242B95522CA059B5D9 /* OIDResponseTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8DD2342949A98F8B328CA82C88F1742D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8E8CAA1727B3C595EF995FFA650CD6 /* Foundation.framework */; }; + 91907BA379327CACDF19EA39EAD05338 /* OIDEndSessionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EEA474C0422A725B8ACF1448991B3BB4 /* OIDEndSessionRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 935771162DF644301DCB001153BE1A4A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72CDB17148C70EAFA425064D46E0AB43 /* Security.framework */; }; + 95D660DE029B3057EF7922C44E75B6FF /* OIDTokenUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 947742DE685D3112A4947B5D79CC0C57 /* OIDTokenUtilities.m */; }; + 97185747EA1A3BB7552CB5A802B56757 /* GTMAppAuthFetcherAuthorization+Keychain.m in Sources */ = {isa = PBXBuildFile; fileRef = F678ABCE32389498766DDA3647223327 /* GTMAppAuthFetcherAuthorization+Keychain.m */; }; + A14710681730656A8EE4F2793773C18B /* OIDAuthorizationResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = A475F803F0CAA576ABB9F5910018FE04 /* OIDAuthorizationResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1AF5BF63FEEA98CB2D165039170E6F7 /* OIDAuthorizationService+IOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D48485D1A687CC167B4E447E691B6EF /* OIDAuthorizationService+IOS.m */; }; + A1BB5BA455F04F024EE7204993AE5188 /* Pods-mentorship ios-mentorship iosUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BB1F49651B7E6C2A30CD99A9E0B4CF0 /* Pods-mentorship ios-mentorship iosUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A3C394C6C598DFAC45199851B2FF5F97 /* GTMMIMEDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = EE8CD03E234491AC3FFEA89415C2EC3C /* GTMMIMEDocument.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A75213FD8D0028674022934581BEC725 /* GTMSessionUploadFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 7604721BAE0C9863C9871789F8BF5C35 /* GTMSessionUploadFetcher.m */; }; + A837179BAD5CC1FFC6BFAC2C5C67E334 /* OIDServiceConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = FBBFB2DBA93531F1A771C1333958547D /* OIDServiceConfiguration.m */; }; + AA3BE332B851918B23E03F283868116C /* OIDError.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D706C0B2250B3275152E7E01EFD89A4 /* OIDError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AC8E8C869F03F07CB4E0018D956F8386 /* GTMOAuth2KeychainCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 2675390570F0CB22B1A5323F499195D9 /* GTMOAuth2KeychainCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AE07D07F98D805B39CAAB4E89F1E87B8 /* OIDServiceConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = B0E52B096DDF89977735505C25E2307D /* OIDServiceConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B00AF14E70C26C9D19EDB3AB4F04123E /* OIDRegistrationRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 96CDC5766FB3A0359F50EA531C9400CC /* OIDRegistrationRequest.m */; }; + B35F09AAE81C4CCCB215BF097DD570D2 /* GTMAppAuthFetcherAuthorization.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CFB68E7A5CA39188D89F85913215076 /* GTMAppAuthFetcherAuthorization.m */; }; + B714634348FC636AD9B6AAB61EEB7778 /* GTMSessionFetcherService.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B35DF42BAB316E651B49CAD522D30D2 /* GTMSessionFetcherService.m */; }; + BBC602EC86EB71FC4ACD5728C9058E23 /* OIDRegistrationRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = BF78AC6BAB39C75DEAC27C39FD0C90E6 /* OIDRegistrationRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF588BB40FADB1F474BB6D2BB22CAAE1 /* GTMAppAuthFetcherAuthorization.h in Headers */ = {isa = PBXBuildFile; fileRef = E49C7D735C96D80767D1DE34A6447961 /* GTMAppAuthFetcherAuthorization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C23F697B76C8D3242F232D958E0C00E3 /* OIDAuthorizationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 78B0DD0227B7E59711E1B5ED8247519F /* OIDAuthorizationService.m */; }; + C2AABCD1F39FCA174A0C33D19E160BBF /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36B1B635135A16FECC5DEC33BB89C9FE /* SystemConfiguration.framework */; }; + C359863B7FF01F6B19CDA89D30126EE6 /* OIDAuthorizationRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F1D3C4CB0ACD5E0120EC1686BB130F1 /* OIDAuthorizationRequest.m */; }; + C760F013C47E323D4C9D3E1FF5E34338 /* OIDAuthStateErrorDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FA8AAFA32ACE623962A8E103480262D /* OIDAuthStateErrorDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE9462D01A9FBD478D4A0742AA127534 /* Pods-mentorship iosTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 58F025C65EC807FFAC14F520B0DA02CF /* Pods-mentorship iosTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D4E43B95AA2B76BDEC6B97B152F00463 /* OIDURLSessionProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 95B6991B778BE3F367235DBDC2021762 /* OIDURLSessionProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D87549BF6D8F527CF351E13326FCEF21 /* OIDExternalUserAgentIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 305D7A0C5FB8E82571085947BC82C642 /* OIDExternalUserAgentIOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D901F6867BD4353BECC4F396BCD31533 /* GTMOAuth2KeychainCompatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 4082F9791C7B3B032996A82B6617632F /* GTMOAuth2KeychainCompatibility.m */; }; + D90A3C067FE031487AD6F53979803AAA /* OIDEndSessionRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C903BCB7155D03E0DE50753C984C025 /* OIDEndSessionRequest.m */; }; + DC4164A4DCDACFD4960D61FA1DA61A01 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8E8CAA1727B3C595EF995FFA650CD6 /* Foundation.framework */; }; + DE23788919FF5136AC4B77F9B29FB4C1 /* OIDFieldMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 3003261E01B3BCA95DBA61082A8D6B15 /* OIDFieldMapping.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E3B32C12184BD887E6687F73097489FA /* OIDRegistrationResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 05F56E8DA7268229361868CD6D5EFBF1 /* OIDRegistrationResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4420DBF08343EA2886691A140BF7C3E /* GTMKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 11AE9BE473FE105DDB322875E4268930 /* GTMKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EA278C7D9EB69B68733EF68A0C150345 /* OIDAuthorizationService.h in Headers */ = {isa = PBXBuildFile; fileRef = 60A130AEE49119150B8AD52A61A362CA /* OIDAuthorizationService.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE191018EF34395C61D30D78FED87E45 /* AppAuthCore.h in Headers */ = {isa = PBXBuildFile; fileRef = F1B784727061BFA4B97C8D316FDADAA9 /* AppAuthCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE329DF01337A5B2040D3D7532BEB766 /* OIDRegistrationResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2980A0A5CA912C4B704DFFDCCB19CFC1 /* OIDRegistrationResponse.m */; }; + EF92363675B8414D14801D29A288FA31 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B74456FC79B31A118299C8CFA29E02F /* SafariServices.framework */; }; + F246177F1215CDBE9AB3B1BB58624C04 /* OIDGrantTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 268A2998A4DDBB2C0AC87F587AA2DEC5 /* OIDGrantTypes.m */; }; + F3D2632F5565AFA96A15FBA9EAFFF410 /* AppAuth-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DB41389C8E5C0DB7BEE25B19223EE498 /* AppAuth-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F47BF5598DBEDEB0A44679023AFC7E66 /* OIDIDToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EDE178F2A7F6AF86943F64AE4F32B6A /* OIDIDToken.m */; }; + F598CB205564B44BC8BC6B774DEB1B62 /* OIDExternalUserAgentRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 022E8B0795B3B3AAA93ABC1FF0A540A5 /* OIDExternalUserAgentRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F63C85CE50933EE6BDB86F9C87253F1C /* OIDEndSessionResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 144A8518E212ECDBCB6C20D9C15B5A57 /* OIDEndSessionResponse.m */; }; + F677A4A964B9095056DA905477CE4F3C /* AppAuth.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DE8EC5AEF87FED97A80DA8C7C4B8602 /* AppAuth.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F6C1C1A047487F90686267300F19F1B9 /* GTMSessionFetcherLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F5344C9A8985BC64A8826434AE14D90 /* GTMSessionFetcherLogging.m */; }; + FF06333F8E0F64CF45567B6419768574 /* Pods-mentorship ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D91E1E6D5C5C883EC5FF59B05091CB4 /* Pods-mentorship ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 01AC7A177511421386583884F07403DD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CAD3534FC55B0333104E5117C0A9A324; + remoteInfo = GoogleSignIn; + }; + 0EDCF38BA44E7804550420B1923AE7C0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5C642AA10FB29936669CC269F42079C6; + remoteInfo = AppAuth; + }; + 255C113C5B8CEBDE5DFD4788BBC6FC4B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D676E21115185671D7258A56944ABE98; + remoteInfo = GTMSessionFetcher; + }; + 26DE710C83D26F0E3253DA99DD52D8F2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8627999EF1D5E93E13DAFF580DA8CDCF; + remoteInfo = GTMAppAuth; + }; + 2F6F337FCAEA9A42D506A040A3DF35B8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5C642AA10FB29936669CC269F42079C6; + remoteInfo = AppAuth; + }; + 380F79DB94E2732DF6F327B9142D4189 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E669114D21D744114419853D6A306777; + remoteInfo = "Pods-mentorship ios"; + }; + 69653A44A453E231003B2B78EACD2801 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8627999EF1D5E93E13DAFF580DA8CDCF; + remoteInfo = GTMAppAuth; + }; + 786BDA01217A80D3A27F97A9E29C36AB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D676E21115185671D7258A56944ABE98; + remoteInfo = GTMSessionFetcher; + }; + 96C4B52CEBD25FE7612CDFAC4EBB56D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5C642AA10FB29936669CC269F42079C6; + remoteInfo = AppAuth; + }; + 9C295E8BC77DF498D6BDAD99C4F660FF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CAD3534FC55B0333104E5117C0A9A324; + remoteInfo = GoogleSignIn; + }; + A720C631E1946701F927ADC25CF2A59E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D676E21115185671D7258A56944ABE98; + remoteInfo = GTMSessionFetcher; + }; + CFBE3CB2F286EF0D95A2ACDEBE0C1014 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8627999EF1D5E93E13DAFF580DA8CDCF; + remoteInfo = GTMAppAuth; + }; + D3B98C3FD3F5938B890DF7680BBB7E42 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D676E21115185671D7258A56944ABE98; + remoteInfo = GTMSessionFetcher; + }; + E8554359B2E0525707CC4735C3DFE1CE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5C642AA10FB29936669CC269F42079C6; + remoteInfo = AppAuth; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 022E8B0795B3B3AAA93ABC1FF0A540A5 /* OIDExternalUserAgentRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgentRequest.h; path = Source/AppAuthCore/OIDExternalUserAgentRequest.h; sourceTree = ""; }; + 05F56E8DA7268229361868CD6D5EFBF1 /* OIDRegistrationResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDRegistrationResponse.h; path = Source/AppAuthCore/OIDRegistrationResponse.h; sourceTree = ""; }; + 07CA8B3AD67B29339CE5BF50DD1F4181 /* Pods-mentorship iosTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-mentorship iosTests-acknowledgements.plist"; sourceTree = ""; }; + 09DB544D3B1B801F759CC3577F7BFAE2 /* OIDAuthStateChangeDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthStateChangeDelegate.h; path = Source/AppAuthCore/OIDAuthStateChangeDelegate.h; sourceTree = ""; }; + 0C0AAACBC37788AED131E7B8D0C77CC4 /* Pods-mentorship ios-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-mentorship ios-resources.sh"; sourceTree = ""; }; + 0C6E88A1D88407285CECA9C9E47BFB6C /* OIDErrorUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDErrorUtilities.h; path = Source/AppAuthCore/OIDErrorUtilities.h; sourceTree = ""; }; + 0CFB68E7A5CA39188D89F85913215076 /* GTMAppAuthFetcherAuthorization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMAppAuthFetcherAuthorization.m; path = Source/GTMAppAuthFetcherAuthorization.m; sourceTree = ""; }; + 0D48485D1A687CC167B4E447E691B6EF /* OIDAuthorizationService+IOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OIDAuthorizationService+IOS.m"; path = "Source/AppAuth/iOS/OIDAuthorizationService+IOS.m"; sourceTree = ""; }; + 0EF43F7F5C2500641CE581C5997CE1BD /* Pods-mentorship ios-mentorship iosUITests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-mentorship ios-mentorship iosUITests-resources.sh"; sourceTree = ""; }; + 104D3E9636F5950B3E5E52D45BE250BE /* Pods-mentorship ios-mentorship iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-mentorship ios-mentorship iosUITests.debug.xcconfig"; sourceTree = ""; }; + 1125054B815CBABCD555A9C85116A8C5 /* OIDScopeUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDScopeUtilities.m; path = Source/AppAuthCore/OIDScopeUtilities.m; sourceTree = ""; }; + 11AE9BE473FE105DDB322875E4268930 /* GTMKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMKeychain.h; path = Source/GTMKeychain.h; sourceTree = ""; }; + 144A8518E212ECDBCB6C20D9C15B5A57 /* OIDEndSessionResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDEndSessionResponse.m; path = Source/AppAuthCore/OIDEndSessionResponse.m; sourceTree = ""; }; + 17ED11E753F5ED39DCB3A46E8455EA0E /* OIDExternalUserAgentIOSCustomBrowser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgentIOSCustomBrowser.h; path = Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.h; sourceTree = ""; }; + 18492EC0DB790FFE76C1FB289EF489B5 /* OIDTokenRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDTokenRequest.h; path = Source/AppAuthCore/OIDTokenRequest.h; sourceTree = ""; }; + 221BBB3F1D598981E3CDAF4EE8C85BB7 /* OIDClientMetadataParameters.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDClientMetadataParameters.h; path = Source/AppAuthCore/OIDClientMetadataParameters.h; sourceTree = ""; }; + 22CAD830484EBA2C090D8883F1AD9B11 /* Pods-mentorship iosTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-mentorship iosTests-Info.plist"; sourceTree = ""; }; + 23E453339F50955000DE65F30282EF6F /* GoogleSignIn.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleSignIn.debug.xcconfig; sourceTree = ""; }; + 25A1A434C35BDFA6CA4D6AFCE828FE18 /* Pods-mentorship ios-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-mentorship ios-acknowledgements.plist"; sourceTree = ""; }; + 25D1D33BE58E2175C32DC08C25152B91 /* OIDGrantTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDGrantTypes.h; path = Source/AppAuthCore/OIDGrantTypes.h; sourceTree = ""; }; + 26108ECE6955E499A7A690C9E6FC537D /* GoogleSignIn.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleSignIn.release.xcconfig; sourceTree = ""; }; + 2675390570F0CB22B1A5323F499195D9 /* GTMOAuth2KeychainCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMOAuth2KeychainCompatibility.h; path = Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h; sourceTree = ""; }; + 268A2998A4DDBB2C0AC87F587AA2DEC5 /* OIDGrantTypes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDGrantTypes.m; path = Source/AppAuthCore/OIDGrantTypes.m; sourceTree = ""; }; + 26978B4C518564639BE8B2386D94265E /* Pods-mentorship ios-mentorship iosUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-mentorship ios-mentorship iosUITests-dummy.m"; sourceTree = ""; }; + 26FD7859CD2E03E7FC8158229A0568A8 /* OIDAuthorizationService+IOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "OIDAuthorizationService+IOS.h"; path = "Source/AppAuth/iOS/OIDAuthorizationService+IOS.h"; sourceTree = ""; }; + 27B32EA1466E95564B5FAD5E821AFFCB /* OIDTokenResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDTokenResponse.h; path = Source/AppAuthCore/OIDTokenResponse.h; sourceTree = ""; }; + 2822649A60BD61AEA45CA5F8F59D7E7D /* Pods-mentorship ios-mentorship iosUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-mentorship ios-mentorship iosUITests.modulemap"; sourceTree = ""; }; + 2886E3CC8B435722D172AFD44E448283 /* GTMGatherInputStream.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMGatherInputStream.m; path = Source/GTMGatherInputStream.m; sourceTree = ""; }; + 2980A0A5CA912C4B704DFFDCCB19CFC1 /* OIDRegistrationResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDRegistrationResponse.m; path = Source/AppAuthCore/OIDRegistrationResponse.m; sourceTree = ""; }; + 29E999D050BC6AC2E2B4658E5450C009 /* GTMReadMonitorInputStream.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMReadMonitorInputStream.h; path = Source/GTMReadMonitorInputStream.h; sourceTree = ""; }; + 2AFA720E1B4DE82D628D142989729554 /* OIDDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDDefines.h; path = Source/AppAuthCore/OIDDefines.h; sourceTree = ""; }; + 2BD49343D0716132373053EB4843C9F3 /* Pods-mentorship iosTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-mentorship iosTests-dummy.m"; sourceTree = ""; }; + 2E0A983AC48FC2B1ED279AE8F7E10446 /* Pods-mentorship ios-mentorship iosUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-mentorship ios-mentorship iosUITests-acknowledgements.markdown"; sourceTree = ""; }; + 2EDE178F2A7F6AF86943F64AE4F32B6A /* OIDIDToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDIDToken.m; path = Source/AppAuthCore/OIDIDToken.m; sourceTree = ""; }; + 3003261E01B3BCA95DBA61082A8D6B15 /* OIDFieldMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDFieldMapping.h; path = Source/AppAuthCore/OIDFieldMapping.h; sourceTree = ""; }; + 301BBC564FA7E1A935A554E14F038BD2 /* GTMAppAuth-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMAppAuth-umbrella.h"; sourceTree = ""; }; + 305D7A0C5FB8E82571085947BC82C642 /* OIDExternalUserAgentIOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgentIOS.h; path = Source/AppAuth/iOS/OIDExternalUserAgentIOS.h; sourceTree = ""; }; + 30A1D65779BE9FA691AEBD03B5455BBB /* Pods-mentorship ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-mentorship ios.release.xcconfig"; sourceTree = ""; }; + 32CDEF47E6D0D52EEE7CB6FC86090D58 /* OIDAuthorizationResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthorizationResponse.m; path = Source/AppAuthCore/OIDAuthorizationResponse.m; sourceTree = ""; }; + 3328F331E40151217475F5186FA7E7A7 /* GTMAppAuth.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMAppAuth.release.xcconfig; sourceTree = ""; }; + 36B1B635135A16FECC5DEC33BB89C9FE /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 38E47E42BE9D59EA60D119AF99378190 /* Pods-mentorship iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-mentorship iosTests.release.xcconfig"; sourceTree = ""; }; + 394F0AB33B23B23E9F0AB42DD0AF2641 /* GTMAppAuth-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GTMAppAuth-Info.plist"; sourceTree = ""; }; + 3BA62B607F0873F92288CE7D791F0C26 /* Pods-mentorship ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-mentorship ios-Info.plist"; sourceTree = ""; }; + 3D706C0B2250B3275152E7E01EFD89A4 /* OIDError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDError.h; path = Source/AppAuthCore/OIDError.h; sourceTree = ""; }; + 3D7C16DDFF54708124C71B98D3015298 /* Pods-mentorship ios-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-mentorship ios-acknowledgements.markdown"; sourceTree = ""; }; + 3F30E37336A67E34D69CE3F6697404B8 /* OIDTokenUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDTokenUtilities.h; path = Source/AppAuthCore/OIDTokenUtilities.h; sourceTree = ""; }; + 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4082F9791C7B3B032996A82B6617632F /* GTMOAuth2KeychainCompatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMOAuth2KeychainCompatibility.m; path = Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m; sourceTree = ""; }; + 41C243F924B1681C225C02C7D6137956 /* GTMMIMEDocument.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMMIMEDocument.m; path = Source/GTMMIMEDocument.m; sourceTree = ""; }; + 42F35D3AD5A478242B95522CA059B5D9 /* OIDResponseTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDResponseTypes.h; path = Source/AppAuthCore/OIDResponseTypes.h; sourceTree = ""; }; + 476A4E97C23078E3B85FEF92AF4D6F62 /* GTMAppAuthFetcherAuthorization+Keychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GTMAppAuthFetcherAuthorization+Keychain.h"; path = "Source/GTMAppAuthFetcherAuthorization+Keychain.h"; sourceTree = ""; }; + 4807CDA153392A9CAE6AEC4C6E01E9E7 /* GoogleSignIn.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleSignIn.framework; path = Frameworks/GoogleSignIn.framework; sourceTree = ""; }; + 491A043663A145B4E13044E1C11DF1B8 /* GTMSessionFetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcher.m; path = Source/GTMSessionFetcher.m; sourceTree = ""; }; + 493064774FA103423D33D9F2E8489FF3 /* OIDTokenResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDTokenResponse.m; path = Source/AppAuthCore/OIDTokenResponse.m; sourceTree = ""; }; + 4B96527396460EFCD85BCB4CFEA21BB8 /* OIDScopeUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDScopeUtilities.h; path = Source/AppAuthCore/OIDScopeUtilities.h; sourceTree = ""; }; + 51B30FDB0F55755AE165583A4942695F /* OIDIDToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDIDToken.h; path = Source/AppAuthCore/OIDIDToken.h; sourceTree = ""; }; + 5321FF27F66FC5A2D3BD99190EDD8598 /* Pods-mentorship ios-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-mentorship ios-frameworks.sh"; sourceTree = ""; }; + 534513D6AB6E325748777DB2920D6D37 /* Pods-mentorship ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-mentorship ios.debug.xcconfig"; sourceTree = ""; }; + 56FD8760A2AC82EC108EE1DD13BA7BA3 /* GTMSessionFetcher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMSessionFetcher-prefix.pch"; sourceTree = ""; }; + 58675B60CB9308C7F6CF1E590479D63A /* OIDURLQueryComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDURLQueryComponent.m; path = Source/AppAuthCore/OIDURLQueryComponent.m; sourceTree = ""; }; + 58F025C65EC807FFAC14F520B0DA02CF /* Pods-mentorship iosTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-mentorship iosTests-umbrella.h"; sourceTree = ""; }; + 5B74456FC79B31A118299C8CFA29E02F /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/SafariServices.framework; sourceTree = DEVELOPER_DIR; }; + 5BB1F49651B7E6C2A30CD99A9E0B4CF0 /* Pods-mentorship ios-mentorship iosUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-mentorship ios-mentorship iosUITests-umbrella.h"; sourceTree = ""; }; + 5F32C739DF04BB1DCE9756B9874F9B55 /* OIDExternalUserAgent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgent.h; path = Source/AppAuthCore/OIDExternalUserAgent.h; sourceTree = ""; }; + 5F5344C9A8985BC64A8826434AE14D90 /* GTMSessionFetcherLogging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcherLogging.m; path = Source/GTMSessionFetcherLogging.m; sourceTree = ""; }; + 5F96B3A022E0040FBB3194E3231BBF9B /* GTMSessionFetcher.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMSessionFetcher.release.xcconfig; sourceTree = ""; }; + 606A63F7D678535DD67E9BBC16DBC3F9 /* AppAuth-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AppAuth-prefix.pch"; sourceTree = ""; }; + 60726EAF3A48B3A5DCFD505280476615 /* Pods-mentorship iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-mentorship iosTests.debug.xcconfig"; sourceTree = ""; }; + 60899ED9DED004E7B0D816E6BA0FBE17 /* OIDErrorUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDErrorUtilities.m; path = Source/AppAuthCore/OIDErrorUtilities.m; sourceTree = ""; }; + 60A130AEE49119150B8AD52A61A362CA /* OIDAuthorizationService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationService.h; path = Source/AppAuthCore/OIDAuthorizationService.h; sourceTree = ""; }; + 6723353B59967A2F8CE5ADF84C4F9434 /* Pods_mentorship_ios_mentorship_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_mentorship_ios_mentorship_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6B35DF42BAB316E651B49CAD522D30D2 /* GTMSessionFetcherService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcherService.m; path = Source/GTMSessionFetcherService.m; sourceTree = ""; }; + 6C903BCB7155D03E0DE50753C984C025 /* OIDEndSessionRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDEndSessionRequest.m; path = Source/AppAuthCore/OIDEndSessionRequest.m; sourceTree = ""; }; + 6DAA0A5F9F8461368D30F0690494CEF1 /* OIDExternalUserAgentCatalyst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDExternalUserAgentCatalyst.m; path = Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.m; sourceTree = ""; }; + 6F1D3C4CB0ACD5E0120EC1686BB130F1 /* OIDAuthorizationRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthorizationRequest.m; path = Source/AppAuthCore/OIDAuthorizationRequest.m; sourceTree = ""; }; + 6FB2DA57F1766D527F365AFDF52A72D6 /* OIDExternalUserAgentIOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDExternalUserAgentIOS.m; path = Source/AppAuth/iOS/OIDExternalUserAgentIOS.m; sourceTree = ""; }; + 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GTMAppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 716060E95444EF216AACA0CB19A8327F /* AppAuth-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AppAuth-dummy.m"; sourceTree = ""; }; + 7263B6009980D6AE2C85F9ED19236EE0 /* Pods-mentorship iosTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-mentorship iosTests-acknowledgements.markdown"; sourceTree = ""; }; + 72CDB17148C70EAFA425064D46E0AB43 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 75CE3C661C504B77322B2D9258F6D617 /* GTMSessionFetcher-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GTMSessionFetcher-Info.plist"; sourceTree = ""; }; + 7604721BAE0C9863C9871789F8BF5C35 /* GTMSessionUploadFetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionUploadFetcher.m; path = Source/GTMSessionUploadFetcher.m; sourceTree = ""; }; + 78B0DD0227B7E59711E1B5ED8247519F /* OIDAuthorizationService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthorizationService.m; path = Source/AppAuthCore/OIDAuthorizationService.m; sourceTree = ""; }; + 7AC153978EAF0C98144886FEBC893ABE /* Pods-mentorship ios-mentorship iosUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-mentorship ios-mentorship iosUITests-Info.plist"; sourceTree = ""; }; + 7C8E8CAA1727B3C595EF995FFA650CD6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 7FA8AAFA32ACE623962A8E103480262D /* OIDAuthStateErrorDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthStateErrorDelegate.h; path = Source/AppAuthCore/OIDAuthStateErrorDelegate.h; sourceTree = ""; }; + 7FDB4F9D06C19DAFFC1DF358C8CF570E /* OIDExternalUserAgentSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgentSession.h; path = Source/AppAuthCore/OIDExternalUserAgentSession.h; sourceTree = ""; }; + 85D0D1BFD4E9D0872A7069F4560FA17B /* GTMAppAuth.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GTMAppAuth.modulemap; sourceTree = ""; }; + 861F1981C779535A562232F6DECA4B4E /* OIDFieldMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDFieldMapping.m; path = Source/AppAuthCore/OIDFieldMapping.m; sourceTree = ""; }; + 8D91E1E6D5C5C883EC5FF59B05091CB4 /* Pods-mentorship ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-mentorship ios-umbrella.h"; sourceTree = ""; }; + 8DE351FA8C920C81A50ADA6FF5326C65 /* OIDScopes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDScopes.h; path = Source/AppAuthCore/OIDScopes.h; sourceTree = ""; }; + 8E09B339B3377120973AF1950AF17CD7 /* AppAuth-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AppAuth-Info.plist"; sourceTree = ""; }; + 9145CB48AC842C88E43BB74ECE14B3B3 /* Pods-mentorship ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-mentorship ios.modulemap"; sourceTree = ""; }; + 917B0E1C097160C75E249E040413F058 /* AppAuth.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppAuth.release.xcconfig; sourceTree = ""; }; + 947742DE685D3112A4947B5D79CC0C57 /* OIDTokenUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDTokenUtilities.m; path = Source/AppAuthCore/OIDTokenUtilities.m; sourceTree = ""; }; + 95B6991B778BE3F367235DBDC2021762 /* OIDURLSessionProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDURLSessionProvider.h; path = Source/AppAuthCore/OIDURLSessionProvider.h; sourceTree = ""; }; + 96CDC5766FB3A0359F50EA531C9400CC /* OIDRegistrationRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDRegistrationRequest.m; path = Source/AppAuthCore/OIDRegistrationRequest.m; sourceTree = ""; }; + 9A5671479D49B01EA29DC81E86747A24 /* GTMAppAuth-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GTMAppAuth-dummy.m"; sourceTree = ""; }; + 9C04B2D71B76EC26B743C01F9E9BE912 /* OIDScopes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDScopes.m; path = Source/AppAuthCore/OIDScopes.m; sourceTree = ""; }; + 9C28FCC1CEF4208E89FACA0CB2FDCB48 /* OIDURLQueryComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDURLQueryComponent.h; path = Source/AppAuthCore/OIDURLQueryComponent.h; sourceTree = ""; }; + 9CE4F8EF50120F68B743B907FC614C98 /* GTMReadMonitorInputStream.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMReadMonitorInputStream.m; path = Source/GTMReadMonitorInputStream.m; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9DE8EC5AEF87FED97A80DA8C7C4B8602 /* AppAuth.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AppAuth.h; path = Source/AppAuth.h; sourceTree = ""; }; + A0E687C93BF9BC8A38F9F3D5C019E6D0 /* OIDExternalUserAgentCatalyst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDExternalUserAgentCatalyst.h; path = Source/AppAuth/iOS/OIDExternalUserAgentCatalyst.h; sourceTree = ""; }; + A1A2046586D911B298FE96991C14207A /* OIDAuthState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthState.h; path = Source/AppAuthCore/OIDAuthState.h; sourceTree = ""; }; + A475F803F0CAA576ABB9F5910018FE04 /* OIDAuthorizationResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationResponse.h; path = Source/AppAuthCore/OIDAuthorizationResponse.h; sourceTree = ""; }; + A63891EFBD9E2B177549512671020B36 /* OIDExternalUserAgentIOSCustomBrowser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDExternalUserAgentIOSCustomBrowser.m; path = Source/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m; sourceTree = ""; }; + A7AA2B0D2F921EFAE386870CD4175555 /* GTMSessionUploadFetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionUploadFetcher.h; path = Source/GTMSessionUploadFetcher.h; sourceTree = ""; }; + A7AA99808D37E94902B0E4448AB29ADE /* AppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ABE775C88B3DFE4CE3E1358EFB6FC3CA /* OIDClientMetadataParameters.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDClientMetadataParameters.m; path = Source/AppAuthCore/OIDClientMetadataParameters.m; sourceTree = ""; }; + ACCBA4B91DFEFC2176100A70B856BC6A /* OIDResponseTypes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDResponseTypes.m; path = Source/AppAuthCore/OIDResponseTypes.m; sourceTree = ""; }; + B01846C50A6E49C262464A2FBE59F1E9 /* AppAuth.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppAuth.debug.xcconfig; sourceTree = ""; }; + B0E52B096DDF89977735505C25E2307D /* OIDServiceConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDServiceConfiguration.h; path = Source/AppAuthCore/OIDServiceConfiguration.h; sourceTree = ""; }; + B1C0F3D9E0A9BFF24C88E6E03E929131 /* Pods-mentorship ios-mentorship iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-mentorship ios-mentorship iosUITests.release.xcconfig"; sourceTree = ""; }; + B1DCCC57B7C242E3D54FFAD8890F1CDF /* GTMSessionFetcher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GTMSessionFetcher-dummy.m"; sourceTree = ""; }; + B3DCE7187E04CC451FE91221AF6E4B56 /* OIDTokenRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDTokenRequest.m; path = Source/AppAuthCore/OIDTokenRequest.m; sourceTree = ""; }; + B5C23FDD115D6C6944C9C16DF0A248E4 /* OIDError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDError.m; path = Source/AppAuthCore/OIDError.m; sourceTree = ""; }; + BA1D24E57164F99EF8C7E3CA1804BD42 /* GTMGatherInputStream.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMGatherInputStream.h; path = Source/GTMGatherInputStream.h; sourceTree = ""; }; + BB26709A53BE378F14D172F7831ADAF9 /* Pods-mentorship ios-mentorship iosUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-mentorship ios-mentorship iosUITests-frameworks.sh"; sourceTree = ""; }; + BBF941AEBADD9F6AD4538FE8788888F6 /* GTMKeychain_iOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMKeychain_iOS.m; path = Source/iOS/GTMKeychain_iOS.m; sourceTree = ""; }; + BDE780ECB5DE32F67CA9FC18B0E78C80 /* Pods-mentorship ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-mentorship ios-dummy.m"; sourceTree = ""; }; + BF78AC6BAB39C75DEAC27C39FD0C90E6 /* OIDRegistrationRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDRegistrationRequest.h; path = Source/AppAuthCore/OIDRegistrationRequest.h; sourceTree = ""; }; + C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GTMSessionFetcher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C279CC1E3D7BE35AB42CE83FF5907FB5 /* Pods_mentorship_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_mentorship_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C415FC7125A8E8F9E00115D2158B5E98 /* GoogleSignIn.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = GoogleSignIn.bundle; path = Resources/GoogleSignIn.bundle; sourceTree = ""; }; + CACC84D9888E5F02DFB66C1EFC6B53C2 /* GTMSessionFetcher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GTMSessionFetcher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D04E76110A30D474F45397417CF66599 /* GTMAppAuth.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMAppAuth.debug.xcconfig; sourceTree = ""; }; + D182BA1346A18D9DAB46AE36C1E2F5F5 /* Pods-mentorship ios-mentorship iosUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-mentorship ios-mentorship iosUITests-acknowledgements.plist"; sourceTree = ""; }; + D92C3A75664A17434FB87EAA1C9F736F /* GTMSessionFetcherService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcherService.h; path = Source/GTMSessionFetcherService.h; sourceTree = ""; }; + DAA391547896D3DFD85B0C72E39C34AD /* GTMSessionFetcherLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcherLogging.h; path = Source/GTMSessionFetcherLogging.h; sourceTree = ""; }; + DB41389C8E5C0DB7BEE25B19223EE498 /* AppAuth-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AppAuth-umbrella.h"; sourceTree = ""; }; + DC804BAE68E3036FAB3CA483E3B5D4D5 /* OIDURLSessionProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDURLSessionProvider.m; path = Source/AppAuthCore/OIDURLSessionProvider.m; sourceTree = ""; }; + DE6C8BFBB00A11E520F0E20A4B44E172 /* OIDServiceDiscovery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDServiceDiscovery.h; path = Source/AppAuthCore/OIDServiceDiscovery.h; sourceTree = ""; }; + DFA00892743197B5F9646DD66F230A34 /* AppAuth.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AppAuth.modulemap; sourceTree = ""; }; + E49C7D735C96D80767D1DE34A6447961 /* GTMAppAuthFetcherAuthorization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMAppAuthFetcherAuthorization.h; path = Source/GTMAppAuthFetcherAuthorization.h; sourceTree = ""; }; + E58D2E563A823896B05C184A88BEC5F3 /* OIDAuthState+IOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OIDAuthState+IOS.m"; path = "Source/AppAuth/iOS/OIDAuthState+IOS.m"; sourceTree = ""; }; + E9C487C6396F4F34AA486FA681B36E7F /* GTMSessionFetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcher.h; path = Source/GTMSessionFetcher.h; sourceTree = ""; }; + EAED381C8A63DF974E2643895A50FC06 /* GTMAppAuth-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMAppAuth-prefix.pch"; sourceTree = ""; }; + EB9B60E189FAC21B2C9104C7DAB0D65A /* OIDAuthState+IOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "OIDAuthState+IOS.h"; path = "Source/AppAuth/iOS/OIDAuthState+IOS.h"; sourceTree = ""; }; + EE1A963BFF40376C402DCFC8F5CFEB34 /* Pods_mentorship_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_mentorship_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EE8CD03E234491AC3FFEA89415C2EC3C /* GTMMIMEDocument.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMMIMEDocument.h; path = Source/GTMMIMEDocument.h; sourceTree = ""; }; + EEA01564A45AE0B2D7B33D0A173EDE68 /* OIDAuthState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthState.m; path = Source/AppAuthCore/OIDAuthState.m; sourceTree = ""; }; + EEA474C0422A725B8ACF1448991B3BB4 /* OIDEndSessionRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDEndSessionRequest.h; path = Source/AppAuthCore/OIDEndSessionRequest.h; sourceTree = ""; }; + EEE3EABEA79A11C08EB88A403EFA169E /* OIDAuthorizationRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationRequest.h; path = Source/AppAuthCore/OIDAuthorizationRequest.h; sourceTree = ""; }; + EEF2E161EA57E8FD07C267755E8004A3 /* OIDEndSessionResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDEndSessionResponse.h; path = Source/AppAuthCore/OIDEndSessionResponse.h; sourceTree = ""; }; + EFE65E9AF53F83E24423FA1FCEC50885 /* OIDServiceDiscovery.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDServiceDiscovery.m; path = Source/AppAuthCore/OIDServiceDiscovery.m; sourceTree = ""; }; + F1B784727061BFA4B97C8D316FDADAA9 /* AppAuthCore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AppAuthCore.h; path = Source/AppAuthCore.h; sourceTree = ""; }; + F30665C00BF13BFADDD8BECDF2C02D31 /* GTMSessionFetcher.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMSessionFetcher.debug.xcconfig; sourceTree = ""; }; + F678ABCE32389498766DDA3647223327 /* GTMAppAuthFetcherAuthorization+Keychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GTMAppAuthFetcherAuthorization+Keychain.m"; path = "Source/GTMAppAuthFetcherAuthorization+Keychain.m"; sourceTree = ""; }; + F6ECBE22F5655207E067F9EEAD60238C /* GTMSessionFetcher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMSessionFetcher-umbrella.h"; sourceTree = ""; }; + F8DB658EC192A6B16FF51B90CA4F0AE9 /* GTMAppAuth.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMAppAuth.h; path = Source/GTMAppAuth.h; sourceTree = ""; }; + FA19F308CAB86A96F87E57D22CC3C792 /* Pods-mentorship iosTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-mentorship iosTests.modulemap"; sourceTree = ""; }; + FBBFB2DBA93531F1A771C1333958547D /* OIDServiceConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDServiceConfiguration.m; path = Source/AppAuthCore/OIDServiceConfiguration.m; sourceTree = ""; }; + FF3B5B3603A180F6F37665F34A5ACE2C /* GTMSessionFetcher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GTMSessionFetcher.modulemap; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 072D6922919B2D97BDAF9CFCD9FF59C8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 77F8771176D9BE429820216FFD687D1B /* AppAuth.framework in Frameworks */, + 87A2AA12423B55AD7791A99D79534D46 /* Foundation.framework in Frameworks */, + 527B5C1B1C9E916C516A73E93CA8BB62 /* GTMSessionFetcher.framework in Frameworks */, + 4609E25A2C08EDA3E3729934BC90DCDE /* SafariServices.framework in Frameworks */, + 7F99EA6887D99503660FCDF1DD7A3E04 /* Security.framework in Frameworks */, + C2AABCD1F39FCA174A0C33D19E160BBF /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 16CF22217BEA907AC6550A5C485822F1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 71BCEC30B9A618753E543ED8C606B9F8 /* Foundation.framework in Frameworks */, + EF92363675B8414D14801D29A288FA31 /* SafariServices.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 65E7CB4C247125E90090B9CCFE914B70 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DC4164A4DCDACFD4960D61FA1DA61A01 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D6B9E1BD179EF938832330D32B26D5B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7F7C8089080C1BB6D4AD94CE2AAB1749 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 98AB3B5AFE6FC96417A7790B3B87727A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DD2342949A98F8B328CA82C88F1742D /* Foundation.framework in Frameworks */, + 935771162DF644301DCB001153BE1A4A /* Security.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A78E5BE81BADF2BF1190CD4D5BFF614B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F5E49B223BE8067ACA22E443E6125A7 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 04B7C86BBAB9BEA20DEB5F3D6A99A300 /* Full */ = { + isa = PBXGroup; + children = ( + BA1D24E57164F99EF8C7E3CA1804BD42 /* GTMGatherInputStream.h */, + 2886E3CC8B435722D172AFD44E448283 /* GTMGatherInputStream.m */, + EE8CD03E234491AC3FFEA89415C2EC3C /* GTMMIMEDocument.h */, + 41C243F924B1681C225C02C7D6137956 /* GTMMIMEDocument.m */, + 29E999D050BC6AC2E2B4658E5450C009 /* GTMReadMonitorInputStream.h */, + 9CE4F8EF50120F68B743B907FC614C98 /* GTMReadMonitorInputStream.m */, + ); + name = Full; + sourceTree = ""; + }; + 1DDF0144637DFE93214B78D4ED64983F /* Pods */ = { + isa = PBXGroup; + children = ( + 33A01798A7187AC069E1DF9406C8CF26 /* AppAuth */, + E6E0000435D7AF21058FFF93B939D6BF /* GoogleSignIn */, + 8335AE7F253BD12530205BA755CBEE2E /* GTMAppAuth */, + 820BA1C7E4FB79925E5CC352B2FBD955 /* GTMSessionFetcher */, + ); + name = Pods; + sourceTree = ""; + }; + 2E12181945F4538E0856F3B889F24F2C /* Frameworks */ = { + isa = PBXGroup; + children = ( + A7AA99808D37E94902B0E4448AB29ADE /* AppAuth.framework */, + CACC84D9888E5F02DFB66C1EFC6B53C2 /* GTMSessionFetcher.framework */, + B104FE9AC033593E2BA9A15D5D3E7AF3 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 30A371940DAE61C2B0EE55ED212238B4 /* Pods-mentorship iosTests */ = { + isa = PBXGroup; + children = ( + FA19F308CAB86A96F87E57D22CC3C792 /* Pods-mentorship iosTests.modulemap */, + 7263B6009980D6AE2C85F9ED19236EE0 /* Pods-mentorship iosTests-acknowledgements.markdown */, + 07CA8B3AD67B29339CE5BF50DD1F4181 /* Pods-mentorship iosTests-acknowledgements.plist */, + 2BD49343D0716132373053EB4843C9F3 /* Pods-mentorship iosTests-dummy.m */, + 22CAD830484EBA2C090D8883F1AD9B11 /* Pods-mentorship iosTests-Info.plist */, + 58F025C65EC807FFAC14F520B0DA02CF /* Pods-mentorship iosTests-umbrella.h */, + 60726EAF3A48B3A5DCFD505280476615 /* Pods-mentorship iosTests.debug.xcconfig */, + 38E47E42BE9D59EA60D119AF99378190 /* Pods-mentorship iosTests.release.xcconfig */, + ); + name = "Pods-mentorship iosTests"; + path = "Target Support Files/Pods-mentorship iosTests"; + sourceTree = ""; + }; + 33A01798A7187AC069E1DF9406C8CF26 /* AppAuth */ = { + isa = PBXGroup; + children = ( + A0F01145C3494D26B9357769E23A0088 /* Core */, + 7524F4E91674DAE5430D2DDB76D289CA /* ExternalUserAgent */, + 49CB805DCCB2EC9B4A93B4F84F4CEDBF /* Support Files */, + ); + path = AppAuth; + sourceTree = ""; + }; + 476DEC641E636B3A996D67C3BC4C79FB /* Support Files */ = { + isa = PBXGroup; + children = ( + FF3B5B3603A180F6F37665F34A5ACE2C /* GTMSessionFetcher.modulemap */, + B1DCCC57B7C242E3D54FFAD8890F1CDF /* GTMSessionFetcher-dummy.m */, + 75CE3C661C504B77322B2D9258F6D617 /* GTMSessionFetcher-Info.plist */, + 56FD8760A2AC82EC108EE1DD13BA7BA3 /* GTMSessionFetcher-prefix.pch */, + F6ECBE22F5655207E067F9EEAD60238C /* GTMSessionFetcher-umbrella.h */, + F30665C00BF13BFADDD8BECDF2C02D31 /* GTMSessionFetcher.debug.xcconfig */, + 5F96B3A022E0040FBB3194E3231BBF9B /* GTMSessionFetcher.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/GTMSessionFetcher"; + sourceTree = ""; + }; + 49CB805DCCB2EC9B4A93B4F84F4CEDBF /* Support Files */ = { + isa = PBXGroup; + children = ( + DFA00892743197B5F9646DD66F230A34 /* AppAuth.modulemap */, + 716060E95444EF216AACA0CB19A8327F /* AppAuth-dummy.m */, + 8E09B339B3377120973AF1950AF17CD7 /* AppAuth-Info.plist */, + 606A63F7D678535DD67E9BBC16DBC3F9 /* AppAuth-prefix.pch */, + DB41389C8E5C0DB7BEE25B19223EE498 /* AppAuth-umbrella.h */, + B01846C50A6E49C262464A2FBE59F1E9 /* AppAuth.debug.xcconfig */, + 917B0E1C097160C75E249E040413F058 /* AppAuth.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AppAuth"; + sourceTree = ""; + }; + 5A68FBBAA221C910949B030A75EE83A5 /* Pods-mentorship ios */ = { + isa = PBXGroup; + children = ( + 9145CB48AC842C88E43BB74ECE14B3B3 /* Pods-mentorship ios.modulemap */, + 3D7C16DDFF54708124C71B98D3015298 /* Pods-mentorship ios-acknowledgements.markdown */, + 25A1A434C35BDFA6CA4D6AFCE828FE18 /* Pods-mentorship ios-acknowledgements.plist */, + BDE780ECB5DE32F67CA9FC18B0E78C80 /* Pods-mentorship ios-dummy.m */, + 5321FF27F66FC5A2D3BD99190EDD8598 /* Pods-mentorship ios-frameworks.sh */, + 3BA62B607F0873F92288CE7D791F0C26 /* Pods-mentorship ios-Info.plist */, + 0C0AAACBC37788AED131E7B8D0C77CC4 /* Pods-mentorship ios-resources.sh */, + 8D91E1E6D5C5C883EC5FF59B05091CB4 /* Pods-mentorship ios-umbrella.h */, + 534513D6AB6E325748777DB2920D6D37 /* Pods-mentorship ios.debug.xcconfig */, + 30A1D65779BE9FA691AEBD03B5455BBB /* Pods-mentorship ios.release.xcconfig */, + ); + name = "Pods-mentorship ios"; + path = "Target Support Files/Pods-mentorship ios"; + sourceTree = ""; + }; + 5F6C8F37429E7ADD29B480399FC659BB /* Resources */ = { + isa = PBXGroup; + children = ( + C415FC7125A8E8F9E00115D2158B5E98 /* GoogleSignIn.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + 7524F4E91674DAE5430D2DDB76D289CA /* ExternalUserAgent */ = { + isa = PBXGroup; + children = ( + 9DE8EC5AEF87FED97A80DA8C7C4B8602 /* AppAuth.h */, + 26FD7859CD2E03E7FC8158229A0568A8 /* OIDAuthorizationService+IOS.h */, + 0D48485D1A687CC167B4E447E691B6EF /* OIDAuthorizationService+IOS.m */, + EB9B60E189FAC21B2C9104C7DAB0D65A /* OIDAuthState+IOS.h */, + E58D2E563A823896B05C184A88BEC5F3 /* OIDAuthState+IOS.m */, + A0E687C93BF9BC8A38F9F3D5C019E6D0 /* OIDExternalUserAgentCatalyst.h */, + 6DAA0A5F9F8461368D30F0690494CEF1 /* OIDExternalUserAgentCatalyst.m */, + 305D7A0C5FB8E82571085947BC82C642 /* OIDExternalUserAgentIOS.h */, + 6FB2DA57F1766D527F365AFDF52A72D6 /* OIDExternalUserAgentIOS.m */, + 17ED11E753F5ED39DCB3A46E8455EA0E /* OIDExternalUserAgentIOSCustomBrowser.h */, + A63891EFBD9E2B177549512671020B36 /* OIDExternalUserAgentIOSCustomBrowser.m */, + ); + name = ExternalUserAgent; + sourceTree = ""; + }; + 7C3A1BD6691E2859FAEF7B48CEEA0CC0 /* Core */ = { + isa = PBXGroup; + children = ( + E9C487C6396F4F34AA486FA681B36E7F /* GTMSessionFetcher.h */, + 491A043663A145B4E13044E1C11DF1B8 /* GTMSessionFetcher.m */, + DAA391547896D3DFD85B0C72E39C34AD /* GTMSessionFetcherLogging.h */, + 5F5344C9A8985BC64A8826434AE14D90 /* GTMSessionFetcherLogging.m */, + D92C3A75664A17434FB87EAA1C9F736F /* GTMSessionFetcherService.h */, + 6B35DF42BAB316E651B49CAD522D30D2 /* GTMSessionFetcherService.m */, + A7AA2B0D2F921EFAE386870CD4175555 /* GTMSessionUploadFetcher.h */, + 7604721BAE0C9863C9871789F8BF5C35 /* GTMSessionUploadFetcher.m */, + ); + name = Core; + sourceTree = ""; + }; + 820BA1C7E4FB79925E5CC352B2FBD955 /* GTMSessionFetcher */ = { + isa = PBXGroup; + children = ( + 7C3A1BD6691E2859FAEF7B48CEEA0CC0 /* Core */, + 04B7C86BBAB9BEA20DEB5F3D6A99A300 /* Full */, + 476DEC641E636B3A996D67C3BC4C79FB /* Support Files */, + ); + path = GTMSessionFetcher; + sourceTree = ""; + }; + 8335AE7F253BD12530205BA755CBEE2E /* GTMAppAuth */ = { + isa = PBXGroup; + children = ( + F8DB658EC192A6B16FF51B90CA4F0AE9 /* GTMAppAuth.h */, + E49C7D735C96D80767D1DE34A6447961 /* GTMAppAuthFetcherAuthorization.h */, + 0CFB68E7A5CA39188D89F85913215076 /* GTMAppAuthFetcherAuthorization.m */, + 476A4E97C23078E3B85FEF92AF4D6F62 /* GTMAppAuthFetcherAuthorization+Keychain.h */, + F678ABCE32389498766DDA3647223327 /* GTMAppAuthFetcherAuthorization+Keychain.m */, + 11AE9BE473FE105DDB322875E4268930 /* GTMKeychain.h */, + BBF941AEBADD9F6AD4538FE8788888F6 /* GTMKeychain_iOS.m */, + 2675390570F0CB22B1A5323F499195D9 /* GTMOAuth2KeychainCompatibility.h */, + 4082F9791C7B3B032996A82B6617632F /* GTMOAuth2KeychainCompatibility.m */, + CA40200D8E4CCAF4A8A06A5AD751445E /* Support Files */, + ); + path = GTMAppAuth; + sourceTree = ""; + }; + 89AE7F95E49B6241DDD073B701B76AE4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4807CDA153392A9CAE6AEC4C6E01E9E7 /* GoogleSignIn.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9066D3C5B2ACF2E2D48DA4559FCA79A6 /* Products */ = { + isa = PBXGroup; + children = ( + 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth.framework */, + 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth.framework */, + C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher.framework */, + C279CC1E3D7BE35AB42CE83FF5907FB5 /* Pods_mentorship_ios.framework */, + 6723353B59967A2F8CE5ADF84C4F9434 /* Pods_mentorship_ios_mentorship_iosUITests.framework */, + EE1A963BFF40376C402DCFC8F5CFEB34 /* Pods_mentorship_iosTests.framework */, + ); + name = Products; + sourceTree = ""; + }; + A0F01145C3494D26B9357769E23A0088 /* Core */ = { + isa = PBXGroup; + children = ( + F1B784727061BFA4B97C8D316FDADAA9 /* AppAuthCore.h */, + EEE3EABEA79A11C08EB88A403EFA169E /* OIDAuthorizationRequest.h */, + 6F1D3C4CB0ACD5E0120EC1686BB130F1 /* OIDAuthorizationRequest.m */, + A475F803F0CAA576ABB9F5910018FE04 /* OIDAuthorizationResponse.h */, + 32CDEF47E6D0D52EEE7CB6FC86090D58 /* OIDAuthorizationResponse.m */, + 60A130AEE49119150B8AD52A61A362CA /* OIDAuthorizationService.h */, + 78B0DD0227B7E59711E1B5ED8247519F /* OIDAuthorizationService.m */, + A1A2046586D911B298FE96991C14207A /* OIDAuthState.h */, + EEA01564A45AE0B2D7B33D0A173EDE68 /* OIDAuthState.m */, + 09DB544D3B1B801F759CC3577F7BFAE2 /* OIDAuthStateChangeDelegate.h */, + 7FA8AAFA32ACE623962A8E103480262D /* OIDAuthStateErrorDelegate.h */, + 221BBB3F1D598981E3CDAF4EE8C85BB7 /* OIDClientMetadataParameters.h */, + ABE775C88B3DFE4CE3E1358EFB6FC3CA /* OIDClientMetadataParameters.m */, + 2AFA720E1B4DE82D628D142989729554 /* OIDDefines.h */, + EEA474C0422A725B8ACF1448991B3BB4 /* OIDEndSessionRequest.h */, + 6C903BCB7155D03E0DE50753C984C025 /* OIDEndSessionRequest.m */, + EEF2E161EA57E8FD07C267755E8004A3 /* OIDEndSessionResponse.h */, + 144A8518E212ECDBCB6C20D9C15B5A57 /* OIDEndSessionResponse.m */, + 3D706C0B2250B3275152E7E01EFD89A4 /* OIDError.h */, + B5C23FDD115D6C6944C9C16DF0A248E4 /* OIDError.m */, + 0C6E88A1D88407285CECA9C9E47BFB6C /* OIDErrorUtilities.h */, + 60899ED9DED004E7B0D816E6BA0FBE17 /* OIDErrorUtilities.m */, + 5F32C739DF04BB1DCE9756B9874F9B55 /* OIDExternalUserAgent.h */, + 022E8B0795B3B3AAA93ABC1FF0A540A5 /* OIDExternalUserAgentRequest.h */, + 7FDB4F9D06C19DAFFC1DF358C8CF570E /* OIDExternalUserAgentSession.h */, + 3003261E01B3BCA95DBA61082A8D6B15 /* OIDFieldMapping.h */, + 861F1981C779535A562232F6DECA4B4E /* OIDFieldMapping.m */, + 25D1D33BE58E2175C32DC08C25152B91 /* OIDGrantTypes.h */, + 268A2998A4DDBB2C0AC87F587AA2DEC5 /* OIDGrantTypes.m */, + 51B30FDB0F55755AE165583A4942695F /* OIDIDToken.h */, + 2EDE178F2A7F6AF86943F64AE4F32B6A /* OIDIDToken.m */, + BF78AC6BAB39C75DEAC27C39FD0C90E6 /* OIDRegistrationRequest.h */, + 96CDC5766FB3A0359F50EA531C9400CC /* OIDRegistrationRequest.m */, + 05F56E8DA7268229361868CD6D5EFBF1 /* OIDRegistrationResponse.h */, + 2980A0A5CA912C4B704DFFDCCB19CFC1 /* OIDRegistrationResponse.m */, + 42F35D3AD5A478242B95522CA059B5D9 /* OIDResponseTypes.h */, + ACCBA4B91DFEFC2176100A70B856BC6A /* OIDResponseTypes.m */, + 8DE351FA8C920C81A50ADA6FF5326C65 /* OIDScopes.h */, + 9C04B2D71B76EC26B743C01F9E9BE912 /* OIDScopes.m */, + 4B96527396460EFCD85BCB4CFEA21BB8 /* OIDScopeUtilities.h */, + 1125054B815CBABCD555A9C85116A8C5 /* OIDScopeUtilities.m */, + B0E52B096DDF89977735505C25E2307D /* OIDServiceConfiguration.h */, + FBBFB2DBA93531F1A771C1333958547D /* OIDServiceConfiguration.m */, + DE6C8BFBB00A11E520F0E20A4B44E172 /* OIDServiceDiscovery.h */, + EFE65E9AF53F83E24423FA1FCEC50885 /* OIDServiceDiscovery.m */, + 18492EC0DB790FFE76C1FB289EF489B5 /* OIDTokenRequest.h */, + B3DCE7187E04CC451FE91221AF6E4B56 /* OIDTokenRequest.m */, + 27B32EA1466E95564B5FAD5E821AFFCB /* OIDTokenResponse.h */, + 493064774FA103423D33D9F2E8489FF3 /* OIDTokenResponse.m */, + 3F30E37336A67E34D69CE3F6697404B8 /* OIDTokenUtilities.h */, + 947742DE685D3112A4947B5D79CC0C57 /* OIDTokenUtilities.m */, + 9C28FCC1CEF4208E89FACA0CB2FDCB48 /* OIDURLQueryComponent.h */, + 58675B60CB9308C7F6CF1E590479D63A /* OIDURLQueryComponent.m */, + 95B6991B778BE3F367235DBDC2021762 /* OIDURLSessionProvider.h */, + DC804BAE68E3036FAB3CA483E3B5D4D5 /* OIDURLSessionProvider.m */, + ); + name = Core; + sourceTree = ""; + }; + A54249752BEA6DC9A23A623C3CDD1A3B /* Pods-mentorship ios-mentorship iosUITests */ = { + isa = PBXGroup; + children = ( + 2822649A60BD61AEA45CA5F8F59D7E7D /* Pods-mentorship ios-mentorship iosUITests.modulemap */, + 2E0A983AC48FC2B1ED279AE8F7E10446 /* Pods-mentorship ios-mentorship iosUITests-acknowledgements.markdown */, + D182BA1346A18D9DAB46AE36C1E2F5F5 /* Pods-mentorship ios-mentorship iosUITests-acknowledgements.plist */, + 26978B4C518564639BE8B2386D94265E /* Pods-mentorship ios-mentorship iosUITests-dummy.m */, + BB26709A53BE378F14D172F7831ADAF9 /* Pods-mentorship ios-mentorship iosUITests-frameworks.sh */, + 7AC153978EAF0C98144886FEBC893ABE /* Pods-mentorship ios-mentorship iosUITests-Info.plist */, + 0EF43F7F5C2500641CE581C5997CE1BD /* Pods-mentorship ios-mentorship iosUITests-resources.sh */, + 5BB1F49651B7E6C2A30CD99A9E0B4CF0 /* Pods-mentorship ios-mentorship iosUITests-umbrella.h */, + 104D3E9636F5950B3E5E52D45BE250BE /* Pods-mentorship ios-mentorship iosUITests.debug.xcconfig */, + B1C0F3D9E0A9BFF24C88E6E03E929131 /* Pods-mentorship ios-mentorship iosUITests.release.xcconfig */, + ); + name = "Pods-mentorship ios-mentorship iosUITests"; + path = "Target Support Files/Pods-mentorship ios-mentorship iosUITests"; + sourceTree = ""; + }; + B104FE9AC033593E2BA9A15D5D3E7AF3 /* iOS */ = { + isa = PBXGroup; + children = ( + 7C8E8CAA1727B3C595EF995FFA650CD6 /* Foundation.framework */, + 5B74456FC79B31A118299C8CFA29E02F /* SafariServices.framework */, + 72CDB17148C70EAFA425064D46E0AB43 /* Security.framework */, + 36B1B635135A16FECC5DEC33BB89C9FE /* SystemConfiguration.framework */, + ); + name = iOS; + sourceTree = ""; + }; + BAFB95EF2A8D57A554F6818E46AA15F7 /* Support Files */ = { + isa = PBXGroup; + children = ( + 23E453339F50955000DE65F30282EF6F /* GoogleSignIn.debug.xcconfig */, + 26108ECE6955E499A7A690C9E6FC537D /* GoogleSignIn.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/GoogleSignIn"; + sourceTree = ""; + }; + CA40200D8E4CCAF4A8A06A5AD751445E /* Support Files */ = { + isa = PBXGroup; + children = ( + 85D0D1BFD4E9D0872A7069F4560FA17B /* GTMAppAuth.modulemap */, + 9A5671479D49B01EA29DC81E86747A24 /* GTMAppAuth-dummy.m */, + 394F0AB33B23B23E9F0AB42DD0AF2641 /* GTMAppAuth-Info.plist */, + EAED381C8A63DF974E2643895A50FC06 /* GTMAppAuth-prefix.pch */, + 301BBC564FA7E1A935A554E14F038BD2 /* GTMAppAuth-umbrella.h */, + D04E76110A30D474F45397417CF66599 /* GTMAppAuth.debug.xcconfig */, + 3328F331E40151217475F5186FA7E7A7 /* GTMAppAuth.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/GTMAppAuth"; + sourceTree = ""; + }; + CD5E6003CB671A8A2198EE97725EB412 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 5A68FBBAA221C910949B030A75EE83A5 /* Pods-mentorship ios */, + A54249752BEA6DC9A23A623C3CDD1A3B /* Pods-mentorship ios-mentorship iosUITests */, + 30A371940DAE61C2B0EE55ED212238B4 /* Pods-mentorship iosTests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 2E12181945F4538E0856F3B889F24F2C /* Frameworks */, + 1DDF0144637DFE93214B78D4ED64983F /* Pods */, + 9066D3C5B2ACF2E2D48DA4559FCA79A6 /* Products */, + CD5E6003CB671A8A2198EE97725EB412 /* Targets Support Files */, + ); + sourceTree = ""; + }; + E6E0000435D7AF21058FFF93B939D6BF /* GoogleSignIn */ = { + isa = PBXGroup; + children = ( + 89AE7F95E49B6241DDD073B701B76AE4 /* Frameworks */, + 5F6C8F37429E7ADD29B480399FC659BB /* Resources */, + BAFB95EF2A8D57A554F6818E46AA15F7 /* Support Files */, + ); + path = GoogleSignIn; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 4ED0E215E12EB40D1306883BC6DB97EA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8953999C7727F2F912F6A737FD0FA0AC /* GTMGatherInputStream.h in Headers */, + A3C394C6C598DFAC45199851B2FF5F97 /* GTMMIMEDocument.h in Headers */, + 243C0608B35874A4CAB88E3951BAD348 /* GTMReadMonitorInputStream.h in Headers */, + 2D56A3ED5FE2959E984D12CC08761F44 /* GTMSessionFetcher-umbrella.h in Headers */, + 1C61400E88FC471BECD871E263FFA844 /* GTMSessionFetcher.h in Headers */, + 19B49E9D25674FD49D6819A68C8B48D8 /* GTMSessionFetcherLogging.h in Headers */, + 61D9C8902B2B3C97CD30023D322B8BAB /* GTMSessionFetcherService.h in Headers */, + 39DDFC3157A616235C548673C91887B0 /* GTMSessionUploadFetcher.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 594AF7C17FFFD6791D6EAB88E0F424FD /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + FF06333F8E0F64CF45567B6419768574 /* Pods-mentorship ios-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AF0495172B1DCF3E83F1F96FF98530FB /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + CE9462D01A9FBD478D4A0742AA127534 /* Pods-mentorship iosTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B988B1E8057F208BF303CA7151F9F8FD /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4E03547F2FCFE772ACCDA5A0F2861A21 /* GTMAppAuth-umbrella.h in Headers */, + 5D4BB578718CC33E5E14170F3E04B696 /* GTMAppAuth.h in Headers */, + 7887F7AA5B1214BF90AA09CE6CC4AECC /* GTMAppAuthFetcherAuthorization+Keychain.h in Headers */, + BF588BB40FADB1F474BB6D2BB22CAAE1 /* GTMAppAuthFetcherAuthorization.h in Headers */, + E4420DBF08343EA2886691A140BF7C3E /* GTMKeychain.h in Headers */, + AC8E8C869F03F07CB4E0018D956F8386 /* GTMOAuth2KeychainCompatibility.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BF20DD677E68B0FFF096FA87BA4F642E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F3D2632F5565AFA96A15FBA9EAFFF410 /* AppAuth-umbrella.h in Headers */, + F677A4A964B9095056DA905477CE4F3C /* AppAuth.h in Headers */, + EE191018EF34395C61D30D78FED87E45 /* AppAuthCore.h in Headers */, + 408352680097A53851035145970371B1 /* OIDAuthorizationRequest.h in Headers */, + A14710681730656A8EE4F2793773C18B /* OIDAuthorizationResponse.h in Headers */, + 013D945A6EB50B6FC9854DE84D18E44A /* OIDAuthorizationService+IOS.h in Headers */, + EA278C7D9EB69B68733EF68A0C150345 /* OIDAuthorizationService.h in Headers */, + 670E2A31490D13725DFB5CBBF08B12EF /* OIDAuthState+IOS.h in Headers */, + 6B2C401E08F2AC0A87453061CA3E8E2C /* OIDAuthState.h in Headers */, + 082620B4CAFF07381D466C7F54CDC435 /* OIDAuthStateChangeDelegate.h in Headers */, + C760F013C47E323D4C9D3E1FF5E34338 /* OIDAuthStateErrorDelegate.h in Headers */, + 4870D0FB963B09D3D9FAA4E3DC9263FB /* OIDClientMetadataParameters.h in Headers */, + 4480D20BAE2A84682B5DE51F51A5DD4D /* OIDDefines.h in Headers */, + 91907BA379327CACDF19EA39EAD05338 /* OIDEndSessionRequest.h in Headers */, + 3BFE8CD59118C4908BDCF67DA762C118 /* OIDEndSessionResponse.h in Headers */, + AA3BE332B851918B23E03F283868116C /* OIDError.h in Headers */, + 617968B11188B95B6117BE9A51BCC2F7 /* OIDErrorUtilities.h in Headers */, + 83BAF0108579702991C01C961439111A /* OIDExternalUserAgent.h in Headers */, + 487B398FF6DE0468B5E8E4FEBB432327 /* OIDExternalUserAgentCatalyst.h in Headers */, + D87549BF6D8F527CF351E13326FCEF21 /* OIDExternalUserAgentIOS.h in Headers */, + 2808F21DE383D3C9BD0DA03A7B95F6AA /* OIDExternalUserAgentIOSCustomBrowser.h in Headers */, + F598CB205564B44BC8BC6B774DEB1B62 /* OIDExternalUserAgentRequest.h in Headers */, + 85AC70140CF3718AA932C21689BF865A /* OIDExternalUserAgentSession.h in Headers */, + DE23788919FF5136AC4B77F9B29FB4C1 /* OIDFieldMapping.h in Headers */, + 40FC84D2AFB6832635DD9A929E516BAE /* OIDGrantTypes.h in Headers */, + 2B268B1D89DDEE445606464B1105E0F3 /* OIDIDToken.h in Headers */, + BBC602EC86EB71FC4ACD5728C9058E23 /* OIDRegistrationRequest.h in Headers */, + E3B32C12184BD887E6687F73097489FA /* OIDRegistrationResponse.h in Headers */, + 8ACA9C8B657C3C149214E3649860AF76 /* OIDResponseTypes.h in Headers */, + 8955CA20EEA55F5D75CDE87F0CADCF83 /* OIDScopes.h in Headers */, + 7ACD06125D4ECC1EC05EAF68B2DC0C99 /* OIDScopeUtilities.h in Headers */, + AE07D07F98D805B39CAAB4E89F1E87B8 /* OIDServiceConfiguration.h in Headers */, + 8417CFCEA12E96E62CFA4A646672BCCB /* OIDServiceDiscovery.h in Headers */, + 355CF2719234ADB11A1993E2120CC373 /* OIDTokenRequest.h in Headers */, + 321995AB5C5DD22B2DC924BC8F2AF053 /* OIDTokenResponse.h in Headers */, + 0B764CD79758A19F877947F521050A30 /* OIDTokenUtilities.h in Headers */, + 39D4516A2DB8E91D2A1C0CDB79BDCBCE /* OIDURLQueryComponent.h in Headers */, + D4E43B95AA2B76BDEC6B97B152F00463 /* OIDURLSessionProvider.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FB5319D5B9236392A84250F86298EC31 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A1BB5BA455F04F024EE7204993AE5188 /* Pods-mentorship ios-mentorship iosUITests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 5C642AA10FB29936669CC269F42079C6 /* AppAuth */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9FB8D339D52B52F9DAB7BA9CD4DC84FF /* Build configuration list for PBXNativeTarget "AppAuth" */; + buildPhases = ( + BF20DD677E68B0FFF096FA87BA4F642E /* Headers */, + FA40C5373E6F05613AE4464C1A8C3500 /* Sources */, + 16CF22217BEA907AC6550A5C485822F1 /* Frameworks */, + 789D540271448693859C5D41E90A58D6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AppAuth; + productName = AppAuth; + productReference = 3FD1B4C1246D643E9476438C28048FA8 /* AppAuth.framework */; + productType = "com.apple.product-type.framework"; + }; + 76E1B0952CE19EBCE9AF6F103D78195C /* Pods-mentorship iosTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DF23B01EE78FED9F33D13FC5A2F88DDC /* Build configuration list for PBXNativeTarget "Pods-mentorship iosTests" */; + buildPhases = ( + AF0495172B1DCF3E83F1F96FF98530FB /* Headers */, + D4E03B93E0F731C576112111954C3FB0 /* Sources */, + A78E5BE81BADF2BF1190CD4D5BFF614B /* Frameworks */, + 43ED3B3462A59357CE96A59A678DC9CB /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 0D982A1D7F357ABBCBDD0393CAFD1A10 /* PBXTargetDependency */, + ); + name = "Pods-mentorship iosTests"; + productName = "Pods-mentorship iosTests"; + productReference = EE1A963BFF40376C402DCFC8F5CFEB34 /* Pods_mentorship_iosTests.framework */; + productType = "com.apple.product-type.framework"; + }; + 8627999EF1D5E93E13DAFF580DA8CDCF /* GTMAppAuth */ = { + isa = PBXNativeTarget; + buildConfigurationList = 512819EFFDDD399A495CCD1F0590D138 /* Build configuration list for PBXNativeTarget "GTMAppAuth" */; + buildPhases = ( + B988B1E8057F208BF303CA7151F9F8FD /* Headers */, + F058E53D94E8724221F616AF519B0229 /* Sources */, + 072D6922919B2D97BDAF9CFCD9FF59C8 /* Frameworks */, + 68C0932CA3EDF9FF746703A88C8A4ADE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 359F6EDD76137B81044E0AFD2E99782A /* PBXTargetDependency */, + EF9A8E7636B6024678594EDD08A976BC /* PBXTargetDependency */, + ); + name = GTMAppAuth; + productName = GTMAppAuth; + productReference = 6FD122EA0AB9AB2A8FFA5F676C795DF0 /* GTMAppAuth.framework */; + productType = "com.apple.product-type.framework"; + }; + D676E21115185671D7258A56944ABE98 /* GTMSessionFetcher */ = { + isa = PBXNativeTarget; + buildConfigurationList = 42C7BA3B903A64485E1086C189729A31 /* Build configuration list for PBXNativeTarget "GTMSessionFetcher" */; + buildPhases = ( + 4ED0E215E12EB40D1306883BC6DB97EA /* Headers */, + E765E73510C0488113AACCBE9B6B1254 /* Sources */, + 98AB3B5AFE6FC96417A7790B3B87727A /* Frameworks */, + B9E1F148707B6CB1D0ABC6EC07A0537A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GTMSessionFetcher; + productName = GTMSessionFetcher; + productReference = C1998E0D8085221AD87F89B614C10E52 /* GTMSessionFetcher.framework */; + productType = "com.apple.product-type.framework"; + }; + D94C94B952E5B99E5CAE638B92E0D039 /* Pods-mentorship ios-mentorship iosUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2F8B0941A47C97BB6D72DDC4E5A4F847 /* Build configuration list for PBXNativeTarget "Pods-mentorship ios-mentorship iosUITests" */; + buildPhases = ( + FB5319D5B9236392A84250F86298EC31 /* Headers */, + E9BECB47070DD5E1568111D7874D6FEB /* Sources */, + 65E7CB4C247125E90090B9CCFE914B70 /* Frameworks */, + 10382B4D747D1141EA542E5D03A38CEE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + AD8A10422FD4FC9ABF5B00130B47B535 /* PBXTargetDependency */, + 174AACF64E64769F0AF40926164C4560 /* PBXTargetDependency */, + 2CB51FD98B4D7C992AABDCB604859E8D /* PBXTargetDependency */, + 34481A5F990D06F48B08F606DED54BC8 /* PBXTargetDependency */, + ); + name = "Pods-mentorship ios-mentorship iosUITests"; + productName = "Pods-mentorship ios-mentorship iosUITests"; + productReference = 6723353B59967A2F8CE5ADF84C4F9434 /* Pods_mentorship_ios_mentorship_iosUITests.framework */; + productType = "com.apple.product-type.framework"; + }; + E669114D21D744114419853D6A306777 /* Pods-mentorship ios */ = { + isa = PBXNativeTarget; + buildConfigurationList = E73FA4029C51E49A76EEC62D43253558 /* Build configuration list for PBXNativeTarget "Pods-mentorship ios" */; + buildPhases = ( + 594AF7C17FFFD6791D6EAB88E0F424FD /* Headers */, + 89B0A95ED7FE80C8D16B52F53E4CC0D5 /* Sources */, + 8D6B9E1BD179EF938832330D32B26D5B /* Frameworks */, + B822AA25D0E908576E0171E60817C15B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 971DF98DE0A09A0D90E62215AEF57B2F /* PBXTargetDependency */, + 0FFD3235ECC22912917DEB39DCE8E61D /* PBXTargetDependency */, + 84680776B0DA0A2741A88D0CB4A61F12 /* PBXTargetDependency */, + AF74AA6CD01E032979CDD016F47029E2 /* PBXTargetDependency */, + ); + name = "Pods-mentorship ios"; + productName = "Pods-mentorship ios"; + productReference = C279CC1E3D7BE35AB42CE83FF5907FB5 /* Pods_mentorship_ios.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 10.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = 9066D3C5B2ACF2E2D48DA4559FCA79A6 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5C642AA10FB29936669CC269F42079C6 /* AppAuth */, + CAD3534FC55B0333104E5117C0A9A324 /* GoogleSignIn */, + 8627999EF1D5E93E13DAFF580DA8CDCF /* GTMAppAuth */, + D676E21115185671D7258A56944ABE98 /* GTMSessionFetcher */, + E669114D21D744114419853D6A306777 /* Pods-mentorship ios */, + D94C94B952E5B99E5CAE638B92E0D039 /* Pods-mentorship ios-mentorship iosUITests */, + 76E1B0952CE19EBCE9AF6F103D78195C /* Pods-mentorship iosTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 10382B4D747D1141EA542E5D03A38CEE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43ED3B3462A59357CE96A59A678DC9CB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 68C0932CA3EDF9FF746703A88C8A4ADE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 789D540271448693859C5D41E90A58D6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B822AA25D0E908576E0171E60817C15B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B9E1F148707B6CB1D0ABC6EC07A0537A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 89B0A95ED7FE80C8D16B52F53E4CC0D5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C885217C92D9FFF2AC1765CBB300E4C /* Pods-mentorship ios-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D4E03B93E0F731C576112111954C3FB0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5D8C1D8B1B94C05E1209CFADC4CBA523 /* Pods-mentorship iosTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E765E73510C0488113AACCBE9B6B1254 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0725D5B07457983CE2485610920F40F0 /* GTMGatherInputStream.m in Sources */, + 677020069CB1BF19DC94430FFAA4DE64 /* GTMMIMEDocument.m in Sources */, + 8390E44AF1A51804ECC9B7DAEB30F30F /* GTMReadMonitorInputStream.m in Sources */, + 7C15A5740A2F9022423ED5583A2D578B /* GTMSessionFetcher-dummy.m in Sources */, + 19A26781E567CE6B5034148C70558904 /* GTMSessionFetcher.m in Sources */, + F6C1C1A047487F90686267300F19F1B9 /* GTMSessionFetcherLogging.m in Sources */, + B714634348FC636AD9B6AAB61EEB7778 /* GTMSessionFetcherService.m in Sources */, + A75213FD8D0028674022934581BEC725 /* GTMSessionUploadFetcher.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E9BECB47070DD5E1568111D7874D6FEB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2A793266E8EBA0902699FB04A0BBFD79 /* Pods-mentorship ios-mentorship iosUITests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F058E53D94E8724221F616AF519B0229 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3C8B38097E676E0CAD4C9EDCAD691C9D /* GTMAppAuth-dummy.m in Sources */, + 97185747EA1A3BB7552CB5A802B56757 /* GTMAppAuthFetcherAuthorization+Keychain.m in Sources */, + B35F09AAE81C4CCCB215BF097DD570D2 /* GTMAppAuthFetcherAuthorization.m in Sources */, + 75E674393E820798B5C4A708746E4E49 /* GTMKeychain_iOS.m in Sources */, + D901F6867BD4353BECC4F396BCD31533 /* GTMOAuth2KeychainCompatibility.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FA40C5373E6F05613AE4464C1A8C3500 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0E23750FE124E07AFF21DB9AC9542BCE /* AppAuth-dummy.m in Sources */, + C359863B7FF01F6B19CDA89D30126EE6 /* OIDAuthorizationRequest.m in Sources */, + 075E34225D4CE71C2F2FC63FB9CE0CA3 /* OIDAuthorizationResponse.m in Sources */, + A1AF5BF63FEEA98CB2D165039170E6F7 /* OIDAuthorizationService+IOS.m in Sources */, + C23F697B76C8D3242F232D958E0C00E3 /* OIDAuthorizationService.m in Sources */, + 152481DAFF8FA47F61BB412784DF31E9 /* OIDAuthState+IOS.m in Sources */, + 06953BA616880F876D31CECCEDC11105 /* OIDAuthState.m in Sources */, + 16F96D0B2EE7EBED059FF327B8E90E5E /* OIDClientMetadataParameters.m in Sources */, + D90A3C067FE031487AD6F53979803AAA /* OIDEndSessionRequest.m in Sources */, + F63C85CE50933EE6BDB86F9C87253F1C /* OIDEndSessionResponse.m in Sources */, + 2D8D67C396A0A1A33320AB9924E9DB42 /* OIDError.m in Sources */, + 2095003DC22D3D86A334AA1A1561900D /* OIDErrorUtilities.m in Sources */, + 0A83C33151A74978B5009466B16AA320 /* OIDExternalUserAgentCatalyst.m in Sources */, + 2B9DE014CBDC27683B204852475EB8A6 /* OIDExternalUserAgentIOS.m in Sources */, + 79117048A3C4F245532CAE57EE37901A /* OIDExternalUserAgentIOSCustomBrowser.m in Sources */, + 5C43E64B8DFCE99DD92F62D538C0DFF0 /* OIDFieldMapping.m in Sources */, + F246177F1215CDBE9AB3B1BB58624C04 /* OIDGrantTypes.m in Sources */, + F47BF5598DBEDEB0A44679023AFC7E66 /* OIDIDToken.m in Sources */, + B00AF14E70C26C9D19EDB3AB4F04123E /* OIDRegistrationRequest.m in Sources */, + EE329DF01337A5B2040D3D7532BEB766 /* OIDRegistrationResponse.m in Sources */, + 22BA02A9AF9DDB1A405D82C84953B295 /* OIDResponseTypes.m in Sources */, + 705E22C52493D0AEDE135873802B54E0 /* OIDScopes.m in Sources */, + 17587A84F44BB3F9BBE44E3F0BF91929 /* OIDScopeUtilities.m in Sources */, + A837179BAD5CC1FFC6BFAC2C5C67E334 /* OIDServiceConfiguration.m in Sources */, + 2C034AC52FF9090141709228E7A67121 /* OIDServiceDiscovery.m in Sources */, + 3F609DF53628B2F834F882C40F39C99C /* OIDTokenRequest.m in Sources */, + 3989F5BDEC4A21202F727FB35ECB9E4D /* OIDTokenResponse.m in Sources */, + 95D660DE029B3057EF7922C44E75B6FF /* OIDTokenUtilities.m in Sources */, + 218BA22AD876AB6E19146F5A9ABC8F5E /* OIDURLQueryComponent.m in Sources */, + 86C6E9D09DD9A2F765ED9CF5F981560C /* OIDURLSessionProvider.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0D982A1D7F357ABBCBDD0393CAFD1A10 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-mentorship ios"; + target = E669114D21D744114419853D6A306777 /* Pods-mentorship ios */; + targetProxy = 380F79DB94E2732DF6F327B9142D4189 /* PBXContainerItemProxy */; + }; + 0FFD3235ECC22912917DEB39DCE8E61D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMAppAuth; + target = 8627999EF1D5E93E13DAFF580DA8CDCF /* GTMAppAuth */; + targetProxy = 26DE710C83D26F0E3253DA99DD52D8F2 /* PBXContainerItemProxy */; + }; + 174AACF64E64769F0AF40926164C4560 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMAppAuth; + target = 8627999EF1D5E93E13DAFF580DA8CDCF /* GTMAppAuth */; + targetProxy = 69653A44A453E231003B2B78EACD2801 /* PBXContainerItemProxy */; + }; + 2857566728641F74273DD7DA9E370771 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AppAuth; + target = 5C642AA10FB29936669CC269F42079C6 /* AppAuth */; + targetProxy = 96C4B52CEBD25FE7612CDFAC4EBB56D6 /* PBXContainerItemProxy */; + }; + 2CB51FD98B4D7C992AABDCB604859E8D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMSessionFetcher; + target = D676E21115185671D7258A56944ABE98 /* GTMSessionFetcher */; + targetProxy = 786BDA01217A80D3A27F97A9E29C36AB /* PBXContainerItemProxy */; + }; + 314A9E36FBEA4C73491669F15EA30E5F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMAppAuth; + target = 8627999EF1D5E93E13DAFF580DA8CDCF /* GTMAppAuth */; + targetProxy = CFBE3CB2F286EF0D95A2ACDEBE0C1014 /* PBXContainerItemProxy */; + }; + 34481A5F990D06F48B08F606DED54BC8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleSignIn; + target = CAD3534FC55B0333104E5117C0A9A324 /* GoogleSignIn */; + targetProxy = 01AC7A177511421386583884F07403DD /* PBXContainerItemProxy */; + }; + 359F6EDD76137B81044E0AFD2E99782A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AppAuth; + target = 5C642AA10FB29936669CC269F42079C6 /* AppAuth */; + targetProxy = 0EDCF38BA44E7804550420B1923AE7C0 /* PBXContainerItemProxy */; + }; + 74F3D34B7F14020AE0A57D83A7889F98 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMSessionFetcher; + target = D676E21115185671D7258A56944ABE98 /* GTMSessionFetcher */; + targetProxy = 255C113C5B8CEBDE5DFD4788BBC6FC4B /* PBXContainerItemProxy */; + }; + 84680776B0DA0A2741A88D0CB4A61F12 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMSessionFetcher; + target = D676E21115185671D7258A56944ABE98 /* GTMSessionFetcher */; + targetProxy = D3B98C3FD3F5938B890DF7680BBB7E42 /* PBXContainerItemProxy */; + }; + 971DF98DE0A09A0D90E62215AEF57B2F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AppAuth; + target = 5C642AA10FB29936669CC269F42079C6 /* AppAuth */; + targetProxy = E8554359B2E0525707CC4735C3DFE1CE /* PBXContainerItemProxy */; + }; + AD8A10422FD4FC9ABF5B00130B47B535 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AppAuth; + target = 5C642AA10FB29936669CC269F42079C6 /* AppAuth */; + targetProxy = 2F6F337FCAEA9A42D506A040A3DF35B8 /* PBXContainerItemProxy */; + }; + AF74AA6CD01E032979CDD016F47029E2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleSignIn; + target = CAD3534FC55B0333104E5117C0A9A324 /* GoogleSignIn */; + targetProxy = 9C295E8BC77DF498D6BDAD99C4F660FF /* PBXContainerItemProxy */; + }; + EF9A8E7636B6024678594EDD08A976BC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMSessionFetcher; + target = D676E21115185671D7258A56944ABE98 /* GTMSessionFetcher */; + targetProxy = A720C631E1946701F927ADC25CF2A59E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 05151936F291832ED2DC420B9357812D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 38E47E42BE9D59EA60D119AF99378190 /* Pods-mentorship iosTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 0EFD4BD48160F40F3EE3D90F31FEE3BB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D04E76110A30D474F45397417CF66599 /* GTMAppAuth.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GTMAppAuth/GTMAppAuth-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GTMAppAuth/GTMAppAuth.modulemap"; + PRODUCT_MODULE_NAME = GTMAppAuth; + PRODUCT_NAME = GTMAppAuth; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 2D4F131D012BEB7D41559F457CFD7CCE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5F96B3A022E0040FBB3194E3231BBF9B /* GTMSessionFetcher.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap"; + PRODUCT_MODULE_NAME = GTMSessionFetcher; + PRODUCT_NAME = GTMSessionFetcher; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 3BFB49A0C652DF4A91F6D35EE641F051 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B01846C50A6E49C262464A2FBE59F1E9 /* AppAuth.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/AppAuth/AppAuth-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AppAuth/AppAuth-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/AppAuth/AppAuth.modulemap"; + PRODUCT_MODULE_NAME = AppAuth; + PRODUCT_NAME = AppAuth; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 57A09D1AFDF0C5A690229235D8E8D6A3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 30A1D65779BE9FA691AEBD03B5455BBB /* Pods-mentorship ios.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-mentorship ios/Pods-mentorship ios-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-mentorship ios/Pods-mentorship ios.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 67F8D4F8DD26D5EC07F205DCD12199FD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 23E453339F50955000DE65F30282EF6F /* GoogleSignIn.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 725AF7BEC3A726CB2863C829AA3EFF70 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 26108ECE6955E499A7A690C9E6FC537D /* GoogleSignIn.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 75D8B3092EA8147D11970DCB2E160C57 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 104D3E9636F5950B3E5E52D45BE250BE /* Pods-mentorship ios-mentorship iosUITests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9D8447784477E8922A7D86AAF264CAC1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3328F331E40151217475F5186FA7E7A7 /* GTMAppAuth.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GTMAppAuth/GTMAppAuth-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GTMAppAuth/GTMAppAuth.modulemap"; + PRODUCT_MODULE_NAME = GTMAppAuth; + PRODUCT_NAME = GTMAppAuth; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + B5256F5749EC31101A1D20A738FC66A5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 60726EAF3A48B3A5DCFD505280476615 /* Pods-mentorship iosTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C24F2BDA2FB974249C52EF121C1D13CC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B1C0F3D9E0A9BFF24C88E6E03E929131 /* Pods-mentorship ios-mentorship iosUITests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + C73AD503AEFF4C5DD1901708DC6D9640 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F30665C00BF13BFADDD8BECDF2C02D31 /* GTMSessionFetcher.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap"; + PRODUCT_MODULE_NAME = GTMSessionFetcher; + PRODUCT_NAME = GTMSessionFetcher; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CEED3BE9D9BBFC1B5BE09AA928ADAB77 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 917B0E1C097160C75E249E040413F058 /* AppAuth.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/AppAuth/AppAuth-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AppAuth/AppAuth-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/AppAuth/AppAuth.modulemap"; + PRODUCT_MODULE_NAME = AppAuth; + PRODUCT_NAME = AppAuth; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DFD9D19FEEBF98DE271D7FBABCB845B5 /* 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 = ( + "POD_CONFIGURATION_DEBUG=1", + "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; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + E7BB2277FCA594B333AE0E87CBFC628D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 534513D6AB6E325748777DB2920D6D37 /* Pods-mentorship ios.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 4K84MJ7D8T; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-mentorship ios/Pods-mentorship ios-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-mentorship ios/Pods-mentorship ios.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + F5F04600F5626DC980F02790D1ED2C19 /* 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_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=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 = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2F8B0941A47C97BB6D72DDC4E5A4F847 /* Build configuration list for PBXNativeTarget "Pods-mentorship ios-mentorship iosUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75D8B3092EA8147D11970DCB2E160C57 /* Debug */, + C24F2BDA2FB974249C52EF121C1D13CC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 42C7BA3B903A64485E1086C189729A31 /* Build configuration list for PBXNativeTarget "GTMSessionFetcher" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C73AD503AEFF4C5DD1901708DC6D9640 /* Debug */, + 2D4F131D012BEB7D41559F457CFD7CCE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DFD9D19FEEBF98DE271D7FBABCB845B5 /* Debug */, + F5F04600F5626DC980F02790D1ED2C19 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 512819EFFDDD399A495CCD1F0590D138 /* Build configuration list for PBXNativeTarget "GTMAppAuth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0EFD4BD48160F40F3EE3D90F31FEE3BB /* Debug */, + 9D8447784477E8922A7D86AAF264CAC1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9FB8D339D52B52F9DAB7BA9CD4DC84FF /* Build configuration list for PBXNativeTarget "AppAuth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3BFB49A0C652DF4A91F6D35EE641F051 /* Debug */, + CEED3BE9D9BBFC1B5BE09AA928ADAB77 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B0030D626B503D8EB0EA00BB772D6396 /* Build configuration list for PBXAggregateTarget "GoogleSignIn" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 67F8D4F8DD26D5EC07F205DCD12199FD /* Debug */, + 725AF7BEC3A726CB2863C829AA3EFF70 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DF23B01EE78FED9F33D13FC5A2F88DDC /* Build configuration list for PBXNativeTarget "Pods-mentorship iosTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B5256F5749EC31101A1D20A738FC66A5 /* Debug */, + 05151936F291832ED2DC420B9357812D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E73FA4029C51E49A76EEC62D43253558 /* Build configuration list for PBXNativeTarget "Pods-mentorship ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E7BB2277FCA594B333AE0E87CBFC628D /* Debug */, + 57A09D1AFDF0C5A690229235D8E8D6A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/Pods/Target Support Files/AppAuth/AppAuth-Info.plist b/Pods/Target Support Files/AppAuth/AppAuth-Info.plist new file mode 100644 index 00000000..7b6b52a4 --- /dev/null +++ b/Pods/Target Support Files/AppAuth/AppAuth-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.4.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/AppAuth/AppAuth-dummy.m b/Pods/Target Support Files/AppAuth/AppAuth-dummy.m new file mode 100644 index 00000000..0f45668e --- /dev/null +++ b/Pods/Target Support Files/AppAuth/AppAuth-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_AppAuth : NSObject +@end +@implementation PodsDummy_AppAuth +@end diff --git a/Pods/Target Support Files/AppAuth/AppAuth-prefix.pch b/Pods/Target Support Files/AppAuth/AppAuth-prefix.pch new file mode 100644 index 00000000..beb2a244 --- /dev/null +++ b/Pods/Target Support Files/AppAuth/AppAuth-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/AppAuth/AppAuth-umbrella.h b/Pods/Target Support Files/AppAuth/AppAuth-umbrella.h new file mode 100644 index 00000000..7e9c5909 --- /dev/null +++ b/Pods/Target Support Files/AppAuth/AppAuth-umbrella.h @@ -0,0 +1,84 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "AppAuthCore.h" +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationService.h" +#import "OIDAuthState.h" +#import "OIDAuthStateChangeDelegate.h" +#import "OIDAuthStateErrorDelegate.h" +#import "OIDClientMetadataParameters.h" +#import "OIDDefines.h" +#import "OIDEndSessionRequest.h" +#import "OIDEndSessionResponse.h" +#import "OIDError.h" +#import "OIDErrorUtilities.h" +#import "OIDExternalUserAgent.h" +#import "OIDExternalUserAgentRequest.h" +#import "OIDExternalUserAgentSession.h" +#import "OIDFieldMapping.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 "OIDURLQueryComponent.h" +#import "OIDURLSessionProvider.h" +#import "AppAuth.h" +#import "AppAuthCore.h" +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationService.h" +#import "OIDAuthState.h" +#import "OIDAuthStateChangeDelegate.h" +#import "OIDAuthStateErrorDelegate.h" +#import "OIDClientMetadataParameters.h" +#import "OIDDefines.h" +#import "OIDEndSessionRequest.h" +#import "OIDEndSessionResponse.h" +#import "OIDError.h" +#import "OIDErrorUtilities.h" +#import "OIDExternalUserAgent.h" +#import "OIDExternalUserAgentRequest.h" +#import "OIDExternalUserAgentSession.h" +#import "OIDFieldMapping.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 "OIDURLQueryComponent.h" +#import "OIDURLSessionProvider.h" +#import "OIDAuthorizationService+IOS.h" +#import "OIDAuthState+IOS.h" +#import "OIDExternalUserAgentCatalyst.h" +#import "OIDExternalUserAgentIOS.h" +#import "OIDExternalUserAgentIOSCustomBrowser.h" + +FOUNDATION_EXPORT double AppAuthVersionNumber; +FOUNDATION_EXPORT const unsigned char AppAuthVersionString[]; + diff --git a/Pods/Target Support Files/AppAuth/AppAuth.debug.xcconfig b/Pods/Target Support Files/AppAuth/AppAuth.debug.xcconfig new file mode 100644 index 00000000..47199e55 --- /dev/null +++ b/Pods/Target Support Files/AppAuth/AppAuth.debug.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AppAuth +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "SafariServices" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/AppAuth +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/AppAuth/AppAuth.modulemap b/Pods/Target Support Files/AppAuth/AppAuth.modulemap new file mode 100644 index 00000000..9299d0a3 --- /dev/null +++ b/Pods/Target Support Files/AppAuth/AppAuth.modulemap @@ -0,0 +1,6 @@ +framework module AppAuth { + umbrella header "AppAuth-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/AppAuth/AppAuth.release.xcconfig b/Pods/Target Support Files/AppAuth/AppAuth.release.xcconfig new file mode 100644 index 00000000..47199e55 --- /dev/null +++ b/Pods/Target Support Files/AppAuth/AppAuth.release.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AppAuth +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "SafariServices" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/AppAuth +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-Info.plist b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-Info.plist new file mode 100644 index 00000000..2243fe6e --- /dev/null +++ b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m new file mode 100644 index 00000000..04b91f31 --- /dev/null +++ b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_GTMAppAuth : NSObject +@end +@implementation PodsDummy_GTMAppAuth +@end diff --git a/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch new file mode 100644 index 00000000..beb2a244 --- /dev/null +++ b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h new file mode 100644 index 00000000..4ab5f86a --- /dev/null +++ b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h @@ -0,0 +1,21 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "GTMAppAuth.h" +#import "GTMAppAuthFetcherAuthorization+Keychain.h" +#import "GTMAppAuthFetcherAuthorization.h" +#import "GTMKeychain.h" +#import "GTMOAuth2KeychainCompatibility.h" + +FOUNDATION_EXPORT double GTMAppAuthVersionNumber; +FOUNDATION_EXPORT const unsigned char GTMAppAuthVersionString[]; + diff --git a/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.debug.xcconfig b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.debug.xcconfig new file mode 100644 index 00000000..217cc41a --- /dev/null +++ b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.debug.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GTMAppAuth +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap new file mode 100644 index 00000000..b23c8d07 --- /dev/null +++ b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap @@ -0,0 +1,6 @@ +framework module GTMAppAuth { + umbrella header "GTMAppAuth-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.release.xcconfig b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.release.xcconfig new file mode 100644 index 00000000..217cc41a --- /dev/null +++ b/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.release.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GTMAppAuth +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist new file mode 100644 index 00000000..7b6b52a4 --- /dev/null +++ b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.4.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m new file mode 100644 index 00000000..13d68b3f --- /dev/null +++ b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_GTMSessionFetcher : NSObject +@end +@implementation PodsDummy_GTMSessionFetcher +@end diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch new file mode 100644 index 00000000..beb2a244 --- /dev/null +++ b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h new file mode 100644 index 00000000..b9e0b3de --- /dev/null +++ b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h @@ -0,0 +1,23 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "GTMSessionFetcher.h" +#import "GTMSessionFetcherLogging.h" +#import "GTMSessionFetcherService.h" +#import "GTMSessionUploadFetcher.h" +#import "GTMGatherInputStream.h" +#import "GTMMIMEDocument.h" +#import "GTMReadMonitorInputStream.h" + +FOUNDATION_EXPORT double GTMSessionFetcherVersionNumber; +FOUNDATION_EXPORT const unsigned char GTMSessionFetcherVersionString[]; + diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.debug.xcconfig b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.debug.xcconfig new file mode 100644 index 00000000..af4ab71f --- /dev/null +++ b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.debug.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "Security" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GTMSessionFetcher +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap new file mode 100644 index 00000000..5121a4dc --- /dev/null +++ b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap @@ -0,0 +1,6 @@ +framework module GTMSessionFetcher { + umbrella header "GTMSessionFetcher-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.release.xcconfig b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.release.xcconfig new file mode 100644 index 00000000..af4ab71f --- /dev/null +++ b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.release.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "Security" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GTMSessionFetcher +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleSignIn/GoogleSignIn.debug.xcconfig b/Pods/Target Support Files/GoogleSignIn/GoogleSignIn.debug.xcconfig new file mode 100644 index 00000000..889b0187 --- /dev/null +++ b/Pods/Target Support Files/GoogleSignIn/GoogleSignIn.debug.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_ROOT}/GoogleSignIn/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "CoreText" -framework "Foundation" -framework "LocalAuthentication" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleSignIn +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleSignIn/GoogleSignIn.release.xcconfig b/Pods/Target Support Files/GoogleSignIn/GoogleSignIn.release.xcconfig new file mode 100644 index 00000000..889b0187 --- /dev/null +++ b/Pods/Target Support Files/GoogleSignIn/GoogleSignIn.release.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_ROOT}/GoogleSignIn/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "CoreText" -framework "Foundation" -framework "LocalAuthentication" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleSignIn +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-Info.plist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-Info.plist new file mode 100644 index 00000000..2243fe6e --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-acknowledgements.markdown new file mode 100644 index 00000000..1a67fe47 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-acknowledgements.markdown @@ -0,0 +1,625 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AppAuth + + + 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. + + +## GTMAppAuth + + + 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. + + +## GTMSessionFetcher + + + 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. + + +## GoogleSignIn + +Copyright 2019 Google +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-acknowledgements.plist new file mode 100644 index 00000000..e4bf7bb8 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-acknowledgements.plist @@ -0,0 +1,675 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + + 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. + + License + Apache License, Version 2.0 + Title + AppAuth + Type + PSGroupSpecifier + + + FooterText + + 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. + + License + Apache License, Version 2.0 + Title + GTMAppAuth + Type + PSGroupSpecifier + + + FooterText + + 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. + + License + Apache + Title + GTMSessionFetcher + Type + PSGroupSpecifier + + + FooterText + Copyright 2019 Google + License + Copyright + Title + GoogleSignIn + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-dummy.m b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-dummy.m new file mode 100644 index 00000000..5a050b72 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_mentorship_ios_mentorship_iosUITests : NSObject +@end +@implementation PodsDummy_Pods_mentorship_ios_mentorship_iosUITests +@end diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 00000000..6f954221 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,4 @@ +${PODS_ROOT}/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks.sh +${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework +${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework +${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 00000000..23d1c4d4 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1,3 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Release-input-files.xcfilelist new file mode 100644 index 00000000..6f954221 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,4 @@ +${PODS_ROOT}/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks.sh +${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework +${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework +${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Release-output-files.xcfilelist new file mode 100644 index 00000000..23d1c4d4 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks-Release-output-files.xcfilelist @@ -0,0 +1,3 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks.sh b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks.sh new file mode 100755 index 00000000..906bef66 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-frameworks.sh @@ -0,0 +1,211 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + +install_artifact() { + artifact="$1" + base="$(basename "$artifact")" + case $base in + *.framework) + install_framework "$artifact" + ;; + *.dSYM) + # Suppress arch warnings since XCFrameworks will include many dSYM files + install_dsym "$artifact" "false" + ;; + *.bcsymbolmap) + install_bcsymbolmap "$artifact" + ;; + *) + echo "error: Unrecognized artifact "$artifact"" + ;; + esac +} + +copy_artifacts() { + file_list="$1" + while read artifact; do + install_artifact "$artifact" + done <$file_list +} + +ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" +if [ -r "${ARTIFACT_LIST_FILE}" ]; then + copy_artifacts "${ARTIFACT_LIST_FILE}" +fi + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Debug-input-files.xcfilelist new file mode 100644 index 00000000..b0c2385d --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Debug-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources.sh +${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Debug-output-files.xcfilelist new file mode 100644 index 00000000..03d868ad --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Debug-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Release-input-files.xcfilelist new file mode 100644 index 00000000..b0c2385d --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Release-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources.sh +${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Release-output-files.xcfilelist new file mode 100644 index 00000000..03d868ad --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources-Release-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources.sh b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources.sh new file mode 100755 index 00000000..af0641bf --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-resources.sh @@ -0,0 +1,129 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_resource "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle" +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find -L "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi +fi diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-umbrella.h b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-umbrella.h new file mode 100644 index 00000000..8c1c6cf8 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_mentorship_ios_mentorship_iosUITestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_mentorship_ios_mentorship_iosUITestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.debug.xcconfig b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.debug.xcconfig new file mode 100644 index 00000000..680fe412 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.debug.xcconfig @@ -0,0 +1,10 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_ROOT}/GoogleSignIn/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -ObjC -framework "AppAuth" -framework "CoreGraphics" -framework "CoreText" -framework "Foundation" -framework "GTMAppAuth" -framework "GTMSessionFetcher" -framework "GoogleSignIn" -framework "LocalAuthentication" -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.modulemap b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.modulemap new file mode 100644 index 00000000..70bc41bc --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_mentorship_ios_mentorship_iosUITests { + umbrella header "Pods-mentorship ios-mentorship iosUITests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.release.xcconfig b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.release.xcconfig new file mode 100644 index 00000000..680fe412 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.release.xcconfig @@ -0,0 +1,10 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_ROOT}/GoogleSignIn/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -ObjC -framework "AppAuth" -framework "CoreGraphics" -framework "CoreText" -framework "Foundation" -framework "GTMAppAuth" -framework "GTMSessionFetcher" -framework "GoogleSignIn" -framework "LocalAuthentication" -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-Info.plist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-Info.plist new file mode 100644 index 00000000..2243fe6e --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-acknowledgements.markdown b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-acknowledgements.markdown new file mode 100644 index 00000000..1a67fe47 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-acknowledgements.markdown @@ -0,0 +1,625 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AppAuth + + + 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. + + +## GTMAppAuth + + + 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. + + +## GTMSessionFetcher + + + 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. + + +## GoogleSignIn + +Copyright 2019 Google +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-acknowledgements.plist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-acknowledgements.plist new file mode 100644 index 00000000..e4bf7bb8 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-acknowledgements.plist @@ -0,0 +1,675 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + + 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. + + License + Apache License, Version 2.0 + Title + AppAuth + Type + PSGroupSpecifier + + + FooterText + + 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. + + License + Apache License, Version 2.0 + Title + GTMAppAuth + Type + PSGroupSpecifier + + + FooterText + + 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. + + License + Apache + Title + GTMSessionFetcher + Type + PSGroupSpecifier + + + FooterText + Copyright 2019 Google + License + Copyright + Title + GoogleSignIn + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-dummy.m b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-dummy.m new file mode 100644 index 00000000..47bb4c0d --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_mentorship_ios : NSObject +@end +@implementation PodsDummy_Pods_mentorship_ios +@end diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 00000000..c20c5f2b --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,4 @@ +${PODS_ROOT}/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks.sh +${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework +${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework +${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 00000000..23d1c4d4 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1,3 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Release-input-files.xcfilelist new file mode 100644 index 00000000..c20c5f2b --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,4 @@ +${PODS_ROOT}/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks.sh +${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework +${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework +${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Release-output-files.xcfilelist new file mode 100644 index 00000000..23d1c4d4 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks-Release-output-files.xcfilelist @@ -0,0 +1,3 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks.sh b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks.sh new file mode 100755 index 00000000..906bef66 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-frameworks.sh @@ -0,0 +1,211 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + +install_artifact() { + artifact="$1" + base="$(basename "$artifact")" + case $base in + *.framework) + install_framework "$artifact" + ;; + *.dSYM) + # Suppress arch warnings since XCFrameworks will include many dSYM files + install_dsym "$artifact" "false" + ;; + *.bcsymbolmap) + install_bcsymbolmap "$artifact" + ;; + *) + echo "error: Unrecognized artifact "$artifact"" + ;; + esac +} + +copy_artifacts() { + file_list="$1" + while read artifact; do + install_artifact "$artifact" + done <$file_list +} + +ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" +if [ -r "${ARTIFACT_LIST_FILE}" ]; then + copy_artifacts "${ARTIFACT_LIST_FILE}" +fi + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Debug-input-files.xcfilelist new file mode 100644 index 00000000..7a75b8c8 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Debug-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources.sh +${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Debug-output-files.xcfilelist new file mode 100644 index 00000000..03d868ad --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Debug-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Release-input-files.xcfilelist new file mode 100644 index 00000000..7a75b8c8 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Release-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources.sh +${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Release-output-files.xcfilelist new file mode 100644 index 00000000..03d868ad --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources-Release-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources.sh b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources.sh new file mode 100755 index 00000000..af0641bf --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-resources.sh @@ -0,0 +1,129 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_resource "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle" +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find -L "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi +fi diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-umbrella.h b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-umbrella.h new file mode 100644 index 00000000..e30a2e50 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_mentorship_iosVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_mentorship_iosVersionString[]; + diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.debug.xcconfig b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.debug.xcconfig new file mode 100644 index 00000000..680fe412 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.debug.xcconfig @@ -0,0 +1,10 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_ROOT}/GoogleSignIn/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -ObjC -framework "AppAuth" -framework "CoreGraphics" -framework "CoreText" -framework "Foundation" -framework "GTMAppAuth" -framework "GTMSessionFetcher" -framework "GoogleSignIn" -framework "LocalAuthentication" -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.modulemap b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.modulemap new file mode 100644 index 00000000..4a04c1f9 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.modulemap @@ -0,0 +1,6 @@ +framework module Pods_mentorship_ios { + umbrella header "Pods-mentorship ios-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.release.xcconfig b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.release.xcconfig new file mode 100644 index 00000000..680fe412 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship ios/Pods-mentorship ios.release.xcconfig @@ -0,0 +1,10 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_ROOT}/GoogleSignIn/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -ObjC -framework "AppAuth" -framework "CoreGraphics" -framework "CoreText" -framework "Foundation" -framework "GTMAppAuth" -framework "GTMSessionFetcher" -framework "GoogleSignIn" -framework "LocalAuthentication" -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-Info.plist b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-Info.plist new file mode 100644 index 00000000..2243fe6e --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-acknowledgements.markdown new file mode 100644 index 00000000..102af753 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-acknowledgements.plist b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-acknowledgements.plist new file mode 100644 index 00000000..7acbad1e --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-dummy.m b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-dummy.m new file mode 100644 index 00000000..ae669c35 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_mentorship_iosTests : NSObject +@end +@implementation PodsDummy_Pods_mentorship_iosTests +@end diff --git a/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-umbrella.h b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-umbrella.h new file mode 100644 index 00000000..36a0e289 --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_mentorship_iosTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_mentorship_iosTestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.debug.xcconfig b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.debug.xcconfig new file mode 100644 index 00000000..a00682aa --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.debug.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_ROOT}/GoogleSignIn/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AppAuth" -framework "CoreGraphics" -framework "CoreText" -framework "Foundation" -framework "GTMAppAuth" -framework "GTMSessionFetcher" -framework "LocalAuthentication" -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.modulemap b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.modulemap new file mode 100644 index 00000000..5f9f672f --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_mentorship_iosTests { + umbrella header "Pods-mentorship iosTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.release.xcconfig b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.release.xcconfig new file mode 100644 index 00000000..a00682aa --- /dev/null +++ b/Pods/Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.release.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_ROOT}/GoogleSignIn/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AppAuth" -framework "CoreGraphics" -framework "CoreText" -framework "Foundation" -framework "GTMAppAuth" -framework "GTMSessionFetcher" -framework "LocalAuthentication" -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/mentorship ios.xcodeproj/project.pbxproj b/mentorship ios.xcodeproj/project.pbxproj index 7b10b6d2..f7a73aac 100644 --- a/mentorship ios.xcodeproj/project.pbxproj +++ b/mentorship ios.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 26456FF21393E3AB6B5DA003 /* Pods_mentorship_ios_mentorship_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C2E468318F39338BF1CD504 /* Pods_mentorship_ios_mentorship_iosUITests.framework */; }; 2B0A6F785ABDD7721B8DB7D6 /* Pods_mentorship_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F1CB15A69AE397D647DD813 /* Pods_mentorship_iosTests.framework */; }; + 450FF474259810A200F35EF2 /* CoreUserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450FF473259810A200F35EF2 /* CoreUserProfile.swift */; }; 530F44142482752500B1FD0B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530F44132482752500B1FD0B /* AppDelegate.swift */; }; 530F44162482752500B1FD0B /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530F44152482752500B1FD0B /* SceneDelegate.swift */; }; 530F44192482752500B1FD0B /* mentorship_ios.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 530F44172482752500B1FD0B /* mentorship_ios.xcdatamodeld */; }; @@ -130,6 +131,7 @@ /* Begin PBXFileReference section */ 02B5AA94E26793BDDEA92D24 /* Pods-mentorship iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mentorship iosTests.release.xcconfig"; path = "Target Support Files/Pods-mentorship iosTests/Pods-mentorship iosTests.release.xcconfig"; sourceTree = ""; }; + 450FF473259810A200F35EF2 /* CoreUserProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreUserProfile.swift; sourceTree = ""; }; 4B7C6AD7AFF5534C376F1BAF /* Pods_mentorship_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_mentorship_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4FF5654F84F759331EBDC783 /* Pods-mentorship ios-mentorship iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mentorship ios-mentorship iosUITests.release.xcconfig"; path = "Target Support Files/Pods-mentorship ios-mentorship iosUITests/Pods-mentorship ios-mentorship iosUITests.release.xcconfig"; sourceTree = ""; }; 530F44102482752500B1FD0B /* mentorship ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "mentorship ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -299,6 +301,14 @@ path = Pods; sourceTree = ""; }; + 450FF4722598104600F35EF2 /* CoredataServices */ = { + isa = PBXGroup; + children = ( + 450FF473259810A200F35EF2 /* CoreUserProfile.swift */, + ); + path = CoredataServices; + sourceTree = ""; + }; 530F44072482752500B1FD0B = { isa = PBXGroup; children = ( @@ -324,6 +334,7 @@ 530F44122482752500B1FD0B /* mentorship ios */ = { isa = PBXGroup; children = ( + 450FF4722598104600F35EF2 /* CoredataServices */, 53F0CC7024E341E800B46F19 /* mentorship ios.entitlements */, 532A652924ECF292000E4A6A /* Config */, 83AA531B249F85E7001D6B0B /* Utilities */, @@ -368,7 +379,6 @@ 53D4545324CD50F500083215 /* HomeTests.swift */, 53A6DDEF24BE52A100D5DFCE /* ProfileTests.swift */, 53A6DC8324CDAC7C00E4FE14 /* RelationTests.swift */, - 53AC6DE624D2BF8700F7FDE3 /* TaskCommentsTests.swift */, 53A6DC8524CDC4EF00E4FE14 /* MembersTests.swift */, 53A6DC8724CDCBCA00E4FE14 /* SettingsTests.swift */, 534B69D924CB6DAE007646E6 /* MockURLProtocol.swift */, @@ -976,6 +986,7 @@ 53A115D9249E1BD00065998C /* Settings.swift in Sources */, 535DD3FB24E02982006C711C /* SocialSignIn.swift in Sources */, 5311839524AB4D7B0006036F /* Relation.swift in Sources */, + 450FF474259810A200F35EF2 /* CoreUserProfile.swift in Sources */, 53ED6B0D248D04970055DFF0 /* Members.swift in Sources */, 531B75EC248524D600CEBF62 /* SignUp.swift in Sources */, 83AA531D249F860F001D6B0B /* UIHelper.swift in Sources */, diff --git a/mentorship ios/CoredataServices/CoreUserProfile.swift b/mentorship ios/CoredataServices/CoreUserProfile.swift new file mode 100644 index 00000000..308cb5d1 --- /dev/null +++ b/mentorship ios/CoredataServices/CoreUserProfile.swift @@ -0,0 +1,70 @@ +// +// CoreUserProfile.swift +// Created on 27/12/20 +// Created for AnitaB.org Mentorship-iOS +// + +import Foundation +import CoreData +import UIKit + +class CoreUserProfile { + + var HomeUserName = [UserProfileData]() + let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext + + + func NewUserCore(profile: ProfileModel.ProfileData) { + loadCoredata() + if (HomeUserName.count != 0 ){ + if(HomeUserName[0].username != profile.name?.capitalized){ + HomeUserName[0].username = profile.name?.capitalized + HomeUserName[0].id = String(profile.id) + } + } + else{ + let new = UserProfileData(context: context) + new.username = profile.name!.capitalized + new.id = String(profile.id) + HomeUserName.append(new) + } + print("printing the profile in coredata \(profile)") + saveCoredata() + print("printing cout of coredata \(String(HomeUserName.count))") + print("here we have new username ///// --------------- ///// \(HomeUserName)") + + + + } + + func test(token: String) { + let token = "Bearer " + token + print("printing token in coreasavedata \(token)") + + } + + + func loadCoredata(){ + let request : NSFetchRequest = UserProfileData.fetchRequest() + do{ + try HomeUserName = context.fetch(request) + print("printing cout of coredata \(String(HomeUserName.count))") + print("here we have new username ///// --------------- ///// \(HomeUserName)") + }catch{ + print("getting an error in loading data from core \(error)") + } + } + + func saveCoredata() { + + do{ + try context.save() + }catch{ + print("getting an error in saving coredata of username \(error)") + } + + + } + + +} diff --git a/mentorship ios/Service/Networking/LoginAPI.swift b/mentorship ios/Service/Networking/LoginAPI.swift index c1b17415..9f9f5732 100644 --- a/mentorship ios/Service/Networking/LoginAPI.swift +++ b/mentorship ios/Service/Networking/LoginAPI.swift @@ -23,6 +23,8 @@ class LoginAPI: LoginService { .sink { response in var loginResponseData = LoginModel.LoginResponseData(message: response.message) // if login successful, store access token in keychain + print("here testting the decdoed respose\(response)") +// CoreUserProfile().saveCore(token: response.accessToken!) if var token = response.accessToken { token = "Bearer " + token do { @@ -32,6 +34,7 @@ class LoginAPI: LoginService { loginResponseData.message = "Failed to save access token" } } +// CoreUserProfile().test(token: String(response.accessToken!)) // completion handler completion(loginResponseData) } @@ -51,6 +54,8 @@ class LoginAPI: LoginService { urlString: URLStringConstants.Users.login, uploadData: uploadData, keychainUsername: loginData.username) { response in + + print("login response /////// \(response)") completion(response) } } diff --git a/mentorship ios/Service/Networking/ProfileAPI.swift b/mentorship ios/Service/Networking/ProfileAPI.swift index dd866ba6..c8c93ee3 100644 --- a/mentorship ios/Service/Networking/ProfileAPI.swift +++ b/mentorship ios/Service/Networking/ProfileAPI.swift @@ -28,6 +28,8 @@ class ProfileAPI: ProfileService { .receive(on: RunLoop.main) .catch { _ in Just(ProfileViewModel().getProfile()) } .sink { profile in + //calling coredata to save profile + CoreUserProfile().NewUserCore(profile: profile) ProfileViewModel().saveProfile(profile: profile) completion(profile) } diff --git a/mentorship ios/Views/Home/Home.swift b/mentorship ios/Views/Home/Home.swift index c5325a97..c778a463 100644 --- a/mentorship ios/Views/Home/Home.swift +++ b/mentorship ios/Views/Home/Home.swift @@ -5,6 +5,7 @@ // import SwiftUI +import CoreData struct Home: View { var homeService: HomeService = HomeAPI() @@ -13,9 +14,13 @@ struct Home: View { private var relationsData: UIHelper.HomeScreen.RelationsListData { return homeViewModel.relationsListData } + //suporting variables for coredata + let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext + @State var HomeUserName = [UserProfileData]() + @State var userFirstName: String = "" - var userFirstName: String { - + + var userFirst: String { //Return just the first name if let editFullName = self.homeViewModel.userName?.capitalized { let trimmedFullName = editFullName.trimmingCharacters(in: .whitespaces) @@ -23,7 +28,6 @@ struct Home: View { return userNameAsArray[0] } return "" - } func useHomeService() { @@ -32,7 +36,6 @@ struct Home: View { home.update(viewModel: self.homeViewModel) self.homeViewModel.isLoading = false } - // if first time load, load profile too and use isLoading state (used to express in UI). if self.homeViewModel.firstTimeLoad { // set isLoading to true (expressed in UI) @@ -43,7 +46,25 @@ struct Home: View { profile.update(viewModel: self.homeViewModel) // set first time load to false self.homeViewModel.firstTimeLoad = false + //loading data from coredata , + loadCoredata() + } + + } + } + + func loadCoredata(){ + print("loadCoredata called") + + let request : NSFetchRequest = UserProfileData.fetchRequest() + do{ + try HomeUserName = context.fetch(request) + print("here we have new username ///// --------------- ///// \(HomeUserName)") + if (HomeUserName.count != 0){ + userFirstName = HomeUserName[HomeUserName.count - 1].username! } + }catch{ + print("getting an error in loading data from core \(error)") } } diff --git a/mentorship ios/mentorship_ios.xcdatamodeld/mentorship_ios.xcdatamodel/contents b/mentorship ios/mentorship_ios.xcdatamodeld/mentorship_ios.xcdatamodel/contents index 50d2514e..465ce62f 100644 --- a/mentorship ios/mentorship_ios.xcdatamodeld/mentorship_ios.xcdatamodel/contents +++ b/mentorship ios/mentorship_ios.xcdatamodeld/mentorship_ios.xcdatamodel/contents @@ -1,4 +1,10 @@ - - + + + + + + + + \ No newline at end of file

      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 z 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 <4vy%H`a(uM47i>RG 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