CB-262 Server configuration API

This commit is contained in:
Serge Rider
2020-08-26 19:39:44 +03:00
parent f0cb1a4d2f
commit fc53f3ba5d
12 changed files with 100 additions and 87 deletions
@@ -79,12 +79,12 @@ type ServerConfig {
anonymousAccessEnabled: Boolean
authenticationEnabled: Boolean
supportsPredefinedConnections: Boolean @deprecated # Supported always
supportsProvidedConnections: Boolean @deprecated # Supported always
supportsCustomConnections: Boolean
supportsConnectionBrowser: Boolean
supportsWorkspaces: Boolean
configurationMode: Boolean
supportedLanguages: [ ServerLanguage! ]!
services: [ WebServiceConfig ]
productConfiguration: Object!
@@ -325,9 +325,6 @@ extend type Mutation {
# Changes navigator settings for connection
setConnectionNavigatorSettings( id: ID!, settings: NavigatorSettingsInput!): Boolean!
# Changes default navigator settings
setDefaultNavigatorSettings( settings: NavigatorSettingsInput!): Boolean!
#### Generic async functions
asyncTaskCancel(id: String!): Boolean
@@ -27,6 +27,7 @@ import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.auth.DBAAuthCredentials;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings;
import org.jkiss.dbeaver.registry.DataSourceProviderDescriptor;
@@ -166,4 +167,9 @@ public class WebServiceUtils {
initAuthProperties(dataSource, config.getCredentials());
dataSource.setSavePassword(config.isSaveCredentials());
}
public static DBNBrowseSettings parseNavigatorSettings(Map<String, Object> settingsMap) {
return gson.fromJson(
gson.toJsonTree(settingsMap), DataSourceNavigatorSettings.class);
}
}
@@ -61,11 +61,6 @@ public class WebServerConfig {
return application.getAppConfiguration().isAuthenticationEnabled();
}
@Property
public boolean isSupportsPredefinedConnections() {
return application.getAppConfiguration().isSupportsPredefinedConnections();
}
@Property
public boolean isSupportsCustomConnections() {
return application.getAppConfiguration().isSupportsCustomConnections();
@@ -81,6 +76,11 @@ public class WebServerConfig {
return application.getAppConfiguration().isSupportsUserWorkspaces();
}
@Property
public boolean isConfigurationMode() {
return application.isConfigurationMode();
}
@Property
public WebServerLanguage[] getSupportedLanguages() {
List<PlatformLanguageDescriptor> langs = PlatformLanguageRegistry.getInstance().getLanguages();
@@ -30,7 +30,6 @@ public class CBAppConfig {
private boolean authenticationEnabled = true;
private String anonymousUserRole = CBConstants.DEFAUL_APP_ANONYMOUS_ROLE_NAME;
private String defaultUserRole = CBConstants.DEFAUL_APP_ANONYMOUS_ROLE_NAME;
private boolean supportsPredefinedConnections = true;
private boolean supportsCustomConnections = true;
private boolean supportsConnectionBrowser = false;
private boolean supportsUserWorkspaces = false;
@@ -55,10 +54,6 @@ public class CBAppConfig {
return defaultUserRole;
}
public boolean isSupportsPredefinedConnections() {
return supportsPredefinedConnections;
}
public boolean isSupportsCustomConnections() {
return supportsCustomConnections;
}
@@ -80,6 +80,7 @@ public class CBApplication extends BaseApplicationImpl {
private long maxSessionIdleTime = CBConstants.MAX_SESSION_IDLE_TIME;
private boolean develMode = false;
private boolean configurationMode = false;
public CBApplication() {
}
@@ -349,6 +350,14 @@ public class CBApplication extends BaseApplicationImpl {
return develMode;
}
public boolean isConfigurationMode() {
return configurationMode;
}
public void setConfigurationMode(boolean configurationMode) {
this.configurationMode = configurationMode;
}
public DBNBrowseSettings getDefaultNavigatorSettings() {
return defaultNavigatorSettings;
}
@@ -356,4 +365,5 @@ public class CBApplication extends BaseApplicationImpl {
public void setDefaultNavigatorSettings(DBNBrowseSettings defaultNavigatorSettings) {
this.defaultNavigatorSettings = defaultNavigatorSettings;
}
}
@@ -104,17 +104,12 @@ public interface DBWServiceCore extends DBWService {
///////////////////////////////////////////
// Navigator settings
@WebAction
boolean setConnectionNavigatorSettings(WebSession webSession, String id, DBNBrowseSettings settings) throws DBWebException;
boolean setDefaultNavigatorSettings(WebSession webSession, DBNBrowseSettings settings);
///////////////////////////////////////////
// Async tasks
@Deprecated
@WebAction
WebAsyncTaskInfo getAsyncTaskStatus(WebSession webSession, String taskId) throws DBWebException;
@WebAction
WebAsyncTaskInfo getAsyncTaskInfo(WebSession webSession, String taskId, Boolean removeOnFinish) throws DBWebException;
@@ -16,12 +16,11 @@
*/
package io.cloudbeaver.service.core;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import graphql.TypeResolutionEnvironment;
import graphql.schema.DataFetchingEnvironment;
import graphql.schema.idl.TypeRuntimeWiring;
import io.cloudbeaver.DBWebException;
import io.cloudbeaver.WebServiceUtils;
import io.cloudbeaver.model.WebConnectionConfig;
import io.cloudbeaver.model.session.WebSessionManager;
import io.cloudbeaver.server.CBPlatform;
@@ -29,18 +28,12 @@ import io.cloudbeaver.server.graphql.GraphQLEndpoint;
import io.cloudbeaver.service.DBWBindingContext;
import io.cloudbeaver.service.WebServiceBindingBase;
import io.cloudbeaver.service.core.impl.WebServiceCore;
import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings;
import java.util.Map;
/**
* Web service implementation
*/
public class WebServiceBindingCore extends WebServiceBindingBase<DBWServiceCore> {
private final Gson gson = new GsonBuilder().create();
public WebServiceBindingCore() {
super(DBWServiceCore.class, new WebServiceCore(), "schema/service.core.graphqls");
}
@@ -83,10 +76,8 @@ public class WebServiceBindingCore extends WebServiceBindingBase<DBWServiceCore>
.dataFetcher("closeConnection", env -> getService(env).closeConnection(getWebSession(env), env.getArgument("id")))
.dataFetcher("deleteConnection", env -> getService(env).deleteConnection(getWebSession(env), env.getArgument("id")))
.dataFetcher("setConnectionNavigatorSettings", env -> getService(env).setConnectionNavigatorSettings(getWebSession(env), env.getArgument("id"), parseNavigatorSettings(env.getArgument("settings"))))
.dataFetcher("setDefaultNavigatorSettings", env -> getService(env).setDefaultNavigatorSettings(getWebSession(env), parseNavigatorSettings(env.getArgument("settings"))))
.dataFetcher("setConnectionNavigatorSettings", env -> getService(env).setConnectionNavigatorSettings(getWebSession(env), env.getArgument("id"), WebServiceUtils.parseNavigatorSettings(env.getArgument("settings"))))
.dataFetcher("asyncTaskStatus", env -> getService(env).getAsyncTaskStatus(getWebSession(env), env.getArgument("id")))
.dataFetcher("asyncTaskInfo", env -> getService(env).getAsyncTaskInfo(
getWebSession(env),
env.getArgument("id"),
@@ -98,11 +89,6 @@ public class WebServiceBindingCore extends WebServiceBindingBase<DBWServiceCore>
);
}
private DBNBrowseSettings parseNavigatorSettings(Map<String, Object> settingsMap) {
return gson.fromJson(
gson.toJsonTree(settingsMap), DataSourceNavigatorSettings.class);
}
private WebConnectionConfig getConnectionConfig(DataFetchingEnvironment env) {
return new WebConnectionConfig(env.getArgument("config"));
}
@@ -327,18 +327,6 @@ public class WebServiceCore implements DBWServiceCore {
return true;
}
@Override
public boolean setDefaultNavigatorSettings(WebSession webSession, DBNBrowseSettings settings) {
CBApplication.getInstance().setDefaultNavigatorSettings(settings);
return true;
}
@Override
public WebAsyncTaskInfo getAsyncTaskStatus(WebSession webSession, String taskId) throws DBWebException {
return webSession.asyncTaskStatus(taskId, true);
}
@Override
public WebAsyncTaskInfo getAsyncTaskInfo(WebSession webSession, String taskId, Boolean removeOnFinish) throws DBWebException {
return webSession.asyncTaskStatus(taskId, CommonUtils.toBoolean(removeOnFinish));
@@ -44,6 +44,8 @@ type AdminPermissionInfo {
extend type Query {
#### Users and roles
listUsers(userId: ID): [AdminUserInfo]!
listRoles(roleId: ID): [AdminRoleInfo]!
listPermissions: [AdminPermissionInfo]!
@@ -80,4 +82,18 @@ extend type Query {
getSubjectConnectionAccess(subjectId: ID): [AdminConnectionGrantInfo!]!
setSubjectConnectionAccess(subjectId: ID!, connections: [ID!]!): Boolean
#### Global configuration
configureServer(configuration: ServerConfigInput!): Boolean!
# Changes default navigator settings
setDefaultNavigatorSettings( settings: NavigatorSettingsInput!): Boolean!
}
input ServerConfigInput {
serverName: String
adminName: String
adminPassword: String
}
@@ -25,6 +25,7 @@ import io.cloudbeaver.model.WebConnectionInfo;
import io.cloudbeaver.model.session.WebSession;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
import java.util.List;
import java.util.Map;
@@ -87,6 +88,12 @@ public interface DBWServiceAdmin extends DBWService {
@WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN)
boolean deleteConnectionConfiguration(@NotNull WebSession webSession, @NotNull String id) throws DBWebException;
@WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN)
boolean setDefaultNavigatorSettings(WebSession webSession, DBNBrowseSettings settings);
////////////////////////////////////////////////////////////////////
// Permissions
@WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN)
DBWConnectionGrant[] getConnectionSubjectAccess(WebSession webSession, String connectionId) throws DBWebException;
@WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN)
@@ -17,6 +17,7 @@
package io.cloudbeaver.service.admin;
import io.cloudbeaver.DBWebException;
import io.cloudbeaver.WebServiceUtils;
import io.cloudbeaver.model.WebConnectionConfig;
import io.cloudbeaver.service.DBWBindingContext;
import io.cloudbeaver.service.WebServiceBindingBase;
@@ -35,49 +36,54 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase<DBWServiceAdmi
@Override
public void bindWiring(DBWBindingContext model) throws DBWebException {
model.getQueryType().dataFetcher("listUsers",
env -> getService(env).listUsers(getWebSession(env), env.getArgument("userId")));
model.getQueryType().dataFetcher("listRoles",
env -> getService(env).listRoles(getWebSession(env), env.getArgument("roleId")));
model.getQueryType().dataFetcher("listPermissions",
env -> getService(env).listPermissions(getWebSession(env)));
model.getQueryType().dataFetcher("createUser",
env -> getService(env).createUser(getWebSession(env), env.getArgument("userId")));
model.getQueryType().dataFetcher("deleteUser",
env -> getService(env).deleteUser(getWebSession(env), env.getArgument("userId")));
model.getQueryType().dataFetcher("createRole",
env -> getService(env).createRole(getWebSession(env), env.getArgument("roleId")));
model.getQueryType().dataFetcher("deleteRole",
env -> getService(env).deleteRole(getWebSession(env), env.getArgument("roleId")));
model.getQueryType()
.dataFetcher("listUsers",
env -> getService(env).listUsers(getWebSession(env), env.getArgument("userId")))
.dataFetcher("listRoles",
env -> getService(env).listRoles(getWebSession(env), env.getArgument("roleId")))
.dataFetcher("listPermissions",
env -> getService(env).listPermissions(getWebSession(env)))
.dataFetcher("createUser",
env -> getService(env).createUser(getWebSession(env), env.getArgument("userId")))
.dataFetcher("deleteUser",
env -> getService(env).deleteUser(getWebSession(env), env.getArgument("userId")))
.dataFetcher("createRole",
env -> getService(env).createRole(getWebSession(env), env.getArgument("roleId")))
.dataFetcher("deleteRole",
env -> getService(env).deleteRole(getWebSession(env), env.getArgument("roleId")))
model.getQueryType().dataFetcher("grantUserRole",
env -> getService(env).grantUserRole(getWebSession(env), env.getArgument("userId"), env.getArgument("roleId")));
model.getQueryType().dataFetcher("revokeUserRole",
env -> getService(env).revokeUserRole(getWebSession(env), env.getArgument("userId"), env.getArgument("roleId")));
model.getQueryType().dataFetcher("setSubjectPermissions",
env -> getService(env).setSubjectPermissions(getWebSession(env), env.getArgument("roleId"), env.getArgument("permissions")));
model.getQueryType().dataFetcher("setUserCredentials",
env -> getService(env).setUserCredentials(getWebSession(env), env.getArgument("userId"), env.getArgument("providerId"), env.getArgument("credentials")));
.dataFetcher("grantUserRole",
env -> getService(env).grantUserRole(getWebSession(env), env.getArgument("userId"), env.getArgument("roleId")))
.dataFetcher("revokeUserRole",
env -> getService(env).revokeUserRole(getWebSession(env), env.getArgument("userId"), env.getArgument("roleId")))
.dataFetcher("setSubjectPermissions",
env -> getService(env).setSubjectPermissions(getWebSession(env), env.getArgument("roleId"), env.getArgument("permissions")))
.dataFetcher("setUserCredentials",
env -> getService(env).setUserCredentials(getWebSession(env), env.getArgument("userId"), env.getArgument("providerId"), env.getArgument("credentials")))
model.getQueryType().dataFetcher("allConnections", env -> getService(env).getAllConnections(getWebSession(env)));
model.getQueryType().dataFetcher("searchConnections", env -> getService(env).searchConnections(getWebSession(env), env.getArgument("hostNames")));
.dataFetcher("allConnections", env -> getService(env).getAllConnections(getWebSession(env)))
.dataFetcher("searchConnections", env -> getService(env).searchConnections(getWebSession(env), env.getArgument("hostNames")))
model.getQueryType().dataFetcher("createConnectionConfiguration",
env -> getService(env).createConnectionConfiguration(getWebSession(env), new WebConnectionConfig(env.getArgument("config"))));
model.getQueryType().dataFetcher("updateConnectionConfiguration",
env -> getService(env).updateConnectionConfiguration(getWebSession(env), env.getArgument("id"), new WebConnectionConfig(env.getArgument("config"))));
model.getQueryType().dataFetcher("deleteConnectionConfiguration",
env -> getService(env).deleteConnectionConfiguration(getWebSession(env), env.getArgument("id")));
.dataFetcher("createConnectionConfiguration",
env -> getService(env).createConnectionConfiguration(getWebSession(env), new WebConnectionConfig(env.getArgument("config"))))
.dataFetcher("updateConnectionConfiguration",
env -> getService(env).updateConnectionConfiguration(getWebSession(env), env.getArgument("id"), new WebConnectionConfig(env.getArgument("config"))))
.dataFetcher("deleteConnectionConfiguration",
env -> getService(env).deleteConnectionConfiguration(getWebSession(env), env.getArgument("id")))
model.getQueryType().dataFetcher("getConnectionSubjectAccess",
env -> getService(env).getConnectionSubjectAccess(getWebSession(env), env.getArgument("connectionId")));
model.getQueryType().dataFetcher("setConnectionSubjectAccess",
env -> getService(env).setConnectionSubjectAccess(getWebSession(env), env.getArgument("connectionId"), env.getArgument("subjects")));
.dataFetcher("getConnectionSubjectAccess",
env -> getService(env).getConnectionSubjectAccess(getWebSession(env), env.getArgument("connectionId")))
.dataFetcher("setConnectionSubjectAccess",
env -> getService(env).setConnectionSubjectAccess(getWebSession(env), env.getArgument("connectionId"), env.getArgument("subjects")))
model.getQueryType().dataFetcher("getSubjectConnectionAccess",
env -> getService(env).getSubjectConnectionAccess(getWebSession(env), env.getArgument("subjectId")));
model.getQueryType().dataFetcher("setSubjectConnectionAccess",
env -> getService(env).setSubjectConnectionAccess(getWebSession(env), env.getArgument("subjectId"), env.getArgument("connections")));
.dataFetcher("getSubjectConnectionAccess",
env -> getService(env).getSubjectConnectionAccess(getWebSession(env), env.getArgument("subjectId")))
.dataFetcher("setSubjectConnectionAccess",
env -> getService(env).setSubjectConnectionAccess(getWebSession(env), env.getArgument("subjectId"), env.getArgument("connections")))
.dataFetcher("setDefaultNavigatorSettings",
env -> getService(env).setDefaultNavigatorSettings(getWebSession(env), WebServiceUtils.parseNavigatorSettings(env.getArgument("settings"))))
;
}
}
@@ -37,6 +37,7 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
@@ -294,6 +295,12 @@ public class WebServiceAdmin implements DBWServiceAdmin {
return true;
}
@Override
public boolean setDefaultNavigatorSettings(WebSession webSession, DBNBrowseSettings settings) {
CBApplication.getInstance().setDefaultNavigatorSettings(settings);
return true;
}
////////////////////////////////////////////////////////////////////
// Access management