# HG changeset patch # User František Kučera # Date 1267708161 -3600 # Node ID 4c0408690ebf794d54f2326b3dfbb08d1676365f # Parent d01685a7e07d3ab72fa2ff1009459026505d9e34 Hashování hesla, generování náhodného tokenu, částečný převod chyb na uživatelsky přijatelné hlášky. diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/UzivatelEJB.java --- a/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/UzivatelEJB.java Thu Mar 04 12:02:41 2010 +0100 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/UzivatelEJB.java Thu Mar 04 14:09:21 2010 +0100 @@ -2,6 +2,11 @@ import cz.frantovo.nekurak.dao.UzivatelDAO; import cz.frantovo.nekurak.dto.Uzivatel; +import cz.frantovo.nekurak.util.Hash; +import cz.frantovo.nekurak.vyjimky.NecekanaVyjimka; +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka; +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; import javax.ejb.EJB; import javax.ejb.Stateless; @@ -16,7 +21,17 @@ private UzivatelDAO uzivatelDao; /** Uživatele může zakládat kdokoli – uživatel se registruje sám. */ - public void zalozUzivatele(Uzivatel u) { - uzivatelDao.uloz(u); + public void zalozUzivatele(Uzivatel u) throws NekurakVyjimka { + try { + /** Heslo musíme před uložení zahashovat, aby se uživatel mohl přihlásit. */ + u.setHeslo(Hash.hashuj(u.getHeslo())); + uzivatelDao.uloz(u); + } catch (NoSuchAlgorithmException e) { + /** Nemělo by nastat */ + throw new NecekanaVyjimka("Neexistující hashovací algoritmus.", e); + } catch (UnsupportedEncodingException e) { + /** Nemělo by nastat */ + throw new NecekanaVyjimka("Nepodporované kódování znaků.", e); + } } } diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/UzivatelRemote.java --- a/java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/UzivatelRemote.java Thu Mar 04 12:02:41 2010 +0100 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/UzivatelRemote.java Thu Mar 04 14:09:21 2010 +0100 @@ -1,6 +1,7 @@ package cz.frantovo.nekurak.ejb; import cz.frantovo.nekurak.dto.Uzivatel; +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka; import javax.ejb.Remote; /** @@ -10,6 +11,5 @@ @Remote public interface UzivatelRemote { - public void zalozUzivatele(Uzivatel u); - + public void zalozUzivatele(Uzivatel u) throws NekurakVyjimka; } diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-lib/src/cz/frantovo/nekurak/util/Hash.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/util/Hash.java Thu Mar 04 14:09:21 2010 +0100 @@ -0,0 +1,47 @@ +package cz.frantovo.nekurak.util; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Pomocná třída pro počítání hashů. + * @author fiki + */ +public class Hash { + + private static String algoritmus = "SHA-1"; + private static String kodovani = "UTF-8"; + + private static String prevedNaHex(byte[] data) { + StringBuffer vysledek = new StringBuffer(); + for (int i = 0; i < data.length; i++) { + int pulBajt = (data[i] >>> 4) & 0x0F; + int dvePulky = 0; + do { + if ((0 <= pulBajt) && (pulBajt <= 9)) { + vysledek.append((char) ('0' + pulBajt)); + } else { + vysledek.append((char) ('a' + (pulBajt - 10))); + } + pulBajt = data[i] & 0x0F; + } while (dvePulky++ < 1); + } + return vysledek.toString(); + } + + /** + * @param text vstupní text + * @return hashovaný text v HEX tvaru + * @throws NoSuchAlgorithmException neexistující hashovací algoritmus + * @throws UnsupportedEncodingException nepodporované kódování znaků + */ + public static String hashuj(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException { + MessageDigest md; + md = MessageDigest.getInstance(algoritmus); + byte[] hash = new byte[40]; + md.update(text.getBytes(kodovani), 0, text.length()); + hash = md.digest(); + return prevedNaHex(hash); + } +} diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-lib/src/cz/frantovo/nekurak/vyjimky/NecekanaVyjimka.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/vyjimky/NecekanaVyjimka.java Thu Mar 04 14:09:21 2010 +0100 @@ -0,0 +1,12 @@ +package cz.frantovo.nekurak.vyjimky; + +/** + * + * @author fiki + */ +public class NecekanaVyjimka extends NekurakVyjimka { + + public NecekanaVyjimka(String chyba, Exception e) { + super(chyba, e); + } +} diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-lib/src/cz/frantovo/nekurak/vyjimky/NekurakVyjimka.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/vyjimky/NekurakVyjimka.java Thu Mar 04 14:09:21 2010 +0100 @@ -0,0 +1,12 @@ +package cz.frantovo.nekurak.vyjimky; + +/** + * + * @author fiki + */ +public class NekurakVyjimka extends Exception { + + public NekurakVyjimka(String chyba, Exception e) { + super(chyba, e); + } +} diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-web/src/java/cz/frantovo/nekurak/preklady_cs.properties --- a/java/nekurak.net-web/src/java/cz/frantovo/nekurak/preklady_cs.properties Thu Mar 04 12:02:41 2010 +0100 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/preklady_cs.properties Thu Mar 04 14:09:21 2010 +0100 @@ -56,7 +56,9 @@ registrace.hotovo.prihlasit=p\u0159ihl\u00E1sit registrace.tlacitko=Registrovat se registrace.potvrdit=Potvrdit registraci -registrace.chybnyToken=Relace vypr\u0161ela, registraci nelze dokon\u010Dit. Vypl\u0148te pros\u00EDm formul\u00E1\u0159 znovu. +registrace.vyjimka=Nepoda\u0159ilo se zalo\u017Eit u\u017Eivatele. Po\u017Eadovan\u00E1 p\u0159ezd\u00EDvka je pravd\u011Bpodobn\u011B obsazena. +registrace.vyjimka.necekana=Omlouv\u00E1me se, b\u011Bhem registrace do\u0161lo k nezn\u00E1m\u00E9 chyb\u011B. +registrace.vyjimka.token=Relace vypr\u0161ela, registraci nelze dokon\u010Dit. Vypl\u0148te pros\u00EDm formul\u00E1\u0159 znovu. dto.uzivatel.prezdivka=P\u0159ezd\u00EDvka dto.uzivatel.prezdivka.tip=U\u017Eivatelsk\u00E9 jm\u00E9no diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/RegistraceUzivatele.java --- a/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/RegistraceUzivatele.java Thu Mar 04 12:02:41 2010 +0100 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/RegistraceUzivatele.java Thu Mar 04 14:09:21 2010 +0100 @@ -1,8 +1,11 @@ package cz.frantovo.nekurak.web; +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @@ -11,6 +14,7 @@ public class RegistraceUzivatele { private HledacSluzby hledac = new HledacSluzby(); + private static final Logger log = Logger.getLogger(RegistraceUzivatele.class.getSimpleName()); private Map uzivatele = Collections.synchronizedMap(new HashMap()); private String token; @@ -22,16 +26,25 @@ this.token = token; } - public boolean getDokonciRegistraci() { + /** + * @return true, pokud registrace proběhla, jinak vyhazuje výjimku. + * @throws NekurakVyjimka špatný token nebo chyba při zakládání uživatele + */ + public String getDokonciRegistraci() { UzivatelPredRegistraci u = uzivatele.get(token); if (u == null) { /** Chybný token – uživatel se snaží dokončit neexistující registraci */ - return false; + return "registrace.vyjimka.token"; } else { - hledac.getUzivatelEJB().zalozUzivatele(u.getUzivatel()); - return true; + try { + hledac.getUzivatelEJB().zalozUzivatele(u.getUzivatel()); + } catch (Exception e) { + log.log(Level.WARNING, "Chyba při registraci uživatele.", e); + return "registrace.vyjimka"; + } + return null; } } } diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/UzivatelPredRegistraci.java --- a/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/UzivatelPredRegistraci.java Thu Mar 04 12:02:41 2010 +0100 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/UzivatelPredRegistraci.java Thu Mar 04 14:09:21 2010 +0100 @@ -1,6 +1,9 @@ package cz.frantovo.nekurak.web; import cz.frantovo.nekurak.dto.Uzivatel; +import cz.frantovo.nekurak.util.Hash; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Pomocná třída obalujícího uživatele a token (kvůli CSRF) @@ -8,6 +11,7 @@ */ public class UzivatelPredRegistraci { + private static final Logger log = Logger.getLogger(UzivatelPredRegistraci.class.getSimpleName()); private Uzivatel uzivatel; private final String token = generujToken(); @@ -23,9 +27,16 @@ return token; } + /** + * @return náhodný token + */ private static String generujToken() { - /** TODO: generovat náhodný. */ - return "XXX_TODO_generovat_nahodny_token"; + try { + return Hash.hashuj(String.valueOf(Math.random())); + } catch (Exception e) { + log.log(Level.SEVERE, "Chyba při generování háhodného tokenu", e); + /** Nemělo by nikdy nastat :-) */ + return "nbusr123"; + } } - } diff -r d01685a7e07d -r 4c0408690ebf java/nekurak.net-web/web/WEB-INF/casti/registrovatUzivatele.jsp --- a/java/nekurak.net-web/web/WEB-INF/casti/registrovatUzivatele.jsp Thu Mar 04 12:02:41 2010 +0100 +++ b/java/nekurak.net-web/web/WEB-INF/casti/registrovatUzivatele.jsp Thu Mar 04 14:09:21 2010 +0100 @@ -11,8 +11,16 @@

+ + + @@ -34,11 +42,14 @@ - + + + - + +

&#160; @@ -47,17 +58,13 @@

- -

+ +

- -
+
@@ -74,7 +81,4 @@ - - -