package org.gcube.vomanagement.usermanagement.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.gcube.vomanagement.usermanagement.GroupManager; import org.gcube.vomanagement.usermanagement.UserManager; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.RoleRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.UserManagementPortalException; import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException; import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault; import org.gcube.vomanagement.usermanagement.model.Email; import org.gcube.vomanagement.usermanagement.model.GCubeMembershipRequest; import org.gcube.vomanagement.usermanagement.model.GCubeRole; import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.gcube.vomanagement.usermanagement.model.MembershipRequestStatus; import org.gcube.vomanagement.usermanagement.util.ManagementUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.util.DigesterUtil; import com.liferay.portal.kernel.util.HttpUtil; import com.liferay.portal.model.EmailAddress; import com.liferay.portal.model.Group; import com.liferay.portal.model.MembershipRequest; import com.liferay.portal.model.Role; import com.liferay.portal.model.RoleConstants; import com.liferay.portal.model.User; import com.liferay.portal.security.auth.PrincipalThreadLocal; import com.liferay.portal.security.permission.PermissionChecker; import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil; import com.liferay.portal.security.permission.PermissionThreadLocal; import com.liferay.portal.service.GroupLocalServiceUtil; import com.liferay.portal.service.ImageLocalServiceUtil; import com.liferay.portal.service.MembershipRequestLocalServiceUtil; import com.liferay.portal.service.RoleLocalServiceUtil; import com.liferay.portal.service.RoleServiceUtil; import com.liferay.portal.service.ServiceContext; import com.liferay.portal.service.UserLocalServiceUtil; import com.liferay.portal.util.PortalUtil; import com.liferay.portal.webserver.WebServerServletTokenUtil; public class LiferayUserManager implements UserManager { /** * logger */ private static final Logger _log = LoggerFactory.getLogger(LiferayUserManager.class); /** * this method sets the Admin privileges in the local thread, needed to perform such operations. */ private void doAsAdmin() { try { User admin = getAdmin(); _log.info("Admin found: " + admin.getScreenName()); long userId = admin.getUserId(); PrincipalThreadLocal.setName(userId); PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(UserLocalServiceUtil.getUser(userId)); PermissionThreadLocal.setPermissionChecker(permissionChecker); } catch (Exception e) { e.printStackTrace(); } } public static User getAdmin() { final long companyId = PortalUtil.getDefaultCompanyId(); Role role = null; try { role = getRoleById(companyId, RoleConstants.ADMINISTRATOR); for (final User admin : UserLocalServiceUtil.getRoleUsers(role.getRoleId())) { if (admin.isActive()) return admin; } } catch (final Exception e) { _log.error("Utils::getAdmin Exception", e); } return null; } public static Role getRoleById(final long companyId, final String roleStrId) { try { return RoleLocalServiceUtil.getRole(companyId, roleStrId); } catch (final Exception e) { _log.error("Utils::getRoleById Exception", e); } return null; } //simple user mapping private static GCubeUser mapLRUser(User u) throws PortalException, SystemException { if (u != null) { List emails = new ArrayList(); for (EmailAddress e : u.getEmailAddresses()) { emails.add(new Email(e.getAddress(), e.getType().toString(), e.isPrimary())); } return new GCubeUser( u.getUserId(), u.getScreenName(), u.getEmailAddress(), u.getFirstName(), u.getMiddleName(), u.getLastName(), u.getFullName(), u.getCreateDate().getTime(), getUserAvatarAbsoluteURL(u), u.isMale(), u.getJobTitle(), u.getOpenId(), emails); } else return null; } /** * * @param u * @return the absolute path of the avatar URL comprising security token e.g. /image/user_male_portrait?img_id=22910&img_id_token=0RJ5WkeDV9F9bETGlqzb7LahygM%3D&t=1458899199747 * @throws PortalException * @throws SystemException */ private static String getUserAvatarAbsoluteURL(User u) throws PortalException, SystemException { String pictureBaseURL = u.isMale() ? "/image/user_male_portrait?img_id=" : "/image/user_female_portrait?img_id="; String img_id_token = HttpUtil.encodeURL(DigesterUtil.digest(u.getUuid())); String token = WebServerServletTokenUtil.getToken(u.getPortraitId()); return pictureBaseURL+u.getPortraitId()+"&img_id_token="+img_id_token+"&t="+token; } private static GCubeMembershipRequest mapLRMembershipRequest(MembershipRequest req) throws PortalException, SystemException { MembershipRequestStatus requestStatus = MembershipRequestStatus.REQUEST; if (req.getStatusId() == 1) requestStatus = MembershipRequestStatus.APPROVED; else if (req.getStatusId() == 2) requestStatus = MembershipRequestStatus.DENIED; //get the user requesting it GCubeUser requestingUser = null; User theUser = UserLocalServiceUtil.getUser(req.getUserId()); if (theUser.isActive()) requestingUser = mapLRUser(theUser); GCubeUser replierUser = null; if (req.getReplierUserId() != 0) { //means there is a reply for this request User theReplier = UserLocalServiceUtil.getUser(req.getReplierUserId()); if (theUser.isActive()) replierUser = mapLRUser(theReplier); } GCubeMembershipRequest toReturn = new GCubeMembershipRequest( req.getMembershipRequestId(), req.getGroupId(), requestingUser, req.getCreateDate(), req.getComments(), req.getReplyComments(), replierUser, req.getCreateDate(), requestStatus); return toReturn; } /** * {@inheritDoc} */ @Override public GCubeUser createUser(boolean autoScreenName, String username, String email, String firstName, String middleName, String lastName, String jobTitle, String location_industry, String backgroundSummary, boolean male, String reminderQuestion, String reminderAnswer) throws UserManagementSystemException { return createUserBody( autoScreenName, username, email, firstName, middleName, lastName, jobTitle, location_industry, backgroundSummary, male, reminderQuestion, reminderAnswer, false, false, null); } /** * {@inheritDoc} */ @Override public GCubeUser createUser(boolean autoScreenName, String username, String email, String firstName, String middleName, String lastName, String jobTitle, String location_industry, String backgroundSummary, boolean male, String reminderQuestion, String reminderAnswer, boolean sendEmail, boolean forcePasswordReset) throws UserManagementSystemException { return createUserBody( autoScreenName, username, email, firstName, middleName, lastName, jobTitle, backgroundSummary, location_industry, male, reminderQuestion, reminderAnswer, sendEmail, forcePasswordReset, null); } /** * {@inheritDoc} */ @Override public GCubeUser createUser(boolean autoScreenName, String username, String email, String firstName, String middleName, String lastName, String jobTitle, String location_industry, String backgroundSummary, boolean male, String reminderQuestion, String reminderAnswer, boolean sendEmail, boolean forcePasswordReset, byte[] portraitBytes) throws UserManagementSystemException { return createUserBody( autoScreenName, username, email, firstName, middleName, lastName, jobTitle, backgroundSummary, location_industry, male, reminderQuestion, reminderAnswer, sendEmail, forcePasswordReset, portraitBytes); } private GCubeUser createUserBody(boolean autoScreenName, String username, String email, String firstName, String middleName, String lastName, String jobTitle, String location_industry, String backgroundSummary, boolean male, String reminderQuestion, String reminderAnswer, boolean sendEmail, boolean forcePasswordReset, byte[] portraitBytes){ GCubeUser toReturn = null; try { _log.debug("Trying createuser " + email); Long defaultCompanyId = PortalUtil.getDefaultCompanyId(); Long defaultUserId = UserLocalServiceUtil.getDefaultUserId(defaultCompanyId); boolean autoPassword = false; Locale locale = new Locale("en_US"); int prefixId = 0; int suffixId = 0; int birthdayMonth = 1; int birthdayDay = 1; int birthdayYear = 1970; String password1 = "training1"; String password2 = password1; User added = UserLocalServiceUtil.addUser( defaultUserId, defaultCompanyId, autoPassword, password1, password2, autoScreenName, username, email, 0L, location_industry, locale, firstName, middleName, lastName, prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle, null, null, null, null, sendEmail, new ServiceContext()); added.setComments(backgroundSummary); UserLocalServiceUtil.updateUser(added); _log.debug("CreateUser " + lastName + " SUCCESS"); UserLocalServiceUtil.updateAgreedToTermsOfUse(added.getUserId(), true); UserLocalServiceUtil.updatePasswordReset(added.getUserId(), forcePasswordReset); if (reminderQuestion == null || reminderQuestion.compareTo("") == 0) reminderQuestion = "Unknown question"; if (reminderAnswer == null || reminderAnswer.compareTo("") == 0) reminderAnswer = "Unknown answer"; UserLocalServiceUtil.updateReminderQuery(added.getUserId(), reminderQuestion, reminderAnswer); _log.debug("User " + lastName + " has agreed to ToU"); _log.debug("User " + lastName + " updatePasswordReset & updateReminderQuery"); // try to change user's avatar if(portraitBytes != null){ try{ _log.debug("Updating user's avatar"); UserLocalServiceUtil.updatePortrait(added.getUserId(), portraitBytes); _log.debug("User's avatar set OK"); }catch(PortalException e1){ _log.debug("Unable to set user's avatar", e1); } catch(SystemException e1){ _log.debug("Unable to set user's avatar", e1); } } return mapLRUser(added); } catch (SystemException e) { e.printStackTrace(); } catch (PortalException e) { e.printStackTrace(); } return toReturn; } /** * {@inheritDoc} */ @Override public GCubeUser getUserByUsername(String username) throws UserManagementSystemException, UserRetrievalFault { User toGet = null; GCubeUser toReturn = null; try { _log.debug("Trying to fetch user by username = " + username); toGet = UserLocalServiceUtil.getUserByScreenName(ManagementUtils.getCompany().getCompanyId(), username); toReturn = mapLRUser(toGet); } catch (PortalException e) { throw new UserRetrievalFault("User not existing", e); } catch (SystemException e) { throw new UserManagementSystemException(e.getMessage(), e); } return toReturn; } /** * {@inheritDoc} */ @Override @Deprecated public GCubeUser getUserByScreenName(String username) throws UserManagementSystemException, UserRetrievalFault { return getUserByUsername(username); } /** * {@inheritDoc} */ @Override public GCubeUser getUserById(long userId) throws UserManagementSystemException, UserRetrievalFault { User toGet = null; GCubeUser toReturn = null; try { _log.debug("Trying to fetch user by LR Id = " + userId); toGet = UserLocalServiceUtil.getUser(userId); toReturn = mapLRUser(toGet); } catch (PortalException e) { throw new UserRetrievalFault("User not existing", e); } catch (SystemException e) { throw new UserManagementSystemException(e.getMessage(), e); } return toReturn; } /** * {@inheritDoc} */ @Override public String getUserProfessionalBackground(long userId) throws UserManagementSystemException, UserRetrievalFault { User toGet = null; String toReturn = null; try { _log.debug("Trying to fetch user Professional Background by LR Id = " + userId); toGet = UserLocalServiceUtil.getUser(userId); toReturn = toGet.getComments(); } catch (PortalException e) { throw new UserRetrievalFault("User not existing", e); } catch (SystemException e) { throw new UserManagementSystemException(e.getMessage(), e); } return toReturn; } /** * {@inheritDoc} */ @Override public GCubeUser getUserByEmail(String emailAddress) throws UserManagementSystemException, UserRetrievalFault { User toGet = null; GCubeUser toReturn = null; try { _log.debug("Trying to fetch user by emailAddress = " + emailAddress); toGet = UserLocalServiceUtil.getUserByEmailAddress(ManagementUtils.getCompany().getCompanyId(), emailAddress); toReturn = mapLRUser(toGet); } catch (PortalException e) { throw new UserRetrievalFault("User not existing", e); } catch (SystemException e) { throw new UserManagementSystemException(e.getMessage(), e); } return toReturn; } /** * {@inheritDoc} * */ @Override public long getUserId(String screenName) throws UserManagementSystemException, UserRetrievalFault { return getUserByUsername(screenName).getUserId(); } /* * LISTING ENTITIES */ /** * {@inheritDoc} */ @Override public List listUsers() throws UserManagementSystemException { List toReturn = new ArrayList(); try { List lrUsers = UserLocalServiceUtil.getUsers(0, UserLocalServiceUtil.getUsersCount()); for (User user : lrUsers) { if (user.isActive()) toReturn.add(mapLRUser(user)); } } catch (SystemException e) { throw new UserManagementSystemException(e.getMessage(), e); } catch (PortalException e) { e.printStackTrace(); } return toReturn; } /** * {@inheritDoc} */ @Override public List listUsersByGroup(long groupId) throws UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault { List toReturn = new ArrayList(); try { for (User user : UserLocalServiceUtil.getGroupUsers(groupId)) { if (user.isActive()) toReturn.add(mapLRUser(user)); } } catch (PortalException e) { e.printStackTrace(); } catch (SystemException e) { e.printStackTrace(); } return toReturn; } /** * {@inheritDoc} */ @Override public List listUsersByGroupName(String name) throws UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault { List toReturn = new ArrayList(); try { Group g = (GroupLocalServiceUtil.getGroup(ManagementUtils.getCompany().getCompanyId(), name)); for (User user : UserLocalServiceUtil.getGroupUsers(g.getGroupId())) { if (user.isActive()) toReturn.add(mapLRUser(user)); } } catch (PortalException e) { e.printStackTrace(); } catch (SystemException e) { e.printStackTrace(); } return toReturn; } /** * {@inheritDoc} */ @Override public Map> listUsersAndRolesByGroup(long groupId) throws GroupRetrievalFault, UserManagementSystemException, UserRetrievalFault { Map> toReturn = new HashMap>(); try { Group g = GroupLocalServiceUtil.getGroup(groupId); _log.debug("Asked for users and roles of group: "+g.getName()); for (User user : UserLocalServiceUtil.getGroupUsers(groupId)) { if (user.isActive()) { long userId = user.getUserId(); doAsAdmin(); List userRoles = RoleServiceUtil.getUserGroupRoles(userId, groupId); List toAdd = new ArrayList(); for (Role role : userRoles) { toAdd.add(LiferayRoleManager.mapLRRole(role)); } toReturn.put(mapLRUser(user), toAdd); } } } catch (PortalException e1) { throw new GroupRetrievalFault("Group not existing (I think you better check)", e1); } catch (Exception e) { e.printStackTrace(); } return toReturn; } /** * {@inheritDoc} */ @Override public List listUsersByGroupAndRole(long groupId, long roleId) throws UserManagementSystemException, RoleRetrievalFault, GroupRetrievalFault, UserRetrievalFault { Map> toIterate = listUsersAndRolesByGroup(groupId); List toReturn = new ArrayList(); Role askedRole = null; try { askedRole = RoleServiceUtil.getRole(roleId); } catch (PortalException e) { throw new RoleRetrievalFault("Role not existing (I think you better check) roleId="+roleId, e); } catch (SystemException e) { e.printStackTrace(); } _log.debug("Asked for role: "+askedRole.getName()); for (GCubeUser u : toIterate.keySet()) { for (GCubeRole role : toIterate.get(u)) if (role.getRoleId() == roleId) { toReturn.add(u); break; } } return toReturn; } /* * END LISTING ENTITIES */ /* * MEMBERSHIP REQUESTS */ /** * {@inheritDoc} */ @Override public List listMembershipRequestsByGroup(long groupId) throws UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault { try { Group g = GroupLocalServiceUtil.getGroup(groupId); _log.debug("Asked for pending users list of group: "+g.getName()); } catch (PortalException e1) { throw new GroupRetrievalFault("Group not existing", e1); } catch (SystemException e) { e.printStackTrace(); } List toReturn = new ArrayList(); try { int requestesNo = MembershipRequestLocalServiceUtil.getMembershipRequestsCount(); for (MembershipRequest req : MembershipRequestLocalServiceUtil.getMembershipRequests(0, requestesNo)) { if (req.getGroupId() == groupId) { toReturn.add(mapLRMembershipRequest(req)); } } } catch (SystemException e) { e.printStackTrace(); } catch (PortalException e) { e.printStackTrace(); } return toReturn; } /** * {@inheritDoc} */ @Override public GCubeMembershipRequest requestMembership(long userId, long groupId, String comment) throws UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault { try { MembershipRequest req = MembershipRequestLocalServiceUtil.addMembershipRequest(userId, groupId, comment, new ServiceContext()); return mapLRMembershipRequest(req); } catch (PortalException e) { e.printStackTrace(); } catch (SystemException e) { e.printStackTrace(); } return null; } /** * {@inheritDoc} */ @Override public GCubeMembershipRequest acceptMembershipRequest(long requestUserId,long groupId, boolean addUserToGroup, String replyUsername, String replyComment) throws UserManagementSystemException, GroupRetrievalFault, UserManagementPortalException { try { GCubeUser replyMan = getUserByUsername(replyUsername); List requests = listMembershipRequestsByGroup(groupId); for (GCubeMembershipRequest req : requests) { if (req.getRequestingUser().getUserId() == requestUserId) { MembershipRequestLocalServiceUtil.updateStatus(replyMan.getUserId(), req.getMembershipRequestId(), replyComment, 1, addUserToGroup, new ServiceContext()); return mapLRMembershipRequest(MembershipRequestLocalServiceUtil.getMembershipRequest(req.getMembershipRequestId())); } } } catch (UserRetrievalFault e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * {@inheritDoc} */ @Override public GCubeMembershipRequest rejectMembershipRequest(long requestUserId, long groupId, String replyUsername, String replyComment) throws UserManagementSystemException, GroupRetrievalFault, UserManagementPortalException { try { GCubeUser replyMan = getUserByUsername(replyUsername); List requests = listMembershipRequestsByGroup(groupId); for (GCubeMembershipRequest req : requests) { if (req.getRequestingUser().getUserId() == requestUserId) { MembershipRequestLocalServiceUtil.updateStatus(replyMan.getUserId(), req.getMembershipRequestId(), replyComment, 2, false, new ServiceContext()); return mapLRMembershipRequest(MembershipRequestLocalServiceUtil.getMembershipRequest(req.getMembershipRequestId())); } } } catch (UserRetrievalFault e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * {@inheritDoc} */ @Override public GCubeMembershipRequest getMembershipRequestsById(long membershipRequestId) { GCubeMembershipRequest toReturn = null; try { toReturn = mapLRMembershipRequest(MembershipRequestLocalServiceUtil.getMembershipRequest(membershipRequestId)); } catch (PortalException e) { e.printStackTrace(); } catch (SystemException e) { e.printStackTrace(); } return toReturn; } /** * {@inheritDoc} */ @Override public List getMembershipRequests(long userId, long groupId, MembershipRequestStatus requestStatus) throws UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault { try { Group g = GroupLocalServiceUtil.getGroup(groupId); _log.debug("Asked for pending users list of group: "+g.getName()); } catch (PortalException e1) { throw new GroupRetrievalFault("Group not existing", e1); } catch (SystemException e) { e.printStackTrace(); } List toReturn = new ArrayList(); try { int statusId = 0; if (requestStatus == MembershipRequestStatus.APPROVED) { statusId = 1; } else if (requestStatus == MembershipRequestStatus.DENIED) { statusId = 2; } for (MembershipRequest req : MembershipRequestLocalServiceUtil.getMembershipRequests(userId, groupId, statusId)) { toReturn.add(mapLRMembershipRequest(req)); } } catch (SystemException e) { e.printStackTrace(); } catch (PortalException e) { e.printStackTrace(); } return toReturn; } /* * END MEMBERSHIP REQUESTS */ /* * USER TO Sites ASSIGNMENTS */ /** * {@inheritDoc} */ @Override public void assignUserToGroup(long groupId, long userId) throws UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault, UserManagementPortalException { try { GroupManager gm = new LiferayGroupManager(); if (gm.isRootVO(groupId)) { UserLocalServiceUtil.addGroupUser(groupId, userId); return; } if (gm.isVO(groupId)) { long parentGroupId = gm.getGroup(groupId).getParentGroupId(); UserLocalServiceUtil.addGroupUser(parentGroupId, userId); UserLocalServiceUtil.addGroupUser(groupId, userId); return; } if (gm.isVRE(groupId)) { long rootGroupId = gm.getGroup(gm.getGroup(groupId).getParentGroupId()).getParentGroupId(); UserLocalServiceUtil.addGroupUser(rootGroupId, userId); long parentGroupId = gm.getGroup(groupId).getParentGroupId(); UserLocalServiceUtil.addGroupUser(parentGroupId, userId); UserLocalServiceUtil.addGroupUser(groupId, userId); } } catch (SystemException e) { e.printStackTrace(); } } /** * {@inheritDoc} */ @Override public void dismissUserFromGroup(long groupId, long userId) throws UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault { try { UserLocalServiceUtil.deleteGroupUser(groupId, userId); } catch (SystemException e) { e.printStackTrace(); } } /** * {@inheritDoc} */ @Override public List listUnregisteredUsersByGroup(long groupId) throws UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault { List toProcess = listUsers(); toProcess.removeAll(listUsersByGroup(groupId)); return toProcess; } @Override public boolean isPasswordChanged(String emailAddress) { _log.debug("Trying to fetch user by email = " + emailAddress); User user; try { user = UserLocalServiceUtil.getUserByEmailAddress(ManagementUtils.getCompany().getCompanyId(), emailAddress); // date are saved according GMT long creationTime = user.getCreateDate().getTime(); long changedTime = user.getPasswordModifiedDate().getTime(); return changedTime > creationTime; } catch (Exception e) { _log.error("Error while retrieving user with mail=" + emailAddress, e); } return false; } @Override public boolean userExistsByEmail(String emailAddress) { try { if(UserLocalServiceUtil.getUserByEmailAddress(ManagementUtils.getCompany().getCompanyId(), emailAddress) != null) return true; } catch (Exception e){ _log.error("Error while retrieving user with mail=" + emailAddress, e); } return false; } @Override public String getFullNameFromEmail(String email) { try{ User user; if((user = UserLocalServiceUtil.getUserByEmailAddress(ManagementUtils.getCompany().getCompanyId(), email))!= null){ return user.getFullName(); } }catch(Exception e){ _log.error("Unable to find user with email " + email); } return null; } @Override public void deleteUserByEMail(String email) throws UserManagementSystemException, UserManagementPortalException, PortalException, SystemException { User user; if((user = UserLocalServiceUtil.getUserByEmailAddress(ManagementUtils.getCompany().getCompanyId(), email))!= null){ _log.debug("Deleting user with email " + email); UserLocalServiceUtil.deleteUser(user); _log.debug("Delete user with email " + email); } } @Override public byte[] getUserAvatarBytes(String screenName) { try { User user = UserLocalServiceUtil.getUserByScreenName(ManagementUtils.getCompany().getCompanyId(), screenName); return ImageLocalServiceUtil.getImage(user.getPortraitId()).getTextObj(); } catch (PortalException e) { _log.debug("Unable to retrieve user's avatar", e); } catch (SystemException e) { _log.debug("Unable to retrieve user's avatar", e); } return null; } @Override public String getUserOpenId(String screenName) { try { User user = UserLocalServiceUtil.getUserByScreenName(ManagementUtils.getCompany().getCompanyId(), screenName); return user.getOpenId(); } catch (PortalException e) { _log.debug("Unable to retrieve user's openId", e); } catch (SystemException e) { _log.debug("Unable to retrieve user's openId", e); } return null; } }