Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
81.82% covered (warning)
81.82%
18 / 22
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
TierManager
81.82% covered (warning)
81.82%
18 / 22
66.67% covered (warning)
66.67%
2 / 3
8.38
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 getClientTierConfig
69.23% covered (warning)
69.23%
9 / 13
0.00% covered (danger)
0.00%
0 / 1
5.73
 getDefaultTierName
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace MediaWiki\Extension\OAuthRateLimiter;
4
5use MediaWiki\Config\ServiceOptions;
6use Psr\Log\LoggerInterface;
7
8class TierManager {
9
10    public const CONSTRUCTOR_OPTIONS = [
11        'OAuthRateLimiterDefaultClientTier',
12        'OAuthRateLimiterTierConfig'
13    ];
14
15    /**
16     * @var ServiceOptions
17     */
18    private $serviceOptions;
19
20    /**
21     * @var LoggerInterface
22     */
23    private $logger;
24
25    /**
26     * @var ClientTierStore
27     */
28    private $clientTierStore;
29
30    /**
31     * @param ServiceOptions $serviceOptions
32     * @param LoggerInterface $logger
33     * @param ClientTierStore $clientTierStore
34     */
35    public function __construct(
36        ServiceOptions $serviceOptions,
37        LoggerInterface $logger,
38        ClientTierStore $clientTierStore
39    ) {
40        $serviceOptions->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS );
41        $this->serviceOptions = $serviceOptions;
42        $this->logger = $logger;
43        $this->clientTierStore = $clientTierStore;
44    }
45
46    /**
47     * @param string $clientID
48     * @return array
49     */
50    public function getClientTierConfig( string $clientID ): array {
51        $tierName = $this->clientTierStore->getClientTierName( $clientID );
52        $tierConfig = $this->serviceOptions->get( 'OAuthRateLimiterTierConfig' );
53
54        if ( $tierName !== null && array_key_exists( $tierName, $tierConfig ) ) {
55            return $tierConfig[$tierName];
56        }
57
58        $defaultTierName = $this->getDefaultTierName();
59        if ( $defaultTierName === null ) {
60            return [];
61        }
62        if ( array_key_exists( $defaultTierName, $tierConfig ) ) {
63            return $tierConfig[$defaultTierName];
64        }
65
66        $this->logger->error(
67            "wgOAuthRateLimiterTierConfig does not contain $tierName"
68        );
69        return [];
70    }
71
72    /**
73     * @return int|string|null
74     */
75    public function getDefaultTierName() {
76        $defaultClientTier = $this->serviceOptions->get( 'OAuthRateLimiterDefaultClientTier' );
77
78        if ( $defaultClientTier ) {
79            return $defaultClientTier;
80        }
81
82        $this->logger->error( 'wgOAuthRateLimiterDefaultClientTier is empty or not properly set' );
83        return null;
84    }
85}