From 17106d8f30bfb2327a47e20c2b7b7cd21c29f423 Mon Sep 17 00:00:00 2001 From: Will Rossiter Date: Mon, 11 Sep 2023 11:42:09 +1200 Subject: [PATCH] fix: if no spam protector set, fail sliently --- .gitignore | 6 ++++- README.md | 15 ++++-------- composer.json | 20 +++++++--------- phpcs.xml.dist | 2 +- phpunit.xml.dist | 2 +- {code => src}/EditableSpamProtectionField.php | 24 ++++++++++++------- .../Extension/CommentSpamProtection.php | 12 +++++----- .../Extension/FormSpamProtectionExtension.php | 10 ++++---- {code => src}/SpamProtector.php | 0 9 files changed, 46 insertions(+), 45 deletions(-) rename {code => src}/EditableSpamProtectionField.php (97%) rename {code => src}/Extension/CommentSpamProtection.php (80%) rename {code => src}/Extension/FormSpamProtectionExtension.php (92%) rename {code => src}/SpamProtector.php (100%) diff --git a/.gitignore b/.gitignore index 496ee2c..dd02fd3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -.DS_Store \ No newline at end of file +.DS_Store +/vendor +/composer.lock +/public +.phpunit.result.cache diff --git a/README.md b/README.md index 6ade41b..c609db5 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,6 @@ composer require silverstripe/spamprotection ``` -## Maintainer Contact - - * Saophalkun Ponlu - - - * Will Rossiter - - ## Documentation This module provides a generic, consistent API for adding spam protection to @@ -40,7 +32,7 @@ need to rebuild your database through `dev/build` and set the default protector via SilverStripe's config system. This will update any Form instances that have spam protection hooks with that protector. -*mysite/_config/spamprotection.yml* +*app/_config/spamprotection.yml* ```yaml --- @@ -67,10 +59,10 @@ implementation client side or server side. `enableSpamProtection` takes a hash of optional configuration values. ```php -$form->enableSpamProtection(array( +$form->enableSpamProtection([ 'protector' => MathSpamProtector::class, 'name' => 'Captcha' -)); +]); ``` Options to configure are: @@ -121,6 +113,7 @@ class CustomSpamProtector implements SpamProtector } ``` + ## Using Spam Protection with User Forms This module provides an `EditableSpamProtectionField` wrapper which you can add diff --git a/composer.json b/composer.json index 13d1072..35b9552 100644 --- a/composer.json +++ b/composer.json @@ -6,16 +6,6 @@ "silverstripe", "spamprotection" ], - "authors": [ - { - "name": "Saophalkun Ponlu", - "email": "phalkunz@silverstripe.com" - }, - { - "name": "Will Rossiter", - "email": "will@fullscreen.io" - } - ], "require": { "php": "^8.1", "silverstripe/framework": "^5" @@ -33,11 +23,17 @@ }, "autoload": { "psr-4": { - "SilverStripe\\SpamProtection\\": "code/", + "SilverStripe\\SpamProtection\\": "src/", "SilverStripe\\SpamProtection\\Tests\\": "tests/" } }, "license": "BSD-3-Clause", "minimum-stability": "dev", - "prefer-stable": true + "prefer-stable": true, + "config": { + "allow-plugins": { + "composer/installers": true, + "silverstripe/vendor-plugin": true + } + } } diff --git a/phpcs.xml.dist b/phpcs.xml.dist index d76bc90..f3047d8 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -2,7 +2,7 @@ CodeSniffer ruleset for SilverStripe coding conventions. - code + src tests diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 794aa0f..57c7cdd 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -8,7 +8,7 @@ - code/ + src/ tests/ diff --git a/code/EditableSpamProtectionField.php b/src/EditableSpamProtectionField.php similarity index 97% rename from code/EditableSpamProtectionField.php rename to src/EditableSpamProtectionField.php index dfbdf41..7c16851 100644 --- a/code/EditableSpamProtectionField.php +++ b/src/EditableSpamProtectionField.php @@ -3,7 +3,6 @@ namespace SilverStripe\SpamProtection; use SilverStripe\Core\ClassInfo; -use SilverStripe\Core\Convert; use SilverStripe\Core\Manifest\ModuleLoader; use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\FieldGroup; @@ -41,15 +40,15 @@ class EditableSpamProtectionField extends EditableFormField * @var array * @config */ - private static $check_fields = array( + private static $check_fields = [ EditableEmailField::class, EditableTextField::class, EditableNumericField::class - ); + ]; - private static $db = array( + private static $db = [ 'SpamFieldSettings' => 'Text' - ); + ]; /** * @var FormField @@ -69,12 +68,14 @@ public function getFormField() } // Extract saved field mappings and update this field. - $fieldMapping = array(); + $fieldMapping = []; + foreach ($this->getCandidateFields() as $otherField) { $mapSetting = "Map-{$otherField->Name}"; $spamField = $this->spamMapValue($mapSetting); $fieldMapping[$otherField->Name] = $spamField; } + $protector->setFieldMapping($fieldMapping); // Generate field @@ -106,7 +107,8 @@ protected function getCandidateFields() // Get list of all configured classes available for spam detection $types = $this->config()->get('check_fields'); - $typesInherit = array(); + $typesInherit = []; + foreach ($types as $type) { $subTypes = ClassInfo::subclassesFor($type); $typesInherit = array_merge($typesInherit, $subTypes); @@ -131,8 +133,9 @@ protected function getCandidateFields() public function onBeforeWrite() { $fieldMap = json_decode($this->SpamFieldSettings ?? '', true); + if (empty($fieldMap)) { - $fieldMap = array(); + $fieldMap = []; } foreach ($this->record as $key => $value) { @@ -202,7 +205,7 @@ public function spamMapValue($mapSetting) { $map = json_decode($this->SpamFieldSettings ?? '', true); if (empty($map)) { - $map = array(); + $map = []; } if (array_key_exists($mapSetting, $map ?? [])) { @@ -255,16 +258,19 @@ public function validateField($data, $form) } } + public function getFieldValidationOptions() { return FieldList::create(); } + public function getRequired() { return false; } + public function getIcon() { $resource = ModuleLoader::getModule('silverstripe/spamprotection') diff --git a/code/Extension/CommentSpamProtection.php b/src/Extension/CommentSpamProtection.php similarity index 80% rename from code/Extension/CommentSpamProtection.php rename to src/Extension/CommentSpamProtection.php index f01e44c..fc5f8c9 100644 --- a/code/Extension/CommentSpamProtection.php +++ b/src/Extension/CommentSpamProtection.php @@ -14,19 +14,19 @@ class CommentSpamProtection extends Extension { public function alterCommentForm(&$form) { - $form->enableSpamProtection(array( + $form->enableSpamProtection([ 'name' => 'IsSpam', - 'mapping' => array( + 'mapping' => [ 'Name' => 'authorName', 'Email' => 'authorEmail', 'URL' => 'authorUrl', 'Comment' => 'body', 'ReturnURL' => 'contextUrl' - ), - 'checks' => array( + ], + 'checks' => [ 'spam', 'profanity' - ) - )); + ] + ]); } } diff --git a/code/Extension/FormSpamProtectionExtension.php b/src/Extension/FormSpamProtectionExtension.php similarity index 92% rename from code/Extension/FormSpamProtectionExtension.php rename to src/Extension/FormSpamProtectionExtension.php index 3ff2422..9a125fe 100644 --- a/code/Extension/FormSpamProtectionExtension.php +++ b/src/Extension/FormSpamProtectionExtension.php @@ -6,6 +6,7 @@ use SilverStripe\Core\Config\Configurable; use SilverStripe\Core\Extension; use SilverStripe\Core\Injector\Injector; +use SilverStripe\View\Requirements; /** * An extension to the {@link Form} class which provides the method @@ -37,7 +38,7 @@ class FormSpamProtectionExtension extends Extension * * @var array $mappable_fields */ - private static $mappable_fields = array( + private static $mappable_fields = [ 'id', 'title', 'body', @@ -48,7 +49,7 @@ class FormSpamProtectionExtension extends Extension 'authorUrl', 'authorIp', 'authorId' - ); + ]; /** * @config @@ -88,7 +89,7 @@ public static function get_protector($options = null) * @throws LogicException when get_protector method returns NULL. * @return Object */ - public function enableSpamProtection($options = array()) + public function enableSpamProtection($options = []) { // captcha form field name (must be unique) @@ -109,7 +110,8 @@ public function enableSpamProtection($options = array()) $protector = self::get_protector($options); if ($protector === null) { - throw new LogicException('No spam protector has been set. Null is not valid value.'); + Requirements::customScript('console.error("No spam protector has been set on this form.")'); + return $this->owner; } if ($protector && isset($options['mapping'])) { diff --git a/code/SpamProtector.php b/src/SpamProtector.php similarity index 100% rename from code/SpamProtector.php rename to src/SpamProtector.php