Skip to content

Commit

Permalink
Relink tweaks
Browse files Browse the repository at this point in the history
- Don't return `.canceled` for networking relink sessions
- Don't use custom success message in this case
  • Loading branch information
tillh-stripe committed Feb 4, 2025
1 parent 4fb2a7a commit 21a9adc
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,8 @@ protocol FinancialConnectionsAPI {
phoneNumber: String?,
country: String?,
consumerSessionClientSecret: String?,
clientSecret: String
clientSecret: String,
isRelink: Bool
) -> Future<SaveAccountsToNetworkAndLinkResponse>

func disableNetworking(
Expand Down Expand Up @@ -768,7 +769,8 @@ extension FinancialConnectionsAPIClient: FinancialConnectionsAPI {
phoneNumber: String?,
country: String?,
consumerSessionClientSecret: String?,
clientSecret: String
clientSecret: String,
isRelink: Bool
) -> Future<SaveAccountsToNetworkAndLinkResponse> {
let saveAccountsToLinkHandler: () -> Future<SaveAccountsToNetworkAndLinkResponse> = {
return self.saveAccountsToLink(
Expand All @@ -780,10 +782,11 @@ extension FinancialConnectionsAPIClient: FinancialConnectionsAPI {
clientSecret: clientSecret
)
.chained { manifest in
let customSuccessPaneMessage = isRelink ? nil : manifest.displayText?.successPane?.subCaption
return Promise(
value: (
manifest: manifest,
customSuccessPaneMessage: manifest.displayText?.successPane?.subCaption
customSuccessPaneMessage: customSuccessPaneMessage
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,8 @@ extension FinancialConnectionsAsyncAPIClient: FinancialConnectionsAPI {
phoneNumber: String?,
country: String?,
consumerSessionClientSecret: String?,
clientSecret: String
clientSecret: String,
isRelink: Bool
) -> Future<(manifest: FinancialConnectionsSessionManifest, customSuccessPaneMessage: String?)> {
wrapAsyncToFuture {
try await self.saveAccountsToNetworkAndLink(
Expand All @@ -262,7 +263,8 @@ extension FinancialConnectionsAsyncAPIClient: FinancialConnectionsAPI {
phoneNumber: phoneNumber,
country: country,
consumerSessionClientSecret: consumerSessionClientSecret,
clientSecret: clientSecret
clientSecret: clientSecret,
isRelink: isRelink
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,8 @@ protocol FinancialConnectionsAsyncAPI {
phoneNumber: String?,
country: String?,
consumerSessionClientSecret: String?,
clientSecret: String
clientSecret: String,
isRelink: Bool
) async throws -> (
manifest: FinancialConnectionsSessionManifest,
customSuccessPaneMessage: String?
Expand Down Expand Up @@ -713,7 +714,8 @@ extension FinancialConnectionsAsyncAPIClient: FinancialConnectionsAsyncAPI {
phoneNumber: String?,
country: String?,
consumerSessionClientSecret: String?,
clientSecret: String
clientSecret: String,
isRelink: Bool
) async throws -> (
manifest: FinancialConnectionsSessionManifest,
customSuccessPaneMessage: String?
Expand All @@ -730,10 +732,12 @@ extension FinancialConnectionsAsyncAPIClient: FinancialConnectionsAsyncAPI {
consumerSessionClientSecret: consumerSessionClientSecret,
clientSecret: clientSecret
)

let customSuccessPaneMessage = isRelink ? nil : manifest.displayText?.successPane?.subCaption

return (
manifest: manifest,
customSuccessPaneMessage: manifest.displayText?.successPane?.subCaption
customSuccessPaneMessage: customSuccessPaneMessage
)
}
if
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ final class AccountPickerDataSourceImplementation: AccountPickerDataSource {
let reduceManualEntryProminenceInErrors: Bool
let dataAccessNotice: FinancialConnectionsDataAccessNotice?
let consumerSessionClientSecret: String?
private let isRelink: Bool

private(set) var selectedAccounts: [FinancialConnectionsPartnerAccount] = [] {
didSet {
Expand All @@ -67,7 +68,8 @@ final class AccountPickerDataSourceImplementation: AccountPickerDataSource {
analyticsClient: FinancialConnectionsAnalyticsClient,
reduceManualEntryProminenceInErrors: Bool,
dataAccessNotice: FinancialConnectionsDataAccessNotice?,
consumerSessionClientSecret: String?
consumerSessionClientSecret: String?,
isRelink: Bool
) {
self.apiClient = apiClient
self.clientSecret = clientSecret
Expand All @@ -79,6 +81,7 @@ final class AccountPickerDataSourceImplementation: AccountPickerDataSource {
self.reduceManualEntryProminenceInErrors = reduceManualEntryProminenceInErrors
self.dataAccessNotice = dataAccessNotice
self.consumerSessionClientSecret = consumerSessionClientSecret
self.isRelink = isRelink
}

func pollAuthSessionAccounts() -> Future<FinancialConnectionsAuthSessionAccounts> {
Expand Down Expand Up @@ -117,7 +120,8 @@ final class AccountPickerDataSourceImplementation: AccountPickerDataSource {
phoneNumber: nil,
country: nil,
consumerSessionClientSecret: consumerSessionClientSecret,
clientSecret: clientSecret
clientSecret: clientSecret,
isRelink: isRelink
)
.chained { (_, customSuccessPaneMessage) in
return Promise(value: customSuccessPaneMessage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -393,9 +393,7 @@ extension NativeFlowController {
)
finishAuthSession(.failed(error: FinancialConnectionsCustomManualEntryRequiredError()))
} else {
if !session.accounts.data.isEmpty || session.paymentAccount != nil
|| session.bankAccountToken != nil
{
if session.didCompleteSuccessfully || dataManager.pendingRelinkAuthorization != nil {
if dataManager.manifest.isProductInstantDebits {
// For Instant Debits, create a payment method and complete with it.
createPaymentMethod(for: session) { result in
Expand Down Expand Up @@ -1176,7 +1174,7 @@ extension NativeFlowController: LinkAccountPickerViewControllerDelegate {
forAuthorization authorization: String
) {
dataManager.institution = institution
dataManager.pendingRepairAuthorization = authorization
dataManager.pendingRelinkAuthorization = authorization
pushPane(.bankAuthRepair, animated: true, clearNavigationStack: true)
}

Expand Down Expand Up @@ -1388,7 +1386,8 @@ private func CreatePaneViewController(
analyticsClient: dataManager.analyticsClient,
reduceManualEntryProminenceInErrors: dataManager.reduceManualEntryProminenceInErrors,
dataAccessNotice: dataManager.consentPaneModel?.dataAccessNotice,
consumerSessionClientSecret: dataManager.consumerSession?.clientSecret
consumerSessionClientSecret: dataManager.consumerSession?.clientSecret,
isRelink: dataManager.pendingRelinkAuthorization != nil
)
let accountPickerViewController = AccountPickerViewController(dataSource: accountPickerDataSource)
accountPickerViewController.delegate = nativeFlowController
Expand Down Expand Up @@ -1422,12 +1421,12 @@ private func CreatePaneViewController(
viewController = nil
}
case .bankAuthRepair:
if let institution = dataManager.institution, let coreAuthorization = dataManager.pendingRepairAuthorization {
if let institution = dataManager.institution, let relinkAuthorization = dataManager.pendingRelinkAuthorization {
let partnerAuthDataSource = PartnerAuthDataSourceImplementation(
authSession: dataManager.authSession,
institution: institution,
manifest: dataManager.manifest,
repairSessionPayload: RelinkSessionPayload(coreAuthorization: coreAuthorization),
relinkAuthorization: relinkAuthorization,
returnURL: dataManager.returnURL,
apiClient: dataManager.apiClient,
clientSecret: dataManager.clientSecret,
Expand Down Expand Up @@ -1603,7 +1602,7 @@ private func CreatePaneViewController(
authSession: dataManager.authSession,
institution: institution,
manifest: dataManager.manifest,
repairSessionPayload: nil,
relinkAuthorization: nil,
returnURL: dataManager.returnURL,
apiClient: dataManager.apiClient,
clientSecret: dataManager.clientSecret,
Expand Down Expand Up @@ -1765,3 +1764,10 @@ private func ShouldHideLogoInNavigationBar(
return reducedBranding
}
}

private extension StripeAPI.FinancialConnectionsSession {

var didCompleteSuccessfully: Bool {
return !accounts.data.isEmpty || paymentAccount != nil || bankAccountToken != nil
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ protocol NativeFlowDataManager: AnyObject {
var lastPaneLaunched: FinancialConnectionsSessionManifest.NextPane? { get set }
var customSuccessPaneCaption: String? { get set }
var customSuccessPaneSubCaption: String? { get set }
var pendingRepairAuthorization: String? { get set }
var pendingRelinkAuthorization: String? { get set }

func createPaymentDetails(
consumerSessionClientSecret: String,
Expand Down Expand Up @@ -99,7 +99,7 @@ class NativeFlowAPIDataManager: NativeFlowDataManager {
var lastPaneLaunched: FinancialConnectionsSessionManifest.NextPane?
var customSuccessPaneCaption: String?
var customSuccessPaneSubCaption: String?
var pendingRepairAuthorization: String?
var pendingRelinkAuthorization: String?

var consumerSession: ConsumerSessionData? {
didSet {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ final class NetworkingLinkSignupDataSourceImplementation: NetworkingLinkSignupDa
phoneNumber: nil,
country: nil,
consumerSessionClientSecret: response.consumerSession.clientSecret,
clientSecret: clientSecret
clientSecret: clientSecret,
isRelink: false
)
}
.chained { (_, customSuccessPaneMessage) in
Expand All @@ -125,7 +126,8 @@ final class NetworkingLinkSignupDataSourceImplementation: NetworkingLinkSignupDa
phoneNumber: phoneNumber,
country: countryCode, // ex. "US"
consumerSessionClientSecret: nil,
clientSecret: clientSecret
clientSecret: clientSecret,
isRelink: false
).chained { (_, customSuccessPaneMessage) in
return Promise(value: customSuccessPaneMessage)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ final class NetworkingSaveToLinkVerificationDataSourceImplementation: Networking
phoneNumber: nil,
country: nil,
consumerSessionClientSecret: consumerSession.clientSecret,
clientSecret: clientSecret
clientSecret: clientSecret,
isRelink: false
)
.chained { (_, customSuccessPaneMessage) in
return Promise(value: customSuccessPaneMessage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,25 +25,21 @@ protocol PartnerAuthDataSource: AnyObject {
func retrieveAuthSession(_ authSession: FinancialConnectionsAuthSession) -> Future<FinancialConnectionsAuthSession>
}

struct RelinkSessionPayload {
let coreAuthorization: String
}

final class PartnerAuthDataSourceImplementation: PartnerAuthDataSource {

let institution: FinancialConnectionsInstitution
let manifest: FinancialConnectionsSessionManifest
let returnURL: String?
private let apiClient: any FinancialConnectionsAPI
private let clientSecret: String
private let relinkSessionPayload: RelinkSessionPayload?
private let relinkAuthorization: String?
let analyticsClient: FinancialConnectionsAnalyticsClient
var disableAuthSessionRetrieval: Bool {
return manifest.features?["bank_connections_disable_defensive_auth_session_retrieval_on_complete"] == true
}

var isNetworkingRelinkSession: Bool {
return relinkSessionPayload != nil
return relinkAuthorization != nil
}

// a "pending" auth session is a session which has started
Expand All @@ -57,7 +53,7 @@ final class PartnerAuthDataSourceImplementation: PartnerAuthDataSource {
authSession: FinancialConnectionsAuthSession?,
institution: FinancialConnectionsInstitution,
manifest: FinancialConnectionsSessionManifest,
repairSessionPayload: RelinkSessionPayload?,
relinkAuthorization: String?,
returnURL: String?,
apiClient: any FinancialConnectionsAPI,
clientSecret: String,
Expand All @@ -70,14 +66,14 @@ final class PartnerAuthDataSourceImplementation: PartnerAuthDataSource {
self.apiClient = apiClient
self.clientSecret = clientSecret
self.analyticsClient = analyticsClient
self.relinkSessionPayload = repairSessionPayload
self.relinkAuthorization = relinkAuthorization
}

func createAuthSession() -> Future<FinancialConnectionsAuthSession> {
if let relinkSessionPayload {
if let relinkAuthorization {
return apiClient.repairAuthSession(
clientSecret: clientSecret,
coreAuthorization: relinkSessionPayload.coreAuthorization
coreAuthorization: relinkAuthorization
).chained { [weak self] (repairSession: FinancialConnectionsRepairSession) in
let authSession = FinancialConnectionsAuthSession(
id: repairSession.id,
Expand Down

0 comments on commit 21a9adc

Please sign in to comment.