@@ -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