aboutsummaryrefslogtreecommitdiff
path: root/app/controllers/new_password.php
blob: 956bc5cd6d647a50991ea4e2a60c371c65c96c5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php

/**
 * [NewPassword description]
 */

class NewPasswordController extends StudipController
{
    protected $with_session = true;  //we do need to have a session for this controller
    protected $allow_nobody = true;  //nobody is allowed

    public function before_filter(&$action, &$args)
    {
        parent::before_filter($action, $args);

        if (!in_array('Standard', $GLOBALS['STUDIP_AUTH_PLUGIN'])) {
            PageLayout::postError(_("Das Anfordern eines neuen Passwortes durch den Benutzer ist in dieser Stud.IP-Installation nicht möglich."));
            $this->redirect('start');
            return;
        }

        if ($GLOBALS['auth'] && $GLOBALS['auth']->auth["uid"] != "nobody") {
            PageLayout::postError(_("Sie können kein neues Passwort anfordern, wenn Sie bereits eingeloggt sind."));
            $this->redirect('start');
            return;
        }

        $this->set_layout($GLOBALS['template_factory']->open('layouts/base'));
        PageLayout::setTitle('Passwort zurücksetzen');
        PageLayout::setHelpKeyword('Basis.AnmeldungPasswortAnfrage');
    }

    public function index_action()
    {

    }

    public function send_mail_action()
    {
        CSRFProtection::verifyUnsafeRequest();

        $users = User::findByEmail(Request::get('mail'));

        if (count($users) === 1) {
            $user = $users[0];
        } else if (count($users) > 1) {
            setTempLanguage($users[0]->id);

            // there are mutliple accounts with this mail addresses!
            $prefix = ltrim(Config::get()->MAIL_SUBJECT_PREFIX . ' ');
            $subject = $prefix . _('Passwortänderung angefordert');

            $mailbody = sprintf(
                _("Dies ist eine Informationsmail des Stud.IP-Systems\n"
                    ."(Studienbegleitender Internetsupport von Präsenzlehre)\n- %s -\n\n"
                    . "Für die Mail-Adresse %s wurde ein Link angefordert\n"
                    . "um das Passwort zurückzusetzen.\n"
                    . "Dieser Mail-Adresse sind jedoch mehrere Zugänge zugeordnet,\n"
                    . "deshalb ist es nicht möglich, das Passwort hierüber zurückzusetzen.\n"
                    . "Wenden sie sich bitte stattdessen an\n%s"
                ),
                Config::get()->UNI_NAME_CLEAN,
                $users[0]->email,
                $GLOBALS['UNI_CONTACT']
            );

            StudipMail::sendMessage($users[0]->email, $subject, $mailbody);

            restoreLanguage();
        }

        if (isset($user)) {
            // spam/abuse-protection
            // if there are more than 5 tokens present, do NOT send another mail

            $present_tokens = sizeof(Token::findByUser_id($user->user_id));

            if ($present_tokens < 5) {
                UserManagement::sendPasswordMail($user);
            }
        }

        PageLayout::postSuccess(_('Sofern die von ihnen eingegebene Mail-Adresse korrekt ist, erhalten sie in Kürze eine Mail '
            . 'mit Anweisungen, wie sie ihr Passwort neu setzen können. Sehen sie auch in ihrem Spam-Ordern nach.'));
    }

    public function set_action($token_id)
    {

        $token = Token::findOneById($token_id);

        if ($token && !$token->isExpired()) {
            $user_id = $token->user_id;
        } else {
            PageLayout::postError('Der Link ist abgelaufen oder wurde bereits verwendet. Fordern sie eine neue Mail an!');
            $this->redirect('new_password');
            return;
        }

        $this->token_id = $token_id;
        $requesting_user = User::find($user_id);

        if ($requesting_user && Request::get('new_password')) {
            CSRFProtection::verifyUnsafeRequest();

            $validator = new email_validation_class();
            $user_management = new UserManagement($requesting_user['user_id']);

            $password = Request::get('new_password');
            $confirm  = Request::get('new_password_confirm');

            $errors = [];
            if (!$validator->ValidatePassword($password)) {
                $errors[] = _('Das Passwort ist zu kurz. Es sollte mindestens 8 Zeichen lang sein.');
            } else if ($password !== $confirm) {
                $errors[] = _('Die Wiederholung Ihres Passworts stimmt nicht mit Ihrer Eingabe überein.');
            } else if ($password == $requesting_user->username) {
                $errors[] = _('Das Passwort darf nicht mit dem Nutzernamen übereinstimmen.');
            } else if (str_replace(['.', ' '], '', mb_strtolower($password)) == 'studip') {
                $errors[] = _('Aus Sicherheitsgründen darf das Passwort nicht "Stud.IP" oder eine Abwandlung davon sein.');
            }

            if (count($errors) > 0) {
                foreach ($errors as $error) {
                    PageLayout::postError($error);
                }
            } else {
                // TODO: remove token, it's now used
                $pw_changed = $user_management->changePassword($password);
                if ($pw_changed) {
                    PageLayout::postSuccess(_("Das Passwort wurde erfolgreich geändert. Sie können sich nun mit dem neuen Passwort einloggen."));
                    StudipLog::USER_NEWPWD($requesting_user['user_id'], null, 'Passwort neu gesetzt', null, $requesting_user['user_id']);

                    // delete used token and for security reasons all other tokens for this user as well
                    foreach (Token::findByUser_id($user_id) as $t) {
                        $t->delete();
                    }

                    $this->redirect('start');
                } else {
                    PageLayout::postError(_('Das Passwort konnte nicht gesetzt werden. Bitte wiederholen Sie den Vorgang.'));
                }
            }
        }
    }
}