diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt index f54bce0..5e337f9 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt @@ -139,9 +139,12 @@ class LoginActivity : AppCompatActivity(), DIAware { showProgress(true) + appSettingsService.updateSelfSigned(binding.selfSigned.isChecked) + repository.refreshLoginInformation(url, login, password) CoroutineScope(Dispatchers.Main).launch { + repository.updateApiInformation() val result = repository.login() if (result) { val (errorFetching, displaySelfossOnly) = repository.shouldBeSelfossInstance() diff --git a/androidApp/src/main/res/layout/activity_login.xml b/androidApp/src/main/res/layout/activity_login.xml index 7edc0e4..c09300b 100644 --- a/androidApp/src/main/res/layout/activity_login.xml +++ b/androidApp/src/main/res/layout/activity_login.xml @@ -51,6 +51,13 @@ android:maxLines="1" android:minHeight="48dp" /> + + Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-de-rDE/strings.xml b/androidApp/src/main/res/values-de-rDE/strings.xml index 036dcb9..7c18d95 100644 --- a/androidApp/src/main/res/values-de-rDE/strings.xml +++ b/androidApp/src/main/res/values-de-rDE/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-es-rES/strings.xml b/androidApp/src/main/res/values-es-rES/strings.xml index 9f9f902..bd58c51 100644 --- a/androidApp/src/main/res/values-es-rES/strings.xml +++ b/androidApp/src/main/res/values-es-rES/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-fa-rIR/strings.xml b/androidApp/src/main/res/values-fa-rIR/strings.xml index d4951bb..fb94070 100644 --- a/androidApp/src/main/res/values-fa-rIR/strings.xml +++ b/androidApp/src/main/res/values-fa-rIR/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-fr-rFR/strings.xml b/androidApp/src/main/res/values-fr-rFR/strings.xml index d99f94e..4753a53 100644 --- a/androidApp/src/main/res/values-fr-rFR/strings.xml +++ b/androidApp/src/main/res/values-fr-rFR/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-gl-rES/strings.xml b/androidApp/src/main/res/values-gl-rES/strings.xml index d32b7d1..a24ab3b 100644 --- a/androidApp/src/main/res/values-gl-rES/strings.xml +++ b/androidApp/src/main/res/values-gl-rES/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-in-rID/strings.xml b/androidApp/src/main/res/values-in-rID/strings.xml index 0f48e73..248a2ab 100644 --- a/androidApp/src/main/res/values-in-rID/strings.xml +++ b/androidApp/src/main/res/values-in-rID/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-it-rIT/strings.xml b/androidApp/src/main/res/values-it-rIT/strings.xml index 5b28be0..3379b85 100644 --- a/androidApp/src/main/res/values-it-rIT/strings.xml +++ b/androidApp/src/main/res/values-it-rIT/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-ko-rKR/strings.xml b/androidApp/src/main/res/values-ko-rKR/strings.xml index e155386..93d133b 100644 --- a/androidApp/src/main/res/values-ko-rKR/strings.xml +++ b/androidApp/src/main/res/values-ko-rKR/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-night/strings.xml b/androidApp/src/main/res/values-night/strings.xml deleted file mode 100644 index aa33111..0000000 --- a/androidApp/src/main/res/values-night/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - The app does not share any personal data about you. - - A crash occured. Sending the details to the developper. - "Disable automatic bug reporting. " - Filters - This app only works with a Selfoss instance, and no other RSS feed. - Sources - Update source - \ No newline at end of file diff --git a/androidApp/src/main/res/values-nl-rNL/strings.xml b/androidApp/src/main/res/values-nl-rNL/strings.xml index 21b72a2..e16d314 100644 --- a/androidApp/src/main/res/values-nl-rNL/strings.xml +++ b/androidApp/src/main/res/values-nl-rNL/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-pt-rBR/strings.xml b/androidApp/src/main/res/values-pt-rBR/strings.xml index a13d2dd..7ae3e67 100644 --- a/androidApp/src/main/res/values-pt-rBR/strings.xml +++ b/androidApp/src/main/res/values-pt-rBR/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-pt-rPT/strings.xml b/androidApp/src/main/res/values-pt-rPT/strings.xml index 84bdc30..79c39c4 100644 --- a/androidApp/src/main/res/values-pt-rPT/strings.xml +++ b/androidApp/src/main/res/values-pt-rPT/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-si-rLK/strings.xml b/androidApp/src/main/res/values-si-rLK/strings.xml index a6fcab7..2f46a3e 100644 --- a/androidApp/src/main/res/values-si-rLK/strings.xml +++ b/androidApp/src/main/res/values-si-rLK/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-tr-rTR/strings.xml b/androidApp/src/main/res/values-tr-rTR/strings.xml index 8cd2816..e6bab9a 100644 --- a/androidApp/src/main/res/values-tr-rTR/strings.xml +++ b/androidApp/src/main/res/values-tr-rTR/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-zh-rCN/strings.xml b/androidApp/src/main/res/values-zh-rCN/strings.xml index 9198954..c562215 100644 --- a/androidApp/src/main/res/values-zh-rCN/strings.xml +++ b/androidApp/src/main/res/values-zh-rCN/strings.xml @@ -130,4 +130,5 @@ 更新源 Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values-zh-rTW/strings.xml b/androidApp/src/main/res/values-zh-rTW/strings.xml index 45c006d..0a44316 100644 --- a/androidApp/src/main/res/values-zh-rTW/strings.xml +++ b/androidApp/src/main/res/values-zh-rTW/strings.xml @@ -130,4 +130,5 @@ Update source Disconnect ? You will be disconnected from your selfoss instance. + Disable SSL diff --git a/androidApp/src/main/res/values/strings.xml b/androidApp/src/main/res/values/strings.xml index fc9504e..6cbc2cd 100644 --- a/androidApp/src/main/res/values/strings.xml +++ b/androidApp/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ "Password not long enough" "Field required" "Url" + "Disable SSL" "Login required ?" "Oops. You may need to add a \"/\" at the end of the url." "Username" diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 144e3c0..63e7a88 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -36,6 +36,7 @@ kotlin { implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") implementation("io.ktor:ktor-client-logging:$ktorVersion") implementation("io.ktor:ktor-client-auth:$ktorVersion") + implementation("io.ktor:ktor-client-cio:$ktorVersion") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1") implementation("org.jsoup:jsoup:1.15.4") diff --git a/shared/src/androidMain/kotlin/bou/amine/apps/readerforselfossv2/rest/NetworkSSL.kt b/shared/src/androidMain/kotlin/bou/amine/apps/readerforselfossv2/rest/NetworkSSL.kt new file mode 100644 index 0000000..c2b6698 --- /dev/null +++ b/shared/src/androidMain/kotlin/bou/amine/apps/readerforselfossv2/rest/NetworkSSL.kt @@ -0,0 +1,17 @@ +package bou.amine.apps.readerforselfossv2.rest + +import io.ktor.client.engine.cio.CIOEngineConfig +import java.security.cert.X509Certificate +import javax.net.ssl.X509TrustManager + +class NaiveTrustManager : X509TrustManager { + override fun checkClientTrusted(chain: Array?, authType: String?) {} + + override fun checkServerTrusted(chain: Array?, authType: String?) {} + + override fun getAcceptedIssuers(): Array = arrayOf() +} + +actual fun setupInsecureHTTPEngine(config: CIOEngineConfig) { + config.https.trustManager = NaiveTrustManager() +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/rest/SelfossApi.kt b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/rest/SelfossApi.kt index b97bd93..d010080 100644 --- a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/rest/SelfossApi.kt +++ b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/rest/SelfossApi.kt @@ -5,31 +5,46 @@ import bou.amine.apps.readerforselfossv2.model.StatusAndData import bou.amine.apps.readerforselfossv2.model.SuccessResponse import bou.amine.apps.readerforselfossv2.service.AppSettingsService import io.github.aakira.napier.Napier -import io.ktor.client.* -import io.ktor.client.plugins.* -import io.ktor.client.plugins.auth.providers.* -import io.ktor.client.plugins.cache.* -import io.ktor.client.plugins.contentnegotiation.* -import io.ktor.client.plugins.cookies.* -import io.ktor.client.plugins.logging.* -import io.ktor.client.request.* -import io.ktor.client.statement.* -import io.ktor.http.* -import io.ktor.serialization.kotlinx.json.* -import io.ktor.util.* -import io.ktor.utils.io.charsets.* -import io.ktor.utils.io.core.* +import io.ktor.client.HttpClient +import io.ktor.client.engine.cio.CIO +import io.ktor.client.engine.cio.CIOEngineConfig +import io.ktor.client.plugins.HttpRequestRetry +import io.ktor.client.plugins.HttpTimeout +import io.ktor.client.plugins.auth.providers.BasicAuthCredentials +import io.ktor.client.plugins.cache.HttpCache +import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.plugins.cookies.HttpCookies +import io.ktor.client.plugins.logging.LogLevel +import io.ktor.client.plugins.logging.Logger +import io.ktor.client.plugins.logging.Logging +import io.ktor.client.request.get +import io.ktor.client.request.headers +import io.ktor.client.request.parameter +import io.ktor.client.statement.HttpResponse +import io.ktor.http.HttpHeaders +import io.ktor.http.HttpStatusCode +import io.ktor.http.Parameters +import io.ktor.serialization.kotlinx.json.json +import io.ktor.util.encodeBase64 +import io.ktor.utils.io.charsets.Charsets +import io.ktor.utils.io.core.toByteArray import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.serialization.json.Json +expect fun setupInsecureHTTPEngine(config: CIOEngineConfig) + class SelfossApi(private val appSettingsService: AppSettingsService) { var client = createHttpClient() - - private fun createHttpClient(): HttpClient { - val client = HttpClient { + fun createHttpClient() = + HttpClient(CIO) { + if (appSettingsService.getSelfSigned()) { + engine { + setupInsecureHTTPEngine(this) + } + } install(ContentNegotiation) { install(HttpCache) json(Json { @@ -60,7 +75,7 @@ class SelfossApi(private val appSettingsService: AppSettingsService) { Napier.i("Will modify", tag = "HttpSend") CoroutineScope(Dispatchers.Main).launch { Napier.i("Will login", tag = "HttpSend") - this@SelfossApi.login() + login() Napier.i("Did login", tag = "HttpSend") } } @@ -68,10 +83,6 @@ class SelfossApi(private val appSettingsService: AppSettingsService) { expectSuccess = false } - - return client - } - fun url(path: String) = "${appSettingsService.getBaseUrl()}$path" diff --git a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/service/AppSettingsService.kt b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/service/AppSettingsService.kt index 22da4fa..4118781 100644 --- a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/service/AppSettingsService.kt +++ b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/service/AppSettingsService.kt @@ -8,6 +8,7 @@ class AppSettingsService(acraSenderServiceProcess: Boolean = false) { // Api related private var _apiVersion: Int = -1 private var _publicAccess: Boolean? = null + private var _selfSigned: Boolean? = null private var _baseUrl: String = "" private var _userName: String = "" private var _basicUserName: String = "" @@ -77,6 +78,22 @@ class AppSettingsService(acraSenderServiceProcess: Boolean = false) { _publicAccess = settings.getBoolean(API_PUBLIC_ACCESS, false) } + fun getSelfSigned(): Boolean { + if (_selfSigned == null) { + refreshSelfSigned() + } + return _selfSigned!! + } + + fun updateSelfSigned(selfSigned: Boolean) { + settings.putBoolean(API_SELF_SIGNED, selfSigned) + refreshSelfSigned() + } + + private fun refreshSelfSigned() { + _selfSigned = settings.getBoolean(API_SELF_SIGNED, false) + } + fun getBaseUrl(): String { if (_baseUrl.isEmpty()) { refreshBaseUrl() @@ -383,6 +400,7 @@ class AppSettingsService(acraSenderServiceProcess: Boolean = false) { refreshBaseUrl() refreshApiVersion() refreshPublicAccess() + refreshSelfSigned() } fun refreshUserSettings() { @@ -468,6 +486,8 @@ class AppSettingsService(acraSenderServiceProcess: Boolean = false) { const val API_PUBLIC_ACCESS = "apiPublicAccess" + const val API_SELF_SIGNED = "apiSelfSigned" + const val API_ITEMS_NUMBER = "prefer_api_items_number" const val API_TIMEOUT = "api_timeout"