Skip to content

Commit

Permalink
Merge branch 'development' into feature-dm-1190-grant-different-roles…
Browse files Browse the repository at this point in the history
…-in-projects
  • Loading branch information
Steffengreiner authored Mar 22, 2024
2 parents 1420653 + 67ee7d2 commit 1c92548
Show file tree
Hide file tree
Showing 20 changed files with 423 additions and 145 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import life.qbic.identity.domain.model.token.TokenEncoder;

/**
* <b>Password encryption policy</b>
Expand All @@ -17,7 +18,7 @@
*
* @since 1.0.0
*/
public class PasswordEncryptionPolicy {
public class PasswordEncryptionPolicy implements TokenEncoder {

private static final int ITERATION_INDEX =
0; // the index of the iteration count in the encoded password String
Expand Down Expand Up @@ -154,6 +155,16 @@ private static SecretKey createSecretKey(SecretKeyFactory factory, KeySpec keySp
}
}

@Override
public String encode(char[] token) {
return encrypt(token);
}

@Override
public boolean matches(char[] token, String encodedToken) {
return doPasswordsMatch(token, encodedToken);
}

static class EncryptionException extends RuntimeException {

EncryptionException(String reason, Exception cause) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ public class PersonalAccessToken {
private Instant creationDate;
private Duration duration;

private static final TokenEncoder TOKEN_ENCODER = PasswordEncryptionPolicy.instance();

protected PersonalAccessToken() {
}

Expand All @@ -54,9 +56,8 @@ private PersonalAccessToken(String userId, String description, Duration duration

public static PersonalAccessToken create(String userId, String description, Duration duration,
String secret) {
return new PersonalAccessToken(userId, description, duration,
PasswordEncryptionPolicy.instance().encrypt(
secret.toCharArray()));
return new PersonalAccessToken(userId, description, duration, TOKEN_ENCODER.encode(
secret.toCharArray()));
}

public String description() {
Expand Down Expand Up @@ -109,7 +110,7 @@ public int hashCode() {
}

public boolean matches(String rawToken) {
return PasswordEncryptionPolicy.instance().doPasswordsMatch(rawToken.toCharArray(), this.tokenValueEncrypted);
return TOKEN_ENCODER.matches(rawToken.toCharArray(), this.tokenValueEncrypted);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package life.qbic.identity.domain.model.token;

/**
* Encodes Access Tokens.
*/
public interface TokenEncoder {

String encode(char[] token);

boolean matches(char[] token, String encodedToken);
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ private Specification<ProteomicsMeasurement> generateProteomicsFilterSpecificati
filter);
Specification<ProteomicsMeasurement> facilityContains = ProteomicsMeasurementSpec.isFacility(
filter);
Specification<ProteomicsMeasurement> fractionContains = ProteomicsMeasurementSpec.isFraction(
filter);
Specification<ProteomicsMeasurement> digestionMethodContains = ProteomicsMeasurementSpec.isDigestionMethod(
filter);
Specification<ProteomicsMeasurement> digestionEnzymeContains = ProteomicsMeasurementSpec.isDigestionEnzyme(
Expand All @@ -93,6 +95,8 @@ private Specification<ProteomicsMeasurement> generateProteomicsFilterSpecificati
filter);
Specification<ProteomicsMeasurement> lcmsMethodContains = ProteomicsMeasurementSpec.isLcmsMethod(
filter);
Specification<ProteomicsMeasurement> registrationDateContains = ProteomicsMeasurementSpec.isRegistrationDate(
filter);
Specification<ProteomicsMeasurement> commentContains = ProteomicsMeasurementSpec.isComment(
filter);

Expand All @@ -113,6 +117,7 @@ private Specification<ProteomicsMeasurement> generateProteomicsFilterSpecificati
injectionVolumeContains,
lcColumnContains,
lcmsMethodContains,
registrationDateContains,
commentContains);
return Specification.where(isBlankSpec)
.and(containsSampleId)
Expand Down Expand Up @@ -220,6 +225,11 @@ public static Specification<ProteomicsMeasurement> isFacility(String filter) {
builder.like(root.get("facility"), "%" + filter + "%");
}

public static Specification<ProteomicsMeasurement> isFraction(String filter) {
return (root, query, builder) ->
builder.like(root.get("fraction"), "%" + filter + "%");
}

public static Specification<ProteomicsMeasurement> isDigestionMethod(String filter) {
return (root, query, builder) ->
builder.like(root.get("digestionMethod"), "%" + filter + "%");
Expand Down Expand Up @@ -270,10 +280,10 @@ public static Specification<ProteomicsMeasurement> isSamplePoolGroup(String filt
builder.like(root.get("samplePool"), "%" + filter + "%");
}

// public static Specification<ProteomicsMeasurement> isRegistrationDate(String filter){
// return (root, query, builder) ->
// builder.like(root.get("registration"), "%" + filter + "%");
// }
public static Specification<ProteomicsMeasurement> isRegistrationDate(String filter){
return (root, query, builder) ->
builder.like(root.get("registration").as(String.class), "%" + filter + "%");
}
}

private static class NgsMeasurementSpec {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,8 @@ private Result<MeasurementId, ResponseCode> registerPxP(

measurement.setLabeling(labelingMethod);

measurement.setFraction(metadata.fractionName());

var parentCodes = sampleIdCodeEntries.stream().map(SampleIdCodeEntry::sampleCode).toList();

var result = measurementDomainService.addProteomics(measurement, parentCodes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,17 @@
import org.springframework.stereotype.Component;

/**
* <b><class short description - 1 Line!></b>
* <b>Measurement NGS Validator</b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
* <p>Validator employed to check the provided user input for a measurement in the ngs domain.
* The validator checks the for the provision of mandatory information, and will return a ValidationResult
* dependent on the presence or absence of data
* </p>
*
* @since <version tag>
*/
@Component
public class NGSValidator implements Validator<NGSMeasurementMetadata> {
public class MeasurementNGSValidator implements
MeasurementValidator<NGSMeasurementMetadata> {

private static final Set<String> NGS_PROPERTIES = new HashSet<>();

Expand All @@ -33,7 +36,7 @@ public class NGSValidator implements Validator<NGSMeasurementMetadata> {
"note"));
}
@Autowired
public NGSValidator(SampleInformationService sampleInformationService) {
public MeasurementNGSValidator(SampleInformationService sampleInformationService) {
this.sampleInformationService = sampleInformationService;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,24 @@
import org.springframework.stereotype.Component;

/**
* <b><class short description - 1 Line!></b>
* <b>Measurement Proteomics Validator</b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
* <p>Validator employed to check the provided user input for a measurement in the proteomics domain.
* The validator checks the for the provision of mandatory information, and will return a ValidationResult
* dependent on the presence or absence of data
* </p>
*
* @since <version tag>
*/
@Component
public class ProteomicsValidator implements Validator<ProteomicsMeasurementMetadata> {
public class MeasurementProteomicsValidator implements
MeasurementValidator<ProteomicsMeasurementMetadata> {

protected final SampleInformationService sampleInformationService;

protected final OntologyLookupService ontologyLookupService;

@Autowired
public ProteomicsValidator(SampleInformationService sampleInformationService,
public MeasurementProteomicsValidator(SampleInformationService sampleInformationService,
OntologyLookupService ontologyLookupService) {
this.sampleInformationService = Objects.requireNonNull(sampleInformationService);
this.ontologyLookupService = Objects.requireNonNull(ontologyLookupService);
Expand Down Expand Up @@ -129,7 +132,8 @@ ValidationResult validateSampleIds(Collection<SampleCode> sampleCodes) {
return ValidationResult.withFailures(1,
List.of("A measurement must contain at least one sample reference. Provided: none"));
}
ValidationResult validationResult = ValidationResult.successful(0);
ValidationResult validationResult = ValidationResult.successful(
0);
for (SampleCode sample : sampleCodes) {
validationResult = validationResult.combine(validateSampleId(sample));
}
Expand Down Expand Up @@ -158,33 +162,38 @@ ValidationResult validateInstrument(String instrument) {
if (result.isPresent()) {
return ValidationResult.successful(1);
}
return ValidationResult.withFailures(1, List.of(UNKNOWN_INSTRUMENT_ID.formatted(instrument)));
return ValidationResult.withFailures(1,
List.of(UNKNOWN_INSTRUMENT_ID.formatted(instrument)));
}

ValidationResult validateMandatoryDataProvided(
ProteomicsMeasurementMetadata measurementMetadata) {
var validation = ValidationResult.successful(0);
if (measurementMetadata.sampleCodes().isEmpty()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("Sample id: missing sample id reference")));
ValidationResult.withFailures(1,
List.of("Sample id: missing sample id reference")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
if (measurementMetadata.organisationId().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("Organisation: missing mandatory metadata")));
ValidationResult.withFailures(1,
List.of("Organisation: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
if (measurementMetadata.instrumentCURI().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("Instrument: missing mandatory metadata")));
ValidationResult.withFailures(1,
List.of("Instrument: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
if (measurementMetadata.facility().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("Facility: missing mandatory meta;data")));
ValidationResult.withFailures(1,
List.of("Facility: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
Expand Down Expand Up @@ -214,13 +223,15 @@ ValidationResult validateMandatoryDataProvided(
}
if (measurementMetadata.lcColumn().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("LC Column: missing mandatory metadata")));
ValidationResult.withFailures(1,
List.of("LC Column: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
if (measurementMetadata.lcmsMethod().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("LCMS Method: missing mandatory metadata")));
ValidationResult.withFailures(1,
List.of("LCMS Method: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,35 +19,37 @@
* @since 1.0.0
*/
@Service
public class ValidationService {
public class MeasurementValidationService {

private final NGSValidator ngsValidator;
private final MeasurementNGSValidator measurementNgsValidator;

private final ProteomicsValidator pxValidator;
private final MeasurementProteomicsValidator pxpValidator;

@Autowired
public ValidationService(NGSValidator ngsValidator, ProteomicsValidator pxValidator) {
this.ngsValidator = ngsValidator;
this.pxValidator = pxValidator;
public MeasurementValidationService(MeasurementNGSValidator measurementNgsValidator,
MeasurementProteomicsValidator pxpValidator) {
this.measurementNgsValidator = measurementNgsValidator;
this.pxpValidator = pxpValidator;
}

public ValidationResult validateNGS(NGSMeasurementMetadata ngsMeasurementMetadata) {
return ngsValidator.validate(ngsMeasurementMetadata);
return measurementNgsValidator.validate(ngsMeasurementMetadata);
}

public ValidationResult validateProteomics(ProteomicsMeasurementMetadata pxMeasurementMetadata) {
return pxValidator.validate(pxMeasurementMetadata);
public ValidationResult validateProteomics(
ProteomicsMeasurementMetadata pxMeasurementMetadata) {
return pxpValidator.validate(pxMeasurementMetadata);
}

public Optional<Domain> inferDomainByPropertyTypes(Collection<String> propertyTypes) {
return Optional.ofNullable(determinDomain(propertyTypes));
}

private static Domain determinDomain(Collection<String> propertyTypes) {
if (NGSValidator.isNGS(propertyTypes)) {
if (MeasurementNGSValidator.isNGS(propertyTypes)) {
return Domain.NGS;
}
if (ProteomicsValidator.isProteomics(propertyTypes)) {
if (MeasurementProteomicsValidator.isProteomics(propertyTypes)) {
return Domain.PROTEOMICS;
}
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package life.qbic.projectmanagement.application.measurement.validation;

import life.qbic.projectmanagement.application.measurement.MeasurementMetadata;

/**
* <b>Measurement Validator</b>
*
* <p>Validation interface employed to check the provided user input for a measurement.
* Implementations of this interface are supposed to be domain specific and will
* return a ValidationResult dependent on the presence or absence of data
* </p>
*
*/
public interface MeasurementValidator<T extends MeasurementMetadata> {

ValidationResult validate(T measurementMetadata);

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
import java.util.stream.Stream;

/**
* <b><class short description - 1 Line!></b>
* <b>Validation Result</b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
* <p>Validation Result in a measurement context which contains an extendable collection of Strings
* indicating failure or warnings occurring during the measurement validation
* </p>
*
* @since <version tag>
*/
public class ValidationResult {

Expand Down Expand Up @@ -49,7 +50,8 @@ public static ValidationResult withFailures(int validatedEntries,
return new ValidationResult(validatedEntries, new ArrayList<>(), failureReports);
}

public static ValidationResult successful(int validatedEntries, Collection<String> warnings) {
public static ValidationResult successful(int validatedEntries,
Collection<String> warnings) {
return new ValidationResult(validatedEntries, warnings, new ArrayList<>());
}

Expand Down

This file was deleted.

Loading

0 comments on commit 1c92548

Please sign in to comment.