Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions libs/SalesforceSDKCore/SalesforceSDKCore.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
23EED88A2E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EED8892E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift */; };
23EED8912E2ACF3900646B10 /* MockNavigationAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EED8902E2ACF3100646B10 /* MockNavigationAction.swift */; };
23F200AC2E551C890091C5F5 /* ActionTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23F200AB2E551C890091C5F5 /* ActionTypeTests.swift */; };
23F200AE2E551C890091C5F5 /* BootconfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23F200AD2E551C890091C5F5 /* BootconfigTests.swift */; };
444B95D01E83251900908C61 /* UIColor+SFColorsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 444B95CF1E83251900908C61 /* UIColor+SFColorsTests.m */; };
4F06AF731C49A16A00F70798 /* NSURL+SFStringUtilsTests.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F06AF5D1C49A16A00F70798 /* NSURL+SFStringUtilsTests.h */; };
4F06AF751C49A16A00F70798 /* SalesforceOAuthUnitTests.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F06AF5F1C49A16A00F70798 /* SalesforceOAuthUnitTests.h */; };
Expand All @@ -81,6 +82,8 @@
4F3139682331C5C7007B3705 /* SFSDKAuthRootController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F3139672331C5B9007B3705 /* SFSDKAuthRootController.h */; };
4F5727E327F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F5727DC27F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
4F5727E427F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F5727E227F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.m */; };
4F5A49502E98711600C89DDD /* ScopeParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F5A494F2E98711600C89DDD /* ScopeParser.swift */; };
4F5A49582E98B0F800C89DDD /* ScopeParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F5A49572E98B0F800C89DDD /* ScopeParserTests.swift */; };
4F755F5820D48F8600CE4E0E /* NSString+SFAdditionsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F755F4120D48D6700CE4E0E /* NSString+SFAdditionsTests.m */; };
4F7EB40D1BFFC88200768720 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8280EC1716E15FFC00768DE8 /* MessageUI.framework */; };
4F7EB4101BFFC88200768720 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8220B74F16D804CA00EC3921 /* Foundation.framework */; };
Expand Down Expand Up @@ -575,6 +578,7 @@
23EED8892E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SFOAuthCoordinatorTests.swift; path = SalesforceSDKCoreTests/SFOAuthCoordinatorTests.swift; sourceTree = SOURCE_ROOT; };
23EED8902E2ACF3100646B10 /* MockNavigationAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNavigationAction.swift; sourceTree = "<group>"; };
23F200AB2E551C890091C5F5 /* ActionTypeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ActionTypeTests.swift; path = SalesforceSDKCoreTests/ActionTypeTests.swift; sourceTree = SOURCE_ROOT; };
23F200AD2E551C890091C5F5 /* BootconfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = BootconfigTests.swift; path = SalesforceSDKCoreTests/BootconfigTests.swift; sourceTree = SOURCE_ROOT; };
444B95CF1E83251900908C61 /* UIColor+SFColorsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SFColorsTests.m"; path = "SalesforceSDKCoreTests/UIColor+SFColorsTests.m"; sourceTree = SOURCE_ROOT; };
4F06AF5D1C49A16A00F70798 /* NSURL+SFStringUtilsTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSURL+SFStringUtilsTests.h"; path = "SalesforceSDKCoreTests/NSURL+SFStringUtilsTests.h"; sourceTree = SOURCE_ROOT; };
4F06AF5E1C49A16A00F70798 /* NSURL+SFStringUtilsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSURL+SFStringUtilsTests.m"; path = "SalesforceSDKCoreTests/NSURL+SFStringUtilsTests.m"; sourceTree = SOURCE_ROOT; };
Expand All @@ -598,6 +602,8 @@
4F3139672331C5B9007B3705 /* SFSDKAuthRootController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SFSDKAuthRootController.h; sourceTree = "<group>"; };
4F5727DC27F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFSDKPrimingRecordsResponse.h; sourceTree = "<group>"; };
4F5727E227F27F1A0008CDA4 /* SFSDKPrimingRecordsResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFSDKPrimingRecordsResponse.m; sourceTree = "<group>"; };
4F5A494F2E98711600C89DDD /* ScopeParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScopeParser.swift; sourceTree = "<group>"; };
4F5A49572E98B0F800C89DDD /* ScopeParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ScopeParserTests.swift; path = ../SalesforceSDKCoreTests/ScopeParserTests.swift; sourceTree = "<group>"; };
4F755F4120D48D6700CE4E0E /* NSString+SFAdditionsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSString+SFAdditionsTests.m"; path = "SalesforceSDKCoreTests/NSString+SFAdditionsTests.m"; sourceTree = SOURCE_ROOT; };
4F7EB3F71BFFC87600768720 /* SDKCommonNSDataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDKCommonNSDataTests.m; path = SalesforceSDKCoreTests/SDKCommonNSDataTests.m; sourceTree = SOURCE_ROOT; };
4F7EB3F81BFFC87600768720 /* SFEncryptionKeyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SFEncryptionKeyTests.m; path = SalesforceSDKCoreTests/SFEncryptionKeyTests.m; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -694,8 +700,8 @@
4F96FD471BFD32140022F021 /* SFSDKResourceUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFSDKResourceUtils.m; sourceTree = "<group>"; };
4F96FD481BFD32140022F021 /* SFSDKWebUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFSDKWebUtils.h; sourceTree = "<group>"; };
4F96FD491BFD32140022F021 /* SFSDKWebUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFSDKWebUtils.m; sourceTree = "<group>"; };
4F9E052C2DD6A06F00548985 /* SFSDKOAuthTokenEndpointResponseTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SFSDKOAuthTokenEndpointResponseTests.m; sourceTree = "<group>"; };
4F9E05332DD7BE0A00548985 /* SFOAuthCredentialsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SFOAuthCredentialsTests.m; sourceTree = "<group>"; };
4F9E052C2DD6A06F00548985 /* SFSDKOAuthTokenEndpointResponseTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SFSDKOAuthTokenEndpointResponseTests.m; path = ../SalesforceSDKCoreTests/SFSDKOAuthTokenEndpointResponseTests.m; sourceTree = "<group>"; };
4F9E05332DD7BE0A00548985 /* SFOAuthCredentialsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SFOAuthCredentialsTests.m; path = ../SalesforceSDKCoreTests/SFOAuthCredentialsTests.m; sourceTree = "<group>"; };
4FEE438A1BFD488900F09C43 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
4FF945BD1BFFF47D005368C5 /* NSData+SFAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+SFAdditions.h"; sourceTree = "<group>"; };
4FF945BE1BFFF47D005368C5 /* NSData+SFAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+SFAdditions.m"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1040,7 +1046,9 @@
4F7EB3F61BFFC84700768720 /* SalesforceSDKCoreTests */ = {
isa = PBXGroup;
children = (
4F5A49572E98B0F800C89DDD /* ScopeParserTests.swift */,
23F200AB2E551C890091C5F5 /* ActionTypeTests.swift */,
23F200AD2E551C890091C5F5 /* BootconfigTests.swift */,
23EED8892E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift */,
23D96B752E145B400004B06A /* DomainDiscoveryCoordinatorTests.swift */,
237C18722E450B710008015C /* DecryptStreamTests.swift */,
Expand Down Expand Up @@ -1207,6 +1215,7 @@
4F96FCC41BFD32130022F021 /* OAuth */ = {
isa = PBXGroup;
children = (
4F5A494F2E98711600C89DDD /* ScopeParser.swift */,
23D96B6E2E145AC20004B06A /* DomainDiscoveryCoordinator.swift */,
4F8A3B002CEC202F00ECDC76 /* JwtAccessToken.swift */,
4F96FCC61BFD32130022F021 /* SFOAuthCoordinator.h */,
Expand Down Expand Up @@ -2206,6 +2215,7 @@
6975869F23296D7500574148 /* SFSDKURLCacheTests.m in Sources */,
4F06AF911C49A18E00F70798 /* SFOAuthTestFlowCoordinatorDelegate.m in Sources */,
238AA5802D827AF80036667C /* PushNotificationManagerTests.swift in Sources */,
4F5A49582E98B0F800C89DDD /* ScopeParserTests.swift in Sources */,
6931EA49248F000600417362 /* SFUserIdUpgradeTests.m in Sources */,
696D6C3E2DD7E0AD00138888 /* NewLoginHostTests.swift in Sources */,
CEB98EE21F86E7D70083AB9C /* SFSDKIDPLoginRequestCommandTest.m in Sources */,
Expand Down Expand Up @@ -2237,6 +2247,7 @@
4F7EB4161BFFC8D700768720 /* SDKCommonNSDataTests.m in Sources */,
CE81A9C81E9C26F900F3D0AD /* SFUserAccountManagerNotificationsTests.m in Sources */,
23F200AC2E551C890091C5F5 /* ActionTypeTests.swift in Sources */,
23F200AE2E551C890091C5F5 /* BootconfigTests.swift in Sources */,
4F7EB4171BFFC8D700768720 /* SFEncryptionKeyTests.m in Sources */,
69848CBD2364063E00893E57 /* SFSDKPushNotificationDataProvider.m in Sources */,
23A4C7492D0CAFCF00DF55EB /* NativeLoginManagerTests.swift in Sources */,
Expand Down Expand Up @@ -2449,6 +2460,7 @@
B7460C1C2347E1A100C7512E /* SFSDKBatchResponse.m in Sources */,
A3C7476129F709EB00D72B7F /* BiometricAuthenticationManagerInternal.swift in Sources */,
B7FB26DB1F78096300FB25A2 /* SFSDKIDPErrorHandler.m in Sources */,
4F5A49502E98711600C89DDD /* ScopeParser.swift in Sources */,
6941BE662D2F0E1B00CEC59B /* NewLoginHostView.swift in Sources */,
B7677051223AE5E400545C90 /* SFUserAccountManager+Instrumentation.m in Sources */,
E1C80CF01C5AEE31001B3A21 /* SFSDKLoginHostListViewController.m in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,6 @@ - (BOOL)validate:(NSError **)error {
[[self class] createError:error withCode:SFSDKAppConfigErrorCodeNoRedirectURI message:[SFSDKResourceUtils localizedString:@"appConfigValidationErrorNoRedirectURI"]];
return NO;
}
if (self.oauthScopes.count == 0) {
[[self class] createError:error withCode:SFSDKAppConfigErrorCodeNoOAuthScopes message:[SFSDKResourceUtils localizedString:@"appConfigValidationErrorNoOAuthScopes"]];
Copy link
Member

@bbirman bbirman Oct 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could appConfigValidationErrorNoOAuthScopes be removed from the strings file?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do.

return NO;
}

return YES;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#import "SFNetwork.h"
#import "SFSDKAuthSession.h"
#import "SFIdentityData+Internal.h"
#import "SalesforceSDKCore/SalesforceSDKCore-Swift.h"

// Public constants

Expand Down Expand Up @@ -134,6 +135,11 @@ - (NSString *)validateParameters
if ([invalidParameters length] > 0) [invalidParameters appendString:@", "];
[invalidParameters appendString:@"identity URL"];
}
SFScopeParser *scopeParser = [[SFScopeParser alloc] initWithScopes:self.credentials.scopes];
if (![scopeParser hasIdentityScope]) {
if ([invalidParameters length] > 0) [invalidParameters appendString:@", "];
[invalidParameters appendString:@"identity scope"];
}

NSString *invalidParametersError = nil;
if ([invalidParameters length] > 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ NS_ASSUME_NONNULL_BEGIN

- (void)beginWebViewFlow;

/**
* Returns the scope query parameter string for OAuth requests.
* @return A properly formatted scope parameter string, or empty string if no scopes provided.
*/
- (NSString *)scopeQueryParamString;

@end

NS_ASSUME_NONNULL_END
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
#import "SFSDKAuthRequest.h"
#import <SalesforceSDKCommon/SalesforceSDKCommon-Swift.h>
#import <SalesforceSDKCommon/SFSDKDatasharingHelper.h>
#import <SalesforceSDKCore/SalesforceSDKCore-Swift.h>
#import <LocalAuthentication/LocalAuthentication.h>
@interface SFOAuthCoordinator()

Expand Down Expand Up @@ -630,6 +629,11 @@ - (void)beginHeadlessNativeLoginFlow {

- (void)handleResponse:(SFSDKOAuthTokenEndpointResponse *)response {
if (!response.hasError) {
// Check if refresh token scope is present in the response
SFScopeParser *scopeParser = [[SFScopeParser alloc] initWithScopes:response.scopes];
if (![scopeParser hasRefreshTokenScope]) {
[SFSDKCoreLogger w:[self class] format:@"Missing refresh token scope."];
}
[self.credentials updateCredentials:[response asDictionary]];
if (response.additionalOAuthFields)
self.credentials.additionalOAuthFields = response.additionalOAuthFields;
Expand Down Expand Up @@ -796,7 +800,7 @@ - (NSString *)approvalURLForEndpoint:(NSString *)authorizeEndpoint

// OAuth scopes
NSString *scopeString = [self scopeQueryParamString];
if (scopeString != nil) {
if (scopeString.length > 0) {
[approvalUrlString appendString:scopeString];
}

Expand All @@ -817,10 +821,12 @@ -(void) clearFrontDoorBridgeLoginOverride {
}

- (NSString *)scopeQueryParamString {
NSMutableSet *scopes = (self.scopes.count > 0 ? [NSMutableSet setWithSet:self.scopes] : [NSMutableSet set]);
[scopes addObject:kSFOAuthRefreshToken];
NSString *scopeStr = [[[scopes allObjects] componentsJoinedByString:@" "] sfsdk_stringByURLEncoding];
return [NSString stringWithFormat:@"&%@=%@", kSFOAuthScope, scopeStr];
if (self.scopes.count > 0) {
NSString *scopeStr = [SFScopeParser computeScopeParameterWithURLEncodingWithScopes:self.scopes];
return [NSString stringWithFormat:@"&%@=%@", kSFOAuthScope, scopeStr];
} else {
return @"";
}
}

- (NSURLSession*)session {
Expand Down
Loading
Loading