From 355dc5ec4ed5780131a2adbd8565461d8a6f8dad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakob=20M=C3=B6ller?= <jakob.moeller@sap.com>
Date: Sun, 7 Jun 2020 10:47:30 +0200
Subject: [PATCH] Fix/no urls (#242)

* fixes #273

* lint fix

Co-authored-by: Philipp Woessner <philipp.woessner@sap.com>
Co-authored-by: Philipp Woessner <64482866+pwoessner@users.noreply.github.com>
---
 .../exception/http/ServiceFactoryException.kt |  4 ++++
 .../rki/coronawarnapp/http/ServiceFactory.kt  | 24 ++++++++++++++++---
 .../coronawarnapp/http/WebRequestBuilder.kt   |  6 ++---
 .../rki/coronawarnapp/update/UpdateChecker.kt |  9 +++----
 4 files changed, 33 insertions(+), 10 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/ServiceFactoryException.kt

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/ServiceFactoryException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/ServiceFactoryException.kt
new file mode 100644
index 000000000..aca52b82f
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/ServiceFactoryException.kt
@@ -0,0 +1,4 @@
+package de.rki.coronawarnapp.exception.http
+
+class ServiceFactoryException(cause: Throwable) :
+    Exception("error inside the service factory", cause)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt
index 90c2fd6fc..42604a156 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt
@@ -1,7 +1,9 @@
 package de.rki.coronawarnapp.http
 
+import android.webkit.URLUtil
 import de.rki.coronawarnapp.BuildConfig
 import de.rki.coronawarnapp.CoronaWarnApplication
+import de.rki.coronawarnapp.exception.http.ServiceFactoryException
 import de.rki.coronawarnapp.http.service.DistributionService
 import de.rki.coronawarnapp.http.service.SubmissionService
 import de.rki.coronawarnapp.http.service.VerificationService
@@ -90,34 +92,50 @@ class ServiceFactory {
         clientBuilder.build()
     }
 
+    private val downloadCdnUrl
+        get() = getValidUrl(DynamicURLs.DOWNLOAD_CDN_URL)
+
     fun distributionService(): DistributionService = distributionService
     private val distributionService by lazy {
         Retrofit.Builder()
             .client(okHttpClient)
-            .baseUrl(DynamicURLs.DOWNLOAD_CDN_URL)
+            .baseUrl(downloadCdnUrl)
             .addConverterFactory(gsonConverterFactory)
             .build()
             .create(DistributionService::class.java)
     }
 
+    private val verificationCdnUrl
+        get() = getValidUrl(DynamicURLs.VERIFICATION_CDN_URL)
+
     fun verificationService(): VerificationService = verificationService
     private val verificationService by lazy {
         Retrofit.Builder()
             .client(okHttpClient)
-            .baseUrl(DynamicURLs.VERIFICATION_CDN_URL)
+            .baseUrl(verificationCdnUrl)
             .addConverterFactory(gsonConverterFactory)
             .build()
             .create(VerificationService::class.java)
     }
 
+    private val submissionCdnUrl
+        get() = getValidUrl(DynamicURLs.SUBMISSION_CDN_URL)
+
     fun submissionService(): SubmissionService = submissionService
     private val submissionService by lazy {
         Retrofit.Builder()
             .client(okHttpClient)
-            .baseUrl(DynamicURLs.SUBMISSION_CDN_URL)
+            .baseUrl(submissionCdnUrl)
             .addConverterFactory(protoConverterFactory)
             .addConverterFactory(gsonConverterFactory)
             .build()
             .create(SubmissionService::class.java)
     }
+
+    private fun getValidUrl(url: String): String {
+        if (!URLUtil.isHttpsUrl(url)) {
+            throw ServiceFactoryException(IllegalArgumentException("the url is invalid"))
+        }
+        return url
+    }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt
index 408169d26..5e8369c71 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt
@@ -48,9 +48,9 @@ object WebRequestBuilder {
 
     private val serviceFactory = ServiceFactory()
 
-    private val distributionService = serviceFactory.distributionService()
-    private val verificationService = serviceFactory.verificationService()
-    private val submissionService = serviceFactory.submissionService()
+    private val distributionService by lazy { serviceFactory.distributionService() }
+    private val verificationService by lazy { serviceFactory.verificationService() }
+    private val submissionService by lazy { serviceFactory.submissionService() }
 
     suspend fun asyncGetDateIndex(): List<String> = withContext(Dispatchers.IO) {
         return@withContext distributionService
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/update/UpdateChecker.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/update/UpdateChecker.kt
index 07bf9cc0e..2644430f9 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/update/UpdateChecker.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/update/UpdateChecker.kt
@@ -31,12 +31,13 @@ class UpdateChecker(private val activity: LauncherActivity) {
     suspend fun checkForUpdate() {
 
         // check if an update is needed based on server config
+        // TODO replace with signature exception
         val updateNeededFromServer: Boolean = try {
             checkIfUpdatesNeededFromServer()
-        }
-        // TODO replace with signature exception
-        catch (exception: Exception) {
-            true
+        } catch (exception: Exception) {
+            Log.e(TAG, exception.localizedMessage ?: "unknown error")
+            exception.printStackTrace()
+            false
         }
 
         // get AppUpdateManager
-- 
GitLab