Compare commits

..

7 Commits

7 changed files with 235 additions and 133 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
/target/ /target/
/deploy.sh

View File

@ -1,10 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0"> <?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="social-mail-servlet"> <wb-module deploy-name="social-mail-servlet">
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/> <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/> <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<property name="context-root" value="social-mail-servlet"/> <property name="context-root" value="social-mail-servlet"/>
<property name="java-output-path" value="/social-mail-servlet/target/classes"/> <property name="java-output-path" value="/social-mail-servlet/target/classes"/>
</wb-module> </wb-module>
</project-modules> </project-modules>

View File

@ -4,14 +4,16 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [v3.0.0] - 2024-04-18
- Removed social networking lib dep
## [v2.5.0] - 2021-06-22 ## [v2.5.0] - 2021-06-22
- Feature #21689 Social Mail Servlet to StorageHub migration - Feature #21689 Social Mail Servlet to StorageHub migration
- Removed HomeLibrary Dependency - Removed HomeLibrary Dependency
- Feature #26536 Removed social networking library dependency
## [v2.4.0] - 2019-12-30 ## [v2.4.0] - 2019-12-30
- Ported to git - Ported to git

View File

@ -32,18 +32,11 @@ See [Releases](https://code-repo.d4science.org/gCubeSystem/oauth-service/release
This project is licensed under the EUPL V.1.1 License - see the [LICENSE.md](LICENSE.md) file for details. This project is licensed under the EUPL V.1.1 License - see the [LICENSE.md](LICENSE.md) file for details.
## About the gCube Framework ## About the gCube Framework
This software is part of the [gCubeFramework](https://www.gcube-system.org/ "gCubeFramework"): an This software is part of the [gCubeFramework](https://www.gcube-system.org/ "gCubeFramework"): an
open-source software toolkit used for building and operating Hybrid Data open-source software toolkit used for building and operating Data
Infrastructures enabling the dynamic deployment of Virtual Research Environments Infrastructures enabling the dynamic deployment of Virtual Research Environments
by favouring the realisation of reuse oriented policies. by favouring the realisation of reuse oriented policies.
The projects leading to this software have received funding from a series of European Union programmes including: The projects leading to this software have received funding from a series of European Union programmes see [FUNDING.md](FUNDING.md)
- the Sixth Framework Programme for Research and Technological Development
- DILIGENT (grant no. 004260);
- the Seventh Framework Programme for research, technological development and demonstration
- D4Science (grant no. 212488), D4Science-II (grant no.239019), ENVRI (grant no. 283465), EUBrazilOpenBio (grant no. 288754), iMarine(grant no. 283644);
- the H2020 research and innovation programme
- BlueBRIDGE (grant no. 675680), EGIEngage (grant no. 654142), ENVRIplus (grant no. 654182), Parthenos (grant no. 654119), SoBigData (grant no. 654024),DESIRA (grant no. 818194), ARIADNEplus (grant no. 823914), RISIS2 (grant no. 824091), PerformFish (grant no. 727610), AGINFRAplus (grant no. 731001);

44
pom.xml
View File

@ -4,7 +4,7 @@
<parent> <parent>
<groupId>org.gcube.tools</groupId> <groupId>org.gcube.tools</groupId>
<artifactId>maven-parent</artifactId> <artifactId>maven-parent</artifactId>
<version>1.1.0</version> <version>1.2.0</version>
<relativePath /> <relativePath />
</parent> </parent>
@ -12,7 +12,7 @@
<groupId>org.gcube.portal</groupId> <groupId>org.gcube.portal</groupId>
<artifactId>social-mail-servlet</artifactId> <artifactId>social-mail-servlet</artifactId>
<packaging>war</packaging> <packaging>war</packaging>
<version>2.5.0</version> <version>3.0.0</version>
<scm> <scm>
<connection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</connection> <connection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</connection>
<developerConnection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</developerConnection> <developerConnection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</developerConnection>
@ -37,7 +37,7 @@
<dependency> <dependency>
<groupId>org.gcube.distribution</groupId> <groupId>org.gcube.distribution</groupId>
<artifactId>maven-portal-bom</artifactId> <artifactId>maven-portal-bom</artifactId>
<version>3.6.3</version> <version>3.7.0</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
@ -66,11 +66,15 @@
<artifactId>aslcore</artifactId> <artifactId>aslcore</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!--needs to be provided -->
<dependency> <dependency>
<groupId>org.gcube.social-networking</groupId> <groupId>org.gcube.applicationsupportlayer</groupId>
<artifactId>social-service-model</artifactId> <artifactId>aslsocial</artifactId>
<version>[1.2.0-SNAPSHOT, 2.0.0)</version> <scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gcube.portal</groupId>
<artifactId>social-networking-library</artifactId>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.gcube.social-networking</groupId> <groupId>org.gcube.social-networking</groupId>
@ -79,13 +83,9 @@
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.gcube.applicationsupportlayer</groupId> <groupId>com.squareup.okhttp3</groupId>
<artifactId>aslsocial</artifactId> <artifactId>okhttp</artifactId>
<scope>provided</scope> <version>4.9.3</version>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>storagehub-client-library</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
@ -116,7 +116,13 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sun.mail</groupId> <groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId> <artifactId>jakarta.mail</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -171,14 +177,6 @@
<webappDirectory>${webappDirectory}</webappDirectory> <webappDirectory>${webappDirectory}</webappDirectory>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>

View File

@ -17,16 +17,18 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.gcube.application.framework.core.session.SessionManager;
import org.gcube.common.encryption.StringEncrypter; import org.gcube.common.encryption.StringEncrypter;
import org.gcube.common.portal.PortalContext; import org.gcube.common.portal.PortalContext;
import org.gcube.common.resources.gcore.ServiceEndpoint; import org.gcube.common.resources.gcore.ServiceEndpoint;
import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint;
import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.portal.databook.server.DBCassandraAstyanaxImpl;
import org.gcube.portal.databook.server.DatabookStore;
import org.gcube.portal.socialmail.EmailPopAccount; import org.gcube.portal.socialmail.EmailPopAccount;
import org.gcube.portal.socialmail.PeriodicTask; import org.gcube.portal.socialmail.PeriodicTask;
import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.api.DiscoveryClient;
import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.resources.discovery.client.queries.api.SimpleQuery;
import org.gcube.social_networking.social_networking_client_library.LibClient;
import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault;
import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager; import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager;
import org.gcube.vomanagement.usermanagement.model.CustomAttributeKeys; import org.gcube.vomanagement.usermanagement.model.CustomAttributeKeys;
@ -50,14 +52,13 @@ public class PortalSchedulerService extends HttpServlet {
private static final String POP3_SERVER_NAME = "Pop3MailServer"; private static final String POP3_SERVER_NAME = "Pop3MailServer";
private static LibClient libClient; private static DatabookStore store;
public void init() { public void init() {
try { PortalContext context = PortalContext.getConfiguration();
libClient = new LibClient(); String scope = "/" + context.getInfrastructureName();
} catch (Exception e) { ScopeProvider.instance.set(scope);
throw new RuntimeException(e); store = new DBCassandraAstyanaxImpl();
}
} }
@ -77,10 +78,10 @@ public class PortalSchedulerService extends HttpServlet {
int pollingInterval = getPollingInterval(); int pollingInterval = getPollingInterval();
ScheduledExecutorService pop3Scheduler = Executors.newScheduledThreadPool(1); ScheduledExecutorService pop3Scheduler = Executors.newScheduledThreadPool(1);
pop3Scheduler.scheduleAtFixedRate(new PeriodicTask(libClient, popAccount, request), 0, pollingInterval, TimeUnit.MINUTES); pop3Scheduler.scheduleAtFixedRate(new PeriodicTask(store, popAccount, request), 0, pollingInterval, TimeUnit.MINUTES);
String portalName = "unknown"; String portalName = "unknown";
try { try {
popAccount.getPortalName() ; portalName = popAccount.getPortalName() ;
} }
catch (NullPointerException e){ catch (NullPointerException e){
_log.warn("Could not read popAccount data portal name", e); _log.warn("Could not read popAccount data portal name", e);

View File

@ -2,26 +2,18 @@ package org.gcube.portal.socialmail;
import static org.gcube.common.authorization.client.Constants.authorizationService; import static org.gcube.common.authorization.client.Constants.authorizationService;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.UUID; import java.util.UUID;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringEscapeUtils;
@ -34,34 +26,52 @@ import org.gcube.applicationsupportlayer.social.mailing.AppType;
import org.gcube.applicationsupportlayer.social.mailing.SocialMailingUtil; import org.gcube.applicationsupportlayer.social.mailing.SocialMailingUtil;
import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingSite; import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingSite;
import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingUser; import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingUser;
import org.gcube.common.authorization.library.provider.AccessTokenProvider;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.authorization.library.provider.UserInfo; import org.gcube.common.authorization.library.provider.UserInfo;
import org.gcube.common.portal.PortalContext; import org.gcube.common.portal.PortalContext;
import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.common.storagehub.client.plugins.AbstractPlugin; import org.gcube.portal.databook.server.DatabookStore;
import org.gcube.common.storagehub.client.proxies.MessageManagerClient; import org.gcube.portal.databook.shared.Comment;
import org.gcube.common.storagehub.model.exceptions.IdNotFoundException; import org.gcube.portal.databook.shared.Feed;
import org.gcube.common.storagehub.model.exceptions.StorageHubException; import org.gcube.portal.databook.shared.Like;
import org.gcube.social_networking.socialnetworking.model.shared.Comment; import org.gcube.portal.databook.shared.ex.ColumnNameNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.Post; import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.Like; import org.gcube.portal.databook.shared.ex.FeedTypeNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.exceptions.ColumnNameNotFoundException; import org.gcube.portal.databook.shared.ex.PrivacyLevelTypeNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.exceptions.PostIDNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.exceptions.PostTypeNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.exceptions.PrivacyLevelTypeNotFoundException;
import org.gcube.portal.notifications.bean.GenericItemBean; import org.gcube.portal.notifications.bean.GenericItemBean;
import org.gcube.portal.notifications.thread.CommentNotificationsThread; import org.gcube.portal.notifications.thread.CommentNotificationsThread;
import org.gcube.portal.notifications.thread.LikeNotificationsThread; import org.gcube.portal.notifications.thread.LikeNotificationsThread;
import org.gcube.portal.notifications.thread.MessageNotificationsThread; import org.gcube.portal.notifications.thread.MessageNotificationsThread;
import org.gcube.social_networking.social_networking_client_library.LibClient; import org.gcube.social_networking.social_networking_client_library.MessageClient;
import org.gcube.social_networking.socialnetworking.model.beans.MessageInbox;
import org.gcube.social_networking.socialnetworking.model.beans.MessageInputBean;
import org.gcube.social_networking.socialnetworking.model.beans.Recipient;
import org.gcube.vomanagement.usermanagement.UserManager; import org.gcube.vomanagement.usermanagement.UserManager;
import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager;
import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.sun.mail.util.MailSSLSocketFactory; import com.sun.mail.util.MailSSLSocketFactory;
import jakarta.mail.Address;
import jakarta.mail.BodyPart;
import jakarta.mail.Flags;
import jakarta.mail.Folder;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.Multipart;
import jakarta.mail.NoSuchProviderException;
import jakarta.mail.Session;
import jakarta.mail.Store;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage.RecipientType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.ResponseBody;
/** /**
* *
* @author Massimiliano Assante, CNR-ISTI * @author Massimiliano Assante, CNR-ISTI
@ -70,14 +80,15 @@ import com.sun.mail.util.MailSSLSocketFactory;
public class PeriodicTask implements Runnable { public class PeriodicTask implements Runnable {
private static final Log _log = LogFactoryUtil.getLog(PeriodicTask.class); private static final Log _log = LogFactoryUtil.getLog(PeriodicTask.class);
private static final String APP_ID_NEWSFEED = "org.gcube.portlets.user.newsfeed.server.NewsServiceImpl"; private static final String APP_ID_NEWSFEED = "org.gcube.portlets.user.newsfeed.server.NewsServiceImpl";
private static final String SHUB_MESSAGES_ENDPOINT = "workspace/messages/";
private LibClient libClient; private DatabookStore socialStore;
private EmailPopAccount popAccount; private EmailPopAccount popAccount;
private SocialNetworkingSite site; private SocialNetworkingSite site;
public PeriodicTask(LibClient libClient, EmailPopAccount popAccount, HttpServletRequest request) { public PeriodicTask(DatabookStore store, EmailPopAccount popAccount, HttpServletRequest request) {
super(); super();
this.libClient = libClient; this.socialStore = store;
this.popAccount = popAccount; this.popAccount = popAccount;
this.site = new SocialNetworkingSite(request); this.site = new SocialNetworkingSite(request);
String serverName = request.getServerName(); String serverName = request.getServerName();
@ -136,6 +147,20 @@ public class PeriodicTask implements Runnable {
} }
return toReturn; return toReturn;
} }
private static String generateAuthorizationToken(String username, String scope) {
List<String> userRoles = new ArrayList<>();
userRoles.add(DEFAULT_ROLE);
String token;
try {
token = authorizationService().generateUserToken(new UserInfo(username, userRoles), scope);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return token;
}
private final static String DEFAULT_ROLE = "OrganizationMember"; private final static String DEFAULT_ROLE = "OrganizationMember";
private static void setAuthorizationToken(ASLSession session) throws Exception { private static void setAuthorizationToken(ASLSession session) throws Exception {
@ -204,8 +229,8 @@ public class PeriodicTask implements Runnable {
if (fakeSession != null && subAddressField != null) { if (fakeSession != null && subAddressField != null) {
if (subAddressField.endsWith(AppType.POST.toString()) || subAddressField.endsWith(AppType.POST.toString().toLowerCase())) { //it is a post, a comment on a post or a mention if (subAddressField.endsWith(AppType.POST.toString()) || subAddressField.endsWith(AppType.POST.toString().toLowerCase())) { //it is a post, a comment on a post or a mention
_log.debug("Looks like a post, a comment on a post or a mention to me"); _log.debug("Looks like a post, a comment on a post or a mention to me");
String postId = extractIdentifier(subAddressField); String feedId = extractIdentifier(subAddressField);
handlePostReply(portalName, postId, message, fakeSession); handlePostReply(portalName, feedId, message, fakeSession);
} }
else if (subAddressField.endsWith(AppType.MSG.toString()) || subAddressField.endsWith(AppType.MSG.toString().toLowerCase())) { //it is a message else if (subAddressField.endsWith(AppType.MSG.toString()) || subAddressField.endsWith(AppType.MSG.toString().toLowerCase())) { //it is a message
_log.debug("Looks like a message reply to me"); _log.debug("Looks like a message reply to me");
@ -250,6 +275,16 @@ public class PeriodicTask implements Runnable {
* @throws Exception * @throws Exception
*/ */
private void handleMessageReply(String portalName, String messageId, Message message, ASLSession fakeSession) { private void handleMessageReply(String portalName, String messageId, Message message, ASLSession fakeSession) {
String legacyToken = SecurityTokenProvider.instance.get();
_log.info("*****username=" + fakeSession.getUsername());
_log.info("*****context=" + fakeSession.getScope());
legacyToken = generateAuthorizationToken(fakeSession.getUsername(), fakeSession.getScope());
SecurityTokenProvider.instance.set(legacyToken);
String subject = ""; String subject = "";
String messageText = ""; String messageText = "";
try { try {
@ -261,34 +296,23 @@ public class PeriodicTask implements Runnable {
_log.debug("Found message reply, subject: " + subject + " body: " + messageText); _log.debug("Found message reply, subject: " + subject + " body: " + messageText);
String newMessageId = null; String newMessageId = null;
List<String> recipientIds = new ArrayList<>(); ArrayList<String> recipientIds = new ArrayList<String>();
try { try {
String username = fakeSession.getUsername(); String username = fakeSession.getUsername();
String scope = fakeSession.getScope(); String context = fakeSession.getScope();
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(context);
_log.debug("calling service token on scope " + scope); _log.debug("calling service token on context " + context);
List<String> userRoles = new ArrayList<>(); List<String> userRoles = new ArrayList<>();
userRoles.add(DEFAULT_ROLE); userRoles.add(DEFAULT_ROLE);
fakeSession.setSecurityToken(null); fakeSession.setSecurityToken(null);
String token = authorizationService().generateUserToken(new UserInfo(username, userRoles), scope); String token = authorizationService().generateUserToken(new UserInfo(username, userRoles), context);
SecurityTokenProvider.instance.set(token); SecurityTokenProvider.instance.set(token);
MessageManagerClient mmClient = AbstractPlugin.messages().build(); MessageInbox theMessage = null;
org.gcube.common.storagehub.model.messages.Message theMessage = null; _log.info("Looking for Message with id "+ messageId);
try { String messagesEndpoint = getStorageHubURLFromContext(context)+SHUB_MESSAGES_ENDPOINT;
theMessage = mmClient.get(messageId); theMessage = getMessageWSById(messagesEndpoint, messageId, token);
} _log.info("Got Message = " + theMessage.toString());
catch (IdNotFoundException e) {
_log.warn("Message with id "+ messageId + " could not be found, trying by name ...");
List<org.gcube.common.storagehub.model.messages.Message> messages = mmClient.getReceivedMessages();
Collections.reverse(messages); //the messages are returned in chronological order, but the messages we look for is one of the newests
_log.warn("Messages size="+messages.size());
for(org.gcube.common.storagehub.model.messages.Message msg: messages) {
if (msg.getName().equals(messageId)) {
theMessage = msg;
break;
}
}
}
if (theMessage != null) { if (theMessage != null) {
String[] addresses = theMessage.getAddresses(); String[] addresses = theMessage.getAddresses();
for (int i = 0; i < addresses.length; i++) { for (int i = 0; i < addresses.length; i++) {
@ -302,16 +326,19 @@ public class PeriodicTask implements Runnable {
recipientIds.remove(fakeSession.getUsername()); recipientIds.remove(fakeSession.getUsername());
_log.debug("Message Recipients:"); _log.debug("Message Recipients:");
ArrayList<Recipient> recipients = new ArrayList<Recipient>();
for (String rec : recipientIds) { for (String rec : recipientIds) {
recipients.add(new Recipient(rec));
_log.debug(rec); _log.debug(rec);
} }
_log.debug("Constructing reply message"); _log.debug("Constructing reply message");
messageText += getReplyHeaderMessage(sender, originalSentTime, originalText); messageText += getReplyHeaderMessage(sender, originalSentTime, originalText);
_log.debug("Trying to send message with subject: " + subject + " to: " + recipientIds.toString()); _log.debug("Trying to send message with subject: " + subject + " to: " + recipientIds.toString());
newMessageId = mmClient.sendMessage(recipientIds, subject, messageText, new ArrayList<String>()); MessageInputBean message2Send = new MessageInputBean(messageText, subject, recipients);
} else { MessageClient messagesClient = new MessageClient();
_log.error("Message with id "+ messageId + " could not be found even iterating by name, exiting."); newMessageId = messagesClient.writeMessage(message2Send);
} }
} catch (Exception e) { } catch (Exception e) {
@ -336,6 +363,48 @@ public class PeriodicTask implements Runnable {
} }
} }
/**
* temporary method that get the URL of the Shub based on the context
* @param context
* @return the url
*/
private String getStorageHubURLFromContext(String context) {
String toReturn = "";
if (context.startsWith("/d4science")) {
toReturn = "https://api.d4science.org/";
} else if (context.startsWith("/gcube")) {
toReturn = "https://api.dev.d4science.org/";
} else {
toReturn = "https://api.pre.d4science.org/";
}
return toReturn;
}
/**
* read a message from shub given the id
* @param urlString
* @param token
* @return
* @throws IOException
*/
private static MessageInbox getMessageWSById(String uri, String messageId, String token) throws IOException {
String urlString = uri+messageId;
_log.info("***** getMessageWSById urlString = " + urlString);
OkHttpClient client = new OkHttpClient().newBuilder().build();
Request request = new Request.Builder()
.url(urlString)
.addHeader("gcube-token", token)
.build();
ResponseBody responseBody = client.newCall(request).execute().body();
String json = responseBody.string();
_log.info("***** getMessageWSById Response = " + json);
ObjectMapper objectMapper = new ObjectMapper();
MessageInbox theMessage = objectMapper.readValue(json, MessageInbox.class);
return theMessage;
}
private String getReplyHeaderMessage(String senderId, Date date, String message) { private String getReplyHeaderMessage(String senderId, Date date, String message) {
List<String> toPass = new ArrayList<String>(); List<String> toPass = new ArrayList<String>();
toPass.add(senderId); toPass.add(senderId);
@ -370,12 +439,21 @@ public class PeriodicTask implements Runnable {
/** /**
* this method manages the replies coming from post notifications * this method manages the replies coming from post notifications
* @param portalName * @param portalName
* @param postId the identifier in the System managing the posts * @param postId the identifier in the System managing the feeds
* @param message the javax mail Message instance * @param message the javax mail Message instance
* @param fakeSession * @param fakeSession
* @throws Exception * @throws Exception
*/ */
private void handlePostReply(String portalName, String postId, Message message, ASLSession fakeSession) throws Exception { private void handlePostReply(String portalName, String postId, Message message, ASLSession fakeSession) throws Exception {
String token = AccessTokenProvider.instance.get();
String legacyToken = SecurityTokenProvider.instance.get();
_log.info("*****username=" + fakeSession.getUsername());
_log.info("*****context=" + fakeSession.getScope());
legacyToken = generateAuthorizationToken(fakeSession.getUsername(), fakeSession.getScope());
SecurityTokenProvider.instance.set(legacyToken);
String commentText = extractText(portalName, postId, message); String commentText = extractText(portalName, postId, message);
_log.info("Extracted id: " + postId + " text=" + commentText); _log.info("Extracted id: " + postId + " text=" + commentText);
String escapedCommentText = org.gcube.portal.socialmail.Utils.escapeHtmlAndTransformUrl(commentText); String escapedCommentText = org.gcube.portal.socialmail.Utils.escapeHtmlAndTransformUrl(commentText);
@ -386,13 +464,19 @@ public class PeriodicTask implements Runnable {
likePost(postId, fakeSession); likePost(postId, fakeSession);
} }
else { else {
Comment comment = new Comment(UUID.randomUUID().toString(), fakeSession.getUsername(), Comment comment = new Comment(UUID.randomUUID().toString(), fakeSession.getUsername(),
new Date(), postId, escapedCommentText, fakeSession.getUserFullName(), fakeSession.getUserAvatarId()); new Date(), postId, escapedCommentText, fakeSession.getUserFullName(), fakeSession.getUserAvatarId());
_log.debug("The EscapedCommentText =>" + escapedCommentText); _log.debug("The EscapedCommentText =>" + escapedCommentText);
boolean commentCommitResult = false; boolean commentCommitResult = false;
if (libClient.addCommentLib(comment)) try {
if (socialStore.addComment(comment))
commentCommitResult = true; commentCommitResult = true;
} catch (FeedIDNotFoundException e) {
_log.error("Related post not found for this comment " + e.getMessage());
e.printStackTrace();
}
if (commentCommitResult) { //the notifications should start if (commentCommitResult) { //the notifications should start
notifyUsersInvolved(comment, escapedCommentText, postId, fakeSession); notifyUsersInvolved(comment, escapedCommentText, postId, fakeSession);
} }
@ -406,32 +490,46 @@ public class PeriodicTask implements Runnable {
* @param fakeSession * @param fakeSession
*/ */
private void likePost(String postId, ASLSession fakeSession) { private void likePost(String postId, ASLSession fakeSession) {
String token = AccessTokenProvider.instance.get();
String legacyToken = SecurityTokenProvider.instance.get();
_log.info("*****username=" + fakeSession.getUsername());
_log.info("*****context=" + fakeSession.getScope());
legacyToken = generateAuthorizationToken(fakeSession.getUsername(), fakeSession.getScope());
SecurityTokenProvider.instance.set(legacyToken);
if (postId == null || postId.compareTo("") == 0) { if (postId == null || postId.compareTo("") == 0) {
_log.warn("Found email with no postId from " + fakeSession.getUserEmailAddress() + ". Going to trash it"); _log.warn("Found email with no feedId from " + fakeSession.getUserEmailAddress() + ". Going to trash it");
return; return;
} }
Like like = new Like(UUID.randomUUID().toString(), fakeSession.getUsername(), Like like = new Like(UUID.randomUUID().toString(), fakeSession.getUsername(),
new Date(), postId, fakeSession.getUserFullName(), fakeSession.getUserAvatarId()); new Date(), postId, fakeSession.getUserFullName(), fakeSession.getUserAvatarId());
boolean likeCommitResult = false; boolean likeCommitResult = false;
if (libClient.likeLib(like)); try {
if (socialStore.like(like));
likeCommitResult = true; likeCommitResult = true;
} catch (FeedIDNotFoundException e) {
_log.error("Related post not found for this like " + e.getMessage());
e.printStackTrace();
}
if (likeCommitResult) { //the notification should be delivered to the post owner if (likeCommitResult) { //the notification should be delivered to the post owner
try { try {
Post post = libClient.readPostLib(postId); Feed post = socialStore.readFeed(postId);
String postOwnerId = post.getEntityId(); String feedOwnerId = post.getEntityId();
boolean isApppost = post.isApplicationPost(); boolean isAppFeed = post.isApplicationFeed();
NotificationsManager nm = new ApplicationNotificationsManager( NotificationsManager nm = new ApplicationNotificationsManager(
site, site,
fakeSession.getScope(), post.getVreid(),
new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId()), new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId()),
APP_ID_NEWSFEED APP_ID_NEWSFEED
); );
if (! fakeSession.getUsername().equals(postOwnerId) && (!isApppost)) { if (! fakeSession.getUsername().equals(feedOwnerId) && (!isAppFeed)) {
boolean result = nm.notifyLikedPost(postOwnerId, postId, ""); boolean result = nm.notifyLikedFeed(feedOwnerId, postId, "");
_log.trace("Like Notification to post owner added? " + result); _log.trace("Like Notification to post owner added? " + result);
} }
} }
@ -443,48 +541,48 @@ public class PeriodicTask implements Runnable {
/** /**
* this method take care of notify all the users that need to be notified when someone comment * this method take care of notify all the users that need to be notified when someone comment
* @param comment * @param comment
* @param postId * @param feedId
* @param fakeSession * @param fakeSession
* @throws PrivacyLevelTypeNotFoundException * @throws PrivacyLevelTypeNotFoundException
* @throws PostTypeNotFoundException * @throws FeedTypeNotFoundException
* @throws PostIDNotFoundException * @throws FeedIDNotFoundException
* @throws ColumnNameNotFoundException * @throws ColumnNameNotFoundException
*/ */
private void notifyUsersInvolved(Comment comment, String commentText, String postId, ASLSession fakeSession) throws PrivacyLevelTypeNotFoundException, PostTypeNotFoundException, PostIDNotFoundException, ColumnNameNotFoundException { private void notifyUsersInvolved(Comment comment, String commentText, String feedId, ASLSession fakeSession) throws PrivacyLevelTypeNotFoundException, FeedTypeNotFoundException, FeedIDNotFoundException, ColumnNameNotFoundException {
Post post = libClient.readPostLib(postId); Feed post = socialStore.readFeed(feedId);
String postOwnerId = post.getEntityId(); String feedOwnerId = post.getEntityId();
boolean isApppost = post.isApplicationPost(); boolean isAppFeed = post.isApplicationFeed();
//if the user who commented this post is not the user who posted it notifies the poster user (post owner) //if the user who commented this post is not the user who posted it notifies the poster user (Feed owner)
NotificationsManager nm = new ApplicationNotificationsManager( NotificationsManager nm = new ApplicationNotificationsManager(
site, site,
post.getVreid(), post.getVreid(),
new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId()), new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId()),
APP_ID_NEWSFEED APP_ID_NEWSFEED
); );
if (! fakeSession.getUsername().equals(postOwnerId) && (!isApppost)) { if (! fakeSession.getUsername().equals(feedOwnerId) && (!isAppFeed)) {
boolean result = nm.notifyOwnCommentReply(postOwnerId, postId, commentText, comment.getKey()); boolean result = nm.notifyOwnCommentReply(feedOwnerId, feedId, commentText, comment.getKey());
_log.trace("Comment Notification to post owner added? " + result); _log.trace("Comment Notification to post owner added? " + result);
} }
//if there are users who liked this post they get notified, asynchronously with this thread //if there are users who liked this post they get notified, asynchronously with this thread
ArrayList<Like> likes = getAllLikesByPost(postId); ArrayList<Like> likes = getAllLikesByFeed(feedId);
Thread likesThread = new Thread(new LikeNotificationsThread(commentText, nm, likes, postOwnerId, comment.getKey())); Thread likesThread = new Thread(new LikeNotificationsThread(commentText, nm, likes, feedOwnerId, comment.getKey()));
likesThread.start(); likesThread.start();
UserManager userManager = new LiferayUserManager(); UserManager userManager = new LiferayUserManager();
//notify the other users who commented this post (excluding the ones above) //notify the other users who commented this post (excluding the ones above)
Thread commentsNotificationthread = new Thread(new CommentNotificationsThread(userManager, fakeSession.getUsername(), comment.getPostid(), commentText, nm, postOwnerId, comment.getKey(), likes)); Thread commentsNotificationthread = new Thread(new CommentNotificationsThread(socialStore, userManager, fakeSession.getUsername(), comment.getFeedid(), commentText, nm, feedOwnerId, comment.getKey(), likes));
commentsNotificationthread.start(); commentsNotificationthread.start();
} }
/** /**
* *
* @param postid * @param feedid
* @return * @return
*/ */
public ArrayList<Like> getAllLikesByPost(String postid) { public ArrayList<Like> getAllLikesByFeed(String feedid) {
_log.trace("Asking likes for " + postid); _log.trace("Asking likes for " + feedid);
ArrayList<Like> toReturn = (ArrayList<Like>) libClient.getAllLikesByPostLib(postid); ArrayList<Like> toReturn = (ArrayList<Like>) socialStore.getAllLikesByFeed(feedid);
return toReturn; return toReturn;
} }
/** /**