Skip to content

Commit 9bd5556

Browse files
Kai SongKai Song
authored andcommitted
Add enum to enabl/disable XPC service
1 parent 019d5d3 commit 9bd5556

File tree

5 files changed

+154
-8
lines changed

5 files changed

+154
-8
lines changed

IdentityCore/src/MSIDConstants.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ typedef NS_ENUM(NSInteger, MSIDHeaderType)
9393
MSIDHeaderTypeDeviceRegistration
9494
};
9595

96+
typedef NS_ENUM(NSUInteger, MSIDXpcMode)
97+
{
98+
MSIDXpcModeDisable = 0,
99+
MSIDXpcModeBackup,
100+
MSIDXpcModeFull
101+
};
102+
96103
typedef void (^MSIDRequestCompletionBlock)(MSIDTokenResult * _Nullable result, NSError * _Nullable error);
97104
typedef void (^MSIDSignoutRequestCompletionBlock)(BOOL success, NSError * _Nullable error);
98105
typedef void (^MSIDGetAccountsRequestCompletionBlock)(NSArray<MSIDAccount *> * _Nullable accounts, BOOL returnBrokerAccountsOnly, NSError * _Nullable error);

IdentityCore/src/controllers/MSIDRequestControllerFactory.m

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,21 @@ @implementation MSIDRequestControllerFactory
162162
fallbackController.isLocalFallbackMode = YES;
163163
}
164164

165+
MSIDSilentController *xpcController = nil;
165166
#if TARGET_OS_OSX
166-
if (parameters.enableXpcFlow && [MSIDXpcSilentTokenRequestController canPerformRequest])
167+
if (parameters.xpcMode != MSIDXpcModeDisable && [MSIDXpcSilentTokenRequestController canPerformRequest])
167168
{
168-
fallbackController = [[MSIDXpcSilentTokenRequestController alloc] initWithRequestParameters:parameters
169+
xpcController = [[MSIDXpcSilentTokenRequestController alloc] initWithRequestParameters:parameters
169170
forceRefresh:forceRefresh
170171
tokenRequestProvider:tokenRequestProvider
171172
fallbackInteractiveController:fallbackController
172173
error:error];
174+
if (parameters.xpcMode == MSIDXpcModeFull)
175+
{
176+
// If in Xpc full mode, the XPCController will work as a isolated controller when SsoExtension cannotPerformRequest
177+
fallbackController = xpcController;
178+
xpcController = nil;
179+
}
173180
}
174181
#endif
175182

@@ -178,7 +185,7 @@ @implementation MSIDRequestControllerFactory
178185
fallbackController = [[MSIDSSOExtensionSilentTokenRequestController alloc] initWithRequestParameters:parameters
179186
forceRefresh:forceRefresh
180187
tokenRequestProvider:tokenRequestProvider
181-
fallbackInteractiveController:fallbackController
188+
fallbackInteractiveController:xpcController?:fallbackController
182189
error:error];
183190
}
184191
}

IdentityCore/src/parameters/MSIDRequestParameters.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
@property (nonatomic) NSUInteger tokenExpirationBuffer;
7474
@property (nonatomic) BOOL extendedLifetimeEnabled;
7575
@property (nonatomic) BOOL instanceAware;
76-
@property (nonatomic) BOOL enableXpcFlow;
7776
@property (nonatomic) BOOL allowUsingLocalCachedRtWhenSsoExtFailed;
7877
@property (nonatomic) BOOL clientBrokerKeyCapabilityNotSupported;
7978
@property (nonatomic) NSString *intuneApplicationIdentifier;
@@ -109,6 +108,9 @@
109108
#pragma mark - SSO context
110109
@property (nonatomic) MSIDExternalSSOContext *ssoContext;
111110

111+
#pragma mark - Xpc Mode
112+
@property (nonatomic) MSIDXpcMode xpcMode;
113+
112114
- (NSURL *)tokenEndpoint;
113115

114116
#pragma mark Methods

IdentityCore/src/util/MSIDXpcSingleSignOnProvider.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ - (void)handleRequestParam:(NSDictionary *)requestParam
142142

