Improve handling of the value encoding
authorMarcel Werk <burntime@woltlab.com>
Tue, 10 Dec 2024 12:16:48 +0000 (13:16 +0100)
committerMarcel Werk <burntime@woltlab.com>
Tue, 10 Dec 2024 12:16:48 +0000 (13:16 +0100)
wcfsetup/install/files/lib/system/gridView/ACPSessionLogGridView.class.php
wcfsetup/install/files/lib/system/gridView/AbstractGridView.class.php
wcfsetup/install/files/lib/system/gridView/GridViewColumn.class.php
wcfsetup/install/files/lib/system/gridView/renderer/DefaultColumnRenderer.class.php
wcfsetup/install/files/lib/system/gridView/renderer/EmailColumnRenderer.class.php
wcfsetup/install/files/lib/system/gridView/renderer/IpAddressColumnRenderer.class.php
wcfsetup/install/files/lib/system/gridView/renderer/LinkColumnRenderer.class.php
wcfsetup/install/files/lib/system/gridView/renderer/ObjectLinkColumnRenderer.class.php
wcfsetup/install/files/lib/system/gridView/renderer/PhraseColumnRenderer.class.php
wcfsetup/install/files/lib/system/gridView/renderer/UserColumnRenderer.class.php
wcfsetup/install/files/lib/system/gridView/renderer/UserLinkColumnRenderer.class.php

index 4faaf6de8eb749c5426f1831034808d6ed51514d..b0cb7e55926a74704bfb25b61c8a038f2e8a0287 100644 (file)
@@ -49,6 +49,7 @@ final class ACPSessionLogGridView extends DatabaseObjectListGridView
             GridViewColumn::for('userAgent')
                 ->label('wcf.user.userAgent')
                 ->sortable()
+                ->valueEncoding(false)
                 ->renderer(new TruncatedTextColumnRenderer())
                 ->filter(new TextFilter()),
             GridViewColumn::for('time')
index 96b552754d8cfec9b53798fa7c1c930680d0f0cc..8e4da21f5eb440e4ec43cab36e815fc29702de72 100644 (file)
@@ -9,6 +9,7 @@ use wcf\system\event\EventHandler;
 use wcf\system\gridView\action\IGridViewAction;
 use wcf\system\request\LinkHandler;
 use wcf\system\WCF;
+use wcf\util\StringUtil;
 
 /**
  * Abstract implementation of a grid view.
@@ -238,7 +239,12 @@ abstract class AbstractGridView
      */
     public function renderColumn(GridViewColumn $column, mixed $row): string
     {
-        $value = $column->render($this->getData($row, $column->getID()), $row);
+        $value = $this->getData($row, $column->getID());
+        if ($column->encodeValue()) {
+            $value = StringUtil::encodeHTML($value);
+        }
+
+        $value = $column->render($value, $row);
 
         if (isset($this->rowLink) && $column->applyRowLink()) {
             $value = $this->rowLink->render($value, $row, $column->isTitleColumn());
index f68bf0dc518f71abe53d6195bd946a0dda03d506..1d1d44331d7250424f67f5207c652bfdecbfd0b1 100644 (file)
@@ -30,6 +30,7 @@ final class GridViewColumn
     private string $sortById = '';
     private ?IGridViewFilter $filter = null;
     private bool $hidden = false;
+    private bool $valueEncoding = true;
 
     private function __construct(private readonly string $id) {}
 
@@ -224,6 +225,24 @@ final class GridViewColumn
         return $this->hidden;
     }
 
+    /**
+     * Determines whether the value of this column should be encoded before rendering.
+     */
+    public function valueEncoding(bool $valueEncoding = true): static
+    {
+        $this->valueEncoding = $valueEncoding;
+
+        return $this;
+    }
+
+    /**
+     * Returns true if the value of this column should be encoded before rendering.
+     */
+    public function encodeValue(): bool
+    {
+        return $this->valueEncoding;
+    }
+
     /**
      * Returns true if the row link should be applied to this column.
      */
index c951075dad15a86d134031c14513051ad9a7f665..9170f362518870df6a38a1846cccd9a506c6490a 100644 (file)
@@ -18,7 +18,7 @@ class DefaultColumnRenderer extends AbstractColumnRenderer
     #[\Override]
     public function render(mixed $value, mixed $context = null): string
     {
-        return StringUtil::encodeHTML($value);
+        return $value;
     }
 
     #[\Override]
index b258d336c778e9915c74b3abc1f69b1756480899..bfe37cf5f027580a1e33497a212089b681a96e76 100644 (file)
@@ -17,6 +17,6 @@ class EmailColumnRenderer extends AbstractColumnRenderer implements ILinkColumnR
     #[\Override]
     public function render(mixed $value, mixed $context = null): string
     {
-        return \sprintf('<a href="mailto:%s">%s</a>', StringUtil::encodeHTML($value), StringUtil::encodeHTML($value));
+        return \sprintf('<a href="mailto:%s">%s</a>', $value, $value);
     }
 }
