Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions wcfsetup/install/files/lib/form/ContactForm.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use wcf\system\form\builder\field\CaptchaFormField;
use wcf\system\form\builder\field\EmailFormField;
use wcf\system\form\builder\field\FileProcessorFormField;
use wcf\system\form\builder\field\ICensorshipFormField;
use wcf\system\form\builder\field\IFormField;
use wcf\system\form\builder\field\SelectFormField;
use wcf\system\form\builder\field\TextFormField;
Expand Down Expand Up @@ -51,6 +52,7 @@ protected function createForm()
TextFormField::create('name')
->label('wcf.contact.sender')
->required()
->censorship()
->value(WCF::getUser()->username ?: ''),
EmailFormField::create('email')
->label('wcf.user.email')
Expand Down Expand Up @@ -226,6 +228,10 @@ protected function getOptionFormFields(): array
$formField->required();
}

if ($formField instanceof ICensorshipFormField) {
$formField->censorship();
}

$formFields[] = $formField;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace wcf\system\form\builder\field;

/**
* Represents a form field that supports the use of the censorship function.
*
* @author Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
interface ICensorshipFormField extends IFormField
{
/**
* Sets whether the censorship function should be applied to this field.
*/
public function censorship(bool $censorship = true): static;

/**
* Returns `true` if the censorship function should be applied to this field.
*/
public function hasCensorship(): bool;

/**
* Validates whether the text contains censored words.
*/
public function validateCensorship(string $text): void;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace wcf\system\form\builder\field;

use wcf\system\form\builder\field\validation\FormFieldValidationError;
use wcf\system\message\censorship\Censorship;

