From b7d038c6704ef49deff9329b7c77781f9b20cff4 Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Fri, 18 Mar 2016 17:29:29 +0000 Subject: [PATCH] Start supporting user deletion and the possibility to resend the welcome email notification git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/admin/create-users@125785 82a268e6-3cf1-43bd-a215-b396298e98cf --- pom.xml | 15 ++- .../createusers/client/CreateUsersPanel.java | 32 +++++ .../client/HandleUsersService.java | 16 ++- .../client/HandleUsersServiceAsync.java | 6 +- .../client/ui/PopupPanelExtended.java | 9 ++ .../client/ui/RegisteredUsersTable.java | 64 +++++++-- .../createusers/server/CreateUsersImpl.java | 121 +++++++++++++++--- .../admin/createusers/shared/VreUserBean.java | 20 ++- 8 files changed, 237 insertions(+), 46 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/admin/createusers/client/ui/PopupPanelExtended.java diff --git a/pom.xml b/pom.xml index 0ccef3a..317ed07 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,16 @@ + + org.gcube.common.portal + portal-manager + provided + + + com.sun.mail + javax.mail + provided + com.google.gwt gwt-servlet @@ -127,11 +137,6 @@ home-library-model provided - - org.ow2.asm - asm-all - [5.0.0-SNAPSHOT, 6.0.0-SNAPSHOT) - org.gcube.common home-library diff --git a/src/main/java/org/gcube/portlets/admin/createusers/client/CreateUsersPanel.java b/src/main/java/org/gcube/portlets/admin/createusers/client/CreateUsersPanel.java index a8a1781..1e68a95 100644 --- a/src/main/java/org/gcube/portlets/admin/createusers/client/CreateUsersPanel.java +++ b/src/main/java/org/gcube/portlets/admin/createusers/client/CreateUsersPanel.java @@ -11,8 +11,11 @@ import com.github.gwtbootstrap.client.ui.TabPane; import com.github.gwtbootstrap.client.ui.TabPanel; import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.VerticalPanel; @@ -33,6 +36,9 @@ public class CreateUsersPanel extends Composite { // registered users subpanel private TabPane registeredUsersSubPanel = new TabPane("Already Created Users") ; + + // TODO remove + private TabPane sendMailTabPane = new TabPane("Send Mail"); // Create a remote service proxy to talk to the server-side user manager service. private final HandleUsersServiceAsync userServices = GWT.create(HandleUsersService.class); @@ -56,6 +62,32 @@ public class CreateUsersPanel extends Composite { LoadingText loader = new LoadingText(); loader.setVisible(true); registeredUsersSubPanel.add(loader); + + // TODO remove + Button sendMail = new Button("Test send email"); + sendMail.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + GWT.log("send email requested"); + userServices.sendEmailToUser("costantino.perciante@isti.cnr.it", new AsyncCallback() { + + @Override + public void onSuccess(Void result) { + // TODO Auto-generated method stub + GWT.log("ok"); + } + + @Override + public void onFailure(Throwable caught) { + // TODO Auto-generated method stub + GWT.log("not ok"); + } + }); + } + }); + sendMailTabPane.add(sendMail); + navTabs.add(sendMailTabPane); // add stuff to the main panel navTabs.add(addUserSubPanel); diff --git a/src/main/java/org/gcube/portlets/admin/createusers/client/HandleUsersService.java b/src/main/java/org/gcube/portlets/admin/createusers/client/HandleUsersService.java index 4db4baf..c2d4bb4 100644 --- a/src/main/java/org/gcube/portlets/admin/createusers/client/HandleUsersService.java +++ b/src/main/java/org/gcube/portlets/admin/createusers/client/HandleUsersService.java @@ -16,18 +16,30 @@ public interface HandleUsersService extends RemoteService { * Register this user to the current vre. * @param name * @param surname - * @param company + * @param institution/organization * @param email * @param sendEmail * @param isMale * @return the registered user information or null if the registration failed */ - VreUserBean register(String name, String surname, String company, String email, boolean sendEmail, boolean isMale); + VreUserBean register(String name, String surname, String institution, String email, boolean sendEmail, boolean isMale); /** * Retrieve the list of already registered users. * @return a list of already registered users or null in case of error */ List getAlreadyRegisterdUsers(); + + /** + * Delete an already invited user that didn't change his password. + * @param email + */ + public boolean deleteInvitedUser(String email); + + /** + * Send the registration email to this user + * @param email + */ + public void sendEmailToUser(String email); } diff --git a/src/main/java/org/gcube/portlets/admin/createusers/client/HandleUsersServiceAsync.java b/src/main/java/org/gcube/portlets/admin/createusers/client/HandleUsersServiceAsync.java index 4cc6c02..b8896cb 100644 --- a/src/main/java/org/gcube/portlets/admin/createusers/client/HandleUsersServiceAsync.java +++ b/src/main/java/org/gcube/portlets/admin/createusers/client/HandleUsersServiceAsync.java @@ -14,6 +14,10 @@ public interface HandleUsersServiceAsync { void getAlreadyRegisterdUsers(AsyncCallback> callback); - void register(String name, String surname, String company, String email, + void register(String name, String surname, String institution, String email, boolean sendEmail, boolean isMale, AsyncCallback callback); + + void deleteInvitedUser(String email, AsyncCallback callback); + + void sendEmailToUser(String email, AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/admin/createusers/client/ui/PopupPanelExtended.java b/src/main/java/org/gcube/portlets/admin/createusers/client/ui/PopupPanelExtended.java new file mode 100644 index 0000000..0970533 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/createusers/client/ui/PopupPanelExtended.java @@ -0,0 +1,9 @@ +package org.gcube.portlets.admin.createusers.client.ui; + +import com.google.gwt.user.client.ui.PopupPanel; + +public class PopupPanelExtended extends PopupPanel { + + + +} diff --git a/src/main/java/org/gcube/portlets/admin/createusers/client/ui/RegisteredUsersTable.java b/src/main/java/org/gcube/portlets/admin/createusers/client/ui/RegisteredUsersTable.java index f3cbbc5..db2ebc8 100644 --- a/src/main/java/org/gcube/portlets/admin/createusers/client/ui/RegisteredUsersTable.java +++ b/src/main/java/org/gcube/portlets/admin/createusers/client/ui/RegisteredUsersTable.java @@ -7,6 +7,7 @@ import org.gcube.portlets.admin.createusers.client.event.AddUserEvent; import org.gcube.portlets.admin.createusers.client.event.AddUserEventHandler; import org.gcube.portlets.admin.createusers.shared.VreUserBean; +import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.CellTable; import com.google.gwt.cell.client.Cell; import com.google.gwt.cell.client.TextCell; @@ -17,6 +18,9 @@ import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.PopupPanel; +import com.google.gwt.view.client.CellPreviewEvent; +import com.google.gwt.view.client.CellPreviewEvent.Handler; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.Range; @@ -113,26 +117,26 @@ public class RegisteredUsersTable extends Composite { surnameCol.setDefaultSortAscending(false); table.addColumnSortHandler(surnameColHandler); - // company and handler for sorting - Column companyCol = getColumn(new TextCell(), new GetValue() { + // institution/organization and handler for sorting + Column institutionCol = getColumn(new TextCell(), new GetValue() { @Override public String getValue(VreUserBean user) { - return user.getCompany(); + return user.getInstitution(); } }); - ListHandler companyColHandler = new ListHandler(dataProvider.getList()); - companyColHandler.setComparator(companyCol, new Comparator() { + ListHandler institutionColHandler = new ListHandler(dataProvider.getList()); + institutionColHandler.setComparator(institutionCol, new Comparator() { @Override public int compare(VreUserBean o1, VreUserBean o2) { - return o1.getCompany().compareTo(o2.getCompany()); + return o1.getInstitution().compareTo(o2.getInstitution()); } }); - companyCol.setSortable(true); - companyCol.setDefaultSortAscending(false); - table.addColumnSortHandler(companyColHandler); + institutionCol.setSortable(true); + institutionCol.setDefaultSortAscending(false); + table.addColumnSortHandler(institutionColHandler); // password and handler for sorting Column passwordChanged = getColumn(new TextCell(), new GetValue() { @@ -178,6 +182,42 @@ public class RegisteredUsersTable extends Composite { table.addColumnSortHandler(registrationDateColHandler); table.getColumnSortList().push(registrationDate); + // add row click handler + table.addCellPreviewHandler(new Handler() { + + @Override + public void onCellPreview(CellPreviewEvent event) { + boolean isClick = "click".equals(event.getNativeEvent().getType()); + if(isClick){ + + int rowIndex = event.getIndex(); + PopupPanel drop = new PopupPanel(); + drop.setGlassEnabled(true); + + // add buttons and events + VreUserBean rowBean = dataProvider.getList().get(rowIndex); + + Button deleteUserButton = new Button("Delete User"); + Button sendWelcomeButton = new Button("Send Email"); + + + if(!rowBean.isPasswordChanged()) + deleteUserButton.setEnabled(false); + + // add to drop + drop.add(deleteUserButton); + drop.add(sendWelcomeButton); + + // position and show + int left = table.getRowElement(rowIndex).getAbsoluteLeft(); + int top = table.getRowElement(rowIndex).getAbsoluteTop(); + drop.setPopupPosition(left, top); + drop.show(); + + } + } + }); + // add columns SafeHtmlBuilder builder = new SafeHtmlBuilder(); builder.appendHtmlConstant(""); @@ -195,10 +235,10 @@ public class RegisteredUsersTable extends Composite { builder.appendHtmlConstant(""); table.addColumn(surnameCol, builder.toSafeHtml()); builder = new SafeHtmlBuilder(); - builder.appendHtmlConstant(""); - builder.appendEscaped("Company"); + builder.appendHtmlConstant(""); + builder.appendEscaped("Institution / Organisation"); builder.appendHtmlConstant(""); - table.addColumn(companyCol, builder.toSafeHtml()); + table.addColumn(institutionCol, builder.toSafeHtml()); builder = new SafeHtmlBuilder(); builder.appendHtmlConstant(""); builder.appendEscaped("Password Changed"); diff --git a/src/main/java/org/gcube/portlets/admin/createusers/server/CreateUsersImpl.java b/src/main/java/org/gcube/portlets/admin/createusers/server/CreateUsersImpl.java index aa30834..0fca4b6 100644 --- a/src/main/java/org/gcube/portlets/admin/createusers/server/CreateUsersImpl.java +++ b/src/main/java/org/gcube/portlets/admin/createusers/server/CreateUsersImpl.java @@ -9,13 +9,18 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import javax.mail.internet.InternetAddress; + import org.gcube.application.framework.core.session.ASLSession; import org.gcube.application.framework.core.session.SessionManager; import org.gcube.common.homelibrary.home.HomeLibrary; +import org.gcube.common.portal.PortalContext; +import org.gcube.portal.custom.communitymanager.OrganizationsUtil; import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; import org.gcube.portlets.admin.createusers.client.HandleUsersService; import org.gcube.portlets.admin.createusers.shared.VreUserBean; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; +import org.gcube.vomanagement.usermanagement.exception.UserManagementPortalException; import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayGroupManager; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager; @@ -24,8 +29,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import com.liferay.mail.service.MailServiceUtil; import com.liferay.portal.kernel.dao.jdbc.DataAccess; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; +import com.liferay.portal.kernel.mail.MailMessage; import com.liferay.portal.service.UserLocalServiceUtil; +import com.liferay.portal.util.PortalUtil; /** * The server side implementation of the RPC service. @@ -47,7 +57,7 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers private static final String FIELD_EMAIL = "email"; private static final String FIELD_NAME = "name"; private static final String FIELD_SURNAME = "surname"; - private static final String FIELD_COMPANY = "company"; + private static final String FIELD_INSTITUTION = "institution_organization"; private static final String FIELD_REGISTRATION_DATE = "registration_date"; private static final String FIELD_VRE = "vre"; @@ -105,7 +115,7 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers + "email varchar(255) NOT NULL, " + "name" + " varchar(255) NOT NULL, " + "surname" + " varchar(255) NOT NULL, " - + "company" + " varchar(255) DEFAULT NULL, " + + "institution_organization" + " varchar(255) DEFAULT NULL, " + "vre" + " varchar(255) NOT NULL, " + "registration_date" + " TIMESTAMP NOT NULL)"); @@ -167,16 +177,74 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers return user; } + @Override + public boolean deleteInvitedUser(String email) { + + try{ + + Connection con = DataAccess.getConnection(); + boolean deletedLiferay = deleteUserFromLiferay(email); + boolean deletedTable = deleteUserFromTable(email, con); + return deletedLiferay && deletedTable; + + }catch(SQLException e){ + logger.debug("Error while trying to delete user with email = " + email, e); + } + + return false; + } @Override - public VreUserBean register(String name, String surname, String company, + public void sendEmailToUser(String email) { + + logger.debug("Sending welcome message to user with email " + email); + try{ + + PortalContext context = PortalContext.getConfiguration(); + String gatewayName = context.getGatewayName(); + String emailSender = context.getSenderEmail(); + + InternetAddress to = new InternetAddress(email); + InternetAddress from = new InternetAddress(emailSender); + + LiferayUserManager userManager = new LiferayUserManager(); + String portalUrl = PortalUtil.getPortalURL(OrganizationsUtil.getCompany().getVirtualHostname(), 443, true); + String username = userManager.getFullNameFromEmail(email); + + MailMessage mailMessage = new MailMessage(); + mailMessage.setFrom(from); + mailMessage.setTo(to); + + String body = "

Dear " + username + ",
" + "
" + + "Welcome! You recently created an account at http:// " + portalUrl + ". Your password is not sent by email for security purposes.
" + + "
" + "Sincerely,
" + + gatewayName + "
" + + emailSender + "
" + portalUrl; + String subject = "http://" + portalUrl + ": Your New Account was created successfully!"; + + logger.debug("Body is " + body); + logger.debug("Subject is " + subject); + + mailMessage.setBody(body); + mailMessage.setSubject(subject); + mailMessage.setHTMLFormat(true); + MailServiceUtil.sendEmail(mailMessage); + }catch(Exception e){ + logger.error("Error while sending email to user " + email, e); + } + + } + + + @Override + public VreUserBean register(String name, String surname, String institution, String email, boolean sendEmail, boolean isMale) { // if in dev mode return ok if (!isWithinPortal()) { logger.debug("In dev mode."); - return new VreUserBean(name, surname, company, email, false, System.currentTimeMillis(), isMale); + return new VreUserBean(name, surname, institution, email, false, System.currentTimeMillis(), isMale); }else{ @@ -205,7 +273,7 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers } else{ - logger.debug("Trying to add user: " + name + ", " + surname + ", " + email + ", " + company); + logger.debug("Trying to add user: " + name + ", " + surname + ", " + email + ", " + institution); Connection con = null; try{ @@ -214,7 +282,7 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers "("+ FIELD_EMAIL + "," + FIELD_NAME +"," + FIELD_SURNAME + "," - + FIELD_COMPANY + "," + + FIELD_INSTITUTION + "," + FIELD_REGISTRATION_DATE + "," + FIELD_VRE + ") values(?, ?, ?, ?, ?, ?)"; @@ -224,7 +292,7 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers statement.setString(1, email); statement.setString(2, name); statement.setString(3, surname); - statement.setString(4, company); + statement.setString(4, institution); statement.setTimestamp(5, new Timestamp(timestamp)); statement.setString(6, vre); int res = statement.executeUpdate(); @@ -242,7 +310,7 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers name, "", surname, - company, + institution, "", isMale, null, @@ -283,7 +351,7 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers } } - return new VreUserBean(name, surname, company, email, false, timestamp, isMale); + return new VreUserBean(name, surname, institution, email, false, timestamp, isMale); } } } @@ -330,15 +398,15 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers String name = rs.getString(FIELD_NAME); String surname = rs.getString(FIELD_SURNAME); - String company = rs.getString(FIELD_COMPANY); + String institution = rs.getString(FIELD_INSTITUTION); String email = rs.getString(FIELD_EMAIL); long registrationDate = rs.getTimestamp(FIELD_REGISTRATION_DATE).getTime(); // check if the password has been changed or not wrt the default one boolean passwordChanged = userManager.isPasswordChanged(email); - // the gender information is useless (set to false) - toReturn.add(new VreUserBean(name, surname, company, email, passwordChanged, registrationDate, false)); + + toReturn.add(new VreUserBean(name, surname, institution, email, passwordChanged, registrationDate, false)); } @@ -379,21 +447,44 @@ public class CreateUsersImpl extends RemoteServiceServlet implements HandleUsers * @param email * @param con */ - private void deleteUserFromTable(String email, Connection con) { + private boolean deleteUserFromTable(String email, Connection con) { try{ logger.debug("Going to delete user with email " + email); - + String remove = "DELETE FROM " + REGISTERED_USERS_TABLE + " WHERE " + FIELD_EMAIL + "= ?"; PreparedStatement statementDelete = con.prepareStatement(remove); statementDelete.setString(1, email); - statementDelete.executeUpdate(); + int res = statementDelete.executeUpdate(); + + if(res == 1) + return true; }catch(Exception e){ logger.error("Error while deleting user=" + email + "from the table"); } + + return false; + } + + /** + * Delete user from liferay + * @param email + */ + private boolean deleteUserFromLiferay(String email) { + + LiferayUserManager userManager = new LiferayUserManager(); + try { + userManager.deleteUserByEMail(email); + return true; + } catch (PortalException | SystemException + | UserManagementSystemException | UserManagementPortalException e) { + logger.error("Unable to delete user from liferay", e); + } + + return false; } /** diff --git a/src/main/java/org/gcube/portlets/admin/createusers/shared/VreUserBean.java b/src/main/java/org/gcube/portlets/admin/createusers/shared/VreUserBean.java index 1db9da5..95b1ec1 100644 --- a/src/main/java/org/gcube/portlets/admin/createusers/shared/VreUserBean.java +++ b/src/main/java/org/gcube/portlets/admin/createusers/shared/VreUserBean.java @@ -10,10 +10,9 @@ public class VreUserBean implements Serializable{ private static final long serialVersionUID = -8674087530839002999L; - private String name; private String surname; - private String company; + private String institution; private String email; private boolean passwordChanged; private long regisrationDate; @@ -30,18 +29,18 @@ public class VreUserBean implements Serializable{ * Build a user bean object. * @param name * @param surname - * @param company + * @param institution * @param email * @param passwordChanged * @param registrationDate * @param isMale */ - public VreUserBean(String name, String surname, String company, + public VreUserBean(String name, String surname, String institution, String email, boolean passwordChanged, long registrationDate, boolean isMale) { super(); this.name = name; this.surname = surname; - this.company = company; + this.institution = institution; this.email = email; this.passwordChanged = passwordChanged; this.regisrationDate = registrationDate; @@ -64,12 +63,12 @@ public class VreUserBean implements Serializable{ this.surname = surname; } - public String getCompany() { - return company; + public String getInstitution() { + return institution; } - public void setCompany(String company) { - this.company = company; + public void setInstitution(String institution) { + this.institution = institution; } public String getEmail() { @@ -109,9 +108,8 @@ public class VreUserBean implements Serializable{ @Override public String toString() { return "VreUserBean [name=" + name + ", surname=" + surname - + ", company=" + company + ", email=" + email + + ", institution=" + institution + ", email=" + email + ", passwordChanged=" + passwordChanged + ", regisrationDate=" + regisrationDate + ", isMale=" + isMale + "]"; } - }