diff --git a/htroot/BlogComments.html b/htroot/BlogComments.html new file mode 100644 index 000000000..9a6e0e224 --- /dev/null +++ b/htroot/BlogComments.html @@ -0,0 +1,99 @@ + + + + YaCy '#[clientname]#': Blog + #%env/templates/metas.template%# + + + #%env/templates/header.template%# + BlogSize: #[blogSize]#
+ BlogCommentsSize: #[blogCommentsSize]#
+ #(mode)# + +
+

#[subject]#

+
#[page]#
+

+ #[date]# | by #[author]# | #[comments]# Comments +

+
+ + #{entries}# +
+

#[subject]#

+
#[page]#
+

+ #[date]# | by #[author]# + #(admin)#::| delete#(/admin)# +

+
+ #{/entries}# +
+
+
+
+
+ +
+
+
+ +
+
+
+ +

+ You can use Yacy-Wiki Code here. +

+
+
+ + + + +
+
+ :: + +
+

#[subject]#

+
#[page]#
+

+ #[date]# | by #[author]# +

+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +

+ You can use Yacy-Wiki Code here. +

+
+
+ + + + + +
+
+ #(/mode)# + #%env/templates/footer.template%# + + diff --git a/htroot/BlogComments.java b/htroot/BlogComments.java new file mode 100644 index 000000000..6cf8ef12e --- /dev/null +++ b/htroot/BlogComments.java @@ -0,0 +1,275 @@ +// Blog.java +// ----------------------- +// part of YACY +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2004 +// +// This File is contributed by Jan Sandbrink +// Contains contributions from Marc Nause [MN] +// last change: 06.05.2006 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + +// You must compile this file with +// javac -classpath .:../Classes Blacklist_p.java +// if the shell's current path is HTROOT + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; + +import de.anomic.data.blogBoard; +import de.anomic.data.blogBoardComments; +import de.anomic.data.userDB; +import de.anomic.data.blogBoard.entry; +import de.anomic.http.httpHeader; +import de.anomic.plasma.plasmaSwitchboard; +import de.anomic.server.serverObjects; +import de.anomic.server.serverSwitch; +import de.anomic.yacy.yacyCore; +import de.anomic.yacy.yacyNewsRecord; + +public class BlogComments { + + private static SimpleDateFormat SimpleFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); +// TODO: make userdefined date/time-strings (localisation) + + public static String dateString(Date date) { + return SimpleFormatter.format(date); + } + + public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { + plasmaSwitchboard switchboard = (plasmaSwitchboard) env; + serverObjects prop = new serverObjects(); + blogBoard.entry page = null; + boolean hasRights = switchboard.verifyAuthentication(header, true); + + if(hasRights) prop.put("mode_admin",1); + else prop.put("mode_admin",0); + + if (post == null) { + post = new serverObjects(); + post.put("page", "blog_default"); + } + + if(!hasRights){ + userDB.Entry userentry = switchboard.userDB.proxyAuth((String)header.get("Authorization", "xxxxxx")); + if(userentry != null && userentry.hasBlogRight()){ + hasRights=true; + } + //opens login window if login link is clicked - contrib [MN] + else if(post.containsKey("login")){ + prop.put("AUTHENTICATE","admin log-in"); + } + } + + String pagename = post.get("page", "blog_default"); + String ip = post.get("CLIENTIP", "127.0.0.1"); + + String StrAuthor = post.get("author", "anonymous"); + + if (StrAuthor.equals("anonymous")) { + StrAuthor = switchboard.blogDB.guessAuthor(ip); + + if (StrAuthor == null || StrAuthor.length() == 0) { + if (de.anomic.yacy.yacyCore.seedDB.mySeed == null) + StrAuthor = "anonymous"; + else { + StrAuthor = de.anomic.yacy.yacyCore.seedDB.mySeed.get("Name", "anonymous"); + } + } + } + + byte[] author; + try { + author = StrAuthor.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + author = StrAuthor.getBytes(); + } + + if (post.containsKey("submit")) { + // store a new/edited blog-entry + byte[] content; + try { + content = post.get("content", "").getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + content = post.get("content", "").getBytes(); + } + + Date date = null; + + //set name for new entry or date for old entry + + String StrSubject = post.get("subject", ""); + byte[] subject; + try { + subject = StrSubject.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + subject = StrSubject.getBytes(); + } + String commentID = String.valueOf(System.currentTimeMillis()); + entry blogEntry = switchboard.blogDB.read(pagename); + blogEntry.addComment(commentID); + switchboard.blogDB.write(blogEntry); + switchboard.blogCommentDB.write(switchboard.blogCommentDB.newEntry(commentID, subject, author, ip, date, content)); + + // create a news message + HashMap map = new HashMap(); + map.put("page", pagename); + map.put("subject", StrSubject.replace(',', ' ')); + map.put("author", StrAuthor.replace(',', ' ')); + //yacyCore.newsPool.publishMyNews(new yacyNewsRecord("blogComment_add", map)); + } + + page = switchboard.blogDB.read(pagename); //maybe "if(page == null)" + if(post.containsKey("delete") && post.containsKey("page") &&post.containsKey("comment")) { + if(page.removeComment((String) post.get("comment"))) { + switchboard.blogCommentDB.delete((String) post.get("comment")); + } + } + + if(post.containsKey("preview")) { + //preview the page + if(hasRights) { + prop.put("mode", 1);//preview + prop.put("mode_pageid", pagename); + try { + prop.put("mode_author", new String(author, "UTF-8")); + } catch (UnsupportedEncodingException e) { + prop.put("mode_author", new String(author)); + } + prop.put("mode_subject", post.get("subject","")); + prop.put("mode_date", dateString(new Date())); + prop.putWiki("mode_page", post.get("content", "")); + prop.put("mode_page-code", post.get("content", "")); + } + else prop.put("mode",3); //access denied (no rights) + } + else { + // show blog-entry/entries + prop.put("mode", 0); //viewing + if(pagename.equals("blog_default")) { + prop.put("LOCATION","Blog.html"); + } + else { + //show 1 blog entry + prop.put("mode_pageid", page.key()); + try { + prop.put("mode_subject", new String(page.subject(),"UTF-8")); + } catch (UnsupportedEncodingException e) { + prop.put("mode_subject", new String(page.subject())); + } + try { + prop.put("mode_author", new String(page.author(),"UTF-8")); + } catch (UnsupportedEncodingException e) { + prop.put("mode_author", new String(page.author())); + } + try { + prop.put("mode_comments", new String(page.commentsSize(),"UTF-8")); + } catch (UnsupportedEncodingException e) { + prop.put("mode_comments", new String(page.commentsSize())); + } + prop.put("mode_date", dateString(page.date())); + prop.putWiki("mode_page", page.page()); + if(hasRights) { + prop.put("mode_admin", 1); + prop.put("mode_admin_pageid",page.key()); + } + //show all commments + try { + Iterator i = page.comments().iterator(); + String pageid; + blogBoardComments.CommentEntry entry; + boolean xml = false; + if(post.containsKey("xml")) + xml = true; + int count = 0; //counts how many entries are shown to the user + int start = post.getInt("start",0); //indicates from where entries should be shown + int num = post.getInt("num",20); //indicates how many entries should be shown + if(xml) num = 0; + int nextstart = start+num; //indicates the starting offset for next results + while(i.hasNext()) { + if(count >= num && num > 0) + break; + pageid = (String) i.next(); + if(0 < start--) + continue; + entry = switchboard.blogCommentDB.read(pageid); + + prop.put("mode", 0); + prop.put("mode_entries_"+count+"_pageid",entry.key()); + if(!xml) { + prop.put("mode_entries_"+count+"_subject", new String(entry.subject(),"UTF-8")); + prop.put("mode_entries_"+count+"_author", new String(entry.author(),"UTF-8")); + prop.putWiki("mode_entries_"+count+"_page", entry.page()); + } + else { + prop.put("mode_entries_"+count+"_subject", new String(entry.subject(),"UTF-8")); + prop.put("mode_entries_"+count+"_author", new String(entry.author(),"UTF-8")); + prop.putASIS("mode_entries_"+count+"_page", entry.page()); + prop.put("mode_entries_"+count+"_timestamp", entry.timestamp()); + } + prop.put("mode_entries_"+count+"_date", dateString(entry.date())); + prop.put("mode_entries_"+count+"_ip", entry.ip()); + if(hasRights) { + prop.put("mode_entries_"+count+"_admin", 1); + prop.put("mode_entries_"+count+"_admin_pageid",page.key()); + prop.put("mode_entries_"+count+"_admin_commentid",pageid); + } + else prop.put("mode_entries_"+count+"_admin", 0); + ++count; + } + prop.put("mode_entries",count); + if(i.hasNext()) { + prop.put("mode_moreentries",1); //more entries are availible + prop.put("mode_moreentries_start",nextstart); + prop.put("mode_moreentries_num",num); + } + else prop.put("moreentries",0); + } catch (IOException e) { + + } + } + } + prop.put("blogSize", switchboard.blogDB.size()); + prop.put("blogCommentsSize", switchboard.blogCommentDB.size()); + + // return rewrite properties + return prop; + } +} diff --git a/source/de/anomic/data/blogBoardComments.java b/source/de/anomic/data/blogBoardComments.java new file mode 100644 index 000000000..9ba230de7 --- /dev/null +++ b/source/de/anomic/data/blogBoardComments.java @@ -0,0 +1,353 @@ +// wikiBoard.java +// ------------------------------------- +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2004 +// last major change: 20.07.2004 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + +// This file is contributed by Jan Sandbrink +// based on the Code of wikiBoard.java + +package de.anomic.data; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.TimeZone; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import de.anomic.kelondro.kelondroBase64Order; +import de.anomic.kelondro.kelondroDyn; +import de.anomic.kelondro.kelondroMapObjects; + +public class blogBoardComments { + + public static final int keyLength = 64; + private static final String dateFormat = "yyyyMMddHHmmss"; + private static final int recordSize = 512; + + private static TimeZone GMTTimeZone = TimeZone.getTimeZone("PST"); + private static SimpleDateFormat SimpleFormatter = new SimpleDateFormat(dateFormat); + + private kelondroMapObjects datbase = null; + + public blogBoardComments(File actpath, int bufferkb, long preloadTime) { + new File(actpath.getParent()).mkdir(); + if (datbase == null) { + datbase = new kelondroMapObjects(kelondroDyn.open(actpath, bufferkb / 2 * 0x40, preloadTime, keyLength, recordSize, '_', false, false), 500); + } + } + + public int size() { + return datbase.size(); + } + + public int cacheNodeChunkSize() { + return datbase.cacheNodeChunkSize(); + } + + public int cacheObjectChunkSize() { + return datbase.cacheObjectChunkSize(); + } + + public int[] cacheNodeStatus() { + return datbase.cacheNodeStatus(); + } + + public long[] cacheObjectStatus() { + return datbase.cacheObjectStatus(); + } + + public void close() { + try {datbase.close();} catch (IOException e) {} + } + + private static String dateString(Date date) { + return SimpleFormatter.format(date); + } + + private static String normalize(String key) { + if (key == null) return "null"; + return key.trim().toLowerCase(); + } + + public static String webalize(String key) { + if (key == null) return "null"; + key = key.trim().toLowerCase(); + int p; + while ((p = key.indexOf(" ")) >= 0) + key = key.substring(0, p) + "%20" + key.substring(p +1); + return key; + } + + public String guessAuthor(String ip) { + return wikiBoard.guessAuthor(ip); + } + + public CommentEntry newEntry(String key, byte[] subject, byte[] author, String ip, Date date, byte[] page) { + return new CommentEntry(normalize(key), subject, author, ip, date, page); + } + + public class CommentEntry { + + String key; + Map record; + + public CommentEntry(String nkey, byte[] subject, byte[] author, String ip, Date date, byte[] page) { + record = new HashMap(); + key = nkey; + if (key.length() > keyLength) key = key.substring(0, keyLength); + if(date == null) date = new GregorianCalendar(GMTTimeZone).getTime(); + record.put("date", dateString(date)); + if (subject == null) record.put("subject",""); + else record.put("subject", kelondroBase64Order.enhancedCoder.encode(subject)); + if (author == null) record.put("author",""); + else record.put("author", kelondroBase64Order.enhancedCoder.encode(author)); + if ((ip == null) || (ip.length() == 0)) ip = ""; + record.put("ip", ip); + if (page == null) record.put("page", ""); + else record.put("page", kelondroBase64Order.enhancedCoder.encode(page)); + + wikiBoard.setAuthor(ip, new String(author)); + //System.out.println("DEBUG: setting author " + author + " for ip = " + ip + ", authors = " + authors.toString()); + } + + private CommentEntry(String key, Map record) { + this.key = key; + this.record = record; + if (this.record.get("comments")==null) this.record.put("comments", listManager.arraylist2string(new ArrayList())); + } + + public String key() { + return key; + } + + public byte[] subject() { + String m = (String) record.get("subject"); + if (m == null) return new byte[0]; + byte[] b = kelondroBase64Order.enhancedCoder.decode(m); + if (b == null) return "".getBytes(); + return b; + } + + public Date date() { + try { + String c = (String) record.get("date"); + if (c == null) { + System.out.println("DEBUG - ERROR: date field missing in blogBoard"); + return new Date(); + } + return SimpleFormatter.parse(c); + } catch (ParseException e) { + return new Date(); + } + } + + public String timestamp() { + String c = (String) record.get("date"); + if (c == null) { + System.out.println("DEBUG - ERROR: date field missing in blogBoard"); + return dateString(new Date()); + } + return c; + } + + public byte[] author() { + String m = (String) record.get("author"); + if (m == null) return new byte[0]; + byte[] b = kelondroBase64Order.enhancedCoder.decode(m); + if (b == null) return "".getBytes(); + return b; + } + + public String ip() { + String a = (String) record.get("ip"); + if (a == null) return "127.0.0.1"; + return a; + } + + public byte[] page() { + String m = (String) record.get("page"); + if (m == null) return new byte[0]; + byte[] b = kelondroBase64Order.enhancedCoder.decode(m); + if (b == null) return "".getBytes(); + return b; + } + + } + + public String write(CommentEntry page) { + // writes a new page and returns key + try { + datbase.set(page.key, page.record); + return page.key; + } catch (IOException e) { + return null; + } + } + + public CommentEntry read(String key) { + //System.out.println("DEBUG: read from blogBoardComments"); + return read(key, datbase); + } + + private CommentEntry read(String key, kelondroMapObjects base) { + key = normalize(key); + if (key.length() > keyLength) key = key.substring(0, keyLength); + Map record = base.getMap(key); + if (record == null) return newEntry(key, "".getBytes(), "anonymous".getBytes(), "127.0.0.1", new GregorianCalendar(GMTTimeZone).getTime(), "".getBytes()); + return new CommentEntry(key, record); + } + +/* private CommentEntry read(String key, kelondroMapObjects base) { + key = normalize(key); + if (key.length() > keyLength) key = key.substring(0, keyLength); + CommentEntry record = null; + try { + record = (CommentEntry) base.get(key); + } catch (IOException e) { + e.printStackTrace(); + } + if (record == null) return newEntry(key, "".getBytes(), "anonymous".getBytes(), "127.0.0.1", new GregorianCalendar(GMTTimeZone).getTime(), "".getBytes()); + return new CommentEntry(key, record.record); + }*/ + + public boolean importXML(String input) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(new ByteArrayInputStream(input.getBytes())); + return parseXMLimport(doc); + } catch (ParserConfigurationException e) { + } catch (SAXException e) { + } catch (IOException e) {} + + return false; + } + + private boolean parseXMLimport(Document doc) { + if(!doc.getDocumentElement().getTagName().equals("blog")) + return false; + + NodeList items = doc.getDocumentElement().getElementsByTagName("item"); + if(items.getLength() == 0) + return false; + + for(int i=0;i