Skip to content

Commit a06bbd1

Browse files
Merge pull request #8083 from woocommerce/fix/8056-crash-on-log-in
Fix crash when logging in with site address
2 parents 2f9b61b + 9c519dc commit a06bbd1

File tree

3 files changed

+36
-41
lines changed

3 files changed

+36
-41
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/LoginActivity.kt

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -142,26 +142,16 @@ class LoginActivity :
142142
}
143143
}
144144

145-
@Inject
146-
internal lateinit var androidInjector: DispatchingAndroidInjector<Any>
147-
@Inject
148-
internal lateinit var loginAnalyticsListener: LoginAnalyticsListener
149-
@Inject
150-
internal lateinit var unifiedLoginTracker: UnifiedLoginTracker
151-
@Inject
152-
internal lateinit var zendeskHelper: ZendeskHelper
153-
@Inject
154-
internal lateinit var urlUtils: UrlUtils
155-
@Inject
156-
internal lateinit var experimentTracker: ExperimentTracker
157-
@Inject
158-
internal lateinit var appPrefsWrapper: AppPrefsWrapper
159-
@Inject
160-
internal lateinit var dispatcher: Dispatcher
161-
@Inject
162-
internal lateinit var loginNotificationScheduler: LoginNotificationScheduler
163-
@Inject
164-
internal lateinit var uiMessageResolver: UIMessageResolver
145+
@Inject internal lateinit var androidInjector: DispatchingAndroidInjector<Any>
146+
@Inject internal lateinit var loginAnalyticsListener: LoginAnalyticsListener
147+
@Inject internal lateinit var unifiedLoginTracker: UnifiedLoginTracker
148+
@Inject internal lateinit var zendeskHelper: ZendeskHelper
149+
@Inject internal lateinit var urlUtils: UrlUtils
150+
@Inject internal lateinit var experimentTracker: ExperimentTracker
151+
@Inject internal lateinit var appPrefsWrapper: AppPrefsWrapper
152+
@Inject internal lateinit var dispatcher: Dispatcher
153+
@Inject internal lateinit var loginNotificationScheduler: LoginNotificationScheduler
154+
@Inject internal lateinit var uiMessageResolver: UIMessageResolver
165155

