From d0f649bb27ab3e7a3033eb5f66c8df5fb7181067 Mon Sep 17 00:00:00 2001 From: davidoskky Date: Thu, 26 Jan 2023 14:07:12 +0100 Subject: [PATCH] Fetch remote selfoss configuration Fetch from /api/about the selfoss configuration to determine if we're using a public access instanceIf both authentication and public mode are enabled in the configuration and we're logging in without authentication, then we're using public access. --- .../android/LoginActivity.kt | 2 +- androidApp/src/test/kotlin/RepositoryTest.kt | 12 +++---- .../readerforselfossv2/model/SelfossModel.kt | 21 +++++++++++-- .../repository/RepositoryImpl.kt | 15 ++++++--- .../readerforselfossv2/rest/SelfossApi.kt | 2 +- .../service/AppSettingsService.kt | 31 ++++++++++++++++--- 6 files changed, 63 insertions(+), 20 deletions(-) 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 a47a1af..2a48ea7 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 @@ -128,7 +128,7 @@ class LoginActivity : AppCompatActivity(), DIAware { private fun goToMain() { CoroutineScope(Dispatchers.Main).launch { - repository.updateApiVersion() + repository.updateApiInformation() ACRA.errorReporter.putCustomData("SELFOSS_API_VERSION", appSettingsService.getApiVersion().toString()) } val intent = Intent(this, HomeActivity::class.java) diff --git a/androidApp/src/test/kotlin/RepositoryTest.kt b/androidApp/src/test/kotlin/RepositoryTest.kt index 38245b2..96ef289 100644 --- a/androidApp/src/test/kotlin/RepositoryTest.kt +++ b/androidApp/src/test/kotlin/RepositoryTest.kt @@ -49,7 +49,7 @@ class RepositoryTest { repository = Repository(api, appSettingsService, isConnectionAvailable, db) runBlocking { - repository.updateApiVersion() + repository.updateApiInformation() } } @@ -61,9 +61,9 @@ class RepositoryTest { every { appSettingsService.isItemCachingEnabled() } returns false every { appSettingsService.isUpdateSourcesEnabled() } returns false - coEvery { api.version() } returns StatusAndData( + coEvery { api.apiInformation() } returns StatusAndData( success = true, - data = SelfossModel.ApiVersion("2.19-ba1e8e3", "4.0.0") + data = SelfossModel.ApiInformation("2.19-ba1e8e3", "4.0.0") ) coEvery { api.stats() } returns StatusAndData( success = true, @@ -81,7 +81,7 @@ class RepositoryTest { fun instantiate_repository() { initializeRepository() - coVerify(exactly = 1) { api.version() } + coVerify(exactly = 1) { api.apiInformation() } } @Test @@ -90,7 +90,7 @@ class RepositoryTest { initializeRepository(MutableStateFlow(false)) - coVerify(exactly = 0) { api.version() } + coVerify(exactly = 0) { api.apiInformation() } coVerify(exactly = 0) { api.stats() } } @@ -113,7 +113,7 @@ class RepositoryTest { @Test fun get_api_1_date_with_api_4_version_stored() { every { appSettingsService.getApiVersion() } returns 4 - coEvery { api.version() } returns StatusAndData(success = false, null) + coEvery { api.apiInformation() } returns StatusAndData(success = false, null) val itemParameters = FakeItemParameters() itemParameters.datetime = "2021-04-23 11:45:32" coEvery { api.getItems(any(), any(), any(), any(), any(), any(), any()) } returns diff --git a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/model/SelfossModel.kt b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/model/SelfossModel.kt index e5eec2a..87c495c 100644 --- a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/model/SelfossModel.kt +++ b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/model/SelfossModel.kt @@ -35,17 +35,32 @@ class SelfossModel { ) @Serializable - data class ApiVersion( + data class ApiInformation( val version: String?, - val apiversion: String? + val apiversion: String?, + val configuration: ApiConfiguration? ) { - fun getApiMajorVersion() : Int { + fun getApiMajorVersion(): Int { var versionNumber = 0 if (apiversion != null) { versionNumber = apiversion.substringBefore(".").toInt() } return versionNumber } + + fun getApiConfiguration() = configuration ?: ApiConfiguration(null, null) + } + + @kotlinx.serialization.Serializable + data class ApiConfiguration( + @Serializable(with = BooleanSerializer::class) + val publicMode: Boolean?, + @Serializable(with = BooleanSerializer::class) + val authEnabled: Boolean? + ) { + fun isAuthEnabled() = authEnabled ?: true + + fun isPublicModeEnabled() = publicMode ?: false } @Serializable diff --git a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/repository/RepositoryImpl.kt b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/repository/RepositoryImpl.kt index fb03172..5dacf72 100644 --- a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/repository/RepositoryImpl.kt +++ b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/repository/RepositoryImpl.kt @@ -439,13 +439,20 @@ class Repository( api.refreshLoginInformation() } - suspend fun updateApiVersion() { + suspend fun updateApiInformation() { val apiMajorVersion = appSettingsService.getApiVersion() if (isNetworkAvailable()) { - val fetchedVersion = api.version() - if (fetchedVersion.success && fetchedVersion.data != null && fetchedVersion.data.getApiMajorVersion() != apiMajorVersion) { - appSettingsService.updateApiVersion(fetchedVersion.data.getApiMajorVersion()) + val fetchedInformation = api.apiInformation() + if (fetchedInformation.success && fetchedInformation.data != null) { + if (fetchedInformation.data.getApiMajorVersion() != apiMajorVersion) { + appSettingsService.updateApiVersion(fetchedInformation.data.getApiMajorVersion()) + } + if (appSettingsService.getUserName().isEmpty() + && fetchedInformation.data.getApiConfiguration().isAuthEnabled() + && fetchedInformation.data.getApiConfiguration().isPublicModeEnabled()) { + appSettingsService.updatePublicAccess(true) + } } } } 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 c41e157..4d10b3b 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 @@ -191,7 +191,7 @@ class SelfossApi(private val appSettingsService: AppSettingsService) { } }) - suspend fun version(): StatusAndData = + suspend fun apiInformation(): StatusAndData = bodyOrFailure(client.tryToGet(url("/api/about"))) suspend fun markAsRead(id: String): SuccessResponse = 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 d5b622d..35716a9 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 @@ -7,6 +7,7 @@ class AppSettingsService { // Api related private var _apiVersion: Int = -1 + private var _publicAccess: Boolean? = null private var _baseUrl: String = "" private var _userName: String = "" private var _password: String = "" @@ -48,10 +49,32 @@ class AppSettingsService { return _apiVersion } + + fun updateApiVersion(apiMajorVersion: Int) { + settings.putInt(API_VERSION_MAJOR, apiMajorVersion) + refreshApiVersion() + } + private fun refreshApiVersion() { _apiVersion = settings.getInt(API_VERSION_MAJOR, -1) } + fun getPublicAccess(): Boolean { + if (_publicAccess == null) { + refreshPublicAccess() + } + return _publicAccess!! + } + + fun updatePublicAccess(publicAccess: Boolean) { + settings.putBoolean(API_PUBLIC_ACCESS, publicAccess) + refreshPublicAccess() + } + + private fun refreshPublicAccess() { + _publicAccess = settings.getBoolean(API_PUBLIC_ACCESS, false) + } + fun getBaseUrl(): String { if (_baseUrl.isEmpty()) { refreshBaseUrl() @@ -333,6 +356,7 @@ class AppSettingsService { refreshUsername() refreshBaseUrl() refreshApiVersion() + refreshPublicAccess() } fun refreshUserSettings() { @@ -376,11 +400,6 @@ class AppSettingsService { refreshApiSettings() } - fun updateApiVersion(apiMajorVersion: Int) { - settings.putInt(API_VERSION_MAJOR, apiMajorVersion) - refreshApiVersion() - } - fun clearAll() { settings.clear() refreshApiSettings() @@ -409,6 +428,8 @@ class AppSettingsService { const val API_VERSION_MAJOR = "apiVersionMajor" + const val API_PUBLIC_ACCESS = "apiPublicAccess" + const val API_ITEMS_NUMBER = "prefer_api_items_number" const val API_TIMEOUT = "api_timeout"