136 lines
4.3 KiB
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');
|
|
}
|
|
} |