166156
private var loginMode: LoginMode? = null
167157
private lateinit var binding: ActivityLoginBinding
@@ -556,7 +546,7 @@ class LoginActivity :
556546
override fun gotConnectedSiteInfo(siteAddress: String, redirectUrl: String?, hasJetpack: Boolean) {
557547
// If the redirect url is available, use that as the preferred url. Pass this url to the other fragments
558548
// with the protocol since it is needed for initiating forgot password flow etc in the login process.
559-
val inputSiteAddress = redirectUrl ?: siteAddress
549+
val inputSiteAddress = urlUtils.sanitiseUrl(redirectUrl ?: siteAddress)
560550

561551
// Save site address to app prefs so it's available to MainActivity regardless of how the user
562552
// logs into the app. Strip the protocol from this url string prior to saving to AppPrefs since it's
@@ -931,6 +921,7 @@ class LoginActivity :
931921
val notificationType = when {
932922
!appPrefsWrapper.getLoginSiteAddress()
933923
.isNullOrBlank() -> LOGIN_SITE_ADDRESS_PASSWORD_ERROR
924+
934925
else -> LOGIN_WPCOM_PASSWORD_ERROR
935926
}
936927
loginNotificationScheduler.scheduleNotification(notificationType)
@@ -949,6 +940,7 @@ class LoginActivity :
949940
LOGIN_SITE_ADDRESS_ERROR -> startLoginViaWPCom()
950941
LOGIN_SITE_ADDRESS_PASSWORD_ERROR,
951942
LOGIN_WPCOM_PASSWORD_ERROR -> useMagicLinkInstead(appPrefsWrapper.getLoginEmail(), verifyEmail = false)
943+
952944
LOGIN_WPCOM_EMAIL_ERROR,
953945
LOGIN_SITE_ADDRESS_EMAIL_ERROR,
954946
DEFAULT_HELP ->

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/sitediscovery/SitePickerSiteDiscoveryViewModel.kt

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.woocommerce.android.experiment.JetpackInstallationExperiment
1313
import com.woocommerce.android.experiment.JetpackInstallationExperiment.JetpackInstallationVariant
1414
import com.woocommerce.android.ui.login.AccountRepository
1515
import com.woocommerce.android.ui.sitepicker.SitePickerRepository
16+
import com.woocommerce.android.util.UrlUtils
1617
import com.woocommerce.android.viewmodel.MultiLiveEvent
1718
import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Exit
1819
import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.ExitWithResult
@@ -35,8 +36,6 @@ import kotlinx.coroutines.flow.map
3536
import kotlinx.coroutines.flow.transformLatest
3637
import kotlinx.coroutines.flow.zip
3738
import kotlinx.coroutines.launch
38-
import org.wordpress.android.fluxc.network.discovery.DiscoveryUtils
39-
import org.wordpress.android.util.UrlUtils
4039
import javax.inject.Inject
4140
import kotlin.text.RegexOption.IGNORE_CASE
4241

@@ -47,7 +46,8 @@ class SitePickerSiteDiscoveryViewModel @Inject constructor(
4746
private val accountRepository: AccountRepository,
4847
private val resourceProvider: ResourceProvider,
4948
private val analyticsTracker: AnalyticsTrackerWrapper,
50-
private val jetpackInstallationExperiment: JetpackInstallationExperiment
49+
private val jetpackInstallationExperiment: JetpackInstallationExperiment,
50+
private val urlUtils: UrlUtils
5151
) : ScopedViewModel(savedStateHandle) {
5252
companion object {
5353
private const val FETCHED_URL_KEY = "fetched_url"
@@ -174,7 +174,7 @@ class SitePickerSiteDiscoveryViewModel @Inject constructor(
174174

175175
sitePickRepository.fetchSiteInfo(siteAddressFlow.value).fold(
176176
onSuccess = {
177-
val siteAddress = (it.urlAfterRedirects ?: it.url).sanitiseUrl()
177+
val siteAddress = urlUtils.sanitiseUrl(it.urlAfterRedirects ?: it.url)
178178
// Remove protocol prefix
179179
val protocolRegex = Regex("^(http[s]?://)", IGNORE_CASE)
180180
fetchedSiteUrl = siteAddress.replaceFirst(protocolRegex, "")
@@ -271,22 +271,6 @@ class SitePickerSiteDiscoveryViewModel @Inject constructor(
271271
}
272272
}
273273

274-
/**
275-
* Basic sanitization of the URL based on the same logic we use in the XMLRPC discovery
276-
* see: https://github.com/wordpress-mobile/WordPress-FluxC-Android/blob/94601a5d4c1c98068adde0352ecc25e6d0046f35/fluxc/src/main/java/org/wordpress/android/fluxc/network/discovery/SelfHostedEndpointFinder.java#L292
277-
*/
278-
private fun String.sanitiseUrl(): String {
279-
return trim()
280-
.trimEnd('/')
281-
.let {
282-
// Convert IDN names to punycode if necessary
283-
UrlUtils.convertUrlToPunycodeIfNeeded(it)
284-
}.let {
285-
// Strip url from known usual trailing paths
286-
DiscoveryUtils.stripKnownPaths(it)
287-
}
288-
}
289-
290274
private enum class Step {
291275
AddressInput, JetpackUnavailable, NotWordpress
292276
}

WooCommerce/src/main/kotlin/com/woocommerce/android/util/UrlUtils.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package com.woocommerce.android.util
33
import android.content.Context
44
import com.woocommerce.android.AppUrls
55
import dagger.Reusable
6+
import org.wordpress.android.fluxc.network.discovery.DiscoveryUtils
67
import org.wordpress.android.util.LanguageUtils
8+
import org.wordpress.android.util.UrlUtils
79
import javax.inject.Inject
810

911
@Reusable
@@ -13,4 +15,21 @@ class UrlUtils @Inject constructor(
1315
val tosUrlWithLocale by lazy {
1416
"${AppUrls.AUTOMATTIC_TOS}?locale=${LanguageUtils.getPatchedCurrentDeviceLanguage(context)}"
1517
}
18+
19+
/**
20+
* Basic sanitization of the URL based on the same logic we use in the XMLRPC discovery
21+
* see: https://github.com/wordpress-mobile/WordPress-FluxC-Android/blob/94601a5d4c1c98068adde0352ecc25e6d0046f35/fluxc/src/main/java/org/wordpress/android/fluxc/network/discovery/SelfHostedEndpointFinder.java#L292
22+
*/
23+
fun sanitiseUrl(url: String): String {
24+
return url
25+
.trim()
26+
.trimEnd('/')
27+
.let {
28+
// Convert IDN names to punycode if necessary
29+
UrlUtils.convertUrlToPunycodeIfNeeded(it)
30+
}.let {
31+
// Strip url from known usual trailing paths
32+
DiscoveryUtils.stripKnownPaths(it)
33+
}
34+
}
1635
}

0 commit comments

Comments
 (0)