Fix crash with invalid domain

pull/308/head
Koitharu 3 years ago
parent c09b0150ac
commit c520699f9f
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -3,6 +3,7 @@ package org.koitharu.kotatsu.core.network
import android.os.Build import android.os.Build
import android.util.Log import android.util.Log
import dagger.Lazy import dagger.Lazy
import okhttp3.Headers
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -11,6 +12,7 @@ import org.koitharu.kotatsu.core.parser.MangaRepository
import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.core.parser.RemoteMangaRepository
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.util.mergeWith import org.koitharu.kotatsu.parsers.util.mergeWith
import org.koitharu.kotatsu.utils.ext.printStackTraceDebug
import java.util.Locale import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -39,12 +41,18 @@ class CommonHeadersInterceptor @Inject constructor(
headersBuilder[CommonHeaders.USER_AGENT] = userAgentFallback headersBuilder[CommonHeaders.USER_AGENT] = userAgentFallback
} }
if (headersBuilder[CommonHeaders.REFERER] == null && repository != null) { if (headersBuilder[CommonHeaders.REFERER] == null && repository != null) {
headersBuilder[CommonHeaders.REFERER] = "https://${repository.domain}/" headersBuilder.trySet(CommonHeaders.REFERER, "https://${repository.domain}/")
} }
val newRequest = request.newBuilder().headers(headersBuilder.build()).build() val newRequest = request.newBuilder().headers(headersBuilder.build()).build()
return repository?.intercept(ProxyChain(chain, newRequest)) ?: chain.proceed(newRequest) return repository?.intercept(ProxyChain(chain, newRequest)) ?: chain.proceed(newRequest)
} }
private fun Headers.Builder.trySet(name: String, value: String) = try {
set(name, value)
} catch (e: IllegalArgumentException) {
e.printStackTraceDebug()
}
private class ProxyChain( private class ProxyChain(
private val delegate: Interceptor.Chain, private val delegate: Interceptor.Chain,
private val request: Request, private val request: Request,

@ -7,14 +7,24 @@ import org.koitharu.kotatsu.utils.EditTextValidator
class DomainValidator : EditTextValidator() { class DomainValidator : EditTextValidator() {
override fun validate(text: String): ValidationResult { override fun validate(text: String): ValidationResult {
if (text.isBlank()) { val trimmed = text.trim()
if (trimmed.isEmpty()) {
return ValidationResult.Success return ValidationResult.Success
} }
val host = text.trim().toCanonicalHost() return if (!checkCharacters(trimmed) || trimmed.toCanonicalHost() == null) {
return if (host == null) {
ValidationResult.Failed(context.getString(R.string.invalid_domain_message)) ValidationResult.Failed(context.getString(R.string.invalid_domain_message))
} else { } else {
ValidationResult.Success ValidationResult.Success
} }
} }
}
private fun checkCharacters(value: String): Boolean {
for (i in value.indices) {
val c = value[i]
if (c !in '\u0020'..'\u007e') {
return false
}
}
return true
}
}

Loading…
Cancel
Save