From 7475b0ce1fe4d3fb75ee5492ec03cfd22b1dbf15 Mon Sep 17 00:00:00 2001
From: Philipp Stracker
Date: Wed, 27 Nov 2024 15:14:57 +0100
Subject: [PATCH] =?UTF-8?q?=F0=9F=A6=BA=20Add=20soft=20descriptor=20valida?=
=?UTF-8?q?tion=20for=20PayPal=20API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/Factory/PurchaseUnitFactory.php | 27 ++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/modules/ppcp-api-client/src/Factory/PurchaseUnitFactory.php b/modules/ppcp-api-client/src/Factory/PurchaseUnitFactory.php
index 7642401b1..172409dc5 100644
--- a/modules/ppcp-api-client/src/Factory/PurchaseUnitFactory.php
+++ b/modules/ppcp-api-client/src/Factory/PurchaseUnitFactory.php
@@ -127,7 +127,7 @@ class PurchaseUnitFactory {
$description = '';
$custom_id = (string) $order->get_id();
$invoice_id = $this->prefix . $order->get_order_number();
- $soft_descriptor = $this->soft_descriptor;
+ $soft_descriptor = $this->sanitize_soft_descriptor( $this->soft_descriptor );
$purchase_unit = new PurchaseUnit(
$amount,
@@ -197,7 +197,7 @@ class PurchaseUnitFactory {
}
}
$invoice_id = '';
- $soft_descriptor = $this->soft_descriptor;
+ $soft_descriptor = $this->sanitize_soft_descriptor( $this->soft_descriptor );
$purchase_unit = new PurchaseUnit(
$amount,
$items,
@@ -233,7 +233,7 @@ class PurchaseUnitFactory {
$description = ( isset( $data->description ) ) ? $data->description : '';
$custom_id = ( isset( $data->custom_id ) ) ? $data->custom_id : '';
$invoice_id = ( isset( $data->invoice_id ) ) ? $data->invoice_id : '';
- $soft_descriptor = ( isset( $data->soft_descriptor ) ) ? $data->soft_descriptor : $this->soft_descriptor;
+ $soft_descriptor = $this->sanitize_soft_descriptor( $data->soft_descriptor ?? $this->soft_descriptor );
$items = array();
if ( isset( $data->items ) && is_array( $data->items ) ) {
$items = array_map(
@@ -316,4 +316,25 @@ class PurchaseUnitFactory {
$purchase_unit->set_sanitizer( $this->sanitizer );
}
}
+
+ /**
+ * Sanitizes a soft descriptor, ensuring it is limited to 22 chars.
+ *
+ * The soft descriptor in the DB is escaped using `wp_kses_post()` which
+ * escapes certain characters via `wp_kses_normalize_entities()`. This
+ * helper method reverts those normalized entities back to UTF characters.
+ *
+ * @param string $soft_descriptor Soft descriptor to sanitize.
+ *
+ * @return string The sanitized soft descriptor.
+ */
+ private function sanitize_soft_descriptor( string $soft_descriptor ) : string {
+ $decoded = html_entity_decode(
+ $soft_descriptor,
+ ENT_QUOTES | ENT_HTML5 | ENT_SUBSTITUTE,
+ 'UTF-8'
+ );
+
+ return substr( $decoded, 0, 22 ) ?: '';
+ }
}