Kufrik/app/UI/Sign/SignPresenter.php

136 lines
4.3 KiB
PHP

<?php
namespace App\UI\Sign;
use App\Core\MujAutentifikator;
use App\Model\FormData\LoginFormData;
use App\Model\Login\ServerCredentials;
use Nette;
use Nette\Application\UI\Form;
use Nette\Application\Attributes\Persistent;
final class SignPresenter extends Nette\Application\UI\Presenter
{
/**
* Stores the previous page hash to redirect back after successful login.
*/
#[Persistent]
public string $backlink = '';
public function __construct(
) {
}
protected function createComponentSignInForm(): Form
{
$form = new Form();
$form->addText('server', 'Server:')
->setRequired('Prosím vyplňte server.')
->setValue(@$_COOKIE['server']);
$form->addText('username', 'Uživatelské jméno:')
->setRequired('Prosím vyplňte své uživatelské jméno.')
->setValue(@$_COOKIE['user']);
$form->addPassword('password', 'Heslo:');
// setRequired nepoužívat!! kvůli soft logoutu!!!
//->setRequired('Prosím vyplňte své heslo.');
$form->addSubmit('send', 'Přihlásit');
//$form->addProtection(); //ochrana pomocí TOKENu
$form->onSuccess[] = $this->signInFormSucceeded(...);
return $form;
}
private function signInFormSucceeded(Form $form, LoginFormData $data): void //moje vlastní třída LoginFormData
{
try {
// kontrola serverů:
if (!Funkce::is_cloud_ip($data->server)) {
error_log("QR Login - neplatny server.", 0); //log je ve var/log/apache2/error.log (fail2ban)
$form->addError('Neznámý server.');
return;
}
// sestav Credentials:
$credentials = new ServerCredentials($data->server);
$autentifikator = new MujAutentifikator($credentials, $this->session); // naše vlastní autentifikace!
$this->getUser()->setAuthenticator($autentifikator); // musíme ji registrovat!
$blacklist_check = $this->blackList->blacklist_check($data->server);
bdump($blacklist_check);
if (is_null($blacklist_check)) {
//nic, jako by prošel
} else {
// $blacklist_check->vysledek Returns 1, pokud není blacklistu. Když se tam nachází, tak 0.
// $blacklist_check->expire_date Kdy končí.
// $blacklist_check->expired_text Co jim zahlásíš.
if ($blacklist_check->vysledek == 0) {
setcookie("salt", "", time() - 3600); // smažeme v tomto případě kukínu ...
if (empty($blacklist_check->expired_text))
throw new BlackListException("Licence pro použití PečAppky vypršela, nebo nám dlužíte peníze.");
else
throw new BlackListException($blacklist_check->expired_text); // custom text z blacklist DB
}
}
// uložené heslo?
if (empty($data->password) and isset($_COOKIE['salt'])) {
$password = Funkce::decrypt_password($_COOKIE['salt']);
} else {
$password = $data->password;
}
// validace přihlášení je v třídě MujAutentifikator->authenticate(...)
$this->getUser()->login($data->username, $password);
// kam potom?
$this->restoreRequest($this->backlink); // vrátit se na požadovanou stránku
$this->redirect(':Ctecka:'); // jinak přejdi sem
} catch (Nette\Database\ConnectionException) {
error_log("QR Login - neplatne prihlaseni.", 0); //log je ve var/log/apache2/error.log (fail2ban)
$form->addError('Neplatné přihlášení.');
} catch (Nette\Security\AuthenticationException $e) {
error_log("QR Login - neplatne prihlaseni.", 0); //log je ve var/log/apache2/error.log (fail2ban)
$form->addError($e->getMessage());
} catch (BlackListException $e2) {
$form->addError($e2->getMessage());
}
}
public function renderIn(): void
{
// ukázat či neukázat pole pro heslo?
$this->template->salt = isset($_COOKIE['salt']);
}
/**
* Normalní logout.
* @return void
*/
public function actionOut(): void
{
$this->getUser()->logout();
$this->flashMessage('Odhlášení bylo úspěšné.');
$this->redirect('Sign:in');
}
/**
* Tvrdý logout.
* @return void
*/
public function actionHardOut(): void
{
$this->getUser()->logout();
setcookie("salt", "", time() - 3600); // smažeme v tomto případě kukínu ...
// smažeme vybranou DB ze session:
if ($this->session->hasSection(Konstanty::sectionDatabase)) {
$section = $this->session->getSection(Konstanty::sectionDatabase);
$section->remove(Konstanty::sessionCurrentDatabase);
}
$this->flashMessage('Odhlášení bylo úspěšné.');
$this->redirect('Sign:in');
}
}