Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
ButtonAuthenticationRequest
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
4 / 4
17
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getUniqueId
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getFieldInfo
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 getRequestByName
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 __set_state
n/a
0 / 0
n/a
0 / 0
10
1<?php
2/**
3 * @license GPL-2.0-or-later
4 * @file
5 */
6
7namespace MediaWiki\Auth;
8
9use MediaWiki\Language\RawMessage;
10use MediaWiki\Message\Message;
11
12/**
13 * An authentication request that implements a single button.
14 *
15 * This can either be subclassed, or used directly. When used directly, with `$required = false`,
16 * the ButtonAuthenticationRequest will only be included in the set of requests when the button
17 * was clicked.
18 *
19 * With `$required = true`, it will always be included and `$button->{$name}` can be
20 * used to check whether it has been clicked.
21 *
22 * @stable to extend
23 * @ingroup Auth
24 * @since 1.27
25 */
26#[\AllowDynamicProperties]
27class ButtonAuthenticationRequest extends AuthenticationRequest {
28    /** @var string */
29    protected $name;
30
31    protected Message $label;
32    protected Message $help;
33
34    /**
35     * @stable to call
36     * @param string $name Button name (e.g. HTML "name" attribute)
37     * @param Message $label Button label
38     * @param Message $help Button help
39     * @param bool $required The button is required for authentication to proceed.
40     */
41    public function __construct( $name, Message $label, Message $help, $required = false ) {
42        $this->name = $name;
43        $this->label = $label;
44        $this->help = $help;
45        $this->required = $required ? self::REQUIRED : self::OPTIONAL;
46    }
47
48    /**
49     * @inheritDoc
50     * @stable to override
51     */
52    public function getUniqueId() {
53        return parent::getUniqueId() . ':' . $this->name;
54    }
55
56    /**
57     * @inheritDoc
58     * @stable to override
59     */
60    public function getFieldInfo() {
61        return [
62            $this->name => [
63                'type' => 'button',
64                'label' => $this->label,
65                'help' => $this->help,
66            ]
67        ];
68    }
69
70    /**
71     * Fetch a ButtonAuthenticationRequest or subclass by name
72     * @param AuthenticationRequest[] $reqs Requests to search
73     * @param string $name Name to look for
74     * @return ButtonAuthenticationRequest|null Returns null if there is not
75     *  exactly one matching request.
76     */
77    public static function getRequestByName( array $reqs, $name ) {
78        $requests = array_filter( $reqs, static function ( $req ) use ( $name ) {
79            return $req instanceof ButtonAuthenticationRequest && $req->name === $name;
80        } );
81        // @phan-suppress-next-line PhanTypeMismatchReturnSuperType False positive
82        return count( $requests ) === 1 ? reset( $requests ) : null;
83    }
84
85    /**
86     * @codeCoverageIgnore
87     * @stable to override
88     * @param array $data
89     * @return AuthenticationRequest|static
90     */
91    public static function __set_state( $data ) {
92        if ( !isset( $data['label'] ) ) {
93            $data['label'] = new RawMessage( '$1', $data['name'] );
94        } elseif ( is_string( $data['label'] ) ) {
95            $data['label'] = new Message( $data['label'] );
96        } elseif ( is_array( $data['label'] ) && $data['label'] ) {
97            $data['label'] = Message::newFromKey( ...$data['label'] );
98        }
99        if ( !isset( $data['help'] ) ) {
100            $data['help'] = new RawMessage( '$1', $data['name'] );
101        } elseif ( is_string( $data['help'] ) ) {
102            $data['help'] = new Message( $data['help'] );
103        } elseif ( is_array( $data['help'] ) && $data['help'] ) {
104            $data['help'] = Message::newFromKey( ...$data['help'] );
105        }
106        $ret = new static( $data['name'], $data['label'], $data['help'] );
107        foreach ( $data as $k => $v ) {
108            $ret->$k = $v;
109        }
110        return $ret;
111    }
112}