Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
87.50% covered (warning)
87.50%
14 / 16
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
ChangeTagValidator
87.50% covered (warning)
87.50%
14 / 16
50.00% covered (danger)
50.00%
1 / 2
7.10
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 validateTag
86.67% covered (warning)
86.67%
13 / 15
0.00% covered (danger)
0.00%
0 / 1
6.09
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter\ChangeTags;
4
5use MediaWiki\ChangeTags\ChangeTags;
6use MediaWiki\Extension\AbuseFilter\ServiceNames;
7use MediaWiki\Status\Status;
8
9/**
10 * Service for testing whether filters can tag edits and other changes
11 * with a specific tag
12 * @todo Use DI when available in core (T245964)
13 */
14class ChangeTagValidator {
15
16    public const SERVICE_NAME = ServiceNames::ChangeTagValidator;
17
18    public function __construct( private readonly ChangeTagsManager $changeTagsManager ) {
19    }
20
21    /**
22     * Check whether a filter is allowed to use a tag
23     *
24     * @param string $tag Tag name
25     * @return Status
26     */
27    public function validateTag( string $tag ): Status {
28        $tagNameStatus = ChangeTags::isTagNameValid( $tag );
29
30        if ( !$tagNameStatus->isGood() ) {
31            return $tagNameStatus;
32        }
33
34        $canAddStatus = ChangeTags::canAddTagsAccompanyingChange( [ $tag ] );
35
36        if ( $canAddStatus->isGood() ) {
37            return $canAddStatus;
38        }
39
40        if ( $tag === $this->changeTagsManager->getCondsLimitTag() ) {
41            return Status::newFatal( 'abusefilter-tag-reserved' );
42        }
43
44        // note: these are both local and global tags
45        $alreadyDefinedTags = $this->changeTagsManager->getTagsDefinedByFilters();
46        if ( in_array( $tag, $alreadyDefinedTags, true ) ) {
47            return Status::newGood();
48        }
49
50        // note: this check is only done for the local wiki
51        // global filters could interfere with existing tags on remote wikis
52        $canCreateTagStatus = ChangeTags::canCreateTag( $tag );
53        if ( $canCreateTagStatus->isGood() ) {
54            return $canCreateTagStatus;
55        }
56
57        return Status::newFatal( 'abusefilter-edit-bad-tags' );
58    }
59}