/**
* Provides default implementations of `ICensorshipFormField` methods.
*
* @author Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
trait TCensorshipFormField
{
protected bool $censorship = false;

#[\Override]
public function censorship(bool $censorship = true): static
{
$this->censorship = $censorship;

return $this;
}

#[\Override]
public function hasCensorship(): bool
{
return $this->censorship;
}

#[\Override]
public function validateCensorship(string $text): void
{
if (!$this->hasCensorship()) {
return;
}

if (!($this instanceof IFormField)) {
return;
}

$censoredWords = Censorship::getInstance()->test($text);
if ($censoredWords) {
$this->addValidationError(new FormFieldValidationError(
'censoredWords',
'wcf.message.error.censoredWordsFound',
['censoredWords' => $censoredWords]
));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class TextFormField extends AbstractFormField implements
IAttributeFormField,
IAutoCompleteFormField,
IAutoFocusFormField,
ICensorshipFormField,
ICssClassFormField,
II18nFormField,
IImmutableFormField,
Expand All @@ -30,6 +31,7 @@ class TextFormField extends AbstractFormField implements
use TInputAttributeFormField;
use TTextAutoCompleteFormField;
use TAutoFocusFormField;
use TCensorshipFormField;
use TCssClassFormField;
use TImmutableFormField;
use TInputModeFormField;
Expand Down Expand Up @@ -115,6 +117,7 @@ protected function validateText($text, ?Language $language = null)
{
$this->validateMinimumLength($text, $language);
$this->validateMaximumLength($text, $language);
$this->validateCensorship($text);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
use wcf\system\form\builder\field\AbstractFormField;
use wcf\system\form\builder\field\IAttributeFormField;
use wcf\system\form\builder\field\ICensorshipFormField;
use wcf\system\form\builder\field\IMaximumLengthFormField;
use wcf\system\form\builder\field\IMinimumLengthFormField;
use wcf\system\form\builder\field\TCensorshipFormField;
use wcf\system\form\builder\field\TInputAttributeFormField;
use wcf\system\form\builder\field\TMaximumLengthFormField;
use wcf\system\form\builder\field\TMinimumLengthFormField;
Expand All @@ -17,7 +19,6 @@
use wcf\system\form\builder\TObjectTypeFormNode;
use wcf\system\html\input\HtmlInputProcessor;
use wcf\system\html\upcast\HtmlUpcastProcessor;
use wcf\system\message\censorship\Censorship;
use wcf\system\message\quote\MessageQuoteManager;
use wcf\system\WCF;
use wcf\util\StringUtil;
Expand All @@ -32,10 +33,12 @@
*/
final class WysiwygFormField extends AbstractFormField implements
IAttributeFormField,
ICensorshipFormField,
IMaximumLengthFormField,
IMinimumLengthFormField,
IObjectTypeFormNode
{
use TCensorshipFormField;
use TInputAttributeFormField {
getReservedFieldAttributes as private inputGetReservedFieldAttributes;
}
Expand Down Expand Up @@ -89,6 +92,12 @@ final class WysiwygFormField extends AbstractFormField implements
*/
protected $templateName = 'shared_wysiwygFormField';

public function __construct()
{
// WYSIWYG form fields use the censorship function by default for backward compatibility reasons.
$this->censorship();
}

/**
* Sets the identifier used to autosave the field value and returns this field.
*
Expand Down Expand Up @@ -372,14 +381,7 @@ public function validate()
$this->validateMaximumLength($message);

if (empty($this->getValidationErrors())) {
$censoredWords = Censorship::getInstance()->test($message);
if ($censoredWords) {
$this->addValidationError(new FormFieldValidationError(
'censoredWords',
'wcf.message.error.censoredWordsFound',
['censoredWords' => $censoredWords]
));
}
$this->validateCensorship($message);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion wcfsetup/install/lang/de.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4341,7 +4341,7 @@ Erlaubte Dateiendungen: gif, jpg, jpeg, png, webp]]></item>
<item name="wcf.message.button.extendedReply"><![CDATA[Erweiterte Antwort]]></item>
<item name="wcf.message.button.extendedEdit"><![CDATA[Erweiterte Bearbeitung]]></item>
<item name="wcf.message.new"><![CDATA[Neu]]></item>
<item name="wcf.message.error.censoredWordsFound"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Deine{else}Ihre{/if} Nachricht verwendet nicht gestattete Begriffe: {implode from=$censoredWords key=censoredWord item=number}{$censoredWord}{if $number > 1} ({#$number}×){/if}{/implode}]]></item>
<item name="wcf.message.error.censoredWordsFound"><![CDATA[Der Text verwendet nicht gestattete Begriffe: {implode from=$censoredWords key=censoredWord item=number}{$censoredWord}{if $number > 1} ({#$number}×){/if}{/implode}]]></item>
<item name="wcf.message.error.disallowedBBCodes"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Deine{else}Ihre{/if} Nachricht enthält die folgenden BBCodes, die {if LANGUAGE_USE_INFORMAL_VARIANT}du nicht verwenden darfst{else}Sie nicht verwenden dürfen{/if}: {implode from=$disallowedBBCodes item=disallowedBBCode}{$disallowedBBCode}{/implode}]]></item>
<item name="wcf.message.error.editorAlreadyInUse"><![CDATA[Der Editor ist bereits aktiv, {if LANGUAGE_USE_INFORMAL_VARIANT}beende die Bearbeitung bevor du fortfährst{else}beenden Sie die Bearbeitung bevor Sie fortfahren{/if}.]]></item>
<item name="wcf.message.error.tooLong"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Deine{else}Ihre{/if} Nachricht ist zu lang. Es stehen maximal {#$maxTextLength} Zeichen zur Verfügung.]]></item>
Expand Down
2 changes: 1 addition & 1 deletion wcfsetup/install/lang/en.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4287,7 +4287,7 @@ Allowed extensions: gif, jpg, jpeg, png, webp]]></item>
<item name="wcf.message.button.extendedReply"><![CDATA[More Options]]></item>
<item name="wcf.message.button.extendedEdit"><![CDATA[More Options]]></item>
<item name="wcf.message.new"><![CDATA[New]]></item>
<item name="wcf.message.error.censoredWordsFound"><![CDATA[The message contains disallowed words: {implode from=$censoredWords key=censoredWord item=number}{$censoredWord}{if $number > 1} ({#$number}×){/if}{/implode}.]]></item>
<item name="wcf.message.error.censoredWordsFound"><![CDATA[The text contains disallowed words: {implode from=$censoredWords key=censoredWord item=number}{$censoredWord}{if $number > 1} ({#$number}×){/if}{/implode}.]]></item>
<item name="wcf.message.error.disallowedBBCodes"><![CDATA[The message contains disallowed BBCodes: {implode from=$disallowedBBCodes item=disallowedBBCode}{$disallowedBBCode}{/implode}.]]></item>
<item name="wcf.message.error.editorAlreadyInUse"><![CDATA[The editor is already in use, please finish editing before continuing.]]></item>
<item name="wcf.message.error.tooLong"><![CDATA[The message is too long, must be under {#$maxTextLength} characters.]]></item>
Expand Down