Skip to content

Commit 9c6c160

Browse files
committed
Fix resume response handling.
1 parent a35a25e commit 9c6c160

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed

IdentityCore/src/webview/operations/ios/MSIDSwitchBrowserOperation.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ - (void)invokeWithRequestParameters:(nonnull MSIDInteractiveTokenRequestParamete
102102

103103
NSError *localError;
104104
__auto_type response = [webRequestConfiguration responseWithResultURL:callbackURL factory:oauthFactory.webviewFactory context:requestParameters error:&localError];
105+
response.parentResponse = self.switchBrowserResponse;
105106

106107
if (localError)
107108
{

IdentityCore/src/webview/operations/ios/MSIDSwitchBrowserResumeOperation.m

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,19 @@ - (nullable instancetype)initWithResponse:(MSIDWebviewResponse *)response
6262
}
6363

6464
_switchBrowserResumeResponse = (MSIDSwitchBrowserResumeResponse *)response;
65+
66+
__auto_type parentResponse = _switchBrowserResumeResponse.parentResponse;
67+
if (![parentResponse isKindOfClass:MSIDSwitchBrowserResponse.class])
68+
{
69+
NSString *errorMsg = [NSString stringWithFormat:@"Parent response of type %@ is required for creating %@", MSIDSwitchBrowserResponse.class, self.class];
70+
MSID_LOG_WITH_CTX(MSIDLogLevelError, nil, @"%@", errorMsg);
71+
if (error)
72+
{
73+
*error = MSIDCreateError(MSIDErrorDomain, MSIDErrorInternal, errorMsg, nil, nil, nil, nil, nil, NO);
74+
}
75+
76+
return nil;
77+
}
6578
}
6679

6780
return self;

IdentityCore/src/webview/response/MSIDWebviewResponse.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@
3535
@property (atomic, readonly) NSURL *url;
3636
@property (nonatomic, class, readonly) NSString *operation;
3737

38+
/// Enables tracking of web response chains.
39+
/// For example, it is used in DUNA CBA flow to check that "swich_browser_resume" response
40+
/// was created as a result of "switch_browser" response.
41+
@property (nonatomic) MSIDWebviewResponse *parentResponse;
42+
3843
- (instancetype)initWithURL:(NSURL *)url
3944
context:(id<MSIDRequestContext>)context
4045
error:(NSError *__autoreleasing*)error;

IdentityCore/tests/MSIDSwitchBrowserResumeOperationTest.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,15 @@ import XCTest
2828
final class MSIDSwitchBrowserResumeOperationTest: XCTestCase
2929
{
3030
lazy var validSwitchBrowserResumeResponse: MSIDSwitchBrowserResumeResponse? = {
31-
let url = URL(string: "msauth.com.microsoft.msaltestapp://auth/switch_browser_resume?action_uri=some_uri&code=some_code")!
32-
return try? MSIDSwitchBrowserResumeResponse(url: url, redirectUri: "msauth.com.microsoft.msaltestapp://auth", context: nil)
31+
32+
let switchUrl = URL(string: "msauth.com.microsoft.msaltestapp://auth/switch_browser?action_uri=some_uri&code=some_code")!
33+
let switchBrowserResponse = try? MSIDSwitchBrowserResponse(url: switchUrl, redirectUri: "msauth.com.microsoft.msaltestapp://auth", context: nil)
34+
35+
let resumeUrl = URL(string: "msauth.com.microsoft.msaltestapp://auth/switch_browser_resume?action_uri=some_uri&code=some_code")!
36+
let resumeResponse = try? MSIDSwitchBrowserResumeResponse(url: resumeUrl, redirectUri: "msauth.com.microsoft.msaltestapp://auth", context: nil)
37+
resumeResponse?.parent = switchBrowserResponse
38+
39+
return resumeResponse
3340
}()
3441

3542
override func setUpWithError() throws
@@ -51,6 +58,19 @@ final class MSIDSwitchBrowserResumeOperationTest: XCTestCase
5158

5259
XCTAssertNotNil(operation)
5360
}
61+
62+
func testInit_whenNoParentResponse_shouldReturnNil() throws
63+
{
64+
XCTAssertNotNil(self.validSwitchBrowserResumeResponse)
65+
guard let response = self.validSwitchBrowserResumeResponse else { return }
66+
response.parent = nil
67+
68+
XCTAssertThrowsError(try MSIDSwitchBrowserResumeOperation(response: response)) { error in
69+
XCTAssertEqual((error as NSError).code, MSIDErrorCode.internal.rawValue)
70+
XCTAssertEqual((error as NSError).domain, MSIDErrorDomain)
71+
XCTAssertEqual((error as NSError).userInfo["MSIDErrorDescriptionKey"] as? String, "Parent response of type MSIDSwitchBrowserResponse is required for creating MSIDSwitchBrowserResumeOperation")
72+
}
73+
}
5474

5575
func testInit_withInValidResponse_shouldReturnNil() throws
5676
{

0 commit comments

Comments
 (0)