Skip to content

Crash fix - when cancelling an authentication session #917

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Revert "Merge branch 'master' into crash-fix"
This reverts commit fbfd544, reversing
changes made to 219c49f.
Prashanth committed May 22, 2025
commit 5548175cd729ac64084358b78defddd1e523e33d
4 changes: 2 additions & 2 deletions AppAuth.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|

s.name = "AppAuth"
s.version = "2.0.0"
s.version = "1.7.6"
s.summary = "AppAuth for iOS and macOS is a client SDK for communicating with OAuth 2.0 and OpenID Connect providers."

s.description = <<-DESC
@@ -31,7 +31,7 @@ It follows the OAuth 2.0 for Native Apps best current practice
# classes of AppAuth with tokens on watchOS and tvOS, but currently the
# library won't help you obtain authorization grants on those platforms.

ios_deployment_target = "12.0"
ios_deployment_target = "9.0"
osx_deployment_target = "10.12"
s.ios.deployment_target = ios_deployment_target
s.osx.deployment_target = osx_deployment_target
26 changes: 12 additions & 14 deletions AppAuth.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
@@ -2815,7 +2815,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MACOSX_DEPLOYMENT_TARGET = 10.12;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
@@ -2873,7 +2873,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MACOSX_DEPLOYMENT_TARGET = 10.12;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
@@ -2888,7 +2888,6 @@
340E73861C5D819B0076B1F6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
};
@@ -2897,7 +2896,6 @@
340E73871C5D819B0076B1F6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
};
@@ -2909,7 +2907,7 @@
CLANG_ENABLE_MODULES = YES;
HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/";
INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.AppAuthTests;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -2926,7 +2924,7 @@
CLANG_ENABLE_MODULES = YES;
HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/";
INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.AppAuthTests;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3040,7 +3038,7 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Sources/CoreFramework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = net.openid.AppAuthCore;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3066,7 +3064,7 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Sources/CoreFramework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = net.openid.AppAuthCore;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3091,7 +3089,7 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Sources/Framework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-iOS";
PRODUCT_NAME = AppAuth;
@@ -3116,7 +3114,7 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Sources/Framework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-iOS";
PRODUCT_NAME = AppAuth;
@@ -3135,7 +3133,7 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
HEADER_SEARCH_PATHS = .;
INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-iOSTests";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3149,7 +3147,7 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
HEADER_SEARCH_PATHS = .;
INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-iOSTests";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3403,7 +3401,7 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
HEADER_SEARCH_PATHS = .;
INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-ExtensionTests";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3417,7 +3415,7 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
HEADER_SEARCH_PATHS = .;
INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-ExtensionTests";
PRODUCT_NAME = "$(TARGET_NAME)";
4 changes: 0 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
# 2.0.0
- Raise minimum supported iOS version to iOS 12. ([#918](https://github.com/openid/AppAuth-iOS/pull/918))
- Remove deprecated `[UIApplication openURL:]` method to compile with Xcode 16. ([#911](https://github.com/openid/AppAuth-iOS/pull/911))

# 1.7.6
- Fix OIDExternalUserAgentIOSCustomBrowser on versions iOS 10+ ([#871](https://github.com/openid/AppAuth-iOS/pull/871))
- Update runners in tests.yml to macos-13. ([#886](https://github.com/openid/AppAuth-iOS/pull/886))
1 change: 0 additions & 1 deletion CONTRIBUTORS
Original file line number Diff line number Diff line change
@@ -20,4 +20,3 @@ Hernan Zalazar <[email protected]> https://github.com/hzalaz
Joseph Heenan <[email protected]> https://github.com/jogu
Julien Bodet <[email protected]> https://github.com/julienbodet
Tobias Schröpf <[email protected]> https://github.com/schroepf
Dave MacLachlan <[email protected]> https://github.com/dmaclach
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ let package = Package(
name: "AppAuth",
platforms: [
.macOS(.v10_12),
.iOS(.v12),
.iOS(.v9),
.tvOS(.v9),
.watchOS(.v2)
],
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ For tvOS, AppAuth implements [OAuth 2.0 Device Authorization Grant

#### Supported Versions

AppAuth supports iOS 12 and above.
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
6 changes: 4 additions & 2 deletions Sources/AppAuth/iOS/OIDExternalUserAgentIOS.h
Original file line number Diff line number Diff line change
@@ -41,8 +41,10 @@ API_UNAVAILABLE(macCatalyst)
/*! @brief The designated initializer.
@param presentingViewController The view controller from which to present the authentication UI.
@discussion The specific authentication UI used depends on the iOS version and accessibility
options. iOS 12+ uses @c ASWebAuthenticationSession (unless Guided Access is on),
otherwise local browser is used.
options. iOS 8 uses the system browser, iOS 9-10 use @c SFSafariViewController, iOS 11 uses
@c SFAuthenticationSession
(unless Guided Access is on which does not work) or uses @c SFSafariViewController, and iOS
12+ uses @c ASWebAuthenticationSession (unless Guided Access is on).
*/
- (nullable instancetype)initWithPresentingViewController:
(UIViewController *)presentingViewController
61 changes: 56 additions & 5 deletions Sources/AppAuth/iOS/OIDExternalUserAgentIOS.m
Original file line number Diff line number Diff line change
@@ -134,14 +134,59 @@ - (BOOL)presentExternalUserAgentRequest:(id<OIDExternalUserAgentRequest>)request
openedUserAgent = [_webAuthenticationVC start];
}
}
// If all else failed use the local browser.
// 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){
[[UIApplication sharedApplication] openURL:requestURL
options:@{}
completionHandler:nil];
openedUserAgent = YES;
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;
}

@@ -155,6 +200,7 @@ - (void)dismissExternalUserAgentAnimated:(BOOL)animated completion:(void (^)(voi
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpartial-availability"
SFSafariViewController *safariVC = _safariVC;
SFAuthenticationSession *authenticationVC = _authenticationVC;
ASWebAuthenticationSession *webAuthenticationVC = _webAuthenticationVC;
#pragma clang diagnostic pop

@@ -164,6 +210,10 @@ - (void)dismissExternalUserAgentAnimated:(BOOL)animated completion:(void (^)(voi
// 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];
@@ -176,6 +226,7 @@ - (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;
17 changes: 13 additions & 4 deletions Sources/AppAuth/iOS/OIDExternalUserAgentIOSCustomBrowser.m
Original file line number Diff line number Diff line change
@@ -145,17 +145,26 @@ - (BOOL)presentExternalUserAgentRequest:(nonnull id<OIDExternalUserAgentRequest>
NSString *testURLString = [NSString stringWithFormat:@"%@://example.com", _canOpenURLScheme];
NSURL *testURL = [NSURL URLWithString:testURLString];
if (![[UIApplication sharedApplication] canOpenURL:testURL]) {
[[UIApplication sharedApplication] openURL:_appStoreURL options:@{} completionHandler:nil];
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:_appStoreURL options:@{} completionHandler:nil];
} else {
[[UIApplication sharedApplication] openURL:_appStoreURL];
}
return NO;
}
}

// Transforms the request URL and opens it.
NSURL *requestURL = [request externalUserAgentRequestURL];
requestURL = _URLTransformation(requestURL);
BOOL willOpen = [[UIApplication sharedApplication] canOpenURL:requestURL];
[[UIApplication sharedApplication] openURL:requestURL options:@{} completionHandler:nil];
return willOpen;
if (@available(iOS 10.0, *)) {
BOOL willOpen = [[UIApplication sharedApplication] canOpenURL:requestURL];
[[UIApplication sharedApplication] openURL:requestURL options:@{} completionHandler:nil];
return willOpen;
} else {
BOOL openedInBrowser = [[UIApplication sharedApplication] openURL:requestURL];
return openedInBrowser;
}
}

- (void)dismissExternalUserAgentAnimated:(BOOL)animated
15 changes: 6 additions & 9 deletions Sources/AppAuthCore/OIDRegistrationRequest.m
Original file line number Diff line number Diff line change
@@ -130,15 +130,12 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder {
forKey:kConfigurationKey];
NSString *initialAccessToken = [aDecoder decodeObjectOfClass:[NSString class]
forKey:kInitialAccessToken];
NSArray<NSURL *> *redirectURIs =
[aDecoder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSURL class]]]
forKey:kRedirectURIsKey];
NSArray<NSString *> *responseTypes =
[aDecoder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSString class]]]
forKey:kResponseTypesKey];
NSArray<NSString *> *grantTypes =
[aDecoder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSString class]]]
forKey:kGrantTypesKey];
NSArray<NSURL *> *redirectURIs = [aDecoder decodeObjectOfClass:[NSArray<NSURL *> class]
forKey:kRedirectURIsKey];
NSArray<NSString *> *responseTypes = [aDecoder decodeObjectOfClass:[NSArray<NSString *> class]
forKey:kResponseTypesKey];
NSArray<NSString *> *grantTypes = [aDecoder decodeObjectOfClass:[NSArray<NSString *> class]
forKey:kGrantTypesKey];
NSString *subjectType = [aDecoder decodeObjectOfClass:[NSString class]
forKey:kSubjectTypeKey];
NSString *tokenEndpointAuthenticationMethod =
52 changes: 5 additions & 47 deletions UnitTests/OIDAuthStateTests.m
Original file line number Diff line number Diff line change
@@ -204,18 +204,7 @@ - (void)testNonCompliantNSCodingNSErrors {
NSError *oauthError =
[[self class] OAuthTokenInvalidGrantErrorWithUnderlyingError:nonCompliantError];
[authstate updateWithAuthorizationError:oauthError];
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:authstate
requiringSecureCoding:YES
error:&error];
XCTAssertNoThrow(data, @"");
} else {
#if !TARGET_OS_IOS
XCTAssertNoThrow([NSKeyedArchiver archivedDataWithRootObject:authstate], @"");
#endif
}
XCTAssertNoThrow([NSKeyedArchiver archivedDataWithRootObject:authstate], @"");
}

