diff --git a/phpBB/adm/style/captcha_turnstile_acp_demo.html b/phpBB/adm/style/captcha_turnstile_acp_demo.html
new file mode 100644
index 0000000000..5d21532783
--- /dev/null
+++ b/phpBB/adm/style/captcha_turnstile_acp_demo.html
@@ -0,0 +1,23 @@
+
+
+
+{% INCLUDEJS 'https://challenges.cloudflare.com/turnstile/v0/api.js' %}
+
diff --git a/phpBB/config/default/container/services_captcha.yml b/phpBB/config/default/container/services_captcha.yml
index 98441f99f8..b07f842ca8 100644
--- a/phpBB/config/default/container/services_captcha.yml
+++ b/phpBB/config/default/container/services_captcha.yml
@@ -64,4 +64,4 @@ services:
calls:
- ['set_name', ['core.captcha.plugins.turnstile']]
tags:
- - { name: catpcha.plugins }
+ - { name: captcha.plugins }
diff --git a/phpBB/language/en/captcha_turnstile.php b/phpBB/language/en/captcha_turnstile.php
new file mode 100644
index 0000000000..c091b440c1
--- /dev/null
+++ b/phpBB/language/en/captcha_turnstile.php
@@ -0,0 +1,41 @@
+
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+/**
+* DO NOT CHANGE
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+if (empty($lang) || !is_array($lang))
+{
+ $lang = [];
+}
+
+// DEVELOPERS PLEASE NOTE
+//
+// All language files should use UTF-8 as their encoding and the files must not contain a BOM.
+//
+// Placeholders can now contain order information, e.g. instead of
+// 'Page %s of %s' you can (and should) write 'Page %1$s of %2$s', this allows
+// translators to re-order the output of data while ensuring it remains correct
+//
+// You do not need this where single placeholders are used, e.g. 'Message %d' is fine
+// equally where a string contains only two placeholders which are used to wrap text
+// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
+
+$lang = array_merge($lang, [
+ 'CAPTCHA_TURNSTILE' => 'Turnstile',
+]);
diff --git a/phpBB/phpbb/captcha/plugins/legacy_wrapper.php b/phpBB/phpbb/captcha/plugins/legacy_wrapper.php
index cc35920c70..bc317e711a 100644
--- a/phpBB/phpbb/captcha/plugins/legacy_wrapper.php
+++ b/phpBB/phpbb/captcha/plugins/legacy_wrapper.php
@@ -63,6 +63,17 @@ class legacy_wrapper implements plugin_interface
return false;
}
+ /**
+ * {@inheritDoc}
+ */
+ public function set_name(string $name): void
+ {
+ if (method_exists($this->legacy_captcha, 'set_name'))
+ {
+ $this->legacy_captcha->set_name($name);
+ }
+ }
+
/**
* {@inheritDoc}
*/
diff --git a/phpBB/phpbb/captcha/plugins/plugin_interface.php b/phpBB/phpbb/captcha/plugins/plugin_interface.php
index dc522ecd7e..f52643544e 100644
--- a/phpBB/phpbb/captcha/plugins/plugin_interface.php
+++ b/phpBB/phpbb/captcha/plugins/plugin_interface.php
@@ -44,6 +44,13 @@ interface plugin_interface
*/
public function get_name(): string;
+ /**
+ * Set the service name of the plugin
+ *
+ * @param string $name
+ */
+ public function set_name(string $name): void;
+
/**
* Display the captcha for the specified type
*
diff --git a/phpBB/phpbb/captcha/plugins/turnstile.php b/phpBB/phpbb/captcha/plugins/turnstile.php
index 3a5e9231eb..2aa4ca3d0c 100644
--- a/phpBB/phpbb/captcha/plugins/turnstile.php
+++ b/phpBB/phpbb/captcha/plugins/turnstile.php
@@ -26,6 +26,8 @@ class turnstile implements plugin_interface
/** @var language */
protected $language;
+ protected string $service_name = '';
+
public function __construct(config $config, language $language)
{
$this->config = $config;
@@ -34,7 +36,10 @@ class turnstile implements plugin_interface
public function is_available(): bool
{
- return ($this->config->offsetGet('captcha_turnstile_key') ?? false);
+ $this->language->add_lang('captcha_turnstile');
+
+ return !empty($this->config->offsetGet('captcha_turnstile_sitekey'))
+ && !empty($this->config->offsetGet('captcha_turnstile_secret'));
}
public function has_config(): bool
@@ -47,6 +52,14 @@ class turnstile implements plugin_interface
return 'CAPTCHA_TURNSTILE';
}
+ /**
+ * {@inheritDoc}
+ */
+ public function set_name(string $name): void
+ {
+ $this->service_name = $name;
+ }
+
public function init(int $type): void
{
$this->language->add_lang('captcha_turnstile');
@@ -147,7 +160,7 @@ class turnstile implements plugin_interface
public function get_demo_template(): string
{
- return '';
+ return 'captcha_turnstile_acp_demo.html';
}
public function garbage_collect(int $confirm_type = 0): void
diff --git a/phpBB/phpbb/db/migration/data/v400/turnstile_captcha.php b/phpBB/phpbb/db/migration/data/v400/turnstile_captcha.php
new file mode 100644
index 0000000000..06111c9306
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v400/turnstile_captcha.php
@@ -0,0 +1,48 @@
+
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\migration\data\v400;
+
+use phpbb\db\migration\migration;
+
+class turnstile_captcha extends migration
+{
+ public function effectively_installed(): bool
+ {
+ return $this->config->offsetExists('captcha_turnstile_sitekey')
+ && $this->config->offsetExists('captcha_turnstile_secret');
+ }
+
+ public static function depends_on(): array
+ {
+ return [
+ '\phpbb\db\migration\data\v400\dev',
+ ];
+ }
+
+ public function update_data(): array
+ {
+ return [
+ ['config.add', ['captcha_turnstile_sitekey', '']],
+ ['config.add', ['captcha_turnstile_secret', '']],
+ ];
+ }
+
+ public function revert_data(): array
+ {
+ return [
+ ['config.remove', ['captcha_turnstile_sitekey']],
+ ['config.remove', ['captcha_turnstile_secret']],
+ ];
+ }
+}