143143
+ (BOOL)canPerformRequest
144144
{
145-
// This will be upgraded in item: xxx
145+
// TODO: The full implementation will be done in 3166516
146146
// Synchronously entering this class method
147147
@synchronized (self) {
148148
dispatch_group_t group = dispatch_group_create();

IdentityCore/tests/MSIDRequestControllerFactoryTests.m

Lines changed: 133 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,14 +198,76 @@ - (void)testWhenUseLocalRt_isUnDefined_shouldSkip_whenFallBackController_isValid
198198
XCTAssertTrue([(MSIDSilentController *)controller skipLocalRt]);
199199
}
200200

201+
201202
#if TARGET_OS_OSX
202-
- (void)testWhenSsoExtensionIsEnabled_andXPCIsEnabled_controllersOrder_areCorrect
203+
- (void)testWhenSsoExtensionIsEnabled_andXpcIsPartiallyEnabled_andSsoExtensionIsDisabled_controllersOrder_areCorrect
203204
{
204205
MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc] initWithTestResponse:nil
205206
testError:nil
206207
testWebMSAuthResponse:nil];
207208
MSIDRequestParameters *parameters = [self requestParameters];
208-
parameters.enableXpcFlow = YES;
209+
parameters.xpcMode = MSIDXpcModeBackup;
210+
parameters.allowUsingLocalCachedRtWhenSsoExtFailed = YES;
211+
212+
NSError *error;
213+
SEL selectorForMSIDSSOExtensionSilentTokenRequestController = NSSelectorFromString(@"canPerformRequest");
214+
[MSIDTestSwizzle classMethod:selectorForMSIDSSOExtensionSilentTokenRequestController
215+
class:[MSIDSSOExtensionSilentTokenRequestController class]
216+
block:(id)^(void)
217+
{
218+
return NO;
219+
}];
220+
221+
SEL selectorForMSIDXpcSilentTokenRequestController = NSSelectorFromString(@"canPerformRequest");
222+
[MSIDTestSwizzle classMethod:selectorForMSIDXpcSilentTokenRequestController
223+
class:[MSIDXpcSilentTokenRequestController class]
224+
block:(id)^(void)
225+
{
226+
return YES;
227+
}];
228+
229+
SEL selectorForMSIDRequestParameters = NSSelectorFromString(@"shouldUseBroker");
230+
[MSIDTestSwizzle instanceMethod:selectorForMSIDRequestParameters
231+
class:[MSIDRequestParameters class]
232+
block:(id)^(void)
233+
{
234+
return YES;
235+
}];
236+
237+
id<MSIDRequestControlling> controller = [MSIDRequestControllerFactory silentControllerForParameters:parameters
238+
forceRefresh:NO
239+
skipLocalRt:MSIDSilentControllerForceSkippingLocalRt
240+
tokenRequestProvider:provider
241+
error:&error];
242+
// 1. Start with local signin controller to read cached tokens
243+
if (![controller isMemberOfClass:MSIDSilentController.class])
244+
{
245+
XCTFail();
246+
}
247+
248+
XCTAssertTrue([(MSIDSilentController *)controller skipLocalRt]);
249+
XCTAssertFalse([(MSIDSilentController *)controller forceRefresh]);
250+
251+
MSIDBaseRequestController *baseController = (MSIDBaseRequestController *)controller;
252+
253+
// 2. When SsoExtension controller disabled, use local signin controller to refresh. XPC is ignore as it is in XPC backup mode
254+
if (![baseController.fallbackController isMemberOfClass:MSIDSilentController.class])
255+
{
256+
XCTFail();
257+
}
258+
259+
baseController = (MSIDSilentController *)baseController.fallbackController;
260+
XCTAssertTrue([(MSIDSilentController *)baseController forceRefresh]);
261+
XCTAssertTrue([(MSIDSilentController *)baseController isLocalFallbackMode]);
262+
}
263+
264+
- (void)testWhenSsoExtensionIsEnabled_andXpcIsPartiallyEnabled_andSsoExtensionIsEnabled_controllersOrder_areCorrect
265+
{
266+
MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc] initWithTestResponse:nil
267+
testError:nil
268+
testWebMSAuthResponse:nil];
269+
MSIDRequestParameters *parameters = [self requestParameters];
270+
parameters.xpcMode = MSIDXpcModeBackup;
209271
parameters.allowUsingLocalCachedRtWhenSsoExtFailed = YES;
210272

