From 6f7b7d137e74117ea01a195ddab3004445d07acf Mon Sep 17 00:00:00 2001 From: Nazar Kovtun Date: Fri, 8 Aug 2025 14:08:24 +0300 Subject: [PATCH 1/2] HCK-12280: improve error on invalid or absent passphrase --- common/errorCodes.js | 4 ++++ .../helpers => common}/errorMessages.js | 1 + forward_engineering/api.js | 20 ++++++---------- forward_engineering/helpers/handleError.js | 22 ++++++++++++++++++ reverse_engineering/api.js | 12 +++++++++- .../helpers/connections/connection.js | 2 +- .../helpers/connections/keyPairConnection.js | 23 +++++++++++-------- .../helpers/connections/oktaConnection.js | 2 +- .../helpers/snowflakeHelper.js | 2 +- tsconfig.json | 2 +- 10 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 common/errorCodes.js rename {reverse_engineering/helpers => common}/errorMessages.js (83%) create mode 100644 forward_engineering/helpers/handleError.js diff --git a/common/errorCodes.js b/common/errorCodes.js new file mode 100644 index 00000000..993d2a2e --- /dev/null +++ b/common/errorCodes.js @@ -0,0 +1,4 @@ +module.exports = { + ERR_MISSING_PASSPHRASE: 'ERR_MISSING_PASSPHRASE', + ERR_OSSL_BAD_DECRYPT: 'ERR_OSSL_BAD_DECRYPT', +}; diff --git a/reverse_engineering/helpers/errorMessages.js b/common/errorMessages.js similarity index 83% rename from reverse_engineering/helpers/errorMessages.js rename to common/errorMessages.js index e25d3772..dbfad274 100644 --- a/reverse_engineering/helpers/errorMessages.js +++ b/common/errorMessages.js @@ -5,4 +5,5 @@ module.exports = { 'Incorrect Okta username/password or MFA is enabled. Please, check credentials or use the "Identity Provider SSO (via external browser)" for MFA auth', OKTA_MFA_ERROR: 'Native Okta auth doesn\'t support MFA. Please, use the "Identity Provider SSO (via external browser)" auth instead', + KEY_PAIR_ERROR: 'Please check that the passphrase is provided and matches the key.', }; diff --git a/forward_engineering/api.js b/forward_engineering/api.js index 811f73c0..2ee794df 100644 --- a/forward_engineering/api.js +++ b/forward_engineering/api.js @@ -1,9 +1,10 @@ const _ = require('lodash'); -const { commentDropStatements } = require('./helpers/commentHelpers/commentDropStatements'); -const { DROP_STATEMENTS } = require('./helpers/constants'); -const { getAlterScript } = require('./helpers/alterScriptFromDeltaHelper'); -const { applyToInstance } = require('./helpers/applyToInstanceHelper'); -const reApi = require('../reverse_engineering/api'); +const { commentDropStatements } = require('./helpers/commentHelpers/commentDropStatements.js'); +const { DROP_STATEMENTS } = require('./helpers/constants.js'); +const { getAlterScript } = require('./helpers/alterScriptFromDeltaHelper.js'); +const { applyToInstance } = require('./helpers/applyToInstanceHelper.js'); +const reApi = require('../reverse_engineering/api.js'); +const { handleError } = require('./helpers/handleError.js'); module.exports = { generateScript(data, logger, callback, app) { @@ -57,14 +58,7 @@ module.exports = { .then(result => { callback(null, result); }) - .catch(error => { - const err = { - message: error.message, - stack: error.stack, - }; - logger.log('error', err, 'Error when applying to instance'); - callback(err); - }); + .catch(error => handleError(logger, error, callback)); }, async getExternalBrowserUrl(connectionInfo, logger, cb, app) { diff --git a/forward_engineering/helpers/handleError.js b/forward_engineering/helpers/handleError.js new file mode 100644 index 00000000..e6992289 --- /dev/null +++ b/forward_engineering/helpers/handleError.js @@ -0,0 +1,22 @@ +const errorMessages = require('../../common/errorMessages.js'); +const errorCodes = require('../../common/errorCodes.js'); + +const handleError = (logger, error, callback) => { + logger.log('error', error, 'Error when applying to instance'); + + if (error.code === errorCodes.ERR_MISSING_PASSPHRASE || error.code === errorCodes.ERR_OSSL_BAD_DECRYPT) { + return callback({ + message: errorMessages.KEY_PAIR_ERROR, + type: 'simpleError', + }); + } + + return callback({ + message: error.message, + stack: error.stack, + }); +}; + +module.exports = { + handleError, +}; diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index c65d4b9a..aecacee5 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -3,6 +3,8 @@ const _ = require('lodash'); const snowflakeHelper = require('./helpers/snowflakeHelper'); const ssoHelper = require('./helpers/ssoHelper'); +const errorMessages = require('../common/errorMessages.js'); +const errorCodes = require('../common/errorCodes.js'); const connect = async (connectionInfo, logger, cb) => { logger.clear(); @@ -270,9 +272,17 @@ const getSampleDocSize = (count, recordSamplingSettings) => { }; const handleError = (logger, error, cb) => { - const message = _.isString(error) ? error : _.get(error, 'message', 'Reverse Engineering error'); logger.log('error', { error }, 'Reverse Engineering error'); + if (error.code === errorCodes.ERR_MISSING_PASSPHRASE || error.code === errorCodes.ERR_OSSL_BAD_DECRYPT) { + return cb({ + message: errorMessages.KEY_PAIR_ERROR, + type: 'simpleError', + }); + } + + const message = _.isString(error) ? error : _.get(error, 'message', 'Reverse Engineering error'); + return cb({ message }); }; diff --git a/reverse_engineering/helpers/connections/connection.js b/reverse_engineering/helpers/connections/connection.js index 581e9555..a22b4efa 100644 --- a/reverse_engineering/helpers/connections/connection.js +++ b/reverse_engineering/helpers/connections/connection.js @@ -1,6 +1,6 @@ const snowflake = require('snowflake-sdk'); -const errorMessages = require('../errorMessages.js'); +const errorMessages = require('../../../common/errorMessages.js'); const { CONNECTION_TIMED_OUT_CODE } = require('./constants.js'); const noConnectionError = { message: errorMessages.CONNECTION_ERROR }; diff --git a/reverse_engineering/helpers/connections/keyPairConnection.js b/reverse_engineering/helpers/connections/keyPairConnection.js index 2bd3b278..d7848f27 100644 --- a/reverse_engineering/helpers/connections/keyPairConnection.js +++ b/reverse_engineering/helpers/connections/keyPairConnection.js @@ -1,15 +1,20 @@ const { connectWithTimeout } = require('./connection.js'); const authByKeyPair = ({ account, role, timeout, username, privateKeyPath, privateKeyPass }) => { - return connectWithTimeout({ - account, - role, - timeout, - username, - authenticator: 'SNOWFLAKE_JWT', - privateKeyPath, - ...(privateKeyPass && { privateKeyPass }), - }); + try { + return connectWithTimeout({ + account, + role, + timeout, + username, + authenticator: 'SNOWFLAKE_JWT', + privateKeyPath, + ...(privateKeyPass && { privateKeyPass }), + }); + } catch (err) { + if (err.code === 'ERR_MISSING_PASSPHRASE') { + } + } }; module.exports = { diff --git a/reverse_engineering/helpers/connections/oktaConnection.js b/reverse_engineering/helpers/connections/oktaConnection.js index d8a1aa68..6079d767 100644 --- a/reverse_engineering/helpers/connections/oktaConnection.js +++ b/reverse_engineering/helpers/connections/oktaConnection.js @@ -12,7 +12,7 @@ const { HACKOLADE_APPLICATION, } = require('./constants.js'); const { getAccountName, getRole } = require('../common.js'); -const errorMessages = require('../errorMessages.js'); +const errorMessages = require('../../../common/errorMessages.js'); const authByOkta = async ({ account, diff --git a/reverse_engineering/helpers/snowflakeHelper.js b/reverse_engineering/helpers/snowflakeHelper.js index d72c1227..ca51d265 100644 --- a/reverse_engineering/helpers/snowflakeHelper.js +++ b/reverse_engineering/helpers/snowflakeHelper.js @@ -3,7 +3,7 @@ const snowflake = require('snowflake-sdk'); const axios = require('axios'); const uuid = require('uuid'); const BSON = require('bson'); -const errorMessages = require('./errorMessages.js'); +const errorMessages = require('../../common/errorMessages.js'); const { getRole, getAccountName, removeQuotes } = require('./common.js'); const { authByOkta } = require('./connections/oktaConnection.js'); const { authByExternalBrowser } = require('./connections/externalBrowserConnection.js'); diff --git a/tsconfig.json b/tsconfig.json index c5275b03..dc607dbf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,6 +26,6 @@ "forceConsistentCasingInFileNames": true, "typeRoots": ["./node_modules/@types", "./types"] }, - "include": ["reverse_engineering", "forward_engineering"], + "include": ["reverse_engineering", "forward_engineering", "common/errorCodes.js", "common/errorMessages.js"], "exclude": ["**/node_modules/**", "release/**/*"] } From 0e2aa4449b38e127b27d5f2274d6c9f239e7eaf1 Mon Sep 17 00:00:00 2001 From: Nazar Kovtun Date: Fri, 8 Aug 2025 15:04:50 +0300 Subject: [PATCH 2/2] HCK-12280: remove redundant code and update tsconfig.json --- .../helpers/connections/keyPairConnection.js | 23 ++++++++----------- tsconfig.json | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/reverse_engineering/helpers/connections/keyPairConnection.js b/reverse_engineering/helpers/connections/keyPairConnection.js index d7848f27..2bd3b278 100644 --- a/reverse_engineering/helpers/connections/keyPairConnection.js +++ b/reverse_engineering/helpers/connections/keyPairConnection.js @@ -1,20 +1,15 @@ const { connectWithTimeout } = require('./connection.js'); const authByKeyPair = ({ account, role, timeout, username, privateKeyPath, privateKeyPass }) => { - try { - return connectWithTimeout({ - account, - role, - timeout, - username, - authenticator: 'SNOWFLAKE_JWT', - privateKeyPath, - ...(privateKeyPass && { privateKeyPass }), - }); - } catch (err) { - if (err.code === 'ERR_MISSING_PASSPHRASE') { - } - } + return connectWithTimeout({ + account, + role, + timeout, + username, + authenticator: 'SNOWFLAKE_JWT', + privateKeyPath, + ...(privateKeyPass && { privateKeyPass }), + }); }; module.exports = { diff --git a/tsconfig.json b/tsconfig.json index dc607dbf..d09022c5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,6 +26,6 @@ "forceConsistentCasingInFileNames": true, "typeRoots": ["./node_modules/@types", "./types"] }, - "include": ["reverse_engineering", "forward_engineering", "common/errorCodes.js", "common/errorMessages.js"], + "include": ["reverse_engineering", "forward_engineering", "common"], "exclude": ["**/node_modules/**", "release/**/*"] }