/*! @brief Tests @c OIDAuthState.updateWithAuthorizationResponse:error: with a success response.
@@ -369,22 +358,8 @@ - (void)testSecureCoding {
XCTAssert([OIDAuthState supportsSecureCoding], @"");

OIDAuthState *authState = [[self class] testInstance];
OIDAuthState *authStateCopy;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:authState
requiringSecureCoding:YES
error:&error];
authStateCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthState class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:authState];
authStateCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:authState];
OIDAuthState *authStateCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

XCTAssertEqualObjects(authStateCopy.refreshToken, authState.refreshToken, @"");
XCTAssertEqualObjects(authStateCopy.scope, authState.scope, @"");
@@ -400,26 +375,9 @@ - (void)testSecureCoding {
// Verify the error object is indeed restored.
NSError *oauthError = [[self class] OAuthTokenInvalidGrantErrorWithUnderlyingError:nil];
[authState updateWithTokenResponse:nil error:oauthError];
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:authState
requiringSecureCoding:YES
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:authState];
#endif
}
data = [NSKeyedArchiver archivedDataWithRootObject:authState];
XCTAssertNotNil(authState.authorizationError, @"");

if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
authStateCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthState class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
authStateCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
authStateCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
XCTAssertEqualObjects(authStateCopy.authorizationError.domain,
authState.authorizationError.domain, @"");
XCTAssertEqual(authStateCopy.authorizationError.code, authState.authorizationError.code, @"");
18 changes: 2 additions & 16 deletions UnitTests/OIDAuthorizationRequestTests.m
Original file line number Diff line number Diff line change
@@ -322,22 +322,8 @@ - (void)testSecureCoding {
XCTAssertEqualObjects(request.additionalParameters[kTestAdditionalParameterKey],
kTestAdditionalParameterValue, @"");

OIDAuthorizationRequest *requestCopy;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:request
requiringSecureCoding:YES
error:&error];
requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthorizationRequest class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:request];
requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:request];
OIDAuthorizationRequest *requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

// Not a full test of the configuration deserialization, but should be sufficient as a smoke test
// to make sure the configuration IS actually getting serialized and deserialized in the
18 changes: 2 additions & 16 deletions UnitTests/OIDAuthorizationResponseTests.m
Original file line number Diff line number Diff line change
@@ -158,22 +158,8 @@ - (void)testCopying {
*/
- (void)testSecureCoding {
OIDAuthorizationResponse *response = [[self class] testInstance];
OIDAuthorizationResponse *responseCopy;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:response
requiringSecureCoding:YES
error:&error];
responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthorizationResponse class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:response];
responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:response];
OIDAuthorizationResponse *responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

