diff --git a/pom.xml b/pom.xml index 7a506df..0d9afb7 100644 --- a/pom.xml +++ b/pom.xml @@ -15,11 +15,6 @@ - - eu.dnetlib - uoa-login-core - [1.0.0-SNAPSHOT, 2.0.0) - org.springframework spring-webmvc @@ -322,6 +317,7 @@ + org.apache.maven.plugins maven-war-plugin 2.6 diff --git a/src/main/java/eu/dnetlib/repo/manager/config/AaiSecurityConfiguration.java b/src/main/java/eu/dnetlib/repo/manager/config/AaiSecurityConfiguration.java index 8e97868..67e5982 100644 --- a/src/main/java/eu/dnetlib/repo/manager/config/AaiSecurityConfiguration.java +++ b/src/main/java/eu/dnetlib/repo/manager/config/AaiSecurityConfiguration.java @@ -1,6 +1,5 @@ package eu.dnetlib.repo.manager.config; -import com.google.common.collect.ImmutableList; import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod; import org.mitre.oauth2.model.RegisteredClient; import org.mitre.openid.connect.client.OIDCAuthenticationFilter; @@ -18,9 +17,6 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint; import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import java.util.*; @@ -46,11 +42,6 @@ public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter { @Value("${webapp.dev.front}") private String webAppFrontEnd; - private Map userRoles = new HashMap(){{ - put("urn:geant:openaire.eu:group:Super+Administrator#aai.openaire.eu", "ROLE_ADMIN"); - put("urn:geant:openaire.eu:group:Content+Provider+Dashboard+Administrator#aai.openaire.eu","ROLE_PROVIDE_ADMIN"); - }}; - @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { @@ -58,12 +49,12 @@ public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter { } @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { + protected void configure(AuthenticationManagerBuilder auth) { auth.authenticationProvider(openIdConnectAuthenticationProvider()); } @Override - public void configure(WebSecurity web) throws Exception { + public void configure(WebSecurity web) { web.ignoring().antMatchers("/stats/**"); } @@ -74,33 +65,33 @@ public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter { .authorizeRequests() .anyRequest().authenticated() .and() - .httpBasic() - .authenticationEntryPoint(authenticationEntryPoint()) + .httpBasic() + .authenticationEntryPoint(authenticationEntryPoint()) .and() - .logout().logoutUrl("/openid_logout") - .invalidateHttpSession(true) - .deleteCookies("openAIRESession") - .logoutSuccessUrl(logoutSuccessUrl) + .logout().logoutUrl("/openid_logout") + .invalidateHttpSession(true) + .deleteCookies("openAIRESession") + .logoutSuccessUrl(logoutSuccessUrl) .and() - .addFilterBefore(openIdConnectAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class) + .addFilterBefore(openIdConnectAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class) ; } @Bean - public OIDCAuthenticationProvider openIdConnectAuthenticationProvider(){ + public OIDCAuthenticationProvider openIdConnectAuthenticationProvider() { OIDCAuthenticationProvider oidcProvider = new OIDCAuthenticationProvider(); oidcProvider.setAuthoritiesMapper(authoritiesMapper()); return oidcProvider; } @Bean - public OpenAireProviderAuthoritiesMapper authoritiesMapper(){ - OpenAireProviderAuthoritiesMapper authoritiesMapper = new OpenAireProviderAuthoritiesMapper(userRoles); + public OpenAIREAuthoritiesMapper authoritiesMapper() { + OpenAIREAuthoritiesMapper authoritiesMapper = new OpenAIREAuthoritiesMapper(); return authoritiesMapper; } @Bean - public StaticServerConfigurationService staticServerConfigurationService(){ + public StaticServerConfigurationService staticServerConfigurationService() { StaticServerConfigurationService staticServerConfigurationService = new StaticServerConfigurationService(); Map servers = new HashMap<>(); servers.put(oidcIssuer, serverConfiguration()); @@ -109,49 +100,49 @@ public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter { } @Bean - public StaticClientConfigurationService staticClientConfigurationService(){ + public StaticClientConfigurationService staticClientConfigurationService() { StaticClientConfigurationService staticClientConfigurationService = new StaticClientConfigurationService(); Map clients = new HashMap<>(); - clients.put(oidcIssuer,registeredClient()); + clients.put(oidcIssuer, registeredClient()); staticClientConfigurationService.setClients(clients); return staticClientConfigurationService; } @Bean - public RegisteredClient registeredClient(){ + public RegisteredClient registeredClient() { RegisteredClient registeredClient = new RegisteredClient(); registeredClient.setClientId(oidcId); registeredClient.setClientSecret(oidcSecret); - registeredClient.setScope(new HashSet<>(Arrays.asList("openid","eduperson_entitlement","profile", "email"))); + registeredClient.setScope(new HashSet<>(Arrays.asList("openid", "eduperson_entitlement", "profile", "email"))); registeredClient.setTokenEndpointAuthMethod(AuthMethod.SECRET_BASIC); registeredClient.setRedirectUris(new HashSet<>(Collections.singletonList(oidcDevHome))); return registeredClient; } @Bean - public StaticAuthRequestOptionsService staticAuthRequestOptionsService(){ + public StaticAuthRequestOptionsService staticAuthRequestOptionsService() { return new StaticAuthRequestOptionsService(); } @Bean - public PlainAuthRequestUrlBuilder plainAuthRequestUrlBuilder(){ + public PlainAuthRequestUrlBuilder plainAuthRequestUrlBuilder() { return new PlainAuthRequestUrlBuilder(); } @Bean - public ServerConfiguration serverConfiguration(){ + public ServerConfiguration serverConfiguration() { ServerConfiguration serverConfiguration = new ServerConfiguration(); serverConfiguration.setIssuer(oidcIssuer); - serverConfiguration.setAuthorizationEndpointUri(oidcIssuer+"authorize"); - serverConfiguration.setTokenEndpointUri(oidcIssuer+"token"); - serverConfiguration.setUserInfoUri(oidcIssuer+"userinfo"); - serverConfiguration.setJwksUri(oidcIssuer+"jwk"); - serverConfiguration.setRevocationEndpointUri(oidcIssuer+"revoke"); + serverConfiguration.setAuthorizationEndpointUri(oidcIssuer + "authorize"); + serverConfiguration.setTokenEndpointUri(oidcIssuer + "token"); + serverConfiguration.setUserInfoUri(oidcIssuer + "userinfo"); + serverConfiguration.setJwksUri(oidcIssuer + "jwk"); + serverConfiguration.setRevocationEndpointUri(oidcIssuer + "revoke"); return serverConfiguration; } @Bean - public LoginUrlAuthenticationEntryPoint authenticationEntryPoint(){ + public LoginUrlAuthenticationEntryPoint authenticationEntryPoint() { return new LoginUrlAuthenticationEntryPoint("/openid_connect_login"); } @@ -170,14 +161,14 @@ public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter { } @Bean - public StaticSingleIssuerService staticSingleIssuerService(){ + public StaticSingleIssuerService staticSingleIssuerService() { StaticSingleIssuerService staticSingleIssuerService = new StaticSingleIssuerService(); staticSingleIssuerService.setIssuer(oidcIssuer); return staticSingleIssuerService; } @Bean(initMethod = "init") - public FrontEndLinkURIAuthenticationSuccessHandler frontEndRedirect(){ + public FrontEndLinkURIAuthenticationSuccessHandler frontEndRedirect() { FrontEndLinkURIAuthenticationSuccessHandler frontEnd = new FrontEndLinkURIAuthenticationSuccessHandler(); frontEnd.setFrontEndURI(webAppFrontEnd); return frontEnd; diff --git a/src/main/java/eu/dnetlib/repo/manager/config/FrontEndLinkURIAuthenticationSuccessHandler.java b/src/main/java/eu/dnetlib/repo/manager/config/FrontEndLinkURIAuthenticationSuccessHandler.java index 27637a4..4adb3f5 100644 --- a/src/main/java/eu/dnetlib/repo/manager/config/FrontEndLinkURIAuthenticationSuccessHandler.java +++ b/src/main/java/eu/dnetlib/repo/manager/config/FrontEndLinkURIAuthenticationSuccessHandler.java @@ -2,11 +2,13 @@ package eu.dnetlib.repo.manager.config; import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import org.apache.log4j.Logger; import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.session.FindByIndexNameSessionRepository; import javax.servlet.ServletException; import javax.servlet.http.Cookie; @@ -14,6 +16,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; +import java.util.Base64; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class FrontEndLinkURIAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @@ -22,7 +28,7 @@ public class FrontEndLinkURIAuthenticationSuccessHandler implements Authenticati private static final Logger LOGGER = Logger .getLogger(FrontEndLinkURIAuthenticationSuccessHandler.class); - public void init(){ + public void init() { LOGGER.debug("Front end uri : " + frontEndURI); } @@ -32,8 +38,9 @@ public class FrontEndLinkURIAuthenticationSuccessHandler implements Authenticati @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { - OIDCAuthenticationToken authOIDC = (OIDCAuthenticationToken) authentication; + request.getSession().setAttribute(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, authOIDC.getUserInfo().getEmail()); + JsonObject userInfo = new JsonObject(); if (authOIDC.getUserInfo().getSub() == null) @@ -42,7 +49,7 @@ public class FrontEndLinkURIAuthenticationSuccessHandler implements Authenticati userInfo.addProperty("sub", URLEncoder.encode(authOIDC.getUserInfo().getSub(), "UTF-8")); - if(authOIDC.getUserInfo().getName() != null) + if (authOIDC.getUserInfo().getName() != null) userInfo.addProperty("fullname", URLEncoder.encode(authOIDC.getUserInfo().getName(), "UTF-8")); if (authOIDC.getUserInfo().getGivenName() == null) @@ -51,34 +58,44 @@ public class FrontEndLinkURIAuthenticationSuccessHandler implements Authenticati userInfo.addProperty("firstname", URLEncoder.encode(authOIDC.getUserInfo().getGivenName(), "UTF-8") + ""); if (authOIDC.getUserInfo().getFamilyName() == null) - userInfo.addProperty("lastname", ""); + userInfo.addProperty("lastname", ""); else userInfo.addProperty("lastname", URLEncoder.encode(authOIDC.getUserInfo().getFamilyName(), "UTF-8") + ""); userInfo.addProperty("email", authOIDC.getUserInfo().getEmail() + ""); if (authOIDC.getUserInfo().getSource().getAsJsonArray("edu_person_entitlements") == null) - userInfo.addProperty("role", ""); + userInfo.addProperty("role", ""); else userInfo.addProperty("role", URLEncoder.encode(authOIDC.getUserInfo() .getSource().getAsJsonArray("edu_person_entitlements").toString(), "UTF-8") + ""); - Cookie openAIREUser = new Cookie("openAIREUser", new Gson().toJson(userInfo) ); - openAIREUser.setMaxAge(14400); - openAIREUser.setPath("/"); - if(aai_mode.equalsIgnoreCase("production") || aai_mode.equalsIgnoreCase("beta")) - openAIREUser .setDomain(".openaire.eu"); -// openAIREUser.setDomain(".athenarc.gr"); - response.addCookie(openAIREUser); - - Cookie accessToken = new Cookie("AccessToken", authOIDC.getAccessTokenValue()); - accessToken.setMaxAge(14400); - if(aai_mode.equalsIgnoreCase("production") || aai_mode.equalsIgnoreCase("beta")) + String regex = "^([A-Za-z0-9-_=]+)\\.([A-Za-z0-9-_=]+)\\.?([A-Za-z0-9-_.+=]*)$"; + Matcher matcher = Pattern.compile(regex).matcher(authOIDC.getAccessTokenValue()); + if (matcher.find()) { + long exp = new JsonParser().parse(new String(Base64.getDecoder().decode(matcher.group(2)))).getAsJsonObject().get("exp").getAsLong(); + accessToken.setMaxAge((int) (exp - (new Date().getTime() / 1000))); + } else { + accessToken.setMaxAge(3600); + } + if (aai_mode.equalsIgnoreCase("production") || aai_mode.equalsIgnoreCase("beta")) accessToken.setDomain(".openaire.eu"); accessToken.setPath("/"); -// accessToken.setDomain(".athenarc.gr"); + + Cookie openAIREUser = new Cookie("openAIREUser", new Gson().toJson(userInfo)); + openAIREUser.setMaxAge(accessToken.getMaxAge()); + openAIREUser.setPath("/"); + if (aai_mode.equalsIgnoreCase("production") || aai_mode.equalsIgnoreCase("beta")) + openAIREUser.setDomain(".openaire.eu"); + +// if (frontDomain!=null) { +// accessToken.setDomain(frontDomain); +// // openAIREUser.setDomain(frontDomain); +// } + + response.addCookie(openAIREUser); response.addCookie(accessToken); response.sendRedirect(frontEndURI); } diff --git a/src/main/java/eu/dnetlib/repo/manager/config/OpenAIREAuthoritiesMapper.java b/src/main/java/eu/dnetlib/repo/manager/config/OpenAIREAuthoritiesMapper.java new file mode 100644 index 0000000..58a2170 --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/config/OpenAIREAuthoritiesMapper.java @@ -0,0 +1,27 @@ +package eu.dnetlib.repo.manager.config; + +import com.google.gson.JsonArray; +import com.nimbusds.jwt.JWT; +import eu.dnetlib.repo.manager.service.security.AuthoritiesMapper; +import org.apache.log4j.Logger; +import org.mitre.openid.connect.client.OIDCAuthoritiesMapper; +import org.mitre.openid.connect.model.UserInfo; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.stereotype.Component; + +import java.util.Collection; + +@ComponentScan +@Component +public class OpenAIREAuthoritiesMapper implements OIDCAuthoritiesMapper { + + private static final Logger logger = Logger.getLogger(OpenAIREAuthoritiesMapper.class); + @Override + public Collection mapAuthorities(JWT jwtToken, UserInfo userInfo) { + logger.info("entitlements" + userInfo.getSource().getAsJsonArray("edu_person_entitlements").size()); + JsonArray entitlements = userInfo.getSource().getAsJsonArray("edu_person_entitlements"); + return AuthoritiesMapper.map(entitlements); + } +} + diff --git a/src/main/java/eu/dnetlib/repo/manager/config/OpenAireProviderAuthoritiesMapper.java b/src/main/java/eu/dnetlib/repo/manager/config/OpenAireProviderAuthoritiesMapper.java deleted file mode 100644 index 16c98cf..0000000 --- a/src/main/java/eu/dnetlib/repo/manager/config/OpenAireProviderAuthoritiesMapper.java +++ /dev/null @@ -1,42 +0,0 @@ -package eu.dnetlib.repo.manager.config; - -import com.nimbusds.jwt.JWT; -import org.mitre.openid.connect.client.OIDCAuthoritiesMapper; -import org.mitre.openid.connect.model.UserInfo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; - -import java.util.*; - -public class OpenAireProviderAuthoritiesMapper implements OIDCAuthoritiesMapper { - - private static Logger logger = LoggerFactory.getLogger(OpenAireProviderAuthoritiesMapper.class); - - final private static String ROLE_CLAIMS = "edu_person_entitlements"; - - private Map userRolesMap; - - OpenAireProviderAuthoritiesMapper(Map userRoles) { - userRolesMap = new HashMap<>(); - userRoles.forEach((openaireRole, appRole) -> userRolesMap.put(openaireRole, new SimpleGrantedAuthority(appRole))); - } - - @Override - public Collection mapAuthorities(JWT idToken, UserInfo userInfo) { - Set out = new HashSet<>(); - out.add(new SimpleGrantedAuthority("ROLE_USER")); - - if(userInfo.getSource().getAsJsonArray(ROLE_CLAIMS) != null) { - userInfo.getSource().getAsJsonArray(ROLE_CLAIMS).forEach(role -> { - SimpleGrantedAuthority authority = userRolesMap.get(role.getAsString()); - if (authority != null) { - logger.debug("Role mapped " + role); - out.add(authority); - } - }); - } - return out; - } -} diff --git a/src/main/java/eu/dnetlib/repo/manager/controllers/AaiUserRoleController.java b/src/main/java/eu/dnetlib/repo/manager/controllers/AaiUserRoleController.java index 84499ea..c446f45 100644 --- a/src/main/java/eu/dnetlib/repo/manager/controllers/AaiUserRoleController.java +++ b/src/main/java/eu/dnetlib/repo/manager/controllers/AaiUserRoleController.java @@ -1,39 +1,43 @@ package eu.dnetlib.repo.manager.controllers; import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import eu.dnetlib.repo.manager.domain.dto.Role; -import eu.dnetlib.repo.manager.service.AaiUserRoleService; -import eu.dnetlib.repo.manager.utils.AuthorizationService; +import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; import eu.dnetlib.repo.manager.utils.JsonUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.util.ArrayList; +import java.util.List; @RestController -@RequestMapping("/aai-user-management") +@RequestMapping(value = "/aai-user-management") +@Api(description = "AAI User Management", value = "aai-user-management") public class AaiUserRoleController { - @Autowired - private AaiUserRoleService calls; - - @Autowired - private JsonUtils jsonUtils; + private final AaiRegistryService aaiRegistryService; // TODO: Antonis K. This should be uncommented // @Autowired // private AuthoritiesUpdater authoritiesUpdater; +// +// @Autowired +// private AuthorizationService authorizationService; @Autowired - private AuthorizationService authorizationService; + AaiUserRoleController(AaiRegistryService aaiRegistryService) { + this.aaiRegistryService = aaiRegistryService; + } private String sendEmail() { OIDCAuthenticationToken authenticationToken = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); @@ -43,38 +47,48 @@ public class AaiUserRoleController { /** * Create a new role with the given name and description. **/ - @Path("/createRole") - @POST - @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.APPLICATION_JSON) + @RequestMapping(method = RequestMethod.GET, path = "/role/id/get") +// @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") // TODO: Perhaps less roles here + public Response getRole(@RequestParam(value = "type", defaultValue = "datasource") String type, @RequestParam("id") String id) { + int roleId = aaiRegistryService.getCouId(type, id); + return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role id is: " + roleId).toString()).type(MediaType.APPLICATION_JSON).build(); + } + + /** + * Create a new role with the given name and description. + **/ + @RequestMapping(method = RequestMethod.POST, path = "/createRole") @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") // TODO: Perhaps less roles here public Response createRole(@RequestBody Role role) { - calls.createRole(role); - return Response.status(HttpStatus.OK.value()).entity(jsonUtils.createResponse("Role has been created").toString()).type(MediaType.APPLICATION_JSON).build(); + aaiRegistryService.createRole(role); + return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been created").toString()).type(MediaType.APPLICATION_JSON).build(); } /** * Subscribe to a type(Community, etc.) with id(ee, egi, etc.) */ - @Path("/subscribe/{type}/{id}") - @POST - @Produces(MediaType.APPLICATION_JSON) - @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") // TODO: Perhaps less roles here - public Response subscribe(@PathParam("type") String type, @PathParam("id") String id) { - Integer coPersonId = calls.getCoPersonIdByIdentifier(); - Integer couId = calls.getCouId(type, id); + @ApiOperation(value = "subscribe") + @RequestMapping(method = RequestMethod.POST, path = "/subscribe/{type}/{id}") + @PreAuthorize("hasAnyAuthority('ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN') or (hasRole(@Converter.convertRepoIdToRoleId(#repository.id)) or hasRole(@Converter.convertRepoIdToRoleId(returnObject.id)))") + // TODO: Perhaps less roles here + public Response subscribe(@PathVariable("type") String type, @PathVariable("id") String id) { + Integer coPersonId = aaiRegistryService.getCoPersonIdByIdentifier(); + if (coPersonId == null) { + coPersonId = aaiRegistryService.getCoPersonIdByEmail(); + } + Integer couId = aaiRegistryService.getCouId(type, id); if (couId != null) { - Integer role = calls.getRoleId(coPersonId, couId); - calls.assignMemberRole(coPersonId, couId, role); + Integer role = aaiRegistryService.getRoleId(coPersonId, couId); + aaiRegistryService.assignMemberRole(coPersonId, couId, role); // TODO: Antonis K. This should be uncommented to make a role DATASOURCE.OP... for every new repo // authoritiesUpdater.update(sendEmail(), old -> { // HashSet authorities = new HashSet<>((Collection) old); // authorities.add(new SimpleGrantedAuthority(authorizationService.member(type, id))); // return authorities; // }); - return Response.status(HttpStatus.OK.value()).entity(jsonUtils.createResponse("Role has been assigned").toString()).type(MediaType.APPLICATION_JSON).build(); + return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been assigned").toString()).type(MediaType.APPLICATION_JSON).build(); } else { - return Response.status(HttpStatus.NOT_FOUND.value()).entity(jsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); + return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); } } @@ -82,98 +96,107 @@ public class AaiUserRoleController { /** * Remove the member role from user with email for a type(Community, etc.) with id(ee, egi, etc.) */ - @Path("/{type}/{id}/member/{email}") - @DELETE - @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.APPLICATION_JSON) + @ApiOperation(value = "Remove role from member") + @RequestMapping(method = RequestMethod.DELETE, path = "/{type}/{id}/member/{email}") @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") // TODO: Perhaps less roles here - public Response removeMemberRole(@PathParam("type") String type, @PathParam("id") String - id, @PathParam("email") String email) { - Integer coPersonId = calls.getCoPersonIdByEmail(email); + public Response removeMemberRole(@PathVariable("type") String type, @PathVariable("id") String + id, @PathVariable("email") String email) { + Integer coPersonId = aaiRegistryService.getCoPersonIdByEmail(email); if (coPersonId != null) { - Integer couId = calls.getCouId(type, id); + Integer couId = aaiRegistryService.getCouId(type, id); Integer role = null; if (couId != null) { - role = calls.getRoleId(coPersonId, couId); + role = aaiRegistryService.getRoleId(coPersonId, couId); } if (couId != null && role != null) { - calls.removeMemberRole(coPersonId, couId, role); + aaiRegistryService.removeMemberRole(coPersonId, couId, role); // TODO: Antonis K. This should be uncommented to make a role DATASOURCE.OP... for every new repo // authoritiesUpdater.update(email, old -> { // HashSet authorities = new HashSet<>((Collection) old); // authorities.remove(new SimpleGrantedAuthority(authorizationService.member(type, id))); // return authorities; // }); - return Response.status(HttpStatus.OK.value()).entity(jsonUtils.createResponse("Role has been removed").toString()).type(MediaType.APPLICATION_JSON).build(); + return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been removed").toString()).type(MediaType.APPLICATION_JSON).build(); } else { - return Response.status(HttpStatus.NOT_FOUND.value()).entity(jsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); + return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); } } else { - return Response.status(HttpStatus.NOT_FOUND.value()).entity(jsonUtils.createResponse("User has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); + return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("User has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); } } - /** - * Get all the users that have the role that is associated with repoId - */ - @Path("/repo/{id}/all-users") - @GET - @Produces(MediaType.APPLICATION_JSON) - @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") // TODO: Perhaps less roles here - public Response getAllUserOfARepo(@PathParam("id") String id) { - - // find roleId by repoId - String roleId = calls.getRoleIdByRepoId(id, "datasource"); - - // find couId by role name - if (roleId != null) { - Integer couId = calls.getCouId("datasource", roleId); - if (couId != null) { - JsonArray users = calls.getUsersByCouId(couId); - return Response.status(HttpStatus.OK.value()).entity(jsonUtils.createResponse(users).toString()).type(MediaType.APPLICATION_JSON).build(); - } else { - return Response.status(HttpStatus.NOT_FOUND.value()).entity(jsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); - } - } - - return Response.status(HttpStatus.NOT_FOUND.value()).entity(jsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); - } - /** * Subscribe to role-repo by his email */ - @Path("/subscribe/repo-role/{id}/email/{email}") - @POST - @Produces(MediaType.APPLICATION_JSON) + @RequestMapping(method = RequestMethod.POST, path = "/subscribe/repo-role/{id}") @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") // TODO: Perhaps less roles here - public Response subscribeRoleByEmail(@PathParam("id") String id, @PathParam("email") String email) { - Integer coPersonId = calls.getCoPersonIdByEmail(email); + public Response subscribeRoleByEmail(@PathVariable("id") String id, @RequestParam("email") String email) { + Integer coPersonId = aaiRegistryService.getCoPersonIdByEmail(email); if (coPersonId != null) { - String roleId = calls.getRoleIdByRepoId(id, "datasource"); - if (roleId != null) { - Integer couId = calls.getCouId("datasource", roleId); - if (couId != null) { - Integer role = calls.getRoleId(coPersonId, couId); - calls.assignMemberRole(coPersonId, couId, role); - // TODO: Antonis K. This should be uncommented to make a role DATASOURCE.OP... for every new repo + Integer couId = aaiRegistryService.getCouId("datasource", id); + if (couId != null) { + Integer role = aaiRegistryService.getRoleId(coPersonId, couId); + aaiRegistryService.assignMemberRole(coPersonId, couId, role); + // TODO: Antonis K. This should be uncommented to make a role DATASOURCE.OP... for every new repo // authoritiesUpdater.update(sendEmail(), old -> { // HashSet authorities = new HashSet<>((Collection) old); // authorities.add(new SimpleGrantedAuthority(authorizationService.member("datasource", id))); // return authorities; // }); - return Response.status(HttpStatus.OK.value()).entity(jsonUtils.createResponse("Role has been assigned").toString()).type(MediaType.APPLICATION_JSON).build(); - } else { - return Response.status(HttpStatus.NOT_FOUND.value()).entity(jsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); - } + return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been assigned").toString()).type(MediaType.APPLICATION_JSON).build(); } else { - return Response.status(HttpStatus.NOT_FOUND.value()).entity(jsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); + return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); } } else { - return Response.status(HttpStatus.NOT_FOUND.value()).entity(jsonUtils.createResponse("User with this email has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); + return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("User with this email has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); } } -} + + /** + * Get all the users that have the role that is associated with repoId + */ + @RequestMapping(method = RequestMethod.GET, path = "/repo/{id}/all-users") + @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") // TODO: Perhaps less roles here + public ResponseEntity> getAllUsersOfARepo(@PathVariable("id") String id) { + + List userList = new ArrayList<>(); + + // find couId by role name + Integer couId = aaiRegistryService.getCouId("datasource", id); + if (couId != null) { + JsonArray users = aaiRegistryService.getUsersByCouId(couId); + for (JsonElement jsonElement : users) { + userList.add(jsonElement.toString()); + } + return ResponseEntity.ok(userList); + } + + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + ///////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////// + + @RequestMapping(method = RequestMethod.GET, path = "/users/couid/{id}") + @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") + public ResponseEntity getUsersByCouId(@PathVariable("id") Integer id) { +// calls.getUserByCoId() + return ResponseEntity.ok(aaiRegistryService.getUsersByCouId(id).toString()); + } + + + @RequestMapping(method = RequestMethod.GET, path = "/user/roles") + @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_ADMIN', 'ROLE_PROVIDE_ADMIN')") + public ResponseEntity> getRolesByEmail(@RequestParam("email") String email) { + int coPersonId = aaiRegistryService.getCoPersonIdByEmail(email); + List list = new ArrayList<>(); + for (JsonElement element : aaiRegistryService.getRoles(coPersonId)) { + list.add(element.toString()); + } + return ResponseEntity.ok(list); + } + +} \ No newline at end of file diff --git a/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java b/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java index b0dff96..ed59db5 100644 --- a/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java +++ b/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java @@ -5,14 +5,12 @@ import eu.dnetlib.domain.data.RepositoryInterface; import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.service.RepositoryServiceImpl; -import eu.dnetlib.repo.manager.utils.Converter; import io.swagger.annotations.Api; import org.apache.log4j.Logger; import org.json.JSONException; import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; -import org.springframework.security.access.prepost.PostAuthorize; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -24,16 +22,14 @@ import java.util.Map; @RestController @RequestMapping(value = "/repository") -@Api(description = "Repository API", tags = {"repository"}) +@Api(description = "Repository API", tags = {"repository"}) public class RepositoryController { - private static Logger logger = Logger.getLogger(RepositoryController.class); + private static final Logger logger = Logger.getLogger(RepositoryController.class); @Autowired private RepositoryServiceImpl repositoryService; -// @Autowired -// private Converter converter; @RequestMapping(value = "/getCountries", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody @@ -46,28 +42,38 @@ public class RepositoryController { @ResponseBody public List getRepositoriesByCountry(@PathVariable("country") String country, @PathVariable("mode") String mode, - @RequestParam(value = "managed",required=false) Boolean managed) throws JSONException, IOException { + @RequestParam(value = "managed", required = false) Boolean managed) throws JSONException, IOException { return repositoryService.getRepositoriesByCountry(country, mode, managed); } - @RequestMapping(value = "/getRepositoriesOfUser/{page}/{size}",method = RequestMethod.GET, + @RequestMapping(value = "/getRepositoriesOfUser/{page}/{size}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody @PreAuthorize("hasRole('ROLE_USER')") - public List getRepositoriesOfUser( - @PathVariable("page") String page, - @PathVariable("size") String size) throws JSONException, IOException { - return repositoryService.getRepositoriesSnippetOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size); + public List getRepositoriesSnippetOfUser( + @PathVariable("page") String page, + @PathVariable("size") String size) throws JSONException, IOException { + return repositoryService.getRepositoriesSnippetOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size); } - @RequestMapping(value = "/searchRegisteredRepositories/{page}/{size}",method = RequestMethod.GET, + @RequestMapping(value = "/user/repositories/{page}/{size}", method = RequestMethod.GET, + produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + @PreAuthorize("hasRole('ROLE_USER')") + public List getRepositoriesOfUser( + @PathVariable("page") String page, + @PathVariable("size") String size) throws JSONException, IOException { + return repositoryService.getRepositoriesOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size); + } + + @RequestMapping(value = "/searchRegisteredRepositories/{page}/{size}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN')") - public List searchRegisteredRepositories(@RequestParam(name="country", required=false) String country, - @RequestParam(name="typology", required=false) String typology, - @RequestParam(name="englishName", required=false) String englishName, - @RequestParam(name="officialName", required=false) String officialName, + public List searchRegisteredRepositories(@RequestParam(name = "country", required = false) String country, + @RequestParam(name = "typology", required = false) String typology, + @RequestParam(name = "englishName", required = false) String englishName, + @RequestParam(name = "officialName", required = false) String officialName, @RequestParam("requestSortBy") String requestSortBy, @RequestParam("order") String order, @PathVariable("page") int page, @@ -81,15 +87,14 @@ public class RepositoryController { @RequestMapping(value = "/getRepositoryById/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody -// @PostAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or ((returnObject.registeredBy=='null' or returnObject.registeredBy==authentication.userInfo.email) and hasRole('ROLE_USER'))") - @PostAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (hasRole(@Converter.convertRepoIdToRoleId(returnObject.id)))") - public Repository getRepositoryById(@PathVariable("id") String id) throws JSONException,ResourceNotFoundException { + @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or @aaiUserRoleService.isMemberOf(#id)") + public Repository getRepositoryById(@PathVariable("id") String id) throws JSONException, ResourceNotFoundException { Repository repo = repositoryService.getRepositoryById(id); - if (repo != null) - logger.info("Returning repository " + repo.getId() + " registered by " + repo.getRegisteredBy()); - else - logger.info("Requested repository " + id + " not found"); + if (repo != null) + logger.info("Returning repository " + repo.getId() + " registered by " + repo.getRegisteredBy()); + else + logger.info("Requested repository " + id + " not found"); return repo; } @@ -97,7 +102,7 @@ public class RepositoryController { produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public List getRepositoryAggregations(@PathVariable("id") String id) throws JSONException { - return repositoryService.getRepositoryAggregations(id,0,20); + return repositoryService.getRepositoryAggregations(id, 0, 20); } @RequestMapping(value = "/getRepositoryAggregationsByYear/{id}", method = RequestMethod.GET, @@ -119,8 +124,7 @@ public class RepositoryController { @RequestMapping(value = "/getRepositoryInterface/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody -// @PostAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or ((@repositoryService.getRepositoryById(#id).registeredBy==authentication.userInfo.email or @repositoryService.getRepositoryById(#id).registeredBy=='null' ) and hasRole('ROLE_USER'))") - @PostAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or hasRole(@Converter.convertRepoIdToRoleId(@RepositoryService.getRepositoryById(#id).id))") + @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or @aaiUserRoleService.isMemberOf(#id)") public List getRepositoryInterface(@PathVariable("id") String id) throws JSONException { return repositoryService.getRepositoryInterface(id); } @@ -128,53 +132,58 @@ public class RepositoryController { @RequestMapping(value = "/addRepository", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (hasRole(@Converter.convertRepoIdToRoleId(#repository.id)) or hasRole(@Converter.convertRepoIdToRoleId(returnObject.id)))") +// @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (hasRole(@aaiUserRoleService.convertRepoIdToRoleId(#repository.id)) or hasRole(@aaiUserRoleService.convertRepoIdToRoleId(returnObject.id)))") + @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or hasRole('ROLE_USER')") public Repository addRepository(@RequestParam("datatype") String datatype, @RequestBody Repository repository) throws Exception { + // TODO: + // 1) add repository + // 2) get repository id and create new role + // 3) assign new role to authenticated user return repositoryService.addRepository(datatype, repository); } @RequestMapping(value = "/getDnetCountries", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public List getDnetCountries(){ + public List getDnetCountries() { return repositoryService.getDnetCountries(); } @RequestMapping(value = "/getTypologies", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public List getTypologies(){ + public List getTypologies() { return repositoryService.getTypologies(); } @RequestMapping(value = "/getTimezones", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public List getTimezones(){ + public List getTimezones() { return repositoryService.getTimezones(); } @RequestMapping(value = "/updateRepository", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (hasRole(@Converter.convertRepoIdToRoleId(#repository.id)) or hasRole(@Converter.convertRepoIdToRoleId(returnObject.id)))") - public Repository updateRepository(@RequestBody Repository repository,Authentication authentication) throws Exception { + @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or @aaiUserRoleService.isMemberOf(#repository.id)") + public Repository updateRepository(@RequestBody Repository repository, Authentication authentication) throws Exception { return repositoryService.updateRepository(repository, authentication); } @RequestMapping(value = "/deleteInterface/", method = RequestMethod.DELETE) - @PreAuthorize("hasRole('ROLE_USER') and #registeredBy == authentication.userInfo.email") - public void deleteRepositoryInterface(@RequestParam("id") String id , - @RequestParam("registeredBy") String registeredBy){ + @PreAuthorize("@aaiUserRoleService.isMemberOf(#id)") + public void deleteRepositoryInterface(@RequestParam("id") String id, + @RequestParam("registeredBy") String registeredBy) { repositoryService.deleteRepositoryInterface(id, registeredBy); } @RequestMapping(value = "/addInterface", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (hasRole(@Converter.convertRepoIdToRoleId(@RepositoryService.getRepositoryById(#repoId).id)))") + @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or @aaiUserRoleService.isMemberOf(#repoId)") public RepositoryInterface addRepositoryInterface(@RequestParam("datatype") String datatype, @RequestParam("repoId") String repoId, @RequestParam("registeredBy") String registeredBy, @@ -183,56 +192,54 @@ public class RepositoryController { return repositoryService.addRepositoryInterface(datatype, repoId, registeredBy, comment, repositoryInterface); } - @RequestMapping(value = "/getUrlsOfUserRepos/{page}/{size}/",method = RequestMethod.GET, + @RequestMapping(value = "/getUrlsOfUserRepos/{page}/{size}/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody @PreAuthorize("hasRole('ROLE_USER')") - public List getUrlsOfUserRepos( - @PathVariable("page") String page, - @PathVariable("size") String size) throws JSONException { + public List getUrlsOfUserRepos(@PathVariable("page") String page, @PathVariable("size") String size) { return repositoryService.getUrlsOfUserRepos(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size); } - @RequestMapping(value = "/getDatasourceVocabularies/{mode}",method = RequestMethod.GET, + @RequestMapping(value = "/getDatasourceVocabularies/{mode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public List getDatasourceVocabularies(@PathVariable("mode") String mode) { - return repositoryService.getDatasourceVocabularies(mode); + return repositoryService.getDatasourceVocabularies(mode); } - @RequestMapping(value = "/getCompatibilityClasses/{mode}",method = RequestMethod.GET, + @RequestMapping(value = "/getCompatibilityClasses/{mode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public Map getCompatibilityClasses(@PathVariable("mode") String mode) { + public Map getCompatibilityClasses(@PathVariable("mode") String mode) { return repositoryService.getCompatibilityClasses(mode); } - @RequestMapping(value = "/getDatasourceClasses/{mode}",method = RequestMethod.GET, + @RequestMapping(value = "/getDatasourceClasses/{mode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public Map getDatasourceClasses(@PathVariable("mode") String mode) { - return repositoryService.getDatasourceClasses(mode); + public Map getDatasourceClasses(@PathVariable("mode") String mode) { + return repositoryService.getDatasourceClasses(mode); } - @RequestMapping(value = "/getMetricsInfoForRepository/{repoId}",method = RequestMethod.GET, + @RequestMapping(value = "/getMetricsInfoForRepository/{repoId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public MetricsInfo getMetricsInfoForRepository(@PathVariable("repoId") String repoId) throws RepositoryServiceException { + public MetricsInfo getMetricsInfoForRepository(@PathVariable("repoId") String repoId) throws RepositoryServiceException { return repositoryService.getMetricsInfoForRepository(repoId); } - @RequestMapping(value = "/getListLatestUpdate/{mode}",method = RequestMethod.GET, + @RequestMapping(value = "/getListLatestUpdate/{mode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public Map getListLatestUpdate(@PathVariable("mode") String mode) throws JSONException { + public Map getListLatestUpdate(@PathVariable("mode") String mode) throws JSONException { return repositoryService.getListLatestUpdate(mode); } @RequestMapping(value = "/updateRepositoryInterface", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or hasRole(@Converter.convertRepoIdToRoleId(@RepositoryService.getRepositoryById(#repoId).id))") + @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or @aaiUserRoleService.isMemberOf(#repoId)") public RepositoryInterface updateRepositoryInterface(@RequestParam("repoId") String repoId, @RequestParam("registeredBy") String registeredBy, @RequestParam(value = "comment", required = false) String comment, diff --git a/src/main/java/eu/dnetlib/repo/manager/service/AaiUserRoleService.java b/src/main/java/eu/dnetlib/repo/manager/service/AaiUserRoleService.java deleted file mode 100644 index 27ee3b3..0000000 --- a/src/main/java/eu/dnetlib/repo/manager/service/AaiUserRoleService.java +++ /dev/null @@ -1,79 +0,0 @@ -package eu.dnetlib.repo.manager.service; - -import com.google.gson.JsonArray; -import eu.dnetlib.repo.manager.domain.dto.Role; - -public interface AaiUserRoleService { - - /** - * 1. Get CoPersonId by Email - */ - Integer getCoPersonIdByEmail(String email); - - Integer getCoPersonIdByIdentifier(); - - - /** - * 3. Get all OpenAIRE cous - */ - JsonArray getCous(); - - /** - * 4. Get a couId by type.id - * - * @param type - * @param id - * @return - */ - Integer getCouId(String type, String id); - - /** - * 5. Get User non admin roles - */ - JsonArray getRoles(Integer coPersonId); - - /** - * 6. Get Role id of User base on couId. - */ - Integer getRoleId(Integer coPersonId, Integer couId); - - /** - * 16. Create a new role - */ - void createRole(Role role); - - /** - * 14. Assign a member role to a User - */ - void assignMemberRole(Integer coPersonId, Integer couId, Integer id); - - /** - * 15. Remove a member role from a User - */ - void removeMemberRole(Integer coPersonId, Integer couId, Integer id); - - - /** - * Util function to remove the datasource prefix in role Id - * @param fullName - * @param prefix - * @return - */ - String getRepoNameWithoutType(String fullName, String prefix); - - /** - * Util function to transform repoId name to roleId name - * @param repoId - * @param prefix - * @return - */ - String getRoleIdByRepoId(String repoId, String prefix); - - /** - * 12. Get All Users that have a specific role - * @param couId - * @return - */ - JsonArray getUsersByCouId(Integer couId); - -} diff --git a/src/main/java/eu/dnetlib/repo/manager/service/AaiUserRoleServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/AaiUserRoleServiceImpl.java deleted file mode 100644 index b925ed7..0000000 --- a/src/main/java/eu/dnetlib/repo/manager/service/AaiUserRoleServiceImpl.java +++ /dev/null @@ -1,225 +0,0 @@ -package eu.dnetlib.repo.manager.service; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import eu.dnetlib.repo.manager.domain.dto.Role; -import eu.dnetlib.repo.manager.utils.HttpUtils; -import eu.dnetlib.repo.manager.utils.JsonUtils; -import org.apache.log4j.Logger; -import org.mitre.openid.connect.model.OIDCAuthenticationToken; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service -public class AaiUserRoleServiceImpl implements AaiUserRoleService { - - private static final Logger logger = Logger.getLogger(AaiUserRoleServiceImpl.class); - - @Value("2") - private String coid; - - @Autowired - public HttpUtils httpUtils; - - @Autowired - public JsonUtils jsonUtils; - - private String mapType(String type) { - if(type.equals("datasource")) { - type = "datasource"; - } - return type; - } - - public String getRepoNameWithoutType(String fullName, String prefix) { - if ( fullName != null && prefix != null && fullName.startsWith(prefix) ) { - return fullName.substring(prefix.length()); - } - return null; - } - - public String getRoleIdByRepoId(String repoId, String prefix) { - String roleId = ""; - if ( repoId != null && prefix != null ) { - roleId = prefix + "." + repoId.replaceAll(":", "$"); - return roleId; - } else { - return null; - } - - } - - /** - * 1. Get CoPersonId by Email - * @param email - * @return - */ - public Integer getCoPersonIdByEmail(String email) { - Map params = new HashMap<>(); - params.put("coid", coid); - params.put("mail", email); - JsonElement response = httpUtils.get("co_people.json", params); - if(response != null) { - JsonArray coPeople = response.getAsJsonObject().get("CoPeople").getAsJsonArray(); - if(coPeople.size() > 0) { - return coPeople.get(0).getAsJsonObject().get("Id").getAsInt(); - } - } - return null; - } - - /** - * 2. Get CoPersonId by AAI identifier - */ - public Integer getCoPersonIdByIdentifier() { - try { - OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); - String sub = authentication.getUserInfo().getSub(); - Map params = new HashMap<>(); - params.put("coid", coid); - params.put("search.identifier", sub); - JsonElement response = httpUtils.get("co_people.json", params); - return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null; - } catch (Exception e) { - logger.error("Get User info: An error occurred ", e); - return null; - } - } - - /** - * 3. Get all OpenAIRE cous - */ - public JsonArray getCous() { - Map params = new HashMap<>(); - params.put("coid", coid); - JsonElement response = httpUtils.get("cous.json", params); - return (response != null) ? response.getAsJsonObject().get("Cous").getAsJsonArray() : new JsonArray(); - } - - /** - * 4. Get a couId by type.id - * - * @param type - * @param id It is the datasourceId (e.g openaire____$$45e3c7b69bcee6cc5fa945c9e183deb9) - * @return - */ - public Integer getCouId(String type, String id) { - JsonArray cous = getCous(); - Integer couId = null; - for (JsonElement cou : cous) { - if (cou.getAsJsonObject().get("Name").getAsString().equals(mapType(type) + "." + id)) { - couId = cou.getAsJsonObject().get("Id").getAsInt(); - } - } - return couId; - } - - /** - * 5. Get User non admin roles - * @param coPersonId - * @return - */ - public JsonArray getRoles(Integer coPersonId) { - Map params = new HashMap<>(); - params.put("copersonid", coPersonId.toString()); - JsonElement response = httpUtils.get("co_person_roles.json", params); - return (response != null) ? response.getAsJsonObject().get("CoPersonRoles").getAsJsonArray() : new JsonArray(); - } - - /** - * 6. Get Role id of User base on couId. - * @param coPersonId - * @param couId - * @return - */ - public Integer getRoleId(Integer coPersonId, Integer couId) { - JsonArray roles = getRoles(coPersonId); - for (JsonElement role : roles) { - JsonObject object = role.getAsJsonObject(); - if (object.get("CouId").getAsInt() == couId && !object.get("Status").getAsString().equals("Deleted")) { - return object.get("Id").getAsInt(); - } - } - return null; - } - - /** - * 16. Create a new role - * @param role - */ - public void createRole(Role role) { - httpUtils.post("cous.json", jsonUtils.createNewCou(role)); - } - - /** - * 14. Assign a member role to a User - * @param coPersonId The id of a person in OpenAIRE - * @param couId The id of a role in OpenAIRE (result of getCouId) - * @param id The id that is returned from getRoleId (role's id) - */ - public void assignMemberRole(Integer coPersonId, Integer couId, Integer id) { - if (id != null) { - httpUtils.put("co_person_roles/" + id.toString() + ".json", jsonUtils.coPersonRoles(coPersonId, couId, "Active")); - } else { - httpUtils.post("co_person_roles.json", jsonUtils.coPersonRoles(coPersonId, couId, "Active")); - } - } - - /** - * 15. Remove a member role from a User - * @param coPersonId The id of a person in OpenAIRE - * @param couId The id of a role in OpenAIRE (result of getCouId) - * @param id The id that is returned from getRoleId (role's id) - */ - public void removeMemberRole(Integer coPersonId, Integer couId, Integer id) { - httpUtils.put("co_person_roles/" + id.toString() + ".json", jsonUtils.coPersonRoles(coPersonId, couId, "Deleted")); - } - - /** - * 12. Get All Users that have a specific role - */ - public JsonArray getUsersByCouId(Integer couId) { - Map params = new HashMap<>(); - params.put("couid", couId.toString()); - JsonElement response = httpUtils.get("co_person_roles.json", params); - JsonArray infos = (response != null) ? response.getAsJsonObject().get("CoPersonRoles").getAsJsonArray() : new JsonArray(); -// JsonArray users = new JsonArray(); -// infos.forEach(info -> { -// JsonObject user = new JsonObject(); -// user.addProperty("email", info.getAsJsonObject().get("Mail").getAsString()); -// user.addProperty("memberSince", info.getAsJsonObject().get("Created").getAsString()); -// emails.add(user); -// }); - return infos; - } - - /** - * 9. Get Groups of a Cou - */ - public JsonArray getCouGroups(Integer couId) { - Map params = new HashMap<>(); - params.put("coid", coid); - params.put("couid", couId.toString()); - JsonElement response = httpUtils.get("co_groups.json", params); - return (response != null) ? response.getAsJsonObject().get("CoGroups").getAsJsonArray() : new JsonArray(); - } - - /** - * 10. Get Admin Group of a Cou - */ - public JsonObject getCouAdminGroup(Integer couId) { - JsonArray groups = getCouGroups(couId); - for (JsonElement group : groups) { - if (group.getAsJsonObject().get("Name").getAsString().contains("admins")) { - return group.getAsJsonObject(); - } - } - return null; - } -} diff --git a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java index 208f897..f9ffb71 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java @@ -12,7 +12,8 @@ import eu.dnetlib.domain.functionality.validator.JobForValidation; import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; -import eu.dnetlib.repo.manager.utils.AuthorizationService; +import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; +import eu.dnetlib.repo.manager.service.security.AuthorizationService; import eu.dnetlib.repo.manager.utils.Converter; import gr.uoa.di.driver.enabling.vocabulary.VocabularyLoader; import org.apache.commons.codec.digest.DigestUtils; @@ -27,7 +28,6 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.security.core.Authentication; -import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.web.client.RestClientException; @@ -36,7 +36,6 @@ import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; import javax.annotation.PostConstruct; -import javax.ws.rs.core.Response; import java.io.IOException; import java.sql.Timestamp; import java.util.*; @@ -80,7 +79,7 @@ public class RepositoryServiceImpl implements RepositoryService { ValidatorService validatorService; @Autowired - private AaiUserRoleService calls; + private AaiRegistryService registryCalls; // TODO: Antonis K. This should be uncommented // @Autowired @@ -95,9 +94,9 @@ public class RepositoryServiceImpl implements RepositoryService { private Map countriesMap = new HashMap<>(); private Map inverseCountriesMap = new HashMap<>(); - private static Map> dataSourceClass = new HashMap<>(); + private static Map> dataSourceClass = new HashMap<>(); - private static Map invertedDataSourceClass = new HashMap<>(); + private static Map invertedDataSourceClass = new HashMap<>(); private String sendEmail() { OIDCAuthenticationToken authenticationToken = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); @@ -105,27 +104,26 @@ public class RepositoryServiceImpl implements RepositoryService { } - @PostConstruct private void init() { LOGGER.debug("Initialization method of repository api!"); LOGGER.debug("Updated version!"); - dataSourceClass.put("opendoar",Arrays.asList("pubsrepository::institutional","pubsrepository::thematic","pubsrepository::unknown","pubsrepository::mock")); + dataSourceClass.put("opendoar", Arrays.asList("pubsrepository::institutional", "pubsrepository::thematic", "pubsrepository::unknown", "pubsrepository::mock")); dataSourceClass.put("re3data", Collections.singletonList("datarepository::unknown")); dataSourceClass.put("journal", Collections.singletonList("pubsrepository::journal")); - dataSourceClass.put("aggregator",Arrays.asList("aggregator::pubsrepository::institutional","aggregator::pubsrepository::journals","aggregator::datarepository", "aggregator::pubsrepository::unknown")); + dataSourceClass.put("aggregator", Arrays.asList("aggregator::pubsrepository::institutional", "aggregator::pubsrepository::journals", "aggregator::datarepository", "aggregator::pubsrepository::unknown")); - invertedDataSourceClass.put("pubsrepository::institutional","opendoar"); - invertedDataSourceClass.put("pubsrepository::thematic","opendoar"); - invertedDataSourceClass.put("pubsrepository::unknown","opendoar"); - invertedDataSourceClass.put("pubsrepository::mock","opendoar"); - invertedDataSourceClass.put("datarepository::unknown","re3data"); - invertedDataSourceClass.put("pubsrepository::journal","journal"); - invertedDataSourceClass.put("aggregator::pubsrepository::institutional","aggregator"); - invertedDataSourceClass.put("aggregator::pubsrepository::journals","aggregator"); - invertedDataSourceClass.put("aggregator::datarepository","aggregator"); - invertedDataSourceClass.put("aggregator::pubsrepository::unknown","aggregator"); + invertedDataSourceClass.put("pubsrepository::institutional", "opendoar"); + invertedDataSourceClass.put("pubsrepository::thematic", "opendoar"); + invertedDataSourceClass.put("pubsrepository::unknown", "opendoar"); + invertedDataSourceClass.put("pubsrepository::mock", "opendoar"); + invertedDataSourceClass.put("datarepository::unknown", "re3data"); + invertedDataSourceClass.put("pubsrepository::journal", "journal"); + invertedDataSourceClass.put("aggregator::pubsrepository::institutional", "aggregator"); + invertedDataSourceClass.put("aggregator::pubsrepository::journals", "aggregator"); + invertedDataSourceClass.put("aggregator::datarepository", "aggregator"); + invertedDataSourceClass.put("aggregator::pubsrepository::unknown", "aggregator"); httpHeaders = new HttpHeaders(); @@ -174,32 +172,32 @@ public class RepositoryServiceImpl implements RepositoryService { LOGGER.debug("Country code equals : " + country); LOGGER.debug("Filter mode equals : " + filterKey); - UriComponents uriComponents = searchSnipperDatasource(String.valueOf(page),String.valueOf(size)); + UriComponents uriComponents = searchSnipperDatasource(String.valueOf(page), String.valueOf(size)); RequestFilter requestFilter = new RequestFilter(); requestFilter.setCountry(country); requestFilter.setCollectedfrom(filterKey); - try{ - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + try { + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); - while (jsonArray.length() > 0 ) { + while (jsonArray.length() > 0) { resultSet.addAll(mapper.readValue(String.valueOf(jsonArray), mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); page += 1; - uriComponents = searchSnipperDatasource(String.valueOf(page),String.valueOf(size)); - rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + uriComponents = searchSnipperDatasource(String.valueOf(page), String.valueOf(size)); + rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); } return resultSet; - }catch (Exception e){ - LOGGER.debug("Exception on getRepositoriesByCountry" , e); + } catch (Exception e) { + LOGGER.debug("Exception on getRepositoriesByCountry", e); // emailUtils.reportException(e); throw e; } } public List searchRegisteredRepositories(String country, String typology, String englishName, - String officialName, String requestSortBy, String order, int page, int pageSize) throws Exception { + String officialName, String requestSortBy, String order, int page, int pageSize) throws Exception { LOGGER.debug("Searching registered repositories"); @@ -215,14 +213,14 @@ public class RepositoryServiceImpl implements RepositoryService { requestFilter.setEnglishname(englishName); try { - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); - resultSet.addAll(mapper.readValue(String.valueOf(jsonArray), mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); + resultSet.addAll(mapper.readValue(String.valueOf(jsonArray), mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); - return resultSet; - }catch (Exception e){ - LOGGER.error("Error searching registered datasources" , e); + return resultSet; + } catch (Exception e) { + LOGGER.error("Error searching registered datasources", e); throw e; } } @@ -230,9 +228,9 @@ public class RepositoryServiceImpl implements RepositoryService { private Repository updateRepositoryInfo(Repository r) throws JSONException { /* - * from datasource class - * we get the datasource type form the inverted map - * */ + * from datasource class + * we get the datasource type form the inverted map + * */ r.setDatasourceType(getRepositoryType(r.getDatasourceClass())); r.setInterfaces(this.getRepositoryInterface(r.getId())); r.setPiwikInfo(piWikService.getPiwikSiteForRepo(r.getId())); @@ -257,68 +255,60 @@ public class RepositoryServiceImpl implements RepositoryService { String page, String size) throws JSONException { - LOGGER.debug("Retreiving repositories of user : " + userEmail ); - UriComponents uriComponents = searchDatasource(page,size); + LOGGER.debug("Retreiving repositories of user : " + userEmail); + UriComponents uriComponents = searchDatasource(page, size); RequestFilter requestFilter = new RequestFilter(); - requestFilter.setRegisteredby(userEmail); +// requestFilter.setRegisteredby(userEmail); - try{ - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + List repoIds = getRepoIdsFromUserRoles(userEmail); + List repos = new ArrayList<>(); - List repos = Converter.jsonToRepositoryList(new JSONObject(rs)); - for (Repository r : repos) - r.setPiwikInfo(piWikService.getPiwikSiteForRepo(r.getId())); - return repos; - }catch (Exception e){ - LOGGER.debug("Exception on getRepositoriesOfUser" , e); + try { + for (String repoId : repoIds) { + requestFilter.setId(repoId); + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); + + repos.addAll(Converter.jsonToRepositoryList(new JSONObject(rs))); + } + } catch (Exception e) { + LOGGER.debug("Exception on getRepositoriesOfUser", e); emailUtils.reportException(e); throw e; } + + for (Repository r : repos) + r.setPiwikInfo(piWikService.getPiwikSiteForRepo(r.getId())); + return repos; } @Override public List getRepositoriesSnippetOfUser(String userEmail, String page, String size) throws IOException, JSONException { - // TODO: Antonis K. - Change the below content. get repos of User by his roles - // TODO: Step 1 - Get all roles (cous) of the user - // TODO: From the result replace $$ with :: - // TODO: Step 2 - For each role call getRepositoryById to get the repositoryId // TODO: Step 3 - For each repo from the previous step call findByRepositoryId piwik_site to get the full info of repo - Integer coPersonId = calls.getCoPersonIdByEmail(userEmail); - JsonArray roles; - ArrayList rolesId = new ArrayList<>(); - if (coPersonId != null ) { - roles = calls.getRoles(coPersonId); - for (JsonElement role : roles) { - JsonObject object = role.getAsJsonObject(); - String roleStr = object.get("Name").getAsString().replaceAll(":", "$"); - String repoBareId = calls.getRepoNameWithoutType(roleStr, "datasource."); - rolesId.add(roleStr); - } - } + List repoIds = getRepoIdsFromUserRoles(userEmail); List resultSet = new ArrayList<>(); ObjectMapper mapper = new ObjectMapper(); // here page should be 0 - UriComponents uriComponents = searchSnipperDatasource(page,size); + UriComponents uriComponents = searchSnipperDatasource(page, size); RequestFilter requestFilter = new RequestFilter(); - for ( int i = 0; i < rolesId.size(); i++ ) { - if ( rolesId.get(i) != "ROLE_ADMIN" && rolesId.get(i) != "ROLE_PROVIDE_ADMIN" && rolesId.get(i) != "ROLE_USER" ) - requestFilter.setId(rolesId.get(i)); + try { + for (String repoId : repoIds) { + requestFilter.setId(repoId); - try{ - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); resultSet.addAll(mapper.readValue(String.valueOf(jsonArray), mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); - }catch (Exception e){ - LOGGER.debug("Exception on getRepositoriesByCountry" , e); - throw e; } + } catch (Exception e) { + LOGGER.debug("Exception on getRepositoriesSnippetOfUser", e); + throw e; } - System.out.println("resultSet:" + resultSet); + + LOGGER.debug("resultSet:" + resultSet); resultSet.parallelStream().forEach(repositorySnippet -> { repositorySnippet.setPiwikInfo(piWikService.getPiwikSiteForRepo(repositorySnippet.getId())); }); @@ -326,25 +316,25 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public RepositorySnippet getRepositorySnippetById(String id) throws JSONException,ResourceNotFoundException { + public RepositorySnippet getRepositorySnippetById(String id) throws JSONException, ResourceNotFoundException { - LOGGER.debug("Retreiving repositories with id : " + id ); + LOGGER.debug("Retreiving repositories with id : " + id); RepositorySnippet repo = null; - UriComponents uriComponents = searchSnipperDatasource("0","100"); + UriComponents uriComponents = searchSnipperDatasource("0", "100"); RequestFilter requestFilter = new RequestFilter(); requestFilter.setId(id); - try{ - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + try { + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); - if(jsonArray.length() == 0) + if (jsonArray.length() == 0) throw new ResourceNotFoundException(); repo = Converter.jsonToRepositorySnippetObject(jsonArray.getJSONObject(0)); return repo; - }catch (JSONException e){ - LOGGER.debug("Exception on getRepositoryById" , e); + } catch (JSONException e) { + LOGGER.debug("Exception on getRepositoryById", e); emailUtils.reportException(e); throw e; } @@ -352,25 +342,25 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public Repository getRepositoryById(String id) throws JSONException,ResourceNotFoundException { + public Repository getRepositoryById(String id) throws JSONException, ResourceNotFoundException { - LOGGER.debug("Retreiving repositories with id : " + id ); + LOGGER.debug("Retreiving repositories with id : " + id); Repository repo = null; - UriComponents uriComponents = searchDatasource("0","100"); + UriComponents uriComponents = searchDatasource("0", "100"); RequestFilter requestFilter = new RequestFilter(); requestFilter.setId(id); - try{ - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + try { + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); - if(jsonArray.length() == 0) + if (jsonArray.length() == 0) throw new ResourceNotFoundException(); repo = Converter.jsonToRepositoryObject(jsonArray.getJSONObject(0)); return updateRepositoryInfo(repo); - }catch (JSONException e){ - LOGGER.debug("Exception on getRepositoryById" , e); + } catch (JSONException e) { + LOGGER.debug("Exception on getRepositoryById", e); emailUtils.reportException(e); throw e; } @@ -381,8 +371,8 @@ public class RepositoryServiceImpl implements RepositoryService { @Override public List getRepositoryAggregations(String id, int from, int size) throws JSONException { - LOGGER.debug("Retreiving aggregations for repository with id : " + id ); - UriComponents uriComponents = searchDatasource(from+"",size+""); + LOGGER.debug("Retreiving aggregations for repository with id : " + id); + UriComponents uriComponents = searchDatasource(from + "", size + ""); RequestFilter requestFilter = new RequestFilter(); requestFilter.setId(id); @@ -390,26 +380,26 @@ public class RepositoryServiceImpl implements RepositoryService { try { long start = System.currentTimeMillis(); - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); long end = System.currentTimeMillis(); - System.out.println("Aggregations request through rest template took " + (end-start)+"ms"); + System.out.println("Aggregations request through rest template took " + (end - start) + "ms"); JSONObject repository = new JSONObject(rs); - if(repository.getJSONArray("datasourceInfo").length() == 0) + if (repository.getJSONArray("datasourceInfo").length() == 0) return aggregationHistory; start = System.currentTimeMillis(); aggregationHistory.addAll(Converter.getAggregationHistoryFromJson(repository.getJSONArray("datasourceInfo").getJSONObject(0))); end = System.currentTimeMillis(); - System.out.println("Getting aggregations history from json " + (end-start)+"ms"); - return aggregationHistory.size() == 0? aggregationHistory : aggregationHistory.stream() - .sorted(Comparator.comparing(AggregationDetails::getDate).reversed()) - .limit(size) - .collect(Collectors.toList()); + System.out.println("Getting aggregations history from json " + (end - start) + "ms"); + return aggregationHistory.size() == 0 ? aggregationHistory : aggregationHistory.stream() + .sorted(Comparator.comparing(AggregationDetails::getDate).reversed()) + .limit(size) + .collect(Collectors.toList()); } catch (JSONException e) { - LOGGER.debug("Exception on getRepositoryAggregations" , e); + LOGGER.debug("Exception on getRepositoryAggregations", e); emailUtils.reportException(e); throw e; } @@ -418,38 +408,38 @@ public class RepositoryServiceImpl implements RepositoryService { @Override public Map> getRepositoryAggregationsByYear(String id) throws JSONException { - LOGGER.debug("Retreiving aggregations (by year) for repository with id : " + id ); - UriComponents uriComponents = searchDatasource("0","100"); + LOGGER.debug("Retreiving aggregations (by year) for repository with id : " + id); + UriComponents uriComponents = searchDatasource("0", "100"); RequestFilter requestFilter = new RequestFilter(); requestFilter.setId(id); List aggregationHistory = new ArrayList<>(); Map> aggregationByYear = new HashMap<>(); try { - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); JSONObject repository = new JSONObject(rs); - if(repository.getJSONArray("datasourceInfo").length() == 0) + if (repository.getJSONArray("datasourceInfo").length() == 0) return aggregationByYear; aggregationHistory.addAll(Converter.getAggregationHistoryFromJson(repository.getJSONArray("datasourceInfo").getJSONObject(0))); - return aggregationHistory.size() == 0? aggregationByYear:createYearMap(aggregationHistory); + return aggregationHistory.size() == 0 ? aggregationByYear : createYearMap(aggregationHistory); } catch (JSONException e) { - LOGGER.debug("Exception on getRepositoryAggregations" , e); + LOGGER.debug("Exception on getRepositoryAggregations", e); emailUtils.reportException(e); throw e; } } - private Map> createYearMap(List aggregationHistory) { + private Map> createYearMap(List aggregationHistory) { Map> aggregationByYear; aggregationHistory = aggregationHistory.stream() - .sorted(Comparator.comparing(AggregationDetails::getDate).reversed()) - .collect(Collectors.toList()); + .sorted(Comparator.comparing(AggregationDetails::getDate).reversed()) + .collect(Collectors.toList()); - return aggregationHistory.stream() - .collect(Collectors.groupingBy(AggregationDetails::getYear)); + return aggregationHistory.stream() + .collect(Collectors.groupingBy(AggregationDetails::getYear)); } @@ -458,19 +448,19 @@ public class RepositoryServiceImpl implements RepositoryService { String page, String size) throws JSONException { - LOGGER.debug("Retreiving repositories with official name : " + name ); - UriComponents uriComponents = searchDatasource("0","100"); + LOGGER.debug("Retreiving repositories with official name : " + name); + UriComponents uriComponents = searchDatasource("0", "100"); RequestFilter requestFilter = new RequestFilter(); requestFilter.setOfficialname(name); - try{ - String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class); + try { + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); List repos = Converter.jsonToRepositoryList(new JSONObject(rs)); for (Repository r : repos) updateRepositoryInfo(r); return repos; - }catch (Exception e){ - LOGGER.debug("Exception on getRepositoriesByName" , e); + } catch (Exception e) { + LOGGER.debug("Exception on getRepositoriesByName", e); emailUtils.reportException(e); throw e; } @@ -485,11 +475,11 @@ public class RepositoryServiceImpl implements RepositoryService { .path("/{id}") .build().expand(id).encode(); - try{ + try { String rs = restTemplate.getForObject(uriComponents.toUri(), String.class); return Converter.jsonToRepositoryInterfaceList(new JSONObject(rs)); - }catch (Exception e ){ - LOGGER.debug("Exception on getRepositoryInterface" , e); + } catch (Exception e) { + LOGGER.debug("Exception on getRepositoryInterface", e); emailUtils.reportException(e); throw e; } @@ -510,11 +500,11 @@ public class RepositoryServiceImpl implements RepositoryService { repository.setId("openaire____::issn" + repository.getIssn()); repository.setNamespacePrefix("issn" + repository.getIssn()); this.storeRepository(repository, SecurityContextHolder.getContext().getAuthentication()); - }else if (datatype.equals("aggregator")) { + } else if (datatype.equals("aggregator")) { repository.setId("openaire____::" + com.unboundid.util.Base64.encode(repository.getOfficialName())); - repository.setNamespacePrefix(DigestUtils.md5Hex(repository.getOfficialName()).substring(0,12)); + repository.setNamespacePrefix(DigestUtils.md5Hex(repository.getOfficialName()).substring(0, 12)); this.storeRepository(repository, SecurityContextHolder.getContext().getAuthentication()); - }else { + } else { this.latentUpdate(repository, SecurityContextHolder.getContext().getAuthentication()); } @@ -524,19 +514,19 @@ public class RepositoryServiceImpl implements RepositoryService { String newRoleDescr = repository.getId().replaceAll(":", "\\$"); Role newRole = new Role(newRoleName, newRoleDescr); try { - calls.createRole(newRole); + registryCalls.createRole(newRole); } catch (Exception e) { - LOGGER.debug("Exception on create role during add repository" , e); + LOGGER.debug("Exception on create role during add repository", e); throw e; } // Assign new role to the user that created it - Integer coPersonId = calls.getCoPersonIdByIdentifier(); - Integer couId = calls.getCouId("datasource", newRoleName); + Integer coPersonId = registryCalls.getCoPersonIdByIdentifier(); + Integer couId = registryCalls.getCouId("datasource", newRoleName); if (couId != null) { - Integer role = calls.getRoleId(coPersonId, couId); - try{ - calls.assignMemberRole(coPersonId, couId, role); + Integer role = registryCalls.getRoleId(coPersonId, couId); + try { + registryCalls.assignMemberRole(coPersonId, couId, role); // TODO: Antonis K. This should be uncommented to make a role DATASOURCE.OP... for every new repo // authoritiesUpdater.update(sendEmail(), old -> { // HashSet authorities = new HashSet<>((Collection) old); @@ -544,7 +534,7 @@ public class RepositoryServiceImpl implements RepositoryService { // return authorities; // }); } catch (Exception e) { - LOGGER.debug("Exception on assign role to user during add repository" , e); + LOGGER.debug("Exception on assign role to user during add repository", e); throw e; } @@ -566,7 +556,7 @@ public class RepositoryServiceImpl implements RepositoryService { LOGGER.debug("JSON to add(update) -> " + json_repository); HttpEntity httpEntity = new HttpEntity(json_repository, httpHeaders); - ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(),HttpMethod.POST, httpEntity, ResponseEntity.class); + ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, httpEntity, ResponseEntity.class); if (responseEntity.getStatusCode().equals(HttpStatus.OK)) { // emailUtils.sendUserRegistrationEmail(repository, authentication); @@ -576,7 +566,7 @@ public class RepositoryServiceImpl implements RepositoryService { return repository; } catch (Exception e) { - LOGGER.debug("Exception on updateRepository" , e); + LOGGER.debug("Exception on updateRepository", e); emailUtils.reportException(e); throw e; } @@ -585,7 +575,7 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public Repository updateRepository(Repository repository,Authentication authentication) throws Exception { + public Repository updateRepository(Repository repository, Authentication authentication) throws Exception { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/update/") .build() @@ -597,7 +587,7 @@ public class RepositoryServiceImpl implements RepositoryService { LOGGER.debug("JSON to update -> " + json_repository); HttpEntity httpEntity = new HttpEntity(json_repository, httpHeaders); - ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(),HttpMethod.POST, httpEntity + ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, httpEntity , ResponseEntity.class); if (responseEntity.getStatusCode().equals(HttpStatus.OK)) { @@ -608,7 +598,7 @@ public class RepositoryServiceImpl implements RepositoryService { return repository; } catch (Exception e) { - LOGGER.debug("Exception on updateRepository" , e); + LOGGER.debug("Exception on updateRepository", e); emailUtils.reportException(e); throw e; } @@ -627,10 +617,10 @@ public class RepositoryServiceImpl implements RepositoryService { .build() .encode(); String json_repository = Converter.repositoryObjectToJson(repository); - HttpEntity httpEntity = new HttpEntity (json_repository,httpHeaders); - ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(),HttpMethod.POST, httpEntity, ResponseEntity.class); + HttpEntity httpEntity = new HttpEntity(json_repository, httpHeaders); + ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, httpEntity, ResponseEntity.class); - if(responseEntity.getStatusCode().equals(HttpStatus.OK)) { + if (responseEntity.getStatusCode().equals(HttpStatus.OK)) { emailUtils.sendUserRegistrationEmail(repository, authentication); emailUtils.sendAdminRegistrationEmail(repository, authentication); } else { @@ -639,8 +629,8 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public void deleteRepositoryInterface(String id , - String registeredBy){ + public void deleteRepositoryInterface(String id, + String registeredBy) { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/api/") .path("/{id}") @@ -656,17 +646,17 @@ public class RepositoryServiceImpl implements RepositoryService { String comment, RepositoryInterface repositoryInterface) throws Exception { try { Repository e = this.getRepositoryById(repoId); - repositoryInterface = createRepositoryInterface(e,repositoryInterface,datatype); - String json_interface = Converter.repositoryInterfaceObjectToJson(e,repositoryInterface); + repositoryInterface = createRepositoryInterface(e, repositoryInterface, datatype); + String json_interface = Converter.repositoryInterfaceObjectToJson(e, repositoryInterface); UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/api/add/") .build() .encode(); - HttpEntity httpEntity = new HttpEntity <> (json_interface,httpHeaders); + HttpEntity httpEntity = new HttpEntity<>(json_interface, httpHeaders); - restTemplate.postForObject(uriComponents.toUri(),httpEntity, String.class); + restTemplate.postForObject(uriComponents.toUri(), httpEntity, String.class); emailUtils.sendAdminRegisterInterfaceEmail(e, comment, repositoryInterface, SecurityContextHolder.getContext().getAuthentication()); emailUtils.sendUserRegisterInterfaceEmail(e, comment, repositoryInterface, SecurityContextHolder.getContext().getAuthentication()); @@ -676,7 +666,7 @@ public class RepositoryServiceImpl implements RepositoryService { return repositoryInterface; } catch (Exception e) { - LOGGER.error("Exception on addRepositoryInterface" , e); + LOGGER.error("Exception on addRepositoryInterface", e); emailUtils.reportException(e); throw e; } @@ -687,14 +677,14 @@ public class RepositoryServiceImpl implements RepositoryService { String registeredBy, String comment, RepositoryInterface repositoryInterface) throws Exception { - this.updateBaseUrl(repoId,repositoryInterface.getId(),repositoryInterface.getBaseUrl()); - this.updateCompliance(repoId,repositoryInterface.getId(),repositoryInterface.getCompliance()); - this.updateValidationSet(repoId,repositoryInterface.getId(),repositoryInterface.getAccessSet()); + this.updateBaseUrl(repoId, repositoryInterface.getId(), repositoryInterface.getBaseUrl()); + this.updateCompliance(repoId, repositoryInterface.getId(), repositoryInterface.getCompliance()); + this.updateValidationSet(repoId, repositoryInterface.getId(), repositoryInterface.getAccessSet()); Repository e = this.getRepositoryById(repoId); emailUtils.sendAdminUpdateInterfaceEmail(e, comment, repositoryInterface, SecurityContextHolder.getContext().getAuthentication()); emailUtils.sendUserUpdateInterfaceEmail(e, comment, repositoryInterface, SecurityContextHolder.getContext().getAuthentication()); - submitInterfaceValidation(getRepositoryById(repoId),registeredBy,repositoryInterface,true); + submitInterfaceValidation(getRepositoryById(repoId), registeredBy, repositoryInterface, true); return repositoryInterface; } @@ -766,25 +756,25 @@ public class RepositoryServiceImpl implements RepositoryService { @Override public List getTimezones() { - List timezones = Converter.readFile("timezones.txt"); + List timezones = Converter.readFile("timezones.txt"); return Converter.toTimezones(timezones); } @Override public List getUrlsOfUserRepos(String userEmail, String page, - String size){ + String size) { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/api/baseurl/") .path("/{page}/{size}") - .build().expand(page,size).encode(); + .build().expand(page, size).encode(); - try{ + try { RequestFilter requestFilter = new RequestFilter(); requestFilter.setRegisteredby(userEmail); - return Arrays.asList(restTemplate.postForObject(uriComponents.toUri(),requestFilter, String[].class)); - }catch (Exception e){ - LOGGER.debug("Exception on addRepositoryInterface" , e); + return Arrays.asList(restTemplate.postForObject(uriComponents.toUri(), requestFilter, String[].class)); + } catch (Exception e) { + LOGGER.debug("Exception on addRepositoryInterface", e); emailUtils.reportException(e); throw e; } @@ -824,7 +814,7 @@ public class RepositoryServiceImpl implements RepositoryService { @Override - public Map getCompatibilityClasses(String mode) { + public Map getCompatibilityClasses(String mode) { LOGGER.debug("Getting compatibility classes for mode: " + mode); Map retMap = new HashMap(); @@ -853,7 +843,7 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public Map getDatasourceClasses(String mode) { + public Map getDatasourceClasses(String mode) { LOGGER.debug("Getting datasource classes for mode: " + mode); @@ -874,16 +864,16 @@ public class RepositoryServiceImpl implements RepositoryService { retMap.put(entry.getKey(), entry.getValue()); } } - return filterResults(retMap,mode); + return filterResults(retMap, mode); } - private Map filterResults(Map map,String mode) { + private Map filterResults(Map map, String mode) { - HashMap filteredMap = new HashMap<>(); - for(String key:map.keySet()) - if(dataSourceClass.get(mode).contains(key)) - filteredMap.put(key,map.get(key)); + HashMap filteredMap = new HashMap<>(); + for (String key : map.keySet()) + if (dataSourceClass.get(mode).contains(key)) + filteredMap.put(key, map.get(key)); return filteredMap; } @@ -911,23 +901,23 @@ public class RepositoryServiceImpl implements RepositoryService { @Override public Map getListLatestUpdate(String mode) throws JSONException { - if(mode.equals("opendoar")) - return Collections.singletonMap("lastCollectionDate", getRepositoryInterface("openaire____::"+mode).get(0).getLastCollectionDate()); + if (mode.equals("opendoar")) + return Collections.singletonMap("lastCollectionDate", getRepositoryInterface("openaire____::" + mode).get(0).getLastCollectionDate()); else /* - * first api of re3data has null value on collection date - * */ - return Collections.singletonMap("lastCollectionDate", getRepositoryInterface("openaire____::"+mode).get(1).getLastCollectionDate()); + * first api of re3data has null value on collection date + * */ + return Collections.singletonMap("lastCollectionDate", getRepositoryInterface("openaire____::" + mode).get(1).getLastCollectionDate()); } private void updateValidationSet(String repositoryId, String repositoryInterfaceId, String validationSet) throws Exception { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/api/oaiset") - .queryParam("dsId",repositoryId) - .queryParam("apiId",repositoryInterfaceId) - .queryParam("oaiSet",validationSet) + .queryParam("dsId", repositoryId) + .queryParam("apiId", repositoryInterfaceId) + .queryParam("oaiSet", validationSet) .build().encode(); - restTemplate.exchange(uriComponents.toUri(),HttpMethod.POST, null, ResponseEntity.class); + restTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, null, ResponseEntity.class); } @@ -935,21 +925,21 @@ public class RepositoryServiceImpl implements RepositoryService { private void updateBaseUrl(String repositoryId, String repositoryInterfaceId, String baseUrl) { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/api/baseurl") - .queryParam("dsId",repositoryId) - .queryParam("apiId",repositoryInterfaceId) - .queryParam("baseUrl",baseUrl) + .queryParam("dsId", repositoryId) + .queryParam("apiId", repositoryInterfaceId) + .queryParam("baseUrl", baseUrl) .build().encode(); - restTemplate.postForObject(uriComponents.toUri(),null,String.class); + restTemplate.postForObject(uriComponents.toUri(), null, String.class); } - private void updateCompliance(String repositoryId, String repositoryInterfaceId,String compliance) { + private void updateCompliance(String repositoryId, String repositoryInterfaceId, String compliance) { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/api/compliance") - .queryParam("dsId",repositoryId) - .queryParam("apiId",repositoryInterfaceId) - .queryParam("compliance",compliance) + .queryParam("dsId", repositoryId) + .queryParam("apiId", repositoryInterfaceId) + .queryParam("compliance", compliance) .build().encode(); - restTemplate.postForObject(uriComponents.toUri(),null,String.class); + restTemplate.postForObject(uriComponents.toUri(), null, String.class); } private MetricsNumbers getMetricsNumbers(String openAIREID) throws BrokerException { @@ -970,7 +960,7 @@ public class RepositoryServiceImpl implements RepositoryService { new ParameterizedTypeReference() { }); } catch (RestClientException e) { - LOGGER.debug("Exception on getMetricsNumbers" , e); + LOGGER.debug("Exception on getMetricsNumbers", e); emailUtils.reportException(e); throw e; } @@ -987,39 +977,70 @@ public class RepositoryServiceImpl implements RepositoryService { return null; } - private UriComponents searchDatasource(String page,String size){ + private UriComponents searchDatasource(String page, String size) { return UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/search/") .path("/{page}/{size}/") - .queryParam("requestSortBy","officialname") - .queryParam("order","ASCENDING") + .queryParam("requestSortBy", "officialname") + .queryParam("order", "ASCENDING") .build().expand(page, size).encode(); } - private UriComponents searchSnipperDatasource(String page,String size){ + private UriComponents searchSnipperDatasource(String page, String size) { return UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/searchsnippet/") .path("/{page}/{size}/") - .queryParam("requestSortBy","officialname") - .queryParam("order","ASCENDING") + .queryParam("requestSortBy", "officialname") + .queryParam("order", "ASCENDING") .build().expand(page, size).encode(); } - private UriComponents searchRegisteredDatasource(String requestSortBy, String order, String page,String size){ + private UriComponents searchRegisteredDatasource(String requestSortBy, String order, String page, String size) { return UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/searchregistered/") .path("/{page}/{size}/") - .queryParam("requestSortBy",requestSortBy) - .queryParam("order",order) + .queryParam("requestSortBy", requestSortBy) + .queryParam("order", order) .build().expand(page, size).encode(); } - private String getRepositoryType(String typology){ + private String getRepositoryType(String typology) { return invertedDataSourceClass.get(typology); } + private List getRoleIdsFromUserRoles(String userEmail) { + Integer coPersonId = registryCalls.getCoPersonIdByEmail(userEmail); + JsonArray roles; + ArrayList roleIds = new ArrayList<>(); + ArrayList couIds = new ArrayList<>(); + if (coPersonId != null) { + roles = registryCalls.getRoles(coPersonId); + for (JsonElement role : roles) { + JsonObject object = role.getAsJsonObject(); + if (object.get("CouId") == null) { + continue; + } + couIds.add(object.get("CouId").getAsInt()); + } + roleIds.addAll(registryCalls.getCouNames(couIds).values()); + + } + return roleIds; + } + + private List getRepoIdsFromUserRoles(String userEmail) { + List roleIds = getRoleIdsFromUserRoles(userEmail); + List repoIds = new ArrayList<>(); + for (String role : roleIds) { + if (role.contains("datasource")) { + // TODO: ask if checking for BETA prefix is required + repoIds.add(role.replaceFirst(".*datasource\\.", "").replace("$", ":")); + } + } + return repoIds; + } } diff --git a/src/main/java/eu/dnetlib/repo/manager/service/security/AaiUserRoleService.java b/src/main/java/eu/dnetlib/repo/manager/service/security/AaiUserRoleService.java new file mode 100644 index 0000000..6bba27e --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/AaiUserRoleService.java @@ -0,0 +1,45 @@ +package eu.dnetlib.repo.manager.service.security; + +import org.springframework.security.core.authority.SimpleGrantedAuthority; + +public interface AaiUserRoleService { + + /** + * @param fullName + * @param prefix + * @return + */ + String getRepoNameWithoutType(String fullName, String prefix); + + /** + * @param repoId + * @param prefix + * @return + */ + String getRoleIdByRepoId(String repoId, String prefix); + + /** + * @param repoId + * @return + */ + String convertRepoIdToAuthorityId(String repoId); + + /** + * @param repoId + * @return + */ + String convertRepoIdToEncodedAuthorityId(String repoId); + + /** + * @param repoId + * @return + */ + SimpleGrantedAuthority convertRepoIdToAuthority(String repoId); + + /** + * @param repoId + * @return + */ + boolean isMemberOf(String repoId); + +} diff --git a/src/main/java/eu/dnetlib/repo/manager/service/security/AaiUserRoleServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/security/AaiUserRoleServiceImpl.java new file mode 100644 index 0000000..86dfb5e --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/AaiUserRoleServiceImpl.java @@ -0,0 +1,78 @@ +package eu.dnetlib.repo.manager.service.security; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import java.net.URLEncoder; + +@Service("aaiUserRoleService") +public class AaiUserRoleServiceImpl implements AaiUserRoleService { + + private static final Logger logger = Logger.getLogger(AaiUserRoleServiceImpl.class); + + @Value("${registry.production:true}") + private boolean production; + + + private String createRepoRoleName(String prefix, String repoId) { + return prefix + "." + repoId.replace(":", "$"); + } + + @Override + public String getRepoNameWithoutType(String fullName, String prefix) { + if (fullName != null && prefix != null && fullName.startsWith(prefix)) { + return fullName.substring(prefix.length()); + } + return null; + } + + @Override + public String getRoleIdByRepoId(String repoId, String prefix) { + String roleId = ""; + if (repoId != null && prefix != null) { + roleId = createRepoRoleName(prefix, repoId); + return roleId; + } else { + return null; + } + + } + + @Override + public String convertRepoIdToAuthorityId(String repoId) { + StringBuilder roleBuilder = new StringBuilder(); + String role = ""; + if (repoId != null) { + roleBuilder.append(production ? "" : "beta."); + roleBuilder.append("datasource."); + roleBuilder.append(repoId.replace(":", "$")); + role = roleBuilder.toString().replace(".", "_").toUpperCase(); + } + return role; + } + + @Override + public String convertRepoIdToEncodedAuthorityId(String repoId) { + return URLEncoder.encode(convertRepoIdToAuthorityId(repoId)); + } + + @Override + public SimpleGrantedAuthority convertRepoIdToAuthority(String repoId) { + String role = convertRepoIdToEncodedAuthorityId(repoId); + if (role != null) { + role = URLEncoder.encode(role); + } + return new SimpleGrantedAuthority(role); + } + + + @Override + public boolean isMemberOf(String repoId) { + String repoRole = convertRepoIdToEncodedAuthorityId(repoId); + return SecurityContextHolder.getContext().getAuthentication().getAuthorities() + .parallelStream().anyMatch(authority -> authority.toString().equals(repoRole)); + } +} diff --git a/src/main/java/eu/dnetlib/repo/manager/service/security/AuthoritiesUpdater.java b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthoritiesUpdater.java new file mode 100644 index 0000000..e724bfd --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthoritiesUpdater.java @@ -0,0 +1,55 @@ +package eu.dnetlib.repo.manager.service.security; + +import org.apache.log4j.Logger; +import org.mitre.openid.connect.model.OIDCAuthenticationToken; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.session.ExpiringSession; +import org.springframework.session.FindByIndexNameSessionRepository; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Map; + + +@Service +public class AuthoritiesUpdater extends HttpSessionSecurityContextRepository { + + private static final Logger logger = Logger.getLogger(AuthoritiesUpdater.class); + + @Autowired + FindByIndexNameSessionRepository sessions; + + public void update(String id, Update update) { + if (sessions != null) { + Map map = sessions. + findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, id); + logger.debug(map.values().toArray().length); + for (ExpiringSession session : map.values()) { + logger.debug(session.getId()); + if (!session.isExpired()) { + SecurityContext securityContext = session.getAttribute(SPRING_SECURITY_CONTEXT_KEY); + Authentication authentication = securityContext.getAuthentication(); + if (authentication instanceof OIDCAuthenticationToken) { + OIDCAuthenticationToken authOIDC = (OIDCAuthenticationToken) authentication; + Collection authorities = update.authorities(authentication.getAuthorities()); + logger.debug(authorities); + securityContext.setAuthentication(new OIDCAuthenticationToken(authOIDC.getSub(), authOIDC.getIssuer(), + authOIDC.getUserInfo(), authorities, authOIDC.getIdToken(), + authOIDC.getAccessTokenValue(), authOIDC.getRefreshTokenValue())); + logger.debug("Update authorities"); + session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, securityContext); + sessions.save(session); + } + } + } + } + } + + public interface Update { + Collection authorities(Collection old); + } +} diff --git a/src/main/java/eu/dnetlib/repo/manager/utils/AuthorizationService.java b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java similarity index 75% rename from src/main/java/eu/dnetlib/repo/manager/utils/AuthorizationService.java rename to src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java index 42860a7..e43b17a 100644 --- a/src/main/java/eu/dnetlib/repo/manager/utils/AuthorizationService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java @@ -1,16 +1,16 @@ -package eu.dnetlib.repo.manager.utils; +package eu.dnetlib.repo.manager.service.security; import org.springframework.stereotype.Component; @Component("AuthorizationService") -public class AuthorizationService { +public class AuthorizationServiceImpl implements AuthorizationService { public final String ROLE_ADMIN = "ROLE_ADMIN"; public final String ROLE_PROVIDE_ADMIN = "ROLE_PROVIDE_ADMIN"; public final String ROLE_USER = "ROLE_USER"; private String mapType(String type) { - if(type.equals("datasource")) { + if (type.equals("datasource")) { type = "datasource"; } return type; @@ -18,8 +18,7 @@ public class AuthorizationService { /** * Type = DATASOURCE - * - * */ + */ public String member(String type, String id) { return mapType(type).toUpperCase() + "_" + id.toUpperCase(); } diff --git a/src/main/java/eu/dnetlib/repo/manager/utils/Converter.java b/src/main/java/eu/dnetlib/repo/manager/utils/Converter.java index 5ec4b0c..908a486 100644 --- a/src/main/java/eu/dnetlib/repo/manager/utils/Converter.java +++ b/src/main/java/eu/dnetlib/repo/manager/utils/Converter.java @@ -12,6 +12,7 @@ import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.IOException; @@ -21,6 +22,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +@Component public class Converter { private static final Logger LOGGER = Logger.getLogger(Converter.class); @@ -28,7 +30,7 @@ public class Converter { public static Repository jsonToRepositoryObject(JSONObject repositoryObject) throws JSONException { Repository repository = new Repository(); - + JSONObject datasource = repositoryObject.getJSONObject("datasource"); //if( datasource.equals(null)) @@ -37,51 +39,51 @@ public class Converter { repository.setId(datasource.get("id").toString()); repository.setOfficialName(datasource.get("officialname").toString()); - repository.setEnglishName( datasource.get("englishname").toString()); - if(repository.getEnglishName().equals("null")) + repository.setEnglishName(datasource.get("englishname").toString()); + if (repository.getEnglishName().equals("null")) repository.setEnglishName(""); repository.setWebsiteUrl(datasource.get("websiteurl").toString()); - if(repository.getWebsiteUrl().equals("null")) + if (repository.getWebsiteUrl().equals("null")) repository.setWebsiteUrl(""); repository.setLogoUrl(datasource.get("logourl").toString()); - if(repository.getLogoUrl().equals("null")) + if (repository.getLogoUrl().equals("null")) repository.setLogoUrl(""); repository.setContactEmail(datasource.get("contactemail").toString()); - if(repository.getContactEmail().equals("null")) + if (repository.getContactEmail().equals("null")) repository.setContactEmail(""); - repository.setLatitude( toDouble(datasource.get("latitude").toString())); + repository.setLatitude(toDouble(datasource.get("latitude").toString())); repository.setLongitude(toDouble(datasource.get("longitude").toString())); Double timezone = toDouble(datasource.get("timezone").toString()); - repository.setTimezone(timezone!=null?timezone:0.0); + repository.setTimezone(timezone != null ? timezone : 0.0); repository.setNamespacePrefix(datasource.get("namespaceprefix").toString()); repository.setOdLanguages(datasource.get("languages").toString()); - repository.setDateOfValidation(convertStringToDate( datasource.get("dateofvalidation").toString())); + repository.setDateOfValidation(convertStringToDate(datasource.get("dateofvalidation").toString())); /* typology -> platform * datasource class -> typology */ repository.setTypology(datasource.get("platform").toString()); - if(repository.getTypology().equals("null")) + if (repository.getTypology().equals("null")) repository.setTypology(""); repository.setDatasourceClass(datasource.get("typology").toString()); - repository.setDateOfCollection(convertStringToDate( datasource.get("dateofcollection").toString())); + repository.setDateOfCollection(convertStringToDate(datasource.get("dateofcollection").toString())); repository.setActivationId(datasource.get("activationId").toString()); repository.setDescription(datasource.get("description").toString()); - if(repository.getDescription().equals("null")) + if (repository.getDescription().equals("null")) repository.setDescription(""); repository.setIssn(datasource.get("issn").toString()); repository.setLissn(datasource.get("lissn").toString()); - if(repository.getLissn().equals("null")) + if (repository.getLissn().equals("null")) repository.setLissn(""); repository.setEissn(datasource.get("eissn").toString()); - if(repository.getEissn().equals("null")) + if (repository.getEissn().equals("null")) repository.setEissn(""); repository.setRegisteredBy(datasource.get("registeredby").toString()); @@ -94,8 +96,8 @@ public class Converter { repository.setCollectedFrom(datasource.get("collectedfrom").toString()); //TODO change organization to list - JSONArray organizations = ((JSONArray)datasource.get("organizations")); - if(organizations.length() != 0) { + JSONArray organizations = ((JSONArray) datasource.get("organizations")); + if (organizations.length() != 0) { repository.setOrganization(((JSONArray) datasource.get("organizations")).getJSONObject(0).get("legalname").toString()); String countryCode = ((JSONArray) datasource.get("organizations")).getJSONObject(0).get("country").toString(); repository.setCountryCode(countryCode); @@ -106,31 +108,31 @@ public class Converter { return repository; } - public static Date convertStringToDate(String date){ + public static Date convertStringToDate(String date) { - if(Objects.equals(date, "null")) + if (Objects.equals(date, "null")) return null; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); try { return formatter.parse(date); } catch (ParseException e) { - LOGGER.error(e); + LOGGER.error(e); } return null; } - public static String convertDateToString(Date date){ + public static String convertDateToString(Date date) { - if(Objects.equals(date, null)) + if (Objects.equals(date, null)) return null; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); return formatter.format(date); } - public static Double toDouble(String number){ - if(Objects.equals(number, "null")) + public static Double toDouble(String number) { + if (Objects.equals(number, "null")) return 0.0; else return Double.valueOf(number); @@ -140,8 +142,8 @@ public class Converter { List resultSet = new ArrayList<>(); JSONArray rs = json.getJSONArray("datasourceInfo"); - for(int i=0;i resultSet = new ArrayList<>(); JSONArray rs = json.getJSONArray("datasourceInfo"); - for(int i=0;i resultSet = new ArrayList<>(); JSONArray rs = json.getJSONArray("api"); - for(int i=0;i repositoryMap = new HashMap<>(); + HashMap repositoryMap = new HashMap<>(); ObjectMapper mapper = new ObjectMapper(); - repositoryMap.put("id",repository.getId()); - repositoryMap.put("openaireId",getOpenaireId(repository.getId())); - repositoryMap.put("officialname",repository.getOfficialName()); - repositoryMap.put("englishname",repository.getEnglishName()); - repositoryMap.put("websiteurl",repository.getWebsiteUrl()); - repositoryMap.put("logourl",repository.getLogoUrl()); - repositoryMap.put("contactemail",repository.getContactEmail()); - repositoryMap.put("longitude",repository.getLongitude().toString()); - repositoryMap.put("latitude",repository.getLatitude().toString()); - repositoryMap.put("timezone",repository.getTimezone()); + repositoryMap.put("id", repository.getId()); + repositoryMap.put("openaireId", getOpenaireId(repository.getId())); + repositoryMap.put("officialname", repository.getOfficialName()); + repositoryMap.put("englishname", repository.getEnglishName()); + repositoryMap.put("websiteurl", repository.getWebsiteUrl()); + repositoryMap.put("logourl", repository.getLogoUrl()); + repositoryMap.put("contactemail", repository.getContactEmail()); + repositoryMap.put("longitude", repository.getLongitude().toString()); + repositoryMap.put("latitude", repository.getLatitude().toString()); + repositoryMap.put("timezone", repository.getTimezone()); - repositoryMap.put("namespaceprefix",repository.getNamespacePrefix()!=null?repository.getNamespacePrefix():""); - repositoryMap.put("languages",repository.getOdLanguages()!=null?repository.getOdLanguages():""); + repositoryMap.put("namespaceprefix", repository.getNamespacePrefix() != null ? repository.getNamespacePrefix() : ""); + repositoryMap.put("languages", repository.getOdLanguages() != null ? repository.getOdLanguages() : ""); - repositoryMap.put("dateofcollection",repository.getDateOfCollection()!=null?convertDateToString(repository.getDateOfCollection()):""); + repositoryMap.put("dateofcollection", repository.getDateOfCollection() != null ? convertDateToString(repository.getDateOfCollection()) : ""); /* - * typology -> platform - * datasource class -> typology - * */ - repositoryMap.put("typology",repository.getDatasourceClass()); - repositoryMap.put("platform",repository.getTypology()); + * typology -> platform + * datasource class -> typology + * */ + repositoryMap.put("typology", repository.getDatasourceClass()); + repositoryMap.put("platform", repository.getTypology()); - repositoryMap.put("dateofvalidation",repository.getDateOfCollection()!=null?convertDateToString(repository.getDateOfCollection()):""); - repositoryMap.put("activationId",repository.getActivationId()!=null?repository.getActivationId():""); + repositoryMap.put("dateofvalidation", repository.getDateOfCollection() != null ? convertDateToString(repository.getDateOfCollection()) : ""); + repositoryMap.put("activationId", repository.getActivationId() != null ? repository.getActivationId() : ""); - repositoryMap.put("description",repository.getDescription()); + repositoryMap.put("description", repository.getDescription()); - repositoryMap.put("eissn",repository.getEissn()!=null?repository.getEissn():""); - repositoryMap.put("issn",repository.getIssn()!=null?repository.getIssn():""); - repositoryMap.put("lissn",repository.getLissn()!=null?repository.getLissn():""); + repositoryMap.put("eissn", repository.getEissn() != null ? repository.getEissn() : ""); + repositoryMap.put("issn", repository.getIssn() != null ? repository.getIssn() : ""); + repositoryMap.put("lissn", repository.getLissn() != null ? repository.getLissn() : ""); - repositoryMap.put("registeredby",repository.getRegisteredBy()); + repositoryMap.put("registeredby", repository.getRegisteredBy()); - repositoryMap.put("aggregator",repository.getAggregator()!=null?repository.getAggregator():""); - repositoryMap.put("collectedfrom",repository.getCollectedFrom()!=null?repository.getCollectedFrom():""); + repositoryMap.put("aggregator", repository.getAggregator() != null ? repository.getAggregator() : ""); + repositoryMap.put("collectedfrom", repository.getCollectedFrom() != null ? repository.getCollectedFrom() : ""); - repositoryMap.put("managed",repository.isRegistered()); + repositoryMap.put("managed", repository.isRegistered()); - Map organization = new HashMap<>(); - organization.put("legalname",repository.getOrganization()); - organization.put("country",repository.getCountryCode()); - organization.put("legalshortname",""); - organization.put("websiteurl",""); - organization.put("logourl",""); + Map organization = new HashMap<>(); + organization.put("legalname", repository.getOrganization()); + organization.put("country", repository.getCountryCode()); + organization.put("legalshortname", ""); + organization.put("websiteurl", ""); + organization.put("logourl", ""); List organizations = new ArrayList(); organizations.add(organization); - repositoryMap.put("organizations",organizations); + repositoryMap.put("organizations", organizations); //TODO check identitites //Map identity = new HashMap<>(); @@ -293,43 +295,43 @@ public class Converter { repositoryMap.put("identities", identities); } - repositoryMap.put("subjects",""); + repositoryMap.put("subjects", ""); return mapper.writeValueAsString(repositoryMap); } - public static String repositoryInterfaceObjectToJson(Repository repository,RepositoryInterface repositoryInterface) throws JSONException { + public static String repositoryInterfaceObjectToJson(Repository repository, RepositoryInterface repositoryInterface) throws JSONException { JSONObject jsonObject = new JSONObject(); - jsonObject.put("id",repositoryInterface.getId()); - jsonObject.put("protocol",repositoryInterface.getAccessProtocol()); - jsonObject.put("datasource",repository.getId()); - jsonObject.put("contentdescription",repositoryInterface.getContentDescription()); - jsonObject.put("typology",repositoryInterface.getTypology()); - jsonObject.put("compatibility",repositoryInterface.getDesiredCompatibilityLevel()); - jsonObject.put("compatibilityOverride",repositoryInterface.getDesiredCompatibilityLevel()); + jsonObject.put("id", repositoryInterface.getId()); + jsonObject.put("protocol", repositoryInterface.getAccessProtocol()); + jsonObject.put("datasource", repository.getId()); + jsonObject.put("contentdescription", repositoryInterface.getContentDescription()); + jsonObject.put("typology", repositoryInterface.getTypology()); + jsonObject.put("compatibility", repositoryInterface.getDesiredCompatibilityLevel()); + jsonObject.put("compatibilityOverride", repositoryInterface.getDesiredCompatibilityLevel()); - jsonObject.put("lastCollectionTotal",""); + jsonObject.put("lastCollectionTotal", ""); - jsonObject.put("lastCollectionDate",repositoryInterface.getLastCollectionDate()); - jsonObject.put("lastAggregationTotal",""); - jsonObject.put("lastAggregationDate",""); - jsonObject.put("lastDownloadTotal",""); - jsonObject.put("lastDownloadDate",""); + jsonObject.put("lastCollectionDate", repositoryInterface.getLastCollectionDate()); + jsonObject.put("lastAggregationTotal", ""); + jsonObject.put("lastAggregationDate", ""); + jsonObject.put("lastDownloadTotal", ""); + jsonObject.put("lastDownloadDate", ""); + + jsonObject.put("baseurl", repositoryInterface.getBaseUrl()); + jsonObject.put("removable", repositoryInterface.isRemovable()); - jsonObject.put("baseurl",repositoryInterface.getBaseUrl()); - jsonObject.put("removable",repositoryInterface.isRemovable()); - JSONArray apiparams = new JSONArray(); - for(String param: repositoryInterface.getAccessParams().keySet()){ + for (String param : repositoryInterface.getAccessParams().keySet()) { JSONObject jo = new JSONObject(); - jo.put("param",param); - jo.put("value",repositoryInterface.getAccessParams().get(param)); + jo.put("param", param); + jo.put("value", repositoryInterface.getAccessParams().get(param)); apiparams.put(jo); } - jsonObject.put("apiParams",apiparams); + jsonObject.put("apiParams", apiparams); // jsonObject.put("metadataIdentifierPath",repositoryInterface.getMetadataIdentifierPath()); @@ -345,7 +347,7 @@ public class Converter { //InputStream in = Converter.class.getResourceAsStream("resources/eu/dnetlib/repo/manager/service/utils/"+filename); InputStream in = Converter.class.getClass().getResourceAsStream("/eu/**/" + filename); BufferedReader br = new BufferedReader(new InputStreamReader(in)); - while((line = br.readLine()) != null) { + while ((line = br.readLine()) != null) { list.add(line.trim()); } br.close(); @@ -375,9 +377,9 @@ public class Converter { AggregationDetails aggregationDetails = new AggregationDetails(); aggregationDetails.setAggregationStage(aggregationObject.get("aggregationStage").toString()); - if(aggregationObject.has("collectionMode")) + if (aggregationObject.has("collectionMode")) aggregationDetails.setCollectionMode(aggregationObject.get("collectionMode").toString()); - if(aggregationObject.has("indexedVersion")) + if (aggregationObject.has("indexedVersion")) aggregationDetails.setIndexedVersion(Boolean.parseBoolean(aggregationObject.get("indexedVersion").toString())); aggregationDetails.setDate(convertStringToDate(aggregationObject.get("date").toString())); aggregationDetails.setNumberOfRecords(Integer.parseInt(aggregationObject.get("numberOfRecords").toString())); @@ -388,9 +390,9 @@ public class Converter { public static List toTimezones(List timezones) { List tmz = new ArrayList<>(); - for(String t : timezones){ + for (String t : timezones) { String[] s = t.split("\t"); - tmz.add(new Timezone(s[1],Double.parseDouble(s[0]))); + tmz.add(new Timezone(s[1], Double.parseDouble(s[0]))); } return tmz; } @@ -401,11 +403,4 @@ public class Converter { return null; } - public static String convertRepoIdToRoleId(String repoId) { - if ( repoId != null ) { - return "datasource." + repoId.replaceAll(":", "$"); - } - return null; - } - } diff --git a/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java b/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java index d85db9c..ddbfb96 100644 --- a/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java +++ b/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java @@ -18,6 +18,7 @@ public class HttpUtils { private static final Logger logger = Logger.getLogger(HttpUtils.class); + //TODO: refactor // TODO: To be changed the values // @Value("https://aai.openaire.eu/registry/") @Value("https://openaire-dev.aai-dev.grnet.gr/registry/") @@ -35,7 +36,7 @@ public class HttpUtils { headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity request = new HttpEntity<>(body.toString(), headers); ResponseEntity responseEntity = restTemplate.exchange(issuer + path, HttpMethod.POST, request, String.class); - if(responseEntity.getBody() != null) { + if (responseEntity.getBody() != null) { return new JsonParser().parse(responseEntity.getBody()); } else { return null; @@ -48,7 +49,7 @@ public class HttpUtils { headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity request = new HttpEntity<>(body.toString(), headers); ResponseEntity responseEntity = restTemplate.exchange(issuer + path, HttpMethod.PUT, request, String.class); - if(responseEntity.getBody() != null) { + if (responseEntity.getBody() != null) { return new JsonParser().parse(responseEntity.getBody()); } else { return null; @@ -60,7 +61,7 @@ public class HttpUtils { String url = issuer + path + ((params != null) ? createParams(params) : null); ResponseEntity responseEntity = restTemplate.exchange (url, HttpMethod.GET, new HttpEntity<>(createHeaders(user, password)), String.class); - if(responseEntity.getBody() != null) { + if (responseEntity.getBody() != null) { return new JsonParser().parse(responseEntity.getBody()); } else { return null; @@ -72,7 +73,7 @@ public class HttpUtils { String url = issuer + path; ResponseEntity responseEntity = restTemplate.exchange (url, HttpMethod.DELETE, new HttpEntity<>(createHeaders(user, password)), String.class); - if(responseEntity.getBody() != null) { + if (responseEntity.getBody() != null) { return new JsonParser().parse(responseEntity.getBody()); } else { return null; diff --git a/src/main/java/eu/dnetlib/repo/manager/utils/JsonUtils.java b/src/main/java/eu/dnetlib/repo/manager/utils/JsonUtils.java index 381e0dc..682ebfd 100644 --- a/src/main/java/eu/dnetlib/repo/manager/utils/JsonUtils.java +++ b/src/main/java/eu/dnetlib/repo/manager/utils/JsonUtils.java @@ -1,57 +1,11 @@ package eu.dnetlib.repo.manager.utils; -import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import eu.dnetlib.repo.manager.domain.dto.Role; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -@Component public class JsonUtils { - @Value("1.0") - private String version; - - @Value("2") - private String coid; - - public JsonObject coPersonRoles(Integer coPersonId, Integer couId, String status) { - JsonObject role = new JsonObject(); - JsonArray coPersonRoles = new JsonArray(); - JsonObject coPersonRole = new JsonObject(); - JsonObject person = new JsonObject(); - person.addProperty("Type", "CO"); - person.addProperty("Id", coPersonId.toString()); - coPersonRole.addProperty("Version", version); - coPersonRole.add("Person", person); - coPersonRole.addProperty("CouId", couId.toString()); - coPersonRole.addProperty("Affiliation", "member"); - coPersonRole.addProperty("Title", ""); - coPersonRole.addProperty("O", "Openaire"); - coPersonRole.addProperty("Status", status); - coPersonRole.addProperty("ValidFrom", ""); - coPersonRole.addProperty("ValidThrough", ""); - coPersonRoles.add(coPersonRole); - role.addProperty("RequestType", "CoPersonRoles"); - role.addProperty("Version", version); - role.add("CoPersonRoles", coPersonRoles); - return role; - } - - public JsonObject createNewCou(Role role) { - JsonObject cou = new JsonObject(); - JsonArray cous = new JsonArray(); - JsonObject newCou = new JsonObject(); - newCou.addProperty("Version", version); - newCou.addProperty("CoId", coid); - newCou.addProperty("Name", role.getName()); - newCou.addProperty("Description", role.getDescription()); - cous.add(newCou); - cou.addProperty("RequestType", "Cous"); - cou.addProperty("Version", version); - cou.add("Cous", cous); - return cou; + private JsonUtils() { } public JsonObject createResponse(JsonElement response) { @@ -60,7 +14,7 @@ public class JsonUtils { return json; } - public JsonObject createResponse(String response) { + public static JsonObject createResponse(String response) { JsonObject json = new JsonObject(); json.addProperty("response", response); return json; @@ -72,13 +26,13 @@ public class JsonUtils { return json; } - public JsonObject createResponse(Boolean response) { + public static JsonObject createResponse(Boolean response) { JsonObject json = new JsonObject(); json.addProperty("response", response); return json; } - public JsonObject createResponse(Character response) { + public static JsonObject createResponse(Character response) { JsonObject json = new JsonObject(); json.addProperty("response", response); return json;