diff --git a/packages/api/src/controllers/config.js b/packages/api/src/controllers/config.js index bcd8a3af3..3929d1330 100644 --- a/packages/api/src/controllers/config.js +++ b/packages/api/src/controllers/config.js @@ -42,6 +42,7 @@ module.exports = { allowShellConnection: platformInfo.allowShellConnection, allowShellScripting: platformInfo.allowShellScripting, isDocker: platformInfo.isDocker, + isElectron: platformInfo.isElectron, permissions, login, ...additionalConfigProps, diff --git a/packages/api/src/shell/requirePlugin.js b/packages/api/src/shell/requirePlugin.js index 7e1c46769..6db3714d5 100644 --- a/packages/api/src/shell/requirePlugin.js +++ b/packages/api/src/shell/requirePlugin.js @@ -11,6 +11,7 @@ const loadedPlugins = {}; const dbgateEnv = { dbgateApi: null, nativeModules, + platformInfo, }; function requirePlugin(packageName, requiredPlugin = null) { if (!packageName) throw new Error('Missing packageName in plugin'); diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index 2b09547a1..2691436e9 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -90,7 +90,13 @@ export interface EngineDriver { profilerChartMeasures?: { label: string; field: string }[]; isElectronOnly?: boolean; supportedCreateDatabase?: boolean; - showConnectionField?: (field: string, values: any) => boolean; + showConnectionField?: ( + field: string, + values: any, + { + config: {}, + } + ) => boolean; showConnectionTab?: (tab: 'ssl' | 'sshTunnel', values: any) => boolean; beforeConnectionSave?: (values: any) => any; databaseUrlPlaceholder?: string; diff --git a/packages/web/src/settings/ConnectionDriverFields.svelte b/packages/web/src/settings/ConnectionDriverFields.svelte index f2c410e07..70e856023 100644 --- a/packages/web/src/settings/ConnectionDriverFields.svelte +++ b/packages/web/src/settings/ConnectionDriverFields.svelte @@ -12,7 +12,7 @@ import FormTextField from '../forms/FormTextField.svelte'; import { extensions, getCurrentConfig, openedConnections, openedSingleDatabaseConnections } from '../stores'; import getElectron from '../utility/getElectron'; - import { useAuthTypes } from '../utility/metadataLoaders'; + import { useAuthTypes, useConfig } from '../utility/metadataLoaders'; import FormColorField from '../forms/FormColorField.svelte'; import FontIcon from '../icons/FontIcon.svelte'; @@ -27,13 +27,16 @@ $: disabledFields = (currentAuthType ? currentAuthType.disabledFields : null) || []; $: driver = $extensions.drivers.find(x => x.engine == engine); $: defaultDatabase = $values.defaultDatabase; + $: config = useConfig(); - $: showUser = driver?.showConnectionField('user', $values) && $values.passwordMode != 'askUser'; + $: showConnectionFieldArgs = { config: $config }; + + $: showUser = driver?.showConnectionField('user', $values, showConnectionFieldArgs) && $values.passwordMode != 'askUser'; $: showPassword = - driver?.showConnectionField('password', $values) && + driver?.showConnectionField('password', $values, showConnectionFieldArgs) && $values.passwordMode != 'askPassword' && $values.passwordMode != 'askUser'; - $: showPasswordMode = driver?.showConnectionField('password', $values); + $: showPasswordMode = driver?.showConnectionField('password', $values, showConnectionFieldArgs); $: isConnected = $openedConnections.includes($values._id) || $openedSingleDatabaseConnections.includes($values._id); @@ -53,11 +56,11 @@ ]} /> -{#if driver?.showConnectionField('databaseFile', $values)} +{#if driver?.showConnectionField('databaseFile', $values, showConnectionFieldArgs)} {/if} -{#if driver?.showConnectionField('useDatabaseUrl', $values)} +{#if driver?.showConnectionField('useDatabaseUrl', $values, showConnectionFieldArgs)}
{/if} -{#if driver?.showConnectionField('databaseUrl', $values)} +{#if driver?.showConnectionField('databaseUrl', $values, showConnectionFieldArgs)} {/if} -{#if $authTypes && driver?.showConnectionField('authType', $values)} +{#if $authTypes && driver?.showConnectionField('authType', $values, showConnectionFieldArgs)} {/if} -{#if driver?.showConnectionField('clientLibraryPath', $values)} - +{#if driver?.showConnectionField('clientLibraryPath', $values, showConnectionFieldArgs)} + {/if} -{#if driver?.showConnectionField('server', $values)} +{#if driver?.showConnectionField('server', $values, showConnectionFieldArgs)}
- {#if driver?.showConnectionField('port', $values)} + {#if driver?.showConnectionField('port', $values, showConnectionFieldArgs)}
{/if} -{#if driver?.showConnectionField('socketPath', $values)} +{#if driver?.showConnectionField('socketPath', $values, showConnectionFieldArgs)} {/if} -{#if driver?.showConnectionField('treeKeySeparator', $values)} +{#if driver?.showConnectionField('treeKeySeparator', $values, showConnectionFieldArgs)} {/if} -{#if driver?.showConnectionField('windowsDomain', $values)} +{#if driver?.showConnectionField('windowsDomain', $values, showConnectionFieldArgs)} {/if} -{#if driver?.showConnectionField('isReadOnly', $values)} +{#if driver?.showConnectionField('isReadOnly', $values, showConnectionFieldArgs)} {/if} -{#if driver?.showConnectionField('trustServerCertificate', $values)} +{#if driver?.showConnectionField('trustServerCertificate', $values, showConnectionFieldArgs)} {/if} -{#if driver?.showConnectionField('defaultDatabase', $values)} +{#if driver?.showConnectionField('defaultDatabase', $values, showConnectionFieldArgs)} {/if} -{#if defaultDatabase && driver?.showConnectionField('singleDatabase', $values)} +{#if defaultDatabase && driver?.showConnectionField('singleDatabase', $values, showConnectionFieldArgs)} {/if} diff --git a/packages/web/src/tabs/ConnectionTab.svelte b/packages/web/src/tabs/ConnectionTab.svelte index e33fd623d..45317f5e0 100644 --- a/packages/web/src/tabs/ConnectionTab.svelte +++ b/packages/web/src/tabs/ConnectionTab.svelte @@ -32,6 +32,7 @@ import { onMount } from 'svelte'; import { disconnectServerConnection, openConnection } from '../appobj/ConnectionAppObject.svelte'; import { disconnectDatabaseConnection } from '../appobj/DatabaseAppObject.svelte'; + import { useConfig } from '../utility/metadataLoaders'; export let connection; export let tabid; @@ -57,6 +58,7 @@ $: engine = $values.engine; $: driver = $extensions.drivers.find(x => x.engine == engine); + $: config = useConfig(); const testIdRef = createRef(0); @@ -91,7 +93,7 @@ 'socketPath', 'serviceName', ]; - const visibleProps = allProps.filter(x => driver?.showConnectionField(x, $values)); + const visibleProps = allProps.filter(x => driver?.showConnectionField(x, $values, { config: $config })); const omitProps = _.difference(allProps, visibleProps); if (!$values.defaultDatabase) omitProps.push('singleDatabase'); diff --git a/plugins/dbgate-plugin-oracle/src/backend/driver.js b/plugins/dbgate-plugin-oracle/src/backend/driver.js index 5d8c73a96..1444f071a 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/driver.js +++ b/plugins/dbgate-plugin-oracle/src/backend/driver.js @@ -5,8 +5,10 @@ const driverBase = require('../frontend/driver'); const Analyser = require('./Analyser'); const { createBulkInsertStreamBase, makeUniqueColumnNames } = require('dbgate-tools'); const createOracleBulkInsertStream = require('./createOracleBulkInsertStream'); +const { platform } = require('os'); let requireOracledb; +let platformInfo; let oracledbValue; function getOracledb() { @@ -16,7 +18,6 @@ function getOracledb() { return oracledbValue; } - /* pg.types.setTypeParser(1082, 'text', val => val); // date pg.types.setTypeParser(1114, 'text', val => val); // timestamp without timezone @@ -327,23 +328,26 @@ const driver = { }, getAuthTypes() { - return [ - { - title: 'Thin mode (default) - direct connection to Oracle database', - name: 'thin', - }, - { - title: 'Thick mode - connection via Oracle instant client', - name: 'thick', - }, - ]; + if (platformInfo?.isElectron || process.env.ORACLE_INSTANT_CLIENT) { + return [ + { + title: 'Thin mode (default) - direct connection to Oracle database', + name: 'thin', + }, + { + title: 'Thick mode - connection via Oracle instant client', + name: 'thick', + }, + ]; + } }, }; -driver.initialize = (dbgateEnv) => { +driver.initialize = dbgateEnv => { if (dbgateEnv.nativeModules && dbgateEnv.nativeModules['oracledb']) { requireOracledb = dbgateEnv.nativeModules['oracledb']; } + platformInfo = dbgateEnv.platformInfo; }; module.exports = driver; diff --git a/plugins/dbgate-plugin-oracle/src/frontend/driver.js b/plugins/dbgate-plugin-oracle/src/frontend/driver.js index 53dcc8c33..ebd9bfe84 100644 --- a/plugins/dbgate-plugin-oracle/src/frontend/driver.js +++ b/plugins/dbgate-plugin-oracle/src/frontend/driver.js @@ -98,11 +98,10 @@ const oracleDriver = { databaseUrlPlaceholder: 'e.g. localhost:1521/orcl', - - showConnectionField: (field, values) => { + showConnectionField: (field, values, { config }) => { if (field == 'useDatabaseUrl') return true; if (field == 'authType') return true; - if (field == 'clientLibraryPath') return values.authType == 'thick'; + if (field == 'clientLibraryPath') return config?.isElectron && values.authType == 'thick'; if (values.useDatabaseUrl) { return ['databaseUrl', 'user', 'password'].includes(field);