// Not a full test of the request deserialization, but should be sufficient as a smoke test
// to make sure the request IS actually getting serialized and deserialized in the
18 changes: 2 additions & 16 deletions UnitTests/OIDEndSessionRequestTests.m
Original file line number Diff line number Diff line change
@@ -97,22 +97,8 @@ - (void)testSecureCoding {
XCTAssertEqualObjects(request.additionalParameters[kTestAdditionalParameterKey],
kTestAdditionalParameterValue);

OIDEndSessionRequest *requestCopy;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:request
requiringSecureCoding:YES
error:&error];
requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDEndSessionRequest class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:request];
requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:request];
OIDEndSessionRequest *requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

XCTAssertNotNil(requestCopy.configuration);
XCTAssertEqualObjects(requestCopy.configuration.authorizationEndpoint,
18 changes: 2 additions & 16 deletions UnitTests/OIDRegistrationRequestTests.m
Original file line number Diff line number Diff line change
@@ -142,22 +142,8 @@ - (void)testSecureCoding {
XCTAssertEqualObjects(request.additionalParameters[kTestAdditionalParameterKey],
kTestAdditionalParameterValue);

OIDRegistrationRequest *requestCopy;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:request
requiringSecureCoding:YES
error:&error];
requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDRegistrationRequest class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:request];
requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:request];
OIDRegistrationRequest *requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

// Not a full test of the configuration deserialization, but should be sufficient as a smoke test
// to make sure the configuration IS actually getting serialized and deserialized in the
18 changes: 2 additions & 16 deletions UnitTests/OIDRegistrationResponseTests.m
Original file line number Diff line number Diff line change
@@ -119,22 +119,8 @@ - (void)testCopying {
*/
- (void)testSecureCoding {
OIDRegistrationResponse *response = [[self class] testInstance];
OIDRegistrationResponse *responseCopy;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:response
requiringSecureCoding:YES
error:&error];
responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDRegistrationResponse class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:response];
responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:response];
OIDRegistrationResponse *responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

