From 218a1aaece6a7aede4f8d06ef99b6b04a62855b6 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 10 Feb 2022 16:15:05 +0100 Subject: [PATCH 01/10] First try... --- pom.xml | 159 ++++++++++++++++++++++++++++------ src/main/resources/log4j2.xml | 2 +- 2 files changed, 134 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index 3b9ff65c8..4b1bbfabb 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,7 @@ 5.3.14 5.6.1 2.17.1 + 2.0.3 5.8.2 UTF-8 2.22.2 @@ -92,11 +93,23 @@ zt-zip 1.14 jar + org.glassfish.jersey.containers jersey-container-servlet-core ${jersey.version} + org.glassfish.jersey.media @@ -120,13 +133,44 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider + - + jakarta.xml.bind jakarta.xml.bind-api - 4.0.0-RC2 + 2.3.3 + + + com.sun.xml.bind + jaxb-impl + 2.3.3 + runtime + + + jakarta.servlet jakarta.servlet-api @@ -135,11 +179,7 @@ - - org.glassfish.jaxb - jaxb-runtime - 2.3.3 - + org.glassfish.jersey.ext jersey-spring5 @@ -251,6 +291,10 @@ org.apache.commons commons-lang3 + + com.jayway.restassured + xml-path + @@ -299,12 +343,11 @@ org.apache.logging.log4j - log4j-slf4j-impl + log4j-slf4j18-impl ${log4j2.version} - - javax.servlet + javax.servlet javax.servlet-api 4.0.0 provided @@ -322,6 +365,14 @@ org.glassfish.jersey.containers + @@ -335,17 +386,33 @@ org.eclipse.rdf4j rdf4j-repository-http ${rdf4j.version} + org.eclipse.rdf4j rdf4j-queryresultio-sparqljson ${rdf4j.version} + org.json json - 20160810 + 20211205 @@ -362,16 +429,22 @@ - javax.jms - jms - 1.1 + jakarta.jms + jakarta.jms-api + 2.0.3 net.sf.saxon Saxon-HE - 10.0 + 11.1.1 + + + xml-apis + xml-apis + + @@ -384,27 +457,43 @@ fr.opensagres.xdocreport fr.opensagres.xdocreport.document.odt - 2.0.1 + ${xdocreport.version} fr.opensagres.xdocreport fr.opensagres.xdocreport.template.freemarker - 2.0.1 + ${xdocreport.version} fr.opensagres.xdocreport fr.opensagres.xdocreport.converter.odt.odfdom - 2.0.1 + ${xdocreport.version} + + + xerces + xercesImpl + + - + com.itextpdf itextpdf - 5.5.13 + 5.5.13.2 @@ -413,12 +502,12 @@ jdom 1.0 - + org.jsoup jsoup - 1.14.2 + 1.14.3 @@ -427,13 +516,31 @@ jaxen jaxen 1.1.1 + + + xml-apis + xml-apis + + + xerces + xercesImpl + + + xerces + xmlParserAPIs + + + jdom + jdom + + com.vladsch.flexmark flexmark-all - 0.50.42 + 0.64.0 @@ -466,8 +573,8 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + 11 + 11 diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 8e6460bd7..b58038796 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -11,7 +11,7 @@ - From 79711791332b1542ab90f45b0acb416a09d02bed Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 25 Feb 2022 16:03:17 +0100 Subject: [PATCH 02/10] Remove jaxen and jdom --- pom.xml | 50 +++++++++++-------- .../RmesAuthenticationEntryPoint.java | 33 ++++++++++++ src/main/resources/log4j2.xml | 2 +- 3 files changed, 62 insertions(+), 23 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/config/auth/security/keycloak/RmesAuthenticationEntryPoint.java diff --git a/pom.xml b/pom.xml index 4b1bbfabb..1c96cbde4 100644 --- a/pom.xml +++ b/pom.xml @@ -497,11 +497,17 @@ - + + + @@ -512,29 +518,29 @@ - + diff --git a/src/main/java/fr/insee/rmes/config/auth/security/keycloak/RmesAuthenticationEntryPoint.java b/src/main/java/fr/insee/rmes/config/auth/security/keycloak/RmesAuthenticationEntryPoint.java new file mode 100644 index 000000000..99c9c3256 --- /dev/null +++ b/src/main/java/fr/insee/rmes/config/auth/security/keycloak/RmesAuthenticationEntryPoint.java @@ -0,0 +1,33 @@ +//package fr.insee.rmes.config.auth.security.keycloak; +// +//import java.io.IOException; +//import java.io.PrintWriter; +// +//import javax.servlet.ServletException; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +// +//import org.springframework.security.core.AuthenticationException; +//import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; +//import org.springframework.stereotype.Component; +// +// +//@Component +// public class RmesAuthenticationEntryPoint extends BasicAuthenticationEntryPoint { +// +// @Override +// public void commence( +// HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx) throws IOException { +// response.addHeader("WWW-Authenticate", "Basic realm='' + getRealmName() + ''"); +// response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); +// PrintWriter writer = response.getWriter(); +// writer.println("HTTP Status 401 - " + authEx.getMessage()); +// } +// +// @Override +// public void afterPropertiesSet() { +// +// setRealmName("agents-insee-interne"); +// super.afterPropertiesSet(); +// } +// } diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index b58038796..ac6e7e9f4 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -12,7 +12,7 @@ %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n From b1a4a3ed49236c45dbbea5b2d828309c75c28d85 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 1 Mar 2022 10:45:43 +0100 Subject: [PATCH 03/10] Initialize Sugoi --- .../java/fr/insee/rmes/config/Config.java | 13 + .../RmesUserRolesManagerImpl.java | 59 +++-- .../sugoiModel/Application.java | 96 ++++++++ .../sugoiModel/Attributes.java | 231 ++++++++++++++++++ .../user_roles_manager/sugoiModel/Group.java | 163 ++++++++++++ .../sugoiModel/UserSugoi.java | 227 +++++++++++++++++ 6 files changed, 764 insertions(+), 25 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Application.java create mode 100644 src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Attributes.java create mode 100644 src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Group.java create mode 100644 src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UserSugoi.java diff --git a/src/main/java/fr/insee/rmes/config/Config.java b/src/main/java/fr/insee/rmes/config/Config.java index 33c53bf49..4d42f47ff 100644 --- a/src/main/java/fr/insee/rmes/config/Config.java +++ b/src/main/java/fr/insee/rmes/config/Config.java @@ -105,6 +105,12 @@ public class Config { public static String IGESA_APP_ID = ""; public static String IGESA_USER = ""; public static String IGESA_PASSWORD = ""; + + public static String SUGOI_URL = ""; + public static String SUGOI_USER = ""; + public static String SUGOI_PASSWORD = ""; + public static String SUGOI_APP = ""; + public static String SUGOI_REALM = ""; public static String SWAGGER_HOST = ""; public static String SWAGGER_BASEPATH = ""; @@ -184,6 +190,13 @@ public static void setConfig(Environment env) { Config.IGESA_APP_ID = env.getProperty("fr.insee.rmes.bauhaus.igesa.id"); Config.IGESA_USER = env.getProperty("fr.insee.rmes.bauhaus.igesa.user"); Config.IGESA_PASSWORD = env.getProperty("fr.insee.rmes.bauhaus.igesa.password"); + + Config.SUGOI_URL = env.getProperty("fr.insee.rmes.bauhaus.sugoi.url"); + Config.SUGOI_USER = env.getProperty("fr.insee.rmes.bauhaus.sugoi.user"); + Config.SUGOI_PASSWORD = env.getProperty("fr.insee.rmes.bauhaus.sugoi.password"); + Config.SUGOI_APP = env.getProperty("fr.insee.rmes.bauhaus.sugoi.application"); + Config.SUGOI_REALM = env.getProperty("fr.insee.rmes.bauhaus.sugoi.realm"); + Config.SWAGGER_HOST = env.getProperty("fr.insee.rmes.bauhaus.api.host"); Config.SWAGGER_BASEPATH = env.getProperty("fr.insee.rmes.bauhaus.api.basepath"); diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java index e41a2be21..41c51bb4c 100644 --- a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java @@ -18,21 +18,21 @@ import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.jdom.Document; -import org.jdom.Element; -import org.jdom.input.SAXBuilder; -import org.jdom.xpath.XPath; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.databind.ObjectMapper; + import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.config.Config; import fr.insee.rmes.config.auth.roles.UserRolesManagerService; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.external_services.authentication.LdapConnexion; +import fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel.Application; import fr.insee.rmes.utils.JSONComparator; +import groovy.xml.SAXBuilder; @Service public class RmesUserRolesManagerImpl implements UserRolesManagerService { @@ -43,6 +43,9 @@ public class RmesUserRolesManagerImpl implements UserRolesManagerService { static final Logger logger = LogManager.getLogger(RmesUserRolesManagerImpl.class); private static final String IGESA_APP_SEARCH_PATH = "/recherche/application/"; + private static final String SUGOI_REALM_SEARCH_PATH = "/realms/"; + private static final String SUGOI_APP_SEARCH_PATH = "/applications/"; + private static final String SUGOI_SEARCH = Config.SUGOI_URL + SUGOI_REALM_SEARCH_PATH + Config.SUGOI_REALM + SUGOI_APP_SEARCH_PATH + Config.SUGOI_APP ; private static final String IGESA_ADD_USER_PATH_FMT = Config.IGESA_URL + "/gestion/ajout/personne/application/" + Config.IGESA_APP_ID + "/groupe/{1}/utilisateur/{0}"; @@ -74,27 +77,33 @@ public String getRoles() throws RmesException { try { Client client = ClientBuilder.newClient(); - String xmlResponse = client.target(Config.IGESA_URL + IGESA_APP_SEARCH_PATH + Config.IGESA_APP_ID) - .request(MediaType.APPLICATION_XML).get(String.class); - - Document doc = new SAXBuilder().build(new StringReader(xmlResponse)); - List l = (XPath.selectNodes(doc, ROLES_XPATH)); - for (Element e : l) { - JSONObject jsonO = new JSONObject(); - jsonO.put(Constants.ID, XPath.newInstance(ROLE_ID_XPATH).valueOf(e)); - jsonO.put(Constants.LABEL, XPath.newInstance(ROLE_LABEL_XPATH).valueOf(e)); - List p = (XPath.selectNodes(e, ROLE_PERSONS_XPATH)); - JSONArray persons = new JSONArray(); - for (Element person : p) { - JSONObject jsonOO = new JSONObject(); - jsonOO.put(Constants.ID, XPath.newInstance(ROLE_PERSON_IDEP_XPATH).valueOf(person)); - jsonOO.put(Constants.LABEL, XPath.newInstance(ROLE_ID_XPATH).valueOf(person)); - jsonOO.put("stamp", XPath.newInstance(ROLE_PERSON_STAMP_XPATH).valueOf(person)); - persons.put(jsonOO); - } - jsonO.put("persons", persons); - roles.put(jsonO); - } +// String xmlResponse = client.target(Config.IGESA_URL + IGESA_APP_SEARCH_PATH + Config.IGESA_APP_ID) +// .request(MediaType.APPLICATION_XML).get(String.class); + + String jsonResponse = client.target(SUGOI_SEARCH).request(MediaType.APPLICATION_JSON).get(String.class); + + ObjectMapper mapper = new ObjectMapper(); + Application application = mapper.readValue(jsonResponse, Application.class); + + +// Document doc = new SAXBuilder().build(new StringReader(xmlResponse)); +// List l = (XPath.selectNodes(doc, ROLES_XPATH)); +// for (Element e : l) { +// JSONObject jsonO = new JSONObject(); +// jsonO.put(Constants.ID, XPath.newInstance(ROLE_ID_XPATH).valueOf(e)); +// jsonO.put(Constants.LABEL, XPath.newInstance(ROLE_LABEL_XPATH).valueOf(e)); +// List p = (XPath.selectNodes(e, ROLE_PERSONS_XPATH)); +// JSONArray persons = new JSONArray(); +// for (Element person : p) { +// JSONObject jsonOO = new JSONObject(); +// jsonOO.put(Constants.ID, XPath.newInstance(ROLE_PERSON_IDEP_XPATH).valueOf(person)); +// jsonOO.put(Constants.LABEL, XPath.newInstance(ROLE_ID_XPATH).valueOf(person)); +// jsonOO.put("stamp", XPath.newInstance(ROLE_PERSON_STAMP_XPATH).valueOf(person)); +// persons.put(jsonOO); +// } +// jsonO.put("persons", persons); +// roles.put(jsonO); +// } } catch (Exception e) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Fail to getRoles"); } diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Application.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Application.java new file mode 100644 index 000000000..2e75e34ff --- /dev/null +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Application.java @@ -0,0 +1,96 @@ +package fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "name", + "owner", + "groups" +}) +@Generated("jsonschema2pojo") +public class Application { + + @JsonProperty("name") + private String name; + @JsonProperty("owner") + private String owner; + @JsonProperty("users") + private List groups = null; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * No args constructor for use in serialization + * + */ + public Application() { + } + + /** + * + * @param name + * @param owner + * @param groups + */ + public Application(String name, String owner, List groups) { + super(); + this.name = name; + this.owner = owner; + this.groups = groups; + } + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + + @JsonProperty("owner") + public String getOwner() { + return owner; + } + + @JsonProperty("owner") + public void setOwner(String owner) { + this.owner = owner; + } + + @JsonProperty("groups") + public List getGroups() { + return groups; + } + + @JsonProperty("groups") + public void setGroups(List groups) { + this.groups = groups; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + + +} diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Attributes.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Attributes.java new file mode 100644 index 000000000..b7d81519a --- /dev/null +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Attributes.java @@ -0,0 +1,231 @@ +package fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "phone_number", + "common_name", + "insee_timbre", + "personal_title", + "description", + "insee_organisme", + "insee_roles_applicatifs" +}) +@Generated("jsonschema2pojo") +public class Attributes { + + @JsonProperty("phone_number") + private String phoneNumber; + + @JsonProperty("common_name") + private String commonName; + + @JsonProperty("insee_timbre") + private String inseeTimbre; + + @JsonProperty("personal_title") + private String personalTitle; + + @JsonProperty("description") + private String description; + + @JsonProperty("insee_organisme") + private String inseeOrganisme; + + @JsonProperty("insee_roles_applicatifs") + private List inseeRolesApplicatifs = null; + + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * No args constructor for use in serialization + * + */ + public Attributes() { + } + + /** + * + * @param commonName + * @param inseeRolesApplicatifs + * @param phoneNumber + * @param inseeOrganisme + * @param description + * @param inseeTimbre + * @param personalTitle + */ + public Attributes(String phoneNumber, String commonName, String inseeTimbre, String personalTitle, String description, String inseeOrganisme, List inseeRolesApplicatifs) { + super(); + this.phoneNumber = phoneNumber; + this.commonName = commonName; + this.inseeTimbre = inseeTimbre; + this.personalTitle = personalTitle; + this.description = description; + this.inseeOrganisme = inseeOrganisme; + this.inseeRolesApplicatifs = inseeRolesApplicatifs; + } + + @JsonProperty("phone_number") + public String getPhoneNumber() { + return phoneNumber; + } + + @JsonProperty("phone_number") + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + @JsonProperty("common_name") + public String getCommonName() { + return commonName; + } + + @JsonProperty("common_name") + public void setCommonName(String commonName) { + this.commonName = commonName; + } + + @JsonProperty("insee_timbre") + public String getInseeTimbre() { + return inseeTimbre; + } + + @JsonProperty("insee_timbre") + public void setInseeTimbre(String inseeTimbre) { + this.inseeTimbre = inseeTimbre; + } + + @JsonProperty("personal_title") + public String getPersonalTitle() { + return personalTitle; + } + + @JsonProperty("personal_title") + public void setPersonalTitle(String personalTitle) { + this.personalTitle = personalTitle; + } + + @JsonProperty("description") + public String getDescription() { + return description; + } + + @JsonProperty("description") + public void setDescription(String description) { + this.description = description; + } + + @JsonProperty("insee_organisme") + public String getInseeOrganisme() { + return inseeOrganisme; + } + + @JsonProperty("insee_organisme") + public void setInseeOrganisme(String inseeOrganisme) { + this.inseeOrganisme = inseeOrganisme; + } + + @JsonProperty("insee_roles_applicatifs") + public List getInseeRolesApplicatifs() { + return inseeRolesApplicatifs; + } + + @JsonProperty("insee_roles_applicatifs") + public void setInseeRolesApplicatifs(List inseeRolesApplicatifs) { + this.inseeRolesApplicatifs = inseeRolesApplicatifs; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Attributes.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("phoneNumber"); + sb.append('='); + sb.append(((this.phoneNumber == null)?"":this.phoneNumber)); + sb.append(','); + sb.append("commonName"); + sb.append('='); + sb.append(((this.commonName == null)?"":this.commonName)); + sb.append(','); + sb.append("inseeTimbre"); + sb.append('='); + sb.append(((this.inseeTimbre == null)?"":this.inseeTimbre)); + sb.append(','); + sb.append("personalTitle"); + sb.append('='); + sb.append(((this.personalTitle == null)?"":this.personalTitle)); + sb.append(','); + sb.append("description"); + sb.append('='); + sb.append(((this.description == null)?"":this.description)); + sb.append(','); + sb.append("inseeOrganisme"); + sb.append('='); + sb.append(((this.inseeOrganisme == null)?"":this.inseeOrganisme)); + sb.append(','); + sb.append("inseeRolesApplicatifs"); + sb.append('='); + sb.append(((this.inseeRolesApplicatifs == null)?"":this.inseeRolesApplicatifs)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.commonName == null)? 0 :this.commonName.hashCode())); + result = ((result* 31)+((this.inseeRolesApplicatifs == null)? 0 :this.inseeRolesApplicatifs.hashCode())); + result = ((result* 31)+((this.phoneNumber == null)? 0 :this.phoneNumber.hashCode())); + result = ((result* 31)+((this.inseeOrganisme == null)? 0 :this.inseeOrganisme.hashCode())); + result = ((result* 31)+((this.description == null)? 0 :this.description.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.inseeTimbre == null)? 0 :this.inseeTimbre.hashCode())); + result = ((result* 31)+((this.personalTitle == null)? 0 :this.personalTitle.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Attributes) == false) { + return false; + } + Attributes rhs = ((Attributes) other); + return (((((((((this.commonName == rhs.commonName)||((this.commonName!= null)&&this.commonName.equals(rhs.commonName)))&&((this.inseeRolesApplicatifs == rhs.inseeRolesApplicatifs)||((this.inseeRolesApplicatifs!= null)&&this.inseeRolesApplicatifs.equals(rhs.inseeRolesApplicatifs))))&&((this.phoneNumber == rhs.phoneNumber)||((this.phoneNumber!= null)&&this.phoneNumber.equals(rhs.phoneNumber))))&&((this.inseeOrganisme == rhs.inseeOrganisme)||((this.inseeOrganisme!= null)&&this.inseeOrganisme.equals(rhs.inseeOrganisme))))&&((this.description == rhs.description)||((this.description!= null)&&this.description.equals(rhs.description))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.inseeTimbre == rhs.inseeTimbre)||((this.inseeTimbre!= null)&&this.inseeTimbre.equals(rhs.inseeTimbre))))&&((this.personalTitle == rhs.personalTitle)||((this.personalTitle!= null)&&this.personalTitle.equals(rhs.personalTitle)))); + } + +} diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Group.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Group.java new file mode 100644 index 000000000..275ffa64e --- /dev/null +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/Group.java @@ -0,0 +1,163 @@ +package fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "name", + "description", + "users", + "appName" +}) +@Generated("jsonschema2pojo") +public class Group { + + @JsonProperty("name") + private String name; + @JsonProperty("description") + private String description; + @JsonProperty("users") + private List users = null; + private String appName; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * No args constructor for use in serialization + * + */ + public Group() { + } + + /** + * + * @param appName + * @param name + * @param description + * @param users + */ + public Group(String name, String description, List users, String appName) { + super(); + this.name = name; + this.description = description; + this.users = users; + this.appName = appName; + } + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + + @JsonProperty("description") + public String getDescription() { + return description; + } + + @JsonProperty("description") + public void setDescription(String description) { + this.description = description; + } + + @JsonProperty("users") + public List getUsers() { + return users; + } + + @JsonProperty("users") + public void setUsers(List users) { + this.users = users; + } + + @JsonProperty("appName") + public String getAppName() { + return appName; + } + + @JsonProperty("appName") + public void setAppName(String appName) { + this.appName = appName; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Group.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("name"); + sb.append('='); + sb.append(((this.name == null)?"":this.name)); + sb.append(','); + sb.append("description"); + sb.append('='); + sb.append(((this.description == null)?"":this.description)); + sb.append(','); + sb.append("users"); + sb.append('='); + sb.append(((this.users == null)?"":this.users)); + sb.append(','); + sb.append("appName"); + sb.append('='); + sb.append(((this.appName == null)?"":this.appName)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.name == null)? 0 :this.name.hashCode())); + result = ((result* 31)+((this.description == null)? 0 :this.description.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.users == null)? 0 :this.users.hashCode())); + result = ((result* 31)+((this.appName == null)? 0 :this.appName.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Group) == false) { + return false; + } + Group rhs = ((Group) other); + return ((((((this.name == rhs.name)||((this.name!= null)&&this.name.equals(rhs.name)))&&((this.description == rhs.description)||((this.description!= null)&&this.description.equals(rhs.description))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.users == rhs.users)||((this.users!= null)&&this.users.equals(rhs.users))))&&((this.appName == rhs.appName)||((this.appName!= null)&&this.appName.equals(rhs.appName)))); + } + +} diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UserSugoi.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UserSugoi.java new file mode 100644 index 000000000..26ca950d6 --- /dev/null +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UserSugoi.java @@ -0,0 +1,227 @@ +package fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "lastName", + "firstName", + "mail", + "username", + "groups", + "habilitations", + "address", + "metadatas", + "attributes" +}) +@Generated("jsonschema2pojo") +public class UserSugoi { + + @JsonProperty("lastName") + private String lastName; + @JsonProperty("firstName") + private String firstName; + @JsonProperty("mail") + private String mail; + @JsonProperty("username") + private String username; //idep + @JsonProperty("groups") + private List groups = null; + @JsonProperty("habilitations") + private List habilitations = null; + @JsonProperty("attributes") + private Attributes attributes; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * No args constructor for use in serialization + * + */ + public UserSugoi() { + } + + /** + * + * @param lastName + * @param firstName + * @param address + * @param mail + * @param metadatas + * @param habilitations + * @param groups + * @param attributes + * @param username + */ + public UserSugoi(String lastName, String firstName, String mail, String username, List groups, List habilitations, Attributes attributes) { + super(); + this.lastName = lastName; + this.firstName = firstName; + this.mail = mail; + this.username = username; + this.groups = groups; + this.habilitations = habilitations; + this.attributes = attributes; + } + + @JsonProperty("lastName") + public String getLastName() { + return lastName; + } + + @JsonProperty("lastName") + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @JsonProperty("firstName") + public String getFirstName() { + return firstName; + } + + @JsonProperty("firstName") + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + @JsonProperty("mail") + public String getMail() { + return mail; + } + + @JsonProperty("mail") + public void setMail(String mail) { + this.mail = mail; + } + + @JsonProperty("username") + public String getUsername() { + return username; + } + + @JsonProperty("username") + public void setUsername(String username) { + this.username = username; + } + + @JsonProperty("groups") + public List getGroups() { + return groups; + } + + @JsonProperty("groups") + public void setGroups(List groups) { + this.groups = groups; + } + + @JsonProperty("habilitations") + public List getHabilitations() { + return habilitations; + } + + @JsonProperty("habilitations") + public void setHabilitations(List habilitations) { + this.habilitations = habilitations; + } + + @JsonProperty("attributes") + public Attributes getAttributes() { + return attributes; + } + + @JsonProperty("attributes") + public void setAttributes(Attributes attributes) { + this.attributes = attributes; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(UserSugoi.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("lastName"); + sb.append('='); + sb.append(((this.lastName == null)?"":this.lastName)); + sb.append(','); + sb.append("firstName"); + sb.append('='); + sb.append(((this.firstName == null)?"":this.firstName)); + sb.append(','); + sb.append("mail"); + sb.append('='); + sb.append(((this.mail == null)?"":this.mail)); + sb.append(','); + sb.append("username"); + sb.append('='); + sb.append(((this.username == null)?"":this.username)); + sb.append(','); + sb.append("groups"); + sb.append('='); + sb.append(((this.groups == null)?"":this.groups)); + sb.append(','); + sb.append("habilitations"); + sb.append('='); + sb.append(((this.habilitations == null)?"":this.habilitations)); + sb.append(','); + sb.append("attributes"); + sb.append('='); + sb.append(((this.attributes == null)?"":this.attributes)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(additionalProperties, attributes, firstName, groups, habilitations, lastName, mail, + username); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + UserSugoi other = (UserSugoi) obj; + return Objects.equals(additionalProperties, other.additionalProperties) + && Objects.equals(attributes, other.attributes) && Objects.equals(firstName, other.firstName) + && Objects.equals(groups, other.groups) && Objects.equals(habilitations, other.habilitations) + && Objects.equals(lastName, other.lastName) && Objects.equals(mail, other.mail) + && Objects.equals(username, other.username); + } + + +} + From 0ccb8aef6916905c3afbc23862f1ea530b477ec3 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 1 Mar 2022 17:05:44 +0100 Subject: [PATCH 04/10] Add getAgents (prov) --- .../java/fr/insee/rmes/config/Config.java | 2 +- .../auth/roles/UserRolesManagerService.java | 2 + .../RmesUserRolesManagerImpl.java | 113 +++++++--- .../sugoiModel/UserSugoi.java | 4 + .../sugoiModel/UsersSugoi.java | 204 ++++++++++++++++++ .../insee/rmes/webservice/HealthcheckApi.java | 13 ++ 6 files changed, 303 insertions(+), 35 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UsersSugoi.java diff --git a/src/main/java/fr/insee/rmes/config/Config.java b/src/main/java/fr/insee/rmes/config/Config.java index 4d42f47ff..967f46021 100644 --- a/src/main/java/fr/insee/rmes/config/Config.java +++ b/src/main/java/fr/insee/rmes/config/Config.java @@ -192,7 +192,7 @@ public static void setConfig(Environment env) { Config.IGESA_PASSWORD = env.getProperty("fr.insee.rmes.bauhaus.igesa.password"); Config.SUGOI_URL = env.getProperty("fr.insee.rmes.bauhaus.sugoi.url"); - Config.SUGOI_USER = env.getProperty("fr.insee.rmes.bauhaus.sugoi.user"); + Config.SUGOI_USER = env.getProperty("fr.insee.rmes.bauhaus.sugoi.id"); Config.SUGOI_PASSWORD = env.getProperty("fr.insee.rmes.bauhaus.sugoi.password"); Config.SUGOI_APP = env.getProperty("fr.insee.rmes.bauhaus.sugoi.application"); Config.SUGOI_REALM = env.getProperty("fr.insee.rmes.bauhaus.sugoi.realm"); diff --git a/src/main/java/fr/insee/rmes/config/auth/roles/UserRolesManagerService.java b/src/main/java/fr/insee/rmes/config/auth/roles/UserRolesManagerService.java index 2456c67cb..1140ff4d8 100644 --- a/src/main/java/fr/insee/rmes/config/auth/roles/UserRolesManagerService.java +++ b/src/main/java/fr/insee/rmes/config/auth/roles/UserRolesManagerService.java @@ -15,5 +15,7 @@ public interface UserRolesManagerService { public void setAddRole(String role, String user); public void setDeleteRole(String roles, String user); + + public String checkSugoiConnexion() throws RmesException; } diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java index 41c51bb4c..d37f24d08 100644 --- a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java @@ -1,8 +1,8 @@ package fr.insee.rmes.external_services.authentication.user_roles_manager; -import java.io.StringReader; import java.text.MessageFormat; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import java.util.TreeSet; import javax.naming.NamingEnumeration; @@ -18,11 +18,13 @@ import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.rmes.bauhaus_services.Constants; @@ -31,8 +33,10 @@ import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.external_services.authentication.LdapConnexion; import fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel.Application; +import fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel.Group; +import fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel.UserSugoi; +import fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel.UsersSugoi; import fr.insee.rmes.utils.JSONComparator; -import groovy.xml.SAXBuilder; @Service public class RmesUserRolesManagerImpl implements UserRolesManagerService { @@ -45,20 +49,20 @@ public class RmesUserRolesManagerImpl implements UserRolesManagerService { private static final String IGESA_APP_SEARCH_PATH = "/recherche/application/"; private static final String SUGOI_REALM_SEARCH_PATH = "/realms/"; private static final String SUGOI_APP_SEARCH_PATH = "/applications/"; - private static final String SUGOI_SEARCH = Config.SUGOI_URL + SUGOI_REALM_SEARCH_PATH + Config.SUGOI_REALM + SUGOI_APP_SEARCH_PATH + Config.SUGOI_APP ; + private static final String SUGOI_SEARCH_APP = Config.SUGOI_URL + SUGOI_REALM_SEARCH_PATH + Config.SUGOI_REALM + SUGOI_APP_SEARCH_PATH + Config.SUGOI_APP ; + private static final String SUGOI_SEARCH_USERS = Config.SUGOI_URL + SUGOI_REALM_SEARCH_PATH + Config.SUGOI_REALM + "/users" ; + private static final String IGESA_ADD_USER_PATH_FMT = Config.IGESA_URL + "/gestion/ajout/personne/application/" + Config.IGESA_APP_ID + "/groupe/{1}/utilisateur/{0}"; private static final String IGESA_DELETE_USER_PATH_FMT = Config.IGESA_URL + "/gestion/suppression/personne/application/" + Config.IGESA_APP_ID + "/groupe/{1}/utilisateur/{0}"; - private static final String ROLES_XPATH = "/applications/application/groupes/groupe"; private static final String ROLE_ID_XPATH = "cn"; - private static final String ROLE_LABEL_XPATH = "description"; - private static final String ROLE_PERSONS_XPATH = "personnes/personne"; - private static final String ROLE_PERSON_STAMP_XPATH = "ou"; private static final String ROLE_PERSON_IDEP_XPATH = "uid"; + private Map mapUsers; + @Override public String getAuth(String body) { if (body.equals(Config.PASSWORD_GESTIONNAIRE)) { @@ -71,39 +75,37 @@ public String getAuth(String body) { } @Override - @SuppressWarnings("unchecked") public String getRoles() throws RmesException { + if (mapUsers == null || mapUsers.isEmpty()) {getAgentsSugoi();} + logger.info("mapUsers size : {}", mapUsers.size()); JSONArray roles = new JSONArray(); try { - Client client = ClientBuilder.newClient(); - -// String xmlResponse = client.target(Config.IGESA_URL + IGESA_APP_SEARCH_PATH + Config.IGESA_APP_ID) -// .request(MediaType.APPLICATION_XML).get(String.class); - - String jsonResponse = client.target(SUGOI_SEARCH).request(MediaType.APPLICATION_JSON).get(String.class); + Client client = ClientBuilder.newClient().register(HttpAuthenticationFeature.basic(Config.SUGOI_USER, Config.SUGOI_PASSWORD)); + String jsonResponse = client.target(SUGOI_SEARCH_APP).request(MediaType.APPLICATION_JSON).get(String.class); ObjectMapper mapper = new ObjectMapper(); Application application = mapper.readValue(jsonResponse, Application.class); + for (Group g : application.getGroups()) { + JSONObject jsonGroup = new JSONObject(); + jsonGroup.put(Constants.ID, g.getName()); + jsonGroup.put(Constants.LABEL, g.getDescription()); + JSONArray persons = new JSONArray(); + if (g.getUsers() != null) { + for (UserSugoi u : g.getUsers()) { + UserSugoi completeUser = mapUsers.get(u.getUsername()); + if (completeUser != null ) { + JSONObject jsonUser = new JSONObject(); + jsonUser.put(Constants.ID, u.getUsername()); + jsonUser.put(Constants.LABEL, completeUser.getCompleteName()); + jsonUser.put(Constants.STAMP, completeUser.getAttributes().getInseeTimbre()); + persons.put(jsonUser); + } else logger.warn("Unknown user : {}",u.getUsername()); + } + } + jsonGroup.put("persons", persons); + roles.put(jsonGroup); + } - -// Document doc = new SAXBuilder().build(new StringReader(xmlResponse)); -// List l = (XPath.selectNodes(doc, ROLES_XPATH)); -// for (Element e : l) { -// JSONObject jsonO = new JSONObject(); -// jsonO.put(Constants.ID, XPath.newInstance(ROLE_ID_XPATH).valueOf(e)); -// jsonO.put(Constants.LABEL, XPath.newInstance(ROLE_LABEL_XPATH).valueOf(e)); -// List p = (XPath.selectNodes(e, ROLE_PERSONS_XPATH)); -// JSONArray persons = new JSONArray(); -// for (Element person : p) { -// JSONObject jsonOO = new JSONObject(); -// jsonOO.put(Constants.ID, XPath.newInstance(ROLE_PERSON_IDEP_XPATH).valueOf(person)); -// jsonOO.put(Constants.LABEL, XPath.newInstance(ROLE_ID_XPATH).valueOf(person)); -// jsonOO.put("stamp", XPath.newInstance(ROLE_PERSON_STAMP_XPATH).valueOf(person)); -// persons.put(jsonOO); -// } -// jsonO.put("persons", persons); -// roles.put(jsonO); -// } } catch (Exception e) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Fail to getRoles"); } @@ -141,6 +143,35 @@ public String getAgents() throws RmesException { } return agents.toString(); } + + + public String getAgentsSugoi() throws RmesException { + mapUsers = new HashMap<>(); + TreeSet agents = new TreeSet<>(new JSONComparator(Constants.LABEL)); + + Client client = ClientBuilder.newClient().register(HttpAuthenticationFeature.basic(Config.SUGOI_USER, Config.SUGOI_PASSWORD)); + String jsonResponse = client.target(SUGOI_SEARCH_USERS).queryParam("size", 6000).request(MediaType.APPLICATION_JSON).get(String.class); + + ObjectMapper mapper = new ObjectMapper(); + UsersSugoi users; + try { + users = mapper.readValue(jsonResponse, UsersSugoi.class); + for (UserSugoi u : users.getResults()) { + JSONObject jsonUser = new JSONObject(); + jsonUser.put(Constants.ID, u.getUsername()); + jsonUser.put(Constants.LABEL, u.getCompleteName()); + if (u.getAttributes() != null) { + jsonUser.put(Constants.STAMP, u.getAttributes().getInseeTimbre()); + } + agents.add(jsonUser); + mapUsers.put(u.getUsername(), u); + } + } catch (JsonProcessingException e) { + logger.error("Get agents via Sugoi failed : {}", e.getMessage()); + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Get agents via Sugoi failed"); + } + return agents.toString(); + } @Override public void setAddRole(String role, String user) { @@ -168,5 +199,19 @@ public String checkLdapConnexion() throws RmesException { } return StringUtils.isEmpty(xmlResponse)? "KO" : "OK"; } + + @Override + public String checkSugoiConnexion() throws RmesException { + String jsonResponse =""; + try { + Client client = ClientBuilder.newClient().register(HttpAuthenticationFeature.basic(Config.SUGOI_USER, Config.SUGOI_PASSWORD)); + + jsonResponse = client.target(Config.SUGOI_URL + "whoami") + .request(MediaType.APPLICATION_JSON).get(String.class); + } catch (Exception e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Fail to target SUGOI"); + } + return StringUtils.isEmpty(jsonResponse)? "KO" : "OK"; + } } diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UserSugoi.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UserSugoi.java index 26ca950d6..e1b8ade63 100644 --- a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UserSugoi.java +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UserSugoi.java @@ -95,6 +95,10 @@ public String getFirstName() { public void setFirstName(String firstName) { this.firstName = firstName; } + + public String getCompleteName() { + return getFirstName()+" "+getLastName(); + } @JsonProperty("mail") public String getMail() { diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UsersSugoi.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UsersSugoi.java new file mode 100644 index 000000000..de6890685 --- /dev/null +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/sugoiModel/UsersSugoi.java @@ -0,0 +1,204 @@ +package fr.insee.rmes.external_services.authentication.user_roles_manager.sugoiModel; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "results", + "totalElements", + "nextStart", + "hasMoreResult", + "pageSize", + "searchToken" +}) +@Generated("jsonschema2pojo") +public class UsersSugoi { + + @JsonProperty("results") + private List results = null; + @JsonProperty("totalElements") + private Integer totalElements; + @JsonProperty("nextStart") + private Integer nextStart; + @JsonProperty("hasMoreResult") + private Boolean hasMoreResult; + @JsonProperty("pageSize") + private Integer pageSize; + @JsonProperty("searchToken") + private Object searchToken; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * No args constructor for use in serialization + * + */ + public UsersSugoi() { + } + + /** + * + * @param pageSize + * @param nextStart + * @param hasMoreResult + * @param results + * @param totalElements + * @param searchToken + */ + public UsersSugoi(List results, Integer totalElements, Integer nextStart, Boolean hasMoreResult, Integer pageSize, Object searchToken) { + super(); + this.results = results; + this.totalElements = totalElements; + this.nextStart = nextStart; + this.hasMoreResult = hasMoreResult; + this.pageSize = pageSize; + this.searchToken = searchToken; + } + + @JsonProperty("results") + public List getResults() { + return results; + } + + @JsonProperty("results") + public void setResults(List results) { + this.results = results; + } + + @JsonProperty("totalElements") + public Integer getTotalElements() { + return totalElements; + } + + @JsonProperty("totalElements") + public void setTotalElements(Integer totalElements) { + this.totalElements = totalElements; + } + + @JsonProperty("nextStart") + public Integer getNextStart() { + return nextStart; + } + + @JsonProperty("nextStart") + public void setNextStart(Integer nextStart) { + this.nextStart = nextStart; + } + + @JsonProperty("hasMoreResult") + public Boolean getHasMoreResult() { + return hasMoreResult; + } + + @JsonProperty("hasMoreResult") + public void setHasMoreResult(Boolean hasMoreResult) { + this.hasMoreResult = hasMoreResult; + } + + @JsonProperty("pageSize") + public Integer getPageSize() { + return pageSize; + } + + @JsonProperty("pageSize") + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + @JsonProperty("searchToken") + public Object getSearchToken() { + return searchToken; + } + + @JsonProperty("searchToken") + public void setSearchToken(Object searchToken) { + this.searchToken = searchToken; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(UsersSugoi.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("results"); + sb.append('='); + sb.append(((this.results == null)?"":this.results)); + sb.append(','); + sb.append("totalElements"); + sb.append('='); + sb.append(((this.totalElements == null)?"":this.totalElements)); + sb.append(','); + sb.append("nextStart"); + sb.append('='); + sb.append(((this.nextStart == null)?"":this.nextStart)); + sb.append(','); + sb.append("hasMoreResult"); + sb.append('='); + sb.append(((this.hasMoreResult == null)?"":this.hasMoreResult)); + sb.append(','); + sb.append("pageSize"); + sb.append('='); + sb.append(((this.pageSize == null)?"":this.pageSize)); + sb.append(','); + sb.append("searchToken"); + sb.append('='); + sb.append(((this.searchToken == null)?"":this.searchToken)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.pageSize == null)? 0 :this.pageSize.hashCode())); + result = ((result* 31)+((this.nextStart == null)? 0 :this.nextStart.hashCode())); + result = ((result* 31)+((this.hasMoreResult == null)? 0 :this.hasMoreResult.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.results == null)? 0 :this.results.hashCode())); + result = ((result* 31)+((this.totalElements == null)? 0 :this.totalElements.hashCode())); + result = ((result* 31)+((this.searchToken == null)? 0 :this.searchToken.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof UsersSugoi) == false) { + return false; + } + UsersSugoi rhs = ((UsersSugoi) other); + return ((((((((this.pageSize == rhs.pageSize)||((this.pageSize!= null)&&this.pageSize.equals(rhs.pageSize)))&&((this.nextStart == rhs.nextStart)||((this.nextStart!= null)&&this.nextStart.equals(rhs.nextStart))))&&((this.hasMoreResult == rhs.hasMoreResult)||((this.hasMoreResult!= null)&&this.hasMoreResult.equals(rhs.hasMoreResult))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.results == rhs.results)||((this.results!= null)&&this.results.equals(rhs.results))))&&((this.totalElements == rhs.totalElements)||((this.totalElements!= null)&&this.totalElements.equals(rhs.totalElements))))&&((this.searchToken == rhs.searchToken)||((this.searchToken!= null)&&this.searchToken.equals(rhs.searchToken)))); + } + +} diff --git a/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java b/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java index de4cddcb6..3ac1ac1a9 100644 --- a/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java +++ b/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java @@ -85,6 +85,19 @@ public Response getHealthcheck() { errorMessage.add("- "+e.getMessage()+ " \n"); stateResult.add(CONNEXION_LDAP).add(KO_STATE); } + + try { + String result = userService.checkSugoiConnexion(); + if ("OK".equals(result)) { + stateResult.add(CONNEXION_LDAP+" - Sugoi").add(OK_STATE); + }else { + errorMessage.add("- Sugoi No functional error but return an empty string \n"); + stateResult.add(CONNEXION_LDAP).add(KO_STATE); + } + } catch (RmesException e) { + errorMessage.add("- "+e.getMessage()+ " \n"); + stateResult.add(CONNEXION_LDAP).add(KO_STATE); + } //print result in log From 703f29d18a442b9d75f14a0ad9677af395d38b9b Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 2 Mar 2022 09:19:51 +0100 Subject: [PATCH 05/10] Fix issue with unfound people --- .../RmesUserRolesManagerImpl.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java index d37f24d08..0dd77e5c1 100644 --- a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java @@ -41,6 +41,8 @@ @Service public class RmesUserRolesManagerImpl implements UserRolesManagerService { + private static final int NB_USERS_EXPECTED = 20000; + @Autowired LdapConnexion ldapConnexion; @@ -77,7 +79,7 @@ public String getAuth(String body) { @Override public String getRoles() throws RmesException { if (mapUsers == null || mapUsers.isEmpty()) {getAgentsSugoi();} - logger.info("mapUsers size : {}", mapUsers.size()); + logger.info("mapUsers size : {} / {} max", mapUsers.size(), NB_USERS_EXPECTED); JSONArray roles = new JSONArray(); try { Client client = ClientBuilder.newClient().register(HttpAuthenticationFeature.basic(Config.SUGOI_USER, Config.SUGOI_PASSWORD)); @@ -92,7 +94,7 @@ public String getRoles() throws RmesException { JSONArray persons = new JSONArray(); if (g.getUsers() != null) { for (UserSugoi u : g.getUsers()) { - UserSugoi completeUser = mapUsers.get(u.getUsername()); + UserSugoi completeUser = mapUsers.get(u.getUsername().toLowerCase()); if (completeUser != null ) { JSONObject jsonUser = new JSONObject(); jsonUser.put(Constants.ID, u.getUsername()); @@ -146,11 +148,14 @@ public String getAgents() throws RmesException { public String getAgentsSugoi() throws RmesException { - mapUsers = new HashMap<>(); + mapUsers = new HashMap<>(NB_USERS_EXPECTED); TreeSet agents = new TreeSet<>(new JSONComparator(Constants.LABEL)); Client client = ClientBuilder.newClient().register(HttpAuthenticationFeature.basic(Config.SUGOI_USER, Config.SUGOI_PASSWORD)); - String jsonResponse = client.target(SUGOI_SEARCH_USERS).queryParam("size", 6000).request(MediaType.APPLICATION_JSON).get(String.class); + String jsonResponse = client.target(SUGOI_SEARCH_USERS) + .queryParam("size", NB_USERS_EXPECTED) + .request(MediaType.APPLICATION_JSON) + .get(String.class); ObjectMapper mapper = new ObjectMapper(); UsersSugoi users; @@ -164,7 +169,7 @@ public String getAgentsSugoi() throws RmesException { jsonUser.put(Constants.STAMP, u.getAttributes().getInseeTimbre()); } agents.add(jsonUser); - mapUsers.put(u.getUsername(), u); + mapUsers.put(u.getUsername().toLowerCase(), u); } } catch (JsonProcessingException e) { logger.error("Get agents via Sugoi failed : {}", e.getMessage()); From ee2ece33a1889af1bbb07c0273aee7ae416aecaf Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 2 Mar 2022 09:22:39 +0100 Subject: [PATCH 06/10] Remove unused --- .../fr/insee/rmes/config/ApplicationContext.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/fr/insee/rmes/config/ApplicationContext.java b/src/main/java/fr/insee/rmes/config/ApplicationContext.java index 26fa2fec1..e02fdc7a8 100644 --- a/src/main/java/fr/insee/rmes/config/ApplicationContext.java +++ b/src/main/java/fr/insee/rmes/config/ApplicationContext.java @@ -45,12 +45,12 @@ public HttpClientBuilder httpClientBuilder() return HttpClients.custom().setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).setSSLSocketFactory(sslsf); } - @Bean - public RestTemplate restTemplate() throws KeyManagementException, KeyStoreException, NoSuchAlgorithmException { - CloseableHttpClient httpClient = httpClientBuilder().build(); - ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); - return new RestTemplate(requestFactory); - } +// @Bean +// public RestTemplate restTemplate() throws KeyManagementException, KeyStoreException, NoSuchAlgorithmException { +// CloseableHttpClient httpClient = httpClientBuilder().build(); +// ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); +// return new RestTemplate(requestFactory); +// } @PostConstruct public void setUp() { From 137e0bcde8857638a2a7f481abadacb759f47640 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 11 Mar 2022 16:37:55 +0100 Subject: [PATCH 07/10] Fix issue with double --- .../structures/utils/StructureComponentUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index ad6330350..c8a3ed43f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -203,7 +203,7 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou else if (component.getRange().equals(XSD.DATETIME.stringValue())) { RdfUtils.addTripleString(componentURI, RdfUtils.createXSDIRI(PATTERN), component.getPattern(), Config.LG1, model, graph); } - else if (component.getRange().equals(XSD.INT.stringValue()) || component.getRange().equals(RdfUtils.toString(XSD.DOUBLE))) { + else if (component.getRange().equals(XSD.INT.stringValue()) || component.getRange().equals(XSD.DOUBLE.stringValue())) { RdfUtils.addTripleString(componentURI, RdfUtils.createXSDIRI(MIN_LENGTH), component.getMinLength(), Config.LG1, model, graph); RdfUtils.addTripleString(componentURI, RdfUtils.createXSDIRI(MAX_LENGTH), component.getMaxLength(), Config.LG1, model, graph); RdfUtils.addTripleString(componentURI, RdfUtils.createXSDIRI("minInclusive"), component.getMinLength(), Config.LG1, model, graph); From 2903332c7c8b3e57608dc80fff9ea8eeb0ed426e Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 14 Mar 2022 09:35:29 +0100 Subject: [PATCH 08/10] Update StructureComponentImpl.java --- .../structures/impl/StructureComponentImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java index 95a0d9efc..50e97cb2b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java @@ -43,7 +43,7 @@ public JSONObject getComponentObject(String id) throws RmesException { logger.info("Starting to get one mutualized component"); JSONObject response = repoGestion.getResponseAsObject(StructureQueries.getComponent(id)); if(response.keySet().isEmpty()){ - throw new NotFoundException("This component do not exist"); + throw new NotFoundException("This component does not exist"); } return structureComponentUtils.formatComponent(id, response); } @@ -67,7 +67,7 @@ public String createComponent( String body) throws RmesException { public void deleteComponent(String id) throws RmesException { JSONObject response = this.getComponentObject(id); if(response.keySet().isEmpty()){ - throw new NotFoundException("This component do not exist"); + throw new NotFoundException("This component does not exist"); } String type = response.getString("type"); structureComponentUtils.deleteComponent(response, id, type); From 1f817331b9757d310b282b746509fe4919430374 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 16 Mar 2022 10:25:40 +0100 Subject: [PATCH 09/10] Change to version 3.0.17 --- bauhaus-back-changeLog.txt | 1 + pom.xml | 2 +- src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bauhaus-back-changeLog.txt b/bauhaus-back-changeLog.txt index 644282b71..7f603107f 100644 --- a/bauhaus-back-changeLog.txt +++ b/bauhaus-back-changeLog.txt @@ -1,3 +1,4 @@ +3.0.17 : Passage à Java 11 3.0.16 : - Front : Correction d'un problème de chargement lors de la modification d'un rapport qualité 3.0.15 : - Correctif de la boucle infinie à l'affichage des séries (opStat - front) - Correctif sur les concepts (top concept) diff --git a/pom.xml b/pom.xml index 711ac2797..a7b5a234a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ fr.insee.rmes Bauhaus-BO war - 3.0.16 + 3.0.17 Bauhaus-Back-Office Back-office services for Bauhaus https://github.com/InseeFr/Bauhaus-Back-Office diff --git a/src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java b/src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java index 109223c2b..7c72965b7 100644 --- a/src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java +++ b/src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java @@ -30,7 +30,7 @@ public SwaggerConfig(@Context ServletConfig servletConfig) { super(); OpenAPI openApi = new OpenAPI(); - Info info = new Info().title("Bauhaus API").version("3.0.9").description("Rest Endpoints and services Integration used by Bauhaus"); + Info info = new Info().title("Bauhaus API").version("3.0.17").description("Rest Endpoints and services Integration used by Bauhaus"); openApi.info(info); Server server = new Server(); From 2f97c91a0d9e27767e678cff8cd798e69b3dd7d8 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 16 Mar 2022 10:27:46 +0100 Subject: [PATCH 10/10] Update bauhaus-back-changeLog.txt --- bauhaus-back-changeLog.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bauhaus-back-changeLog.txt b/bauhaus-back-changeLog.txt index 7f603107f..3a44d0216 100644 --- a/bauhaus-back-changeLog.txt +++ b/bauhaus-back-changeLog.txt @@ -1,4 +1,6 @@ -3.0.17 : Passage à Java 11 +3.0.17 : - Back : Passage à Java 11 + - Front : mise à jour des dépendances + - Ajout de la publication d'une nomenclature 3.0.16 : - Front : Correction d'un problème de chargement lors de la modification d'un rapport qualité 3.0.15 : - Correctif de la boucle infinie à l'affichage des séries (opStat - front) - Correctif sur les concepts (top concept)