index 02ac06e4e69d2c4d241607d76bd1c734911474c7..3aeb990e5de4c0780149b5f1fd657f329f454af9 100644 (file)
@@ -22,6 +22,6 @@ class IpAddressColumnRenderer extends DefaultColumnRenderer
             return '';
         }
 
-        return StringUtil::encodeHTML(UserUtil::convertIPv6To4($value));
+        return UserUtil::convertIPv6To4($value);
     }
 }
index 4feee846039f43b5faf18702eb5f122df49125ee..223763e86b98dab17b26992f22612097f048edf9 100644 (file)
@@ -15,7 +15,7 @@ use wcf\util\StringUtil;
  * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
  * @since       6.2
  */
-class LinkColumnRenderer extends AbstractColumnRenderer implements ILinkColumnRenderer
+class LinkColumnRenderer extends DefaultColumnRenderer implements ILinkColumnRenderer
 {
     public function __construct(
         private readonly string $controllerClass,
index 06fc0b802646f46bd4dcd75fdfc49b3a043b9e71..4015874887e8eac720871e6c5adb83be33e72582 100644 (file)
@@ -19,7 +19,7 @@ use wcf\util\StringUtil;
  * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
  * @since       6.2
  */
-abstract class ObjectLinkColumnRenderer extends AbstractColumnRenderer implements ILinkColumnRenderer
+abstract class ObjectLinkColumnRenderer extends DefaultColumnRenderer implements ILinkColumnRenderer
 {
     public function __construct(
         private readonly string $controllerClass = '',
index c240a4e9197ea61ffd1f78c3b1d40ff097d6e3c8..9dea4b898f0b8ee99cee3cd553781a373e221202 100644 (file)
@@ -18,6 +18,6 @@ class PhraseColumnRenderer extends DefaultColumnRenderer
     #[\Override]
     public function render(mixed $value, mixed $context = null): string
     {
-        return StringUtil::encodeHTML(WCF::getLanguage()->get($value));
+        return WCF::getLanguage()->get($value);
     }
 }
index d4c2bd395393a548f824421735f320b023ecaaad..d610113057c1da696b9a79b0cd2fde7e991957a4 100644 (file)
@@ -6,7 +6,7 @@ use wcf\system\cache\runtime\UserRuntimeCache;
 use wcf\util\StringUtil;
 
 /**
- * Formats the content of a column as a user.
+ * Formats the content of a column as a user. The value of the column must be a user id.
  *
  * @author      Marcel Werk
  * @copyright   2001-2024 WoltLab GmbH
index 4fff65ba2c60a006f5a6fec44b2d2f621e8fe271..374c7d3c7472410ed110cd7c201aeb6d419bdf69 100644 (file)
@@ -6,7 +6,7 @@ use wcf\system\cache\runtime\AbstractRuntimeCache;
 use wcf\system\cache\runtime\UserRuntimeCache;
 
 /**
- * Formats the content of a column as a user link.
+ * Formats the content of a column as a user link. The value of the column must be a user id.
  *
  * @author      Marcel Werk
  * @copyright   2001-2024 WoltLab GmbH