@@ -38,6 +38,7 @@ + (NSString *)operation
3838
3939- (instancetype )initWithURL : (NSURL *)url
4040 redirectUri : (NSString *)redirectUri
41+ requestState : (NSString *)requestState
4142 context : (id <MSIDRequestContext>)context
4243 error : (NSError *__autoreleasing*)error
4344{
@@ -48,8 +49,26 @@ - (instancetype)initWithURL:(NSURL *)url
4849 if (self)
4950 {
5051 if (![self isMyUrl: url redirectUri: redirectUri]) return nil ;
52+
53+ if ([MSIDFlightManager.sharedInstance boolForKey: MSID_FLIGHT_SUPPORT_STATE_DUNA_CBA])
54+ {
55+ NSError *stateCheckError = nil ;
56+ BOOL stateValidated = [MSIDSwitchBrowserResponse validateStateParameter: self .parameters[MSID_OAUTH2_STATE]
57+ expectedState: requestState
58+ error: &stateCheckError];
59+ if (!stateValidated)
60+ {
61+ if (stateCheckError && error)
62+ {
63+ *error = stateCheckError;
64+ }
65+ return nil ;
66+ }
67+ }
68+
5169 _actionUri = self.parameters [@" action_uri" ];
5270 _useEphemeralWebBrowserSession = YES ;
71+ _state = self.parameters [MSID_OAUTH2_STATE];
5372
5473 NSString * browserOptionsString = self.parameters [@" browser_modes" ];
5574 if (browserOptionsString)
@@ -105,6 +124,45 @@ + (BOOL)isDUNAActionUrl:(NSURL *)url operation:(NSString *)operation
105124 return NO ;
106125}
107126
127+ + (BOOL )validateStateParameter : (NSString *)receivedState
128+ expectedState : (NSString *)expectedState
129+ error : (NSError *__autoreleasing*)error
130+ {
131+ if (!receivedState && !expectedState)
132+ {
133+ return YES ;
134+ }
135+
136+ if (!expectedState || !receivedState)
137+ {
138+ if (error)
139+ {
140+ *error = MSIDCreateError (MSIDOAuthErrorDomain,
141+ MSIDErrorServerInvalidState,
142+ [NSString stringWithFormat: @" Missing or invalid state returned state: %@ " , receivedState],
143+ nil , nil , nil , nil , nil , YES );
144+ }
145+ return NO ;
146+ }
147+
148+ BOOL result = [receivedState.msidBase64UrlDecode isEqualToString: expectedState];
149+
150+ if (!result)
151+ {
152+ MSID_LOG_WITH_CTX (MSIDLogLevelError, nil , @" State parameter mismatch" );
153+ if (error)
154+ {
155+ *error = MSIDCreateError (MSIDOAuthErrorDomain,
156+ MSIDErrorServerInvalidState,
157+ [NSString stringWithFormat: @" State parameter mismatch. Expected: %@ , Received: %@ " , expectedState, receivedState],
158+ nil , nil , nil , nil , nil , YES );
159+ }
160+ return NO ;
161+ }
162+
163+ return YES ;
164+ }
165+
108166#pragma mark - Private
109167
110168- (BOOL )isMyUrl : (NSURL *)url
0 commit comments