211273
NSError *error;
@@ -272,9 +334,77 @@ - (void)testWhenSsoExtensionIsEnabled_andXPCIsEnabled_controllersOrder_areCorrec
272334
XCTAssertTrue([(MSIDSilentController *)baseController forceRefresh]);
273335
XCTAssertTrue([(MSIDSilentController *)baseController isLocalFallbackMode]);
274336
}
337+
338+
- (void)testWhenSsoExtensionIsEnabled_andXpcIsFullyEnabled_andSsoExtensionIsDisabled_controllersOrder_areCorrect
339+
{
340+
MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc] initWithTestResponse:nil
341+
testError:nil
342+
testWebMSAuthResponse:nil];
343+
MSIDRequestParameters *parameters = [self requestParameters];
344+
parameters.xpcMode = MSIDXpcModeFull;
345+
parameters.allowUsingLocalCachedRtWhenSsoExtFailed = YES;
346+
347+
NSError *error;
348+
SEL selectorForMSIDSSOExtensionSilentTokenRequestController = NSSelectorFromString(@"canPerformRequest");
349+
[MSIDTestSwizzle classMethod:selectorForMSIDSSOExtensionSilentTokenRequestController
350+
class:[MSIDSSOExtensionSilentTokenRequestController class]
351+
block:(id)^(void)
352+
{
353+
return NO;
354+
}];
355+
356+
SEL selectorForMSIDXpcSilentTokenRequestController = NSSelectorFromString(@"canPerformRequest");
357+
[MSIDTestSwizzle classMethod:selectorForMSIDXpcSilentTokenRequestController
358+
class:[MSIDXpcSilentTokenRequestController class]
359+
block:(id)^(void)
360+
{
361+
return YES;
362+
}];
363+
364+
SEL selectorForMSIDRequestParameters = NSSelectorFromString(@"shouldUseBroker");
365+
[MSIDTestSwizzle instanceMethod:selectorForMSIDRequestParameters
366+
class:[MSIDRequestParameters class]
367+
block:(id)^(void)
368+
{
369+
return YES;
370+
}];
371+
372+
id<MSIDRequestControlling> controller = [MSIDRequestControllerFactory silentControllerForParameters:parameters
373+
forceRefresh:NO
374+
skipLocalRt:MSIDSilentControllerForceSkippingLocalRt
375+
tokenRequestProvider:provider
376+
error:&error];
377+
// 1. Start with local signin controller to read cached tokens
378+
if (![controller isMemberOfClass:MSIDSilentController.class])
379+
{
380+
XCTFail();
381+
}
382+
383+
XCTAssertTrue([(MSIDSilentController *)controller skipLocalRt]);
384+
XCTAssertFalse([(MSIDSilentController *)controller forceRefresh]);
385+
386+
// 2. When local signin controller failed, use SsoExtension controller
387+
MSIDBaseRequestController *baseController = (MSIDBaseRequestController *)controller;
388+
if (![baseController.fallbackController isMemberOfClass:MSIDXpcSilentTokenRequestController.class])
389+
{
390+
XCTFail();
391+
}
392+
393+
// 2. When SsoExtension controller failed, use Xpc Controller
394+
baseController = (MSIDXpcSilentTokenRequestController *)baseController.fallbackController;
395+
if (![baseController.fallbackController isMemberOfClass:MSIDSilentController.class])
396+
{
397+
XCTFail();
398+
}
399+
400+
// 3. When Xpc controller failed, use local signin controller to refresh
401+
baseController = (MSIDSilentController *)baseController.fallbackController;
402+
XCTAssertTrue([(MSIDSilentController *)baseController forceRefresh]);
403+
XCTAssertTrue([(MSIDSilentController *)baseController isLocalFallbackMode]);
404+
}
275405
#endif
276406

277-
- (void)testWhenSsoExtensionIsEnabled_andXPCIsDisabled_controllersOrder_areCorrect
407+
- (void)testWhenSsoExtensionIsEnabled_andXpcIsDisabled_controllersOrder_areCorrect
278408
{
279409
MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc] initWithTestResponse:nil
280410
testError:nil

0 commit comments

Comments
 (0)