Skip to content

Commit 4aaa262

Browse files
committed
Allow any type as a filter and do not (un)serialize
1 parent 231ccc2 commit 4aaa262

12 files changed

Lines changed: 53 additions & 39 deletions

wcfsetup/install/files/lib/system/condition/provider/AbstractConditionProvider.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ final public function getFieldId(string $containerId, string $identifier, int $i
4747
return "{$containerId}_{$identifier}_{$index}";
4848
}
4949

50-
final public function getConditionFormField(string $containerId, string $identifier, int $index, null|float|int|string $value = null): ConditionRowFormFieldContainer
50+
final public function getConditionFormField(string $containerId, string $identifier, int $index, mixed $value = null): ConditionRowFormFieldContainer
5151
{
5252
$condition = $this->getConditionByIdentifier($identifier);
5353
if ($condition === null) {

wcfsetup/install/files/lib/system/condition/type/AbstractConditionType.class.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@
88
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
99
* @since 6.2
1010
*
11-
* @template TFilter of float|int|string
11+
* @template TFilter
12+
* @implements IConditionType<TFilter>
1213
*/
1314
abstract class AbstractConditionType implements IConditionType
1415
{
15-
protected float|int|string $filter;
16+
protected mixed $filter;
1617

1718
/**
1819
* @inheritDoc
1920
*/
20-
public function setFilter(float|int|string $filter): void
21+
public function setFilter(mixed $filter): void
2122
{
2223
$this->filter = $filter;
2324
}

wcfsetup/install/files/lib/system/condition/type/IConditionType.class.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* @copyright 2001-2025 WoltLab GmbH
1010
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1111
* @since 6.3
12+
*
13+
* @template TFilter
1214
*/
1315
interface IConditionType
1416
{
@@ -29,6 +31,8 @@ public function getLabel(): string;
2931

3032
/**
3133
* Set the filter value for this condition type.
34+
*
35+
* @param TFilter $filter
3236
*/
33-
public function setFilter(float|int|string $filter): void;
37+
public function setFilter(mixed $filter): void;
3438
}

wcfsetup/install/files/lib/system/condition/type/IDatabaseObjectListConditionType.class.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
* @since 6.3
1212
*
1313
* @template T of DatabaseObjectList
14+
* @template TFilter
15+
* @extends IConditionType<TFilter>
1416
*/
1517
interface IDatabaseObjectListConditionType extends IConditionType
1618
{

wcfsetup/install/files/lib/system/condition/type/IObjectConditionType.class.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* @since 6.3
1010
*
1111
* @template T of object
12+
* @template TFilter
13+
* @extends IConditionType<TFilter>
1214
*/
1315
interface IObjectConditionType extends IConditionType
1416
{

wcfsetup/install/files/lib/system/condition/type/user/UserInGroupConditionType.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1818
* @since 6.3
1919
*
20-
* @implements IDatabaseObjectListConditionType<UserList<User>>
21-
* @implements IObjectConditionType<User>
20+
* @implements IDatabaseObjectListConditionType<UserList<User>, int>
21+
* @implements IObjectConditionType<User, int>
2222
* @extends AbstractConditionType<int>
2323
*/
2424
final class UserInGroupConditionType extends AbstractConditionType implements IDatabaseObjectListConditionType, IObjectConditionType

wcfsetup/install/files/lib/system/condition/type/user/UserNotInGroupConditionType.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1818
* @since 6.3
1919
*
20-
* @implements IDatabaseObjectListConditionType<UserList<User>>
21-
* @implements IObjectConditionType<User>
20+
* @implements IDatabaseObjectListConditionType<UserList<User>, int>
21+
* @implements IObjectConditionType<User, int>
2222
* @extends AbstractConditionType<int>
2323
*/
2424
final class UserNotInGroupConditionType extends AbstractConditionType implements IDatabaseObjectListConditionType, IObjectConditionType

wcfsetup/install/files/lib/system/condition/type/user/UserRegistrationDateConditionType.class.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1818
* @since 6.3
1919
*
20-
* @implements IDatabaseObjectListConditionType<UserList<User>>
21-
* @implements IObjectConditionType<User>
22-
* @extends AbstractConditionType<string>
20+
* @phpstan-type Filter = array{condition: string, value: string}
21+
* @implements IDatabaseObjectListConditionType<UserList<User>, Filter>
22+
* @implements IObjectConditionType<User, Filter>
23+
* @extends AbstractConditionType<Filter>
2324
*/
2425
final class UserRegistrationDateConditionType extends AbstractConditionType implements IDatabaseObjectListConditionType, IObjectConditionType
2526
{
@@ -74,15 +75,14 @@ public function match(object $object): bool
7475
*/
7576
private function getParsedFilter(): array
7677
{
77-
["condition" => $condition, "value" => $filter] = @\unserialize($this->filter);
7878
$dateTime = \DateTime::createFromFormat(
7979
DateConditionFormField::TIME_FORMAT,
80-
$filter,
80+
$this->filter["value"],
8181
new \DateTimeZone(TIMEZONE),
8282
);
8383

8484
return [
85-
'condition' => $condition,
85+
'condition' => $this->filter["condition"],
8686
'time' => $dateTime->getTimestamp(),
8787
];
8888
}

wcfsetup/install/files/lib/system/condition/type/user/UserRegistrationDaysConditionType.class.php

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,18 @@
99
use wcf\system\condition\type\IDatabaseObjectListConditionType;
1010
use wcf\system\condition\type\IObjectConditionType;
1111
use wcf\system\form\builder\field\IntegerConditionFormField;
12+
use wcf\util\DateUtil;
1213

1314
/**
1415
* @author Olaf Braun
1516
* @copyright 2001-2025 WoltLab GmbH
1617
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1718
* @since 6.3
1819
*
19-
* @implements IDatabaseObjectListConditionType<UserList<User>>
20-
* @implements IObjectConditionType<User>
21-
* @extends AbstractConditionType<string>
20+
* @phpstan-type Filter = array{condition: string, value: int}
21+
* @implements IDatabaseObjectListConditionType<UserList<User>, Filter>
22+
* @implements IObjectConditionType<User, Filter>
23+
* @extends AbstractConditionType<Filter>
2224
*/
2325
final class UserRegistrationDaysConditionType extends AbstractConditionType implements IDatabaseObjectListConditionType, IObjectConditionType
2426
{
@@ -45,24 +47,24 @@ public function getLabel(): string
4547
#[\Override]
4648
public function applyFilter(DatabaseObjectList $objectList): void
4749
{
48-
["condition" => $condition, "value" => $days] = @\unserialize($this->filter);
50+
["condition" => $condition, "timestamp" => $timestamp] = $this->getParsedFilter();
4951

5052
$objectList->getConditionBuilder()->add(
5153
"{$objectList->getDatabaseTableAlias()}.registrationDate {$condition} ?",
52-
[TIME_NOW - $days * 86_400]
54+
[$timestamp]
5355
);
5456
}
5557

5658
#[\Override]
5759
public function match(object $object): bool
5860
{
59-
["condition" => $condition, "value" => $days] = @\unserialize($this->filter);
61+
["condition" => $condition, "timestamp" => $timestamp] = $this->getParsedFilter();
6062

6163
return match ($condition) {
62-
'>' => $object->registrationDate < TIME_NOW - $days * 86_400,
63-
'<' => $object->registrationDate > TIME_NOW - $days * 86_400,
64-
'>=' => $object->registrationDate <= TIME_NOW - $days * 86_400,
65-
'<=' => $object->registrationDate >= TIME_NOW - $days * 86_400,
64+
'>' => $object->registrationDate < $timestamp,
65+
'<' => $object->registrationDate > $timestamp,
66+
'>=' => $object->registrationDate <= $timestamp,
67+
'<=' => $object->registrationDate >= $timestamp,
6668
default => throw new \InvalidArgumentException("Unknown condition: {$condition}"),
6769
};
6870
}
@@ -72,14 +74,17 @@ public function match(object $object): bool
7274
*/
7375
private function getParsedFilter(): array
7476
{
75-
$filter = @\unserialize($this->filter);
76-
if (!\is_array($filter) || !isset($filter['condition'], $filter['value'])) {
77+
if (!isset($this->filter['condition'], $this->filter['value'])) {
7778
throw new \InvalidArgumentException("Invalid filter format");
7879
}
7980

81+
$date = DateUtil::getDateTimeByTimestamp(TIME_NOW);
82+
$date->setTimezone(new \DateTimeZone(TIMEZONE));
83+
$date->sub(new \DateInterval("P{$this->filter['condition']}D"));
84+
8085
return [
81-
'condition' => $filter['condition'],
82-
'timestamp' => TIME_NOW - ($filter['value'] * 86_400),
86+
'condition' => $this->filter['condition'],
87+
'timestamp' => $date->getTimestamp(),
8388
];
8489
}
8590

wcfsetup/install/files/lib/system/condition/type/user/UserUsernameConditionType.class.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1717
* @since 6.3
1818
*
19-
* @implements IDatabaseObjectListConditionType<UserList<User>>
20-
* @implements IObjectConditionType<User>
21-
* @extends AbstractConditionType<string>
19+
* @phpstan-type Filter = array{condition: string, value: string}
20+
* @implements IDatabaseObjectListConditionType<UserList<User>, Filter>
21+
* @implements IObjectConditionType<User, Filter>
22+
* @extends AbstractConditionType<Filter>
2223
*/
2324
final class UserUsernameConditionType extends AbstractConditionType implements IDatabaseObjectListConditionType, IObjectConditionType
2425
{
@@ -44,7 +45,7 @@ public function getLabel(): string
4445
#[\Override]
4546
public function applyFilter(DatabaseObjectList $objectList): void
4647
{
47-
["condition" => $condition, "value" => $value] = @\unserialize($this->filter);
48+
["condition" => $condition, "value" => $value] = $this->filter;
4849
$filter = match ($condition) {
4950
"%_" => $value . '%',
5051
"%_%" => '%' . $value . '%',
@@ -61,7 +62,7 @@ public function applyFilter(DatabaseObjectList $objectList): void
6162
#[\Override]
6263
public function match(object $object): bool
6364
{
64-
["condition" => $condition, "value" => $value] = @\unserialize($this->filter);
65+
["condition" => $condition, "value" => $value] = $this->filter;
6566

6667
return match ($condition) {
6768
"%_" => \str_starts_with($object->username, $value),

0 commit comments

Comments
 (0)