User Registration Frontend
This commit is contained in:
@@ -34,7 +34,7 @@ namespace Api {
|
||||
$row = $res[0];
|
||||
if (strcasecmp($username, $row['name']) === 0) {
|
||||
return $this->createError("This username is already taken.");
|
||||
} else if (strcasecmp($username, $row['email']) === 0) {
|
||||
} else if (strcasecmp($email, $row['email']) === 0) {
|
||||
return $this->createError("This email address is already in use.");
|
||||
}
|
||||
}
|
||||
@@ -670,13 +670,14 @@ namespace Api\User {
|
||||
}
|
||||
|
||||
parent::__construct($user, $externalCall, $parameters);
|
||||
$this->csrfTokenRequired = false;
|
||||
}
|
||||
|
||||
private function insertToken() {
|
||||
$validUntil = (new DateTime())->modify("+48 hour");
|
||||
$sql = $this->user->getSQL();
|
||||
$res = $sql->insert("UserToken", array("user_id", "token", "token_type", "valid_until"))
|
||||
->addRow($this->userId, $this->token, "confirmation", $validUntil)
|
||||
->addRow($this->userId, $this->token, "email_confirm", $validUntil)
|
||||
->execute();
|
||||
|
||||
$this->success = ($res !== FALSE);
|
||||
@@ -732,33 +733,31 @@ namespace Api\User {
|
||||
$this->userId = $id;
|
||||
$this->token = generateRandomString(36);
|
||||
if ($this->insertToken()) {
|
||||
return false;
|
||||
}
|
||||
$settings = $this->user->getConfiguration()->getSettings();
|
||||
$baseUrl = htmlspecialchars($settings->getBaseUrl());
|
||||
$siteName = htmlspecialchars($settings->getSiteName());
|
||||
|
||||
$settings = $this->user->getConfiguration()->getSettings();
|
||||
$baseUrl = htmlspecialchars($settings->getBaseUrl());
|
||||
$siteName = htmlspecialchars($settings->getSiteName());
|
||||
if ($this->success) {
|
||||
|
||||
if ($this->success) {
|
||||
$replacements = array(
|
||||
"link" => "$baseUrl/confirmEmail?token=$this->token",
|
||||
"site_name" => $siteName,
|
||||
"base_url" => $baseUrl,
|
||||
"username" => htmlspecialchars($username)
|
||||
);
|
||||
|
||||
$replacements = array(
|
||||
"link" => "$baseUrl/confirmEmail?token=$this->token",
|
||||
"site_name" => $siteName,
|
||||
"base_url" => $baseUrl,
|
||||
"username" => htmlspecialchars($username)
|
||||
);
|
||||
foreach($replacements as $key => $value) {
|
||||
$messageBody = str_replace("{{{$key}}}", $value, $messageBody);
|
||||
}
|
||||
|
||||
foreach($replacements as $key => $value) {
|
||||
$messageBody = str_replace("{{{$key}}}", $value, $messageBody);
|
||||
}
|
||||
|
||||
$request = new \Api\Mail\Send($this->user);
|
||||
$this->success = $request->execute(array(
|
||||
$request = new \Api\Mail\Send($this->user);
|
||||
$this->success = $request->execute(array(
|
||||
"to" => $email,
|
||||
"subject" => "[$siteName] E-Mail Confirmation",
|
||||
"body" => $messageBody
|
||||
));
|
||||
$this->lastError = $request->getLastError();
|
||||
));
|
||||
$this->lastError = $request->getLastError();
|
||||
}
|
||||
}
|
||||
|
||||
if (!$this->success) {
|
||||
|
||||
@@ -192,7 +192,7 @@ class CreateDatabase {
|
||||
->addRow("User/edit", array(USER_GROUP_ADMIN), "Allows users to edit details and group memberships of any user")
|
||||
->addRow("User/delete", array(USER_GROUP_ADMIN), "Allows users to delete any other user")
|
||||
->addRow("Permission/fetch", array(USER_GROUP_ADMIN), "Allows users to list all API permissions")
|
||||
->addRow("Visitors/stats", array(USER_GROUP_ADMIN, USER_GROUP_SUPPORT), "Allowes users to see visitor statistics");
|
||||
->addRow("Visitors/stats", array(USER_GROUP_ADMIN, USER_GROUP_SUPPORT), "Allows users to see visitor statistics");
|
||||
|
||||
return $queries;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ namespace Documents {
|
||||
namespace Documents\Account {
|
||||
|
||||
use Elements\Head;
|
||||
use Elements\Script;
|
||||
use Elements\SimpleBody;
|
||||
|
||||
class AccountHead extends Head {
|
||||
@@ -26,11 +27,21 @@ namespace Documents\Account {
|
||||
}
|
||||
|
||||
protected function initSources() {
|
||||
|
||||
$this->loadJQuery();
|
||||
$this->addJS(Script::CORE);
|
||||
$this->addJS(Script::ACCOUNT);
|
||||
$this->loadBootstrap();
|
||||
$this->loadFontawesome();
|
||||
}
|
||||
|
||||
protected function initMetas() {
|
||||
return array();
|
||||
return array(
|
||||
array('name' => 'viewport', 'content' => 'width=device-width, initial-scale=1.0'),
|
||||
array('name' => 'format-detection', 'content' => 'telephone=yes'),
|
||||
array('charset' => 'utf-8'),
|
||||
array("http-equiv" => 'expires', 'content' => '0'),
|
||||
array("name" => 'robots', 'content' => 'noarchive'),
|
||||
);
|
||||
}
|
||||
|
||||
protected function initRawFields() {
|
||||
@@ -49,6 +60,7 @@ namespace Documents\Account {
|
||||
}
|
||||
|
||||
protected function getContent() {
|
||||
|
||||
$view = $this->getDocument()->getView();
|
||||
if ($view === null) {
|
||||
return "The page you does not exist or is no longer valid. <a href='/'>Return to start page</a>";
|
||||
|
||||
@@ -11,6 +11,7 @@ class Script extends StaticView {
|
||||
const JQUERY = "/js/jquery.min.js";
|
||||
const INSTALL = "/js/install.js";
|
||||
const BOOTSTRAP = "/js/bootstrap.bundle.min.js";
|
||||
const ACCOUNT = "/js/account.js";
|
||||
|
||||
private string $type;
|
||||
private string $content;
|
||||
|
||||
43
core/Views/Account/AccountView.class.php
Normal file
43
core/Views/Account/AccountView.class.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
use Elements\Document;
|
||||
use Elements\View;
|
||||
|
||||
abstract class AccountView extends View {
|
||||
|
||||
protected string $description;
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->description = "";
|
||||
}
|
||||
|
||||
public function getCode() {
|
||||
$html = parent::getCode();
|
||||
|
||||
$content = $this->getAccountContent();
|
||||
$icon = $this->createIcon("user-plus", "fas", "fa-3x");
|
||||
|
||||
$html .= "<div class=\"container mt-5\">
|
||||
<div class=\"row\">
|
||||
<div class=\"col-md-4 py-5 bg-primary text-white text-center\" style='border-top-left-radius:.4em;border-bottom-left-radius:.4em'>
|
||||
<div class=\"card-body\">
|
||||
$icon
|
||||
<h2 class=\"py-3\">$this->title</h2>
|
||||
<p>$this->description</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class=\"col-md-8 pt-5 pb-2 border border-info\" style='border-top-right-radius:.4em;border-bottom-right-radius:.4em'>
|
||||
$content
|
||||
<div class='alert mt-2' style='display:none' id='alertMessage'></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>";
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
protected abstract function getAccountContent();
|
||||
}
|
||||
@@ -7,15 +7,51 @@ namespace Views\Account;
|
||||
use Elements\Document;
|
||||
use Elements\View;
|
||||
|
||||
class Register extends View {
|
||||
class Register extends AccountView {
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->title = "Registration";
|
||||
$this->description = "Create a new account";
|
||||
}
|
||||
|
||||
public function getCode() {
|
||||
$html = parent::getCode();
|
||||
public function loadView() {
|
||||
parent::loadView();
|
||||
|
||||
return $html;
|
||||
$document = $this->getDocument();
|
||||
$settings = $document->getUser()->getConfiguration()->getSettings();
|
||||
if ($settings->isRecaptchaEnabled()) {
|
||||
$document->getHead()->loadGoogleRecaptcha($settings->getRecaptchaSiteKey());
|
||||
}
|
||||
}
|
||||
|
||||
public function getAccountContent() {
|
||||
|
||||
$settings = $this->getDocument()->getUser()->getConfiguration()->getSettings();
|
||||
if (!$settings->isRegistrationAllowed()) {
|
||||
return $this->createErrorText(
|
||||
"Registration is not enabled on this website. If you are an administrator,
|
||||
goto <a href=\"/admin/settings\">/admin/settings</a>, to enable the user registration"
|
||||
);
|
||||
}
|
||||
|
||||
return "<h4 class=\"pb-4\">Please fill with your details</h4>
|
||||
<form>
|
||||
<div class=\"form-group\">
|
||||
<input id=\"username\" name=\"username\" placeholder=\"Username\" class=\"form-control\" type=\"text\" maxlength=\"32\">
|
||||
</div>
|
||||
<div class=\"form-group\">
|
||||
<input type=\"email\" name='email' id='email' class=\"form-control\" placeholder=\"Email\" maxlength=\"64\">
|
||||
</div>
|
||||
<div class=\"form-group\">
|
||||
<input type=\"password\" name='password' id='password' class=\"form-control\" placeholder=\"Password\">
|
||||
</div>
|
||||
<div class=\"form-group\">
|
||||
<input type=\"password\" name='confirmPassword' id='confirmPassword' class=\"form-control\" placeholder=\"Confirm Password\">
|
||||
</div>
|
||||
<div class=\"form-group\">
|
||||
<button type=\"button\" class=\"btn btn-success\" id='btnRegister'>Submit</button>
|
||||
</div>
|
||||
</form>";
|
||||
}
|
||||
}
|
||||
21
core/Views/Account/ResetPassword.class.php
Normal file
21
core/Views/Account/ResetPassword.class.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
|
||||
use Elements\Document;
|
||||
use Elements\View;
|
||||
|
||||
class ResetPassword extends View {
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
}
|
||||
|
||||
public function getCode() {
|
||||
$html = parent::getCode();
|
||||
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user