Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 46
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiRemoveAuthenticationData
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 7
210
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
 execute
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
42
 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 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 getExamplesMessages
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 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\Auth\AuthenticationRequest;
12use MediaWiki\Auth\AuthManager;
13use MediaWiki\MainConfigNames;
14
15/**
16 * Remove authentication data from AuthManager
17 *
18 * @ingroup API
19 */
20class ApiRemoveAuthenticationData extends ApiBase {
21
22    /** @var string */
23    private $authAction;
24    /** @var string */
25    private $operation;
26
27    private AuthManager $authManager;
28
29    public function __construct(
30        ApiMain $main,
31        string $action,
32        AuthManager $authManager
33    ) {
34        parent::__construct( $main, $action );
35
36        $this->authAction = $action === 'unlinkaccount'
37            ? AuthManager::ACTION_UNLINK
38            : AuthManager::ACTION_REMOVE;
39        $this->operation = $action === 'unlinkaccount'
40            ? 'UnlinkAccount'
41            : 'RemoveCredentials';
42
43        $this->authManager = $authManager;
44    }
45
46    public function execute() {
47        if ( !$this->getUser()->isNamed() ) {
48            $this->dieWithError( 'apierror-mustbeloggedin-removeauth', 'notloggedin' );
49        }
50
51        $params = $this->extractRequestParams();
52
53        // Check security-sensitive operation status
54        ApiAuthManagerHelper::newForModule( $this, $this->authManager )
55            ->securitySensitiveOperation( $this->operation );
56
57        // Fetch the request. No need to load from the request, so don't use
58        // ApiAuthManagerHelper's method.
59        $remove = $this->authAction === AuthManager::ACTION_REMOVE
60            ? array_fill_keys( $this->getConfig()->get(
61                MainConfigNames::RemoveCredentialsBlacklist ), true )
62            : [];
63        $reqs = array_filter(
64            $this->authManager->getAuthenticationRequests( $this->authAction, $this->getUser() ),
65            static function ( AuthenticationRequest $req ) use ( $params, $remove ) {
66                return $req->getUniqueId() === $params['request'] &&
67                    !isset( $remove[get_class( $req )] );
68            }
69        );
70        if ( count( $reqs ) !== 1 ) {
71            $this->dieWithError( 'apierror-changeauth-norequest', 'badrequest' );
72        }
73        $req = reset( $reqs );
74
75        // Perform the removal
76        $status = $this->authManager->allowsAuthenticationDataChange( $req, true );
77        $this->getHookRunner()->onChangeAuthenticationDataAudit( $req, $status );
78        if ( !$status->isGood() ) {
79            $this->dieStatus( $status );
80        }
81        $this->authManager->changeAuthenticationData( $req );
82
83        $this->getResult()->addValue( null, $this->getModuleName(), [ 'status' => 'success' ] );
84    }
85
86    /** @inheritDoc */
87    public function isWriteMode() {
88        return true;
89    }
90
91    /** @inheritDoc */
92    public function needsToken() {
93        return 'csrf';
94    }
95
96    /** @inheritDoc */
97    public function getAllowedParams() {
98        return ApiAuthManagerHelper::getStandardParams( $this->authAction,
99            'request'
100        );
101    }
102
103    /** @inheritDoc */
104    protected function getExamplesMessages() {
105        $path = $this->getModulePath();
106        $action = $this->getModuleName();
107        return [
108            "action={$action}&request=FooAuthenticationRequest&token=123ABC"
109                => "apihelp-{$path}-example-simple",
110        ];
111    }
112
113    /** @inheritDoc */
114    public function getHelpUrls() {
115        return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data';
116    }
117}
118
119/** @deprecated class alias since 1.43 */
120class_alias( ApiRemoveAuthenticationData::class, 'ApiRemoveAuthenticationData' );