xref: /dokuwiki/inc/Ui/UserProfile.php (revision 455aa67e850e236be8cd442e32eec2b8fff15fb2)
1877c5a1bSSatoshi Sahara<?php
2877c5a1bSSatoshi Sahara
3877c5a1bSSatoshi Saharanamespace dokuwiki\Ui;
4877c5a1bSSatoshi Sahara
579a2d784SGerrit Uitslaguse dokuwiki\Extension\AuthPlugin;
6877c5a1bSSatoshi Saharause dokuwiki\Form\Form;
7*455aa67eSAndreas Gohruse dokuwiki\JWT;
8877c5a1bSSatoshi Sahara
9877c5a1bSSatoshi Sahara/**
10f9dfcbbeSSatoshi Sahara * DokuWiki User Profile Interface
11877c5a1bSSatoshi Sahara *
12877c5a1bSSatoshi Sahara * @package dokuwiki\Ui
13877c5a1bSSatoshi Sahara */
14877c5a1bSSatoshi Saharaclass UserProfile extends Ui
15877c5a1bSSatoshi Sahara{
16877c5a1bSSatoshi Sahara    /**
17877c5a1bSSatoshi Sahara     * Display the User Profile Form Panel
18877c5a1bSSatoshi Sahara     *
19e2d055f5SAndreas Gohr     * @return void
20877c5a1bSSatoshi Sahara     * @author   Andreas Gohr <andi@splitbrain.org>
21877c5a1bSSatoshi Sahara     *
22877c5a1bSSatoshi Sahara     */
23877c5a1bSSatoshi Sahara    public function show()
24877c5a1bSSatoshi Sahara    {
25877c5a1bSSatoshi Sahara        /** @var AuthPlugin $auth */
26877c5a1bSSatoshi Sahara        global $auth;
27*455aa67eSAndreas Gohr        global $INFO;
28*455aa67eSAndreas Gohr        global $INPUT;
29877c5a1bSSatoshi Sahara
30*455aa67eSAndreas Gohr        $userinfo = [
31*455aa67eSAndreas Gohr            'user' => $_SERVER['REMOTE_USER'],
32*455aa67eSAndreas Gohr            'name' => $INPUT->post->str('fullname', $INFO['userinfo']['name'], true),
33*455aa67eSAndreas Gohr            'mail' => $INPUT->post->str('email', $INFO['userinfo']['mail'], true),
34*455aa67eSAndreas Gohr
35*455aa67eSAndreas Gohr        ];
36*455aa67eSAndreas Gohr
3726dfc232SAndreas Gohr        echo p_locale_xhtml('updateprofile');
3826dfc232SAndreas Gohr        echo '<div class="centeralign">';
39877c5a1bSSatoshi Sahara
40*455aa67eSAndreas Gohr        echo $this->updateProfileForm($userinfo)->toHTML('UpdateProfile');
41*455aa67eSAndreas Gohr        echo $this->tokenForm($userinfo['user'])->toHTML();
42*455aa67eSAndreas Gohr        if ($auth->canDo('delUser') && actionOK('profile_delete')) {
43*455aa67eSAndreas Gohr            $this->deleteProfileForm()->toHTML('ProfileDelete');
44*455aa67eSAndreas Gohr        }
45877c5a1bSSatoshi Sahara
46*455aa67eSAndreas Gohr        echo '</div>';
47*455aa67eSAndreas Gohr    }
48*455aa67eSAndreas Gohr
49*455aa67eSAndreas Gohr    /**
50*455aa67eSAndreas Gohr     * Add the password confirmation field to the form if configured
51*455aa67eSAndreas Gohr     *
52*455aa67eSAndreas Gohr     * @param Form $form
53*455aa67eSAndreas Gohr     * @return void
54*455aa67eSAndreas Gohr     */
55*455aa67eSAndreas Gohr    protected function addPasswordConfirmation(Form $form)
56*455aa67eSAndreas Gohr    {
57*455aa67eSAndreas Gohr        global $lang;
58*455aa67eSAndreas Gohr        global $conf;
59*455aa67eSAndreas Gohr
60*455aa67eSAndreas Gohr        if (!$conf['profileconfirm']) return;
61*455aa67eSAndreas Gohr        $form->addHTML("<br>\n");
62*455aa67eSAndreas Gohr        $attr = ['size' => '50', 'required' => 'required'];
63*455aa67eSAndreas Gohr        $input = $form->addPasswordInput('oldpass', $lang['oldpass'])->attrs($attr)
64*455aa67eSAndreas Gohr            ->addClass('edit');
65*455aa67eSAndreas Gohr        $input->getLabel()->attr('class', 'block');
66*455aa67eSAndreas Gohr        $form->addHTML("<br>\n");
67*455aa67eSAndreas Gohr    }
68*455aa67eSAndreas Gohr
69*455aa67eSAndreas Gohr    /**
70*455aa67eSAndreas Gohr     * Create the profile form
71*455aa67eSAndreas Gohr     *
72*455aa67eSAndreas Gohr     * @return Form
73*455aa67eSAndreas Gohr     */
74*455aa67eSAndreas Gohr    protected function updateProfileForm($userinfo)
75*455aa67eSAndreas Gohr    {
76*455aa67eSAndreas Gohr        global $lang;
77*455aa67eSAndreas Gohr        /** @var AuthPlugin $auth */
78*455aa67eSAndreas Gohr        global $auth;
79*455aa67eSAndreas Gohr
80877c5a1bSSatoshi Sahara        $form = new Form(['id' => 'dw__register']);
81877c5a1bSSatoshi Sahara        $form->addTagOpen('div')->addClass('no');
82877c5a1bSSatoshi Sahara        $form->addFieldsetOpen($lang['profile']);
83877c5a1bSSatoshi Sahara        $form->setHiddenField('do', 'profile');
84877c5a1bSSatoshi Sahara        $form->setHiddenField('save', '1');
85877c5a1bSSatoshi Sahara
86e2d055f5SAndreas Gohr        $attr = ['size' => '50', 'disabled' => 'disabled'];
87*455aa67eSAndreas Gohr        $input = $form->addTextInput('login', $lang['user'])
88*455aa67eSAndreas Gohr            ->attrs($attr)
89*455aa67eSAndreas Gohr            ->addClass('edit')
90*455aa67eSAndreas Gohr            ->val($userinfo['user']);
91877c5a1bSSatoshi Sahara        $input->getLabel()->attr('class', 'block');
92877c5a1bSSatoshi Sahara        $form->addHTML("<br>\n");
93877c5a1bSSatoshi Sahara
94e2d055f5SAndreas Gohr        $attr = ['size' => '50'];
95877c5a1bSSatoshi Sahara        if (!$auth->canDo('modName')) $attr['disabled'] = 'disabled';
96*455aa67eSAndreas Gohr        $input = $form->addTextInput('fullname', $lang['fullname'])
97*455aa67eSAndreas Gohr            ->attrs($attr)
98*455aa67eSAndreas Gohr            ->addClass('edit')
99*455aa67eSAndreas Gohr            ->val($userinfo['name']);
100877c5a1bSSatoshi Sahara        $input->getLabel()->attr('class', 'block');
101877c5a1bSSatoshi Sahara        $form->addHTML("<br>\n");
102877c5a1bSSatoshi Sahara
103e2d055f5SAndreas Gohr        $attr = ['type' => 'email', 'size' => '50'];
104877c5a1bSSatoshi Sahara        if (!$auth->canDo('modMail')) $attr['disabled'] = 'disabled';
105*455aa67eSAndreas Gohr        $input = $form->addTextInput('email', $lang['email'])
106*455aa67eSAndreas Gohr            ->attrs($attr)
107*455aa67eSAndreas Gohr            ->addClass('edit')
108*455aa67eSAndreas Gohr            ->val($userinfo['mail']);
109877c5a1bSSatoshi Sahara        $input->getLabel()->attr('class', 'block');
110877c5a1bSSatoshi Sahara        $form->addHTML("<br>\n");
111877c5a1bSSatoshi Sahara
112877c5a1bSSatoshi Sahara        if ($auth->canDo('modPass')) {
113e2d055f5SAndreas Gohr            $attr = ['size' => '50'];
114877c5a1bSSatoshi Sahara            $input = $form->addPasswordInput('newpass', $lang['newpass'])->attrs($attr)->addClass('edit');
115877c5a1bSSatoshi Sahara            $input->getLabel()->attr('class', 'block');
116877c5a1bSSatoshi Sahara            $form->addHTML("<br>\n");
117877c5a1bSSatoshi Sahara
118877c5a1bSSatoshi Sahara            $input = $form->addPasswordInput('passchk', $lang['passchk'])->attrs($attr)->addClass('edit');
119877c5a1bSSatoshi Sahara            $input->getLabel()->attr('class', 'block');
120877c5a1bSSatoshi Sahara            $form->addHTML("<br>\n");
121877c5a1bSSatoshi Sahara        }
122877c5a1bSSatoshi Sahara
123*455aa67eSAndreas Gohr        $this->addPasswordConfirmation($form);
124877c5a1bSSatoshi Sahara
125877c5a1bSSatoshi Sahara        $form->addButton('', $lang['btn_save'])->attr('type', 'submit');
126877c5a1bSSatoshi Sahara        $form->addButton('', $lang['btn_reset'])->attr('type', 'reset');
127877c5a1bSSatoshi Sahara
128877c5a1bSSatoshi Sahara        $form->addFieldsetClose();
129877c5a1bSSatoshi Sahara        $form->addTagClose('div');
130877c5a1bSSatoshi Sahara
131*455aa67eSAndreas Gohr        return $form;
132*455aa67eSAndreas Gohr    }
133877c5a1bSSatoshi Sahara
134*455aa67eSAndreas Gohr    /**
135*455aa67eSAndreas Gohr     * Create the profile delete form
136*455aa67eSAndreas Gohr     *
137*455aa67eSAndreas Gohr     * @return Form
138*455aa67eSAndreas Gohr     */
139*455aa67eSAndreas Gohr    protected function deleteProfileForm()
140*455aa67eSAndreas Gohr    {
141*455aa67eSAndreas Gohr        global $lang;
142877c5a1bSSatoshi Sahara
143877c5a1bSSatoshi Sahara        $form = new Form(['id' => 'dw__profiledelete']);
144877c5a1bSSatoshi Sahara        $form->addTagOpen('div')->addClass('no');
145877c5a1bSSatoshi Sahara        $form->addFieldsetOpen($lang['profdeleteuser']);
146877c5a1bSSatoshi Sahara        $form->setHiddenField('do', 'profile_delete');
147877c5a1bSSatoshi Sahara        $form->setHiddenField('delete', '1');
148877c5a1bSSatoshi Sahara
149877c5a1bSSatoshi Sahara        $form->addCheckbox('confirm_delete', $lang['profconfdelete'])
150877c5a1bSSatoshi Sahara            ->attrs(['required' => 'required'])
151877c5a1bSSatoshi Sahara            ->id('dw__confirmdelete')
152877c5a1bSSatoshi Sahara            ->val('1');
153877c5a1bSSatoshi Sahara
154*455aa67eSAndreas Gohr        $this->addPasswordConfirmation($form);
155877c5a1bSSatoshi Sahara
156877c5a1bSSatoshi Sahara        $form->addButton('', $lang['btn_deleteuser'])->attr('type', 'submit');
157877c5a1bSSatoshi Sahara        $form->addFieldsetClose();
158877c5a1bSSatoshi Sahara        $form->addTagClose('div');
159*455aa67eSAndreas Gohr        return $form;
160877c5a1bSSatoshi Sahara    }
161877c5a1bSSatoshi Sahara
162*455aa67eSAndreas Gohr    /**
163*455aa67eSAndreas Gohr     * Get the authentication token form
164*455aa67eSAndreas Gohr     *
165*455aa67eSAndreas Gohr     * @param string $user
166*455aa67eSAndreas Gohr     * @return Form
167*455aa67eSAndreas Gohr     */
168*455aa67eSAndreas Gohr    protected function tokenForm($user)
169*455aa67eSAndreas Gohr    {
170*455aa67eSAndreas Gohr        global $lang;
171*455aa67eSAndreas Gohr
172*455aa67eSAndreas Gohr        $token = JWT::fromUser($user);
173*455aa67eSAndreas Gohr
174*455aa67eSAndreas Gohr        $form = new Form(['id' => 'dw__profiletoken', 'action' => wl(), 'method' => 'POST']);
175*455aa67eSAndreas Gohr        $form->setHiddenField('do', 'authtoken');
176*455aa67eSAndreas Gohr        $form->setHiddenField('id', 'ID');
177*455aa67eSAndreas Gohr        $form->addFieldsetOpen($lang['proftokenlegend']);
178*455aa67eSAndreas Gohr        $form->addHTML('<p>' . $lang['proftokeninfo'] . '</p>');
179*455aa67eSAndreas Gohr        $form->addHTML('<p><code style="display: block; word-break: break-word">' . $token->getToken() . '</code></p>');
180*455aa67eSAndreas Gohr        $form->addButton('regen', $lang['proftokengenerate']);
181*455aa67eSAndreas Gohr        $form->addFieldsetClose();
182*455aa67eSAndreas Gohr
183*455aa67eSAndreas Gohr        return $form;
184877c5a1bSSatoshi Sahara    }
185877c5a1bSSatoshi Sahara}
186