Skip to content

Commit 0fdc294

Browse files
@W-19461882: [M1][MSDK13.1] Enable Flexible Server Matching for QR Code Login (iOS)
1 parent 7fa72d8 commit 0fdc294

1 file changed

Lines changed: 68 additions & 1 deletion

File tree

libs/SalesforceSDKCore/SalesforceSDKCore/Classes/OAuth/AuthCoordinatorFrontdoorBridgeLoginOverride.swift

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,79 @@ public class AuthCoordinatorFrontdoorBridgeLoginOverride: NSObject {
7373
self.matchesConsumerKey = frontdoorBridgeUrlClientId == appConsumerKey
7474

7575
// Check if the front door URL host matches the app's selected login host
76-
self.matchesLoginHost = frontdoorBridgeUrl.host() == UserAccountManager.shared.loginHost
76+
var appLoginHost = appLoginHostForFrontdoorBridgeUrl(frontdoorBridgeUrl)
77+
if (appLoginHost == nil && addingAndSwitchingLoginHostsAllowed) {
78+
appLoginHost = addAppLoginHostForFrontdoorBridgeUrl(frontdoorBridgeUrl)
79+
}
80+
if let appLoginHost = appLoginHost {
81+
self.matchesLoginHost = true
82+
UserAccountManager.shared.loginHost = appLoginHost
83+
}
7784

7885
// Only set the properties if the front door URL host and the start URL consumer key match the app's current values.
7986
if self.matchesLoginHost && self.matchesConsumerKey {
8087
self.codeVerifier = codeVerifier
8188
self.frontdoorBridgeUrl = frontdoorBridgeUrl
8289
}
8390
}
91+
92+
private var addingAndSwitchingLoginHostsAllowed: Bool {
93+
!SFManagedPreferences.shared().onlyShowAuthorizedHosts && SFManagedPreferences.shared().loginHosts.count == 0
94+
}
95+
96+
private var loginHostStorage: SFSDKLoginHostStorage {
97+
SFSDKLoginHostStorage.sharedInstance()
98+
}
99+
100+
private func addAppLoginHostForFrontdoorBridgeUrl(_ frontdoorBridgeUrl: URL) -> String? {
101+
guard let frontdoorBridgeUrlHost = frontdoorBridgeUrl.host() else {
102+
return nil
103+
}
104+
105+
loginHostStorage.add(SalesforceLoginHost(
106+
name: frontdoorBridgeUrlHost,
107+
host: frontdoorBridgeUrl.absoluteString,
108+
deletable: true))
109+
return frontdoorBridgeUrlHost
110+
}
111+
112+
private func appLoginHostForFrontdoorBridgeUrl(_ frontdoorBridgeUrl: URL) -> String? {
113+
guard let frontdoorBridgeUrlHost = frontdoorBridgeUrl.host() else {
114+
return nil
115+
}
116+
117+
let frontdoorBridgeUrlIsMyDomain = frontdoorBridgeUrlHost.contains(".my.")
118+
119+
var eligibleAppLoginHosts : [String] = []
120+
if (addingAndSwitchingLoginHostsAllowed) {
121+
for i in 0..<loginHostStorage.numberOfLoginHosts() {
122+
eligibleAppLoginHosts.append(loginHostStorage.loginHost(at: i).host)
123+
}
124+
}
125+
else {
126+
eligibleAppLoginHosts = [UserAccountManager.shared.loginHost]
127+
}
128+
129+
if (frontdoorBridgeUrlIsMyDomain) {
130+
guard let startIndex = frontdoorBridgeUrlHost.range(of: ".my.")?.upperBound else { return nil }
131+
let frontdoorBridgeUrlMyDomainSuffix = frontdoorBridgeUrlHost.suffix(from: startIndex)
132+
133+
for eligibleAppLoginHost in eligibleAppLoginHosts {
134+
if (eligibleAppLoginHost.hasSuffix(frontdoorBridgeUrlMyDomainSuffix)) {
135+
return eligibleAppLoginHost
136+
}
137+
}
138+
}
139+
140+
else {
141+
142+
for eligibleAppLoginHost in eligibleAppLoginHosts {
143+
if (frontdoorBridgeUrlHost == eligibleAppLoginHost) {
144+
return eligibleAppLoginHost
145+
}
146+
}
147+
}
148+
149+
return nil
150+
}
84151
}

0 commit comments

Comments
 (0)