Avoids crashing the app in weird urls.

This commit is contained in:
Vitor Pamplona
2026-03-24 13:30:36 -04:00
parent 09054d6ac5
commit 2a2c61973e
@@ -22,9 +22,11 @@ package com.vitorpamplona.amethyst.commons.richtext
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import com.vitorpamplona.quartz.utils.DualCase import com.vitorpamplona.quartz.utils.DualCase
import com.vitorpamplona.quartz.utils.Log
import com.vitorpamplona.quartz.utils.startsWithAny import com.vitorpamplona.quartz.utils.startsWithAny
import com.vitorpamplona.quartz.utils.urldetector.Url import com.vitorpamplona.quartz.utils.urldetector.Url
import com.vitorpamplona.quartz.utils.urldetector.detection.UrlDetector import com.vitorpamplona.quartz.utils.urldetector.detection.UrlDetector
import kotlinx.coroutines.CancellationException
@Stable @Stable
class Urls( class Urls(
@@ -77,30 +79,35 @@ class UrlParser {
val blossom = mutableSetOf<String>() val blossom = mutableSetOf<String>()
urls.forEach { url -> urls.forEach { url ->
if (url.isValidTopLevelDomain()) { try {
if (url.wroteWithSchema()) { if (url.isValidTopLevelDomain()) {
if (url.originalUrl.startsWithAny(httpScheme)) { if (url.wroteWithSchema()) {
// quick exit if (url.originalUrl.startsWithAny(httpScheme)) {
completeUrls.add(url.originalUrl) // quick exit
} else if (url.originalUrl.startsWithAny(nostrScheme)) { completeUrls.add(url.originalUrl)
bech32.add(url.originalUrl) } else if (url.originalUrl.startsWithAny(nostrScheme)) {
} else if (url.originalUrl.startsWithAny(websocketScheme)) { bech32.add(url.originalUrl)
relays.add(url.originalUrl) } else if (url.originalUrl.startsWithAny(websocketScheme)) {
} else if (url.originalUrl.startsWithAny(blossomScheme)) { relays.add(url.originalUrl)
blossom.add(url.originalUrl) } else if (url.originalUrl.startsWithAny(blossomScheme)) {
} else { blossom.add(url.originalUrl)
completeUrls.add(url.originalUrl) } else {
} completeUrls.add(url.originalUrl)
} else {
// emails are understood as urls from the detector.
if (url.isEmail()) {
Patterns.EMAIL_ADDRESS.findAll(url.originalUrl).forEach {
emails.add(it.value)
} }
} else { } else {
urlsWithoutScheme.add(url.originalUrl) // emails are understood as urls from the detector.
if (url.isEmail()) {
Patterns.EMAIL_ADDRESS.findAll(url.originalUrl).forEach {
emails.add(it.value)
}
} else {
urlsWithoutScheme.add(url.originalUrl)
}
} }
} }
} catch (e: Exception) {
if (e is CancellationException) throw e
Log.e("UrlParser", "Trying to parse url `${url.originalUrl}` from `$content`", e)
} }
} }