From 6976b1df19769724dcd0642874b08b0d6628ee5f Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 2 Jul 2026 17:07:27 +0200 Subject: [PATCH 1/2] use application name as user agent for login request ..important for branding Signed-off-by: Marcel Hibbe --- .../talk/account/data/network/NetworkLoginDataSource.kt | 2 ++ .../com/nextcloud/talk/dagger/modules/RestModule.java | 5 ++++- app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/account/data/network/NetworkLoginDataSource.kt b/app/src/main/java/com/nextcloud/talk/account/data/network/NetworkLoginDataSource.kt index f852b79dd44..ecaff13dd50 100644 --- a/app/src/main/java/com/nextcloud/talk/account/data/network/NetworkLoginDataSource.kt +++ b/app/src/main/java/com/nextcloud/talk/account/data/network/NetworkLoginDataSource.kt @@ -12,6 +12,7 @@ import com.google.gson.JsonObject import com.google.gson.JsonParser import com.nextcloud.talk.account.data.model.LoginCompletion import com.nextcloud.talk.account.data.model.LoginResponse +import com.nextcloud.talk.utils.ApiUtils import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request @@ -101,6 +102,7 @@ class NetworkLoginDataSource(val okHttpClient: OkHttpClient) { .url(url) .post(FormBody.Builder().build()) .addHeader("Clear-Site-Data", "cookies") + .header("User-Agent", ApiUtils.loginUserAgent) .build() okHttpClient.newCall(request).execute().use { response -> diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java b/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java index 42f49dc3831..deae5cf44e0 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java @@ -248,10 +248,13 @@ public static class HeadersInterceptor implements Interceptor { public Response intercept(@NonNull Chain chain) throws IOException { Request original = chain.request(); Request.Builder requestBuilder = original.newBuilder() - .header("User-Agent", ApiUtils.getUserAgent()) .header("ngrok-skip-browser-warning", "true") .method(original.method(), original.body()); + if (TextUtils.isEmpty(original.header("User-Agent"))) { + requestBuilder.header("User-Agent", ApiUtils.getUserAgent()); + } + if (isOcsEndpoint(original)) { requestBuilder .header("Accept", "application/json") diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index b410627eb8c..35f26e83cba 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -39,6 +39,14 @@ object ApiUtils { val userAgent = "Mozilla/5.0 (Android) Nextcloud-Talk v" get() = field + BuildConfig.VERSION_NAME + // shown to the user in the browser during the login flow, so it uses the human-readable product name + @JvmStatic + val loginUserAgent: String + get() { + val productName = sharedApplication!!.resources.getString(R.string.nc_app_product_name) + return "Mozilla/5.0 (Android) $productName v${BuildConfig.VERSION_NAME}" + } + @Deprecated( "This is only supported on API v1-3, in API v4+ please use " + "{@link ApiUtils#getUrlForAttendees(int, String, String)} instead." From aaa265a2c2ceb516c3cc59b66bc2fec33d224286 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 3 Jul 2026 12:11:47 +0200 Subject: [PATCH 2/2] fix login test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "testing anonymouslyPostLoginRequest correct path" ❯ ERROR: NetworkLoginDataSource: Error caught at anonymouslyPostLoginRequest: java.lang.NullPointerException junit.framework.AssertionFailedError at junit.framework.Assert.fail(Assert.java:55) at junit.framework.Assert.assertTrue(Assert.java:22) at junit.framework.Assert.assertNotNull(Assert.java:256) at junit.framework.Assert.assertNotNull(Assert.java:248) at junit.framework.TestCase.assertNotNull(TestCase.java:391) at com.nextcloud.talk.login.data.network.NetworkLoginDataSourceTest.testing anonymouslyPostLoginRequest correct path(NetworkLoginDataSourceTest.kt:51) Signed-off-by: Marcel Hibbe --- app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index 35f26e83cba..dfec53ec1c6 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -39,11 +39,14 @@ object ApiUtils { val userAgent = "Mozilla/5.0 (Android) Nextcloud-Talk v" get() = field + BuildConfig.VERSION_NAME + private const val DEFAULT_LOGIN_PRODUCT_NAME = "Nextcloud Talk" + // shown to the user in the browser during the login flow, so it uses the human-readable product name @JvmStatic val loginUserAgent: String get() { - val productName = sharedApplication!!.resources.getString(R.string.nc_app_product_name) + val productName = sharedApplication?.resources?.getString(R.string.nc_app_product_name) + ?: DEFAULT_LOGIN_PRODUCT_NAME return "Mozilla/5.0 (Android) $productName v${BuildConfig.VERSION_NAME}" }