diff --git a/MSAL/IdentityCore b/MSAL/IdentityCore index d18b6e4b11..a98d6ed570 160000 --- a/MSAL/IdentityCore +++ b/MSAL/IdentityCore @@ -1 +1 @@ -Subproject commit d18b6e4b1170a0421bb6880fc55046aaaa494d77 +Subproject commit a98d6ed57059b061b4bf9267fdec278a0090cb82 diff --git a/MSAL/src/requests/MSALRequestParameters.h b/MSAL/src/requests/MSALRequestParameters.h index 7ae30e53a9..7979b78a96 100644 --- a/MSAL/src/requests/MSALRequestParameters.h +++ b/MSAL/src/requests/MSALRequestParameters.h @@ -61,6 +61,7 @@ @property NSUUID *correlationId; @property NSString *logComponent; @property NSString *telemetryRequestId; +@property NSDictionary *appRequestMetadata; @property (readonly) MSIDConfiguration *msidConfiguration; @property MSIDOauth2Factory *msidOAuthFactory; diff --git a/MSAL/src/requests/MSALRequestParameters.m b/MSAL/src/requests/MSALRequestParameters.m index bbf4de9368..2d89331c97 100644 --- a/MSAL/src/requests/MSALRequestParameters.m +++ b/MSAL/src/requests/MSALRequestParameters.m @@ -32,9 +32,40 @@ #import "NSOrderedSet+MSIDExtensions.h" #import "MSIDAuthorityFactory.h" #import "MSALAuthority.h" +#import "MSIDConstants.h" @implementation MSALRequestParameters +- (instancetype)init +{ + self = [super init]; + + if (self) + { + [self initDefaultAppMetadata]; + } + + return self; +} + +- (void)initDefaultAppMetadata +{ + NSDictionary *metadata = [[NSBundle mainBundle] infoDictionary]; + + NSString *appName = metadata[@"CFBundleDisplayName"]; + + if (!appName) + { + appName = metadata[@"CFBundleName"]; + } + + NSString *appVer = metadata[@"CFBundleShortVersionString"]; + + _appRequestMetadata = @{MSID_VERSION_KEY: @MSAL_VERSION_STRING, + MSID_APP_NAME_KEY: appName ? appName : @"", + MSID_APP_VER_KEY: appVer ? appVer : @""}; +} + - (void)setScopesFromArray:(NSArray *)scopes { NSMutableArray *scopesLowercase = [NSMutableArray new]; diff --git a/MSAL/test/unit/MSALAcquireTokenTests.m b/MSAL/test/unit/MSALAcquireTokenTests.m index ad19ca92d8..914dc48d0a 100644 --- a/MSAL/test/unit/MSALAcquireTokenTests.m +++ b/MSAL/test/unit/MSALAcquireTokenTests.m @@ -1099,11 +1099,8 @@ - (void)addTestTokenResponseWithResponseScopes:(NSString *)responseScopes NSDictionary *clientInfo = @{ @"uid" : @"1", @"utid" : [MSALTestIdTokenUtil defaultTenantId]}; // Token request response. - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; - [reqHeaders setObject:[MSIDTestRequireValueSentinel new] forKey:@"client-request-id"]; NSString *url = [NSString stringWithFormat:@"%@/oauth2/v2.0/token", authority]; diff --git a/MSAL/test/unit/MSALInteractiveRequestTests.m b/MSAL/test/unit/MSALInteractiveRequestTests.m index acce26e3f9..3c1982bbe4 100644 --- a/MSAL/test/unit/MSALInteractiveRequestTests.m +++ b/MSAL/test/unit/MSALInteractiveRequestTests.m @@ -153,12 +153,9 @@ - (void)testInteractiveRequestFlow_whenValid_shouldReturnResultWithNoError completionHandler(oauthResponse, nil); }]; - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; - [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; - + NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token"; MSIDTestURLResponse *response = @@ -379,11 +376,8 @@ - (void)testInteractiveRequestFlow_whenValidWithUser_shouldReturnResultWithNoErr completionHandler(oauthResponse, nil); }]; - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; - [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token"; @@ -499,11 +493,8 @@ - (void)testInteractiveRequestFlow_whenUserMismatch_shouldReturnNilResultWithErr completionHandler(oauthResponse, nil); }]; - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; - [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token"; @@ -592,11 +583,8 @@ - (void)testInteractiveRequestFlow_whenNoAccessTokenReturned_shouldReturnError completionHandler(oauthResponse, nil); }]; - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; - [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token"; diff --git a/MSAL/test/unit/MSALSilentRequestTests.m b/MSAL/test/unit/MSALSilentRequestTests.m index a7ee91052c..c8cf77f048 100644 --- a/MSAL/test/unit/MSALSilentRequestTests.m +++ b/MSAL/test/unit/MSALSilentRequestTests.m @@ -262,10 +262,8 @@ - (void)testAtsAuthorityATExpired error:nil]; XCTAssertTrue(result); - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token?slice=myslice"; @@ -366,10 +364,8 @@ - (void)testAtsAuthority_whenATExpiresIn50WithinExpirationBuffer100_shouldReAcqu error:nil]; XCTAssertTrue(result); - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token?slice=myslice"; @@ -469,10 +465,8 @@ - (void)testAtsHomeAuthorityATExpired error:nil]; XCTAssertTrue(result); - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/1234-5678-90abcdefg/oauth2/v2.0/token"; @@ -652,10 +646,8 @@ - (void)testAtsAuthorityForceUpdate result = [self.tokenCacheAccessor removeToken:accessToken context:nil error:nil]; XCTAssertTrue(result); - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token"; @@ -807,10 +799,8 @@ - (void)testAtsAuthorityForceUpdateUserNotMatch result = [self.tokenCacheAccessor removeToken:accessToken context:nil error:nil]; XCTAssertTrue(result); - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token"; @@ -918,10 +908,8 @@ - (void)testSilentRequest_whenForceUpdateAndNoATReturned_shouldReturnError result = [self.tokenCacheAccessor removeToken:accessToken context:nil error:nil]; XCTAssertTrue(result); - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token"; @@ -1028,10 +1016,8 @@ - (void)testSilentRequest_whenResiliencyErrorReturned_shouldRetryRequestOnceAndS MSIDTestURLResponse *oidcResponse = [MSIDTestURLResponse oidcResponseForAuthority:@"https://login.microsoftonline.com/common"]; [MSIDTestURLSession addResponses:@[discoveryResponse, oidcResponse]]; - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; // Create failing response first @@ -1154,10 +1140,8 @@ - (void)testSilentRequest_when429ThrottledErrorReturned_shouldReturnAllHeadersAn MSIDTestURLResponse *oidcResponse = [MSIDTestURLResponse oidcResponseForAuthority:@"https://login.microsoftonline.com/common"]; [MSIDTestURLSession addResponses:@[discoveryResponse, oidcResponse]]; - NSMutableDictionary *reqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [reqHeaders setObject:@"true" forKey:@"return-client-request-id"]; + NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msalDefaultRequestHeaders] mutableCopy]; [reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; - [reqHeaders setObject:@"application/json" forKey:@"Accept"]; [reqHeaders setObject:correlationId.UUIDString forKey:@"client-request-id"]; NSString *url = @"https://login.microsoftonline.com/common/oauth2/v2.0/token?slice=myslice"; diff --git a/MSAL/test/unit/ios/unit-test-host/Info.plist b/MSAL/test/unit/ios/unit-test-host/Info.plist index d052473868..6168538f7f 100644 --- a/MSAL/test/unit/ios/unit-test-host/Info.plist +++ b/MSAL/test/unit/ios/unit-test-host/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion en + CFBundleDisplayName + UnitTestHost CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/MSAL/test/unit/telemetry/MSALTelemetryDispatcherTests.m b/MSAL/test/unit/telemetry/MSALTelemetryDispatcherTests.m index 2102696356..96040e6798 100644 --- a/MSAL/test/unit/telemetry/MSALTelemetryDispatcherTests.m +++ b/MSAL/test/unit/telemetry/MSALTelemetryDispatcherTests.m @@ -73,6 +73,12 @@ - (NSString *)logComponent return nil; } +- (NSDictionary *)appRequestMetadata +{ + return nil; +} + + - (NSURLSession *)urlSession { return nil; diff --git a/MSAL/test/unit/utils/MSIDTestURLResponse+MSAL.h b/MSAL/test/unit/utils/MSIDTestURLResponse+MSAL.h index 7b43530b85..8928117793 100644 --- a/MSAL/test/unit/utils/MSIDTestURLResponse+MSAL.h +++ b/MSAL/test/unit/utils/MSIDTestURLResponse+MSAL.h @@ -31,6 +31,8 @@ @interface MSIDTestURLResponse (MSAL) ++ (NSDictionary *)msalDefaultRequestHeaders; + + (MSIDTestURLResponse *)discoveryResponseForAuthority:(NSString *)authority; + (MSIDTestURLResponse *)oidcResponseForAuthority:(NSString *)authority; diff --git a/MSAL/test/unit/utils/MSIDTestURLResponse+MSAL.m b/MSAL/test/unit/utils/MSIDTestURLResponse+MSAL.m index fb15f11eb2..ea1f2d2235 100644 --- a/MSAL/test/unit/utils/MSIDTestURLResponse+MSAL.m +++ b/MSAL/test/unit/utils/MSIDTestURLResponse+MSAL.m @@ -37,12 +37,28 @@ @implementation MSIDTestURLResponse (MSAL) ++ (NSDictionary *)msalDefaultRequestHeaders +{ + static NSDictionary *s_msalHeaders = nil; + static dispatch_once_t headersOnce; + + dispatch_once(&headersOnce, ^{ + NSMutableDictionary *headers = [[MSIDDeviceId deviceId] mutableCopy]; + headers[@"return-client-request-id"] = @"true"; + headers[@"client-request-id"] = [MSIDTestRequireValueSentinel sentinel]; + headers[@"Accept"] = @"application/json"; + headers[@"x-app-name"] = @"UnitTestHost"; + headers[@"x-app-ver"] = @"1.0"; + + s_msalHeaders = [headers copy]; + }); + + return s_msalHeaders; +} + + (MSIDTestURLResponse *)oidcResponseForAuthority:(NSString *)authority { - NSMutableDictionary *oidcReqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [oidcReqHeaders setObject:@"true" forKey:@"return-client-request-id"]; - [oidcReqHeaders setObject:[MSIDTestRequireValueSentinel new] forKey:@"client-request-id"]; - [oidcReqHeaders setObject:@"application/json" forKey:@"Accept"]; + NSDictionary *oidcReqHeaders = [self msalDefaultRequestHeaders]; NSDictionary *oidcJson = @{ @"token_endpoint" : [NSString stringWithFormat:@"%@/oauth2/v2.0/token", authority], @@ -75,11 +91,8 @@ + (MSIDTestURLResponse *)discoveryResponseForAuthority:(NSString *)authority MSIDTestURLResponse *discoveryResponse = [MSIDTestURLResponse request:[NSURL URLWithString:requestUrl] reponse:httpResponse]; - NSMutableDictionary *headers = [[MSIDDeviceId deviceId] mutableCopy]; - headers[@"Accept"] = @"application/json"; - headers[@"return-client-request-id"] = @"true"; - headers[@"client-request-id"] = [MSIDTestRequireValueSentinel new]; - discoveryResponse->_requestHeaders = headers; + NSDictionary *headers = [self msalDefaultRequestHeaders]; + discoveryResponse->_requestHeaders = [headers mutableCopy]; NSString *tenantDiscoveryEndpoint = [NSString stringWithFormat:@"%@/v2.0/.well-known/openid-configuration", authority]; @@ -106,10 +119,7 @@ + (MSIDTestURLResponse *)oidcResponseForAuthority:(NSString *)authority responseUrl:(NSString *)responseAuthority query:(NSString *)query { - NSMutableDictionary *oidcReqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [oidcReqHeaders setObject:@"true" forKey:@"return-client-request-id"]; - [oidcReqHeaders setObject:[MSIDTestRequireValueSentinel new] forKey:@"client-request-id"]; - [oidcReqHeaders setObject:@"application/json" forKey:@"Accept"]; + NSDictionary *oidcReqHeaders = [self msalDefaultRequestHeaders]; NSString *queryString = query ? [NSString stringWithFormat:@"?%@", query] : @""; @@ -136,11 +146,7 @@ + (MSIDTestURLResponse *)rtResponseForScopes:(MSALScopes *)scopes tenantId:(NSString *)tid user:(MSALAccount *)user { - NSMutableDictionary *tokenReqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [tokenReqHeaders setObject:@"application/json" forKey:@"Accept"]; - [tokenReqHeaders setObject:[MSIDTestRequireValueSentinel new] forKey:@"client-request-id"]; - [tokenReqHeaders setObject:@"true" forKey:@"return-client-request-id"]; - [tokenReqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; + NSDictionary *tokenReqHeaders = [self msalDefaultRequestHeaders]; MSIDTestURLResponse *tokenResponse = [MSIDTestURLResponse requestURLString:[NSString stringWithFormat:@"%@/oauth2/v2.0/token", authority] @@ -175,11 +181,7 @@ + (MSIDTestURLResponse *)errorRtResponseForScopes:(MSALScopes *)scopes errorDescription:(NSString *)errorDescription subError:(NSString *)subError { - NSMutableDictionary *tokenReqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [tokenReqHeaders setObject:@"application/json" forKey:@"Accept"]; - [tokenReqHeaders setObject:[MSIDTestRequireValueSentinel new] forKey:@"client-request-id"]; - [tokenReqHeaders setObject:@"true" forKey:@"return-client-request-id"]; - [tokenReqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; + NSDictionary *tokenReqHeaders = [self msalDefaultRequestHeaders]; MSIDTestURLResponse *tokenResponse = [MSIDTestURLResponse requestURLString:[NSString stringWithFormat:@"%@/oauth2/v2.0/token", authority] @@ -220,11 +222,7 @@ + (MSIDTestURLResponse *)authCodeResponse:(NSString *)authcode scopes:(MSALScopes *)scopes clientInfo:(NSDictionary *)clientInfo { - NSMutableDictionary *tokenReqHeaders = [[MSIDDeviceId deviceId] mutableCopy]; - [tokenReqHeaders setObject:@"application/json" forKey:@"Accept"]; - [tokenReqHeaders setObject:[MSIDTestRequireValueSentinel new] forKey:@"client-request-id"]; - [tokenReqHeaders setObject:@"true" forKey:@"return-client-request-id"]; - [tokenReqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"]; + NSDictionary *tokenReqHeaders = [self msalDefaultRequestHeaders]; NSMutableDictionary *tokenQPs = [NSMutableDictionary new]; if (query)