mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-07-23 09:22:18 +00:00
Fix #11673: Service connection details will be viewable based on view permissions and by default masked for users and unmasked for bots (#11738)
This commit is contained in:
parent
15552b50e9
commit
160984baf1
@ -278,10 +278,6 @@ secretsManagerConfiguration:
|
|||||||
accessKeyId: ${OM_SM_ACCESS_KEY_ID:-""}
|
accessKeyId: ${OM_SM_ACCESS_KEY_ID:-""}
|
||||||
secretAccessKey: ${OM_SM_ACCESS_KEY:-""}
|
secretAccessKey: ${OM_SM_ACCESS_KEY:-""}
|
||||||
|
|
||||||
security:
|
|
||||||
# it will mask all the password fields in the responses sent from the API except for the bots
|
|
||||||
maskPasswordsAPI: ${MASK_PASSWORDS_API:-false}
|
|
||||||
|
|
||||||
health:
|
health:
|
||||||
delayedShutdownHandlerEnabled: true
|
delayedShutdownHandlerEnabled: true
|
||||||
shutdownWaitPeriod: 1s
|
shutdownWaitPeriod: 1s
|
||||||
|
@ -140,7 +140,7 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
|
|||||||
catalogConfig.getSecretsManagerConfiguration(), catalogConfig.getClusterName());
|
catalogConfig.getSecretsManagerConfiguration(), catalogConfig.getClusterName());
|
||||||
|
|
||||||
// init Entity Masker
|
// init Entity Masker
|
||||||
EntityMaskerFactory.createEntityMasker(catalogConfig.getSecurityConfiguration());
|
EntityMaskerFactory.createEntityMasker();
|
||||||
|
|
||||||
// Instantiate JWT Token Generator
|
// Instantiate JWT Token Generator
|
||||||
JWTTokenGenerator.getInstance().init(catalogConfig.getJwtTokenConfiguration());
|
JWTTokenGenerator.getInstance().init(catalogConfig.getJwtTokenConfiguration());
|
||||||
|
@ -32,7 +32,6 @@ import org.openmetadata.schema.api.security.AuthenticationConfiguration;
|
|||||||
import org.openmetadata.schema.api.security.AuthorizerConfiguration;
|
import org.openmetadata.schema.api.security.AuthorizerConfiguration;
|
||||||
import org.openmetadata.schema.api.security.jwt.JWTTokenConfiguration;
|
import org.openmetadata.schema.api.security.jwt.JWTTokenConfiguration;
|
||||||
import org.openmetadata.schema.email.SmtpSettings;
|
import org.openmetadata.schema.email.SmtpSettings;
|
||||||
import org.openmetadata.schema.security.SecurityConfiguration;
|
|
||||||
import org.openmetadata.schema.security.secrets.SecretsManagerConfiguration;
|
import org.openmetadata.schema.security.secrets.SecretsManagerConfiguration;
|
||||||
import org.openmetadata.schema.service.configuration.elasticsearch.ElasticSearchConfiguration;
|
import org.openmetadata.schema.service.configuration.elasticsearch.ElasticSearchConfiguration;
|
||||||
import org.openmetadata.service.migration.MigrationConfiguration;
|
import org.openmetadata.service.migration.MigrationConfiguration;
|
||||||
@ -85,9 +84,6 @@ public class OpenMetadataApplicationConfig extends Configuration {
|
|||||||
@JsonProperty("secretsManagerConfiguration")
|
@JsonProperty("secretsManagerConfiguration")
|
||||||
private SecretsManagerConfiguration secretsManagerConfiguration;
|
private SecretsManagerConfiguration secretsManagerConfiguration;
|
||||||
|
|
||||||
@JsonProperty("security")
|
|
||||||
private SecurityConfiguration securityConfiguration;
|
|
||||||
|
|
||||||
@JsonProperty("eventMonitoringConfiguration")
|
@JsonProperty("eventMonitoringConfiguration")
|
||||||
private EventMonitorConfiguration eventMonitorConfiguration;
|
private EventMonitorConfiguration eventMonitorConfiguration;
|
||||||
|
|
||||||
|
@ -23,11 +23,13 @@ import org.openmetadata.schema.ServiceConnectionEntityInterface;
|
|||||||
import org.openmetadata.schema.ServiceEntityInterface;
|
import org.openmetadata.schema.ServiceEntityInterface;
|
||||||
import org.openmetadata.schema.entity.services.ServiceType;
|
import org.openmetadata.schema.entity.services.ServiceType;
|
||||||
import org.openmetadata.schema.type.Include;
|
import org.openmetadata.schema.type.Include;
|
||||||
|
import org.openmetadata.service.exception.InvalidServiceConnectionException;
|
||||||
import org.openmetadata.service.exception.UnhandledServerException;
|
import org.openmetadata.service.exception.UnhandledServerException;
|
||||||
import org.openmetadata.service.jdbi3.ServiceEntityRepository;
|
import org.openmetadata.service.jdbi3.ServiceEntityRepository;
|
||||||
import org.openmetadata.service.resources.EntityResource;
|
import org.openmetadata.service.resources.EntityResource;
|
||||||
import org.openmetadata.service.secrets.SecretsManager;
|
import org.openmetadata.service.secrets.SecretsManager;
|
||||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
|
import org.openmetadata.service.secrets.SecretsManagerFactory;
|
||||||
|
import org.openmetadata.service.secrets.SecretsUtil;
|
||||||
import org.openmetadata.service.secrets.masker.EntityMaskerFactory;
|
import org.openmetadata.service.secrets.masker.EntityMaskerFactory;
|
||||||
import org.openmetadata.service.security.Authorizer;
|
import org.openmetadata.service.security.Authorizer;
|
||||||
import org.openmetadata.service.util.JsonUtils;
|
import org.openmetadata.service.util.JsonUtils;
|
||||||
@ -51,9 +53,6 @@ public abstract class ServiceEntityResource<
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected T decryptOrNullify(SecurityContext securityContext, T service) {
|
protected T decryptOrNullify(SecurityContext securityContext, T service) {
|
||||||
if (!authorizer.decryptSecret(securityContext)) {
|
|
||||||
return nullifyRequiredConnectionParameters(service);
|
|
||||||
}
|
|
||||||
service
|
service
|
||||||
.getConnection()
|
.getConnection()
|
||||||
.setConfig(retrieveServiceConnectionConfig(service, authorizer.shouldMaskPasswords(securityContext)));
|
.setConfig(retrieveServiceConnectionConfig(service, authorizer.shouldMaskPasswords(securityContext)));
|
||||||
@ -95,17 +94,27 @@ public abstract class ServiceEntityResource<
|
|||||||
serviceEntityRepository.setFullyQualifiedName(service);
|
serviceEntityRepository.setFullyQualifiedName(service);
|
||||||
T originalService =
|
T originalService =
|
||||||
serviceEntityRepository.findByNameOrNull(service.getFullyQualifiedName(), null, Include.NON_DELETED);
|
serviceEntityRepository.findByNameOrNull(service.getFullyQualifiedName(), null, Include.NON_DELETED);
|
||||||
if (originalService != null && originalService.getConnection() != null) {
|
String connectionType = extractServiceType(service);
|
||||||
Object serviceConnectionConfig =
|
try {
|
||||||
EntityMaskerFactory.getEntityMasker()
|
if (originalService != null && originalService.getConnection() != null) {
|
||||||
.unmaskServiceConnectionConfig(
|
Object serviceConnectionConfig =
|
||||||
service.getConnection().getConfig(),
|
EntityMaskerFactory.getEntityMasker()
|
||||||
originalService.getConnection().getConfig(),
|
.unmaskServiceConnectionConfig(
|
||||||
extractServiceType(service),
|
service.getConnection().getConfig(),
|
||||||
serviceType);
|
originalService.getConnection().getConfig(),
|
||||||
service.getConnection().setConfig(serviceConnectionConfig);
|
connectionType,
|
||||||
|
serviceType);
|
||||||
|
service.getConnection().setConfig(serviceConnectionConfig);
|
||||||
|
}
|
||||||
|
return service;
|
||||||
|
} catch (Exception e) {
|
||||||
|
String message = SecretsUtil.buildExceptionMessageConnectionMask(e.getMessage(), connectionType, false);
|
||||||
|
if (message != null) {
|
||||||
|
throw new InvalidServiceConnectionException(message);
|
||||||
|
}
|
||||||
|
throw InvalidServiceConnectionException.byMessage(
|
||||||
|
connectionType, String.format("Failed to unmask connection instance of %s", connectionType));
|
||||||
}
|
}
|
||||||
return service;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract T nullifyConnection(T service);
|
protected abstract T nullifyConnection(T service);
|
||||||
|
@ -15,7 +15,6 @@ package org.openmetadata.service.secrets.masker;
|
|||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.openmetadata.schema.security.SecurityConfiguration;
|
|
||||||
|
|
||||||
public class EntityMaskerFactory {
|
public class EntityMaskerFactory {
|
||||||
@Getter private static EntityMasker entityMasker;
|
@Getter private static EntityMasker entityMasker;
|
||||||
@ -23,12 +22,11 @@ public class EntityMaskerFactory {
|
|||||||
private EntityMaskerFactory() {}
|
private EntityMaskerFactory() {}
|
||||||
|
|
||||||
/** Expected to be called only once when the Application starts */
|
/** Expected to be called only once when the Application starts */
|
||||||
public static EntityMasker createEntityMasker(SecurityConfiguration config) {
|
public static EntityMasker createEntityMasker() {
|
||||||
if (entityMasker != null) {
|
if (entityMasker != null) {
|
||||||
return entityMasker;
|
return entityMasker;
|
||||||
}
|
}
|
||||||
entityMasker =
|
entityMasker = new PasswordEntityMasker();
|
||||||
Boolean.TRUE.equals(config.getMaskPasswordsAPI()) ? new PasswordEntityMasker() : new NoopEntityMasker();
|
|
||||||
return entityMasker;
|
return entityMasker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2021 Collate
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.openmetadata.service.secrets.masker;
|
|
||||||
|
|
||||||
import org.openmetadata.schema.entity.automations.Workflow;
|
|
||||||
import org.openmetadata.schema.entity.services.ServiceType;
|
|
||||||
import org.openmetadata.schema.entity.services.ingestionPipelines.IngestionPipeline;
|
|
||||||
import org.openmetadata.schema.entity.teams.AuthenticationMechanism;
|
|
||||||
|
|
||||||
public class NoopEntityMasker extends EntityMasker {
|
|
||||||
protected NoopEntityMasker() {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object maskServiceConnectionConfig(Object connectionConfig, String connectionType, ServiceType serviceType) {
|
|
||||||
return connectionConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void maskAuthenticationMechanism(String name, AuthenticationMechanism authenticationMechanism) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void maskIngestionPipeline(IngestionPipeline ingestionPipeline) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Workflow maskWorkflow(Workflow workflow) {
|
|
||||||
return workflow;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object unmaskServiceConnectionConfig(
|
|
||||||
Object connectionConfig, Object originalConnectionConfig, String connectionType, ServiceType serviceType) {
|
|
||||||
return connectionConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void unmaskIngestionPipeline(
|
|
||||||
IngestionPipeline ingestionPipeline, IngestionPipeline originalIngestionPipeline) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void unmaskAuthenticationMechanism(
|
|
||||||
String name,
|
|
||||||
AuthenticationMechanism authenticationMechanism,
|
|
||||||
AuthenticationMechanism originalAuthenticationMechanism) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Workflow unmaskWorkflow(Workflow workflow, Workflow originalWorkflow) {
|
|
||||||
return workflow;
|
|
||||||
}
|
|
||||||
}
|
|
@ -31,7 +31,7 @@ import org.openmetadata.service.util.IngestionPipelineBuilder;
|
|||||||
import org.openmetadata.service.util.ReflectionUtil;
|
import org.openmetadata.service.util.ReflectionUtil;
|
||||||
|
|
||||||
public class PasswordEntityMasker extends EntityMasker {
|
public class PasswordEntityMasker extends EntityMasker {
|
||||||
protected static final String PASSWORD_MASK = "*********";
|
public static final String PASSWORD_MASK = "*********";
|
||||||
private static final String NEW_KEY = "";
|
private static final String NEW_KEY = "";
|
||||||
|
|
||||||
protected PasswordEntityMasker() {}
|
protected PasswordEntityMasker() {}
|
||||||
|
@ -30,7 +30,6 @@ import java.io.IOException;
|
|||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import javax.ws.rs.client.WebTarget;
|
import javax.ws.rs.client.WebTarget;
|
||||||
@ -50,10 +49,10 @@ import org.openmetadata.schema.services.connections.dashboard.MetabaseConnection
|
|||||||
import org.openmetadata.schema.type.ChangeDescription;
|
import org.openmetadata.schema.type.ChangeDescription;
|
||||||
import org.openmetadata.schema.type.DashboardConnection;
|
import org.openmetadata.schema.type.DashboardConnection;
|
||||||
import org.openmetadata.service.Entity;
|
import org.openmetadata.service.Entity;
|
||||||
import org.openmetadata.service.fernet.Fernet;
|
|
||||||
import org.openmetadata.service.resources.EntityResourceTest;
|
import org.openmetadata.service.resources.EntityResourceTest;
|
||||||
import org.openmetadata.service.resources.charts.ChartResourceTest;
|
import org.openmetadata.service.resources.charts.ChartResourceTest;
|
||||||
import org.openmetadata.service.resources.services.dashboard.DashboardServiceResource.DashboardServiceList;
|
import org.openmetadata.service.resources.services.dashboard.DashboardServiceResource.DashboardServiceList;
|
||||||
|
import org.openmetadata.service.secrets.masker.PasswordEntityMasker;
|
||||||
import org.openmetadata.service.util.JsonUtils;
|
import org.openmetadata.service.util.JsonUtils;
|
||||||
import org.openmetadata.service.util.TestUtils;
|
import org.openmetadata.service.util.TestUtils;
|
||||||
import org.openmetadata.service.util.TestUtils.UpdateType;
|
import org.openmetadata.service.util.TestUtils.UpdateType;
|
||||||
@ -102,14 +101,14 @@ public class DashboardServiceResourceTest extends EntityResourceTest<DashboardSe
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void put_updateService_as_admin_2xx(TestInfo test) throws IOException, URISyntaxException {
|
void put_updateService_as_admin_2xx(TestInfo test) throws IOException, URISyntaxException {
|
||||||
String secretPassword = "secret:/openmetadata/dashboard/" + getEntityName(test) + "/password";
|
String password = "test12";
|
||||||
DashboardConnection dashboardConnection =
|
DashboardConnection dashboardConnection =
|
||||||
new DashboardConnection()
|
new DashboardConnection()
|
||||||
.withConfig(
|
.withConfig(
|
||||||
new MetabaseConnection()
|
new MetabaseConnection()
|
||||||
.withHostPort(new URI("http://localhost:8080"))
|
.withHostPort(new URI("http://localhost:8080"))
|
||||||
.withUsername("user")
|
.withUsername("user")
|
||||||
.withPassword(secretPassword));
|
.withPassword(password));
|
||||||
DashboardService service =
|
DashboardService service =
|
||||||
createAndCheckEntity(
|
createAndCheckEntity(
|
||||||
createRequest(test).withDescription(null).withConnection(dashboardConnection), ADMIN_AUTH_HEADERS);
|
createRequest(test).withDescription(null).withConnection(dashboardConnection), ADMIN_AUTH_HEADERS);
|
||||||
@ -121,7 +120,7 @@ public class DashboardServiceResourceTest extends EntityResourceTest<DashboardSe
|
|||||||
new MetabaseConnection()
|
new MetabaseConnection()
|
||||||
.withHostPort(new URI("http://localhost:9000"))
|
.withHostPort(new URI("http://localhost:9000"))
|
||||||
.withUsername("user1")
|
.withUsername("user1")
|
||||||
.withPassword(secretPassword));
|
.withPassword(password));
|
||||||
|
|
||||||
CreateDashboardService update =
|
CreateDashboardService update =
|
||||||
createPutRequest(test).withDescription("description1").withConnection(dashboardConnection1);
|
createPutRequest(test).withDescription("description1").withConnection(dashboardConnection1);
|
||||||
@ -139,14 +138,14 @@ public class DashboardServiceResourceTest extends EntityResourceTest<DashboardSe
|
|||||||
assertNotNull(
|
assertNotNull(
|
||||||
JsonUtils.readValue(JsonUtils.pojoToJson(updatedService.getConnection().getConfig()), MetabaseConnection.class)
|
JsonUtils.readValue(JsonUtils.pojoToJson(updatedService.getConnection().getConfig()), MetabaseConnection.class)
|
||||||
.getHostPort());
|
.getHostPort());
|
||||||
assertNull(
|
assertNotNull(
|
||||||
JsonUtils.readValue(JsonUtils.pojoToJson(updatedService.getConnection().getConfig()), MetabaseConnection.class)
|
JsonUtils.readValue(JsonUtils.pojoToJson(updatedService.getConnection().getConfig()), MetabaseConnection.class)
|
||||||
.getUsername());
|
.getUsername());
|
||||||
MetabaseConnection metabaseConnection =
|
MetabaseConnection metabaseConnection =
|
||||||
new MetabaseConnection()
|
new MetabaseConnection()
|
||||||
.withHostPort(new URI("http://localhost:8080"))
|
.withHostPort(new URI("http://localhost:8080"))
|
||||||
.withUsername("user")
|
.withUsername("user")
|
||||||
.withPassword(secretPassword);
|
.withPassword(password);
|
||||||
DashboardConnection dashboardConnection2 = new DashboardConnection().withConfig(metabaseConnection);
|
DashboardConnection dashboardConnection2 = new DashboardConnection().withConfig(metabaseConnection);
|
||||||
update = createPutRequest(test).withDescription("description1").withConnection(dashboardConnection2);
|
update = createPutRequest(test).withDescription("description1").withConnection(dashboardConnection2);
|
||||||
|
|
||||||
@ -196,27 +195,7 @@ public class DashboardServiceResourceTest extends EntityResourceTest<DashboardSe
|
|||||||
.withUsername("admin")
|
.withUsername("admin")
|
||||||
.withPassword("admin")));
|
.withPassword("admin")));
|
||||||
} catch (URISyntaxException e) {
|
} catch (URISyntaxException e) {
|
||||||
e.printStackTrace();
|
LOG.error("Failed to create CreateDashboardService request", e);
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CreateDashboardService createPutRequest(String name) {
|
|
||||||
String secretPassword = "secret:/openmetadata/dashboard/" + name + "/password";
|
|
||||||
try {
|
|
||||||
return new CreateDashboardService()
|
|
||||||
.withName(name)
|
|
||||||
.withServiceType(DashboardServiceType.Metabase)
|
|
||||||
.withConnection(
|
|
||||||
new DashboardConnection()
|
|
||||||
.withConfig(
|
|
||||||
new MetabaseConnection()
|
|
||||||
.withHostPort(new URI("http://localhost:8080"))
|
|
||||||
.withUsername("admin")
|
|
||||||
.withPassword(Fernet.getInstance().encrypt(secretPassword.toLowerCase(Locale.ROOT)))));
|
|
||||||
} catch (URISyntaxException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -279,13 +258,11 @@ public class DashboardServiceResourceTest extends EntityResourceTest<DashboardSe
|
|||||||
JsonUtils.convertValue(actualDashboardConnection.getConfig(), MetabaseConnection.class);
|
JsonUtils.convertValue(actualDashboardConnection.getConfig(), MetabaseConnection.class);
|
||||||
}
|
}
|
||||||
assertEquals(expectedmetabaseConnection.getHostPort(), actualMetabaseConnection.getHostPort());
|
assertEquals(expectedmetabaseConnection.getHostPort(), actualMetabaseConnection.getHostPort());
|
||||||
if (ADMIN_AUTH_HEADERS.equals(authHeaders) || INGESTION_BOT_AUTH_HEADERS.equals(authHeaders)) {
|
assertEquals(expectedmetabaseConnection.getUsername(), actualMetabaseConnection.getUsername());
|
||||||
assertEquals(expectedmetabaseConnection.getUsername(), actualMetabaseConnection.getUsername());
|
if (INGESTION_BOT_AUTH_HEADERS.equals(authHeaders)) {
|
||||||
assertTrue(actualMetabaseConnection.getPassword().startsWith("secret:/openmetadata/dashboard/"));
|
assertEquals(expectedmetabaseConnection.getPassword(), actualMetabaseConnection.getPassword());
|
||||||
assertTrue(actualMetabaseConnection.getPassword().endsWith("/password"));
|
|
||||||
} else {
|
} else {
|
||||||
assertNull(actualMetabaseConnection.getUsername());
|
assertEquals(actualMetabaseConnection.getPassword(), PasswordEntityMasker.PASSWORD_MASK);
|
||||||
assertNull(actualMetabaseConnection.getPassword());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
|||||||
import static org.openmetadata.service.util.EntityUtil.fieldAdded;
|
import static org.openmetadata.service.util.EntityUtil.fieldAdded;
|
||||||
import static org.openmetadata.service.util.EntityUtil.fieldUpdated;
|
import static org.openmetadata.service.util.EntityUtil.fieldUpdated;
|
||||||
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
|
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
|
||||||
import static org.openmetadata.service.util.TestUtils.SNOWFLAKE_DATABASE_CONNECTION;
|
import static org.openmetadata.service.util.TestUtils.INGESTION_BOT_AUTH_HEADERS;
|
||||||
import static org.openmetadata.service.util.TestUtils.TEST_AUTH_HEADERS;
|
import static org.openmetadata.service.util.TestUtils.TEST_AUTH_HEADERS;
|
||||||
import static org.openmetadata.service.util.TestUtils.assertResponseContains;
|
import static org.openmetadata.service.util.TestUtils.assertResponseContains;
|
||||||
|
|
||||||
@ -58,6 +58,7 @@ import org.openmetadata.service.Entity;
|
|||||||
import org.openmetadata.service.resources.EntityResourceTest;
|
import org.openmetadata.service.resources.EntityResourceTest;
|
||||||
import org.openmetadata.service.resources.services.database.DatabaseServiceResource.DatabaseServiceList;
|
import org.openmetadata.service.resources.services.database.DatabaseServiceResource.DatabaseServiceList;
|
||||||
import org.openmetadata.service.resources.services.ingestionpipelines.IngestionPipelineResourceTest;
|
import org.openmetadata.service.resources.services.ingestionpipelines.IngestionPipelineResourceTest;
|
||||||
|
import org.openmetadata.service.secrets.masker.PasswordEntityMasker;
|
||||||
import org.openmetadata.service.util.JsonUtils;
|
import org.openmetadata.service.util.JsonUtils;
|
||||||
import org.openmetadata.service.util.TestUtils;
|
import org.openmetadata.service.util.TestUtils;
|
||||||
import org.openmetadata.service.util.TestUtils.UpdateType;
|
import org.openmetadata.service.util.TestUtils.UpdateType;
|
||||||
@ -137,7 +138,7 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
DatabaseConnection databaseConnection = new DatabaseConnection().withConfig(snowflakeConnection);
|
DatabaseConnection databaseConnection = new DatabaseConnection().withConfig(snowflakeConnection);
|
||||||
update.withConnection(databaseConnection);
|
update.withConnection(databaseConnection);
|
||||||
service = updateEntity(update, OK, ADMIN_AUTH_HEADERS);
|
service = updateEntity(update, OK, ADMIN_AUTH_HEADERS);
|
||||||
validateDatabaseConnection(databaseConnection, service.getConnection(), service.getServiceType());
|
validateDatabaseConnection(databaseConnection, service.getConnection(), service.getServiceType(), true);
|
||||||
ConnectionArguments connectionArguments =
|
ConnectionArguments connectionArguments =
|
||||||
new ConnectionArguments()
|
new ConnectionArguments()
|
||||||
.withAdditionalProperty("credentials", "/tmp/creds.json")
|
.withAdditionalProperty("credentials", "/tmp/creds.json")
|
||||||
@ -149,17 +150,19 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
service = updateEntity(update, OK, ADMIN_AUTH_HEADERS);
|
service = updateEntity(update, OK, ADMIN_AUTH_HEADERS);
|
||||||
// Get the recently updated entity and verify the changes
|
// Get the recently updated entity and verify the changes
|
||||||
service = getEntity(service.getId(), ADMIN_AUTH_HEADERS);
|
service = getEntity(service.getId(), ADMIN_AUTH_HEADERS);
|
||||||
validateDatabaseConnection(databaseConnection, service.getConnection(), service.getServiceType());
|
validateDatabaseConnection(databaseConnection, service.getConnection(), service.getServiceType(), true);
|
||||||
assertEquals("description1", service.getDescription());
|
assertEquals("description1", service.getDescription());
|
||||||
|
// non admin/bot user, password fields must be masked
|
||||||
DatabaseService newService = getEntity(service.getId(), "*", TEST_AUTH_HEADERS);
|
DatabaseService newService = getEntity(service.getId(), "*", TEST_AUTH_HEADERS);
|
||||||
assertEquals(newService.getName(), service.getName());
|
assertEquals(newService.getName(), service.getName());
|
||||||
assertNull(newService.getConnection());
|
validateDatabaseConnection(databaseConnection, newService.getConnection(), newService.getServiceType(), true);
|
||||||
snowflakeConnection.setPassword("test123");
|
snowflakeConnection.setPassword("test123");
|
||||||
databaseConnection.setConfig(snowflakeConnection);
|
databaseConnection.setConfig(snowflakeConnection);
|
||||||
update.withConnection(databaseConnection);
|
update.withConnection(databaseConnection);
|
||||||
service = updateEntity(update, OK, ADMIN_AUTH_HEADERS);
|
service = updateEntity(update, OK, ADMIN_AUTH_HEADERS);
|
||||||
service = getEntity(service.getId(), ADMIN_AUTH_HEADERS);
|
// bot user, password fields must be unmasked.
|
||||||
validateDatabaseConnection(databaseConnection, service.getConnection(), service.getServiceType());
|
service = getEntity(service.getId(), INGESTION_BOT_AUTH_HEADERS);
|
||||||
|
validateDatabaseConnection(databaseConnection, service.getConnection(), service.getServiceType(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -184,7 +187,7 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
assertResponseContains(
|
assertResponseContains(
|
||||||
() -> updateEntity(update, OK, ADMIN_AUTH_HEADERS),
|
() -> updateEntity(update, OK, ADMIN_AUTH_HEADERS),
|
||||||
BAD_REQUEST,
|
BAD_REQUEST,
|
||||||
"InvalidServiceConnectionException for service [Snowflake] due to [Failed to encrypt connection instance of Snowflake]");
|
"InvalidServiceConnectionException for service [Snowflake] due to [Failed to unmask connection instance of Snowflake].");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -280,24 +283,16 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
.withConnection(TestUtils.SNOWFLAKE_DATABASE_CONNECTION);
|
.withConnection(TestUtils.SNOWFLAKE_DATABASE_CONNECTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public CreateDatabaseService createPutRequest(String name) {
|
|
||||||
SnowflakeConnection snowflakeConnection =
|
|
||||||
JsonUtils.convertValue(SNOWFLAKE_DATABASE_CONNECTION.getConfig(), SnowflakeConnection.class);
|
|
||||||
DatabaseConnection databaseConnection =
|
|
||||||
JsonUtils.convertValue(SNOWFLAKE_DATABASE_CONNECTION, DatabaseConnection.class);
|
|
||||||
String secretPassword = "secret:/openmetadata/database/" + name.toLowerCase() + "/password";
|
|
||||||
return new CreateDatabaseService()
|
|
||||||
.withName(name)
|
|
||||||
.withServiceType(DatabaseServiceType.Snowflake)
|
|
||||||
.withConnection(databaseConnection.withConfig(snowflakeConnection.withPassword(secretPassword)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void validateCreatedEntity(
|
public void validateCreatedEntity(
|
||||||
DatabaseService service, CreateDatabaseService createRequest, Map<String, String> authHeaders) {
|
DatabaseService service, CreateDatabaseService createRequest, Map<String, String> authHeaders) {
|
||||||
assertEquals(createRequest.getName(), service.getName());
|
assertEquals(createRequest.getName(), service.getName());
|
||||||
validateDatabaseConnection(createRequest.getConnection(), service.getConnection(), service.getServiceType());
|
boolean maskPasswords = true;
|
||||||
|
if (INGESTION_BOT_AUTH_HEADERS.equals(authHeaders)) {
|
||||||
|
maskPasswords = false;
|
||||||
|
}
|
||||||
|
validateDatabaseConnection(
|
||||||
|
createRequest.getConnection(), service.getConnection(), service.getServiceType(), maskPasswords);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -340,7 +335,8 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
private void validateDatabaseConnection(
|
private void validateDatabaseConnection(
|
||||||
DatabaseConnection expectedDatabaseConnection,
|
DatabaseConnection expectedDatabaseConnection,
|
||||||
DatabaseConnection actualDatabaseConnection,
|
DatabaseConnection actualDatabaseConnection,
|
||||||
DatabaseServiceType databaseServiceType) {
|
DatabaseServiceType databaseServiceType,
|
||||||
|
boolean maskedPasswords) {
|
||||||
// Validate Database Connection if available. We nullify when not admin or bot
|
// Validate Database Connection if available. We nullify when not admin or bot
|
||||||
if (expectedDatabaseConnection != null && actualDatabaseConnection != null) {
|
if (expectedDatabaseConnection != null && actualDatabaseConnection != null) {
|
||||||
if (databaseServiceType == DatabaseServiceType.Mysql) {
|
if (databaseServiceType == DatabaseServiceType.Mysql) {
|
||||||
@ -351,7 +347,7 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
} else {
|
} else {
|
||||||
actualMysqlConnection = JsonUtils.convertValue(actualDatabaseConnection.getConfig(), MysqlConnection.class);
|
actualMysqlConnection = JsonUtils.convertValue(actualDatabaseConnection.getConfig(), MysqlConnection.class);
|
||||||
}
|
}
|
||||||
validateMysqlConnection(expectedMysqlConnection, actualMysqlConnection);
|
validateMysqlConnection(expectedMysqlConnection, actualMysqlConnection, maskedPasswords);
|
||||||
} else if (databaseServiceType == DatabaseServiceType.BigQuery) {
|
} else if (databaseServiceType == DatabaseServiceType.BigQuery) {
|
||||||
BigQueryConnection expectedBigQueryConnection = (BigQueryConnection) expectedDatabaseConnection.getConfig();
|
BigQueryConnection expectedBigQueryConnection = (BigQueryConnection) expectedDatabaseConnection.getConfig();
|
||||||
BigQueryConnection actualBigQueryConnection;
|
BigQueryConnection actualBigQueryConnection;
|
||||||
@ -361,7 +357,7 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
actualBigQueryConnection =
|
actualBigQueryConnection =
|
||||||
JsonUtils.convertValue(actualDatabaseConnection.getConfig(), BigQueryConnection.class);
|
JsonUtils.convertValue(actualDatabaseConnection.getConfig(), BigQueryConnection.class);
|
||||||
}
|
}
|
||||||
validateBigQueryConnection(expectedBigQueryConnection, actualBigQueryConnection);
|
validateBigQueryConnection(expectedBigQueryConnection, actualBigQueryConnection, maskedPasswords);
|
||||||
} else if (databaseServiceType == DatabaseServiceType.Redshift) {
|
} else if (databaseServiceType == DatabaseServiceType.Redshift) {
|
||||||
RedshiftConnection expectedRedshiftConnection = (RedshiftConnection) expectedDatabaseConnection.getConfig();
|
RedshiftConnection expectedRedshiftConnection = (RedshiftConnection) expectedDatabaseConnection.getConfig();
|
||||||
RedshiftConnection actualRedshiftConnection;
|
RedshiftConnection actualRedshiftConnection;
|
||||||
@ -371,7 +367,7 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
actualRedshiftConnection =
|
actualRedshiftConnection =
|
||||||
JsonUtils.convertValue(actualDatabaseConnection.getConfig(), RedshiftConnection.class);
|
JsonUtils.convertValue(actualDatabaseConnection.getConfig(), RedshiftConnection.class);
|
||||||
}
|
}
|
||||||
validateRedshiftConnection(expectedRedshiftConnection, actualRedshiftConnection);
|
validateRedshiftConnection(expectedRedshiftConnection, actualRedshiftConnection, maskedPasswords);
|
||||||
} else if (databaseServiceType == DatabaseServiceType.Snowflake) {
|
} else if (databaseServiceType == DatabaseServiceType.Snowflake) {
|
||||||
SnowflakeConnection expectedSnowflakeConnection = (SnowflakeConnection) expectedDatabaseConnection.getConfig();
|
SnowflakeConnection expectedSnowflakeConnection = (SnowflakeConnection) expectedDatabaseConnection.getConfig();
|
||||||
SnowflakeConnection actualSnowflakeConnection;
|
SnowflakeConnection actualSnowflakeConnection;
|
||||||
@ -381,32 +377,44 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
actualSnowflakeConnection =
|
actualSnowflakeConnection =
|
||||||
JsonUtils.convertValue(actualDatabaseConnection.getConfig(), SnowflakeConnection.class);
|
JsonUtils.convertValue(actualDatabaseConnection.getConfig(), SnowflakeConnection.class);
|
||||||
}
|
}
|
||||||
validateSnowflakeConnection(expectedSnowflakeConnection, actualSnowflakeConnection);
|
validateSnowflakeConnection(expectedSnowflakeConnection, actualSnowflakeConnection, maskedPasswords);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void validateMysqlConnection(
|
public static void validateMysqlConnection(
|
||||||
MysqlConnection expectedMysqlConnection, MysqlConnection actualMysqlConnection) {
|
MysqlConnection expectedMysqlConnection, MysqlConnection actualMysqlConnection, boolean maskedPasswords) {
|
||||||
assertEquals(expectedMysqlConnection.getDatabaseSchema(), actualMysqlConnection.getDatabaseSchema());
|
assertEquals(expectedMysqlConnection.getDatabaseSchema(), actualMysqlConnection.getDatabaseSchema());
|
||||||
assertEquals(expectedMysqlConnection.getHostPort(), actualMysqlConnection.getHostPort());
|
assertEquals(expectedMysqlConnection.getHostPort(), actualMysqlConnection.getHostPort());
|
||||||
assertEquals(expectedMysqlConnection.getUsername(), actualMysqlConnection.getUsername());
|
assertEquals(expectedMysqlConnection.getUsername(), actualMysqlConnection.getUsername());
|
||||||
assertEquals(expectedMysqlConnection.getConnectionOptions(), actualMysqlConnection.getConnectionOptions());
|
assertEquals(expectedMysqlConnection.getConnectionOptions(), actualMysqlConnection.getConnectionOptions());
|
||||||
assertEquals(expectedMysqlConnection.getConnectionArguments(), actualMysqlConnection.getConnectionArguments());
|
assertEquals(expectedMysqlConnection.getConnectionArguments(), actualMysqlConnection.getConnectionArguments());
|
||||||
|
if (maskedPasswords) {
|
||||||
|
assertEquals(actualMysqlConnection.getPassword(), PasswordEntityMasker.PASSWORD_MASK);
|
||||||
|
} else {
|
||||||
|
assertEquals(expectedMysqlConnection.getPassword(), actualMysqlConnection.getPassword());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void validateBigQueryConnection(
|
public static void validateBigQueryConnection(
|
||||||
BigQueryConnection expectedBigQueryConnection, BigQueryConnection actualBigQueryConnection) {
|
BigQueryConnection expectedBigQueryConnection,
|
||||||
|
BigQueryConnection actualBigQueryConnection,
|
||||||
|
boolean maskedPasswords) {
|
||||||
assertEquals(expectedBigQueryConnection.getHostPort(), actualBigQueryConnection.getHostPort());
|
assertEquals(expectedBigQueryConnection.getHostPort(), actualBigQueryConnection.getHostPort());
|
||||||
assertEquals(expectedBigQueryConnection.getCredentials(), actualBigQueryConnection.getCredentials());
|
assertEquals(expectedBigQueryConnection.getCredentials(), actualBigQueryConnection.getCredentials());
|
||||||
assertEquals(expectedBigQueryConnection.getScheme(), actualBigQueryConnection.getScheme());
|
assertEquals(expectedBigQueryConnection.getScheme(), actualBigQueryConnection.getScheme());
|
||||||
assertEquals(
|
assertEquals(
|
||||||
expectedBigQueryConnection.getConnectionArguments(), actualBigQueryConnection.getConnectionArguments());
|
expectedBigQueryConnection.getConnectionArguments(), actualBigQueryConnection.getConnectionArguments());
|
||||||
assertEquals(expectedBigQueryConnection.getConnectionOptions(), actualBigQueryConnection.getConnectionOptions());
|
assertEquals(expectedBigQueryConnection.getConnectionOptions(), actualBigQueryConnection.getConnectionOptions());
|
||||||
|
if (!maskedPasswords) {
|
||||||
|
assertEquals(expectedBigQueryConnection.getCredentials(), actualBigQueryConnection.getCredentials());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void validateRedshiftConnection(
|
public static void validateRedshiftConnection(
|
||||||
RedshiftConnection expectedRedshiftConnection, RedshiftConnection actualRedshiftConnection) {
|
RedshiftConnection expectedRedshiftConnection,
|
||||||
|
RedshiftConnection actualRedshiftConnection,
|
||||||
|
boolean maskedPasswords) {
|
||||||
assertEquals(expectedRedshiftConnection.getHostPort(), actualRedshiftConnection.getHostPort());
|
assertEquals(expectedRedshiftConnection.getHostPort(), actualRedshiftConnection.getHostPort());
|
||||||
assertEquals(expectedRedshiftConnection.getUsername(), actualRedshiftConnection.getUsername());
|
assertEquals(expectedRedshiftConnection.getUsername(), actualRedshiftConnection.getUsername());
|
||||||
assertEquals(expectedRedshiftConnection.getScheme(), actualRedshiftConnection.getScheme());
|
assertEquals(expectedRedshiftConnection.getScheme(), actualRedshiftConnection.getScheme());
|
||||||
@ -414,10 +422,17 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
assertEquals(
|
assertEquals(
|
||||||
expectedRedshiftConnection.getConnectionArguments(), actualRedshiftConnection.getConnectionArguments());
|
expectedRedshiftConnection.getConnectionArguments(), actualRedshiftConnection.getConnectionArguments());
|
||||||
assertEquals(expectedRedshiftConnection.getConnectionOptions(), actualRedshiftConnection.getConnectionOptions());
|
assertEquals(expectedRedshiftConnection.getConnectionOptions(), actualRedshiftConnection.getConnectionOptions());
|
||||||
|
if (maskedPasswords) {
|
||||||
|
assertEquals(actualRedshiftConnection.getPassword(), PasswordEntityMasker.PASSWORD_MASK);
|
||||||
|
} else {
|
||||||
|
assertEquals(expectedRedshiftConnection.getPassword(), actualRedshiftConnection.getPassword());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void validateSnowflakeConnection(
|
public static void validateSnowflakeConnection(
|
||||||
SnowflakeConnection expectedSnowflakeConnection, SnowflakeConnection actualSnowflakeConnection) {
|
SnowflakeConnection expectedSnowflakeConnection,
|
||||||
|
SnowflakeConnection actualSnowflakeConnection,
|
||||||
|
boolean maskedPasswords) {
|
||||||
assertEquals(expectedSnowflakeConnection.getRole(), actualSnowflakeConnection.getRole());
|
assertEquals(expectedSnowflakeConnection.getRole(), actualSnowflakeConnection.getRole());
|
||||||
assertEquals(expectedSnowflakeConnection.getUsername(), actualSnowflakeConnection.getUsername());
|
assertEquals(expectedSnowflakeConnection.getUsername(), actualSnowflakeConnection.getUsername());
|
||||||
assertEquals(expectedSnowflakeConnection.getScheme(), actualSnowflakeConnection.getScheme());
|
assertEquals(expectedSnowflakeConnection.getScheme(), actualSnowflakeConnection.getScheme());
|
||||||
@ -425,5 +440,10 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
|
|||||||
assertEquals(
|
assertEquals(
|
||||||
expectedSnowflakeConnection.getConnectionArguments(), actualSnowflakeConnection.getConnectionArguments());
|
expectedSnowflakeConnection.getConnectionArguments(), actualSnowflakeConnection.getConnectionArguments());
|
||||||
assertEquals(expectedSnowflakeConnection.getConnectionOptions(), actualSnowflakeConnection.getConnectionOptions());
|
assertEquals(expectedSnowflakeConnection.getConnectionOptions(), actualSnowflakeConnection.getConnectionOptions());
|
||||||
|
if (maskedPasswords) {
|
||||||
|
assertEquals(actualSnowflakeConnection.getPassword(), PasswordEntityMasker.PASSWORD_MASK);
|
||||||
|
} else {
|
||||||
|
assertEquals(expectedSnowflakeConnection.getPassword(), actualSnowflakeConnection.getPassword());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,18 +192,6 @@ public class MetadataServiceResourceTest extends EntityResourceTest<MetadataServ
|
|||||||
.withConnection(AMUNDSEN_CONNECTION);
|
.withConnection(AMUNDSEN_CONNECTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public CreateMetadataService createPutRequest(String name) {
|
|
||||||
MetadataConnection metadataConnection = JsonUtils.convertValue(AMUNDSEN_CONNECTION, MetadataConnection.class);
|
|
||||||
AmundsenConnection amundsenConnection =
|
|
||||||
JsonUtils.convertValue(AMUNDSEN_CONNECTION.getConfig(), AmundsenConnection.class);
|
|
||||||
String secretPassword = "secret:/openmetadata/metadata/" + name.toLowerCase() + "/password";
|
|
||||||
return new CreateMetadataService()
|
|
||||||
.withName(name)
|
|
||||||
.withServiceType(CreateMetadataService.MetadataServiceType.Amundsen)
|
|
||||||
.withConnection(metadataConnection.withConfig(amundsenConnection.withPassword(secretPassword)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void validateCreatedEntity(
|
public void validateCreatedEntity(
|
||||||
MetadataService service, CreateMetadataService createRequest, Map<String, String> authHeaders) {
|
MetadataService service, CreateMetadataService createRequest, Map<String, String> authHeaders) {
|
||||||
|
@ -145,7 +145,7 @@ public class PipelineServiceResourceTest extends EntityResourceTest<PipelineServ
|
|||||||
assertNotNull(
|
assertNotNull(
|
||||||
JsonUtils.readValue(JsonUtils.pojoToJson(service.getConnection().getConfig()), AirflowConnection.class)
|
JsonUtils.readValue(JsonUtils.pojoToJson(service.getConnection().getConfig()), AirflowConnection.class)
|
||||||
.getHostPort());
|
.getHostPort());
|
||||||
assertNull(
|
assertNotNull(
|
||||||
JsonUtils.readValue(JsonUtils.pojoToJson(service.getConnection().getConfig()), AirflowConnection.class)
|
JsonUtils.readValue(JsonUtils.pojoToJson(service.getConnection().getConfig()), AirflowConnection.class)
|
||||||
.getConnection());
|
.getConnection());
|
||||||
}
|
}
|
||||||
@ -296,30 +296,18 @@ public class PipelineServiceResourceTest extends EntityResourceTest<PipelineServ
|
|||||||
// We need to get inside the general DatabaseConnection and fetch the MysqlConnection
|
// We need to get inside the general DatabaseConnection and fetch the MysqlConnection
|
||||||
MysqlConnection expectedMysqlConnection = (MysqlConnection) expectedAirflowConnection.getConnection();
|
MysqlConnection expectedMysqlConnection = (MysqlConnection) expectedAirflowConnection.getConnection();
|
||||||
// Use the database service tests utilities for the comparison
|
// Use the database service tests utilities for the comparison
|
||||||
// only admin can see all connection parameters
|
// only bot can see all connection parameters unmasked. Non bot users can see the connection
|
||||||
if (ADMIN_AUTH_HEADERS.equals(authHeaders) || INGESTION_BOT_AUTH_HEADERS.equals(authHeaders)) {
|
// but passwords will be masked
|
||||||
|
if (INGESTION_BOT_AUTH_HEADERS.equals(authHeaders)) {
|
||||||
MysqlConnection actualMysqlConnection =
|
MysqlConnection actualMysqlConnection =
|
||||||
JsonUtils.convertValue(actualAirflowConnection.getConnection(), MysqlConnection.class);
|
JsonUtils.convertValue(actualAirflowConnection.getConnection(), MysqlConnection.class);
|
||||||
validateMysqlConnection(expectedMysqlConnection, actualMysqlConnection);
|
validateMysqlConnection(expectedMysqlConnection, actualMysqlConnection, false);
|
||||||
} else {
|
} else {
|
||||||
assertNotNull(actualAirflowConnection);
|
assertNotNull(actualAirflowConnection);
|
||||||
assertNotNull(actualAirflowConnection.getHostPort());
|
assertNotNull(actualAirflowConnection.getHostPort());
|
||||||
assertNull(actualAirflowConnection.getConnection());
|
MysqlConnection actualMysqlConnection =
|
||||||
|
JsonUtils.convertValue(actualAirflowConnection.getConnection(), MysqlConnection.class);
|
||||||
|
validateMysqlConnection(expectedMysqlConnection, actualMysqlConnection, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public CreatePipelineService createPutRequest(String name) {
|
|
||||||
AirflowConnection airflowConnection =
|
|
||||||
JsonUtils.convertValue(AIRFLOW_CONNECTION.getConfig(), AirflowConnection.class);
|
|
||||||
MysqlConnection mysqlConnection = JsonUtils.convertValue(airflowConnection.getConnection(), MysqlConnection.class);
|
|
||||||
PipelineConnection pipelineConnection = JsonUtils.convertValue(AIRFLOW_CONNECTION, PipelineConnection.class);
|
|
||||||
String secretPassword = "secret:/openmetadata/pipeline/" + name.toLowerCase() + "/connection/password";
|
|
||||||
return new CreatePipelineService()
|
|
||||||
.withName(name)
|
|
||||||
.withServiceType(PipelineServiceType.Airflow)
|
|
||||||
.withConnection(
|
|
||||||
pipelineConnection.withConfig(
|
|
||||||
airflowConnection.withConnection(mysqlConnection.withPassword(secretPassword))));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -206,7 +206,6 @@ public class StorageServiceResourceTest extends EntityResourceTest<StorageServic
|
|||||||
assertEquals(
|
assertEquals(
|
||||||
expectedS3Connection.getAwsConfig().getAwsAccessKeyId(),
|
expectedS3Connection.getAwsConfig().getAwsAccessKeyId(),
|
||||||
actualS3Connection.getAwsConfig().getAwsAccessKeyId());
|
actualS3Connection.getAwsConfig().getAwsAccessKeyId());
|
||||||
assertTrue(actualS3Connection.getAwsConfig().getAwsSecretAccessKey().contains("secret")); // encrypted
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
expectedS3Connection.getAwsConfig().getAwsRegion(), actualS3Connection.getAwsConfig().getAwsRegion());
|
expectedS3Connection.getAwsConfig().getAwsRegion(), actualS3Connection.getAwsConfig().getAwsRegion());
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
|||||||
import static org.openmetadata.service.Entity.FIELD_OWNER;
|
import static org.openmetadata.service.Entity.FIELD_OWNER;
|
||||||
import static org.openmetadata.service.util.EntityUtil.fieldAdded;
|
import static org.openmetadata.service.util.EntityUtil.fieldAdded;
|
||||||
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
|
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
|
||||||
|
import static org.openmetadata.service.util.TestUtils.INGESTION_BOT_AUTH_HEADERS;
|
||||||
import static org.openmetadata.service.util.TestUtils.UpdateType.MINOR_UPDATE;
|
import static org.openmetadata.service.util.TestUtils.UpdateType.MINOR_UPDATE;
|
||||||
import static org.openmetadata.service.util.TestUtils.assertListNotNull;
|
import static org.openmetadata.service.util.TestUtils.assertListNotNull;
|
||||||
import static org.openmetadata.service.util.TestUtils.assertListNull;
|
import static org.openmetadata.service.util.TestUtils.assertListNull;
|
||||||
@ -31,7 +32,6 @@ import java.net.URISyntaxException;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
@ -73,6 +73,7 @@ import org.openmetadata.schema.type.EntityReference;
|
|||||||
import org.openmetadata.service.Entity;
|
import org.openmetadata.service.Entity;
|
||||||
import org.openmetadata.service.resources.EntityResourceTest;
|
import org.openmetadata.service.resources.EntityResourceTest;
|
||||||
import org.openmetadata.service.resources.services.DatabaseServiceResourceTest;
|
import org.openmetadata.service.resources.services.DatabaseServiceResourceTest;
|
||||||
|
import org.openmetadata.service.secrets.masker.PasswordEntityMasker;
|
||||||
import org.openmetadata.service.security.SecurityUtil;
|
import org.openmetadata.service.security.SecurityUtil;
|
||||||
import org.openmetadata.service.util.FullyQualifiedName;
|
import org.openmetadata.service.util.FullyQualifiedName;
|
||||||
import org.openmetadata.service.util.JsonUtils;
|
import org.openmetadata.service.util.JsonUtils;
|
||||||
@ -505,7 +506,7 @@ public class IngestionPipelineResourceTest extends EntityResourceTest<IngestionP
|
|||||||
BigQueryConnection expectedBigQueryConnection = (BigQueryConnection) databaseService.getConnection().getConfig();
|
BigQueryConnection expectedBigQueryConnection = (BigQueryConnection) databaseService.getConnection().getConfig();
|
||||||
BigQueryConnection actualBigQueryConnection =
|
BigQueryConnection actualBigQueryConnection =
|
||||||
JsonUtils.convertValue(updatedService.getConnection().getConfig(), BigQueryConnection.class);
|
JsonUtils.convertValue(updatedService.getConnection().getConfig(), BigQueryConnection.class);
|
||||||
DatabaseServiceResourceTest.validateBigQueryConnection(expectedBigQueryConnection, actualBigQueryConnection);
|
DatabaseServiceResourceTest.validateBigQueryConnection(expectedBigQueryConnection, actualBigQueryConnection, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -607,11 +608,16 @@ public class IngestionPipelineResourceTest extends EntityResourceTest<IngestionP
|
|||||||
DbtS3Config actualDbtS3Config = JsonUtils.convertValue(actualDbtPipeline.getDbtConfigSource(), DbtS3Config.class);
|
DbtS3Config actualDbtS3Config = JsonUtils.convertValue(actualDbtPipeline.getDbtConfigSource(), DbtS3Config.class);
|
||||||
assertEquals(actualDbtS3Config.getDbtSecurityConfig().getAwsAccessKeyId(), awsCredentials.getAwsAccessKeyId());
|
assertEquals(actualDbtS3Config.getDbtSecurityConfig().getAwsAccessKeyId(), awsCredentials.getAwsAccessKeyId());
|
||||||
assertEquals(actualDbtS3Config.getDbtSecurityConfig().getAwsRegion(), awsCredentials.getAwsRegion());
|
assertEquals(actualDbtS3Config.getDbtSecurityConfig().getAwsRegion(), awsCredentials.getAwsRegion());
|
||||||
|
assertEquals(PasswordEntityMasker.PASSWORD_MASK, actualDbtS3Config.getDbtSecurityConfig().getAwsSecretAccessKey());
|
||||||
|
|
||||||
|
ingestion = getEntity(ingestion.getId(), INGESTION_BOT_AUTH_HEADERS);
|
||||||
|
|
||||||
|
actualDbtPipeline = JsonUtils.convertValue(ingestion.getSourceConfig().getConfig(), DbtPipeline.class);
|
||||||
|
actualDbtS3Config = JsonUtils.convertValue(actualDbtPipeline.getDbtConfigSource(), DbtS3Config.class);
|
||||||
|
assertEquals(actualDbtS3Config.getDbtSecurityConfig().getAwsAccessKeyId(), awsCredentials.getAwsAccessKeyId());
|
||||||
|
assertEquals(actualDbtS3Config.getDbtSecurityConfig().getAwsRegion(), awsCredentials.getAwsRegion());
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"secret:/openmetadata/pipeline/"
|
awsCredentials.getAwsSecretAccessKey(), actualDbtS3Config.getDbtSecurityConfig().getAwsSecretAccessKey());
|
||||||
+ request.getName().toLowerCase(Locale.ROOT)
|
|
||||||
+ "/sourceconfig/config/dbtconfigsource/dbtsecurityconfig/awssecretaccesskey",
|
|
||||||
actualDbtS3Config.getDbtSecurityConfig().getAwsSecretAccessKey());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -20,15 +20,9 @@ public class EntityMaskerFactoryTest {
|
|||||||
EntityMaskerFactory.setEntityMasker(null);
|
EntityMaskerFactory.setEntityMasker(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
void testInitWithNoopEntityMasker() {
|
|
||||||
CONFIG.setMaskPasswordsAPI(false);
|
|
||||||
assertTrue(EntityMaskerFactory.createEntityMasker(CONFIG) instanceof NoopEntityMasker);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testInitWithPasswordEntityMasker() {
|
void testInitWithPasswordEntityMasker() {
|
||||||
CONFIG.setMaskPasswordsAPI(true);
|
CONFIG.setMaskPasswordsAPI(true);
|
||||||
assertTrue(EntityMaskerFactory.createEntityMasker(CONFIG) instanceof PasswordEntityMasker);
|
assertTrue(EntityMaskerFactory.createEntityMasker() instanceof PasswordEntityMasker);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
package org.openmetadata.service.secrets.masker;
|
|
||||||
|
|
||||||
public class NoopEntityMaskerTest extends TestEntityMasker {
|
|
||||||
|
|
||||||
public NoopEntityMaskerTest() {
|
|
||||||
CONFIG.setMaskPasswordsAPI(false);
|
|
||||||
}
|
|
||||||
}
|
|
@ -26,7 +26,7 @@ public class PasswordEntityMaskerTest extends TestEntityMasker {
|
|||||||
Assertions.assertThrows(
|
Assertions.assertThrows(
|
||||||
EntityMaskException.class,
|
EntityMaskException.class,
|
||||||
() -> {
|
() -> {
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.maskServiceConnectionConfig(mysqlConnectionObject, "Mysql", ServiceType.DATABASE);
|
.maskServiceConnectionConfig(mysqlConnectionObject, "Mysql", ServiceType.DATABASE);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ public class PasswordEntityMaskerTest extends TestEntityMasker {
|
|||||||
Assertions.assertThrows(
|
Assertions.assertThrows(
|
||||||
EntityMaskException.class,
|
EntityMaskException.class,
|
||||||
() -> {
|
() -> {
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.unmaskServiceConnectionConfig(
|
.unmaskServiceConnectionConfig(
|
||||||
mysqlConnectionObject, new MysqlConnection(), "Mysql", ServiceType.DATABASE);
|
mysqlConnectionObject, new MysqlConnection(), "Mysql", ServiceType.DATABASE);
|
||||||
});
|
});
|
||||||
|
@ -48,13 +48,13 @@ abstract class TestEntityMasker {
|
|||||||
AirflowConnection airflowConnection = new AirflowConnection().withConnection(buildMysqlConnection());
|
AirflowConnection airflowConnection = new AirflowConnection().withConnection(buildMysqlConnection());
|
||||||
AirflowConnection masked =
|
AirflowConnection masked =
|
||||||
(AirflowConnection)
|
(AirflowConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.maskServiceConnectionConfig(airflowConnection, "Airflow", ServiceType.PIPELINE);
|
.maskServiceConnectionConfig(airflowConnection, "Airflow", ServiceType.PIPELINE);
|
||||||
assertNotNull(masked);
|
assertNotNull(masked);
|
||||||
assertEquals(((MysqlConnection) masked.getConnection()).getPassword(), getMaskedPassword());
|
assertEquals(((MysqlConnection) masked.getConnection()).getPassword(), getMaskedPassword());
|
||||||
AirflowConnection unmasked =
|
AirflowConnection unmasked =
|
||||||
(AirflowConnection)
|
(AirflowConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.unmaskServiceConnectionConfig(masked, airflowConnection, "Airflow", ServiceType.PIPELINE);
|
.unmaskServiceConnectionConfig(masked, airflowConnection, "Airflow", ServiceType.PIPELINE);
|
||||||
assertEquals(((MysqlConnection) unmasked.getConnection()).getPassword(), PASSWORD);
|
assertEquals(((MysqlConnection) unmasked.getConnection()).getPassword(), PASSWORD);
|
||||||
}
|
}
|
||||||
@ -64,13 +64,13 @@ abstract class TestEntityMasker {
|
|||||||
BigQueryConnection bigQueryConnection = new BigQueryConnection().withCredentials(buildGcsCredentials());
|
BigQueryConnection bigQueryConnection = new BigQueryConnection().withCredentials(buildGcsCredentials());
|
||||||
BigQueryConnection masked =
|
BigQueryConnection masked =
|
||||||
(BigQueryConnection)
|
(BigQueryConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.maskServiceConnectionConfig(bigQueryConnection, "BigQuery", ServiceType.DATABASE);
|
.maskServiceConnectionConfig(bigQueryConnection, "BigQuery", ServiceType.DATABASE);
|
||||||
assertNotNull(masked);
|
assertNotNull(masked);
|
||||||
assertEquals(getPrivateKeyFromGcsConfig(masked.getCredentials()), getMaskedPassword());
|
assertEquals(getPrivateKeyFromGcsConfig(masked.getCredentials()), getMaskedPassword());
|
||||||
BigQueryConnection unmasked =
|
BigQueryConnection unmasked =
|
||||||
(BigQueryConnection)
|
(BigQueryConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.unmaskServiceConnectionConfig(masked, bigQueryConnection, "BigQuery", ServiceType.DATABASE);
|
.unmaskServiceConnectionConfig(masked, bigQueryConnection, "BigQuery", ServiceType.DATABASE);
|
||||||
assertEquals(getPrivateKeyFromGcsConfig(unmasked.getCredentials()), PASSWORD);
|
assertEquals(getPrivateKeyFromGcsConfig(unmasked.getCredentials()), PASSWORD);
|
||||||
}
|
}
|
||||||
@ -80,14 +80,14 @@ abstract class TestEntityMasker {
|
|||||||
DatalakeConnection datalakeConnection = new DatalakeConnection().withConfigSource(buildGcsConfig());
|
DatalakeConnection datalakeConnection = new DatalakeConnection().withConfigSource(buildGcsConfig());
|
||||||
DatalakeConnection masked =
|
DatalakeConnection masked =
|
||||||
(DatalakeConnection)
|
(DatalakeConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.maskServiceConnectionConfig(datalakeConnection, "Datalake", ServiceType.DATABASE);
|
.maskServiceConnectionConfig(datalakeConnection, "Datalake", ServiceType.DATABASE);
|
||||||
assertNotNull(masked);
|
assertNotNull(masked);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
getPrivateKeyFromGcsConfig(((GCSConfig) masked.getConfigSource()).getSecurityConfig()), getMaskedPassword());
|
getPrivateKeyFromGcsConfig(((GCSConfig) masked.getConfigSource()).getSecurityConfig()), getMaskedPassword());
|
||||||
DatalakeConnection unmasked =
|
DatalakeConnection unmasked =
|
||||||
(DatalakeConnection)
|
(DatalakeConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.unmaskServiceConnectionConfig(masked, datalakeConnection, "Datalake", ServiceType.DATABASE);
|
.unmaskServiceConnectionConfig(masked, datalakeConnection, "Datalake", ServiceType.DATABASE);
|
||||||
assertEquals(getPrivateKeyFromGcsConfig(((GCSConfig) unmasked.getConfigSource()).getSecurityConfig()), PASSWORD);
|
assertEquals(getPrivateKeyFromGcsConfig(((GCSConfig) unmasked.getConfigSource()).getSecurityConfig()), PASSWORD);
|
||||||
}
|
}
|
||||||
@ -96,7 +96,7 @@ abstract class TestEntityMasker {
|
|||||||
void testDbtPipelineMasker() {
|
void testDbtPipelineMasker() {
|
||||||
IngestionPipeline dbtPipeline = buildIngestionPipeline();
|
IngestionPipeline dbtPipeline = buildIngestionPipeline();
|
||||||
IngestionPipeline originalDbtPipeline = buildIngestionPipeline();
|
IngestionPipeline originalDbtPipeline = buildIngestionPipeline();
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG).maskIngestionPipeline(dbtPipeline);
|
EntityMaskerFactory.createEntityMasker().maskIngestionPipeline(dbtPipeline);
|
||||||
assertNotNull(dbtPipeline);
|
assertNotNull(dbtPipeline);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
getPrivateKeyFromGcsConfig(
|
getPrivateKeyFromGcsConfig(
|
||||||
@ -106,7 +106,7 @@ abstract class TestEntityMasker {
|
|||||||
assertEquals(
|
assertEquals(
|
||||||
((GoogleSSOClientConfig) dbtPipeline.getOpenMetadataServerConnection().getSecurityConfig()).getSecretKey(),
|
((GoogleSSOClientConfig) dbtPipeline.getOpenMetadataServerConnection().getSecurityConfig()).getSecretKey(),
|
||||||
getMaskedPassword());
|
getMaskedPassword());
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG).unmaskIngestionPipeline(dbtPipeline, originalDbtPipeline);
|
EntityMaskerFactory.createEntityMasker().unmaskIngestionPipeline(dbtPipeline, originalDbtPipeline);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
getPrivateKeyFromGcsConfig(
|
getPrivateKeyFromGcsConfig(
|
||||||
((DbtGCSConfig) ((DbtPipeline) dbtPipeline.getSourceConfig().getConfig()).getDbtConfigSource())
|
((DbtGCSConfig) ((DbtPipeline) dbtPipeline.getSourceConfig().getConfig()).getDbtConfigSource())
|
||||||
@ -123,13 +123,13 @@ abstract class TestEntityMasker {
|
|||||||
buildAuthenticationMechanism(AuthenticationMechanism.AuthType.SSO);
|
buildAuthenticationMechanism(AuthenticationMechanism.AuthType.SSO);
|
||||||
AuthenticationMechanism originalSsoAuthenticationMechanism =
|
AuthenticationMechanism originalSsoAuthenticationMechanism =
|
||||||
buildAuthenticationMechanism(AuthenticationMechanism.AuthType.SSO);
|
buildAuthenticationMechanism(AuthenticationMechanism.AuthType.SSO);
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG).maskAuthenticationMechanism("test", authenticationMechanism);
|
EntityMaskerFactory.createEntityMasker().maskAuthenticationMechanism("test", authenticationMechanism);
|
||||||
assertNotNull(authenticationMechanism.getConfig());
|
assertNotNull(authenticationMechanism.getConfig());
|
||||||
assertEquals(
|
assertEquals(
|
||||||
((GoogleSSOClientConfig) ((SSOAuthMechanism) authenticationMechanism.getConfig()).getAuthConfig())
|
((GoogleSSOClientConfig) ((SSOAuthMechanism) authenticationMechanism.getConfig()).getAuthConfig())
|
||||||
.getSecretKey(),
|
.getSecretKey(),
|
||||||
getMaskedPassword());
|
getMaskedPassword());
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.unmaskAuthenticationMechanism("test", authenticationMechanism, originalSsoAuthenticationMechanism);
|
.unmaskAuthenticationMechanism("test", authenticationMechanism, originalSsoAuthenticationMechanism);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
((GoogleSSOClientConfig) ((SSOAuthMechanism) authenticationMechanism.getConfig()).getAuthConfig())
|
((GoogleSSOClientConfig) ((SSOAuthMechanism) authenticationMechanism.getConfig()).getAuthConfig())
|
||||||
@ -143,9 +143,9 @@ abstract class TestEntityMasker {
|
|||||||
buildAuthenticationMechanism(AuthenticationMechanism.AuthType.JWT);
|
buildAuthenticationMechanism(AuthenticationMechanism.AuthType.JWT);
|
||||||
AuthenticationMechanism originalSsoAuthenticationMechanism =
|
AuthenticationMechanism originalSsoAuthenticationMechanism =
|
||||||
buildAuthenticationMechanism(AuthenticationMechanism.AuthType.JWT);
|
buildAuthenticationMechanism(AuthenticationMechanism.AuthType.JWT);
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG).maskAuthenticationMechanism("test", authenticationMechanism);
|
EntityMaskerFactory.createEntityMasker().maskAuthenticationMechanism("test", authenticationMechanism);
|
||||||
assertTrue(authenticationMechanism.getConfig() instanceof JWTAuthMechanism);
|
assertTrue(authenticationMechanism.getConfig() instanceof JWTAuthMechanism);
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.unmaskAuthenticationMechanism("test", authenticationMechanism, originalSsoAuthenticationMechanism);
|
.unmaskAuthenticationMechanism("test", authenticationMechanism, originalSsoAuthenticationMechanism);
|
||||||
assertTrue(authenticationMechanism.getConfig() instanceof JWTAuthMechanism);
|
assertTrue(authenticationMechanism.getConfig() instanceof JWTAuthMechanism);
|
||||||
}
|
}
|
||||||
@ -155,13 +155,13 @@ abstract class TestEntityMasker {
|
|||||||
SupersetConnection supersetConnection = new SupersetConnection().withConnection(buildMysqlConnection());
|
SupersetConnection supersetConnection = new SupersetConnection().withConnection(buildMysqlConnection());
|
||||||
SupersetConnection masked =
|
SupersetConnection masked =
|
||||||
(SupersetConnection)
|
(SupersetConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.maskServiceConnectionConfig(supersetConnection, "Superset", ServiceType.DASHBOARD);
|
.maskServiceConnectionConfig(supersetConnection, "Superset", ServiceType.DASHBOARD);
|
||||||
assertNotNull(masked);
|
assertNotNull(masked);
|
||||||
assertEquals(((MysqlConnection) masked.getConnection()).getPassword(), getMaskedPassword());
|
assertEquals(((MysqlConnection) masked.getConnection()).getPassword(), getMaskedPassword());
|
||||||
SupersetConnection unmasked =
|
SupersetConnection unmasked =
|
||||||
(SupersetConnection)
|
(SupersetConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.unmaskServiceConnectionConfig(masked, supersetConnection, "Superset", ServiceType.DASHBOARD);
|
.unmaskServiceConnectionConfig(masked, supersetConnection, "Superset", ServiceType.DASHBOARD);
|
||||||
assertEquals(((MysqlConnection) unmasked.getConnection()).getPassword(), PASSWORD);
|
assertEquals(((MysqlConnection) unmasked.getConnection()).getPassword(), PASSWORD);
|
||||||
}
|
}
|
||||||
@ -176,7 +176,7 @@ abstract class TestEntityMasker {
|
|||||||
.withServiceType(ServiceType.DATABASE)
|
.withServiceType(ServiceType.DATABASE)
|
||||||
.withConnectionType("Mysql"))
|
.withConnectionType("Mysql"))
|
||||||
.withOpenMetadataServerConnection(buildOpenMetadataConnection());
|
.withOpenMetadataServerConnection(buildOpenMetadataConnection());
|
||||||
Workflow masked = EntityMaskerFactory.createEntityMasker(CONFIG).maskWorkflow(workflow);
|
Workflow masked = EntityMaskerFactory.createEntityMasker().maskWorkflow(workflow);
|
||||||
assertNotNull(masked);
|
assertNotNull(masked);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
((MysqlConnection)
|
((MysqlConnection)
|
||||||
@ -186,7 +186,7 @@ abstract class TestEntityMasker {
|
|||||||
assertEquals(
|
assertEquals(
|
||||||
((GoogleSSOClientConfig) masked.getOpenMetadataServerConnection().getSecurityConfig()).getSecretKey(),
|
((GoogleSSOClientConfig) masked.getOpenMetadataServerConnection().getSecurityConfig()).getSecretKey(),
|
||||||
getMaskedPassword());
|
getMaskedPassword());
|
||||||
Workflow unmasked = EntityMaskerFactory.createEntityMasker(CONFIG).unmaskWorkflow(masked, workflow);
|
Workflow unmasked = EntityMaskerFactory.createEntityMasker().unmaskWorkflow(masked, workflow);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
((MysqlConnection)
|
((MysqlConnection)
|
||||||
((DatabaseConnection) ((TestServiceConnectionRequest) unmasked.getRequest()).getConnection())
|
((DatabaseConnection) ((TestServiceConnectionRequest) unmasked.getRequest()).getConnection())
|
||||||
@ -203,13 +203,13 @@ abstract class TestEntityMasker {
|
|||||||
MysqlConnection mysqlConnection = buildMysqlConnection();
|
MysqlConnection mysqlConnection = buildMysqlConnection();
|
||||||
MysqlConnection masked =
|
MysqlConnection masked =
|
||||||
(MysqlConnection)
|
(MysqlConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.maskServiceConnectionConfig(mysqlConnection, "Mysql", ServiceType.DATABASE);
|
.maskServiceConnectionConfig(mysqlConnection, "Mysql", ServiceType.DATABASE);
|
||||||
assertNotNull(masked);
|
assertNotNull(masked);
|
||||||
assertEquals(masked.getPassword(), getMaskedPassword());
|
assertEquals(masked.getPassword(), getMaskedPassword());
|
||||||
MysqlConnection unmasked =
|
MysqlConnection unmasked =
|
||||||
(MysqlConnection)
|
(MysqlConnection)
|
||||||
EntityMaskerFactory.createEntityMasker(CONFIG)
|
EntityMaskerFactory.createEntityMasker()
|
||||||
.unmaskServiceConnectionConfig(masked, mysqlConnection, "Mysql", ServiceType.DATABASE);
|
.unmaskServiceConnectionConfig(masked, mysqlConnection, "Mysql", ServiceType.DATABASE);
|
||||||
assertEquals(unmasked.getPassword(), PASSWORD);
|
assertEquals(unmasked.getPassword(), PASSWORD);
|
||||||
}
|
}
|
||||||
|
@ -116,10 +116,8 @@ migrationConfiguration:
|
|||||||
# port: 0
|
# port: 0
|
||||||
|
|
||||||
secretsManagerConfiguration:
|
secretsManagerConfiguration:
|
||||||
secretsManager: in-memory
|
secretsManager: noop
|
||||||
|
|
||||||
security:
|
|
||||||
maskPasswordsAPI: false
|
|
||||||
|
|
||||||
health:
|
health:
|
||||||
delayedShutdownHandlerEnabled: true
|
delayedShutdownHandlerEnabled: true
|
||||||
|
Loading…
x
Reference in New Issue
Block a user