Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 40
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
WebAuthnManageForm
0.00% covered (danger)
0.00%
0 / 40
0.00% covered (danger)
0.00%
0 / 6
56
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 getHTML
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getButtons
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 onSuccess
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onSubmit
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getDescriptors
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2declare( strict_types=1 );
3
4namespace MediaWiki\Extension\OATHAuth\HTMLForm;
5
6use MediaWiki\Context\IContextSource;
7use MediaWiki\Extension\OATHAuth\HTMLField\NoJsInfoField;
8use MediaWiki\Extension\OATHAuth\HTMLField\RegisteredKeyLayout;
9use MediaWiki\Extension\OATHAuth\Module\IModule;
10use MediaWiki\Extension\OATHAuth\Module\WebAuthn;
11use MediaWiki\Extension\OATHAuth\OATHAuthModuleRegistry;
12use MediaWiki\Extension\OATHAuth\OATHUser;
13use MediaWiki\Extension\OATHAuth\OATHUserRepository;
14use MediaWiki\SpecialPage\SpecialPage;
15use MediaWiki\Status\Status;
16use OOUI\ButtonWidget;
17
18/**
19 * @property WebAuthn $module
20 */
21class WebAuthnManageForm extends OATHAuthOOUIHTMLForm {
22
23    /** @inheritDoc */
24    public function __construct(
25        OATHUser $oathUser,
26        OATHUserRepository $oathRepo,
27        IModule $module,
28        IContextSource $context,
29        OATHAuthModuleRegistry $moduleRegistry
30    ) {
31        parent::__construct( $oathUser, $oathRepo, $module, $context, $moduleRegistry );
32
33        $this->setId( 'webauthn-manage-form' );
34        $this->suppressDefaultSubmit();
35
36        $this->panelPadded = false;
37        $this->panelFramed = false;
38    }
39
40    /** @inheritDoc */
41    public function getHTML( $submitResult ) {
42        $this->getOutput()->addModules( 'ext.webauthn.manage' );
43        return parent::getHTML( $submitResult );
44    }
45
46    /**
47     * @return ButtonWidget
48     */
49    public function getButtons() {
50        return new ButtonWidget( [
51            'id' => 'button_add_key',
52            'flags' => [ 'progressive', 'primary' ],
53            'disabled' => true,
54            'label' => wfMessage( 'oathauth-webauthn-ui-add-key' )->plain(),
55            'href' => SpecialPage::getTitleFor( 'OATHManage' )->getLocalURL( [
56                'module' => 'webauthn',
57                'action' => WebAuthn::ACTION_ADD_KEY
58            ] ),
59            'infusable' => true
60        ] );
61    }
62
63    public function onSuccess(): void {
64        // Not used - redirect is handled client-side after API call
65    }
66
67    public function onSubmit( array $formData ): Status|bool|array|string {
68        // This is handled client-side via API
69        return [ 'oathauth-webauthn-javascript-required' ];
70    }
71
72    protected function getDescriptors(): array {
73        $oathUser = $this->oathRepo->findByUser( $this->getUser() );
74        $keys = WebAuthn::getWebAuthnKeys( $oathUser );
75
76        $registeredKeys = [];
77        foreach ( $keys as $idx => $key ) {
78            $registeredKeys["reg_key_$idx"] = [
79                'type' => 'null',
80                'default' => [
81                    'name' => $key->getFriendlyName(),
82                    'signCount' => $key->getSignCounter()
83                ],
84                'raw' => true,
85                'class' => RegisteredKeyLayout::class,
86                'section' => 'webauthn-registered-keys-section-name'
87            ];
88        }
89
90        return [
91            'nojs' => [
92                'class' => NoJsInfoField::class,
93                'section' => 'webauthn-registered-keys-section-name',
94            ],
95        ] + $registeredKeys;
96    }
97}