Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiContentTranslationToken
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 3
72
0.00% covered (danger)
0.00%
0 / 1
 execute
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
42
 needsToken
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getExamplesMessages
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace ContentTranslation\ActionApi;
4
5use Firebase\JWT\JWT;
6use MediaWiki\Api\ApiBase;
7
8/**
9 * Module that provides JWT tokens to authenticate with cxserver.
10 *
11 * @copyright See AUTHORS.txt
12 * @license GPL-2.0-or-later
13 */
14class ApiContentTranslationToken extends ApiBase {
15    public function execute() {
16        $user = $this->getUser();
17
18        $block = $user->getBlock();
19        if ( $block && $block->isSitewide() ) {
20            $this->dieBlocked( $block );
21        }
22
23        if ( !$user->isRegistered() ) {
24            // XXX: Maybe this should use a different error code. Currently it does not
25            // matter, because most likely some other API call will fail first. CX2
26            // is also using assert=user, so this case won't be hit.
27            $this->dieWithError( 'apierror-mustbeloggedin-generic', 'token-impossible' );
28        }
29
30        // Do not fatal out if firebase/php-jwt is missing
31        if ( !class_exists( JWT::class ) ) {
32            $this->dieWithError( 'apierror-cx-jwtmissing', 'token-impossible' );
33        }
34
35        $config = $this->getConfig()->get( 'ContentTranslationCXServerAuth' );
36        $algorithm = $config['algorithm'];
37        $key = $config['key'];
38
39        if ( $key === '' ) {
40            $this->dieWithError( 'apierror-cx-keynotconfigured', 'token-impossible' );
41        }
42
43        $age = (int)$config['age'];
44        $iat = time();
45        $exp = $iat + $age;
46
47        $token = [
48            'sub' => $user->getName(),
49            'iat' => $iat,
50            'exp' => $exp,
51        ];
52
53        $jwt = JWT::encode( $token, $key, $algorithm );
54
55        $this->getResult()->addValue( null, 'jwt', $jwt );
56        // Include some additional information for the client, so it does not need to
57        // concern itself with the actual token, but just to pass it forward and to
58        // know when to fetch a new one.
59        $this->getResult()->addValue( null, 'exp', $exp );
60        $this->getResult()->addValue( null, 'age', $age );
61    }
62
63    public function needsToken() {
64        return 'csrf';
65    }
66
67    protected function getExamplesMessages() {
68        return [
69            'action=cxtoken&token=123ABC' => 'apihelp-cxtoken-example-1'
70        ];
71    }
72}