Skip to content

Commit

Permalink
split validation in several methods #3133
Browse files Browse the repository at this point in the history
  • Loading branch information
lorriborri committed May 22, 2024
1 parent 702299a commit f008140
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ public enum SecHubConfigurationModelValidationError {

METADATA_LABEL_KEY_CONTAINS_ILLEGAL_CHARACTERS("Meta data label key contains illegal characters."),

REMOTE_DATA_MULTI_CONFIGURATION_NOT_ALLOWED("Remote data configuration is not allowed for multiple data configurations."),
REMOTE_DATA_CONFIGURATION_ONLY_FOR_ONE_SOURCE_OR_BINARY("Remote data configuration is only allowed for ONE source or for ONE binary."),

REMOTE_DATA_MIXED_WITH_FILESYSTEM_NOT_ALLOWED("Remote data configuration is not allowed to be mixed with filesystem."),

REMOTE_DATA_CONFIGURATION_LOCATION_NOT_DEFINED("Remote data configuration location is not defined."),

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -516,8 +516,11 @@ private void handleDataConfiguration(InternalValidationContext context) {
validateNameUniqueAndNotNull(context, data.getSources());
validateNameUniqueAndNotNull(context, data.getBinaries());

validateRemoteDataSection(context, data.getSources());
validateRemoteDataSection(context, data.getBinaries());
List<SecHubDataConfigurationObject> sourcesAndBinaries = new ArrayList<SecHubDataConfigurationObject>();
sourcesAndBinaries.addAll(data.getSources());
sourcesAndBinaries.addAll(data.getBinaries());

validateRemoteDataConfiguration(context, sourcesAndBinaries);
}

private void validateNameUniqueAndNotNull(InternalValidationContext context, Collection<? extends SecHubDataConfigurationObject> configurationObjects) {
Expand Down Expand Up @@ -554,46 +557,77 @@ private void validateNameUniqueAndNotNull(InternalValidationContext context, Col

}

private void validateRemoteDataSection(InternalValidationContext context, Collection<? extends SecHubDataConfigurationObject> configurationObjects) {
private void validateRemoteDataConfiguration(InternalValidationContext context, Collection<? extends SecHubDataConfigurationObject> sourcesAndBinaries) {

SecHubConfigurationModelValidationResult result = context.result;

for (SecHubDataConfigurationObject configurationObject : configurationObjects) {
Optional<SecHubRemoteDataConfiguration> optRemoteData = configurationObject.getRemote();
validateOnlyOneRemoteSourceOrBinary(sourcesAndBinaries, result);
validateRemoteAndFileSystemAreNotMixed(sourcesAndBinaries, result);
validateRemoteData(sourcesAndBinaries, result);
}

private void validateOnlyOneRemoteSourceOrBinary(Collection<? extends SecHubDataConfigurationObject> sourcesAndBinaries,
SecHubConfigurationModelValidationResult result) {
for (SecHubDataConfigurationObject sourceOrBinary : sourcesAndBinaries) {
Optional<SecHubRemoteDataConfiguration> optRemoteData = sourceOrBinary.getRemote();

if (optRemoteData.isEmpty()) {
// no remote data is configured
return;
continue;
}

if (configurationObjects.size() > 1) {
// remote data is configured with multiple configurations (filesystem or second
// remote)
result.addError(REMOTE_DATA_MULTI_CONFIGURATION_NOT_ALLOWED);
// When using a remote data section it is only possible to define ONE binary or
// ONE source definition.
// Means also: It is only possible to define ONE remote data section.
boolean onlyOneBinaryOrOneSource = sourcesAndBinaries.size() == 1;
if (!onlyOneBinaryOrOneSource) {
result.addError(REMOTE_DATA_CONFIGURATION_ONLY_FOR_ONE_SOURCE_OR_BINARY);
break;
}
}
}

validateRemoteData(configurationObject, result, optRemoteData);
private void validateRemoteAndFileSystemAreNotMixed(Collection<? extends SecHubDataConfigurationObject> sourcesAndBinaries,
SecHubConfigurationModelValidationResult result) {
boolean containsFileSystem = false;
boolean containsRemote = false;

for (SecHubDataConfigurationObject sourceOrBinary : sourcesAndBinaries) {
containsRemote = containsRemote || sourceOrBinary.getRemote().isPresent();
if (sourceOrBinary instanceof SecHubFileSystemContainer) {
containsFileSystem = containsFileSystem || ((SecHubFileSystemContainer) sourceOrBinary).getFileSystem().isPresent();
}
}
if (containsFileSystem && containsRemote) {
result.addError(REMOTE_DATA_MIXED_WITH_FILESYSTEM_NOT_ALLOWED);
}
}

private void validateRemoteData(SecHubDataConfigurationObject configurationObject, SecHubConfigurationModelValidationResult result, Optional<SecHubRemoteDataConfiguration> optRemoteData) {
String uniqueName = configurationObject.getUniqueName();
SecHubRemoteDataConfiguration remoteData = optRemoteData.get();
private void validateRemoteData(Collection<? extends SecHubDataConfigurationObject> sourcesAndBinaries, SecHubConfigurationModelValidationResult result) {
for (SecHubDataConfigurationObject sourceOrBinary : sourcesAndBinaries) {
Optional<SecHubRemoteDataConfiguration> optRemoteData = sourceOrBinary.getRemote();

if (optRemoteData.isEmpty()) {
// no remote data is configured
continue;
}

String uniqueName = sourceOrBinary.getUniqueName();
SecHubRemoteDataConfiguration remoteData = optRemoteData.get();

if (remoteData.getLocation() == null || remoteData.getLocation().isBlank()) {
result.addError(REMOTE_DATA_CONFIGURATION_LOCATION_NOT_DEFINED, "Remote data location is not defined for " + uniqueName);
}

if (remoteData.getLocation() == null || remoteData.getLocation().isEmpty()) {
result.addError(REMOTE_DATA_CONFIGURATION_LOCATION_NOT_DEFINED, "Remote data location is not defined for " + uniqueName);
validateRemoteDataCredentials(result, remoteData, uniqueName);
}
}

private void validateRemoteDataCredentials(SecHubConfigurationModelValidationResult result, SecHubRemoteDataConfiguration remoteData, String uniqueName) {
if (remoteData.getCredentials().isEmpty()) {
// credentials don't need to be defined for public accessible remote data
return;
}

validateRemoteDataCredentials(result, remoteData, uniqueName);
}

private void validateRemoteDataCredentials(SecHubConfigurationModelValidationResult result, SecHubRemoteDataConfiguration remoteData, String uniqueName) {
SecHubRemoteCredentialConfiguration remoteCredential = remoteData.getCredentials().get();
if (remoteCredential.getUser().isEmpty()) {
result.addError(REMOTE_DATA_CONFIGURATION_USER_NOT_DEFINED, "Remote data configuration credentials: no user is defined for " + uniqueName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1631,7 +1631,7 @@ void when_remote_sechub_configuration_is_valid_no_errors_are_reported(String fil
}

@Test
void when_multiple_remote_configurations_are_configured_error_REMOTE_DATA_MULTI_CONFIGURATION_NOT_ALLOWED() {
void when_multiple_remote_configurations_are_configured_error_REMOTE_DATA_CONFIGURATION_ONLY_FOR_ONE_SOURCE_OR_BINARY() {
/* prepare */
String json = TestFileReader.loadTextFile("src/test/resources/sechub_remote_data_config_invalid_multi_config.json");
SecHubScanConfiguration sechubConfiguration = SecHubScanConfiguration.createFromJSON(json);
Expand All @@ -1642,7 +1642,7 @@ void when_multiple_remote_configurations_are_configured_error_REMOTE_DATA_MULTI_

/* test */
assertTrue(result.hasErrors());
assertHasError(result, REMOTE_DATA_MULTI_CONFIGURATION_NOT_ALLOWED);
assertHasError(result, REMOTE_DATA_CONFIGURATION_ONLY_FOR_ONE_SOURCE_OR_BINARY);
}

@Test
Expand Down Expand Up @@ -1706,7 +1706,7 @@ void when_remote_configuration_credential_user_has_no_password_error_REMOTE_DATA
}

@Test
void when_remote_configuration_is_mixed_with_filesystem_REMOTE_DATA_MIXED_CONFIGURATION_NOT_ALLOWED() {
void when_remote_configuration_is_mixed_with_filesystem_REMOTE_REMOTE_DATA_MIXED_WITH_FILESYSTEM_NOT_ALLOWED() {
/* prepare */
String json = TestFileReader.loadTextFile("src/test/resources/sechub_remote_data_config_invalid_config_with_filesystem.json");
SecHubScanConfiguration sechubConfiguration = SecHubScanConfiguration.createFromJSON(json);
Expand All @@ -1717,7 +1717,23 @@ void when_remote_configuration_is_mixed_with_filesystem_REMOTE_DATA_MIXED_CONFIG

/* test */
assertTrue(result.hasErrors());
assertHasError(result, REMOTE_DATA_MULTI_CONFIGURATION_NOT_ALLOWED);
assertHasError(result, REMOTE_DATA_MIXED_WITH_FILESYSTEM_NOT_ALLOWED);
}

@Test
void when_remote_data_is_configured_for_binaries_and_sources_error() {
/* prepare */
String json = TestFileReader.loadTextFile("src/test/resources/sechub_remote_data_config_invalid_source_and_binaries.json");
SecHubScanConfiguration sechubConfiguration = SecHubScanConfiguration.createFromJSON(json);
modelSupportCollectedScanTypes.add(ScanType.CODE_SCAN);

/* execute */
SecHubConfigurationModelValidationResult result = validatorToTest.validateRemoteData(sechubConfiguration);

/* test */
assertTrue(result.hasErrors());
assertHasError(result, REMOTE_DATA_CONFIGURATION_ONLY_FOR_ONE_SOURCE_OR_BINARY);

}

private SecHubConfigurationModel createSecHubConfigModelWithExactly8193Characters() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@
"apiVersion": "1.0",
"data": {
"sources": [
{
"name": "filesystem_example_1",
"fileSystem" : {
"folders" : [ "myProject/src" ]
}
},
{
"name": "remote_example_name",
"remote": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"apiVersion": "1.0",
"data": {
"sources": [
{
"name": "remote_example_name",
"remote": {
"location": "remote_example_location",
"type": "git",
"credentials": {
"user": {
"name": "my-example-user",
"password": "my-example-password"
}
}
}
}
],
"binaries": [
{
"name": "binary_example_name",
"remote": {
"location": "remote_example_location",
"type": "docker"
}
}
]
},
"codeScan": {
"use": [
"remote_example_name", "binary_example_name"
]
}
}

0 comments on commit f008140

Please sign in to comment.