dbeaver/pro#7295 do not use GSON for connection creds serialization (#3937)

* dbeaver/pro#7295 do not use GSON for connection creds serialization

* dbeaver/pro#7295 do not use GSON for connection creds serialization

* dbeaver/pro#7295 do not use GSON for connection creds serialization

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
This commit is contained in:
Ruslan Musaev
2025-12-09 11:51:02 +01:00
committed by GitHub
co-authored by Daria Marutkina
parent 6316ab0cbb
commit d6221e3d33
5 changed files with 24 additions and 21 deletions
@@ -18,6 +18,7 @@ package io.cloudbeaver;
import io.cloudbeaver.model.WebConnectionConfig;
import io.cloudbeaver.model.app.WebAppConfiguration;
import io.cloudbeaver.model.session.WebSession;
import io.cloudbeaver.utils.ServletAppUtils;
import io.cloudbeaver.utils.WebDataSourceUtils;
import org.jkiss.code.NotNull;
@@ -32,8 +33,10 @@ public class WebConnectionConfigInputHandler<T extends WebConnectionConfig, C ex
private static final Log log = Log.getLog(WebConnectionConfigInputHandler.class);
protected final T input;
protected final DBPDataSourceRegistry registry;
protected final WebSession webSession;
public WebConnectionConfigInputHandler(@NotNull DBPDataSourceRegistry registry, T configInput) {
public WebConnectionConfigInputHandler(@NotNull WebSession webSession, @NotNull DBPDataSourceRegistry registry, T configInput) {
this.webSession = webSession;
this.registry = registry;
this.input = configInput;
}
@@ -52,6 +55,7 @@ public class WebConnectionConfigInputHandler<T extends WebConnectionConfig, C ex
}
WebDataSourceUtils.saveAuthProperties(
webSession.getProgressMonitor(),
newDataSource,
newDataSource.getConnectionConfiguration(),
input.getCredentials(),
@@ -81,6 +85,7 @@ public class WebConnectionConfigInputHandler<T extends WebConnectionConfig, C ex
input
);
WebDataSourceUtils.saveAuthProperties(
webSession.getProgressMonitor(),
dataSource,
dataSource.getConnectionConfiguration(),
input.getCredentials(),
@@ -360,7 +360,7 @@ public class WebSessionProjectImpl extends WebProjectImpl {
@NotNull
protected WebConnectionConfigInputHandler getInputConfigHandler(@NotNull WebConnectionConfig configInput) {
return new WebConnectionConfigInputHandler<>(getDataSourceRegistry(), configInput);
return new WebConnectionConfigInputHandler<>(webSession, getDataSourceRegistry(), configInput);
}
@@ -840,7 +840,7 @@ public class WebSession extends BaseWebSession
// uncommented because we had the problem with non-native auth models
// (for example, can't connect to DynamoDB if credentials are not saved)
DBAAuthCredentials credentials = configuration.getAuthModel().loadCredentials(dataSourceContainer, configuration);
WebDataSourceUtils.updateCredentialsFromProperties(credentials, configuration.getAuthProperties());
WebDataSourceUtils.updateCredentialsFromProperties(this.progressMonitor, credentials, configuration.getAuthProperties());
configuration.getAuthModel().provideCredentials(dataSourceContainer, configuration, credentials);
} catch (DBException e) {
@@ -16,10 +16,6 @@
*/
package io.cloudbeaver.utils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.InstanceCreator;
import com.google.gson.Strictness;
import io.cloudbeaver.DBWConstants;
import io.cloudbeaver.DBWebException;
import io.cloudbeaver.WebSessionProjectImpl;
@@ -34,7 +30,6 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.access.DBAAuthCredentials;
import org.jkiss.dbeaver.model.access.DBAAuthCredentialsWithComplexProperties;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
@@ -43,7 +38,9 @@ import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.model.impl.auth.AuthModelDatabaseNativeCredentials;
import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration;
import org.jkiss.dbeaver.model.net.ssh.SSHConstants;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.websocket.event.datasource.WSDataSourceDisconnectEvent;
import org.jkiss.dbeaver.registry.DataSourceUtils;
import org.jkiss.dbeaver.registry.network.NetworkHandlerDescriptor;
import org.jkiss.dbeaver.registry.network.NetworkHandlerRegistry;
import org.jkiss.dbeaver.runtime.DBWorkbench;
@@ -211,31 +208,30 @@ public class WebDataSourceUtils {
return webSession.getAccessibleProjectById(projectId).getWebConnectionInfo(connectionId);
}
public static void updateCredentialsFromProperties(@NotNull DBAAuthCredentials credentials, @NotNull Map<String, ?> properties) {
InstanceCreator<DBAAuthCredentials> credTypeAdapter = type -> credentials;
Gson credGson = new GsonBuilder()
.setStrictness(Strictness.LENIENT)
.registerTypeAdapter(credentials.getClass(), credTypeAdapter)
.create();
if (credentials instanceof DBAAuthCredentialsWithComplexProperties complexProperties) {
complexProperties.updateCredentialsFromComplexProperties(properties);
public static void updateCredentialsFromProperties(
@NotNull DBRProgressMonitor progressMonitor,
@NotNull DBAAuthCredentials credentials,
@Nullable Map<String, ?> properties
) {
if (properties == null) {
return;
}
credGson.fromJson(credGson.toJsonTree(properties), credentials.getClass());
DataSourceUtils.updateCredentialsFromProperties(progressMonitor, credentials, properties);
}
public static void saveAuthProperties(
@NotNull DBRProgressMonitor progressMonitor,
@NotNull DBPDataSourceContainer dataSourceContainer,
@NotNull DBPConnectionConfiguration configuration,
@Nullable Map<String, Object> authProperties,
boolean saveCredentials,
boolean sharedCredentials
) {
saveAuthProperties(dataSourceContainer, configuration, authProperties, saveCredentials, sharedCredentials, false);
saveAuthProperties(progressMonitor, dataSourceContainer, configuration, authProperties, saveCredentials, sharedCredentials, false);
}
public static void saveAuthProperties(
@NotNull DBRProgressMonitor progressMonitor,
@NotNull DBPDataSourceContainer dataSourceContainer,
@NotNull DBPConnectionConfiguration configuration,
@Nullable Map<String, Object> authProperties,
@@ -271,7 +267,7 @@ public class WebDataSourceUtils {
configuration.setAuthProperties(currentAuthProps);
}
if (!authProperties.isEmpty()) {
updateCredentialsFromProperties(credentials, authProperties);
updateCredentialsFromProperties(progressMonitor, credentials, authProperties);
}
configuration.getAuthModel().saveCredentials(dataSourceContainer, configuration, credentials);
@@ -373,6 +373,7 @@ public class WebServiceCore implements DBWServiceCore {
if (saveCredentials) {
// Save all passed credentials in the datasource container
WebDataSourceUtils.saveAuthProperties(
webSession.getProgressMonitor(),
dataSourceContainer,
dataSourceContainer.getConnectionConfiguration(),
authProperties,
@@ -529,6 +530,7 @@ public class WebServiceCore implements DBWServiceCore {
}
}
WebDataSourceUtils.saveAuthProperties(
webSession.getProgressMonitor(),
testDataSource,
testDataSource.getConnectionConfiguration(),
configInput.getCredentials(),