diff --git a/api/org.integratedmodelling.klab.api/src/org/integratedmodelling/klab/api/API.java b/api/org.integratedmodelling.klab.api/src/org/integratedmodelling/klab/api/API.java index c6d8c1bb4..093cffd77 100644 --- a/api/org.integratedmodelling.klab.api/src/org/integratedmodelling/klab/api/API.java +++ b/api/org.integratedmodelling.klab.api/src/org/integratedmodelling/klab/api/API.java @@ -476,11 +476,19 @@ public static interface PARAMETERS { /** * URL PARAMETER for user to verify account. */ - public static final String USER_VERIFICATION = "verify"; + public static final String USER_VERIFICATION = "verify"; /** * URL PARAMETER for user to request a new certificate. */ public static final String USER_CERTIFICATE = "certificate"; + /** + * URL PARAMETER for user requesting a new email. + */ + public static final String USER_REQUEST_EMAIL = "request-new-email"; + /** + * URL PARAMETER for user setting a new email. + */ + public static final String USER_NEW_EMAIL = "new-email"; /** * URL PARAMETER for requesting the names of groups. */ diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/ClickbackAction.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/ClickbackAction.java index 1665aae29..4bbbf7cc4 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/ClickbackAction.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/ClickbackAction.java @@ -1,5 +1,8 @@ package org.integratedmodelling.klab.hub.api; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; + public enum ClickbackAction { activate( TokenType.verify), @@ -10,7 +13,9 @@ public enum ClickbackAction { newUser( TokenType.newUser), lostPassword( - TokenType.lostPassword); + TokenType.lostPassword), + changeEmail ( + TokenType.verifyEmail); private final TokenType tokenType; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/EmailTemplate.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/EmailTemplate.java index 0a3e6b9be..a6a17a8c1 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/EmailTemplate.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/EmailTemplate.java @@ -3,7 +3,7 @@ import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; -import org.integratedmodelling.klab.hub.config.EmailConfig.EmailType; +import org.integratedmodelling.klab.hub.emails.EmailConfig.EmailType; import org.springframework.data.mongodb.core.index.CompoundIndex; import org.springframework.data.mongodb.core.index.CompoundIndexes; import org.springframework.data.mongodb.core.mapping.Document; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/EngineAuthResponeFactory.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/EngineAuthResponeFactory.java index 4956d8fd0..96ed01523 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/EngineAuthResponeFactory.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/EngineAuthResponeFactory.java @@ -26,6 +26,8 @@ import org.integratedmodelling.klab.hub.network.NodeNetworkManager; import org.integratedmodelling.klab.hub.repository.MongoGroupRepository; import org.integratedmodelling.klab.hub.tokens.services.UserAuthTokenService; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.integratedmodelling.klab.hub.users.services.UserProfileService; import org.integratedmodelling.klab.hub.utils.IPUtils; import org.integratedmodelling.klab.rest.AuthenticatedIdentity; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/LeverAuthResponseFactory.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/LeverAuthResponseFactory.java index 74d79af95..8d85b1f02 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/LeverAuthResponseFactory.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/LeverAuthResponseFactory.java @@ -12,6 +12,8 @@ import org.integratedmodelling.klab.hub.commands.GenerateHubReference; import org.integratedmodelling.klab.hub.license.controllers.LeverService; import org.integratedmodelling.klab.hub.tokens.services.LeverAuthTokenService; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.integratedmodelling.klab.hub.utils.IPUtils; import org.integratedmodelling.klab.rest.AuthenticatedIdentity; import org.integratedmodelling.klab.rest.HubReference; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/User.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/User.java index 0632291e9..ec7f5a708 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/User.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/api/User.java @@ -43,6 +43,8 @@ public class User extends IdentityModel implements UserDetails{ @Indexed(unique = true) String email; + + String notVerifiedEmail; @Indexed String firstName; @@ -288,6 +290,7 @@ public void updateFromProfileResource(ProfileResource resource) { initials = resource.initials; jobTitle = resource.jobTitle; lastName = resource.lastName; + notVerifiedEmail = resource.email; phone = resource.phone; sendUpdates = resource.sendUpdates; serverUrl = resource.serverUrl; @@ -435,4 +438,14 @@ public Optional findCustomProperty(String key) { public void removeCustomProperty(String name) { this.customProperties.removeIf(cp -> cp.getKey().equals(name)); } + + public String getNotVerifiedEmail() { + return notVerifiedEmail; + } + + public void setNotVerifiedEmail(String notVerifiedEmail) { + this.notVerifiedEmail = notVerifiedEmail; + } + + } \ No newline at end of file diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/commands/CreateUserWithRolesAndStatus.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/commands/CreateUserWithRolesAndStatus.java index 2a0db8055..f31fb7804 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/commands/CreateUserWithRolesAndStatus.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/commands/CreateUserWithRolesAndStatus.java @@ -2,6 +2,7 @@ import org.integratedmodelling.klab.hub.api.AuthProvider; import org.integratedmodelling.klab.hub.api.User; +import org.integratedmodelling.klab.hub.ldap.commands.CreateLdapUser; import org.integratedmodelling.klab.hub.repository.UserRepository; import org.springframework.security.ldap.userdetails.LdapUserDetailsManager; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/EmailConfig.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/EmailConfig.java index e7b5c2dad..b8be5272a 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/EmailConfig.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/EmailConfig.java @@ -1,4 +1,4 @@ -package org.integratedmodelling.klab.hub.config; +package org.integratedmodelling.klab.hub.emails; import java.util.Properties; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/controllers/EmailController.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/controllers/EmailController.java index 36512f526..6bb7a09a7 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/controllers/EmailController.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/controllers/EmailController.java @@ -8,8 +8,8 @@ import org.integratedmodelling.klab.api.API; import org.integratedmodelling.klab.hub.api.EmailTemplate; import org.integratedmodelling.klab.hub.api.User; -import org.integratedmodelling.klab.hub.config.EmailConfig; -import org.integratedmodelling.klab.hub.config.EmailConfig.EmailType; +import org.integratedmodelling.klab.hub.emails.EmailConfig; +import org.integratedmodelling.klab.hub.emails.EmailConfig.EmailType; import org.integratedmodelling.klab.hub.emails.services.EmailManager; import org.integratedmodelling.klab.hub.emails.services.EmailTemplateService; import org.integratedmodelling.klab.hub.exception.SendEmailException; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/services/EmailManager.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/services/EmailManager.java index dd8ee3dfc..18c2a0520 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/services/EmailManager.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/emails/services/EmailManager.java @@ -13,8 +13,9 @@ import javax.mail.internet.MimeMessage.RecipientType; import org.integratedmodelling.klab.Logging; -import org.integratedmodelling.klab.hub.config.EmailConfig; + import org.integratedmodelling.klab.hub.config.LinkConfig; +import org.integratedmodelling.klab.hub.emails.EmailConfig; import org.integratedmodelling.klab.hub.exception.SendEmailException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.MailException; @@ -170,6 +171,7 @@ public void send(String from, Set to, Set replayTo, String subje } mailSender.send(message); } catch (MessagingException | MailException e) { + e.printStackTrace(); StringBuffer error = new StringBuffer("Unable to send email.\n") .append("from: [").append(from).append("]\nto: "); for (String receipt : to) { diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapConfig.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapConfig.java index f928183c4..3c916a67e 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapConfig.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapConfig.java @@ -1,4 +1,4 @@ -package org.integratedmodelling.klab.hub.config; +package org.integratedmodelling.klab.hub.ldap; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapService.java index 7271262c6..350661340 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapService.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapService.java @@ -1,4 +1,4 @@ -package org.integratedmodelling.klab.hub.service; +package org.integratedmodelling.klab.hub.ldap; import java.util.List; import java.util.Optional; @@ -17,4 +17,5 @@ public interface LdapService { abstract void createUser(UserDetails user); abstract Name buildDn(String username ); abstract boolean userExists(String username, String email); + abstract boolean userExists(String username); } \ No newline at end of file diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapServiceImpl.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapServiceImpl.java index 4e8d9663f..f4c824931 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapServiceImpl.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/LdapServiceImpl.java @@ -1,4 +1,4 @@ -package org.integratedmodelling.klab.hub.service.implementation; +package org.integratedmodelling.klab.hub.ldap; import static org.springframework.ldap.query.LdapQueryBuilder.query; @@ -13,7 +13,6 @@ import javax.naming.directory.Attributes; import org.integratedmodelling.klab.hub.exception.BadRequestException; -import org.integratedmodelling.klab.hub.service.LdapService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ldap.core.AttributesMapper; import org.springframework.ldap.core.DirContextOperations; @@ -69,6 +68,24 @@ public boolean userExists(String username, String email) { return true; } } + + @Override + public boolean userExists(String username) { + LdapQuery userNameQuery = query() + .where("objectclass").is("person") + .and("uid").is(username); + List personByName = ldapTemplate.search(userNameQuery, new UserAttributesMapper()); + +// if (!personByName.isEmpty()) { +// throw new BadRequestException("Username is already in use."); +// } + + if (personByName.isEmpty()) { + return false; + } else { + return true; + } + } private static class GroupContextMapper extends AbstractContextMapper { public JSONObject doMapFromContext(DirContextOperations context) { diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/CreateLdapUser.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/CreateLdapUser.java index 63816a55e..8e1241686 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/CreateLdapUser.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/CreateLdapUser.java @@ -1,7 +1,8 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.ldap.commands; import org.integratedmodelling.klab.hub.api.User; import org.integratedmodelling.klab.hub.api.adapters.LdapUserAdapter; +import org.integratedmodelling.klab.hub.commands.UserCommand; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.ldap.userdetails.LdapUserDetailsManager; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/DeleteLdapUser.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/DeleteLdapUser.java index f9b9b80e0..94e71884a 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/DeleteLdapUser.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/DeleteLdapUser.java @@ -1,7 +1,8 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.ldap.commands; import org.integratedmodelling.klab.hub.api.User; import org.integratedmodelling.klab.hub.api.adapters.LdapUserAdapter; +import org.integratedmodelling.klab.hub.commands.UserCommand; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.ldap.userdetails.LdapUserDetailsManager; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/UpdateLdapUser.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/UpdateLdapUser.java index 3259957ad..e70783511 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/UpdateLdapUser.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/ldap/commands/UpdateLdapUser.java @@ -1,7 +1,8 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.ldap.commands; import org.integratedmodelling.klab.hub.api.User; import org.integratedmodelling.klab.hub.api.adapters.LdapUserAdapter; +import org.integratedmodelling.klab.hub.commands.UserCommand; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.ldap.userdetails.LdapUserDetailsManager; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/payload/KlabEmail.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/payload/KlabEmail.java index 6cda219af..1f1d3a601 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/payload/KlabEmail.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/payload/KlabEmail.java @@ -3,7 +3,7 @@ import java.io.File; import java.util.Set; -import org.integratedmodelling.klab.hub.config.EmailConfig.EmailType; +import org.integratedmodelling.klab.hub.emails.EmailConfig.EmailType; public class KlabEmail { diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/payload/LoginResponse.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/payload/LoginResponse.java index fbdcdd16c..0173ee04d 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/payload/LoginResponse.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/payload/LoginResponse.java @@ -1,6 +1,6 @@ package org.integratedmodelling.klab.hub.payload; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/TaskRepository.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/TaskRepository.java index e03f4355d..1b73552b7 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/TaskRepository.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/TaskRepository.java @@ -6,7 +6,7 @@ import org.bson.types.ObjectId; import org.integratedmodelling.klab.hub.api.Task; import org.integratedmodelling.klab.hub.api.TaskStatus; -import org.integratedmodelling.klab.hub.api.TokenClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenClickback; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import org.springframework.stereotype.Repository; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/TokenRepository.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/TokenRepository.java index 3387fcb5a..4ba6e5eef 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/TokenRepository.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/TokenRepository.java @@ -4,7 +4,7 @@ import java.util.Optional; import org.bson.types.ObjectId; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import org.springframework.stereotype.Repository; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/security/TokenAuthenticationFilter.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/security/TokenAuthenticationFilter.java index f9574ba83..db2ed9fe6 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/security/TokenAuthenticationFilter.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/security/TokenAuthenticationFilter.java @@ -12,8 +12,8 @@ import javax.servlet.http.HttpServletRequest; import org.integratedmodelling.klab.Logging; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/security/oauth2/OAuth2AuthenticationSuccessHandler.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/security/oauth2/OAuth2AuthenticationSuccessHandler.java index b537eea1b..f8c39ae9a 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/security/oauth2/OAuth2AuthenticationSuccessHandler.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/security/oauth2/OAuth2AuthenticationSuccessHandler.java @@ -6,11 +6,11 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; -import org.integratedmodelling.klab.hub.api.TokenType; import org.integratedmodelling.klab.hub.api.ProfileResource; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.integratedmodelling.klab.hub.tokens.services.UserAuthTokenService; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.security.core.Authentication; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tasks/services/TaskService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tasks/services/TaskService.java index fdcb14ff5..4078a50a2 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tasks/services/TaskService.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tasks/services/TaskService.java @@ -8,7 +8,7 @@ import org.integratedmodelling.klab.hub.api.Task; import org.integratedmodelling.klab.hub.api.TaskParameters; import org.integratedmodelling.klab.hub.api.TaskStatus; -import org.integratedmodelling.klab.hub.api.TokenClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenClickback; public interface TaskService { /** diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tasks/services/TaskServiceImpl.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tasks/services/TaskServiceImpl.java index 594b6c4fe..ba683955e 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tasks/services/TaskServiceImpl.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tasks/services/TaskServiceImpl.java @@ -11,10 +11,10 @@ import org.integratedmodelling.klab.hub.api.TaskBuilder; import org.integratedmodelling.klab.hub.api.TaskParameters; import org.integratedmodelling.klab.hub.api.TaskStatus; -import org.integratedmodelling.klab.hub.api.TokenClickback; import org.integratedmodelling.klab.hub.emails.services.EmailManager; import org.integratedmodelling.klab.hub.exception.BadRequestException; import org.integratedmodelling.klab.hub.repository.TaskRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenClickback; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/LeverAuthTokenService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/LeverAuthTokenService.java index bf5b5db54..bf931fa77 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/LeverAuthTokenService.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/LeverAuthTokenService.java @@ -1,6 +1,6 @@ package org.integratedmodelling.klab.hub.tokens.services; -import org.integratedmodelling.klab.hub.api.TokenLever; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenLever; public interface LeverAuthTokenService extends TokenBaseService{ diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/LeverAuthTokenServiceImpl.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/LeverAuthTokenServiceImpl.java index 24e5af53a..438b9b733 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/LeverAuthTokenServiceImpl.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/LeverAuthTokenServiceImpl.java @@ -3,12 +3,12 @@ import java.util.Optional; import org.integratedmodelling.klab.hub.api.MongoLever; -import org.integratedmodelling.klab.hub.api.TokenLever; -import org.integratedmodelling.klab.hub.api.TokenType; -import org.integratedmodelling.klab.hub.commands.CreateLeverAuthenticationToken; import org.integratedmodelling.klab.hub.exception.AuthenticationFailedException; import org.integratedmodelling.klab.hub.repository.MongoLeverRepository; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenLever; +import org.integratedmodelling.klab.hub.tokens.services.commands.CreateLeverAuthenticationToken; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.springframework.stereotype.Service; @Service diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/TokenBaseService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/TokenBaseService.java index 8fc62f4c7..f2e22221d 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/TokenBaseService.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/TokenBaseService.java @@ -1,10 +1,9 @@ package org.integratedmodelling.klab.hub.tokens.services; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; -import org.integratedmodelling.klab.hub.api.TokenType; -import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; public interface TokenBaseService { public T createToken(String username, TokenType verify); - public abstract void deleteToken(String tokenString); + public abstract void deleteToken(String tokenString); } diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserAuthTokenService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserAuthTokenService.java index 916a7ca0c..bf46f38de 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserAuthTokenService.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserAuthTokenService.java @@ -1,8 +1,8 @@ package org.integratedmodelling.klab.hub.tokens.services; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; import org.integratedmodelling.klab.hub.payload.LoginResponse; import org.integratedmodelling.klab.hub.payload.LogoutResponse; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; import org.springframework.stereotype.Service; @Service diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserAuthTokenServiceImpl.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserAuthTokenServiceImpl.java index a43e73544..e1a3fb185 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserAuthTokenServiceImpl.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserAuthTokenServiceImpl.java @@ -5,13 +5,9 @@ import java.util.Optional; import org.integratedmodelling.klab.exceptions.KlabException; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; import org.integratedmodelling.klab.hub.api.JwtToken; import org.integratedmodelling.klab.hub.api.ProfileResource; -import org.integratedmodelling.klab.hub.api.TokenType; import org.integratedmodelling.klab.hub.api.User; -import org.integratedmodelling.klab.hub.commands.CreateUserAuthenticationToken; -import org.integratedmodelling.klab.hub.commands.DeleteAuthenticationToken; import org.integratedmodelling.klab.hub.commands.GetUserProfile; import org.integratedmodelling.klab.hub.exception.AuthenticationFailedException; import org.integratedmodelling.klab.hub.exception.LoginFailedExcepetion; @@ -20,6 +16,10 @@ import org.integratedmodelling.klab.hub.payload.LogoutResponse; import org.integratedmodelling.klab.hub.repository.TokenRepository; import org.integratedmodelling.klab.hub.repository.UserRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.commands.CreateUserAuthenticationToken; +import org.integratedmodelling.klab.hub.tokens.services.commands.DeleteAuthenticationToken; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserTokenService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserTokenService.java index ac4144e57..4cf382035 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserTokenService.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserTokenService.java @@ -1,13 +1,14 @@ package org.integratedmodelling.klab.hub.tokens.services; -import org.integratedmodelling.klab.hub.api.TokenClickback; -import org.integratedmodelling.klab.hub.api.TokenType; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenClickback; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.springframework.stereotype.Service; @Service -public interface RegistrationTokenService extends TokenBaseService { +public interface UserTokenService extends TokenBaseService { public TokenClickback createChildToken(String username, String parentToken, TokenType verify); public abstract boolean verifyToken(String username, String tokenString, TokenType verify); - public abstract boolean verifyTokens(String username, String tokenString, TokenType ...verify); + public abstract boolean verifyTokens(String username, String tokenString, TokenType ...verify); + TokenClickback createToken(String username, String email, TokenType type); } diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserTokenServiceImpl.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserTokenServiceImpl.java index b5dd03a0b..7f43e7408 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserTokenServiceImpl.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/UserTokenServiceImpl.java @@ -1,42 +1,56 @@ package org.integratedmodelling.klab.hub.tokens.services; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; -import org.integratedmodelling.klab.hub.api.TokenClickback; -import org.integratedmodelling.klab.hub.api.TokenType; -import org.integratedmodelling.klab.hub.commands.CreateChangePasswordToken; -import org.integratedmodelling.klab.hub.commands.CreateLostPasswordToken; -import org.integratedmodelling.klab.hub.commands.CreateNewUserAccountToken; -import org.integratedmodelling.klab.hub.commands.CreateVerifyAccountToken; -import org.integratedmodelling.klab.hub.commands.DeleteAuthenticationToken; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenClickback; +import org.integratedmodelling.klab.hub.tokens.services.commands.CreateChangePasswordToken; +import org.integratedmodelling.klab.hub.tokens.services.commands.CreateLostPasswordToken; +import org.integratedmodelling.klab.hub.tokens.services.commands.CreateNewUserAccountToken; +import org.integratedmodelling.klab.hub.tokens.services.commands.CreateVerifyAccountToken; +import org.integratedmodelling.klab.hub.tokens.services.commands.CreateVerifyEmailToken; +import org.integratedmodelling.klab.hub.tokens.services.commands.DeleteAuthenticationToken; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.stereotype.Service; @Service -public class RegistrationTokenServiceImpl implements RegistrationTokenService { - - private TokenRepository repository; +public class UserTokenServiceImpl implements UserTokenService { + + private TokenRepository repository; private LinkConfig linkConfig; - - RegistrationTokenServiceImpl(TokenRepository repository, - LinkConfig linkConfig) { + + UserTokenServiceImpl(TokenRepository repository, LinkConfig linkConfig) { this.repository = repository; - this.linkConfig = linkConfig; + this.linkConfig = linkConfig; } @Override public TokenClickback createToken(String username, TokenType type) { - if (type.equals(TokenType.verify)) { - return new CreateVerifyAccountToken(repository, username, linkConfig).execute(); - } else if (type.equals(TokenType.password)) { + switch (type) { + + case verify: + return new CreateVerifyAccountToken(repository, username, linkConfig).execute(); + case password: return new CreateChangePasswordToken(repository, username, linkConfig).execute(); - } else if(type.equals(TokenType.lostPassword)) { + case lostPassword: return new CreateLostPasswordToken(repository, username, linkConfig).execute(); - } else { + default: return null; } + + } + + @Override + public TokenClickback createToken(String username, String email, TokenType type) { + switch (type) { + + case verifyEmail: + return new CreateVerifyEmailToken(repository, username, email, linkConfig).execute(); + default: + return null; + } } @Override @@ -50,25 +64,24 @@ public TokenClickback createChildToken(String username, String parentToken, Toke @Override public boolean verifyToken(String username, String id, TokenType type) { - return repository.findByTokenString(id) - .filter(token -> token.getPrincipal().equals(username)) - .map(TokenClickback.class::cast) - .filter(token -> token.getClickbackAction().getTokenType().equals(type)) - .map(token -> setAuthentication(token)) - .isPresent(); + return repository.findByTokenString(id).filter(token -> token.getPrincipal().equals(username)) + .map(TokenClickback.class::cast).filter(token -> token.getClickbackAction().getTokenType().equals(type)) + .map(token -> setAuthentication(token)).isPresent(); } - + @Override - public boolean verifyTokens(String username, String id, TokenType ...types) { - for (TokenType type: types) { + public boolean verifyTokens(String username, String id, TokenType... types) { + for (TokenType type : types) { if (verifyToken(username, id, type)) { return true; } } return false; } + private TokenAuthentication setAuthentication(TokenAuthentication token) { - PreAuthenticatedAuthenticationToken secureToken = new PreAuthenticatedAuthenticationToken(token.getPrincipal(),token.getCredentials(),token.getAuthorities()); + PreAuthenticatedAuthenticationToken secureToken = new PreAuthenticatedAuthenticationToken(token.getPrincipal(), + token.getCredentials(), token.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(secureToken); return token; } @@ -78,4 +91,6 @@ public void deleteToken(String tokenString) { new DeleteAuthenticationToken(repository, tokenString).execute(); } + + } diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenAuthentication.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenAuthentication.java index 0fc51020f..42854cb27 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenAuthentication.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenAuthentication.java @@ -1,4 +1,4 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; import java.time.LocalDateTime; import java.util.ArrayList; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenChangePasswordClickback.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenChangePasswordClickback.java index 13769e09e..4fd510683 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenChangePasswordClickback.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenChangePasswordClickback.java @@ -1,5 +1,6 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; +import org.integratedmodelling.klab.hub.api.ClickbackAction; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.springframework.data.annotation.TypeAlias; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenClickback.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenClickback.java index d7321f358..37befb6c7 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenClickback.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenClickback.java @@ -1,4 +1,4 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; import java.net.URL; import java.time.LocalDateTime; @@ -7,6 +7,7 @@ import java.util.Collection; import org.integratedmodelling.klab.auth.Role; +import org.integratedmodelling.klab.hub.api.ClickbackAction; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.springframework.data.annotation.Transient; import org.springframework.security.core.GrantedAuthority; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenInviteUserClickback.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenInviteUserClickback.java index 7c984fb5a..c70ef7ba5 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenInviteUserClickback.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenInviteUserClickback.java @@ -1,9 +1,11 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; import java.util.Set; import javax.validation.constraints.NotNull; +import org.integratedmodelling.klab.hub.api.ClickbackAction; +import org.integratedmodelling.klab.hub.api.GroupEntry; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.springframework.data.annotation.TypeAlias; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenLever.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenLever.java index ab2c9a650..77e9ad3ec 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenLever.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenLever.java @@ -1,4 +1,4 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; import java.util.ArrayList; import java.util.Arrays; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenLostPasswordClickback.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenLostPasswordClickback.java index 9c7bc62d9..bc82f5069 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenLostPasswordClickback.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenLostPasswordClickback.java @@ -1,5 +1,6 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; +import org.integratedmodelling.klab.hub.api.ClickbackAction; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.springframework.data.annotation.TypeAlias; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenNewUserClickback.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenNewUserClickback.java index 7e8a44dd0..c757b7d53 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenNewUserClickback.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenNewUserClickback.java @@ -1,5 +1,6 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; +import org.integratedmodelling.klab.hub.api.ClickbackAction; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.springframework.data.annotation.TypeAlias; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenVerifyAccountClickback.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenVerifyAccountClickback.java index fc9add3e9..ebd93f9c5 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenVerifyAccountClickback.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenVerifyAccountClickback.java @@ -1,5 +1,6 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; +import org.integratedmodelling.klab.hub.api.ClickbackAction; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.springframework.data.annotation.TypeAlias; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenVerifyEmailClickback.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenVerifyEmailClickback.java index 1b06d77f8..1d678e113 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenVerifyEmailClickback.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/bean/TokenVerifyEmailClickback.java @@ -1,22 +1,29 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.bean; +import org.integratedmodelling.klab.hub.api.ClickbackAction; import org.springframework.data.annotation.TypeAlias; @TypeAlias("VerifyEmail") public class TokenVerifyEmailClickback extends TokenClickback { private static final long serialVersionUID = 2577854654763037014L; + private String newEmailAddress; public TokenVerifyEmailClickback(String username) { super(username); } public void setNewEmailAddress(String newEmailAddress) { + this.newEmailAddress = newEmailAddress; + } + + public String getNewEmailAddress(String newEmailAddress) { + return newEmailAddress; } @Override public ClickbackAction getClickbackAction() { - return null; + return ClickbackAction.changeEmail; } } diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateChangePasswordToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateChangePasswordToken.java index 379a9794f..f8630eab4 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateChangePasswordToken.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateChangePasswordToken.java @@ -1,8 +1,8 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; -import org.integratedmodelling.klab.hub.api.TokenChangePasswordClickback; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenChangePasswordClickback; public class CreateChangePasswordToken extends CreateTokenCommand { diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateInviteUserToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateInviteUserToken.java index 54440b279..3f564aaa6 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateInviteUserToken.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateInviteUserToken.java @@ -1,17 +1,17 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; import java.util.Set; import org.integratedmodelling.klab.hub.api.GroupEntry; -import org.integratedmodelling.klab.hub.api.TokenInviteUserClickback; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenInviteUserClickback; public class CreateInviteUserToken extends CreateTokenCommand { private TokenRepository repo; private String invitee; private Set entries; - + public CreateInviteUserToken(TokenRepository repo, String invitee, Set entries) { super(); this.repo = repo; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateLeverAuthenticationToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateLeverAuthenticationToken.java index 225bb024f..d78c60a30 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateLeverAuthenticationToken.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateLeverAuthenticationToken.java @@ -1,8 +1,8 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; import org.integratedmodelling.klab.hub.api.MongoLever; -import org.integratedmodelling.klab.hub.api.TokenLever; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenLever; public class CreateLeverAuthenticationToken implements TokenCommand { diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateLostPasswordToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateLostPasswordToken.java index 2bfc94726..4f99bd927 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateLostPasswordToken.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateLostPasswordToken.java @@ -1,8 +1,8 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; -import org.integratedmodelling.klab.hub.api.TokenLostPasswordClickback; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenLostPasswordClickback; public class CreateLostPasswordToken extends CreateTokenCommand { diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateNewUserAccountToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateNewUserAccountToken.java index d5fb3b88e..bb66b37a5 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateNewUserAccountToken.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateNewUserAccountToken.java @@ -1,9 +1,9 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; -import org.integratedmodelling.klab.hub.api.TokenNewUserClickback; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.integratedmodelling.klab.hub.exception.BadRequestException; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenNewUserClickback; public class CreateNewUserAccountToken extends CreateTokenCommand{ diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateTokenCommand.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateTokenCommand.java index 022c78ab4..9d1bd7ced 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateTokenCommand.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateTokenCommand.java @@ -1,4 +1,4 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; import org.integratedmodelling.klab.hub.config.LinkConfig; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateUserAuthenticationToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateUserAuthenticationToken.java index b0d33e863..709b679be 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateUserAuthenticationToken.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateUserAuthenticationToken.java @@ -1,8 +1,8 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; import org.integratedmodelling.klab.hub.api.User; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; public class CreateUserAuthenticationToken implements TokenCommand{ diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateVerifyAccountToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateVerifyAccountToken.java index 71c52d8b4..3fb2c9fc9 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateVerifyAccountToken.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateVerifyAccountToken.java @@ -1,11 +1,11 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; import java.util.List; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; -import org.integratedmodelling.klab.hub.api.TokenVerifyAccountClickback; import org.integratedmodelling.klab.hub.config.LinkConfig; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenVerifyAccountClickback; public class CreateVerifyAccountToken extends CreateTokenCommand{ diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateVerifyEmailToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateVerifyEmailToken.java new file mode 100644 index 000000000..0fd396316 --- /dev/null +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/CreateVerifyEmailToken.java @@ -0,0 +1,34 @@ +package org.integratedmodelling.klab.hub.tokens.services.commands; + +import java.util.List; + +import org.integratedmodelling.klab.hub.config.LinkConfig; +import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenVerifyEmailClickback; + +public class CreateVerifyEmailToken extends CreateTokenCommand{ + + private TokenRepository tokenRepository; + private String username; + private String email; + + public CreateVerifyEmailToken(TokenRepository tokenRepository, String username, String email, LinkConfig linkConfig) { + this.tokenRepository = tokenRepository; + this.username = username; + this.email = email; + setLinkConfig(linkConfig); + } + + @Override + public TokenVerifyEmailClickback execute() { + + TokenVerifyEmailClickback token = new TokenVerifyEmailClickback(username); + token.setCallbackUrl(getLinkConfig()); + token.setAuthenticated(true); + token.setNewEmailAddress(email); + tokenRepository.save(token); + return token; + } + +} diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/DeleteAuthenticationToken.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/DeleteAuthenticationToken.java index b5e6c320e..6960bcc3e 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/DeleteAuthenticationToken.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/DeleteAuthenticationToken.java @@ -1,8 +1,8 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; import org.integratedmodelling.klab.hub.exception.BadRequestException; import org.integratedmodelling.klab.hub.repository.TokenRepository; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; public class DeleteAuthenticationToken implements TokenCommand{ diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/TokenCommand.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/TokenCommand.java index e520bba05..7d2986826 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/TokenCommand.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/commands/TokenCommand.java @@ -1,6 +1,6 @@ -package org.integratedmodelling.klab.hub.commands; +package org.integratedmodelling.klab.hub.tokens.services.commands; -import org.integratedmodelling.klab.hub.api.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; public interface TokenCommand { diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/enums/TokenType.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/enums/TokenType.java index b9a25720c..f56add18e 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/enums/TokenType.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tokens/services/enums/TokenType.java @@ -1,4 +1,13 @@ -package org.integratedmodelling.klab.hub.api; +package org.integratedmodelling.klab.hub.tokens.services.enums; + +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenAuthentication; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenChangePasswordClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenInviteUserClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenLever; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenLostPasswordClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenNewUserClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenVerifyAccountClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenVerifyEmailClickback; public enum TokenType { verify( @@ -14,7 +23,10 @@ public enum TokenType { lostPassword( TokenLostPasswordClickback.class), lever( - TokenLever.class); + TokenLever.class), + verifyEmail( + TokenVerifyEmailClickback.class); + private final Class clazz; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/controllers/UserProfileController.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/controllers/UserProfileController.java index 57f85ac54..c20b516a7 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/controllers/UserProfileController.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/controllers/UserProfileController.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.stream.Collectors; +import javax.mail.MessagingException; + import org.apache.commons.lang3.tuple.Triple; import org.integratedmodelling.klab.api.API; import org.integratedmodelling.klab.hub.api.GroupEntry; @@ -28,6 +30,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -35,99 +38,125 @@ @RestController public class UserProfileController { - + private UserProfileService userService; - private final GenericPageAndFilterConverter genericPageAndFilterConverter; - private final FilterBuilderService filterBuilderService; - + private final GenericPageAndFilterConverter genericPageAndFilterConverter; + private final FilterBuilderService filterBuilderService; + private static final JwtToken JWT_TOKEN_FACTORY = new JwtToken(); private static final String FILTER_NO_GROUPS = "$NO_GROUPS$"; - + @Autowired - UserProfileController(UserProfileService userService, GenericPageAndFilterConverter genericPageAndFilterConverter, FilterBuilderService filterBuilderService) { + UserProfileController(UserProfileService userService, GenericPageAndFilterConverter genericPageAndFilterConverter, + FilterBuilderService filterBuilderService) { this.userService = userService; this.genericPageAndFilterConverter = genericPageAndFilterConverter; this.filterBuilderService = filterBuilderService; } - + @SuppressWarnings("unlikely-arg-type") - @GetMapping(API.HUB.USER_BASE) + @GetMapping(API.HUB.USER_BASE) @PreAuthorize("hasRole('ROLE_ADMINISTRATOR') or hasRole('ROLE_SYSTEM')") public ResponseEntity getAllUserProfiles(PageRequest pageRequest) { - PageResponse response = new PageResponse<>(); - - /* Call function to convert pageRequest object in pair, where query has the filters and pageable, the pagination properties*/ - Triple, List> triple = genericPageAndFilterConverter.genericFilterConvert(pageRequest, "groups"); - Pageable pageable = filterBuilderService.getPageable(pageRequest.getSize(), pageRequest.getPage(), pageRequest.getOrders()); - if (triple.getMiddle().isEmpty() && triple.getRight().isEmpty()) { - /* Call getPage function, to findAll elements applying the filters and the pagination given in the pageRequest*/ - Page pg = userService.getPage(triple.getLeft(), pageable); - response.setPageStats(pg); - } else { - List users = userService.getQuery(triple.getLeft()); - ArrayList groupsSearchAnd = triple.getMiddle().stream().map(f -> f.getValue().toString()).collect(Collectors.toCollection(ArrayList::new)); - ArrayList groupsSearchOr = triple.getRight().stream().map(f -> f.getValue().toString()).collect(Collectors.toCollection(ArrayList::new)); - - if (groupsSearchAnd.contains(FILTER_NO_GROUPS) || groupsSearchOr.contains(FILTER_NO_GROUPS)) { - users = users.stream().filter(user -> { - return user.getAgreements().stream().findFirst().get().getAgreement().getGroupEntries().isEmpty(); - }).collect(Collectors.toCollection(ArrayList::new)); - } else { - if (!triple.getMiddle().isEmpty()) { - users = users.stream().filter(user -> { - return user.getAgreements().stream().findFirst().get().getAgreement().getGroupEntries().stream() - .map(GroupEntry::getGroupName).collect(Collectors.toCollection(ArrayList::new)).containsAll(groupsSearchAnd); - }).collect(Collectors.toCollection(ArrayList::new)); - } - if (!triple.getRight().isEmpty()) { - users = users.stream().filter(user -> { - return user.getAgreements().stream().findFirst().get().getAgreement().getGroupEntries().stream() - .map(GroupEntry::getGroupName).anyMatch(groupsSearchOr::contains); - }).collect(Collectors.toCollection(ArrayList::new)); - } - } - final int start = (int)pageable.getOffset(); - final int end = Math.min((start + pageable.getPageSize()), users.size()); - final List content = users.subList(start, end); - final Page page = new PageImpl<>(content, pageable, users.size()); - response.setPageStats(page); - } - - return new ResponseEntity<>(response,HttpStatus.OK); + PageResponse response = new PageResponse<>(); + + /* + * Call function to convert pageRequest object in pair, where + * query has the filters and pageable, the pagination properties + */ + Triple, List> triple = genericPageAndFilterConverter + .genericFilterConvert(pageRequest, "groups"); + Pageable pageable = filterBuilderService.getPageable(pageRequest.getSize(), pageRequest.getPage(), + pageRequest.getOrders()); + if (triple.getMiddle().isEmpty() && triple.getRight().isEmpty()) { + /* + * Call getPage function, to findAll elements applying the filters and the + * pagination given in the pageRequest + */ + Page pg = userService.getPage(triple.getLeft(), pageable); + response.setPageStats(pg); + } else { + List users = userService.getQuery(triple.getLeft()); + ArrayList groupsSearchAnd = triple.getMiddle().stream().map(f -> f.getValue().toString()) + .collect(Collectors.toCollection(ArrayList::new)); + ArrayList groupsSearchOr = triple.getRight().stream().map(f -> f.getValue().toString()) + .collect(Collectors.toCollection(ArrayList::new)); + + if (groupsSearchAnd.contains(FILTER_NO_GROUPS) || groupsSearchOr.contains(FILTER_NO_GROUPS)) { + users = users.stream().filter(user -> { + return user.getAgreements().stream().findFirst().get().getAgreement().getGroupEntries().isEmpty(); + }).collect(Collectors.toCollection(ArrayList::new)); + } else { + if (!triple.getMiddle().isEmpty()) { + users = users.stream().filter(user -> { + return user.getAgreements().stream().findFirst().get().getAgreement().getGroupEntries().stream() + .map(GroupEntry::getGroupName).collect(Collectors.toCollection(ArrayList::new)) + .containsAll(groupsSearchAnd); + }).collect(Collectors.toCollection(ArrayList::new)); + } + if (!triple.getRight().isEmpty()) { + users = users.stream().filter(user -> { + return user.getAgreements().stream().findFirst().get().getAgreement().getGroupEntries().stream() + .map(GroupEntry::getGroupName).anyMatch(groupsSearchOr::contains); + }).collect(Collectors.toCollection(ArrayList::new)); + } + } + final int start = (int) pageable.getOffset(); + final int end = Math.min((start + pageable.getPageSize()), users.size()); + final List content = users.subList(start, end); + final Page page = new PageImpl<>(content, pageable, users.size()); + response.setPageStats(page); + } + + return new ResponseEntity<>(response, HttpStatus.OK); } - + @GetMapping(API.HUB.USER_BASE_ID) @PreAuthorize("authentication.getPrincipal() == #id or hasRole('ROLE_ADMINISTRATOR') or hasRole('ROLE_SYSTEM')") public ResponseEntity getUserProfile(@PathVariable String id) { ProfileResource profile = userService.getUserProfile(id); - return new ResponseEntity<>(profile,HttpStatus.ACCEPTED); + return new ResponseEntity<>(profile, HttpStatus.ACCEPTED); } - + @GetMapping(API.HUB.CURRENT_PROFILE) // TODO this is call from single user, not need PreAuthorize - // @PreAuthorize("authentication.getPrincipal() == #username or hasRole('ROLE_ADMINISTRATOR') or hasRole('ROLE_SYSTEM')") - //correct the auth should be caught on the token filter side. + // @PreAuthorize("authentication.getPrincipal() == #username or + // hasRole('ROLE_ADMINISTRATOR') or hasRole('ROLE_SYSTEM')") + // correct the auth should be caught on the token filter side. public ResponseEntity getCurrentUserProfile(@RequestParam(required = false) boolean remote) { ProfileResource profile = userService.getCurrentUserProfile(remote); if (remote) { - profile.setJwtToken(JWT_TOKEN_FACTORY.createEngineJwtToken(profile)); - return new ResponseEntity<>(new EngineProfileResource(profile), HttpStatus.ACCEPTED); - } - return new ResponseEntity<>(profile,HttpStatus.ACCEPTED); + profile.setJwtToken(JWT_TOKEN_FACTORY.createEngineJwtToken(profile)); + return new ResponseEntity<>(new EngineProfileResource(profile), HttpStatus.ACCEPTED); + } + return new ResponseEntity<>(profile, HttpStatus.ACCEPTED); } @PutMapping(API.HUB.USER_BASE_ID) - @PreAuthorize("authentication.getPrincipal() == #id" ) + @PreAuthorize("authentication.getPrincipal() == #id") public ResponseEntity updateUserProfile(@PathVariable String id, @RequestBody UpdateUserRequest updateRequest) { ProfileResource profile = userService.updateUserByProfile(updateRequest.getProfile()); - return new ResponseEntity<>(profile,HttpStatus.ACCEPTED); + return new ResponseEntity<>(profile, HttpStatus.ACCEPTED); + } + + @PostMapping(value = API.HUB.USER_BASE_ID, params = API.HUB.PARAMETERS.USER_REQUEST_EMAIL) + @PreAuthorize("authentication.getPrincipal() == #id") + public ResponseEntity updateUserEmail(@PathVariable String id, @RequestParam(API.HUB.PARAMETERS.USER_REQUEST_EMAIL) String requestNewEmail) { + ProfileResource profile; + try { + profile = userService.verifyEmail(id, requestNewEmail); + } catch (MessagingException e) { + return ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(e.getMessage()); + } + return new ResponseEntity<>(profile, HttpStatus.ACCEPTED); + } - - @GetMapping(value= API.HUB.USER_BASE_ID, params = "remote-login") + + @GetMapping(value = API.HUB.USER_BASE_ID, params = "remote-login") @PreAuthorize("authentication.getPrincipal() == #id") public ResponseEntity getFullUserProfile(@PathVariable String id) { ProfileResource profile = userService.getRawUserProfile(id); - return new ResponseEntity<>(profile,HttpStatus.ACCEPTED); + return new ResponseEntity<>(profile, HttpStatus.OK); } - + } diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/controllers/UserRegistrationController.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/controllers/UserRegistrationController.java index 1bc1b9b0e..5c6e1801c 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/controllers/UserRegistrationController.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/controllers/UserRegistrationController.java @@ -8,11 +8,6 @@ import org.integratedmodelling.klab.api.API; import org.integratedmodelling.klab.hub.agreements.services.AgreementService; import org.integratedmodelling.klab.hub.api.ProfileResource; -import org.integratedmodelling.klab.hub.api.TokenChangePasswordClickback; -import org.integratedmodelling.klab.hub.api.TokenLostPasswordClickback; -import org.integratedmodelling.klab.hub.api.TokenNewUserClickback; -import org.integratedmodelling.klab.hub.api.TokenType; -import org.integratedmodelling.klab.hub.api.TokenVerifyAccountClickback; import org.integratedmodelling.klab.hub.api.User; import org.integratedmodelling.klab.hub.emails.services.EmailManager; import org.integratedmodelling.klab.hub.exception.ActivationTokenFailedException; @@ -23,7 +18,12 @@ import org.integratedmodelling.klab.hub.exception.UserExistsException; import org.integratedmodelling.klab.hub.payload.PasswordChangeRequest; import org.integratedmodelling.klab.hub.payload.SignupRequest; -import org.integratedmodelling.klab.hub.tokens.services.RegistrationTokenService; +import org.integratedmodelling.klab.hub.tokens.services.UserTokenService; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenChangePasswordClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenLostPasswordClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenNewUserClickback; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenVerifyAccountClickback; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.integratedmodelling.klab.hub.users.services.UserProfileService; import org.integratedmodelling.klab.hub.users.services.UserRegistrationService; import org.springframework.beans.factory.annotation.Autowired; @@ -43,14 +43,14 @@ public class UserRegistrationController { private UserRegistrationService userService; private UserProfileService profileService; - private RegistrationTokenService tokenService; + private UserTokenService tokenService; private EmailManager emailManager; private AgreementService agreementService; @Autowired UserRegistrationController(UserRegistrationService userService, UserProfileService profileService, - RegistrationTokenService tokenService, + UserTokenService tokenService, EmailManager emailManager, AgreementService agreementService) { this.userService = userService; diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserProfileService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserProfileService.java index d3eebe08b..a946c88e3 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserProfileService.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserProfileService.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.Set; +import javax.mail.MessagingException; + import org.integratedmodelling.klab.hub.api.ProfileResource; import org.integratedmodelling.klab.hub.api.User; import org.springframework.data.domain.Page; @@ -22,5 +24,13 @@ public interface UserProfileService { abstract Set getAllUserProfiles(); abstract Page getPage(Query query, Pageable pageable); abstract List getQuery(Query query); + ProfileResource updateUserEmail(ProfileResource profile); + /** + * Check if email is changed. + * If email changes send and email to the user to verified this action + * @param user + * @throws MessagingException + */ + ProfileResource verifyEmail(String username, String email) throws MessagingException; } diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserProfileServiceImpl.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserProfileServiceImpl.java index 33f2752d6..96e6ba368 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserProfileServiceImpl.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserProfileServiceImpl.java @@ -4,13 +4,19 @@ import java.util.List; import java.util.Set; +import javax.mail.MessagingException; + import org.integratedmodelling.klab.exceptions.KlabException; import org.integratedmodelling.klab.hub.api.ProfileResource; import org.integratedmodelling.klab.hub.api.User; import org.integratedmodelling.klab.hub.commands.UpdateUser; +import org.integratedmodelling.klab.hub.emails.services.EmailManager; import org.integratedmodelling.klab.hub.exception.UserByEmailDoesNotExistException; import org.integratedmodelling.klab.hub.exception.UserDoesNotExistException; import org.integratedmodelling.klab.hub.repository.UserRepository; +import org.integratedmodelling.klab.hub.tokens.services.UserTokenService; +import org.integratedmodelling.klab.hub.tokens.services.bean.TokenVerifyEmailClickback; +import org.integratedmodelling.klab.hub.tokens.services.enums.TokenType; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.core.query.Query; @@ -26,24 +32,62 @@ public class UserProfileServiceImpl implements UserProfileService { private ObjectMapper objectMapper; - public UserProfileServiceImpl(UserRepository userRepository, ObjectMapper objectMapper) { + private UserTokenService tokenService; + private EmailManager emailManager; + + public UserProfileServiceImpl(UserRepository userRepository, ObjectMapper objectMapper, UserTokenService tokenService, EmailManager emailManager) { super(); this.userRepository = userRepository; this.objectMapper = objectMapper; + this.tokenService = tokenService; + this.emailManager = emailManager; } @Override public ProfileResource updateUserByProfile(ProfileResource profile) { + User user = updateUserFromProfileResource(profile); + User updatedUser = new UpdateUser(user, userRepository).execute(); + ProfileResource updatedProfile = objectMapper.convertValue(updatedUser, ProfileResource.class); + return updatedProfile.getSafeProfile(); + } + + @Override + public ProfileResource updateUserEmail(ProfileResource profile) { + User user = updateUserFromProfileResource(profile); + + User updatedUser = new UpdateUser(user, userRepository).execute(); + ProfileResource updatedProfile = objectMapper.convertValue(updatedUser, ProfileResource.class); + return updatedProfile.getSafeProfile(); + } + + /** + * Check if email is changed. + * If email changes send and email to the user to verified this action + * @param user + * @throws MessagingException + */ + @Override + public ProfileResource verifyEmail(String username, String email) throws MessagingException { + ProfileResource profile = getUserProfile(username); + if(profile.getEmail() != email) { + TokenVerifyEmailClickback token = (TokenVerifyEmailClickback) + tokenService.createToken(username, email, TokenType.verifyEmail); + + emailManager.sendVerifyEmailClickback(email, token.getCallbackUrl()); + } + return profile; + + } + + private User updateUserFromProfileResource(ProfileResource profile) { User user = userRepository.findByNameIgnoreCase(profile.getUsername()) .filter(u -> u.getUsername().equals(profile.getUsername())) .orElseThrow(() -> new KlabException("Current User context does match updated profile username")); user.updateFromProfileResource(profile); - User updatedUser = new UpdateUser(user, userRepository).execute(); - ProfileResource updatedProfile = objectMapper.convertValue(updatedUser, ProfileResource.class); - return updatedProfile.getSafeProfile(); + return user; } - + @Override public ProfileResource getUserSafeProfile(User user) { if (user == null) { diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserRegistrationServiceImpl.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserRegistrationServiceImpl.java index 77d997a46..d97f0b081 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserRegistrationServiceImpl.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserRegistrationServiceImpl.java @@ -1,43 +1,28 @@ package org.integratedmodelling.klab.hub.users.services; -import static org.springframework.ldap.query.LdapQueryBuilder.query; - -import java.util.HashMap; import java.util.List; import java.util.Optional; -import java.util.stream.Stream; - -import javax.naming.NamingException; -import javax.naming.directory.Attributes; import org.integratedmodelling.klab.hub.agreements.services.AgreementService; import org.integratedmodelling.klab.hub.api.Agreement; import org.integratedmodelling.klab.hub.api.AgreementEntry; import org.integratedmodelling.klab.hub.api.User; import org.integratedmodelling.klab.hub.api.User.AccountStatus; -import org.integratedmodelling.klab.hub.commands.CreateLdapUser; import org.integratedmodelling.klab.hub.commands.CreatePendingUser; import org.integratedmodelling.klab.hub.commands.CreateUserWithRolesAndStatus; import org.integratedmodelling.klab.hub.commands.SetUserPasswordHash; -import org.integratedmodelling.klab.hub.commands.UpdateLdapUser; import org.integratedmodelling.klab.hub.commands.UpdateUser; import org.integratedmodelling.klab.hub.enums.AgreementLevel; import org.integratedmodelling.klab.hub.enums.AgreementType; import org.integratedmodelling.klab.hub.exception.BadRequestException; -import org.integratedmodelling.klab.hub.exception.UserEmailExistsException; import org.integratedmodelling.klab.hub.exception.UserExistsException; -import org.integratedmodelling.klab.hub.exception.UserNameOrEmailExistsException; +import org.integratedmodelling.klab.hub.ldap.LdapService; +import org.integratedmodelling.klab.hub.ldap.commands.CreateLdapUser; +import org.integratedmodelling.klab.hub.ldap.commands.UpdateLdapUser; import org.integratedmodelling.klab.hub.listeners.HubEventPublisher; import org.integratedmodelling.klab.hub.listeners.NewUserAdded; import org.integratedmodelling.klab.hub.repository.UserRepository; -import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; -import org.springframework.ldap.core.AttributesMapper; -import org.springframework.ldap.core.LdapTemplate; -import org.springframework.ldap.query.LdapQuery; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.ldap.userdetails.LdapUserDetailsManager; import org.springframework.stereotype.Service; @@ -45,26 +30,27 @@ @Service public class UserRegistrationServiceImpl implements UserRegistrationService { - private MongoTemplate mongoTemplate; +// private MongoTemplate mongoTemplate; private UserRepository userRepository; private PasswordEncoder passwordEncoder; - private LdapTemplate ldapTemplate; +// private LdapTemplate ldapTemplate; private LdapUserDetailsManager ldapUserDetailsManager; private HubEventPublisher publisher; private AgreementService agreementService; + private LdapService ldapService; @Autowired - public UserRegistrationServiceImpl(UserRepository userRepository, PasswordEncoder passwordEncoder, LdapTemplate ldapTemplate, + public UserRegistrationServiceImpl(UserRepository userRepository, PasswordEncoder passwordEncoder, LdapUserDetailsManager ldapUserDetailsManager, HubEventPublisher publisher, - AgreementService agreementService, MongoTemplate mongoTemplate) { + AgreementService agreementService, LdapService ldapService) { super(); this.userRepository = userRepository; this.passwordEncoder = passwordEncoder; - this.ldapTemplate = ldapTemplate; +// this.ldapTemplate = ldapTemplate; this.ldapUserDetailsManager = ldapUserDetailsManager; this.publisher = publisher; this.agreementService = agreementService; - this.mongoTemplate = mongoTemplate; + this.ldapService = ldapService; } @Override @@ -118,23 +104,23 @@ public User registerUser(User user) { private Optional checkIfUserPending(String username, String email) { boolean usernameExists = userRepository.findByNameIgnoreCase(username).isPresent(); - boolean emailExists = userRepository.findByEmailIgnoreCase(email).isPresent(); + //boolean emailExists = userRepository.findByEmailIgnoreCase(email).isPresent(); - if (usernameExists || emailExists) { + if (usernameExists) { boolean ldapExists = false; - try { - ldapExists = ldapUserExists(username, email); - } catch (BadRequestException bre) { - throw new UserNameOrEmailExistsException(); - } +// try { + ldapExists = ldapService.userExists(username, email); +// } catch (BadRequestException bre) { +// throw new UserNameOrEmailExistsException(); +// } - if (ldapExists && usernameExists && emailExists) { + if (ldapExists && usernameExists) { throw new UserExistsException(username); } - if (!ldapExists && usernameExists && emailExists) { + if (!ldapExists && usernameExists) { // we need to return a user who has not activated there account and will be asked to // reactivate with an email. Optional pendingUser = userRepository.findByNameIgnoreCase(username) @@ -144,12 +130,12 @@ private Optional checkIfUserPending(String username, String email) { return pendingUser; } - if (usernameExists != emailExists) { - if (usernameExists) - throw new UserExistsException(username); - else - throw new UserEmailExistsException(email); - } +// if (usernameExists != emailExists) { +// if (usernameExists) +// throw new UserExistsException(username); +// else +// throw new UserEmailExistsException(email); +// } throw new UserExistsException("How did we get here?"); @@ -178,7 +164,7 @@ public User setPassword(String username, String password, String confirm) { u -> u.getAccountStatus().equals(AccountStatus.verified) | u.getAccountStatus().equals(AccountStatus.active)) .orElseThrow(() -> new BadRequestException("User not active or verified")); - if (user.getAccountStatus().equals(AccountStatus.verified) | !ldapUserExists(user.getUsername(), user.getEmail())) { + if (user.getAccountStatus().equals(AccountStatus.verified) | !ldapService.userExists(user.getUsername(), user.getEmail())) { user = new SetUserPasswordHash(user, password, passwordEncoder).execute(); user = new CreateLdapUser(user, ldapUserDetailsManager).execute(); user.setAccountStatus(AccountStatus.active); @@ -202,35 +188,4 @@ private boolean confirmPassword(String password, String confirm) { return password.equals(confirm); } - private boolean ldapUserExists(String username, String email) { - LdapQuery userNameQuery = query().where("objectclass").is("person").and("uid").is(username); - List personByName = ldapTemplate.search(userNameQuery, new UserAttributesMapper()); - - LdapQuery userEmailQuery = query().where("objectclass").is("person").and("mail").is(email); - List personByEmail = ldapTemplate.search(userEmailQuery, new UserAttributesMapper()); - - if (!personByEmail.isEmpty() && !personByName.isEmpty() && !personByEmail.equals(personByName)) { - throw new BadRequestException("Username or email address already in use."); - } - - if (personByEmail.isEmpty() && personByName.isEmpty()) { - return false; - } else { - return true; - } - } - - private class UserAttributesMapper implements AttributesMapper { - public HashMap mapFromAttributes(Attributes attributes) throws NamingException { - HashMap userAttributes = new HashMap(); - try { - userAttributes.put("uid", attributes.get("uid").get().toString()); - userAttributes.put("mail", attributes.get("mail").get().toString()); - } catch (NamingException e) { - return new HashMap(); - } - return userAttributes; - } - } - }