From 6bb6e3a6130cf172f6ed5f1c6627bd3311f115ac Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Thu, 25 Jan 2018 12:52:12 +0100 Subject: [PATCH] RejectOrSelect: new black/white-listing Import... ...Property Modifier fixes #1371 --- .../PropertyModifierRejectOrSelect.php | 102 ++++++++++++++++++ run.php | 1 + 2 files changed, 103 insertions(+) create mode 100644 library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php diff --git a/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php b/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php new file mode 100644 index 00000000..c2d6bee4 --- /dev/null +++ b/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php @@ -0,0 +1,102 @@ +addElement('select', 'filter_method', [ + 'label' => $form->translate('Filter method'), + 'required' => true, + 'value' => 'wildcard', + 'multiOptions' => $form->optionalEnum([ + 'wildcard' => $form->translate('Simple match with wildcards (*)'), + 'regex' => $form->translate('Regular Expression'), + ]), + ]); + + $form->addElement('text', 'filter_string', [ + 'label' => 'Filter', + 'description' => $form->translate( + 'The string/pattern you want to search for. Depends on the' + . ' chosen method, use www.* or *linux* for wildcard matches' + . ' and expression like /^www\d+\./ in case you opted for a' + . ' regular expression' + ), + 'required' => true, + ]); + + $form->addElement('select', 'policy', [ + 'label' => $form->translate('Policy'), + 'required' => true, + 'description' => $form->translate( + 'What should happen with the row, when this property matches the five expression?' + ), + 'value' => 'reject', + 'multiOptions' => [ + 'reject' => $form->translate('Reject the whole row (Blacklist)'), + 'keep' => $form->translate('Keep only matching rows (Whitelist)'), + ], + ]); + } + + public function matchesRegexp($string, $expression) + { + return preg_match($expression, $string); + } + + public function matchesWildcard($string, $expression) + { + return $this->filterExpression->matches( + (object) ['value' => $string] + ); + } + + public function transform($value) + { + $method = $this->getSetting('filter_method'); + $filter = $this->getSetting('filter_string'); + $policy = $this->getSetting('policy'); + + switch ($method) { + case 'wildcard': + $func = 'matchesWildcard'; + $this->filterExpression = new FilterExpression('value', '=', $filter); + break; + case 'regex': + $func = 'matchesRegexp'; + break; + default: + throw new ConfigurationError( + '%s is not a valid value for an ArrayFilter filter_method', + var_export($method, 1) + ); + } + + if ($this->$func($value, $filter)) { + if ($policy === 'reject') { + $this->rejectRow(); + } + } else { + if ($policy === 'keep') { + $this->rejectRow(); + } + } + + return $value; + } +} diff --git a/run.php b/run.php index 2a60e346..9e0aad3f 100644 --- a/run.php +++ b/run.php @@ -51,6 +51,7 @@ $this->provideHook('director/PropertyModifier', $prefix . 'PropertyModifier\\Pro $this->provideHook('director/PropertyModifier', $prefix . 'PropertyModifier\\PropertyModifierXlsNumericIp'); $this->provideHook('director/PropertyModifier', $prefix . 'PropertyModifier\\PropertyModifierURLEncode'); $this->provideHook('director/PropertyModifier', $prefix . 'PropertyModifier\\PropertyModifierUpperCaseFirst'); +$this->provideHook('director/PropertyModifier', $prefix . 'PropertyModifier\\PropertyModifierRejectOrSelect'); $this->provideHook('director/Job', $prefix . 'Job\\HousekeepingJob'); $this->provideHook('director/Job', $prefix . 'Job\\ConfigJob');