package cn.jcenterhome.service; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.jcenterhome.util.BeanFactory; import cn.jcenterhome.util.Common; import cn.jcenterhome.util.JavaCenterHome; import cn.jcenterhome.util.Serializer; public class BlogService { private DataBaseService dataBaseService = (DataBaseService) BeanFactory.getBean("dataBaseService"); public String blogBBCode(String message) { if (Common.empty(message)) { return message; } Matcher matcher = Pattern.compile("(?i)\\[flash\\=?(media|real)*\\](.+?)\\[\\/flash\\]").matcher( message); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, blogFlash(matcher.group(2), matcher.group(1))); } matcher.appendTail(sb); message= sb.toString(); return message; } private String blogFlash(String swfURL, String type) { String html = null; String width = "520"; String height = "390"; if ("media".equals(type)) { html = "<object classid=\"clsid:6bf52a52-394a-11d3-b153-00c04f79faa6\" width=\"" + width + "\" height=\"" + height + "\">" + "<param name=\"autostart\" value=\"0\">" + "<param name=\"url\" value=\"" + swfURL + "\">" + "<embed autostart=\"false\" src=\"" + swfURL + "\" type=\"video/x-ms-wmv\" width=\"" + width + "\" height=\"" + height + "\" controls=\"imagewindow\" console=\"cons\"></embed>" + "</object>"; } else if ("real".equals(type)) { html = "<object classid=\"clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa\" width=\"" + width + "\" height=\"" + height + "\">" + "<param name=\"autostart\" value=\"0\">" + "<param name=\"src\" value=\"" + swfURL + "\">" + "<param name=\"controls\" value=\"Imagewindow,controlpanel\">" + "<param name=\"console\" value=\"cons\">" + "<embed autostart=\"false\" src=\"" + swfURL + "\" type=\"audio/x-pn-realaudio-plugin\" width=\"" + width + "\" height=\"" + height + "\" controls=\"controlpanel\" console=\"cons\"></embed>" + "</object>"; } else { html = "<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"" + width + "\" height=\"" + height + "\">" + "<param name=\"movie\" value=\"" + swfURL + "\">" + "<param name=\"allowscriptaccess\" value=\"always\">" + "<embed src=\"" + swfURL + "\" type=\"application/x-shockwave-flash\" width=\"" + width + "\" height=\"" + height + "\" allowfullscreen=\"true\" allowscriptaccess=\"always\"></embed>" + "</object>"; } return html; } public Map<String, Object> blogPost(HttpServletRequest request, HttpServletResponse response, Map<String, Object> olds) throws Exception { Map<String, Object> sGlobal = (Map<String, Object>) request.getAttribute("sGlobal"); Map<String, Object> sConfig = (Map<String, Object>) request.getAttribute("sConfig"); Map<String, Object> sGlobal_bak = null; boolean isSelf = true; if (olds.get("uid") != null && olds.get("uid") != sGlobal.get("supe_uid")) { isSelf = false; sGlobal_bak = new HashMap<String, Object>(sGlobal); sGlobal.put("supe_uid", olds.get("uid")); sGlobal.put("supe_username", Common.addSlashes((String) olds.get("username"))); } String subject = request.getParameter("subject").trim(); String message = request.getParameter("message").trim(); String tag = request.getParameter("tag").trim(); int friend = Common.intval(request.getParameter("friend")); String targetIds = ""; String password = ""; int classId = 0; if (subject.length() != 0) { subject = Common.getStr(subject, 80, true, true, true, 0, 0, request, response); } else { subject = Common.sgmdate(request, "yyyy-MM-dd", (Integer) sGlobal.get("timestamp")); } if (sGlobal.get("mobile") != null) { message = Common.getStr(message, 0, true, false, true, 1, 0, request, response); } else { message = Common.getStr(checkHtml(request, response, message), 0, true, false, true, 0, 1, request, response); message = message.replaceAll("(?i)<div></div>", "").replace("(?i)<a\\s+href=\"([^>]+?)\">", "<a href=\"$1\" target=\"_blank\">"); } if (tag.length() != 0) { tag = Common.getStr((String) Common.sHtmlSpecialChars(tag), 500, true, true, true, 0, 0, request, response); } if (friend == 2) { String[] names = request.getParameter("target_names") == null ? null : request.getParameter( "target_names").replaceAll(Common.getMessage(request, "cp_tab_space"), " ").split(" "); if (!Common.empty(names)) { List<String> uids = dataBaseService.executeQuery("SELECT uid FROM " + JavaCenterHome.getTableName("space") + " WHERE username IN (" + Common.sImplode(names) + ")", 1); if (uids.size() == 0) { friend = 3; } else { targetIds = Common.implode(uids, ","); } } } else if (friend == 4) { password = request.getParameter("password").trim(); if (password.equals("")) { friend = 0; } } String className = null; String classIdStr = request.getParameter("classid"); if (!Common.empty(classIdStr)) { if (classIdStr.startsWith("new:")) { className = (String) Common.sHtmlSpecialChars(classIdStr.substring(4).trim()); if (className.length() != 0) { className = Common.getStr(className, 0, true, true, true, 0, 0, request, response); Map<String, Object> whereArr = new HashMap<String, Object>(); whereArr.put("classname", className); whereArr.put("uid", sGlobal.get("supe_uid")); classId = Common.intval(Common.getCount("class", whereArr, "classid")); if (classId == 0) { Map<String, Object> setArr = new HashMap<String, Object>(); setArr.put("classname", className); setArr.put("uid", sGlobal.get("supe_uid")); setArr.put("dateline", sGlobal.get("timestamp")); classId = dataBaseService.insertTable("class", setArr, true, false); } } } else if (!classIdStr.equals(String.valueOf(olds.get("classid")))) { classId = Common.intval(classIdStr); } else { classId = (Integer) olds.get("classid"); } } if (classId != 0 && Common.empty(className)) { Map<String, Object> whereArr = new HashMap<String, Object>(); whereArr.put("classid", classId); whereArr.put("uid", sGlobal.get("supe_uid")); if (Common.empty(Common.getCount("class", whereArr, "classname"))) { classId = 0; } } Map<String, Object> blogArr = new HashMap<String, Object>(); blogArr.put("subject", subject); blogArr.put("classid", classId); blogArr.put("friend", friend); blogArr.put("password", password); blogArr.put("noreply", request.getParameter("noreply") == null ? 0 : 1); Map<Integer, String> picIdForm = new HashMap<Integer, String>(); List<Integer> picIds = new ArrayList<Integer>(); for (Enumeration paramNames = request.getParameterNames(); paramNames.hasMoreElements();) { String key = (String) paramNames.nextElement(); if (key.startsWith("picids[")) { int picId = Integer.parseInt(key.replaceAll("picids\\[(\\d+)\\]", "$1")); picIdForm.put(picId, request.getParameter(key)); picIds.add(picId); } } Map uploads = new HashMap(); String titlePic = null; if (picIdForm.size() != 0) { List<Map<String, Object>> pictures = dataBaseService.executeQuery("SELECT * FROM " + JavaCenterHome.getTableName("pic") + " WHERE picid IN (" + Common.sImplode(picIds) + ") AND uid='" + sGlobal.get("supe_uid") + "'"); Map<String, Object> pic = null; int picturesSize = pictures.size(); for (int i = 0; i < picturesSize; i++) { pic = pictures.get(i); if (titlePic == null && !Common.empty(pic.get("thumb"))) { titlePic = pic.get("filepath") + ".thumb.jpg"; blogArr.put("picflag", Common.empty(pic.get("remote")) ? 1 : 2); } int picId = (Integer) pic.get("picid"); uploads.put(picIdForm.get(picId), pic); } if (titlePic == null && pic != null) { titlePic = (String) pic.get("filepath"); blogArr.put("picflag", Common.empty(pic.get("remote")) ? 1 : 2); } } if (uploads.size() > 0) { String regex="(?i)<img.*src=\'(.+?)\'.*?_jchome_localimg_([0-9]+).+?src=\"(.+?)\""; if(Common.matches(message, regex)){ message=message.replaceAll(regex, "<IMG id=_jchome_localimg_$2 src=\"$1\""); }else if(Common.matches(message, regex="(?i)<img\\s.*?_jchome_localimg_([0-9]+).+?src=\'(.+?)\'.+?src=\"(.+?)\"")){ message=message.replaceAll(regex, "<IMG id=_jchome_localimg_$1 src=\"$2\""); }else{ Matcher m = Pattern.compile("(?i)\\[local\\](\\d+)\\[\\/local\\]").matcher(message); while (m.find()) { String id=m.group(1); if(uploads.get(id)!=null){ message=message.replace("[local]"+id+"[/local]", "<IMG id=_jchome_localimg_"+id+" src=\"img_"+id+"\">"); } } } Matcher m = Pattern.compile("(?i)<img\\s.*?_jchome_localimg_([0-9]+).+?src=\"(.+?)\"").matcher( message); List<String> matches1 = new ArrayList<String>(); List<String> matches2 = new ArrayList<String>(); while (m.find()) { matches1.add(m.group(1)); matches2.add(m.group(2)); } int matchesLen = matches1.size(); if (matchesLen != 0) { for (int i = 0; i < matchesLen; i++) { String index = matches1.get(i); Map value = (Map) uploads.get(index); if (!Common.empty(value)) { String search = matches2.get(i); String idSearch = "_jchome_localimg_" + index; String replace = Common.pic_get(sConfig, (String) value.get("filepath"), (Integer) value.get("thumb"), (Integer) value.get("remote"), false); message = message.replace(matches2.get(i), replace); message = message.replace(idSearch, "jchomelocalimg[]"); uploads.remove(index); } } } for (Iterator it = uploads.keySet().iterator(); it.hasNext();) { String key = (String) it.next(); Map value = (Map) uploads.get(key); String picUrl = Common.pic_get(sConfig, (String) value.get("filepath"), (Integer) value .get("thumb"), (Integer) value.get("remote"), false); message += "<div class=\"jchome-message-pic\"><img src=\"" + picUrl + "\"><p>" + value.get("title") + "</p></div>"; } } String checkMessage = message.replaceAll("(?is)(<div>|</div>|\\s| |<br>|<p>|</p>)+", ""); if (checkMessage.length() == 0) return null; message = Common.addSlashes(message); if (titlePic == null) { titlePic = getMessagePic(message); blogArr.put("picflag", 0); } blogArr.put("pic", titlePic); if (Common.checkPerm(request, response, "manageblog")) { blogArr.put("hot", Common.intval(request.getParameter("hot"))); } CpService cpService = (CpService) BeanFactory.getBean("cpService"); int blogId = 0; if (olds.get("blogid") != null) { blogId = (Integer) olds.get("blogid"); Map<String, Object> whereData = new HashMap<String, Object>(); whereData.put("blogid", blogId); dataBaseService.updateTable("blog", blogArr, whereData); blogArr.put("uid", olds.get("uid")); blogArr.put("username", olds.get("username")); } else { blogArr.put("topicid", cpService.checkTopic(request, Common.intval(request .getParameter("topicid")), "blog")); blogArr.put("uid", sGlobal.get("supe_uid")); blogArr.put("username", sGlobal.get("supe_username")); blogArr.put("dateline", Common.empty(request.getParameter("dateline")) ? sGlobal.get("timestamp") : request.getParameter("dateline")); blogId = dataBaseService.insertTable("blog", blogArr, true, false); } blogArr.put("blogid", blogId); Map<String, Object> fieldArr = new HashMap<String, Object>(); fieldArr.put("message", message); fieldArr.put("postip", Common.getOnlineIP(request)); fieldArr.put("target_ids", targetIds); String oldTagStr = Common.addSlashes(Common.empty(olds.get("tag")) ? "" : Common.implode(Serializer .unserialize((String) olds.get("tag"), false), " ")); if (!oldTagStr.equals(tag)) { if (!Common.empty(olds.get("tag"))) { List<String> oldTags = dataBaseService.executeQuery("SELECT tagid FROM " + JavaCenterHome.getTableName("tagblog") + " WHERE blogid='" + blogId + "'", 1); if (oldTags.size() > 0) { dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("tag") + " SET blognum=blognum-1 WHERE tagid IN (" + Common.sImplode(oldTags) + ")"); dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("tagblog") + " WHERE blogid='" + blogId + "'"); } } Map<Integer, String> tagArr = tagBatch(sGlobal, blogId, tag); fieldArr.put("tag", Common.empty(tagArr) ? "" : Common.addSlashes(Serializer.serialize(tagArr))); } if (!Common.empty(olds)) { Map<String, Object> whereData = new HashMap<String, Object>(); whereData.put("blogid", blogId); dataBaseService.updateTable("blogfield", fieldArr, whereData); } else { fieldArr.put("blogid", blogId); fieldArr.put("uid", blogArr.get("uid")); fieldArr.put("related", ""); fieldArr.put("hotuser", ""); dataBaseService.insertTable("blogfield", fieldArr, false, false); } if (isSelf) { if (!Common.empty(olds)) { dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("space") + " SET updatetime='" + sGlobal.get("timestamp") + "' WHERE uid='" + sGlobal.get("supe_uid") + "'"); } else { String blogNumSql = null; Map<String, Object> space = (Map<String, Object>) request.getAttribute("space"); if (Common.empty(space.get("blognum"))) { Map<String, Object> whereArr = new HashMap<String, Object>(); whereArr.put("uid", space.get("uid")); space.put("blognum", Common.getCount("blog", whereArr, null)); blogNumSql = "blognum=" + space.get("blognum"); } else { blogNumSql = "blognum=blognum+1"; } Map<String, Integer> reward = Common.getReward("publishblog", false, 0, "", true, request, response); dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("space") + " SET " + blogNumSql + ", lastpost='" + sGlobal.get("timestamp") + "', updatetime='" + sGlobal.get("timestamp") + "', credit=credit+" + reward.get("credit") + ", experience=experience+" + reward.get("experience") + " WHERE uid='" + sGlobal.get("supe_uid") + "'"); cpService.updateStat(request, "blog", false); } } if (!Common.empty(request.getParameter("makefeed"))) { FeedService feedService = (FeedService) BeanFactory.getBean("feedService"); feedService.feedPublish(request, response, blogId, "blogid", Common.empty(olds) ? true : false); } if (Common.empty(olds) && !Common.empty(blogArr.get("topicid"))) { cpService.topicJoin(request, (Integer) blogArr.get("topicid"), (Integer) sGlobal.get("supe_uid"), (String) sGlobal.get("supe_username")); } if (sGlobal_bak != null) { sGlobal = new HashMap<String, Object>(sGlobal_bak); } return blogArr; } private Map<Integer, String> tagBatch(Map<String, Object> sGlobal, int blogId, String tags) { Map<Integer, String> tagArr = new HashMap<Integer, String>(); Set<String> tagNames = new HashSet<String>(); if (!Common.empty(tags)) { String[] tmp = tags.split(" "); for (String tagName : tmp) { tagNames.add(tagName); } } else { return tagArr; } Map<String, Object> vtags = new HashMap<String, Object>(); List<Map<String, Object>> tagList = dataBaseService.executeQuery("SELECT tagid, tagname, close FROM " + JavaCenterHome.getTableName("tag") + " WHERE tagname IN (" + Common.sImplode(tagNames) + ")"); for (Map<String, Object> value : tagList) { String vkey = Common.md5(Common.addSlashes((String) value.get("tagname"))); vtags.put(vkey, value); } List<Integer> updateTagIds = new ArrayList<Integer>(); for (String tagName : tagNames) {//"^([\\x7f-\\xff_-]|\\w){3,20}$" if (!Common.matches(tagName, "^([\u2E80-\u9FFF]+|\\w){3,20}$")) { continue; } String vkey = Common.md5(tagName); if (Common.empty(vtags.get(vkey))) { Map<String, Object> setArr = new HashMap<String, Object>(); setArr.put("tagname", tagName); setArr.put("uid", sGlobal.get("supe_uid")); setArr.put("dateline", sGlobal.get("timestamp")); setArr.put("blognum", 1); int tagId = dataBaseService.insertTable("tag", setArr, true, false); tagArr.put(tagId, tagName); } else { Map<String, Object> t = (Map) vtags.get(vkey); if (Common.empty(t.get("close"))) { int tagId = (Integer) t.get("tagid"); updateTagIds.add(tagId); tagArr.put(tagId, tagName); } } } if (updateTagIds.size() > 0) { dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("tag") + " SET blognum=blognum+1 WHERE tagid IN (" + Common.sImplode(updateTagIds) + ")"); } Set<Integer> tagIds = tagArr.keySet(); List<String> inserts = new ArrayList<String>(); for (int tagId : tagIds) { inserts.add("('" + tagId + "','" + blogId + "')"); } if (inserts.size() > 0) { dataBaseService.execute("REPLACE INTO " + JavaCenterHome.getTableName("tagblog") + " (tagid,blogid) VALUES " + Common.implode(inserts, ",")); } return tagArr; } public String getMessagePic(String message) { String pic = ""; message = Common.stripSlashes(message); message = message.replaceAll("(?is)<img src=\".*?image/face/(.+?).gif\".*?>\\s*", ""); Matcher m = Pattern.compile("(?i)src=[\"\']*([^>\\s]{25,105})\\.(jpg|gif|png)").matcher(message); if (m.find()) { pic = m.group(1) + "." + m.group(2); } return Common.addSlashes(pic); } public String checkHtml(HttpServletRequest request, HttpServletResponse response, String html) { html = Common.stripSlashes(html); if (!Common.checkPerm(request, response, "allowhtml")) { Pattern p = Pattern.compile("(?is)<([^<]+)>"); Matcher m = p.matcher(html); Set<String> values = new HashSet<String>(); while (m.find()) { values.add(m.group(1)); } String allowTags = "img|a|font|div|table|tbody|caption|tr|td|th|br|p|b|strong|i|u|em|span|ol|ul|li|blockquote|object|param|embed"; html = html.replace("<", "<"); html = html.replace(">", ">"); for (String replace : values) { String search = "<" + replace + ">"; replace = (String) Common.sHtmlSpecialChars(replace); replace = replace.replace("\\\\", "."); replace = replace.replace("/*", "/."); replace = replace.replaceAll("(?i)(javascript|script|eval|behaviour|expression)", "."); replace = replace.replaceAll("(?i)(\\s+|"|')on", " ."); if (!Common.matches(replace, "(?is)^[/|\\s]?(" + allowTags + ")(\\s+|$)")) { replace = ""; } replace=Common.empty(replace)? "" :"<"+replace.replace(""", "\"")+">"; html = html.replace(search, replace); } } html = Common.addSlashes(html); return html; } public List<Map<String, Object>> deleteBlogs(HttpServletRequest request, HttpServletResponse response, Integer... blogIds) { Map<String, Object> sGlobal = (Map<String, Object>) request.getAttribute("sGlobal"); boolean allowManage = Common.checkPerm(request, response, "manageblog"); boolean manageBatch = Common.checkPerm(request, response, "managebatch"); List<Map<String, Object>> blogs = dataBaseService .executeQuery("SELECT * FROM " + JavaCenterHome.getTableName("blog") + " WHERE blogid IN (" + Common.sImplode(blogIds) + ")"); int delnum = 0; boolean isBlogEmpty = true; for(Map<String, Object> value : blogs) { if(allowManage || value.get("uid").equals(sGlobal.get("supe_uid"))) { isBlogEmpty = false; if(!manageBatch && !value.get("uid").equals(sGlobal.get("supe_uid"))) { delnum++; } } } if(isBlogEmpty || (!manageBatch && delnum > 1)) { return null; } Map<String, Integer> reward = Common.getReward("delblog", false, 0, "", true, request, response); List<Object> delBlogIds = new ArrayList<Object>(); for (Map<String, Object> value : blogs) { delBlogIds.add(value.get("blogid")); if (allowManage && value.get("uid") != sGlobal.get("supe_uid")) { dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("space") + " SET credit=credit-" + reward.get("credit") + ",experience=experience-" + reward.get("experience") + " WHERE uid='" + value.get("uid") + "'"); } List<String> tags = dataBaseService.executeQuery("SELECT tagid FROM " + JavaCenterHome.getTableName("tagblog") + " WHERE blogid='" + value.get("blogid") + "'", 1); if (tags.size() > 0) { dataBaseService.executeUpdate("UPDATE " + JavaCenterHome.getTableName("tag") + " SET blognum=blognum-1 WHERE tagid IN (" + Common.sImplode(tags) + ")"); dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("tagblog") + " WHERE blogid='" + value.get("blogid") + "'"); } } dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("comment") + " WHERE id IN (" + Common.sImplode(delBlogIds) + ") AND idtype='blogid'"); dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("report") + " WHERE id IN (" + Common.sImplode(delBlogIds) + ") AND idtype='blogid'"); dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("feed") + " WHERE id IN (" + Common.sImplode(delBlogIds) + ") AND idtype='blogid'"); dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("clickuser") + " WHERE id IN (" + Common.sImplode(delBlogIds) + ") AND idtype='blogid'"); dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("blog") + " WHERE blogid IN(" + Common.sImplode(delBlogIds) + ")"); dataBaseService.executeUpdate("DELETE FROM " + JavaCenterHome.getTableName("blogfield") + " WHERE blogid IN (" + Common.sImplode(delBlogIds) + ")"); return blogs; } }