CSRF/XSRF ochrana při hlasování.
1 package cz.frantovo.nekurak.util;
3 import cz.frantovo.nekurak.vyjimky.KomentarovaVyjimka;
4 import java.io.ByteArrayInputStream;
6 import java.util.logging.Logger;
7 import javax.xml.XMLConstants;
8 import javax.xml.parsers.DocumentBuilder;
9 import javax.xml.parsers.DocumentBuilderFactory;
10 import javax.xml.validation.Schema;
11 import javax.xml.validation.SchemaFactory;
12 import org.w3c.dom.Document;
13 import org.xml.sax.ErrorHandler;
14 import org.xml.sax.SAXException;
15 import org.xml.sax.SAXParseException;
21 public class Komentare {
23 private static final Logger log = Logger.getLogger(Komentare.class.getSimpleName());
26 * Escapuje XML a doplní XHTML zalomení na konce řádků.
27 * @param komentar prostý text zadaný uživatelem
28 * @return XHTML komentář bez kořenového elementu
30 public static String upravProstyText(String komentar) {
31 return zalomRadky(escapujXML(komentar));
35 * Pokud uživatel zapomněl na odstavce,
36 * zalomíme řádky a zabalíme celý odstavec do jednoho odstavce
37 * @param komentar komentář bez odstavců
38 * @return komentář s odstavci
40 public static String upravXHTML(String komentar) {
41 if (komentar.indexOf("<p>") == -1) {
42 return zalomRadky(komentar);
49 * Převede konce řádků na <br/>
50 * a celé zabalí do <p/>
51 * @param komentar text se zalomenými řádky
52 * @return text s <br/> místo konců řádků
54 private static String zalomRadky(String komentar) {
55 return "<p>" + komentar.replaceAll("\n", "<br/>") + "</p>";
60 * @param komentar vstupní XHTML
61 * @return XHTML obalené kořenovým elementem
63 public static String obal(String komentar) {
64 return "<div>" + komentar + "</div>";
68 * zkontroluje komentář oproti schématu.
70 * TODO: omezit maximální délku?
71 * TODO: omezit komentáře?
74 * @return jestli komentář odpovídá
76 public static Document zkontroluj(String komentar) throws KomentarovaVyjimka {
78 URL soubor = Komentare.class.getClassLoader().getResource("cz/frantovo/nekurak/util/komentář.xsd");
79 SchemaFactory tovarnaSchemat = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
80 Schema schema = tovarnaSchemat.newSchema(soubor);
82 DocumentBuilderFactory tovarnaDB = DocumentBuilderFactory.newInstance();
83 tovarnaDB.setSchema(schema);
85 DocumentBuilder db = tovarnaDB.newDocumentBuilder();
86 db.setErrorHandler(new ErrorHandler() {
88 public void warning(SAXParseException e) throws SAXException {
92 public void error(SAXParseException e) throws SAXException {
95 * TODO: poslat hlášku, v čem je chyba
100 public void fatalError(SAXParseException e) throws SAXException {
101 /** invalidní XML – neuzavřené značky atd. */
105 Document dokument = db.parse(new ByteArrayInputStream(komentar.getBytes("UTF-8")));
107 } catch (Exception e) {
108 throw new KomentarovaVyjimka("Neplatný komentář: " + komentar, e);
114 private static String escapujXML(String str) {
115 return str.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'");