diff --git a/packages/join-block/src/Settings.php b/packages/join-block/src/Settings.php index 78520a7..047c5c6 100644 --- a/packages/join-block/src/Settings.php +++ b/packages/join-block/src/Settings.php @@ -290,7 +290,9 @@ public static function init() if (!$log) { $log = 'Could not load error log. Please contact Common Knowledge support.'; } - return "
$log"; + // The log holds text sent by visitors (join and step requests), so + // it must be shown as text, never as markup. + return '
' . esc_html($log) . ''; }); /** @var Html_Field $logRetentionField */ $logRetentionField = Field::make('html', 'ck_join_flow_log_retention'); diff --git a/packages/join-e2e/tests/log-viewer.spec.ts b/packages/join-e2e/tests/log-viewer.spec.ts new file mode 100644 index 0000000..6fec05d --- /dev/null +++ b/packages/join-e2e/tests/log-viewer.spec.ts @@ -0,0 +1,26 @@ +import { test, expect } from '@playwright/test'; +import { loginAsAdmin } from './helpers'; + +/** + * The plugin's log, shown on WP Admin > Join > Logging, holds text that + * visitors send. It must be shown as text: markup in it must never run in the + * admin's browser. + */ +test('markup sent by a visitor is shown as text in the log viewer, not run', async ({ page, request }) => { + const probe = `log-viewer-probe-${Date.now()}`; + const markup = `