From 4967deb567d202be7726d0ccd7721e10425b088a Mon Sep 17 00:00:00 2001 From: suweinberg Date: Wed, 19 Feb 2025 16:44:00 -0800 Subject: [PATCH 1/5] add auth header for logs --- library/src/main/java/com/paypal/messages/io/Api.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/paypal/messages/io/Api.kt b/library/src/main/java/com/paypal/messages/io/Api.kt index 396e2027..ea2358bf 100644 --- a/library/src/main/java/com/paypal/messages/io/Api.kt +++ b/library/src/main/java/com/paypal/messages/io/Api.kt @@ -1,6 +1,7 @@ package com.paypal.messages.io import android.content.Context +import android.util.Base64 import com.google.gson.GsonBuilder import com.google.gson.JsonObject import com.paypal.messages.BuildConfig @@ -230,13 +231,20 @@ object Api { } internal fun createLoggerRequest(json: String): Request { + // Create authorization header for logs: Basic + val jsonObj = JSONObject(json).getJSONObject("data") + val clientIdStr = jsonObj.get("client_id").toString() + val clientIdBytes = clientIdStr.toByteArray(charset = Charsets.UTF_8) + val encodedClientId = "Basic " + Base64.encodeToString(clientIdBytes, Base64.NO_WRAP) + val request = Request.Builder().apply { + header("Authorization", encodedClientId) url(env.url(Env.Endpoints.LOGGER)) post(json.toRequestBody("application/json".toMediaType())) }.build() val jsonNoFdata = JSONObject(json).toString(2) - .replace(""""fdata":.*?",""".toRegex(), "") + .replace("""fdata":.*?",""".toRegex(), "") LogCat.debug(TAG, "createLoggerRequest: $request\npayloadJson: $jsonNoFdata") return request } From 3f74dd963a5a9df97d356d352041e553ed94c7ec Mon Sep 17 00:00:00 2001 From: suweinberg Date: Wed, 19 Feb 2025 16:46:12 -0800 Subject: [PATCH 2/5] fix jsonNoFdata --- library/src/main/java/com/paypal/messages/io/Api.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/com/paypal/messages/io/Api.kt b/library/src/main/java/com/paypal/messages/io/Api.kt index ea2358bf..f3d6cf34 100644 --- a/library/src/main/java/com/paypal/messages/io/Api.kt +++ b/library/src/main/java/com/paypal/messages/io/Api.kt @@ -244,7 +244,7 @@ object Api { }.build() val jsonNoFdata = JSONObject(json).toString(2) - .replace("""fdata":.*?",""".toRegex(), "") + .replace(""""fdata":.*?",""".toRegex(), "") LogCat.debug(TAG, "createLoggerRequest: $request\npayloadJson: $jsonNoFdata") return request } From 9439e7d1e7e25b5a2666e3aec9d2e5cdde5fd823 Mon Sep 17 00:00:00 2001 From: suweinberg Date: Tue, 18 Mar 2025 11:59:56 -0700 Subject: [PATCH 3/5] add null checks --- .../main/java/com/paypal/messages/io/Api.kt | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/library/src/main/java/com/paypal/messages/io/Api.kt b/library/src/main/java/com/paypal/messages/io/Api.kt index f3d6cf34..59807810 100644 --- a/library/src/main/java/com/paypal/messages/io/Api.kt +++ b/library/src/main/java/com/paypal/messages/io/Api.kt @@ -231,11 +231,28 @@ object Api { } internal fun createLoggerRequest(json: String): Request { + val jsonObject = JSONObject(json) + // Create authorization header for logs: Basic - val jsonObj = JSONObject(json).getJSONObject("data") - val clientIdStr = jsonObj.get("client_id").toString() - val clientIdBytes = clientIdStr.toByteArray(charset = Charsets.UTF_8) - val encodedClientId = "Basic " + Base64.encodeToString(clientIdBytes, Base64.NO_WRAP) + val dataObject = try { + jsonObject.getJSONObject("data") + } catch (error: Exception) { + LogCat.error(TAG, "Error parsing json data") + null + } + val clientIdString = try { + dataObject?.getString("client_id") + } catch (error: Exception) { + LogCat.error(TAG, "Error parsing client_id") + null + } + val clientIdBytes = clientIdString!!.toByteArray(charset = Charsets.UTF_8) + val encodedClientId = try { + "Basic " + Base64.encodeToString(clientIdBytes, Base64.NO_WRAP) + } catch (error: Exception) { + LogCat.error(TAG, "Error encoding client_id") + null + } val request = Request.Builder().apply { header("Authorization", encodedClientId) @@ -243,7 +260,7 @@ object Api { post(json.toRequestBody("application/json".toMediaType())) }.build() - val jsonNoFdata = JSONObject(json).toString(2) + val jsonNoFdata = jsonObject.toString(2) .replace(""""fdata":.*?",""".toRegex(), "") LogCat.debug(TAG, "createLoggerRequest: $request\npayloadJson: $jsonNoFdata") return request From 693fa8ae615b18cbb3efd4807046c5ed75b6524c Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Thu, 20 Mar 2025 21:36:12 -0400 Subject: [PATCH 4/5] Clean up encoding, add tests --- .../java/com/paypal/messages/io/ApiTest.kt | 24 +++++++++++++++-- .../main/java/com/paypal/messages/io/Api.kt | 27 ++++++------------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt b/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt index c748aa39..e0704b8e 100644 --- a/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt +++ b/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt @@ -361,9 +361,29 @@ class ApiTest { } @Test - fun testCreateLoggerRequest() { - val request = Api.createLoggerRequest("{}") + fun testCreateLoggerRequestWithClientId() { + val request = Api.createLoggerRequest("""{"data": {"client_id": "mockClientId"}}""") val expectedPath = "v1/credit/upstream-messaging-events" + + assertTrue(!request.header("Authorization").isNullOrEmpty()) + assertTrue(request.url.toString().contains(expectedPath)) + } + + @Test + fun testCreateLoggerRequestWithNoClientId() { + val request = Api.createLoggerRequest("""{"data": {}}""") + val expectedPath = "v1/credit/upstream-messaging-events" + + assertTrue(request.header("Authorization").isNullOrEmpty()) + assertTrue(request.url.toString().contains(expectedPath)) + } + + @Test + fun testCreateLoggerRequestWithNoData() { + val request = Api.createLoggerRequest("""{}""") + val expectedPath = "v1/credit/upstream-messaging-events" + + assertTrue(request.header("Authorization").isNullOrEmpty()) assertTrue(request.url.toString().contains(expectedPath)) } diff --git a/library/src/main/java/com/paypal/messages/io/Api.kt b/library/src/main/java/com/paypal/messages/io/Api.kt index 59807810..a16eacf3 100644 --- a/library/src/main/java/com/paypal/messages/io/Api.kt +++ b/library/src/main/java/com/paypal/messages/io/Api.kt @@ -234,28 +234,17 @@ object Api { val jsonObject = JSONObject(json) // Create authorization header for logs: Basic - val dataObject = try { + val encodedClientId = runCatching { jsonObject.getJSONObject("data") - } catch (error: Exception) { - LogCat.error(TAG, "Error parsing json data") - null - } - val clientIdString = try { - dataObject?.getString("client_id") - } catch (error: Exception) { - LogCat.error(TAG, "Error parsing client_id") - null - } - val clientIdBytes = clientIdString!!.toByteArray(charset = Charsets.UTF_8) - val encodedClientId = try { - "Basic " + Base64.encodeToString(clientIdBytes, Base64.NO_WRAP) - } catch (error: Exception) { - LogCat.error(TAG, "Error encoding client_id") - null - } + .getString("client_id") + .toByteArray(charset = Charsets.UTF_8) + .let { Base64.encodeToString(it, Base64.NO_WRAP) } + }.onFailure { error -> + LogCat.error(TAG, "Error processing client_id: ${error.message}") + }.getOrNull() val request = Request.Builder().apply { - header("Authorization", encodedClientId) + if (encodedClientId is String) header("Authorization", "Basic $encodedClientId") url(env.url(Env.Endpoints.LOGGER)) post(json.toRequestBody("application/json".toMediaType())) }.build() From d2ab8b542e317f8b15c59ef173655ddf1082363e Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Tue, 25 Mar 2025 13:24:58 -0400 Subject: [PATCH 5/5] Fix tests and send auth key --- .../src/androidTest/java/com/paypal/messages/io/ApiTest.kt | 4 ++-- library/src/main/java/com/paypal/messages/io/Api.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt b/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt index e0704b8e..24d680c7 100644 --- a/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt +++ b/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt @@ -374,7 +374,7 @@ class ApiTest { val request = Api.createLoggerRequest("""{"data": {}}""") val expectedPath = "v1/credit/upstream-messaging-events" - assertTrue(request.header("Authorization").isNullOrEmpty()) + assertTrue(request.header("Authorization")!!.contains("Basic null")) assertTrue(request.url.toString().contains(expectedPath)) } @@ -383,7 +383,7 @@ class ApiTest { val request = Api.createLoggerRequest("""{}""") val expectedPath = "v1/credit/upstream-messaging-events" - assertTrue(request.header("Authorization").isNullOrEmpty()) + assertTrue(request.header("Authorization")!!.contains("Basic null")) assertTrue(request.url.toString().contains(expectedPath)) } diff --git a/library/src/main/java/com/paypal/messages/io/Api.kt b/library/src/main/java/com/paypal/messages/io/Api.kt index a16eacf3..8b30f44c 100644 --- a/library/src/main/java/com/paypal/messages/io/Api.kt +++ b/library/src/main/java/com/paypal/messages/io/Api.kt @@ -244,7 +244,7 @@ object Api { }.getOrNull() val request = Request.Builder().apply { - if (encodedClientId is String) header("Authorization", "Basic $encodedClientId") + header("Authorization", "Basic $encodedClientId") url(env.url(Env.Endpoints.LOGGER)) post(json.toRequestBody("application/json".toMediaType())) }.build()