From ee8e84b316caf15a5f7d830e4b4821e6d1fadb5a Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 19 Sep 2022 14:33:22 +0200 Subject: [PATCH] new fields in authoeization request --- .../OAuth2WebSecurityConfig.java | 9 ++++- .../controller/AdminController.java | 6 ++- .../controller/HomeController.java | 10 +++++ .../organizations/controller/UserInfo.java | 10 +++++ .../controller/UserRegistration.java | 40 +++++++++++++++++++ .../repository/UserRepository.java | 4 +- .../organizations/utils/DatabaseUtils.java | 29 +++++++++++--- .../templates/authorizationRequest.html | 30 ++++++++++++-- 8 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserRegistration.java diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/OAuth2WebSecurityConfig.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/OAuth2WebSecurityConfig.java index 2ff636dc..bf0c5e92 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/OAuth2WebSecurityConfig.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/OAuth2WebSecurityConfig.java @@ -1,6 +1,7 @@ package eu.dnetlib.organizations; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import org.apache.commons.lang3.StringUtils; @@ -124,7 +125,13 @@ public class OAuth2WebSecurityConfig extends WebSecurityConfigurerAdapter { return (userRequest) -> { final OidcUser oidcUser = delegate.loadUser(userRequest); - final String role = "ROLE_" + OpenOrgsConstants.OPENORGS_ROLE_PREFIX + databaseUtils.findUser(oidcUser.getEmail()) + final Optional user = databaseUtils.findUser(oidcUser.getEmail()); + + if (user.isPresent()) { + databaseUtils.updateUserDetails(oidcUser.getEmail(), oidcUser.getFullName(), oidcUser.getAttribute("organization")); + } + + final String role = "ROLE_" + OpenOrgsConstants.OPENORGS_ROLE_PREFIX + user .map(User::getRole) .filter(StringUtils::isNotBlank) .orElse(UserRole.NOT_AUTHORIZED.toString()); diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java index fd59c98a..a48f1a4f 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java @@ -47,16 +47,18 @@ public class AdminController extends AbstractDnetController { private DatabaseUtils dbUtils; @PostMapping(value = "/registration_api/newUser") - public Map newUser(final @RequestBody List countries, final Authentication authentication) { + public Map newUser(final @RequestBody UserRegistration user, final Authentication authentication) { final String email = UserInfo.getEmail(authentication); + final String fullname = UserInfo.getFullname(authentication); + final String organization = UserInfo.getOrganization(authentication); final Map res = new HashMap<>(); if (!UserInfo.isNotAuthorized(authentication) || userRepository.existsById(email)) { res.put("status", 2); } else { - dbUtils.newUser(email, countries); + dbUtils.newUser(email, fullname, organization, user.getReferencePerson(), user.getRequestMessage(), user.getCountries()); res.put("status", 1); } return res; diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/HomeController.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/HomeController.java index f09a5c5a..3bde7bb9 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/HomeController.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/HomeController.java @@ -65,6 +65,16 @@ public class HomeController extends AbstractDnetController { return authentication != null ? UserInfo.getEmail(authentication) : null; } + @ModelAttribute("fullname") + public String getUserFullname(final Authentication authentication) { + return authentication != null ? UserInfo.getFullname(authentication) : null; + } + + @ModelAttribute("organization") + public String getUserOrganization(final Authentication authentication) { + return authentication != null ? UserInfo.getOrganization(authentication) : null; + } + @ModelAttribute("sysconf") public SystemConfiguration getSysConf(final Authentication authentication) { return systemConfigurationRepository.findById(SystemConfiguration.DEFAULT_ID).get(); diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserInfo.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserInfo.java index cfa32586..8bdf1fe9 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserInfo.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserInfo.java @@ -92,4 +92,14 @@ public class UserInfo { return user instanceof DefaultOidcUser ? ((DefaultOidcUser) user).getEmail() : authentication.getName(); } + public static String getFullname(final Authentication authentication) { + final Object user = authentication.getPrincipal(); + return user instanceof DefaultOidcUser ? ((DefaultOidcUser) user).getFullName() : "unknown"; + } + + public static String getOrganization(final Authentication authentication) { + final Object user = authentication.getPrincipal(); + return user instanceof DefaultOidcUser ? ((DefaultOidcUser) user).getAttribute("organization") : "unknown"; + } + } diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserRegistration.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserRegistration.java new file mode 100644 index 00000000..3c40d31e --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/UserRegistration.java @@ -0,0 +1,40 @@ +package eu.dnetlib.organizations.controller; + +import java.io.Serializable; +import java.util.List; + +public class UserRegistration implements Serializable { + + private static final long serialVersionUID = 4872798305803491565L; + + private String referencePerson; + + private String requestMessage; + + private List countries; + + public String getReferencePerson() { + return referencePerson; + } + + public void setReferencePerson(final String referencePerson) { + this.referencePerson = referencePerson; + } + + public String getRequestMessage() { + return requestMessage; + } + + public void setRequestMessage(final String requestMessage) { + this.requestMessage = requestMessage; + } + + public List getCountries() { + return countries; + } + + public void setCountries(final List countries) { + this.countries = countries; + } + +} diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/UserRepository.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/UserRepository.java index 0d2da87e..6fd5be93 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/UserRepository.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/repository/UserRepository.java @@ -11,7 +11,7 @@ import eu.dnetlib.organizations.model.User; public interface UserRepository extends JpaRepository { @Modifying - @Query("update User set last_access = ?2 where email = ?1") - void updateLastAccess(final String email, OffsetDateTime now); + @Query("update User set fullname = ?2, organization = ?3, last_access = ?4 where email = ?1") + void updateDetails(final String email, final String fullname, final String organization, OffsetDateTime now); } diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/utils/DatabaseUtils.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/utils/DatabaseUtils.java index 77399cd8..91b662bd 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/utils/DatabaseUtils.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/utils/DatabaseUtils.java @@ -339,6 +339,10 @@ public class DatabaseUtils { @Transactional public void saveUser(@RequestBody final UserView userView) { final User user = userRepository.findById(userView.getEmail()).orElseThrow(() -> new RuntimeException("User not found")); + user.setFullname(userView.getFullname()); + user.setOrganization(userView.getOrganization()); + user.setReferencePerson(userView.getReferencePerson()); + user.setRequestMessage(userView.getRequestMessage()); user.setRole(userView.getRole()); user.setValid(userView.isValid()); userRepository.save(user); @@ -356,12 +360,24 @@ public class DatabaseUtils { } @Transactional - public void newUser(final String email, final List countries) { + public void newUser(final String email, + final String fullname, + final String organization, + final String referencePerson, + final String requestMessage, + final List countries) { + final User user = new User(); user.setEmail(email); + user.setFullname(fullname); + user.setOrganization(organization); + user.setReferencePerson(referencePerson); + user.setRequestMessage(requestMessage); user.setRole(UserRole.PENDING.name()); user.setValid(false); + userRepository.save(user); + if (countries != null) { userCountryRepository.saveAll(countries.stream().map(c -> new UserCountry(email, c)).collect(Collectors.toList())); } @@ -536,11 +552,12 @@ public class DatabaseUtils { @Transactional public Optional findUser(final String email) { - final Optional user = userRepository.findById(email); - if (user.isPresent()) { - userRepository.updateLastAccess(email, OffsetDateTime.now()); - } - return user; + return userRepository.findById(email); + } + + @Transactional + public void updateUserDetails(final String email, final String fullname, final String organization) { + userRepository.updateDetails(email, fullname, organization, OffsetDateTime.now()); } private String findFirstString(final List views, final Function mapper) { diff --git a/apps/dnet-orgs-database-application/src/main/resources/templates/authorizationRequest.html b/apps/dnet-orgs-database-application/src/main/resources/templates/authorizationRequest.html index 3169d952..b2f785a6 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/templates/authorizationRequest.html +++ b/apps/dnet-orgs-database-application/src/main/resources/templates/authorizationRequest.html @@ -50,6 +50,25 @@

+
+ + +
+
+ + +
+
+ + + Please indicate your reference person (if available) +
+
+ + + Specify the reasons for your request +
+
Select your countries
@@ -84,6 +103,8 @@