Fix doubled validation errors for CaptchaFormField
authorMatthias Schmidt <gravatronics@live.com>
Wed, 9 Dec 2020 17:42:41 +0000 (18:42 +0100)
committerMatthias Schmidt <gravatronics@live.com>
Wed, 9 Dec 2020 17:42:41 +0000 (18:42 +0100)
wcfsetup/install/files/lib/system/form/builder/field/CaptchaFormField.class.php

index 9b163d4c111ac0525272d3f0b1a9f1e4e62195e5..bee55f94dda944250746be56c0943de4e1466df3 100644 (file)
@@ -3,6 +3,7 @@ namespace wcf\system\form\builder\field;
 use wcf\system\captcha\ICaptchaHandler;
 use wcf\system\exception\UserInputException;
 use wcf\system\form\builder\field\validation\FormFieldValidationError;
+use wcf\system\form\builder\field\validation\IFormFieldValidationError;
 use wcf\system\form\builder\IObjectTypeFormNode;
 use wcf\system\form\builder\TObjectTypeFormNode;
 
@@ -37,6 +38,11 @@ class CaptchaFormField extends AbstractFormField implements IObjectTypeFormNode
         */
        protected $validationException;
        
+       /**
+        * @var IFormFieldValidationError
+        */
+       protected $validationError;
+       
        /**
         * @inheritDoc
         */
@@ -68,6 +74,15 @@ class CaptchaFormField extends AbstractFormField implements IObjectTypeFormNode
                        $variables['errorType'] = $this->validationException->getType();
                }
                
+               // The error message is shown by the captcha handler itself but up until now, the form
+               // builder API needs at least one validation error present to detect validation errors.
+               // Now, however, we can remove the validation error again.
+               if ($this->validationError) {
+                       $this->validationErrors = array_filter($this->validationErrors, function(IFormFieldValidationError $validationError) {
+                               return $validationError !== $this->validationError;
+                       });
+               }
+               
                return $variables;
        }
        
@@ -140,7 +155,8 @@ class CaptchaFormField extends AbstractFormField implements IObjectTypeFormNode
                }
                catch (UserInputException $e) {
                        $this->validationException = $e;
-                       $this->addValidationError(new FormFieldValidationError($e->getType()));
+                       $this->validationError = new FormFieldValidationError($e->getType());
+                       $this->addValidationError($this->validationError);
                }
        }