diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 35642d025..d6d887e24 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -172,6 +172,13 @@ 2.7.0 + + + org.springframework.social + spring-social-facebook + 2.0.3.RELEASE + + diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfileController.java b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfileController.java index a25472ea7..34810514e 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfileController.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfileController.java @@ -12,6 +12,7 @@ import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -58,7 +59,7 @@ public class DatasetProfileController extends BaseController{ } } - + @Transactional @RequestMapping(method = RequestMethod.POST, value = { "/datasetprofile/save/{id}" }, consumes="application/json",produces="application/json") public ResponseEntity updateDataset(@PathVariable String id,@RequestBody PropertiesModel properties){ try { @@ -73,6 +74,7 @@ public class DatasetProfileController extends BaseController{ return ResponseEntity.status(HttpStatus.OK).body(properties); } catch(Exception ex) { + ex.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Serialization issue: "+ex.getMessage()); } } diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Login.java b/dmp-backend/src/main/java/eu/eudat/controllers/Login.java index 9db59b2d1..6811264a8 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Login.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Login.java @@ -31,7 +31,6 @@ public class Login { public @ResponseBody ResponseItem googleLogin(@RequestBody LoginInfo credentials) { try { return new ResponseItem().payload(customAuthenticationProvider.authenticate(credentials)).status(HttpStatus.OK); - } catch (Exception ex) { ex.printStackTrace(); return new ResponseItem().status(HttpStatus.BAD_REQUEST).message(ex.getMessage()); diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java b/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java index 105f0984d..3f544fc94 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java @@ -259,7 +259,11 @@ import com.fasterxml.jackson.annotation.ObjectIdGenerators; @Override public void update(Dataset entity) { - + this.setRegistries(entity.getRegistries()); + this.setDataRepositories(entity.getDataRepositories()); + this.setDescription(entity.getDescription()); + this.setLabel(entity.getLabel()); + this.setProperties(entity.getProperties()); } @Override diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java index f22563f0c..433a45981 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java @@ -41,8 +41,8 @@ public class DatasetManager { eu.eudat.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id)); eu.eudat.models.user.composite.DatasetProfile datasetprofile = UserManager.generateDatasetProfileModel(datasetEntity.getProfile()); datasetprofile.setStatus(dataset.getStatus()); - if(dataset.getProperties()!=null){ - JSONObject jobject = new JSONObject(dataset.getProperties()); + if(datasetEntity.getProperties()!=null){ + JSONObject jobject = new JSONObject(datasetEntity.getProperties()); Map properties = (Map)jobject.toMap(); datasetprofile.fromJsonObject(properties); } diff --git a/dmp-backend/src/main/java/eu/eudat/models/login/LoginInfo.java b/dmp-backend/src/main/java/eu/eudat/models/login/LoginInfo.java index 8687eaf2f..c4d8ec834 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/login/LoginInfo.java +++ b/dmp-backend/src/main/java/eu/eudat/models/login/LoginInfo.java @@ -1,12 +1,13 @@ package eu.eudat.models.login; +import eu.eudat.security.validators.TokenValidatorFactoryImpl; + /** * Created by ikalyvas on 12/18/2017. */ public class LoginInfo { private String ticket; - private String service; - + private TokenValidatorFactoryImpl.LoginProvider provider; public String getTicket() { return ticket; } @@ -15,11 +16,11 @@ public class LoginInfo { this.ticket = ticket; } - public String getService() { - return service; + public TokenValidatorFactoryImpl.LoginProvider getProvider() { + return provider; } - public void setService(String service) { - this.service = service; + public void setProvider(Integer provider) { + this.provider = TokenValidatorFactoryImpl.LoginProvider.fromInteger(provider); } } diff --git a/dmp-backend/src/main/java/eu/eudat/models/properties/Section.java b/dmp-backend/src/main/java/eu/eudat/models/properties/Section.java index dacce2132..9268c27c1 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/properties/Section.java +++ b/dmp-backend/src/main/java/eu/eudat/models/properties/Section.java @@ -6,7 +6,7 @@ import java.util.Map; public class Section implements PropertiesGenerator{ private List
sections; - private List fieldGroups; + private List
compositeFields; public List
getSections() { return sections; @@ -14,16 +14,19 @@ public class Section implements PropertiesGenerator{ public void setSections(List
sections) { this.sections = sections; } - public List getFieldGroups() { - return fieldGroups; + + public List
getCompositeFields() { + return compositeFields; } - public void setFieldGroups(List fieldGroups) { - this.fieldGroups = fieldGroups; + + public void setCompositeFields(List
compositeFields) { + this.compositeFields = compositeFields; } + @Override public void toMap(Map fieldValues) { this.sections.forEach(item->item.toMap(fieldValues)); - this.fieldGroups.forEach(item->item.toMap(fieldValues)); + this.compositeFields.forEach(item->item.toMap(fieldValues)); } @Override public void toMap(Map fieldValues, int index) { diff --git a/dmp-backend/src/main/java/eu/eudat/models/user/components/datasetprofile/Field.java b/dmp-backend/src/main/java/eu/eudat/models/user/components/datasetprofile/Field.java index 85bae57b5..f6e04715d 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/user/components/datasetprofile/Field.java +++ b/dmp-backend/src/main/java/eu/eudat/models/user/components/datasetprofile/Field.java @@ -105,14 +105,15 @@ public class Field implements Comparable,PropertiesModelBuilder,ViewStyleDefinit this.visible = visible; } - public List getValidations() { - return validations; + public List getValidations() { + return this.validations.stream().map(item->(int)item.getValue()).collect(Collectors.toList()); } - public void setValidations(List validations) { - this.validations = validations; + public void setValidations(List validations) { + this.validations = eu.eudat.models.admin.components.datasetprofile.Field.ValidationType.fromIntegers(validations); } + public Field cloneForMultiplicity(String key, Map properties){ Field newField = new Field(); newField.id = key; diff --git a/dmp-backend/src/main/java/eu/eudat/security/CustomAuthenticationProvider.java b/dmp-backend/src/main/java/eu/eudat/security/CustomAuthenticationProvider.java index 1a3b0b98c..b54bb81d0 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/CustomAuthenticationProvider.java +++ b/dmp-backend/src/main/java/eu/eudat/security/CustomAuthenticationProvider.java @@ -2,41 +2,30 @@ package eu.eudat.security; import java.io.IOException; import java.security.GeneralSecurityException; -import java.util.ArrayList; -import javax.naming.NameAlreadyBoundException; - -import eu.eudat.models.login.Credentials; import eu.eudat.models.login.LoginInfo; import eu.eudat.models.security.Principal; +import eu.eudat.security.validators.TokenValidatorFactory; +import eu.eudat.security.validators.TokenValidatorFactoryImpl; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.AuthenticationServiceException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.stereotype.Component; import eu.eudat.dao.entities.UserInfoDao; -import eu.eudat.entities.UserInfo; import eu.eudat.exceptions.NonValidTokenException; -import eu.eudat.security.validators.GoogleTokenValidator; -import eu.eudat.security.validators.NativeTokenValidator; -import eu.eudat.security.validators.TokenValidator; +import eu.eudat.security.validators.google.GoogleTokenValidator; @Component public class CustomAuthenticationProvider { - - @Autowired private UserInfoDao userInfoDao; - - @Autowired private GoogleTokenValidator googleTokenValidator; - @Autowired private NativeTokenValidator nativeTokenValidator; - + + @Autowired private TokenValidatorFactory tokenValidatorFactory; + public Principal authenticate(LoginInfo credentials) throws AuthenticationException, GeneralSecurityException { String token = credentials.getTicket(); try { - Principal principal = googleTokenValidator.validateToken(token); + Principal principal = this.tokenValidatorFactory.getProvider(credentials.getProvider()).validateToken(token); return principal; } catch (NonValidTokenException e) { e.printStackTrace(); diff --git a/dmp-backend/src/main/java/eu/eudat/security/TokenAuthenticationFilter.java b/dmp-backend/src/main/java/eu/eudat/security/TokenAuthenticationFilter.java deleted file mode 100644 index 72becdd63..000000000 --- a/dmp-backend/src/main/java/eu/eudat/security/TokenAuthenticationFilter.java +++ /dev/null @@ -1,65 +0,0 @@ -package eu.eudat.security; - -import java.io.IOException; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.web.filter.GenericFilterBean; - - -public class TokenAuthenticationFilter extends GenericFilterBean { - -// public static final String HEADER_TOKEN_FIELD = "Authorization"; - - public static final String HEADER_NATIVE_TOKEN_FIELD = "native-token"; - public static final String HEADER_GOOGLE_TOKEN_FIELD = "google-token"; - public static final char HEADERNAME_USERNAME_DELIMITER = 0x1e; //specially crafted delimiter - - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { - - final HttpServletRequest httpRequest = (HttpServletRequest) request; - - String nativeToken = httpRequest.getHeader(HEADER_NATIVE_TOKEN_FIELD); - String googleToken = httpRequest.getHeader(HEADER_GOOGLE_TOKEN_FIELD); - //just pass the header, the username and the token into the credentials object of the UsernamePasswordAuthenticationToken class - UsernamePasswordAuthenticationToken authentication = null; - if(nativeToken != null) - authentication = new UsernamePasswordAuthenticationToken(HEADER_NATIVE_TOKEN_FIELD, nativeToken); - if(googleToken != null) - authentication = new UsernamePasswordAuthenticationToken(HEADER_GOOGLE_TOKEN_FIELD, googleToken); - - SecurityContextHolder.getContext().setAuthentication(authentication); - - - - final HttpServletResponse httpResponse = (HttpServletResponse) response; - - httpResponse.setHeader("Access-Control-Allow-Origin", "*"); - httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); - httpResponse.setHeader("Access-Control-Max-Age", "7200"); - httpResponse.setHeader("Access-Control-Allow-Headers", "content-type, X-CSRF-Token, "+HEADER_NATIVE_TOKEN_FIELD+", "+HEADER_GOOGLE_TOKEN_FIELD); -// httpResponse.addHeader("Access-Control-Expose-Headers", "xsrf-token , " +HEADER_NATIVE_TOKEN_FIELD+", "+HEADER_GOOGLE_TOKEN_FIELD); - - - if ("OPTIONS".equals(httpRequest.getMethod())) { - httpResponse.setStatus(HttpServletResponse.SC_OK); - } - else { - chain.doFilter(httpRequest, httpResponse); - } - - - } - - - - -} diff --git a/dmp-backend/src/main/java/eu/eudat/security/TokenSessionManager.java b/dmp-backend/src/main/java/eu/eudat/security/TokenSessionManager.java deleted file mode 100644 index 09dbc431c..000000000 --- a/dmp-backend/src/main/java/eu/eudat/security/TokenSessionManager.java +++ /dev/null @@ -1,83 +0,0 @@ -package eu.eudat.security; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.util.concurrent.TimeUnit; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import org.springframework.stereotype.Service; - -@Service -public class TokenSessionManager { - - private final static long TOTAL_SESSION_MINUTES = 120L; - private final static long IDLE_MINUTES_EXPIRE = 20L; - - private static Cache cache; //that's thread-safe according to the documentation - - private static TokenSessionManager instance = null; //should be one-per-classloader - - - public static synchronized TokenSessionManager getInstance() { - if (instance == null){ - instance = new TokenSessionManager(); - initialize(); - } - return instance; - } - - private static void initialize() { - cache = CacheBuilder.newBuilder() - .expireAfterWrite(TOTAL_SESSION_MINUTES, TimeUnit.MINUTES) - .expireAfterAccess(IDLE_MINUTES_EXPIRE, TimeUnit.MINUTES) - .maximumSize(Long.MAX_VALUE) - .build(); - } - - public String getUser(String token) { - return cache.getIfPresent(token); - } - - public void set(String token, String user) { - cache.put(token, user); - } - - public String generateRandomAlphanumeric(int length) { - SecureRandom random = new SecureRandom(); - byte bytes[] = new byte[length]; - random.nextBytes(bytes); - return encode(bytes); - } - - - private String encode(byte[] binaryData) { - int n = binaryData.length; - char[] HEXADECIMAL = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - char[] buffer = new char[n * 2]; - for (int i = 0; i < n; i++) { - int low = (binaryData[i] & 0x0f); - int high = ((binaryData[i] & 0xf0) >> 4); - buffer[i * 2] = HEXADECIMAL[high]; - buffer[(i * 2) + 1] = HEXADECIMAL[low]; - } - return new String(buffer); - } - - - public String hashPassword (String password) throws NoSuchAlgorithmException { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - md.update(password.getBytes()); - byte byteData[] = md.digest(); - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < byteData.length; i++) - sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); - return sb.toString(); - } - -// public static void main(String [] args) throws NoSuchAlgorithmException { -// System.out.println(TokenSessionManager.getInstance().hashPassword("apa$$2gu3$$")); -// } - -} diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/NativeTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/NativeTokenValidator.java deleted file mode 100644 index 89c9a2e13..000000000 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/NativeTokenValidator.java +++ /dev/null @@ -1,29 +0,0 @@ -package eu.eudat.security.validators; - -import eu.eudat.models.security.Principal; -import org.springframework.beans.factory.annotation.Autowired; - -import eu.eudat.dao.entities.UserInfoDao; -import eu.eudat.entities.UserInfo; -import eu.eudat.exceptions.NonValidTokenException; -import eu.eudat.security.TokenSessionManager; -import org.springframework.stereotype.Component; - -@Component -public class NativeTokenValidator implements TokenValidator { - - @Autowired private TokenSessionManager tokenSessionManager; - @Autowired private UserInfoDao userInfoDao; - - @Override - public Principal validateToken(String token) throws NonValidTokenException { - String tokenUser = tokenSessionManager.getUser(token); - if(tokenUser==null || tokenUser.isEmpty()) - throw new NonValidTokenException("Login session has expired! Need to eu.eudat.login again!"); - return new Principal(); - } - - - - -} diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidator.java index 331c94810..f73cd75da 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidator.java @@ -9,6 +9,6 @@ import java.security.GeneralSecurityException; public interface TokenValidator { - public Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException; + Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException; } diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactory.java b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactory.java new file mode 100644 index 000000000..ca99d8eac --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactory.java @@ -0,0 +1,8 @@ +package eu.eudat.security.validators; + +/** + * Created by ikalyvas on 1/9/2018. + */ +public interface TokenValidatorFactory { + TokenValidator getProvider(TokenValidatorFactoryImpl.LoginProvider provider); +} diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java new file mode 100644 index 000000000..b86b0d21f --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java @@ -0,0 +1,63 @@ +package eu.eudat.security.validators; + +import eu.eudat.models.project.Project; +import eu.eudat.security.validators.google.FacebookTokenValidator; +import eu.eudat.security.validators.google.GoogleTokenValidator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Created by ikalyvas on 1/9/2018. + */ +@Service("tokenValidatorFactory") +public class TokenValidatorFactoryImpl implements TokenValidatorFactory{ + public enum LoginProvider { + GOOGLE((short) 1), FACEBOOK((short) 2), TWITTER((short) 3), LINKEDIN((short) 4); + + private short value; + + private LoginProvider(short value) { + this.value = value; + } + + public short getValue() { + return value; + } + + public static LoginProvider fromInteger(int value) { + switch (value) { + case 1: + return GOOGLE; + case 2: + return FACEBOOK; + case 3: + return TWITTER; + case 4: + return LINKEDIN; + default: + throw new RuntimeException("Unsupported LoginProvider"); + } + } + } + + private GoogleTokenValidator googleTokenValidator; + private FacebookTokenValidator facebookTokenValidator; + + @Autowired + public TokenValidatorFactoryImpl(GoogleTokenValidator googleTokenValidator, FacebookTokenValidator facebookTokenValidator) { + this.googleTokenValidator = googleTokenValidator; + this.facebookTokenValidator = facebookTokenValidator; + } + + public TokenValidator getProvider(LoginProvider provider) { + switch (provider) { + case GOOGLE: + return this.googleTokenValidator; + case FACEBOOK: + return this.facebookTokenValidator; + default: + throw new RuntimeException("Login Provider Not Implemented"); + } + } + +} diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/google/FacebookTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/google/FacebookTokenValidator.java new file mode 100644 index 000000000..58cf562f2 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/google/FacebookTokenValidator.java @@ -0,0 +1,124 @@ +package eu.eudat.security.validators.google; + +import eu.eudat.dao.entities.UserInfoDao; +import eu.eudat.dao.entities.security.CredentialDao; +import eu.eudat.dao.entities.security.UserTokenDao; +import eu.eudat.entities.Credential; +import eu.eudat.entities.UserInfo; +import eu.eudat.entities.UserToken; +import eu.eudat.exceptions.NonValidTokenException; +import eu.eudat.models.criteria.UserInfoCriteria; +import eu.eudat.models.security.Principal; +import eu.eudat.security.validators.TokenValidator; +import eu.eudat.security.validators.TokenValidatorFactoryImpl; +import eu.eudat.services.ApiContext; +import eu.eudat.services.AuthenticationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.social.connect.Connection; +import org.springframework.social.connect.ConnectionKey; +import org.springframework.social.facebook.api.Facebook; +import org.springframework.social.facebook.api.User; +import org.springframework.social.facebook.connect.FacebookConnectionFactory; +import org.springframework.social.facebook.connect.FacebookServiceProvider; +import org.springframework.social.oauth2.AccessGrant; +import org.springframework.social.oauth2.OAuth2Operations; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; + +/** + * Created by ikalyvas on 1/9/2018. + */ +@Component("facebookTokenValidator") +public class FacebookTokenValidator implements TokenValidator { + + private Environment environment; + private ApiContext apiContext; + private FacebookServiceProvider facebookServiceProvider; + + @Autowired + public FacebookTokenValidator(Environment environment,ApiContext apiContext) { + this.environment = environment; + this.apiContext= apiContext; + this.facebookServiceProvider = new FacebookServiceProvider(this.environment.getProperty("facebook.login.clientId"), this.environment.getProperty("facebook.login.clientSecret"),this.environment.getProperty("facebook.login.namespace")); + } + + @Override + public Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException { + User profile = getFacebookUserId(token); + + UserInfoCriteria criteria = new UserInfoCriteria(); + criteria.setEmail(profile.getEmail()); + List users = apiContext.getDatabaseRepository().getUserInfoDao().getWithCriteria(criteria).toList(); + UserInfo userInfo = null; + if(users.size()>0)userInfo = users.get(0); + final Credential credential = new Credential(); + credential.setId(UUID.randomUUID()); + credential.setCreationTime(new Date()); + credential.setStatus(1); + credential.setLastUpdateTime(new Date()); + credential.setProvider((int)TokenValidatorFactoryImpl.LoginProvider.FACEBOOK.getValue()); + credential.setSecret(token); + if(userInfo == null) { + userInfo = new UserInfo(); + userInfo.setName((String)profile.getName()); + userInfo.setVerified_email(profile.isVerified()); + userInfo.setEmail(profile.getEmail()); + userInfo.setCreated(new Date()); + userInfo.setLastloggedin(new Date()); + userInfo.setAuthorization_level(new Short("1")); + userInfo.setUsertype(new Short("1")); + userInfo = apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + + credential.setPublicValue(userInfo.getName()); + + credential.setUserInfo(userInfo); + apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential); + } + else { + userInfo.setLastloggedin(new Date()); + Set credentials = userInfo.getCredentials(); + if(credentials.contains(credential)){ + Credential oldCredential = credentials.stream().filter(item->credential.getProvider().equals(item.getProvider())).findFirst().get(); + credential.setId(oldCredential.getId()); + } + else{ + credential.setUserInfo(userInfo); + credential.setId(UUID.randomUUID()); + credential.setPublicValue(userInfo.getName()); + + apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential); + userInfo.getCredentials().add(credential); + } + userInfo = apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + + } + + UserToken userToken = new UserToken(); + userToken.setUser(userInfo); + userToken.setIssuedAt(new Date()); + userToken.setToken(UUID.randomUUID()); + userToken.setExpiresAt(addADay(new Date())); + apiContext.getDatabaseRepository().getUserTokenDao().create(userToken); + return apiContext.getAuthenticationService().Touch(userToken.getToken()); + } + + + private User getFacebookUserId(String accessToken) { + String [] fields = { "id", "email", "first_name", "last_name","name" }; + User profile = this.facebookServiceProvider.getApi(accessToken).fetchObject("me",User.class,fields); + return profile; + } + + private Date addADay(Date date){ + Date dt = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(dt); + c.add(Calendar.DATE, 1); + dt = c.getTime(); + return dt; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/GoogleTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java similarity index 94% rename from dmp-backend/src/main/java/eu/eudat/security/validators/GoogleTokenValidator.java rename to dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java index d3279aea9..593b7e99e 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/GoogleTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java @@ -1,4 +1,4 @@ -package eu.eudat.security.validators; +package eu.eudat.security.validators.google; import java.io.FileReader; import java.io.IOException; @@ -15,6 +15,8 @@ import eu.eudat.entities.Credential; import eu.eudat.entities.UserToken; import eu.eudat.models.criteria.UserInfoCriteria; import eu.eudat.models.login.LoginInfo; +import eu.eudat.security.validators.TokenValidator; +import eu.eudat.security.validators.TokenValidatorFactoryImpl; import eu.eudat.services.AuthenticationService; import org.springframework.beans.factory.annotation.Autowired; @@ -31,12 +33,10 @@ import org.springframework.stereotype.Service; import static com.sun.org.apache.xalan.internal.xsltc.compiler.Constants.REDIRECT_URI; -@Component +@Component("googleTokenValidator") public class GoogleTokenValidator implements TokenValidator { - private static final JacksonFactory jacksonFactory = new JacksonFactory(); private static final HttpTransport transport = new NetHttpTransport(); - @Autowired private UserInfoDao userInfoDao; @Autowired private CredentialDao credentialDao; @Autowired private AuthenticationService authenticationService; @@ -73,7 +73,7 @@ public class GoogleTokenValidator implements TokenValidator { credential.setCreationTime(new Date()); credential.setStatus(1); credential.setLastUpdateTime(new Date()); - credential.setProvider(1); + credential.setProvider((int)TokenValidatorFactoryImpl.LoginProvider.GOOGLE.getValue()); credential.setSecret(token); if(userInfo == null) { userInfo = new UserInfo(); diff --git a/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java b/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java index 5f7cc8c78..341ab43c7 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java +++ b/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java @@ -12,4 +12,5 @@ public interface ApiContext { InvitationService getInvitationService(); RemoteFetcher getRemoteFetcher(); MailService getMailService(); + AuthenticationService getAuthenticationService(); } diff --git a/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java b/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java index 429b71b74..7dfe45117 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java @@ -16,6 +16,7 @@ public class ApiContextImpl implements ApiContext{ private RemoteFetcher remoteFetcher; private InvitationService invitationService; private MailService mailService; + private AuthenticationService authenticationService; @Autowired public void setDatabaseRepository(DatabaseRepository databaseRepository) { @@ -66,4 +67,14 @@ public class ApiContextImpl implements ApiContext{ public void setMailService(MailService mailService) { this.mailService = mailService; } + + @Override + public AuthenticationService getAuthenticationService() { + return authenticationService; + } + + @Autowired + public void setAuthenticationService(AuthenticationService authenticationService) { + this.authenticationService = authenticationService; + } } diff --git a/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepository.java b/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepository.java index 7eb28e538..f99e44edd 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepository.java +++ b/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepository.java @@ -1,6 +1,8 @@ package eu.eudat.services; import eu.eudat.dao.entities.*; +import eu.eudat.dao.entities.security.CredentialDao; +import eu.eudat.dao.entities.security.UserTokenDao; /** * Created by ikalyvas on 1/4/2018. @@ -23,4 +25,6 @@ public interface DatabaseRepository { InvitationDao getInvitationDao(); DMPProfileDao getDmpProfileDao(); DMPResearcherDao getDmpResearcherDao(); + CredentialDao getCredentialDao(); + UserTokenDao getUserTokenDao(); } diff --git a/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepositoryImpl.java b/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepositoryImpl.java index 33752a7c2..94d1e8efe 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepositoryImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepositoryImpl.java @@ -1,6 +1,8 @@ package eu.eudat.services; import eu.eudat.dao.entities.*; +import eu.eudat.dao.entities.security.CredentialDao; +import eu.eudat.dao.entities.security.UserTokenDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -25,7 +27,8 @@ public class DatabaseRepositoryImpl implements DatabaseRepository{ private ServiceDao serviceDao; private UserInfoDao userInfoDao; private InvitationDao invitationDao; - + private CredentialDao credentialDao; + private UserTokenDao userTokenDao; @Autowired private void setDataRepositoryDao(DataRepositoryDao dataRepositoryDao) { this.dataRepositoryDao = dataRepositoryDao; @@ -185,4 +188,24 @@ public class DatabaseRepositoryImpl implements DatabaseRepository{ public void setInvitationDao(InvitationDao invitationDao) { this.invitationDao = invitationDao; } + + @Override + public CredentialDao getCredentialDao() { + return credentialDao; + } + + @Autowired + public void setCredentialDao(CredentialDao credentialDao) { + this.credentialDao = credentialDao; + } + + @Override + public UserTokenDao getUserTokenDao() { + return userTokenDao; + } + + @Autowired + public void setUserTokenDao(UserTokenDao userTokenDao) { + this.userTokenDao = userTokenDao; + } } diff --git a/dmp-backend/src/main/resources/application.properties b/dmp-backend/src/main/resources/application.properties index 7fa916e55..130b4497e 100644 --- a/dmp-backend/src/main/resources/application.properties +++ b/dmp-backend/src/main/resources/application.properties @@ -6,7 +6,8 @@ ##########################Persistence########################################## database.driver-class-name=org.postgresql.Driver database.url = jdbc:postgresql://develdb1.madgik.di.uoa.gr:5432/dmptool - +database.username = dmptool +database.password = dmpt00lu$r ##########################/Persistence########################################## ###################Allowed Proxy Service Host ############################ @@ -17,7 +18,8 @@ configuration.externalUrls = file:///C:\\Users\\ikalyvas\\Documents\\Projects\\O ########################/Email############################# spring.mail.default-encoding=UTF-8 spring.mail.host=smtp.gmail.com - +spring.mail.username=kalivasioan@gmail.com +spring.mail.password=A3b*1*92 spring.mail.port=587 spring.mail.protocol=smtp spring.mail.test-connection=false @@ -27,9 +29,10 @@ mail.subject = Invitation to DMP Plan {dmpname} mail.content = You have been invited to {dmpname} data management plan.Follow the link localhost:4200/invitation/{invitationID} to submit it mail.from = citesagrdev@gmail.com -########################Persistence/Hibernate Generic############################# - - +########################FACEBOOK LOGIN Properties############################# +facebook.login.clientId = 110586756143149 +facebook.login.clientSecret = 522a847f05c873d0222c85109e24f55a +facebook.login.namespace = eudat ########################Persistence/Hibernate/Batch############################## #persistence.hibernate.jdbc.batch_size = 30 #persistence.hibernate.order_inserts = true diff --git a/dmp-frontend/src/app/login/login.component.html b/dmp-frontend/src/app/login/login.component.html index 84ff8531e..08ccaa75b 100644 --- a/dmp-frontend/src/app/login/login.component.html +++ b/dmp-frontend/src/app/login/login.component.html @@ -12,7 +12,7 @@ -