/** * Created by IntelliJ IDEA. * User: Rob * Date: Sep 27, 2003 * Time: 9:41:24 AM * To change this template use Options | File Templates. */ package com.diodesoftware.scb.clipboard; import com.diodesoftware.scb.SitePage.Page; import com.diodesoftware.scb.tables.*; import com.diodesoftware.scb.*; import com.diodesoftware.scb.agents.*; import com.diodesoftware.dbmapper.PasswordEncrypter; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.Connection; import java.net.URL; import java.net.MalformedURLException; import org.apache.log4j.Logger; public class DisplayUrlLogic { public static final String ERROR_MESSAGE = "errorMessage"; public static final String DONT_DISPLAY_PASSWORD = "dontDisplayPassword"; public static final String PAGE_SAVED = "pageSaved"; private ClipAgent clipAgent; private Logger log = Logger.getLogger(DisplayUrlLogic.class); public DisplayUrlLogic() { clipAgent = ClipAgent.getInstance(); } public Page getDisplayPage(ClipRequest request, Clip clip) { String extention = request.getExtention(); Page page = null; if (clip.isHtml()) { if (log.isDebugEnabled()) log.debug("Clip is HTML"); if (hasPassword(clip)) { if (log.isDebugEnabled()) log.debug("Clip Has Password"); //View Html with edit button and password page = new Page(request.getSession().getServletContext().getRealPath("textReadOnly" + extention)); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/readOnly_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/readOnly.jsp"); } else { if (log.isDebugEnabled()) log.debug("Clip does not have Password"); //View Html. With edit button (No Password) page = new Page(request.getSession().getServletContext().getRealPath("htmlReadOnlyNP" + extention)); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/readOnly_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/readOnly.jsp"); } } else { if (log.isDebugEnabled()) log.debug("Clip is Text"); if (hasPassword(clip)) { // if (request.getAttribute(PAGE_SAVED) != null) { // To display google ads I need to swtich to HTML view right away! // page = new Page(request.getSession().getServletContext().getRealPath("textReadOnly"+extention)); //} else { if (log.isDebugEnabled()) log.debug("Clip Has password"); if (clip.isViewPassword()) { if (log.isDebugEnabled()) log.debug("View Password"); boolean validPassword = passwordValid(request, clip); if (log.isDebugEnabled()) log.debug("Password valid [" + validPassword + "]"); if (validPassword || request.isOwner()) { if (log.isDebugEnabled()) log.debug("View Password is valid"); page = new Page(request.getSession().getServletContext().getRealPath("text" + extention)); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/edit_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/edit.jsp"); page.setEditable(true); } else { log.debug("View Password is invalid"); page = new Page(request.getSession().getServletContext().getRealPath("enterPassword" + extention)); page.setViewRestricted(true); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/viewRestricted_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/viewRestricted.jsp"); } } else { // Read only edit page. Requiring Password if (passwordValid(request, clip) || request.isOwner()) { page = new Page(request.getSession().getServletContext().getRealPath("text" + extention)); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/edit_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/edit.jsp"); page.setEditable(true); } else { page = new Page(request.getSession().getServletContext().getRealPath("textReadOnly" + extention)); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/readOnly_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/readOnly.jsp"); } } //} } else { if (log.isDebugEnabled()) log.debug("Clip Does not have password"); //Normail Edit page. page = new Page(request.getSession().getServletContext().getRealPath("text" + extention)); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/edit_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/edit.jsp"); page.setEditable(true); } } return page; } public Page getEditPage(ClipRequest request, Clip clip) { Page page = null; String extention = request.getExtention(); if (hasContent(request)) { if (log.isDebugEnabled()) log.debug("Trying to save new content"); if (passwordValid(request, clip)) { if (log.isDebugEnabled()) log.debug("Password is vaild"); if (log.isDebugEnabled()) log.debug("Saving text"); clip.setHtml(false); saveTODb(request, clip); request.setAttribute(ERROR_MESSAGE, "Page saved"); } else { request.setAttribute(ERROR_MESSAGE, "Password is invalid"); } } else { if (passwordValid(request, clip)) { request.setAttribute("showAd", new Boolean(true)); // Return HTML Edit Page. With HTML content in Text Area if (hasPassword(clip)) { page = new Page(request.getSession().getServletContext().getRealPath("text" + extention)); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/edit_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/edit.jsp"); page.setEditable(true); } else { page = new Page(request.getSession().getServletContext().getRealPath("text" + extention)); if (request.isWap()) page.setJsp("/cl1p-inc-rgdm/edit_wap.jsp"); else page.setJsp("/cl1p-inc-rgdm/edit.jsp"); page.setEditable(true); } return page; } else { request.setAttribute(ERROR_MESSAGE, "Password is invalid"); } } request.setAttribute("showAd", new Boolean(true)); return getDisplayPage(request, clip); } private boolean hasContent(ClipRequest request) { String content = request.getParameter(HtmlParam.CONTENT); return content != null; } private boolean hasPassword(Clip clip) { String password = clip.getPassword(); boolean b = (password != null && password.trim().length() > 0); if (log.isDebugEnabled()) log.debug("Has Password [" + b + "] Value [" + password + "]"); return b; } private boolean passwordValid(ClipRequest request, Clip clip) { if (request.isOwner()) return true; // Owners don't have to supply paswords if (log.isDebugEnabled()) log.debug("Checking to see if password is valid."); PasswordMgr pwdMgr = PasswordMgr.getInstance(request); if (pwdMgr.hasKey(clip.getUri())) { if (log.isDebugEnabled()) log.debug("Key stored in manager"); return true; } if (hasPassword(clip)) { String password = (String) request.getParameter(HtmlParam.PASSWORD); if (password != null && password.length() > 0) { password = PasswordEncrypter.encrypt(password); String clipPassword = clip.getPassword(); boolean b = clipPassword.equals(password); if (b) { log.debug("Password is valid."); pwdMgr.addKey(clip.getUri()); } else log.debug("Password invalid. [" + password + "] != [" + clipPassword + "]"); return b; } if (log.isDebugEnabled()) log.debug("Password not provided."); return false; } if (log.isDebugEnabled()) log.debug("No password required. Valid"); return true; } private void saveTODb(ClipRequest request, Clip clip) { /*String content = request.getParameter(HtmlParam.CONTENT); if (content != null) clip.setValue(content); if(clip.getClipType() != Clip.CLIP_TYPE_PLAIN_TEXT){ if(clip.getClipType() == Clip.CLIP_TYPE_RICH_TEXT){ RichText richText = (RichText)DBMapper.getInstance().load(RichText.class, clip.getClipTypeId(), request.getCon()); if(content != null){ richText.setValue(content); DBMapper.getInstance().save(richText, request.getCon()); } } } String password = request.getParameter(HtmlParam.PASSWORD); String passwordVerify = request.getParameter(HtmlParam.PASSWORD_VERIFY); String viewPasswords = request.getParameter(HtmlParam.VIEW_PASSWORD); String keepForString = request.getParameter(HtmlParam.KEEP_FOR); String title = request.getParameter(HtmlParam.TITLE); String rowsStr = request.getParameter(HtmlParam.ROWS); if(rowsStr != null){ int rows = Integer.parseInt(rowsStr); clip.setRows(rows); } String forceSSL = request.getParameter("forceSSL"); if ("YES".equals(forceSSL)) clip.setSecure(true); else clip.setSecure(false); if (title != null) { clip.setTitle(title); } int keepFor = 0; if (keepForString != null) { keepFor = Integer.parseInt(keepForString); clip.setKeepFor(keepFor); Calendar cal = Calendar.getInstance(); if (keepFor == -1) { cal.set(Calendar.YEAR, 1900); } else { cal.add(Calendar.MINUTE, keepFor); } clip.setCleanDate(cal); } boolean viewPassword = viewPasswords != null; if (password != null && passwordVerify != null) { if (!passwordVerify.equals(password)) { request.setAttribute(ERROR_MESSAGE, "Passwords Don't match"); request.setAttribute(DONT_DISPLAY_PASSWORD, new Boolean(true)); password = null; passwordVerify = null; } else { PasswordMgr pwnMgr = PasswordMgr.getInstance(request); pwnMgr.addKey(clip.getUri()); } } if (password != null && password.trim().length() == 0) password = null; if (password != null && passwordVerify != null) clip.setPassword(password); // if (clip.getViewPassword() == false) clip.setViewPassword(viewPassword); clip.setLastEdit(Calendar.getInstance()); clipAgent.saveClip(clip, request.getCon()); ClipSession cSession = ClipSession.getSession(request.getRequest()); User user = cSession.getUser(); if (user != null) { UserAgent.getInstance().addUserClip(clip.getNumber(), user.getNumber(), request.getCon()); } String removePassword = request.getParameter("removePassword"); if ("yes".equals(removePassword)) { clipAgent.removePassword(clip, request.getCon()); PasswordMgr pwdMgr = PasswordMgr.getInstance(request); pwdMgr.removeKey(clip.getUri()); clip.setPassword(null); clip.setViewPassword(false); request.setParameter(HtmlParam.PASSWORD, null); request.setParameter(HtmlParam.PASSWORD_VERIFY, null); } request.setAttribute(PAGE_SAVED, new Boolean(true)); // Extrass saveLinks(clip, request); removeLink(clip, request); String deleteFile = request.getParameter("deleteFile"); if ("yes".equals(deleteFile)) { int fileNumber = 0; try{ fileNumber = Integer.parseInt(request.getParameter("deleteFileNumber")); }catch(NullPointerException e){} CleanerAgent.deleteFile(clip, fileNumber, request.getRequest().getSession() .getServletContext()); } //Replace password in map, it may have changed to encrypted value */ } private void saveLinks(Clip clip, ClipRequest request) { String link = request.getParameter(HtmlParam.ADD_LINK); if (link != null && link.trim().length() > 0) { // Get the ID based on the URL link = getLinkURI(link, request); if (link == null) return; Clip target = clipAgent.loadClip(link, request.getCon()); if (target == null) { // Build a target if it doesnt exist target = new Clip(); target.setUri(link); clipAgent.dbMapper.save(target, request.getCon()); } ClipLink cl = new ClipLink(); cl.setClipId(clip.getNumber()); cl.setToClipId(target.getNumber()); cl.setUri(link); clipAgent.saveClipLink(cl, request.getCon()); } } private void removeLink(Clip clip, ClipRequest request) { String removeLink = request.getParameter(HtmlParam.REMOVE_LINK); if (removeLink != null && removeLink.trim().length() > 0) { int removeId = Integer.parseInt(removeLink); String sql = "Delete from ClipLink where Number = ? and (ClipId = ? or ToClipId = ?)"; Connection con = request.getCon(); try { PreparedStatement prepStmt = con.prepareStatement(sql); prepStmt.setInt(1, removeId); prepStmt.setInt(2, clip.getNumber()); prepStmt.setInt(3, clip.getNumber()); prepStmt.executeUpdate(); prepStmt.close(); } catch (SQLException e) { log.error("Error running SQL [" + sql + "]", e); } } } private String getLinkURI(String link, ClipRequest request) { if (link.startsWith("http://")) { if (link.indexOf("cl1p.net") != -1) { // Find the key for this URL try { URL u = new URL(link); link = u.getPath(); } catch (MalformedURLException e) { request.setAttribute(ERROR_MESSAGE, "URL is not valid"); return null; } } else { // Not allowed request.setAttribute(ERROR_MESSAGE, "Only other cl1ps can be added here."); return null; } } if (!link.startsWith("/")) { link = "/" + link; } if (!link.endsWith("/")) link += "/"; return link; } }