Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 57
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiResetPassword
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 9
462
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 hasAnyRoutes
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 getExtendedDescription
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 execute
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
20
 isWriteMode
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 needsToken
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
20
 getExamplesMessages
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
 getHelpUrls
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Copyright © 2016 Wikimedia Foundation and contributors
4 *
5 * @license GPL-2.0-or-later
6 * @file
7 */
8
9namespace MediaWiki\Api;
10
11use MediaWiki\MainConfigNames;
12use MediaWiki\ParamValidator\TypeDef\UserDef;
13use MediaWiki\Status\Status;
14use MediaWiki\User\PasswordReset;
15use Wikimedia\ParamValidator\ParamValidator;
16
17/**
18 * Reset password, with AuthManager
19 *
20 * @ingroup API
21 */
22class ApiResetPassword extends ApiBase {
23
24    private PasswordReset $passwordReset;
25
26    public function __construct(
27        ApiMain $main,
28        string $action,
29        PasswordReset $passwordReset
30    ) {
31        parent::__construct( $main, $action );
32
33        $this->passwordReset = $passwordReset;
34    }
35
36    /** @var bool */
37    private $hasAnyRoutes = null;
38
39    /**
40     * Determine whether any reset routes are available.
41     * @return bool
42     */
43    private function hasAnyRoutes() {
44        if ( $this->hasAnyRoutes === null ) {
45            $resetRoutes = $this->getConfig()->get( MainConfigNames::PasswordResetRoutes );
46            $this->hasAnyRoutes = !empty( $resetRoutes['username'] ) || !empty( $resetRoutes['email'] );
47        }
48        return $this->hasAnyRoutes;
49    }
50
51    /** @inheritDoc */
52    protected function getExtendedDescription() {
53        if ( !$this->hasAnyRoutes() ) {
54            return 'apihelp-resetpassword-extended-description-noroutes';
55        }
56        return parent::getExtendedDescription();
57    }
58
59    /** @inheritDoc */
60    public function execute() {
61        if ( !$this->hasAnyRoutes() ) {
62            $this->dieWithError( 'apihelp-resetpassword-description-noroutes', 'moduledisabled' );
63        }
64
65        $params = $this->extractRequestParams() + [
66            // Make sure the keys exist even if getAllowedParams didn't define them
67            'user' => null,
68            'email' => null,
69        ];
70
71        $status = $this->passwordReset->isAllowed( $this->getUser() );
72        if ( !$status->isOK() ) {
73            $this->dieStatus( Status::wrap( $status ) );
74        }
75
76        $status = $this->passwordReset->execute(
77            $this->getUser(), $params['user'], $params['email']
78        );
79        if ( !$status->isOK() ) {
80            $status->value = null;
81            $this->dieStatus( Status::wrap( $status ) );
82        }
83
84        $result = $this->getResult();
85        $result->addValue( [ 'resetpassword' ], 'status', 'success' );
86    }
87
88    /** @inheritDoc */
89    public function isWriteMode() {
90        return $this->hasAnyRoutes();
91    }
92
93    /** @inheritDoc */
94    public function needsToken() {
95        if ( !$this->hasAnyRoutes() ) {
96            return false;
97        }
98        return 'csrf';
99    }
100
101    /** @inheritDoc */
102    public function getAllowedParams() {
103        if ( !$this->hasAnyRoutes() ) {
104            return [];
105        }
106
107        $ret = [
108            'user' => [
109                ParamValidator::PARAM_TYPE => 'user',
110                UserDef::PARAM_ALLOWED_USER_TYPES => [ 'name' ],
111            ],
112            'email' => [
113                ParamValidator::PARAM_TYPE => 'string',
114            ],
115        ];
116
117        $resetRoutes = $this->getConfig()->get( MainConfigNames::PasswordResetRoutes );
118        if ( empty( $resetRoutes['username'] ) ) {
119            unset( $ret['user'] );
120        }
121        if ( empty( $resetRoutes['email'] ) ) {
122            unset( $ret['email'] );
123        }
124
125        return $ret;
126    }
127
128    /** @inheritDoc */
129    protected function getExamplesMessages() {
130        $ret = [];
131        $resetRoutes = $this->getConfig()->get( MainConfigNames::PasswordResetRoutes );
132
133        if ( !empty( $resetRoutes['username'] ) ) {
134            $ret['action=resetpassword&user=Example&token=123ABC'] = 'apihelp-resetpassword-example-user';
135        }
136        if ( !empty( $resetRoutes['email'] ) ) {
137            $ret['action=resetpassword&user=user@example.com&token=123ABC'] =
138                'apihelp-resetpassword-example-email';
139        }
140
141        return $ret;
142    }
143
144    /** @inheritDoc */
145    public function getHelpUrls() {
146        return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data';
147    }
148}
149
150/** @deprecated class alias since 1.43 */
151class_alias( ApiResetPassword::class, 'ApiResetPassword' );