Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 70172ff4 authored by Marco Amoia's avatar Marco Amoia
Browse files

Merge branch 'release/0.0.4-RC' into 'main'

Release/0.0.4 rc

See merge request !78
parents 4265d513 fddf6389
No related branches found
No related tags found
2 merge requests!139Feature/align,!78Release/0.0.4 rc
Pipeline #203042 passed with warnings
Showing
with 216 additions and 315 deletions
PROJECT_VERSION_NUMBER="0.0.3"
PROJECT_VERSION_NUMBER="0.0.4"
......@@ -13,13 +13,14 @@
<groupId>com.aruba.simpl</groupId>
<artifactId>simpl-parent</artifactId>
<version>0.0.2-SNAPSHOT</version>
<version>0.0.4-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2023.0.3</spring-cloud.version>
<mapstruct.version>1.5.5.Final</mapstruct.version>
<lombok-mapstruct.version>0.2.0</lombok-mapstruct.version>
<springdoc.version>2.6.0</springdoc.version>
<bouncycastle.version>1.78.1</bouncycastle.version>
<keycloak-admin.version>24.0.5</keycloak-admin.version>
......@@ -28,6 +29,7 @@
<instancio.version>4.8.1</instancio.version>
<wiremock.version>3.9.1</wiremock.version>
<spotless.version>2.43.0</spotless.version>
<spring-shell.version>3.3.1</spring-shell.version>
</properties>
<modules>
......@@ -116,6 +118,18 @@
<artifactId>wiremock-jetty12</artifactId>
<version>${wiremock.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-starter</artifactId>
<version>${spring-shell.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-dependencies</artifactId>
<version>${spring-shell.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
......@@ -153,6 +167,21 @@
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate.version}</version>
</path>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct.version}</version>
</dependency>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
......
......@@ -6,7 +6,7 @@
<parent>
<groupId>com.aruba.simpl</groupId>
<artifactId>simpl-parent</artifactId>
<version>0.0.2-SNAPSHOT</version>
<version>0.0.4-SNAPSHOT</version>
</parent>
<artifactId>simpl-commons-data</artifactId>
......@@ -21,6 +21,11 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.aruba.simpl.common.model.dto;
import java.time.LocalDate;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class CertificateDTO {
private String publicKey;
private LocalDate expiryDate;
}
......@@ -2,7 +2,11 @@ package com.aruba.simpl.common.model.dto;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class CertificateRequest {
@Email
@NotBlank
......@@ -10,22 +14,4 @@ public class CertificateRequest {
@NotBlank
private String organization;
public String getEmail() {
return email;
}
public CertificateRequest setEmail(String email) {
this.email = email;
return this;
}
public String getOrganization() {
return organization;
}
public CertificateRequest setOrganization(String organization) {
this.organization = organization;
return this;
}
}
package com.aruba.simpl.common.model.dto;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class CredentialDTO {
private String publicKey;
}
package com.aruba.simpl.common.model.dto;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class ErrorDTO {
private String error;
private String elementName;
public String getError() {
return error;
}
public ErrorDTO setError(String error) {
this.error = error;
return this;
}
public String getElementName() {
return elementName;
}
public ErrorDTO setElementName(String elementName) {
this.elementName = elementName;
return this;
}
}
......@@ -4,10 +4,16 @@ import com.aruba.simpl.common.model.enums.ParticipantType;
import com.aruba.simpl.common.model.validators.CreateOperation;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotBlank;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.util.Set;
import java.util.UUID;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class IdentityAttributeDTO {
private UUID id;
......@@ -20,106 +26,31 @@ public class IdentityAttributeDTO {
private String description;
@Getter(AccessLevel.NONE)
private Boolean assignableToRoles;
@Getter(AccessLevel.NONE)
private Boolean enabled;
private ZonedDateTime creationTimestamp;
private Instant creationTimestamp;
private ZonedDateTime updateTimestamp;
private Instant updateTimestamp;
private Set<ParticipantType> participantTypes;
@Getter(AccessLevel.NONE)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Boolean used;
public UUID getId() {
return id;
}
public IdentityAttributeDTO setId(UUID id) {
this.id = id;
return this;
}
public String getCode() {
return code;
}
public IdentityAttributeDTO setCode(String code) {
this.code = code;
return this;
}
public String getName() {
return name;
}
public IdentityAttributeDTO setName(String name) {
this.name = name;
return this;
}
public String getDescription() {
return description;
}
public IdentityAttributeDTO setDescription(String description) {
this.description = description;
return this;
}
public Boolean isAssignableToRoles() {
return assignableToRoles;
}
public IdentityAttributeDTO setAssignableToRoles(Boolean assignableToRoles) {
this.assignableToRoles = assignableToRoles;
return this;
}
public Boolean isEnabled() {
return enabled;
}
public IdentityAttributeDTO setEnabled(Boolean enabled) {
this.enabled = enabled;
return this;
}
public ZonedDateTime getCreationTimestamp() {
return creationTimestamp;
}
public IdentityAttributeDTO setCreationTimestamp(ZonedDateTime creationTimestamp) {
this.creationTimestamp = creationTimestamp;
return this;
}
public ZonedDateTime getUpdateTimestamp() {
return updateTimestamp;
}
public IdentityAttributeDTO setUpdateTimestamp(ZonedDateTime updateTimestamp) {
this.updateTimestamp = updateTimestamp;
return this;
}
public Set<ParticipantType> getParticipantTypes() {
return participantTypes;
}
public IdentityAttributeDTO setParticipantTypes(Set<ParticipantType> participantTypes) {
this.participantTypes = participantTypes;
return this;
}
public Boolean isUsed() {
return used;
}
public IdentityAttributeDTO setUsed(Boolean used) {
this.used = used;
return this;
}
}
......@@ -2,7 +2,11 @@ package com.aruba.simpl.common.model.dto;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import jakarta.validation.Valid;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class IdentityAttributeWithOwnershipDTO {
@Valid
......@@ -10,22 +14,4 @@ public class IdentityAttributeWithOwnershipDTO {
public IdentityAttributeDTO identityAttribute;
Boolean assignedToParticipant;
public IdentityAttributeDTO getIdentityAttribute() {
return identityAttribute;
}
public IdentityAttributeWithOwnershipDTO setIdentityAttribute(IdentityAttributeDTO identityAttribute) {
this.identityAttribute = identityAttribute;
return this;
}
public Boolean isAssignedToParticipant() {
return assignedToParticipant;
}
public IdentityAttributeWithOwnershipDTO setAssignedToParticipant(Boolean assignedToParticipant) {
this.assignedToParticipant = assignedToParticipant;
return this;
}
}
package com.aruba.simpl.common.model.dto;
import jakarta.validation.constraints.NotBlank;
public record KeycloakRoleDTO(@NotBlank String name, String description) {}
......@@ -3,7 +3,12 @@ package com.aruba.simpl.common.model.dto;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import java.util.List;
import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class KeycloakUserDTO {
@NotEmpty
......@@ -19,62 +24,9 @@ public class KeycloakUserDTO {
@NotEmpty
private String email;
@ToString.Exclude
@NotEmpty
private String password;
private List<String> roles;
public String getUsername() {
return username;
}
public KeycloakUserDTO setUsername(String username) {
this.username = username;
return this;
}
public String getFirstName() {
return firstName;
}
public KeycloakUserDTO setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public String getLastName() {
return lastName;
}
public KeycloakUserDTO setLastName(String lastName) {
this.lastName = lastName;
return this;
}
public String getEmail() {
return email;
}
public KeycloakUserDTO setEmail(String email) {
this.email = email;
return this;
}
public String getPassword() {
return password;
}
public KeycloakUserDTO setPassword(String password) {
this.password = password;
return this;
}
public List<String> getRoles() {
return roles;
}
public KeycloakUserDTO setRoles(List<String> roles) {
this.roles = roles;
return this;
}
}
......@@ -5,9 +5,14 @@ import com.aruba.simpl.common.model.enums.Status;
import com.aruba.simpl.common.model.validators.CreateOperation;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.time.LocalDate;
import java.util.UUID;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class ParticipantDTO {
private UUID id;
......@@ -22,92 +27,13 @@ public class ParticipantDTO {
private Status status;
private ZonedDateTime creationTimestamp;
private Instant creationTimestamp;
private ZonedDateTime updateTimestamp;
private Instant updateTimestamp;
private String outcomeUserEmail;
private String certificateId;
public UUID getId() {
return id;
}
public ParticipantDTO setId(UUID id) {
this.id = id;
return this;
}
public String getUserEmail() {
return userEmail;
}
public ParticipantDTO setUserEmail(String userEmail) {
this.userEmail = userEmail;
return this;
}
public ParticipantType getParticipantType() {
return participantType;
}
public ParticipantDTO setParticipantType(ParticipantType participantType) {
this.participantType = participantType;
return this;
}
public String getOrganization() {
return organization;
}
public ParticipantDTO setOrganization(String organization) {
this.organization = organization;
return this;
}
public Status getStatus() {
return status;
}
public ParticipantDTO setStatus(Status status) {
this.status = status;
return this;
}
public ZonedDateTime getCreationTimestamp() {
return creationTimestamp;
}
public ParticipantDTO setCreationTimestamp(ZonedDateTime creationTimestamp) {
this.creationTimestamp = creationTimestamp;
return this;
}
public ZonedDateTime getUpdateTimestamp() {
return updateTimestamp;
}
public ParticipantDTO setUpdateTimestamp(ZonedDateTime updateTimestamp) {
this.updateTimestamp = updateTimestamp;
return this;
}
public String getOutcomeUserEmail() {
return outcomeUserEmail;
}
public ParticipantDTO setOutcomeUserEmail(String outcomeUserEmail) {
this.outcomeUserEmail = outcomeUserEmail;
return this;
}
public String getCertificateId() {
return certificateId;
}
public ParticipantDTO setCertificateId(String certificateId) {
this.certificateId = certificateId;
return this;
}
private LocalDate expiryDate;
}
......@@ -2,7 +2,11 @@ package com.aruba.simpl.common.model.dto;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import jakarta.validation.Valid;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class ParticipantExtendedDTO {
@JsonUnwrapped
@Valid
......@@ -11,22 +15,4 @@ public class ParticipantExtendedDTO {
@JsonUnwrapped
@Valid
private KeycloakUserDTO keycloakUser;
public ParticipantDTO getParticipant() {
return participant;
}
public ParticipantExtendedDTO setParticipant(ParticipantDTO participant) {
this.participant = participant;
return this;
}
public KeycloakUserDTO getKeycloakUser() {
return keycloakUser;
}
public ParticipantExtendedDTO setKeycloakUser(KeycloakUserDTO keycloakUser) {
this.keycloakUser = keycloakUser;
return this;
}
}
......@@ -2,28 +2,14 @@ package com.aruba.simpl.common.model.dto;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class ParticipantWithIdentityAttributesDTO {
@JsonUnwrapped
private ParticipantDTO participant;
private List<IdentityAttributeDTO> identityAttributes;
public ParticipantDTO getParticipant() {
return participant;
}
public ParticipantWithIdentityAttributesDTO setParticipant(ParticipantDTO participant) {
this.participant = participant;
return this;
}
public List<IdentityAttributeDTO> getIdentityAttributes() {
return identityAttributes;
}
public ParticipantWithIdentityAttributesDTO setIdentityAttributes(List<IdentityAttributeDTO> identityAttributes) {
this.identityAttributes = identityAttributes;
return this;
}
}
......@@ -4,5 +4,6 @@ public enum ParticipantType {
CONSUMER,
APPLICATION_PROVIDER,
DATA_PROVIDER,
INFRASTRUCTURE_PROVIDER
INFRASTRUCTURE_PROVIDER,
GOVERNANCE_AUTHORITY
}
......@@ -7,7 +7,7 @@
<parent>
<groupId>com.aruba.simpl</groupId>
<artifactId>simpl-parent</artifactId>
<version>0.0.2-SNAPSHOT</version>
<version>0.0.4-SNAPSHOT</version>
</parent>
<artifactId>simpl-spring-boot-starter</artifactId>
......@@ -27,6 +27,11 @@
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
......@@ -57,6 +62,26 @@
<artifactId>java-uuid-generator</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk18on</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.instancio</groupId>
<artifactId>instancio-junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
......@@ -70,6 +95,11 @@
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<version>${spring-boot-processor.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
......
......@@ -38,7 +38,7 @@ public class DefaultSecurityAutoConfiguration {
}
@Bean
@Order
@Order(2)
public SecurityFilterChain defaultSecurityFilterChain(
HttpSecurity http, List<PublicUrlCustomizer> publicUrlCustomizers) throws Exception {
publicUrlCustomizers.forEach(p -> p.accept(PUBLIC_MATCHERS));
......
package com.aruba.simpl.common.autoconfigurations;
import com.aruba.simpl.common.model.constants.HttpHeaders;
import com.aruba.simpl.common.model.dto.IdentityAttributeDTO;
import com.aruba.simpl.common.model.ephemeralproof.JwtEphemeralProofParser;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Component
public class EphemeralProofIdentityAttributeFilter implements Filter {
private final String authorityPrefix;
public EphemeralProofIdentityAttributeFilter(
@Value("${spring.security.oauth2.resourceserver.jwt.authority-prefix:ROLE_}") String authorityPrefix) {
this.authorityPrefix = authorityPrefix;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (request instanceof HttpServletRequest httpServletRequest) {
var jwt = httpServletRequest.getHeader(HttpHeaders.EPHEMERAL_PROOF);
if (StringUtils.hasText(jwt)) {
var epParser = new JwtEphemeralProofParser(jwt);
var authentication = SecurityContextHolder.getContext().getAuthentication();
var authorities = Stream.concat(
epParser.getIdentityAttributes().stream()
.map(IdentityAttributeDTO::getCode)
.map(code -> authorityPrefix + code)
.map(SimpleGrantedAuthority::new),
authentication.getAuthorities().stream())
.toList();
SecurityContextHolder.getContext()
.setAuthentication(new AnonymousAuthenticationToken(
epParser.getSubject().toString(), epParser.getEphemeralProof(), authorities));
}
}
chain.doFilter(request, response);
}
}
package com.aruba.simpl.common.autoconfigurations;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.PropertySource;
@AutoConfiguration
@ConditionalOnWebApplication
@PropertySource("classpath:/properties/hibernate.properties")
public class HibernatePropertiesAutoConfiguration {}
package com.aruba.simpl.common.autoconfigurations;
import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.PropertySource;
@AutoConfiguration
@ConditionalOnWebApplication
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnBean(value = DataSource.class)
@PropertySource("classpath:/properties/jwt.properties")
public class JwtPropertiesAutoConfiguration {}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment