1<?php
2
3use dokuwiki\Form\Form;
4use dokuwiki\plugin\twofactor\OtpField;
5use dokuwiki\plugin\twofactor\Provider;
6
7/**
8 * Twofactor Provider that sends codes by email
9 */
10class action_plugin_twofactoremail extends Provider
11{
12
13    /** @inheritdoc */
14    public function getLabel()
15    {
16        global $USERINFO;
17        return $this->getLang('name') . ' ' . $USERINFO['mail'];
18    }
19
20    /** @inheritdoc */
21    public function isConfigured()
22    {
23        return $this->settings->get('verified');
24    }
25
26    /** @inheritdoc */
27    public function renderProfileForm(Form $form)
28    {
29        $form->addHTML('<p>' . $this->getLang('verifynotice') . '</p>');
30        $form->addElement(new OtpField('verify'));
31        return $form;
32    }
33
34    /** @inheritdoc */
35    public function handleProfileForm()
36    {
37        global $INPUT;
38
39        if($INPUT->bool('init')) {
40            $this->initSecret();
41            $code = $this->generateCode();
42            $this->transmitMessage($code);
43        }
44
45        if ($INPUT->has('verify')) {
46            if ($this->checkCode($INPUT->str('verify'))) {
47                $this->settings->set('verified', true);
48            } else {
49                // send a new code
50                $code = $this->generateCode();
51                $this->transmitMessage($code);
52            }
53        }
54    }
55
56    /** @inheritdoc */
57    public function transmitMessage($code)
58    {
59        $userinfo = $this->getUserData();
60        $to = $userinfo['mail'] ?? '';
61        if (!$to) throw new \Exception($this->getLang('codesentfail'));
62
63        // Create the email object.
64        $body = io_readFile($this->localFN('mail'));
65        $mail = new Mailer();
66        $mail->to($to);
67        $mail->subject($this->getLang('subject'));
68        $mail->setBody($body, ['CODE' => $code]);
69        $result = $mail->send();
70        if (!$result) throw new \Exception($this->getLang('codesentfail'));
71
72        return $this->getLang('codesent');
73    }
74
75}
76