Core Update 1.4.0
This commit is contained in:
89
core/Views/Account/AcceptInvite.class.php
Normal file
89
core/Views/Account/AcceptInvite.class.php
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
|
||||
use Elements\Document;
|
||||
use Elements\View;
|
||||
|
||||
class AcceptInvite extends AccountView {
|
||||
|
||||
private bool $success;
|
||||
private string $message;
|
||||
private array $invitedUser;
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->title = "Invitation";
|
||||
$this->description = "Finnish your account registration by choosing a password.";
|
||||
$this->icon = "user-check";
|
||||
$this->success = false;
|
||||
$this->message = "No content";
|
||||
$this->invitedUser = array();
|
||||
}
|
||||
|
||||
public function loadView() {
|
||||
parent::loadView();
|
||||
|
||||
if (isset($_GET["token"]) && is_string($_GET["token"]) && !empty($_GET["token"])) {
|
||||
$req = new \Api\User\CheckToken($this->getDocument()->getUser());
|
||||
$this->success = $req->execute(array("token" => $_GET["token"]));
|
||||
if ($this->success) {
|
||||
if (strcmp($req->getResult()["token"]["type"], "invite") !== 0) {
|
||||
$this->success = false;
|
||||
$this->message = "The given token has a wrong type.";
|
||||
} else {
|
||||
$this->invitedUser = $req->getResult()["user"];
|
||||
}
|
||||
} else {
|
||||
$this->message = "Error confirming e-mail address: " . $req->getLastError();
|
||||
}
|
||||
} else {
|
||||
$this->success = false;
|
||||
$this->message = "The link you visited is no longer valid";
|
||||
}
|
||||
}
|
||||
|
||||
protected function getAccountContent() {
|
||||
if (!$this->success) {
|
||||
return $this->createErrorText($this->message);
|
||||
}
|
||||
|
||||
$token = htmlspecialchars($_GET["token"], ENT_QUOTES);
|
||||
$username = $this->invitedUser["name"];
|
||||
$emailAddress = $this->invitedUser["email"];
|
||||
|
||||
return "<h4 class=\"pb-4\">Please fill with your details</h4>
|
||||
<form>
|
||||
<input name='token' id='token' type='hidden' value='$token'/>
|
||||
<div class=\"input-group\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-hashtag\"></i></span>
|
||||
</div>
|
||||
<input id=\"username\" name=\"username\" placeholder=\"Username\" class=\"form-control\" type=\"text\" maxlength=\"32\" value='$username' disabled>
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-at\"></i></span>
|
||||
</div>
|
||||
<input type=\"email\" name='email' id='email' class=\"form-control\" placeholder=\"Email\" maxlength=\"64\" value='$emailAddress' disabled>
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-key\"></i></span>
|
||||
</div>
|
||||
<input type=\"password\" autocomplete='new-password' name='password' id='password' class=\"form-control\" placeholder=\"Password\">
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-key\"></i></span>
|
||||
</div>
|
||||
<input type=\"password\" autocomplete='new-password' name='confirmPassword' id='confirmPassword' class=\"form-control\" placeholder=\"Confirm Password\">
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<button type=\"button\" class=\"btn btn-success\" id='btnAcceptInvite'>Submit</button>
|
||||
</div>
|
||||
</form>";
|
||||
}
|
||||
}
|
||||
61
core/Views/Account/AccountView.class.php
Normal file
61
core/Views/Account/AccountView.class.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
use Elements\Document;
|
||||
use Elements\View;
|
||||
|
||||
abstract class AccountView extends View {
|
||||
|
||||
protected string $description;
|
||||
protected string $icon;
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->description = "";
|
||||
$this->icon = "image";
|
||||
}
|
||||
|
||||
public function loadView() {
|
||||
parent::loadView();
|
||||
|
||||
$document = $this->getDocument();
|
||||
$settings = $document->getUser()->getConfiguration()->getSettings();
|
||||
if ($settings->isRecaptchaEnabled()) {
|
||||
$document->getHead()->loadGoogleRecaptcha($settings->getRecaptchaSiteKey());
|
||||
}
|
||||
}
|
||||
|
||||
public function getCode(): string {
|
||||
$html = parent::getCode();
|
||||
|
||||
$content = $this->getAccountContent();
|
||||
$icon = $this->createIcon($this->icon, "fas", "fa-3x");
|
||||
|
||||
$html .= "<div class=\"container mt-5\">
|
||||
<div class=\"row\">
|
||||
<div class=\"col-md-3 py-5 bg-primary text-white text-center\" style='border-top-left-radius:.4em;border-bottom-left-radius:.4em;margin-left: auto'>
|
||||
<div class=\"card-body\">
|
||||
$icon
|
||||
<h2 class=\"py-3\">$this->title</h2>
|
||||
<p>$this->description</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class=\"col-md-5 pt-5 pb-2 border border-info\" style='border-top-right-radius:.4em;border-bottom-right-radius:.4em;margin-right:auto'>
|
||||
$content
|
||||
<div class='alert mt-2' style='display:none' id='alertMessage'></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>";
|
||||
|
||||
$settings = $this->getDocument()->getUser()->getConfiguration()->getSettings();
|
||||
if ($settings->isRecaptchaEnabled()) {
|
||||
$siteKey = $settings->getRecaptchaSiteKey();
|
||||
$html .= "<input type='hidden' value='$siteKey' id='siteKey' />";
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
protected abstract function getAccountContent();
|
||||
}
|
||||
55
core/Views/Account/ConfirmEmail.class.php
Normal file
55
core/Views/Account/ConfirmEmail.class.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
|
||||
use Elements\Document;
|
||||
use Elements\Script;
|
||||
|
||||
class ConfirmEmail extends AccountView {
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->title = "Confirm Email";
|
||||
$this->description = "Request a password reset, once you got the e-mail address, you can choose a new password";
|
||||
$this->icon = "user-check";
|
||||
}
|
||||
|
||||
public function loadView() {
|
||||
parent::loadView();
|
||||
$this->getDocument()->getHead()->addScript(Script::MIME_TEXT_JAVASCRIPT, "", '
|
||||
$(document).ready(function() {
|
||||
var token = jsCore.getParameter("token");
|
||||
if (token) {
|
||||
jsCore.apiCall("/user/confirmEmail", { token: token }, (res) => {
|
||||
$("#confirm-status").removeClass("alert-info");
|
||||
if (!res.success) {
|
||||
$("#confirm-status").addClass("alert-danger");
|
||||
$("#confirm-status").text("Error confirming e-mail address: " + res.msg);
|
||||
} else {
|
||||
$("#confirm-status").addClass("alert-success");
|
||||
$("#confirm-status").text("Your e-mail address was successfully confirmed, you may now log in.");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$("#confirm-status").removeClass("alert-info");
|
||||
$("#confirm-status").addClass("alert-danger");
|
||||
$("#confirm-status").text("The link you visited is no longer valid");
|
||||
}
|
||||
});'
|
||||
);
|
||||
}
|
||||
|
||||
protected function getAccountContent() {
|
||||
|
||||
$spinner = $this->createIcon("spinner");
|
||||
$html = "<noscript><div class=\"alert alert-danger\">Javascript is required</div></noscript>
|
||||
<div class=\"alert alert-info\" id=\"confirm-status\">
|
||||
Confirming email… $spinner
|
||||
</div>";
|
||||
|
||||
$html .= "<a href='/login'><button class='btn btn-primary' style='position: absolute; bottom: 10px' type='button'>Proceed to Login</button></a>";
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
70
core/Views/Account/Register.class.php
Normal file
70
core/Views/Account/Register.class.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
use Elements\Document;
|
||||
|
||||
class Register extends AccountView {
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->title = "Registration";
|
||||
$this->description = "Create a new account";
|
||||
$this->icon = "user-plus";
|
||||
}
|
||||
|
||||
public function getAccountContent() {
|
||||
|
||||
$user = $this->getDocument()->getUser();
|
||||
if ($user->isLoggedIn()) {
|
||||
header(302);
|
||||
header("Location: /");
|
||||
die("You are already logged in.");
|
||||
}
|
||||
|
||||
$settings = $user->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=\"input-group\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-hashtag\"></i></span>
|
||||
</div>
|
||||
<input id=\"username\" autocomplete='username' name=\"username\" placeholder=\"Username\" class=\"form-control\" type=\"text\" maxlength=\"32\">
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-at\"></i></span>
|
||||
</div>
|
||||
<input type=\"email\" autocomplete='email' name='email' id='email' class=\"form-control\" placeholder=\"Email\" maxlength=\"64\">
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-key\"></i></span>
|
||||
</div>
|
||||
<input type=\"password\" autocomplete='new-password' name='password' id='password' class=\"form-control\" placeholder=\"Password\">
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-key\"></i></span>
|
||||
</div>
|
||||
<input type=\"password\" autocomplete='new-password' name='confirmPassword' id='confirmPassword' class=\"form-control\" placeholder=\"Confirm Password\">
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<button type=\"button\" class=\"btn btn-primary\" id='btnRegister'>Submit</button>
|
||||
<a href='/login' style='margin-left: 10px'>
|
||||
<button class='btn btn-secondary' type='button'>
|
||||
Back to Login
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</form>";
|
||||
}
|
||||
}
|
||||
39
core/Views/Account/ResendConfirmEmail.class.php
Normal file
39
core/Views/Account/ResendConfirmEmail.class.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
|
||||
use Elements\Document;
|
||||
|
||||
class ResendConfirmEmail extends AccountView {
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->title = "Resend Confirm Email";
|
||||
$this->description = "Request a new confirmation email to finalize the account creation";
|
||||
$this->icon = "envelope";
|
||||
}
|
||||
|
||||
protected function getAccountContent() {
|
||||
return "<p class='lead'>Enter your E-Mail address, to receive a new e-mail to confirm your registration.</p>
|
||||
<form>
|
||||
<div class=\"input-group\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-at\"></i></span>
|
||||
</div>
|
||||
<input id=\"email\" autocomplete='email' name=\"email\" placeholder=\"E-Mail address\" class=\"form-control\" type=\"email\" maxlength=\"64\" />
|
||||
</div>
|
||||
<div class=\"input-group mt-2\" style='position: absolute;bottom: 15px'>
|
||||
<button id='btnResendConfirmEmail' class='btn btn-primary'>
|
||||
Request
|
||||
</button>
|
||||
<a href='/login' style='margin-left: 10px'>
|
||||
<button class='btn btn-secondary' type='button'>
|
||||
Back to Login
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
";
|
||||
}
|
||||
}
|
||||
99
core/Views/Account/ResetPassword.class.php
Normal file
99
core/Views/Account/ResetPassword.class.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Views\Account;
|
||||
|
||||
|
||||
use Elements\Document;
|
||||
|
||||
class ResetPassword extends AccountView {
|
||||
|
||||
private bool $success;
|
||||
private string $message;
|
||||
private ?string $token;
|
||||
|
||||
public function __construct(Document $document, $loadView = true) {
|
||||
parent::__construct($document, $loadView);
|
||||
$this->title = "Reset Password";
|
||||
$this->description = "Request a password reset, once you got the e-mail address, you can choose a new password";
|
||||
$this->icon = "user-lock";
|
||||
$this->success = true;
|
||||
$this->message = "";
|
||||
$this->token = NULL;
|
||||
}
|
||||
|
||||
public function loadView() {
|
||||
parent::loadView();
|
||||
|
||||
if (isset($_GET["token"]) && is_string($_GET["token"]) && !empty($_GET["token"])) {
|
||||
$this->token = $_GET["token"];
|
||||
$req = new \Api\User\CheckToken($this->getDocument()->getUser());
|
||||
$this->success = $req->execute(array("token" => $_GET["token"]));
|
||||
if ($this->success) {
|
||||
if (strcmp($req->getResult()["token"]["type"], "password_reset") !== 0) {
|
||||
$this->success = false;
|
||||
$this->message = "The given token has a wrong type.";
|
||||
}
|
||||
} else {
|
||||
$this->message = "Error requesting password reset: " . $req->getLastError();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function getAccountContent() {
|
||||
if (!$this->success) {
|
||||
$html = $this->createErrorText($this->message);
|
||||
if ($this->token !== null) {
|
||||
$html .= "<a href='/resetPassword' class='btn btn-primary'>Go back</a>";
|
||||
}
|
||||
return $html;
|
||||
}
|
||||
|
||||
if ($this->token === null) {
|
||||
return "<p class='lead'>Enter your E-Mail address, to receive a password reset token.</p>
|
||||
<form>
|
||||
<div class=\"input-group\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-at\"></i></span>
|
||||
</div>
|
||||
<input id=\"email\" autocomplete='email' name=\"email\" placeholder=\"E-Mail address\" class=\"form-control\" type=\"email\" maxlength=\"64\" />
|
||||
</div>
|
||||
<div class=\"input-group mt-2\" style='position: absolute;bottom: 15px'>
|
||||
<button id='btnRequestPasswordReset' class='btn btn-primary'>
|
||||
Request
|
||||
</button>
|
||||
<a href='/login' style='margin-left: 10px'>
|
||||
<button class='btn btn-secondary' type='button'>
|
||||
Back to Login
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
";
|
||||
} else {
|
||||
return "<h4 class=\"pb-4\">Choose a new password</h4>
|
||||
<form>
|
||||
<input name='token' id='token' type='hidden' value='$this->token'/>
|
||||
<div class=\"input-group mt-3\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-key\"></i></span>
|
||||
</div>
|
||||
<input type=\"password\" autocomplete='new-password' name='password' id='password' class=\"form-control\" placeholder=\"Password\">
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<div class=\"input-group-append\">
|
||||
<span class=\"input-group-text\"><i class=\"fas fa-key\"></i></span>
|
||||
</div>
|
||||
<input type=\"password\" autocomplete='new-password' name='confirmPassword' id='confirmPassword' class=\"form-control\" placeholder=\"Confirm Password\">
|
||||
</div>
|
||||
<div class=\"input-group mt-3\">
|
||||
<button type=\"button\" class=\"btn btn-primary\" id='btnResetPassword'>Submit</button>
|
||||
<a href='/login' style='margin-left: 10px; display: none' id='backToLogin'>
|
||||
<button class='btn btn-success' type='button'>
|
||||
Back to Login
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</form>";
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user