Skip to content

Commit 22eeb4c

Browse files
Disable link on attestation failures.
1 parent 62de350 commit 22eeb4c

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

paymentsheet/src/main/java/com/stripe/android/paymentsheet/state/PaymentElementLoader.kt

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import com.stripe.android.core.utils.UserFacingLogger
1212
import com.stripe.android.googlepaylauncher.GooglePayEnvironment
1313
import com.stripe.android.googlepaylauncher.GooglePayRepository
1414
import com.stripe.android.link.LinkConfiguration
15+
import com.stripe.android.link.LinkConfigurationCoordinator
1516
import com.stripe.android.link.account.LinkStore
17+
import com.stripe.android.link.attestation.LinkAttestationCheck
1618
import com.stripe.android.link.gate.LinkGate
1719
import com.stripe.android.link.model.AccountStatus
1820
import com.stripe.android.link.model.LinkAppearance
@@ -150,6 +152,7 @@ internal class DefaultPaymentElementLoader @Inject constructor(
150152
private val accountStatusProvider: LinkAccountStatusProvider,
151153
private val logLinkHoldbackExperiment: LogLinkHoldbackExperiment,
152154
private val linkStore: LinkStore,
155+
private val attestationCheck: LinkConfigurationCoordinator,
153156
private val linkGateFactory: LinkGate.Factory,
154157
private val externalPaymentMethodsRepository: ExternalPaymentMethodsRepository,
155158
private val userFacingLogger: UserFacingLogger,
@@ -483,6 +486,11 @@ internal class DefaultPaymentElementLoader @Inject constructor(
483486
initializationMode = initializationMode,
484487
linkAppearance = linkAppearance
485488
) ?: return null
489+
// Disable link if attestation is required and fails.
490+
if (attestationPassed(linkConfig).not()) {
491+
return null
492+
}
493+
486494
return loadLinkState(
487495
configuration = configuration,
488496
linkConfiguration = linkConfig,
@@ -491,6 +499,21 @@ internal class DefaultPaymentElementLoader @Inject constructor(
491499
)
492500
}
493501

502+
private suspend fun attestationPassed(linkConfig: LinkConfiguration): Boolean = runCatching {
503+
val attestationResult = attestationCheck.linkAttestationCheck(linkConfig)
504+
.invoke()
505+
when (attestationResult) {
506+
is LinkAttestationCheck.Result.AccountError,
507+
is LinkAttestationCheck.Result.AttestationFailed,
508+
is LinkAttestationCheck.Result.Error -> {
509+
false
510+
}
511+
LinkAttestationCheck.Result.Successful -> {
512+
true
513+
}
514+
}
515+
}.getOrDefault(false)
516+
494517
private suspend fun loadLinkState(
495518
configuration: CommonConfiguration,
496519
linkConfiguration: LinkConfiguration,
@@ -611,8 +634,8 @@ internal class DefaultPaymentElementLoader @Inject constructor(
611634
defaultBillingDetails = configuration.defaultBillingDetails,
612635
allowDefaultOptIn = elementsSession.allowLinkDefaultOptIn,
613636
googlePlacesApiKey = configuration.googlePlacesApiKey,
614-
collectMissingBillingDetailsForExistingPaymentMethods =
615-
configuration.link.collectMissingBillingDetailsForExistingPaymentMethods,
637+
collectMissingBillingDetailsForExistingPaymentMethods = configuration
638+
.link.collectMissingBillingDetailsForExistingPaymentMethods,
616639
allowUserEmailEdits = configuration.link.allowUserEmailEdits,
617640
skipWalletInFlowController = elementsSession.linkMobileSkipWalletInFlowController,
618641
customerId = elementsSession.customer?.session?.customerId,
@@ -678,6 +701,7 @@ internal class DefaultPaymentElementLoader @Inject constructor(
678701
customer: CustomerState?,
679702
isGooglePayReady: Boolean,
680703
): PaymentSelection? {
704+
return PaymentSelection.Link()
681705
val isDefaultPaymentMethodEnabled = metadata.customerMetadata?.isPaymentMethodSetAsDefaultEnabled ?: false
682706
val primaryPaymentSelection = if (isDefaultPaymentMethodEnabled) {
683707
customer?.paymentMethods?.firstOrNull {

0 commit comments

Comments
 (0)