Skip to content

Commit f71eda5

Browse files
authored
Merge pull request #3943 from wmathurin/zero_scopes_2
Allowing no scopes to be provided
2 parents cb196ef + 92164b4 commit f71eda5

File tree

15 files changed

+683
-32
lines changed

15 files changed

+683
-32
lines changed

libs/SalesforceSDKCore/SalesforceSDKCore.xcodeproj/project.pbxproj

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
23EED88A2E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EED8892E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift */; };
5757
23EED8912E2ACF3900646B10 /* MockNavigationAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EED8902E2ACF3100646B10 /* MockNavigationAction.swift */; };
5858
23F200AC2E551C890091C5F5 /* ActionTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23F200AB2E551C890091C5F5 /* ActionTypeTests.swift */; };
59+
23F200AE2E551C890091C5F5 /* BootconfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23F200AD2E551C890091C5F5 /* BootconfigTests.swift */; };
5960
444B95D01E83251900908C61 /* UIColor+SFColorsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 444B95CF1E83251900908C61 /* UIColor+SFColorsTests.m */; };
6061
4F06AF731C49A16A00F70798 /* NSURL+SFStringUtilsTests.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F06AF5D1C49A16A00F70798 /* NSURL+SFStringUtilsTests.h */; };
6162
4F06AF751C49A16A00F70798 /* SalesforceOAuthUnitTests.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F06AF5F1C49A16A00F70798 /* SalesforceOAuthUnitTests.h */; };
@@ -81,6 +82,8 @@
8182
4F3139682331C5C7007B3705 /* SFSDKAuthRootController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F3139672331C5B9007B3705 /* SFSDKAuthRootController.h */; };
8283
4F5727E327F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F5727DC27F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
8384
4F5727E427F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F5727E227F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.m */; };
85+
4F5A49502E98711600C89DDD /* ScopeParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F5A494F2E98711600C89DDD /* ScopeParser.swift */; };
86+
4F5A49582E98B0F800C89DDD /* ScopeParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F5A49572E98B0F800C89DDD /* ScopeParserTests.swift */; };
8487
4F755F5820D48F8600CE4E0E /* NSString+SFAdditionsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F755F4120D48D6700CE4E0E /* NSString+SFAdditionsTests.m */; };
8588
4F7EB40D1BFFC88200768720 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8280EC1716E15FFC00768DE8 /* MessageUI.framework */; };
8689
4F7EB4101BFFC88200768720 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8220B74F16D804CA00EC3921 /* Foundation.framework */; };
@@ -575,6 +578,7 @@
575578
23EED8892E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SFOAuthCoordinatorTests.swift; path = SalesforceSDKCoreTests/SFOAuthCoordinatorTests.swift; sourceTree = SOURCE_ROOT; };
576579
23EED8902E2ACF3100646B10 /* MockNavigationAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNavigationAction.swift; sourceTree = "<group>"; };
577580
23F200AB2E551C890091C5F5 /* ActionTypeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ActionTypeTests.swift; path = SalesforceSDKCoreTests/ActionTypeTests.swift; sourceTree = SOURCE_ROOT; };
581+
23F200AD2E551C890091C5F5 /* BootconfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = BootconfigTests.swift; path = SalesforceSDKCoreTests/BootconfigTests.swift; sourceTree = SOURCE_ROOT; };
578582
444B95CF1E83251900908C61 /* UIColor+SFColorsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SFColorsTests.m"; path = "SalesforceSDKCoreTests/UIColor+SFColorsTests.m"; sourceTree = SOURCE_ROOT; };
579583
4F06AF5D1C49A16A00F70798 /* NSURL+SFStringUtilsTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSURL+SFStringUtilsTests.h"; path = "SalesforceSDKCoreTests/NSURL+SFStringUtilsTests.h"; sourceTree = SOURCE_ROOT; };
580584
4F06AF5E1C49A16A00F70798 /* NSURL+SFStringUtilsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSURL+SFStringUtilsTests.m"; path = "SalesforceSDKCoreTests/NSURL+SFStringUtilsTests.m"; sourceTree = SOURCE_ROOT; };
@@ -598,6 +602,8 @@
598602
4F3139672331C5B9007B3705 /* SFSDKAuthRootController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SFSDKAuthRootController.h; sourceTree = "<group>"; };
599603
4F5727DC27F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFSDKPrimingRecordsResponse.h; sourceTree = "<group>"; };
600604
4F5727E227F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFSDKPrimingRecordsResponse.m; sourceTree = "<group>"; };
605+
4F5A494F2E98711600C89DDD /* ScopeParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScopeParser.swift; sourceTree = "<group>"; };
606+
4F5A49572E98B0F800C89DDD /* ScopeParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ScopeParserTests.swift; path = ../SalesforceSDKCoreTests/ScopeParserTests.swift; sourceTree = "<group>"; };
601607
4F755F4120D48D6700CE4E0E /* NSString+SFAdditionsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSString+SFAdditionsTests.m"; path = "SalesforceSDKCoreTests/NSString+SFAdditionsTests.m"; sourceTree = SOURCE_ROOT; };
602608
4F7EB3F71BFFC87600768720 /* SDKCommonNSDataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDKCommonNSDataTests.m; path = SalesforceSDKCoreTests/SDKCommonNSDataTests.m; sourceTree = SOURCE_ROOT; };
603609
4F7EB3F81BFFC87600768720 /* SFEncryptionKeyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SFEncryptionKeyTests.m; path = SalesforceSDKCoreTests/SFEncryptionKeyTests.m; sourceTree = SOURCE_ROOT; };
@@ -694,8 +700,8 @@
694700
4F96FD471BFD32140022F021 /* SFSDKResourceUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFSDKResourceUtils.m; sourceTree = "<group>"; };
695701
4F96FD481BFD32140022F021 /* SFSDKWebUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFSDKWebUtils.h; sourceTree = "<group>"; };
696702
4F96FD491BFD32140022F021 /* SFSDKWebUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFSDKWebUtils.m; sourceTree = "<group>"; };
697-
4F9E052C2DD6A06F00548985 /* SFSDKOAuthTokenEndpointResponseTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SFSDKOAuthTokenEndpointResponseTests.m; sourceTree = "<group>"; };
698-
4F9E05332DD7BE0A00548985 /* SFOAuthCredentialsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SFOAuthCredentialsTests.m; sourceTree = "<group>"; };
703+
4F9E052C2DD6A06F00548985 /* SFSDKOAuthTokenEndpointResponseTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SFSDKOAuthTokenEndpointResponseTests.m; path = ../SalesforceSDKCoreTests/SFSDKOAuthTokenEndpointResponseTests.m; sourceTree = "<group>"; };
704+
4F9E05332DD7BE0A00548985 /* SFOAuthCredentialsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SFOAuthCredentialsTests.m; path = ../SalesforceSDKCoreTests/SFOAuthCredentialsTests.m; sourceTree = "<group>"; };
699705
4FEE438A1BFD488900F09C43 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
700706
4FF945BD1BFFF47D005368C5 /* NSData+SFAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+SFAdditions.h"; sourceTree = "<group>"; };
701707
4FF945BE1BFFF47D005368C5 /* NSData+SFAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+SFAdditions.m"; sourceTree = "<group>"; };
@@ -1040,7 +1046,9 @@
10401046
4F7EB3F61BFFC84700768720 /* SalesforceSDKCoreTests */ = {
10411047
isa = PBXGroup;
10421048
children = (
1049+
4F5A49572E98B0F800C89DDD /* ScopeParserTests.swift */,
10431050
23F200AB2E551C890091C5F5 /* ActionTypeTests.swift */,
1051+
23F200AD2E551C890091C5F5 /* BootconfigTests.swift */,
10441052
23EED8892E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift */,
10451053
23D96B752E145B400004B06A /* DomainDiscoveryCoordinatorTests.swift */,
10461054
237C18722E450B710008015C /* DecryptStreamTests.swift */,
@@ -1207,6 +1215,7 @@
12071215
4F96FCC41BFD32130022F021 /* OAuth */ = {
12081216
isa = PBXGroup;
12091217
children = (
1218+
4F5A494F2E98711600C89DDD /* ScopeParser.swift */,
12101219
23D96B6E2E145AC20004B06A /* DomainDiscoveryCoordinator.swift */,
12111220
4F8A3B002CEC202F00ECDC76 /* JwtAccessToken.swift */,
12121221
4F96FCC61BFD32130022F021 /* SFOAuthCoordinator.h */,
@@ -2206,6 +2215,7 @@
22062215
6975869F23296D7500574148 /* SFSDKURLCacheTests.m in Sources */,
22072216
4F06AF911C49A18E00F70798 /* SFOAuthTestFlowCoordinatorDelegate.m in Sources */,
22082217
238AA5802D827AF80036667C /* PushNotificationManagerTests.swift in Sources */,
2218+
4F5A49582E98B0F800C89DDD /* ScopeParserTests.swift in Sources */,
22092219
6931EA49248F000600417362 /* SFUserIdUpgradeTests.m in Sources */,
22102220
696D6C3E2DD7E0AD00138888 /* NewLoginHostTests.swift in Sources */,
22112221
CEB98EE21F86E7D70083AB9C /* SFSDKIDPLoginRequestCommandTest.m in Sources */,
@@ -2237,6 +2247,7 @@
22372247
4F7EB4161BFFC8D700768720 /* SDKCommonNSDataTests.m in Sources */,
22382248
CE81A9C81E9C26F900F3D0AD /* SFUserAccountManagerNotificationsTests.m in Sources */,
22392249
23F200AC2E551C890091C5F5 /* ActionTypeTests.swift in Sources */,
2250+
23F200AE2E551C890091C5F5 /* BootconfigTests.swift in Sources */,
22402251
4F7EB4171BFFC8D700768720 /* SFEncryptionKeyTests.m in Sources */,
22412252
69848CBD2364063E00893E57 /* SFSDKPushNotificationDataProvider.m in Sources */,
22422253
23A4C7492D0CAFCF00DF55EB /* NativeLoginManagerTests.swift in Sources */,
@@ -2449,6 +2460,7 @@
24492460
B7460C1C2347E1A100C7512E /* SFSDKBatchResponse.m in Sources */,
24502461
A3C7476129F709EB00D72B7F /* BiometricAuthenticationManagerInternal.swift in Sources */,
24512462
B7FB26DB1F78096300FB25A2 /* SFSDKIDPErrorHandler.m in Sources */,
2463+
4F5A49502E98711600C89DDD /* ScopeParser.swift in Sources */,
24522464
6941BE662D2F0E1B00CEC59B /* NewLoginHostView.swift in Sources */,
24532465
B7677051223AE5E400545C90 /* SFUserAccountManager+Instrumentation.m in Sources */,
24542466
E1C80CF01C5AEE31001B3A21 /* SFSDKLoginHostListViewController.m in Sources */,

libs/SalesforceSDKCore/SalesforceSDKCore/Classes/Common/SFSDKAppConfig.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
typedef NS_ENUM(NSInteger, SFSDKAppConfigErrorCode) {
2828
SFSDKAppConfigErrorCodeNoConsumerKey = 966,
2929
SFSDKAppConfigErrorCodeNoRedirectURI,
30-
SFSDKAppConfigErrorCodeNoOAuthScopes
3130
} NS_SWIFT_NAME(BootConfig.ErrorCode);
3231

3332
extern NSString * _Nonnull const SFSDKAppConfigErrorDomain NS_SWIFT_NAME(BootConfig.errorDomain);

libs/SalesforceSDKCore/SalesforceSDKCore/Classes/Common/SFSDKAppConfig.m

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,6 @@ - (BOOL)validate:(NSError **)error {
100100
[[self class] createError:error withCode:SFSDKAppConfigErrorCodeNoRedirectURI message:[SFSDKResourceUtils localizedString:@"appConfigValidationErrorNoRedirectURI"]];
101101
return NO;
102102
}
103-
if (self.oauthScopes.count == 0) {
104-
[[self class] createError:error withCode:SFSDKAppConfigErrorCodeNoOAuthScopes message:[SFSDKResourceUtils localizedString:@"appConfigValidationErrorNoOAuthScopes"]];
105-
return NO;
106-
}
107103

108104
return YES;
109105
}

libs/SalesforceSDKCore/SalesforceSDKCore/Classes/Identity/SFIdentityCoordinator.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#import "SFNetwork.h"
3131
#import "SFSDKAuthSession.h"
3232
#import "SFIdentityData+Internal.h"
33+
#import "SalesforceSDKCore/SalesforceSDKCore-Swift.h"
3334

3435
// Public constants
3536

@@ -134,6 +135,11 @@ - (NSString *)validateParameters
134135
if ([invalidParameters length] > 0) [invalidParameters appendString:@", "];
135136
[invalidParameters appendString:@"identity URL"];
136137
}
138+
SFScopeParser *scopeParser = [[SFScopeParser alloc] initWithScopes:self.credentials.scopes];
139+
if (![scopeParser hasIdentityScope]) {
140+
if ([invalidParameters length] > 0) [invalidParameters appendString:@", "];
141+
[invalidParameters appendString:@"identity scope"];
142+
}
137143

138144
NSString *invalidParametersError = nil;
139145
if ([invalidParameters length] > 0) {

libs/SalesforceSDKCore/SalesforceSDKCore/Classes/OAuth/SFOAuthCoordinator+Internal.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ NS_ASSUME_NONNULL_BEGIN
7777

7878
- (void)beginWebViewFlow;
7979

80+
/**
81+
* Returns the scope query parameter string for OAuth requests.
82+
* @return A properly formatted scope parameter string, or empty string if no scopes provided.
83+
*/
84+
- (NSString *)scopeQueryParamString;
85+
8086
@end
8187

8288
NS_ASSUME_NONNULL_END

libs/SalesforceSDKCore/SalesforceSDKCore/Classes/OAuth/SFOAuthCoordinator.m

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
#import "SFSDKAuthRequest.h"
5252
#import <SalesforceSDKCommon/SalesforceSDKCommon-Swift.h>
5353
#import <SalesforceSDKCommon/SFSDKDatasharingHelper.h>
54-
#import <SalesforceSDKCore/SalesforceSDKCore-Swift.h>
5554
#import <LocalAuthentication/LocalAuthentication.h>
5655
@interface SFOAuthCoordinator()
5756

@@ -630,6 +629,11 @@ - (void)beginHeadlessNativeLoginFlow {
630629

631630
- (void)handleResponse:(SFSDKOAuthTokenEndpointResponse *)response {
632631
if (!response.hasError) {
632+
// Check if refresh token scope is present in the response
633+
SFScopeParser *scopeParser = [[SFScopeParser alloc] initWithScopes:response.scopes];
634+
if (![scopeParser hasRefreshTokenScope]) {
635+
[SFSDKCoreLogger w:[self class] format:@"Missing refresh token scope."];
636+
}
633637
[self.credentials updateCredentials:[response asDictionary]];
634638
if (response.additionalOAuthFields)
635639
self.credentials.additionalOAuthFields = response.additionalOAuthFields;
@@ -796,7 +800,7 @@ - (NSString *)approvalURLForEndpoint:(NSString *)authorizeEndpoint
796800

797801
// OAuth scopes
798802
NSString *scopeString = [self scopeQueryParamString];
799-
if (scopeString != nil) {
803+
if (scopeString.length > 0) {
800804
[approvalUrlString appendString:scopeString];
801805
}
802806

@@ -817,10 +821,12 @@ -(void) clearFrontDoorBridgeLoginOverride {
817821
}
818822

819823
- (NSString *)scopeQueryParamString {
820-
NSMutableSet *scopes = (self.scopes.count > 0 ? [NSMutableSet setWithSet:self.scopes] : [NSMutableSet set]);
821-
[scopes addObject:kSFOAuthRefreshToken];
822-
NSString *scopeStr = [[[scopes allObjects] componentsJoinedByString:@" "] sfsdk_stringByURLEncoding];
823-
return [NSString stringWithFormat:@"&%@=%@", kSFOAuthScope, scopeStr];
824+
if (self.scopes.count > 0) {
825+
NSString *scopeStr = [SFScopeParser computeScopeParameterWithURLEncodingWithScopes:self.scopes];
826+
return [NSString stringWithFormat:@"&%@=%@", kSFOAuthScope, scopeStr];
827+
} else {
828+
return @"";
829+
}
824830
}
825831

826832
- (NSURLSession*)session {

0 commit comments

Comments
 (0)