Rewrote comment form controllers and templates in FreeMarker.
This commit is contained in:
parent
ae01a03122
commit
f88a77d307
24 changed files with 723 additions and 208 deletions
|
@ -849,6 +849,17 @@
|
||||||
<url-pattern>/contact</url-pattern>
|
<url-pattern>/contact</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- TEMPORARY - for comparison with new version -->
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>CommentsController</servlet-name>
|
||||||
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.CommentsController</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>CommentsController</servlet-name>
|
||||||
|
<url-pattern>/comments-old</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
<!-- end TEMPORARY -->
|
||||||
|
|
||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>JSON Service</servlet-name>
|
<servlet-name>JSON Service</servlet-name>
|
||||||
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.JSONServlet</servlet-class>
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.JSONServlet</servlet-class>
|
||||||
|
@ -924,11 +935,27 @@
|
||||||
<url-pattern>/dwr/*</url-pattern>
|
<url-pattern>/dwr/*</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- Deprecated servlet (still used in Datastar) - retain temporarily for testing and comparison. -->
|
||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>sendmail</servlet-name>
|
<servlet-name>sendmail</servlet-name>
|
||||||
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.ContactMailServlet</servlet-class>
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.ContactMailServlet</servlet-class>
|
||||||
<load-on-startup>5</load-on-startup>
|
<load-on-startup>5</load-on-startup>
|
||||||
</servlet>
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>sendmail</servlet-name>
|
||||||
|
<url-pattern>/sendmail</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
<!-- end deprecated servlet -->
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>sendMail</servlet-name>
|
||||||
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.freemarker.ContactMailController</servlet-class>
|
||||||
|
<load-on-startup>5</load-on-startup>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>sendMail</servlet-name>
|
||||||
|
<url-pattern>/sendMail</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>mailusers</servlet-name>
|
<servlet-name>mailusers</servlet-name>
|
||||||
|
@ -1046,10 +1073,6 @@
|
||||||
<servlet-mapping>
|
<servlet-mapping>
|
||||||
<servlet-name>fetch</servlet-name>
|
<servlet-name>fetch</servlet-name>
|
||||||
<url-pattern>/fetch</url-pattern>
|
<url-pattern>/fetch</url-pattern>
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>sendmail</servlet-name>
|
|
||||||
<url-pattern>/sendmail</url-pattern>
|
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
<servlet-mapping>
|
<servlet-mapping>
|
||||||
<servlet-name>mailusers</servlet-name>
|
<servlet-name>mailusers</servlet-name>
|
||||||
|
|
|
@ -57,7 +57,7 @@ public class CommentsController extends VitroHttpServlet{
|
||||||
}
|
}
|
||||||
|
|
||||||
request.setAttribute("siteName",portalBean.getAppName());
|
request.setAttribute("siteName",portalBean.getAppName());
|
||||||
request.setAttribute("scripts","/js/commentsForm.js");
|
request.setAttribute("scripts","/js/commentsForm.jsp");
|
||||||
|
|
||||||
if (request.getHeader("Referer") == null)
|
if (request.getHeader("Referer") == null)
|
||||||
request.getSession().setAttribute("commentsFormReferer","none");
|
request.getSession().setAttribute("commentsFormReferer","none");
|
||||||
|
|
|
@ -24,8 +24,8 @@ public class AboutController extends FreeMarkerHttpServlet {
|
||||||
body.put("aboutText", portal.getAboutText());
|
body.put("aboutText", portal.getAboutText());
|
||||||
body.put("acknowledgeText", portal.getAcknowledgeText());
|
body.put("acknowledgeText", portal.getAcknowledgeText());
|
||||||
|
|
||||||
String templateName = "body/about.ftl";
|
String bodyTemplate = "about.ftl";
|
||||||
return mergeBodyToTemplate(templateName, body);
|
return mergeBodyToTemplate(bodyTemplate, body);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,8 @@ public class BrowseController extends FreeMarkerHttpServlet {
|
||||||
Map body = new HashMap();
|
Map body = new HashMap();
|
||||||
|
|
||||||
// Set main page template attributes specific to this page
|
// Set main page template attributes specific to this page
|
||||||
root.put("contentClass", "siteMap");
|
// But the template should control this! Try putting in a div inside the content.
|
||||||
|
//root.put("contentClass", "siteMap");
|
||||||
|
|
||||||
if( vreq.getParameter("clearcache") != null ) //mainly for debugging
|
if( vreq.getParameter("clearcache") != null ) //mainly for debugging
|
||||||
clearGroupCache();
|
clearGroupCache();
|
||||||
|
@ -99,8 +100,8 @@ public class BrowseController extends FreeMarkerHttpServlet {
|
||||||
body.put("classGroups", vcgroups);
|
body.put("classGroups", vcgroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
String templateName = "body/classGroups.ftl";
|
String bodyTemplate = "classGroups.ftl";
|
||||||
return mergeBodyToTemplate(templateName, body);
|
return mergeBodyToTemplate(bodyTemplate, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroy(){
|
public void destroy(){
|
||||||
|
|
|
@ -3,17 +3,23 @@
|
||||||
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
|
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.RequestDispatcher;
|
import javax.servlet.RequestDispatcher;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean;
|
import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean;
|
||||||
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
||||||
import edu.cornell.mannlib.vitro.webapp.controller.ContactMailServlet;
|
import edu.cornell.mannlib.vitro.webapp.controller.ContactMailServlet;
|
||||||
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
||||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.utils.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller for comments ("contact us") page
|
* Controller for comments ("contact us") page
|
||||||
|
@ -21,69 +27,61 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
*/
|
*/
|
||||||
public class CommentFormController extends FreeMarkerHttpServlet {
|
public class CommentFormController extends FreeMarkerHttpServlet {
|
||||||
|
|
||||||
public void doPost(HttpServletRequest request, HttpServletResponse response)
|
private static final long serialVersionUID = 1L;
|
||||||
throws ServletException, IOException {
|
private static final Log log = LogFactory.getLog(CommentFormController.class.getName());
|
||||||
doGet(request, response);
|
|
||||||
|
protected String getTitle() {
|
||||||
|
return appName + " Feedback Form";
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doGet( HttpServletRequest request, HttpServletResponse response )
|
protected String getBody() {
|
||||||
throws IOException, ServletException {
|
|
||||||
super.doGet(request,response);
|
Map<String, Object> body = new HashMap<String, Object>();
|
||||||
VitroRequest vreq = new VitroRequest(request);
|
String bodyTemplate;
|
||||||
try {
|
|
||||||
//this try block passes any errors to error.jsp
|
|
||||||
if (!ContactMailServlet.isSmtpHostConfigured()) {
|
if (!ContactMailServlet.isSmtpHostConfigured()) {
|
||||||
request.setAttribute("title", "Comments and Feedback Form");
|
body.put("errorMessage",
|
||||||
request.setAttribute("bodyJsp", "/contact_err.jsp");// <<< this is where the body gets set
|
"This application has not yet been configured to send mail. " +
|
||||||
request.setAttribute("ERR","This application has not yet been configured to send mail -- " +
|
"An smtp host has not been specified in the configuration properties file.");
|
||||||
"smtp host has not been specified in the configuration properties file.");
|
bodyTemplate = "commentForm/error.ftl";
|
||||||
RequestDispatcher errd = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
|
||||||
errd.forward(request, response);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (StringUtils.isEmpty(portal.getContactMail())) {
|
||||||
|
body.put("errorMessage",
|
||||||
|
"The site administrator has not configured an email address to receive the form submission.");
|
||||||
|
bodyTemplate = "commentForm/error.ftl";
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
|
||||||
ApplicationBean appBean = vreq.getAppBean();
|
ApplicationBean appBean = vreq.getAppBean();
|
||||||
Portal portalBean=vreq.getPortal();
|
int portalId = portal.getPortalId();
|
||||||
|
|
||||||
|
String portalType = null;
|
||||||
if ( (appBean.getMaxSharedPortalId()-appBean.getMinSharedPortalId()) > 1
|
if ( (appBean.getMaxSharedPortalId()-appBean.getMinSharedPortalId()) > 1
|
||||||
&& ( (portalBean.getPortalId() >= appBean.getMinSharedPortalId()
|
&& ( (portalId >= appBean.getMinSharedPortalId()
|
||||||
&& portalBean.getPortalId() <= appBean.getMaxSharedPortalId() )
|
&& portalId <= appBean.getMaxSharedPortalId() )
|
||||||
|| portalBean.getPortalId() == appBean.getSharedPortalFlagNumeric() )
|
|| portalId == appBean.getSharedPortalFlagNumeric() ) ) {
|
||||||
) {
|
portalType = "CALSResearch";
|
||||||
request.setAttribute("portalType","CALSResearch");
|
} else if (appName.equalsIgnoreCase("CALS Impact")) {
|
||||||
} else
|
portalType = "CALSImpact";
|
||||||
if (portalBean.getAppName().equalsIgnoreCase("CALS Impact")){
|
} else if (appName.equalsIgnoreCase("VIVO")){
|
||||||
request.setAttribute("portalType", "CALSImpact");
|
portalType = "VIVO";
|
||||||
} else if (portalBean.getAppName().equalsIgnoreCase("VIVO")) {
|
|
||||||
request.setAttribute("portalType", "VIVO");
|
|
||||||
} else {
|
} else {
|
||||||
request.setAttribute("portalType", "clone");
|
portalType = "clone";
|
||||||
|
}
|
||||||
|
body.put("portalType", portalType);
|
||||||
|
|
||||||
|
// Not used in template. Is it used in processing the form?
|
||||||
|
if (vreq.getHeader("Referer") == null) {
|
||||||
|
vreq.getSession().setAttribute("commentsFormReferer","none");
|
||||||
|
} else {
|
||||||
|
vreq.getSession().setAttribute("commentsFormReferer",vreq.getHeader("Referer"));
|
||||||
}
|
}
|
||||||
|
|
||||||
request.setAttribute("siteName",portalBean.getAppName());
|
bodyTemplate = "commentForm/form.ftl";
|
||||||
request.setAttribute("scripts","/js/commentsForm.js");
|
}
|
||||||
|
|
||||||
if (request.getHeader("Referer") == null)
|
return mergeBodyToTemplate(bodyTemplate, body);
|
||||||
request.getSession().setAttribute("commentsFormReferer","none");
|
|
||||||
else
|
|
||||||
request.getSession().setAttribute("commentsFormReferer",request.getHeader("Referer"));
|
|
||||||
|
|
||||||
|
|
||||||
request.setAttribute("portalId",Integer.valueOf(portalBean.getPortalId()));
|
|
||||||
|
|
||||||
request.setAttribute("title", portalBean.getAppName()+" Comments and Feedback Form");
|
|
||||||
request.setAttribute("bodyJsp", "/commentsForm.jsp");// <<< this is where the body gets set
|
|
||||||
request.setAttribute("portalBean",portalBean);
|
|
||||||
|
|
||||||
RequestDispatcher rd =
|
|
||||||
request.getRequestDispatcher(Controllers.BASIC_JSP);
|
|
||||||
rd.forward(request, response);
|
|
||||||
|
|
||||||
} catch (Throwable e) {
|
|
||||||
// This is how we use an error.jsp
|
|
||||||
//it expects javax.servlet.jsp.jspException to be set to the
|
|
||||||
//exception so that it can display the info out of that.
|
|
||||||
request.setAttribute("javax.servlet.jsp.jspException", e);
|
|
||||||
RequestDispatcher rd = request.getRequestDispatcher("/error.jsp");
|
|
||||||
rd.include(request, response);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,378 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
|
||||||
|
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import javax.mail.Message;
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import javax.mail.SendFailedException;
|
||||||
|
import javax.mail.Session;
|
||||||
|
import javax.mail.Transport;
|
||||||
|
import javax.mail.internet.AddressException;
|
||||||
|
import javax.mail.internet.InternetAddress;
|
||||||
|
import javax.mail.internet.MimeMessage;
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.ConfigurationProperties;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
||||||
|
|
||||||
|
public class ContactMailController extends FreeMarkerHttpServlet {
|
||||||
|
private static final Logger LOG = Logger.getLogger(ContactMailController.class);
|
||||||
|
|
||||||
|
private final static String CONFIRM_PAGE = "/thankyou.jsp";
|
||||||
|
private final static String ERR_PAGE = "/contact_err.jsp";
|
||||||
|
private final static String SPAM_MESSAGE = "Your message was flagged as spam.";
|
||||||
|
private final static String EMAIL_BACKUP_FILE_PATH = "/WEB-INF/LatestMessage.html";
|
||||||
|
|
||||||
|
private final static String WEB_USERNAME_PARAM = "webusername";
|
||||||
|
private final static String WEB_USEREMAIL_PARAM = "webuseremail";
|
||||||
|
private final static String COMMENTS_PARAM = "s34gfd88p9x1";
|
||||||
|
|
||||||
|
private static String smtpHost = null;
|
||||||
|
|
||||||
|
public void init(ServletConfig servletConfig) throws javax.servlet.ServletException {
|
||||||
|
super.init(servletConfig);
|
||||||
|
smtpHost = getSmtpHostFromProperties();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isSmtpHostConfigured() {
|
||||||
|
if( smtpHost==null || smtpHost.equals("")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getSmtpHostFromProperties() {
|
||||||
|
String host = ConfigurationProperties.getProperty("Vitro.smtpHost");
|
||||||
|
if (host != null && !host.equals("")) {
|
||||||
|
LOG.debug("Found Vitro.smtpHost value of " + host);
|
||||||
|
} else {
|
||||||
|
LOG.debug("No Vitro.smtpHost specified");
|
||||||
|
}
|
||||||
|
return (host != null && host.length() > 0) ? host : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getTitle() {
|
||||||
|
return appName + " Feedback Form";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getBody() {
|
||||||
|
|
||||||
|
Map<String, Object> body = new HashMap<String, Object>();
|
||||||
|
String bodyTemplate = null;
|
||||||
|
|
||||||
|
String statusMsg = null; // holds the error status
|
||||||
|
|
||||||
|
if (!isSmtpHostConfigured()) {
|
||||||
|
body.put("errorMessage",
|
||||||
|
"This application has not yet been configured to send mail. " +
|
||||||
|
"An smtp host has not been specified in the configuration properties file.");
|
||||||
|
bodyTemplate = "commentForm/error.ftl";
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
|
||||||
|
String webusername = vreq.getParameter(WEB_USERNAME_PARAM);
|
||||||
|
String webuseremail = vreq.getParameter(WEB_USEREMAIL_PARAM);
|
||||||
|
String comments = vreq.getParameter(COMMENTS_PARAM);
|
||||||
|
|
||||||
|
String validationMessage = validateInput(webusername, webuseremail,
|
||||||
|
comments);
|
||||||
|
if (validationMessage != null) {
|
||||||
|
// rjy7 We should reload the form, not go to the error page!
|
||||||
|
body.put("errorMessage",
|
||||||
|
"Invalid submission");
|
||||||
|
bodyTemplate = "commentForm/error.ftl";
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
webusername = webusername.trim();
|
||||||
|
webuseremail = webuseremail.trim();
|
||||||
|
comments = comments.trim();
|
||||||
|
|
||||||
|
String spamReason = null;
|
||||||
|
|
||||||
|
String originalReferer = (String) vreq.getSession().getAttribute("commentsFormReferer");
|
||||||
|
if (originalReferer != null) {
|
||||||
|
vreq.getSession().removeAttribute("commentsFormReferer");
|
||||||
|
/* does not support legitimate clients that don't send the Referer header
|
||||||
|
String referer = request.getHeader("Referer");
|
||||||
|
if (referer == null ||
|
||||||
|
(referer.indexOf("comments") <0
|
||||||
|
&& referer.indexOf("correction") <0) ) {
|
||||||
|
spamReason = "The form was not submitted from the " +
|
||||||
|
"Contact Us or Corrections page.";
|
||||||
|
statusMsg = SPAM_MESSAGE;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
originalReferer = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spamReason == null) {
|
||||||
|
spamReason = checkForSpam(comments);
|
||||||
|
if (spamReason != null) {
|
||||||
|
statusMsg = SPAM_MESSAGE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String formType = vreq.getParameter("DeliveryType");
|
||||||
|
String[] deliverToArray = null;
|
||||||
|
int recipientCount = 0;
|
||||||
|
String deliveryfrom = null;
|
||||||
|
|
||||||
|
if ("comment".equals(formType)) {
|
||||||
|
if (portal.getContactMail() == null || portal.getContactMail().trim().length()==0) {
|
||||||
|
LOG.error("No contact mail address defined in current portal "+portal.getPortalId());
|
||||||
|
throw new Error(
|
||||||
|
"To establish the Contact Us mail capability the system administrators must "
|
||||||
|
+ "specify an email address in the current portal.");
|
||||||
|
} else {
|
||||||
|
deliverToArray = portal.getContactMail().split(",");
|
||||||
|
}
|
||||||
|
deliveryfrom = "Message from the "+portal.getAppName()+" Contact Form";
|
||||||
|
} else if ("correction".equals(formType)) {
|
||||||
|
if (portal.getCorrectionMail() == null || portal.getCorrectionMail().trim().length()==0) {
|
||||||
|
LOG.error("Expecting one or more correction email addresses to be specified in current portal "+portal.getPortalId()+"; will attempt to use contact mail address");
|
||||||
|
if (portal.getContactMail() == null || portal.getContactMail().trim().length()==0) {
|
||||||
|
LOG.error("No contact mail address or correction mail address defined in current portal "+portal.getPortalId());
|
||||||
|
} else {
|
||||||
|
deliverToArray = portal.getContactMail().split(",");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
deliverToArray = portal.getCorrectionMail().split(",");
|
||||||
|
}
|
||||||
|
deliveryfrom = "Message from the "+portal.getAppName()+" Correction Form (ARMANN-nospam)";
|
||||||
|
} else {
|
||||||
|
deliverToArray = portal.getContactMail().split(",");
|
||||||
|
statusMsg = SPAM_MESSAGE ;
|
||||||
|
spamReason = "The form specifies no delivery type.";
|
||||||
|
}
|
||||||
|
recipientCount=(deliverToArray == null) ? 0 : deliverToArray.length;
|
||||||
|
if (recipientCount == 0) {
|
||||||
|
LOG.error("recipientCount is 0 when DeliveryType specified as \""+formType+"\"");
|
||||||
|
throw new Error(
|
||||||
|
"To establish the Contact Us mail capability the system administrators must "
|
||||||
|
+ "specify at least one email address in the current portal.");
|
||||||
|
}
|
||||||
|
|
||||||
|
String msgText = composeEmail(webusername, webuseremail, comments,
|
||||||
|
deliveryfrom, originalReferer, vreq.getRemoteAddr());
|
||||||
|
|
||||||
|
// debugging
|
||||||
|
FileWriter fw = null;
|
||||||
|
try {
|
||||||
|
fw = new FileWriter(context.getRealPath(EMAIL_BACKUP_FILE_PATH),true);
|
||||||
|
}
|
||||||
|
catch (IOException e){
|
||||||
|
LOG.error("Can't open file to write email backup");
|
||||||
|
}
|
||||||
|
PrintWriter outFile = new PrintWriter(fw);
|
||||||
|
writeBackupCopy(outFile, msgText, spamReason);
|
||||||
|
|
||||||
|
// Set the smtp host
|
||||||
|
Properties props = System.getProperties();
|
||||||
|
props.put("mail.smtp.host", smtpHost);
|
||||||
|
Session s = Session.getDefaultInstance(props,null); // was Session.getInstance(props,null);
|
||||||
|
//s.setDebug(true);
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (spamReason == null) {
|
||||||
|
sendMessage(s, webuseremail, deliverToArray, deliveryfrom,
|
||||||
|
recipientCount, msgText);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (AddressException e) {
|
||||||
|
statusMsg = "Please supply a valid email address.";
|
||||||
|
outFile.println( statusMsg );
|
||||||
|
outFile.println( e.getMessage() );
|
||||||
|
} catch (SendFailedException e) {
|
||||||
|
statusMsg = "The system was unable to deliver your mail. Please try again later. [SEND FAILED]";
|
||||||
|
outFile.println( statusMsg );
|
||||||
|
outFile.println( e.getMessage() );
|
||||||
|
} catch (MessagingException e) {
|
||||||
|
statusMsg = "The system was unable to deliver your mail. Please try again later. [MESSAGING]";
|
||||||
|
outFile.println( statusMsg );
|
||||||
|
outFile.println( e.getMessage() );
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
outFile.flush();
|
||||||
|
outFile.close();
|
||||||
|
|
||||||
|
// Message was sent successfully
|
||||||
|
if (statusMsg == null && spamReason == null) {
|
||||||
|
bodyTemplate = "commentForm/confirmation.ftl";
|
||||||
|
} else {
|
||||||
|
body.put("errorMessage", statusMsg);
|
||||||
|
bodyTemplate = "commentForm/error.ftl";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mergeBodyToTemplate(bodyTemplate, body);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Intended to mangle url so it can get through spam filtering
|
||||||
|
* http://host/dir/servlet?param=value -> host: dir/servlet?param=value */
|
||||||
|
public String stripProtocol( String in ){
|
||||||
|
if( in == null )
|
||||||
|
return "";
|
||||||
|
else
|
||||||
|
return in.replaceAll("http://", "host: " );
|
||||||
|
}
|
||||||
|
|
||||||
|
private String composeEmail(String webusername, String webuseremail,
|
||||||
|
String comments, String deliveryfrom,
|
||||||
|
String originalReferer, String ipAddr) {
|
||||||
|
|
||||||
|
StringBuffer msgBuf = new StringBuffer();
|
||||||
|
// contains the intro copy for the body of the email message
|
||||||
|
|
||||||
|
String lineSeparator = System.getProperty("line.separator");
|
||||||
|
// \r\n on windows, \n on unix
|
||||||
|
|
||||||
|
// from MyLibrary
|
||||||
|
msgBuf.setLength(0);
|
||||||
|
msgBuf.append("Content-Type: text/html; charset='us-ascii'" + lineSeparator);
|
||||||
|
msgBuf.append("<html>" + lineSeparator );
|
||||||
|
msgBuf.append("<head>" + lineSeparator );
|
||||||
|
msgBuf.append("<style>a {text-decoration: none}</style>" + lineSeparator );
|
||||||
|
msgBuf.append("<title>" + deliveryfrom + "</title>" + lineSeparator );
|
||||||
|
msgBuf.append("</head>" + lineSeparator );
|
||||||
|
msgBuf.append("<body>" + lineSeparator );
|
||||||
|
msgBuf.append("<h4>" + deliveryfrom + "</h4>" + lineSeparator );
|
||||||
|
msgBuf.append("<h4>From: "+webusername +" (" + webuseremail + ")" +
|
||||||
|
" at IP address " + ipAddr + "</h4>"+lineSeparator);
|
||||||
|
|
||||||
|
if (!(originalReferer == null || originalReferer.equals("none"))){
|
||||||
|
//The spam filter that is being used by the listsrv is rejecting <a href="...
|
||||||
|
//so try with out the markup, if that sill doesn't work,
|
||||||
|
//uncomment the following line to strip the http://
|
||||||
|
//msgBuf.append("<p><i>likely viewing page " + stripProtocol(originalReferer) );
|
||||||
|
msgBuf.append("<p><i>likely viewing page " + originalReferer );
|
||||||
|
}
|
||||||
|
|
||||||
|
msgBuf.append(lineSeparator + "</i></p><h3>Comments:</h3>" + lineSeparator );
|
||||||
|
if (comments==null || comments.equals("")) {
|
||||||
|
msgBuf.append("<p>BLANK MESSAGE</p>");
|
||||||
|
} else {
|
||||||
|
msgBuf.append("<p>"+comments+"</p>");
|
||||||
|
}
|
||||||
|
msgBuf.append("</body>" + lineSeparator );
|
||||||
|
msgBuf.append("</html>" + lineSeparator );
|
||||||
|
|
||||||
|
return msgBuf.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeBackupCopy(PrintWriter outFile, String msgText,
|
||||||
|
String spamReason) {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
outFile.println("<hr/>");
|
||||||
|
outFile.println();
|
||||||
|
outFile.println("<p>"+cal.getTime()+"</p>");
|
||||||
|
outFile.println();
|
||||||
|
if (spamReason != null) {
|
||||||
|
outFile.println("<p>REJECTED - SPAM</p>");
|
||||||
|
outFile.println("<p>"+spamReason+"</p>");
|
||||||
|
outFile.println();
|
||||||
|
}
|
||||||
|
outFile.print( msgText );
|
||||||
|
outFile.println();
|
||||||
|
outFile.println();
|
||||||
|
outFile.flush();
|
||||||
|
// outFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendMessage(Session s, String webuseremail,
|
||||||
|
String[] deliverToArray, String deliveryfrom, int recipientCount,
|
||||||
|
String msgText)
|
||||||
|
throws AddressException, SendFailedException, MessagingException {
|
||||||
|
// Construct the message
|
||||||
|
MimeMessage msg = new MimeMessage( s );
|
||||||
|
//System.out.println("trying to send message from servlet");
|
||||||
|
|
||||||
|
// Set the from address
|
||||||
|
msg.setFrom( new InternetAddress( webuseremail ));
|
||||||
|
|
||||||
|
// Set the recipient address
|
||||||
|
|
||||||
|
if (recipientCount>0){
|
||||||
|
InternetAddress[] address=new InternetAddress[recipientCount];
|
||||||
|
for (int i=0; i<recipientCount; i++){
|
||||||
|
address[i] = new InternetAddress(deliverToArray[i]);
|
||||||
|
}
|
||||||
|
msg.setRecipients( Message.RecipientType.TO, address );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the subject and text
|
||||||
|
msg.setSubject( deliveryfrom );
|
||||||
|
|
||||||
|
// add the multipart to the message
|
||||||
|
msg.setContent(msgText,"text/html");
|
||||||
|
|
||||||
|
// set the Date: header
|
||||||
|
msg.setSentDate( new Date() );
|
||||||
|
|
||||||
|
Transport.send( msg ); // try to send the message via smtp - catch error exceptions
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private String validateInput(String webusername, String webuseremail,
|
||||||
|
String comments) {
|
||||||
|
|
||||||
|
if( webusername == null || "".equals(webusername.trim()) ){
|
||||||
|
return "A proper webusername field was not found in the form submitted.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if( webuseremail == null || "".equals(webuseremail.trim()) ){
|
||||||
|
return "A proper webuser email field was not found in the form submitted.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comments==null || "".equals(comments.trim())) {
|
||||||
|
return "The proper comments field was not found in the form submitted.";
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param request
|
||||||
|
* @return null if message not judged to be spam, otherwise a String
|
||||||
|
* containing the reason the message was flagged as spam.
|
||||||
|
*/
|
||||||
|
private String checkForSpam(String comments) {
|
||||||
|
|
||||||
|
/* if this blog markup is found, treat comment as blog spam */
|
||||||
|
if (
|
||||||
|
(comments.indexOf("[/url]") > -1
|
||||||
|
|| comments.indexOf("[/URL]") > -1
|
||||||
|
|| comments.indexOf("[url=") > -1
|
||||||
|
|| comments.indexOf("[URL=") > -1)) {
|
||||||
|
return "The message contained blog link markup.";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if message is absurdly short, treat as blog spam */
|
||||||
|
if (comments.length()<15) {
|
||||||
|
return "The message was too short.";
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -90,7 +90,7 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet {
|
||||||
root.put("body", getBody());
|
root.put("body", getBody());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setSharedVariable(String key, String value) {
|
protected void setSharedVariable(String key, Object value) {
|
||||||
try {
|
try {
|
||||||
config.setSharedVariable(key, value);
|
config.setSharedVariable(key, value);
|
||||||
} catch (TemplateModelException e) {
|
} catch (TemplateModelException e) {
|
||||||
|
@ -134,6 +134,7 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String mergeBodyToTemplate(String templateName, Map<String, Object> map) {
|
protected String mergeBodyToTemplate(String templateName, Map<String, Object> map) {
|
||||||
|
templateName = "body/" + templateName;
|
||||||
String body = mergeToTemplate(templateName, map).toString();
|
String body = mergeToTemplate(templateName, map).toString();
|
||||||
extractLinkTagsFromBody(body);
|
extractLinkTagsFromBody(body);
|
||||||
return body;
|
return body;
|
||||||
|
@ -199,18 +200,10 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet {
|
||||||
// RY Can this be removed? Do templates need it? Ideally, they should not.
|
// RY Can this be removed? Do templates need it? Ideally, they should not.
|
||||||
// Only needed for some weird stuff in search box that I think is only used in old default theme.
|
// Only needed for some weird stuff in search box that I think is only used in old default theme.
|
||||||
int portalId = portal.getPortalId();
|
int portalId = portal.getPortalId();
|
||||||
try {
|
setSharedVariable("portalId", portalId);
|
||||||
config.setSharedVariable("portalId", portalId);
|
|
||||||
} catch (TemplateModelException e) {
|
|
||||||
log.error("Can't set shared variable 'portalId'.");
|
|
||||||
}
|
|
||||||
|
|
||||||
appName = portal.getAppName();
|
appName = portal.getAppName();
|
||||||
try {
|
setSharedVariable("siteName", appName);
|
||||||
config.setSharedVariable("appName", appName);
|
|
||||||
} catch (TemplateModelException e) {
|
|
||||||
log.error("Can't set shared variable 'appName'.");
|
|
||||||
}
|
|
||||||
|
|
||||||
setTemplateLoader();
|
setTemplateLoader();
|
||||||
|
|
||||||
|
@ -221,23 +214,20 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet {
|
||||||
PortalWebUtil.populateSearchOptions(portal, appBean, vreq.getWebappDaoFactory().getPortalDao());
|
PortalWebUtil.populateSearchOptions(portal, appBean, vreq.getWebappDaoFactory().getPortalDao());
|
||||||
PortalWebUtil.populateNavigationChoices(portal, vreq, appBean, vreq.getWebappDaoFactory().getPortalDao());
|
PortalWebUtil.populateNavigationChoices(portal, vreq, appBean, vreq.getWebappDaoFactory().getPortalDao());
|
||||||
|
|
||||||
// We'll need to separate theme-general and theme-specific stylesheet
|
|
||||||
// dirs, so we need either two attributes or a list.
|
|
||||||
String themeDir = portal.getThemeDir();
|
|
||||||
String stylesheetDir = getUrl(themeDir + "css/");
|
|
||||||
try {
|
|
||||||
config.setSharedVariable("stylesheetDir", stylesheetDir);
|
|
||||||
} catch (TemplateModelException e) {
|
|
||||||
log.error("Can't set shared variable 'stylesheetDir'.");
|
|
||||||
}
|
|
||||||
|
|
||||||
root.put("siteName", portal.getAppName());
|
|
||||||
root.put("tagline", portal.getShortHand());
|
root.put("tagline", portal.getShortHand());
|
||||||
root.put("breadcrumbs", BreadCrumbsUtil.getBreadCrumbsDiv(request));
|
root.put("breadcrumbs", BreadCrumbsUtil.getBreadCrumbsDiv(vreq));
|
||||||
|
|
||||||
|
String themeDir = portal.getThemeDir();
|
||||||
|
|
||||||
setUrls(portalId, themeDir);
|
setUrls(portalId, themeDir);
|
||||||
setLoginInfo();
|
setLoginInfo();
|
||||||
setCopyrightInfo();
|
setCopyrightInfo();
|
||||||
|
setThemeInfo(themeDir);
|
||||||
|
|
||||||
|
// *** TEMPORARY. The templates shouldn't need to know this. Doing temporarily for script files
|
||||||
|
// till we put the script/css loading strategy in place. (Templates make a call to add files
|
||||||
|
// to a view object. These get iterated through in scripts.ftl and stylesheets.ftl.)
|
||||||
|
setSharedVariable("contextPath", contextPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define the URLs that are accessible to the templates. Note that we do not create menus here,
|
// Define the URLs that are accessible to the templates. Note that we do not create menus here,
|
||||||
|
@ -248,8 +238,8 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet {
|
||||||
// view to control which links go where, and the link text and title.
|
// view to control which links go where, and the link text and title.
|
||||||
Map<String, String> urls = new HashMap<String, String>();
|
Map<String, String> urls = new HashMap<String, String>();
|
||||||
|
|
||||||
String homeUrl = (portal.getRootBreadCrumbURL()!=null && portal.getRootBreadCrumbURL().length()>0) ?
|
String rootBreadCrumbUrl = portal.getRootBreadCrumbURL();
|
||||||
portal.getRootBreadCrumbURL() : vreq.getContextPath()+"/";
|
String homeUrl = StringUtils.isEmpty(rootBreadCrumbUrl) ? contextPath : rootBreadCrumbUrl;
|
||||||
urls.put("home", homeUrl);
|
urls.put("home", homeUrl);
|
||||||
|
|
||||||
String bannerImage = portal.getBannerImage();
|
String bannerImage = portal.getBannerImage();
|
||||||
|
@ -262,7 +252,7 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet {
|
||||||
|
|
||||||
urls.put("about", getUrl(Router.ABOUT, portalParam));
|
urls.put("about", getUrl(Router.ABOUT, portalParam));
|
||||||
if (ContactMailServlet.getSmtpHostFromProperties() != null) {
|
if (ContactMailServlet.getSmtpHostFromProperties() != null) {
|
||||||
urls.put("contact", getUrl(Router.CONTACT, portalParam));
|
urls.put("contact", getUrl(Router.COMMENT_FORM, portalParam));
|
||||||
}
|
}
|
||||||
urls.put("search", getUrl(Router.SEARCH));
|
urls.put("search", getUrl(Router.SEARCH));
|
||||||
urls.put("termsOfUse", getUrl(Router.TERMS_OF_USE, portalParam));
|
urls.put("termsOfUse", getUrl(Router.TERMS_OF_USE, portalParam));
|
||||||
|
@ -270,7 +260,7 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet {
|
||||||
urls.put("logout", getUrl(Router.LOGOUT));
|
urls.put("logout", getUrl(Router.LOGOUT));
|
||||||
urls.put("siteAdmin", getUrl(Router.SITE_ADMIN));
|
urls.put("siteAdmin", getUrl(Router.SITE_ADMIN));
|
||||||
|
|
||||||
root.put("urls", urls);
|
setSharedVariable("urls", urls);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final void setLoginInfo() {
|
private final void setLoginInfo() {
|
||||||
|
@ -312,6 +302,18 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final void setThemeInfo(String themeDir) {
|
||||||
|
|
||||||
|
setSharedVariable("themeDir", getUrl(themeDir));
|
||||||
|
|
||||||
|
// We'll need to separate theme-general and theme-specific stylesheet
|
||||||
|
// dirs, so we need either two attributes or a list.
|
||||||
|
setSharedVariable("stylesheetDir", getUrl(themeDir + "css/"));
|
||||||
|
|
||||||
|
setSharedVariable("siteIconDir", getUrl(themeDir + "site_icons/"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Define template locations. Template loader will look first in the theme-specific
|
// Define template locations. Template loader will look first in the theme-specific
|
||||||
// location, then in the vitro location.
|
// location, then in the vitro location.
|
||||||
// RY We cannot do this in FreeMarkerSetup because (a) the theme depends on the portal,
|
// RY We cannot do this in FreeMarkerSetup because (a) the theme depends on the portal,
|
||||||
|
|
|
@ -8,7 +8,6 @@ public class Router {
|
||||||
|
|
||||||
public static final String ABOUT = "/about";
|
public static final String ABOUT = "/about";
|
||||||
public static final String BROWSE = "/browse";
|
public static final String BROWSE = "/browse";
|
||||||
public static final String CONTACT= "/comments"; // temporary - FreeMarkerHttpServlet in svn is looking for it
|
|
||||||
public static final String COMMENT_FORM = "/comments";
|
public static final String COMMENT_FORM = "/comments";
|
||||||
public static final String INDIVIDUAL = "/individual";
|
public static final String INDIVIDUAL = "/individual";
|
||||||
public static final String INDIVIDUAL_LIST = "/entitylist"; // change
|
public static final String INDIVIDUAL_LIST = "/entitylist"; // change
|
||||||
|
|
|
@ -23,15 +23,13 @@ public class TermsOfUseController extends FreeMarkerHttpServlet {
|
||||||
|
|
||||||
Map<String, Object> body = new HashMap<String, Object>();
|
Map<String, Object> body = new HashMap<String, Object>();
|
||||||
|
|
||||||
String websiteName = portal.getRootBreadCrumbAnchor();
|
String rootBreadCrumbAnchor = portal.getRootBreadCrumbAnchor();
|
||||||
if (StringUtils.isEmpty(websiteName)) {
|
String websiteName = StringUtils.isEmpty(rootBreadCrumbAnchor) ? appName : rootBreadCrumbAnchor;
|
||||||
websiteName = appName;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.put("websiteName", websiteName);
|
body.put("websiteName", websiteName);
|
||||||
body.put("copyrightAnchor", portal.getCopyrightAnchor());
|
body.put("copyrightAnchor", portal.getCopyrightAnchor());
|
||||||
|
|
||||||
String templateName = "body/termsOfUse.ftl";
|
String bodyTemplate = "termsOfUse.ftl";
|
||||||
return mergeBodyToTemplate(templateName, body);
|
return mergeBodyToTemplate(bodyTemplate, body);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -46,7 +46,7 @@
|
||||||
|
|
||||||
<form name = "contact_form" action="sendmail" method="post" onsubmit="return ValidateForm('contact_form');">
|
<form name = "contact_form" action="sendmail" method="post" onsubmit="return ValidateForm('contact_form');">
|
||||||
<input type="hidden" name="home" value="${portalId}"/>
|
<input type="hidden" name="home" value="${portalId}"/>
|
||||||
<input type="hidden" name="RequiredFields" value="webusername,webuseremail,comments"/>
|
<input type="hidden" name="RequiredFields" value="webusername,webuseremail,s34gfd88p9x1"/>
|
||||||
<input type="hidden" name="RequiredFieldsNames" value="Name,Email address,Comments"/>
|
<input type="hidden" name="RequiredFieldsNames" value="Name,Email address,Comments"/>
|
||||||
<input type="hidden" name="EmailFields" value="webuseremail"/>
|
<input type="hidden" name="EmailFields" value="webuseremail"/>
|
||||||
<input type="hidden" name="EmailFieldsNames" value="emailaddress"/>
|
<input type="hidden" name="EmailFieldsNames" value="emailaddress"/>
|
||||||
|
|
75
webapp/web/js/commentForm.js
Normal file
75
webapp/web/js/commentForm.js
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
function ValidateForm(formName) {
|
||||||
|
var x = 0; // counts form elements - used as array index
|
||||||
|
var y = 0; // counts required fields - used as array index
|
||||||
|
errors = false;
|
||||||
|
var errorList;
|
||||||
|
|
||||||
|
if (document.forms[formName].RequiredFields) {
|
||||||
|
errorList = 'Please fill out the following required fields:\n';
|
||||||
|
// build array of required fields
|
||||||
|
reqStr = document.forms[formName].RequiredFields.value;
|
||||||
|
requiredFields = reqStr.split(',');
|
||||||
|
// build array holding the names of required fields as
|
||||||
|
// displayed in error box
|
||||||
|
if (document.forms[formName].RequiredFieldsNames) {
|
||||||
|
reqNameStr = document.forms[formName].RequiredFieldsNames.value;
|
||||||
|
} else {
|
||||||
|
reqNameStr = document.forms[formName].RequiredFields.value;
|
||||||
|
}
|
||||||
|
requiredNames = reqNameStr.split(',');
|
||||||
|
// Loop through form elements, checking for required fields
|
||||||
|
while ((x < document.forms[formName].elements.length)) {
|
||||||
|
if (document.forms[formName].elements[x].name == requiredFields[y]) {
|
||||||
|
if (document.forms[formName].elements[x].value == '') {
|
||||||
|
errorList += requiredNames[y] + '\n';
|
||||||
|
errors = true;
|
||||||
|
}
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
if (errors) {
|
||||||
|
alert(errorList);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for Email formatting
|
||||||
|
if (document.forms[formName].EmailFields) {
|
||||||
|
errorList = 'Please format your e-mail address as: \"userid@institution.edu\" or enter another complete email address';
|
||||||
|
// build array of required fields
|
||||||
|
emailStr = document.forms[formName].EmailFields.value;
|
||||||
|
emailFields = emailStr.split(',');
|
||||||
|
// build array holding the names of required fields as
|
||||||
|
// displayed in error box
|
||||||
|
if (document.forms[formName].EmailFieldsNames) {
|
||||||
|
emailNameStr = document.forms[formName].EmailFieldsNames.value;
|
||||||
|
} else {
|
||||||
|
emailNameStr = document.forms[formName].EmailFields.value;
|
||||||
|
}
|
||||||
|
emailNames = emailNameStr.split(',');
|
||||||
|
// Loop through form elements, checking for required fields
|
||||||
|
while ((x < document.forms[formName].elements.length)) {
|
||||||
|
if (document.forms[formName].elements[x].name == emailFields[y]) {
|
||||||
|
if ((document.forms[formName].elements[x].value.indexOf('@') < 1)
|
||||||
|
|| (document.forms[formName].elements[x].value.lastIndexOf('.') < document.forms[formName].elements[x].value.indexOf('@')+1)) {
|
||||||
|
errors = true;
|
||||||
|
}
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
if (errors) {
|
||||||
|
alert(errorList);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -1,79 +0,0 @@
|
||||||
<!-- /* $This file is distributed under the terms of the license in /doc/license.txt$ */ -->
|
|
||||||
|
|
||||||
<script language="JavaScript" type="text/javascript">
|
|
||||||
<!--
|
|
||||||
function ValidateForm(formName) {
|
|
||||||
var x = 0; // counts form elements - used as array index
|
|
||||||
var y = 0; // counts required fields - used as array index
|
|
||||||
errors = false;
|
|
||||||
var errorList;
|
|
||||||
|
|
||||||
if (document.forms[formName].RequiredFields) {
|
|
||||||
errorList = 'Please fill out the following required fields:\n';
|
|
||||||
// build array of required fields
|
|
||||||
reqStr = document.forms[formName].RequiredFields.value;
|
|
||||||
requiredFields = reqStr.split(',');
|
|
||||||
// build array holding the names of required fields as
|
|
||||||
// displayed in error box
|
|
||||||
if (document.forms[formName].RequiredFieldsNames) {
|
|
||||||
reqNameStr = document.forms[formName].RequiredFieldsNames.value;
|
|
||||||
} else {
|
|
||||||
reqNameStr = document.forms[formName].RequiredFields.value;
|
|
||||||
}
|
|
||||||
requiredNames = reqNameStr.split(',');
|
|
||||||
// Loop through form elements, checking for required fields
|
|
||||||
while ((x < document.forms[formName].elements.length)) {
|
|
||||||
if (document.forms[formName].elements[x].name == requiredFields[y]) {
|
|
||||||
if (document.forms[formName].elements[x].value == '') {
|
|
||||||
errorList += requiredNames[y] + '\n';
|
|
||||||
errors = true;
|
|
||||||
}
|
|
||||||
y++;
|
|
||||||
}
|
|
||||||
x++;
|
|
||||||
}
|
|
||||||
if (errors) {
|
|
||||||
alert(errorList);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
x = 0;
|
|
||||||
y = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for Email formatting
|
|
||||||
if (document.forms[formName].EmailFields) {
|
|
||||||
errorList = 'Please format your e-mail address as: \"userid@institution.edu\" or enter another complete email address';
|
|
||||||
// build array of required fields
|
|
||||||
emailStr = document.forms[formName].EmailFields.value;
|
|
||||||
emailFields = emailStr.split(',');
|
|
||||||
// build array holding the names of required fields as
|
|
||||||
// displayed in error box
|
|
||||||
if (document.forms[formName].EmailFieldsNames) {
|
|
||||||
emailNameStr = document.forms[formName].EmailFieldsNames.value;
|
|
||||||
} else {
|
|
||||||
emailNameStr = document.forms[formName].EmailFields.value;
|
|
||||||
}
|
|
||||||
emailNames = emailNameStr.split(',');
|
|
||||||
// Loop through form elements, checking for required fields
|
|
||||||
while ((x < document.forms[formName].elements.length)) {
|
|
||||||
if (document.forms[formName].elements[x].name == emailFields[y]) {
|
|
||||||
if ((document.forms[formName].elements[x].value.indexOf('@') < 1)
|
|
||||||
|| (document.forms[formName].elements[x].value.lastIndexOf('.') < document.forms[formName].elements[x].value.indexOf('@')+1)) {
|
|
||||||
errors = true;
|
|
||||||
}
|
|
||||||
y++;
|
|
||||||
}
|
|
||||||
x++;
|
|
||||||
}
|
|
||||||
if (errors) {
|
|
||||||
alert(errorList);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
x = 0;
|
|
||||||
y = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
-->
|
|
||||||
</script>
|
|
7
webapp/web/js/commentsForm.jsp
Normal file
7
webapp/web/js/commentsForm.jsp
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%>
|
||||||
|
|
||||||
|
<%
|
||||||
|
String contextPath = request.getContextPath();
|
||||||
|
%>
|
||||||
|
|
||||||
|
<script language="JavaScript" type="text/javascript" src="<%= contextPath %>/js/commentForm.js"></script>
|
|
@ -5,6 +5,7 @@
|
||||||
<#if message??>
|
<#if message??>
|
||||||
<p>${message}</p>
|
<p>${message}</p>
|
||||||
<#else>
|
<#else>
|
||||||
|
<div class="siteMap">
|
||||||
<#list classGroups as classGroup>
|
<#list classGroups as classGroup>
|
||||||
<h2>${classGroup.publicName}</h2>
|
<h2>${classGroup.publicName}</h2>
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -13,4 +14,5 @@
|
||||||
</#list>
|
</#list>
|
||||||
</ul>
|
</ul>
|
||||||
</#list>
|
</#list>
|
||||||
|
</div>
|
||||||
</#if>
|
</#if>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||||
|
|
||||||
|
<#-- Confirmation page for comment form -->
|
||||||
|
|
||||||
|
<h2>Thank you for your feedback</h2>
|
||||||
|
<img src="${siteIconDir}/mail.gif" alt="mailbox"/><br/>
|
||||||
|
|
||||||
|
<p>Thank you for contacting our curation and development team. We will respond to your inquiry as soon as possible.</p>
|
||||||
|
<p>Return to the <a href="${urls.home}">home page</a>.</p>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||||
|
|
||||||
|
<#-- Comment form email response -->
|
13
webapp/web/templates/freemarker/body/commentForm/error.ftl
Normal file
13
webapp/web/templates/freemarker/body/commentForm/error.ftl
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||||
|
|
||||||
|
<img src="${siteIconDir}/bomb.gif" alt="email error"/>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="normal">An error occurred during the processing of your request.<br />
|
||||||
|
<#if errorMessage?has_content>
|
||||||
|
<strong>${errorMessage}</strong>
|
||||||
|
</#if>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Return to the <a href="${urls.home}">home page</a>.</p>
|
59
webapp/web/templates/freemarker/body/commentForm/form.ftl
Normal file
59
webapp/web/templates/freemarker/body/commentForm/form.ftl
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||||
|
|
||||||
|
<#-- Comment form -->
|
||||||
|
|
||||||
|
<div class="staticPageBackground feedbackForm">
|
||||||
|
|
||||||
|
<h2>${title}</h2>
|
||||||
|
|
||||||
|
<p>Thank you for your interest in
|
||||||
|
<#compress>
|
||||||
|
<#if portalType == "CALSResearch">
|
||||||
|
the Cornell University College of Agriculture and Life Sciences Research Portal
|
||||||
|
<#elseif portalType == "VIVO">
|
||||||
|
VIVO
|
||||||
|
<#else>
|
||||||
|
the ${siteName} portal
|
||||||
|
</#if>
|
||||||
|
</#compress>.
|
||||||
|
Please submit this form with questions, comments, or feedback about the content of this site.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<#if siteName == "CALSResearch" || siteName == "CALSImpact">
|
||||||
|
<p>
|
||||||
|
${siteName} is a service that depends on regular updates and feedback.
|
||||||
|
Please help us out by providing comments and suggestions for additional content (people, departments, courses, research services, etc.)
|
||||||
|
that you would like to see represented. The reference librarians at Albert R. Mann Library will be in touch with you soon.
|
||||||
|
</p>
|
||||||
|
</#if>
|
||||||
|
|
||||||
|
<form name="contact_form" action="sendMail" method="post" onsubmit="return ValidateForm('contact_form');">
|
||||||
|
<input type="hidden" name="home" value="${portalId}"/>
|
||||||
|
<input type="hidden" name="RequiredFields" value="webusername,webuseremail,s34gfd88p9x1"/>
|
||||||
|
<input type="hidden" name="RequiredFieldsNames" value="Name,Email address,Comments"/>
|
||||||
|
<input type="hidden" name="EmailFields" value="webuseremail"/>
|
||||||
|
<input type="hidden" name="EmailFieldsNames" value="emailaddress"/>
|
||||||
|
<input type="hidden" name="DeliveryType" value="comment"/>
|
||||||
|
|
||||||
|
<label for="webusername">Full name</label>
|
||||||
|
<p><input style="width:33%;" type="text" name="webusername" maxlength="255"/></p>
|
||||||
|
<label for="webuseremail">Email address</label>
|
||||||
|
<p><input style="width:25%;" type="text" name="webuseremail" maxlength="255"/></p>
|
||||||
|
|
||||||
|
|
||||||
|
<label>Your comments, questions, or suggestions</label>
|
||||||
|
|
||||||
|
<textarea name="s34gfd88p9x1" rows="10" cols="90"></textarea>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<input type="submit" value="Send Mail" class="yellowbutton"/>
|
||||||
|
<input type="reset" value="Clear Form" class="plainbutton"/>
|
||||||
|
</div
|
||||||
|
|
||||||
|
<p style="font-weight: bold; margin-top: 1em">Thank you!</p>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<#-- RY This is temporary. -->
|
||||||
|
<script src="${contextPath}/js/commentForm.js"></script>
|
|
@ -17,10 +17,10 @@
|
||||||
<p class="normal">${copyrightAnchor} makes no warranty, expressed or implied, including the warranties of merchantability
|
<p class="normal">${copyrightAnchor} makes no warranty, expressed or implied, including the warranties of merchantability
|
||||||
and fitness for a particular purpose, or assumes any legal liability or responsibility for the accuracy,
|
and fitness for a particular purpose, or assumes any legal liability or responsibility for the accuracy,
|
||||||
completeness, currency or usefulness of any material displayed or distributed through the
|
completeness, currency or usefulness of any material displayed or distributed through the
|
||||||
${appName} website or represents that its use would not infringe privately owned rights.
|
${siteName} website or represents that its use would not infringe privately owned rights.
|
||||||
${copyrightAnchor} disclaims all warranties with regard to the information provided. Any reliance upon such information
|
${copyrightAnchor} disclaims all warranties with regard to the information provided. Any reliance upon such information
|
||||||
is at your own risk. In no event will ${copyrightAnchor} be liable to you for any damages or losses whatsoever resulting
|
is at your own risk. In no event will ${copyrightAnchor} be liable to you for any damages or losses whatsoever resulting
|
||||||
from or caused by the ${appName} website or its contents.</p>
|
from or caused by the ${siteName} website or its contents.</p>
|
||||||
|
|
||||||
<h3>Disclaimer of Endorsement</h3>
|
<h3>Disclaimer of Endorsement</h3>
|
||||||
<p class="normal">Reference herein to any specific commercial product, process, or service by trade name,
|
<p class="normal">Reference herein to any specific commercial product, process, or service by trade name,
|
||||||
|
|
|
@ -24,5 +24,3 @@
|
||||||
All Rights Reserved. <a href="${urls.termsOfUse}">Terms of Use</a>
|
All Rights Reserved. <a href="${urls.termsOfUse}">Terms of Use</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<#-- SCRIPT TAGS SHOULD GO HERE -->
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||||
|
|
||||||
|
<#-- NOTICE: This is SAMPLE Google Analytics code. You must replace it with your institution's code. -->
|
||||||
|
|
||||||
|
<#--
|
||||||
|
<script type="text/javascript"> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
try {
|
||||||
|
var pageTracker = _gat._getTracker("UA-5164622-5");
|
||||||
|
pageTracker._setDomainName("vivo.cornell.edu");
|
||||||
|
pageTracker._setAllowLinker(true);
|
||||||
|
pageTracker._trackPageview();
|
||||||
|
var rollupTracker = _gat._getTracker("UA-12531954-1");
|
||||||
|
rollupTracker._setDomainName("none");
|
||||||
|
rollupTracker._setAllowLinker(true);
|
||||||
|
rollupTracker._trackPageview(location.host+location.pathname);
|
||||||
|
}
|
||||||
|
catch(err) {}
|
||||||
|
</script>
|
||||||
|
-->
|
|
@ -1 +1,5 @@
|
||||||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||||
|
|
||||||
|
<#include "googleAnalytics.ftl">
|
||||||
|
|
||||||
|
<#-- OTHER SCRIPT TAGS HERE -->
|
|
@ -3,6 +3,8 @@
|
||||||
<link rel="stylesheet" type="text/css" href="${stylesheetDir}screen.css" media="screen"/>
|
<link rel="stylesheet" type="text/css" href="${stylesheetDir}screen.css" media="screen"/>
|
||||||
<link rel="stylesheet" type="text/css" href="${stylesheetDir}print.css" media="print"/>
|
<link rel="stylesheet" type="text/css" href="${stylesheetDir}print.css" media="print"/>
|
||||||
|
|
||||||
|
<#if stylesheeets??>
|
||||||
<#list stylesheets as stylesheet>
|
<#list stylesheets as stylesheet>
|
||||||
${stylesheet}
|
${stylesheet}
|
||||||
</#list>
|
</#list>
|
||||||
|
</#if>
|
|
@ -22,7 +22,7 @@
|
||||||
<hr class="hidden" />
|
<hr class="hidden" />
|
||||||
|
|
||||||
<div id="contentwrap">
|
<div id="contentwrap">
|
||||||
<div id="content" <#if contentClass??> class="${contentClass}" </#if>>
|
<div id="content">
|
||||||
<#-- We don't do title here because some pages don't get a title, or it may not be the same as the <title> text.
|
<#-- We don't do title here because some pages don't get a title, or it may not be the same as the <title> text.
|
||||||
<h2>${title}</h2> -->
|
<h2>${title}</h2> -->
|
||||||
${body}
|
${body}
|
||||||
|
@ -32,5 +32,7 @@
|
||||||
<#include "/components/footer.ftl">
|
<#include "/components/footer.ftl">
|
||||||
|
|
||||||
</div> <!-- wrap -->
|
</div> <!-- wrap -->
|
||||||
|
|
||||||
|
<#include "/components/scripts.ftl">
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue