diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index c98bfaa..0e8e488 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -5,9 +5,6 @@ - - uses - diff --git a/pom.xml b/pom.xml index a60080c..9e3e6ca 100644 --- a/pom.xml +++ b/pom.xml @@ -85,71 +85,16 @@ custom-portal-handler provided - - commons-io - commons-io - - - org.gcube.core - common-encryption - provided - - - org.gcube.core - common-scope-maps - compile - - - org.gcube.dvos - usermanagement-core - provided - - - com.googlecode.json-simple - json-simple - - - net.eliasbalasis - tibcopagebus4gwt - 1.2.0 - org.gcube.applicationsupportlayer aslcore provided - org.gcube.applicationsupportlayer - aslsocial + com.sun.mail + javax.mail provided - - com.google - gwt-jsonmaker - provided - - - org.gcube.portal - social-networking-library - provided - - - org.gcube.portlets.widgets - wsmail-widget - [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) - compile - - - org.gcube.portlets.widgets - workspace-light-tree - [2.13.0-SNAPSHOT, 3.0.0-SNAPSHOT) - compile - - - org.apache.httpcomponents - httpclient - 4.3.5 - com.liferay.portal portal-service diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/client/InviteService.java b/src/main/java/org/gcube/portlets/user/invitefriends/client/InviteService.java index 7e7772a..5331df0 100644 --- a/src/main/java/org/gcube/portlets/user/invitefriends/client/InviteService.java +++ b/src/main/java/org/gcube/portlets/user/invitefriends/client/InviteService.java @@ -8,5 +8,5 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; */ @RemoteServiceRelativePath("greet") public interface InviteService extends RemoteService { - String greetServer(String name) throws IllegalArgumentException; + Boolean sendInviteEmail(String name, String lastName, String email) throws IllegalArgumentException; } diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/FormViewImpl.java b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/FormViewImpl.java index 7c894ee..c05eaf5 100644 --- a/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/FormViewImpl.java +++ b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/FormViewImpl.java @@ -3,6 +3,9 @@ */ package org.gcube.portlets.user.invitefriends.client.validation; +import org.gcube.portlets.user.invitefriends.client.InviteService; +import org.gcube.portlets.user.invitefriends.client.InviteServiceAsync; + import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.ControlGroup; import com.github.gwtbootstrap.client.ui.HelpBlock; @@ -17,6 +20,8 @@ import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; @@ -27,6 +32,11 @@ import com.google.gwt.user.client.ui.Widget; */ public class FormViewImpl extends Composite implements FormView, Editor { + /** + * Create a remote service proxy to talk to the server-side service + */ + private final InviteServiceAsync service = GWT.create(InviteService.class); + interface Binder extends UiBinder {} private static Binder uiBinder = GWT.create(Binder.class); @@ -75,6 +85,19 @@ public class FormViewImpl extends Composite implements FormView, Editor() { + + @Override + public void onSuccess(Boolean result) { + helpBlock.setText("Send OK"); + + } + + @Override + public void onFailure(Throwable caught) { + helpBlock.setText("Message send error"); + } + }); } } diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/server/InviteServiceImpl.java b/src/main/java/org/gcube/portlets/user/invitefriends/server/InviteServiceImpl.java index 042bbe7..3200425 100644 --- a/src/main/java/org/gcube/portlets/user/invitefriends/server/InviteServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/invitefriends/server/InviteServiceImpl.java @@ -1,48 +1,183 @@ package org.gcube.portlets.user.invitefriends.server; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.util.Properties; + +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.application.framework.core.session.SessionManager; +import org.gcube.portal.custom.communitymanager.OrganizationsUtil; +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; import org.gcube.portlets.user.invitefriends.client.InviteService; -import org.gcube.portlets.user.invitefriends.shared.FieldVerifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import com.liferay.portal.service.UserLocalServiceUtil; +import com.liferay.portal.util.PortalUtil; /** * The server side implementation of the RPC service. */ @SuppressWarnings("serial") -public class InviteServiceImpl extends RemoteServiceServlet implements - InviteService { +public class InviteServiceImpl extends RemoteServiceServlet implements InviteService { - public String greetServer(String input) throws IllegalArgumentException { - // Verify that the input is valid. - if (!FieldVerifier.isValidName(input)) { - // If the input is not valid, throw an IllegalArgumentException back to - // the client. - throw new IllegalArgumentException( - "Name must be at least 4 characters long"); - } + private final static Logger _log = LoggerFactory.getLogger(InviteServiceImpl.class); + private final static String MAIL_SERVICE_HOST = "localhost"; + private final static String MAIL_SERVICE_PORT = "25"; + private static final String SENDER_EMAIL = "notificationSenderEmail"; + private static final String GATEWAY_NAME = "portalinstancename"; + /** + * the current ASLSession + * @return the session + */ + private ASLSession getASLSession() { + String sessionID = this.getThreadLocalRequest().getSession().getId(); + String user = (String) this.getThreadLocalRequest().getSession().getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); + if (user == null) { + _log.warn("USER IS NULL setting test.user"); + user = "test.user"; + } + else { + _log.info("LIFERAY PORTAL DETECTED user=" + user); + } + return SessionManager.getInstance().getASLSession(sessionID, user); + } + /** + * + */ + @Override + public Boolean sendInviteEmail(String name, String lastName, String email) throws IllegalArgumentException { + ASLSession aslSession = getASLSession(); + String vreName = aslSession.getGroupName(); + String fromFullName = aslSession.getUserFullName(); + + Properties props = System.getProperties(); + Session session = null; + props.put("mail.smtp.host", MAIL_SERVICE_HOST); + props.put("mail.smtp.port", MAIL_SERVICE_PORT); + session = Session.getDefaultInstance(props); + session.setDebug(true); - String serverInfo = getServletContext().getServerInfo(); - String userAgent = getThreadLocalRequest().getHeader("User-Agent"); + try { + MimeMessage message = new MimeMessage(session); + message.setHeader("Content-Type", "text/plain; charset=UTF-8"); + // Set From: header field of the header. + message.setFrom(new InternetAddress(getSenderEmail(), getPortalInstanceName())); + message.addRecipient(Message.RecipientType.TO, new InternetAddress(email)); - // Escape data from the client to avoid cross-site script vulnerabilities. - input = escapeHtml(input); - userAgent = escapeHtml(userAgent); + // Set Subject: header field + message.setSubject(name + ", " + fromFullName + " would like you to try " + vreName); - return "Hello, " + input + "!

I am running " + serverInfo - + ".

looks like you are using:
" + userAgent; - } + // Now set the actual message + message.setText(getTextEmail(name, lastName, email, fromFullName, vreName)); + + // Send message + Transport.send(message); + _log.debug("Sent message successfully to " + email ); + } catch (Exception mex) { + mex.printStackTrace(); + _log.error("Sent message ERROR to " + email ); + return false; + } + return true; + } + + + private String getTextEmail(String name, String lastName, String email, String fromFullName, String vreName) { + String username = getASLSession().getUsername(); + String portalUrl = null; + + try { + portalUrl = PortalUtil.getPortalURL(OrganizationsUtil.getCompany().getVirtualHost(), PortalUtil.getPortalPort(), true); + } catch (Exception e1) { + e1.printStackTrace(); + _log.warn("While trying to send email for invitation to " + email); + return null; + } + String portalHost = portalUrl.replaceAll("https://", ""); + portalHost = portalHost.replaceAll("http://", ""); + + StringBuilder body = new StringBuilder(); + + body.append("Dear " + name) + .append("\n\n") + .append(fromFullName).append("\n") + .append("would like you to try the " + vreName + " Virtual Research Environment") + .append("\n\n") + .append("WARNING / LEGAL TEXT: This message is intended only for the use of the individual or entity to which it is addressed and may contain") + .append("information which is privileged, confidential, proprietary, or exempt from disclosure under applicable law. " + + "If you are not the intended recipient or the person responsible for delivering the message to the intended recipient, " + + "you are strictly prohibited from disclosing, distributing, copying, or in any way using this message.") + .append("If you have received this communication in error, please notify the and destroy and delete any copies you may have received."); + + return body.toString(); + + } + + + + /** + * read the portal instance name from a property file and returns it + */ + private static String getPortalInstanceName() { + //get the portles to look for from the property file + Properties props = new Properties(); + String toReturn = ""; + + try { + String propertyfile = OrganizationsUtil.getTomcatFolder()+"conf/gcube-data.properties"; + File propsFile = new File(propertyfile); + FileInputStream fis = new FileInputStream(propsFile); + props.load( fis); + toReturn = props.getProperty(GATEWAY_NAME); + } + //catch exception in case properties file does not exist + catch(IOException e) { + toReturn = "D4science Gateway"; + _log.error("gcube-data.properties file not found under $CATALINA_HOME/conf dir, returning default Portal Name " + toReturn); + return toReturn; + } + _log.debug("Returning Gateway Name: " + toReturn ); + return toReturn; + } + + /** + * read the sender email for notifications name from a property file and returns it + */ + private static String getSenderEmail() { + //get the portles to look for from the property file + Properties props = new Properties(); + String toReturn = ""; + + try { + String propertyfile = OrganizationsUtil.getTomcatFolder()+"conf/gcube-data.properties"; + File propsFile = new File(propertyfile); + FileInputStream fis = new FileInputStream(propsFile); + props.load( fis); + toReturn = props.getProperty(SENDER_EMAIL); + } + //catch exception in case properties file does not exist + catch(IOException e) { + toReturn = "do-not-reply@d4science.org"; + _log.error("gcube-data.properties file not found under $CATALINA_HOME/conf dir, returning default Email" + toReturn); + return toReturn; + } + _log.debug("Returning SENDER_EMAIL: " + toReturn ); + return toReturn; + } - /** - * Escape an html string. Escaping data received from the client helps to - * prevent cross-site script vulnerabilities. - * - * @param html the html string to escape - * @return the escaped string - */ - private String escapeHtml(String html) { - if (html == null) { - return null; - } - return html.replaceAll("&", "&").replaceAll("<", "<").replaceAll( - ">", ">"); - } } diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/shared/FieldVerifier.java b/src/main/java/org/gcube/portlets/user/invitefriends/shared/FieldVerifier.java deleted file mode 100644 index e74df61..0000000 --- a/src/main/java/org/gcube/portlets/user/invitefriends/shared/FieldVerifier.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.gcube.portlets.user.invitefriends.shared; - -/** - *

- * FieldVerifier validates that the name the user enters is valid. - *

- *

- * This class is in the shared packing because we use it in both - * the client code and on the server. On the client, we verify that the name is - * valid before sending an RPC request so the user doesn't have to wait for a - * network round trip to get feedback. On the server, we verify that the name is - * correct to ensure that the input is correct regardless of where the RPC - * originates. - *

- *

- * When creating a class that is used on both the client and the server, be sure - * that all code is translatable and does not use native JavaScript. Code that - * is note translatable (such as code that interacts with a database or the file - * system) cannot be compiled into client side JavaScript. Code that uses native - * JavaScript (such as Widgets) cannot be run on the server. - *

- */ -public class FieldVerifier { - - /** - * Verifies that the specified name is valid for our service. - * - * In this example, we only require that the name is at least four - * characters. In your application, you can use more complex checks to ensure - * that usernames, passwords, email addresses, URLs, and other fields have the - * proper syntax. - * - * @param name the name to validate - * @return true if valid, false if invalid - */ - public static boolean isValidName(String name) { - if (name == null) { - return false; - } - return name.length() > 3; - } -}