Avatar
visekdo
Člen
Avatar
visekdo:

Zdravim lidi,
je nějaká možnost jak vložit url odkaz směřovací jinam do vypisování chyby v této výjimce Nette\Security\Au­thenticationEx­ception()? V nette je to totiž ošetřený protí speciálním znakům a když ho tam pouze napíšu ve stylu

<a href=''>odkaz</a>

, tak mi to nevyhodí odkaz ale tento text to vypíše.

Editováno 18.8.2015 16:48
 
Odpovědět 18.8.2015 16:45
Avatar
d4rkw34v3r
Člen
Avatar
Odpovídá na visekdo
d4rkw34v3r:

Proč to psát do zprávy vyjímky? Navíc, je to runtime vyjímka a chyba už je poznat z názvu vyjímky, takže tam nepotřebuješ psát žádnou zprávu. Tu vyjímku si odchyť a zprávu napiš do Flash Message

 
Nahoru Odpovědět 18.8.2015 16:52
Avatar
d4rkw34v3r
Člen
Avatar
Odpovídá na visekdo
d4rkw34v3r:

Jinak ten text s odkazem do flash message dostanes tak, ze si vytvoris Html element a ten pak jenom predas ty flash message. Neco na zpusob:

try {
        // tady se neco provede
} catch (Nette\Security\AuthenticationException $e) {

// a pokud to skonci chybou, tak presmerujeme a vypiseme zpravu
$odkaz = Nette\Utils\Html::el('a');
$odkaz->href('http://www.seznam.cz'); // url odkazu
$odkaz->setText('odkazem'); // text odkazu

$zprava = Nette\Utils\Html::el();
$zprava->add('Nějaký text s ')->add($odkaz)->add(' na jinou stránku.');

$this->flashMessage($zprava);
$this->redirect('Homepage:abcd');

Jednodussi moznost je vypnout escapovani flashmessage, ale to bych nedelal.

Editováno 18.8.2015 17:19
 
Nahoru Odpovědět  +1 18.8.2015 17:18
Avatar
visekdo
Člen
Avatar
Odpovídá na d4rkw34v3r
visekdo:

Jojo, todle chápu, díky, ale já si tady takhle vytvářim výjimky (v UserManager), je tam i napsáno kam by tak měl směřovat ten odkaz, jen nevim ja toho docílit.

if (!$row) {
           throw new Nette\Security\AuthenticationException('Špatná Emailová adresa.', self::IDENTITY_NOT_FOUND);
       } elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
           throw new Nette\Security\AuthenticationException('Špatné heslo.', self::INVALID_CREDENTIAL);
       }elseif($row[self::COLUMN_STATUS]==1){
           throw new Nette\Security\AuthenticationException("Váš účet není aktivní. Nový aktivační email si můžete nechat poslat kliknutím na následující odkaz <a n:href='Login:Resend'>odkaz</a>", self::NOT_APPROVED); // nějak takhle by měl vypadat ten odkaz
       } elseif($row[self::COLUMN_STATUS]==0){
           throw new Nette\Security\AuthenticationException('Váš účet je zablokován.', self::NOT_APPROVED);
       } elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
           $row->update(array(
               self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
           ));
       }

Potom si přidávám v SignFormFactory ty zprávy z výjimek jako errory do formuláře. Jen nevim vůbec jak na ten odkaz.

try {
                        $this->user->login($values->username, $values->password);
                } catch (Nette\Security\AuthenticationException $e) {
                        $form->addError($e->getMessage());
                        }
 
Nahoru Odpovědět 18.8.2015 18:41
Avatar
d4rkw34v3r
Člen
Avatar
Odpovídá na visekdo
d4rkw34v3r:

Zkus to takhle. Tu Authenticatio­nException si nech pouze u kontroly E-mailu a hesla i se zprávou (Nebo si taky můžeš vytvorit vlastni vyjimky pro tyhle dva stavy). U tech dalsich stavu si vytvoris vlastni konkretni vyjimky, ktere pote zachytis pri zpracovani prihlaseni. Takže by to mohlo vypadat nejak takhle napriklad:

if (!$row) {
        throw new Nette\Security\AuthenticationException('Špatná Emailová adresa.',
                                                                                          self::IDENTITY_NOT_FOUND);
} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
        throw new Nette\Security\AuthenticationException('Špatné heslo.', self::INVALID_CREDENTIAL);
}elseif($row[self::COLUMN_STATUS]==1){
        throw new Runtime\InactiveAccountException;
} elseif($row[self::COLUMN_STATUS]==0){
        throw new Runtime\InaccessibleAccountException;
} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
        $row->update(
            array(self::COLUMN_PASSWORD_HASH => Passwords::hash($password))
        );
}

No a potom to muzes zpracovat napriklad takhle:

try {
        $this->user->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
        $form->addError($e->getMessage());
        return;
} catch (Runtime\InactiveAccountException $i) {
        $odkaz = Nette\Utils\Html::el('a');
        $odkaz->href($this->link('Login:resend')); // url odkazu
        $odkaz->setText('odkaz'); // text odkazu

        $zprava = Nette\Utils\Html::el();
        $zprava->add('Váš účet není aktivní. Nový aktivační email si můžete nechat poslat kliknutím na
                               následující ')->add($odkaz);

        $form->addError($zprava);
        return;

} catch (Runtime\InaccessibleAccountException $ia) {
        $form->addError('Váš účet je zablokován.');
        return;
}

Proste jde o to, ze ten text vyjimky, ktery se tam snazis nacpat, se ti vzdycky prelozi spatne a ten odkaz se ti bude bude zobrazovat jako escapovany text. Jediny reseni by potom bylo vypnout escapovani ty message v sablone, coz je fuj. Tohle je asi jediny validni zpusob, jak toho dosahnout. Alespon tedy co vim ja.

Editováno 18.8.2015 19:14
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 18.8.2015 19:11
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.