// Not a full test of the request deserialization, but should be sufficient as a smoke test
// to make sure the request IS actually getting serialized and deserialized in the
18 changes: 2 additions & 16 deletions UnitTests/OIDServiceConfigurationTests.m
Original file line number Diff line number Diff line change
@@ -363,22 +363,8 @@ - (void)testFetcherWithBadJSON {
*/
- (void)testSecureCoding {
OIDServiceConfiguration *configuration = [[self class] testInstance];
OIDServiceConfiguration *unarchived;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:configuration
requiringSecureCoding:YES
error:&error];
unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDServiceConfiguration class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:configuration];
unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:configuration];
OIDServiceConfiguration *unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data];

XCTAssertEqualObjects(configuration.authorizationEndpoint, unarchived.authorizationEndpoint, @"");
XCTAssertEqualObjects(configuration.tokenEndpoint, unarchived.tokenEndpoint, @"");
24 changes: 6 additions & 18 deletions UnitTests/OIDServiceDiscoveryTests.m
Original file line number Diff line number Diff line change
@@ -448,25 +448,21 @@ - (void)testSecureCoding {
[[OIDServiceDiscovery alloc] initWithDictionary:serviceDiscoveryDictionary
error:&error];
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:discovery
requiringSecureCoding:YES
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:discovery];
#endif
}

OIDServiceDiscovery *unarchived;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDServiceDiscovery class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}

XCTAssertEqualObjects(discovery.discoveryDictionary, unarchived.discoveryDictionary);
@@ -482,18 +478,16 @@ - (void)testSecureCodingDecodeOld {
[[OIDServiceDiscoveryOldEncoding alloc] initWithDictionary:serviceDiscoveryDictionary
error:&error];
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:discovery
requiringSecureCoding:YES
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:discovery];
#endif
}

OIDServiceDiscovery *unarchived;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
NSSet<Class> *allowedClasses = [NSSet setWithArray:@[[OIDServiceDiscovery class],
[NSDictionary class],
[NSArray class],
@@ -504,9 +498,7 @@ - (void)testSecureCodingDecodeOld {
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}

XCTAssertEqualObjects(discovery.discoveryDictionary, unarchived.discoveryDictionary);
@@ -522,18 +514,16 @@ - (void)testSecureCodingOldDecodeNew {
[[OIDServiceDiscoveryOldDecoding alloc] initWithDictionary:serviceDiscoveryDictionary
error:&error];
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:discovery
requiringSecureCoding:YES
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:discovery];
#endif
}

OIDServiceDiscovery *unarchived;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
NSSet<Class> *allowedClasses = [NSSet setWithArray:@[[OIDServiceDiscoveryOldDecoding class],
[NSDictionary class],
[NSArray class],
@@ -544,9 +534,7 @@ - (void)testSecureCodingOldDecodeNew {
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
XCTAssertNil(error);
XCTAssertEqualObjects(discovery.discoveryDictionary, unarchived.discoveryDictionary);
18 changes: 2 additions & 16 deletions UnitTests/OIDTokenRequestTests.m
Original file line number Diff line number Diff line change
@@ -278,22 +278,8 @@ - (void)testSecureCoding {
XCTAssertEqualObjects([urlRequest.allHTTPHeaderFields objectForKey:kTestAdditionalHeaderKey],
kTestAdditionalHeaderValue);

OIDTokenRequest *requestCopy;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:request
requiringSecureCoding:YES
error:&error];
requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTokenRequest class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:request];
requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:request];
OIDTokenRequest *requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

// Not a full test of the configuration deserialization, but should be sufficient as a smoke test
// to make sure the configuration IS actually getting serialized and deserialized in the
18 changes: 2 additions & 16 deletions UnitTests/OIDTokenResponseTests.m
Original file line number Diff line number Diff line change
@@ -175,22 +175,8 @@ - (void)testCopying {
*/
- (void)testSecureCoding {
OIDTokenResponse *response = [[self class] testInstance];
OIDTokenResponse *responseCopy;
NSError *error;
NSData *data;
if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) {
data = [NSKeyedArchiver archivedDataWithRootObject:response
requiringSecureCoding:YES
error:&error];
responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTokenResponse class]
fromData:data
error:&error];
} else {
#if !TARGET_OS_IOS
data = [NSKeyedArchiver archivedDataWithRootObject:response];
responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
#endif
}
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:response];
OIDTokenResponse *responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

// Not a full test of the request deserialization, but should be sufficient as a smoke test
// to make sure the request IS actually getting serialized and deserialized in the