summaryrefslogtreecommitdiff
path: root/src/application/actions/register/post.php
blob: f953b8875382d1326c3f7b5c37b8ffcd149379ad (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
<?php

use mystic\forum\orm\User;
use mystic\forum\orm\UserPermissions;
use mystic\forum\utils\RequestUtils;
use mystic\forum\utils\ValidationUtils;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;

$formId = "register";
$doNotFill = $_POST["username"] ?? null;
if (!empty($doNotFill)) {
    sleep(10);
    http_response_code(204);
    exit;
}
$username = RequestUtils::getRequiredField("df82a9bc21", $formId);
$password = RequestUtils::getRequiredField("password", $formId);
$passwordRetype = RequestUtils::getRequiredField("password_retype", $formId);
$email = trim(RequestUtils::getRequiredField("email", $formId));
$displayName = RequestUtils::getRequiredField("display_name", $formId);
$captcha = RequestUtils::getRequiredField("captcha", $formId);

if ($captcha !== ($_SESSION["captchaPhrase"] ?? null)) {
    RequestUtils::triggerFormError(__("Incorrect CAPTCHA text!"), $formId);
}

// usernames are always lowercase
$username = strtolower($username);

if ($password !== $passwordRetype) {
    RequestUtils::triggerFormError(__("Passwords do not match!"), $formId);
}

if (strlen($password) < 8) {
    RequestUtils::triggerFormError(__("Password too short! Your password must consist of 8 or more characters"), $formId);
}

if (!ValidationUtils::isUsernameValid($username)) {
    RequestUtils::triggerFormError(__("Username has an invalid format"), $formId);
}

if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
    RequestUtils::triggerFormError(__("Invalid email address"), $formId);
}

$user = new User();
$user->name = $username;
$user->email = $email;

if ($db->fetchWhere($user, "name")) {
    RequestUtils::triggerFormError(__("This username is already taken!"), $formId);
}

if ($db->fetchWhere($user, "email")) {
    RequestUtils::triggerFormError(__("This email address is already in use!"), $formId);
}

// re-create user so we don't forget to clear properties set by the above queries

$user = new User();
$user->id = $db->generateId();
$user->displayName = $displayName;
$user->name = $username;
$user->email = $email;
$user->passwordHash = password_hash($password, PASSWORD_DEFAULT);
$user->permissionMask = UserPermissions::GROUP_USER;
$user->passwordResetRequired = false;
$user->activated = false;
$user->activationToken = $db->generateId(12);
$user->created = new \DateTimeImmutable();

Transport::fromDsn(env("MAILER_DSN"))->send(
    (new Email())
        ->from(env("MAILER_FROM"))
        ->to(new Address($email, $displayName))
        ->text(__(
            "Welcome to %forum_title%, %user_display_name%!\n" .
            "\n" .
            "Please activate your account by clicking the link below:\n" .
            "%activation_link%\n" .
            "\n" .
            "Kind regards,\n" .
            "%forum_copyright%",
            params: [
                "forum_title" => (env("MYSTIC_FORUM_TITLE") ?? "Forum"),
                "user_display_name" => $displayName,
                "activation_link" => env("PUBLIC_URL") . "?_action=verifyemail&token=" . urlencode($user->activationToken) . "&sig=" . urlencode(base64_encode(hash("sha256", env("SECRET") . $user->activationToken . $user->id, true))),
                "forum_copyright" => (env("MYSTIC_FORUM_COPYRIGHT") ?? env("MYSTIC_FORUM_TITLE") ?? "Forum")
            ]
        ))
        ->subject(__("Please activate your account"))
);

$db->insert($user);

msg_info(__("Your account has been created!\nPlease check your emails for an activation link!"));