snowflake-sdk
Version:
Node.js driver for Snowflake
71 lines (62 loc) • 3.04 kB
JavaScript
/*
* Copyright (c) 2015-2024 Snowflake Computing Inc. All rights reserved.
*/
const toml = require('toml');
const os = require('os');
const fs = require('fs');
const { validateOnlyUserReadWritePermission, generateChecksum } = require('../file_transfer_agent/file_util');
const path = require('path');
const Logger = require('../logger');
const AuthenticationTypes = require('../authentication/authentication_types');
const Util = require('../util');
function defaultIfNotSet(value, defaultValue) {
if (value === null || typeof value === 'undefined' || value === '') {
return defaultValue;
} else {
return value;
}
}
function shouldReadTokenFromFile(fixedConfiguration) {
return fixedConfiguration && fixedConfiguration.authenticator &&
fixedConfiguration.authenticator.toUpperCase() === AuthenticationTypes.OAUTH_AUTHENTICATOR &&
!Util.string.isNotNullOrEmpty(fixedConfiguration.token);
}
function readTokenFromFile(fixedConfiguration) {
const tokenFilePath = fixedConfiguration.token_file_path ? fixedConfiguration.token_file_path : '/snowflake/session/token';
const resolvedPath = fs.realpathSync(tokenFilePath);
Logger.getInstance().trace('Token file path is : %s', tokenFilePath);
validateOnlyUserReadWritePermission(resolvedPath);
fixedConfiguration.token = fs.readFileSync(resolvedPath, 'utf-8').trim();
if (!fixedConfiguration.token) {
throw new Error('The token does not exist or has empty value');
}
const tokenChecksum = generateChecksum(fixedConfiguration.token);
Logger.getInstance().info('Token used in connection has been read from file: %s. Checksum: %s', resolvedPath, tokenChecksum);
}
function loadConnectionConfiguration() {
const snowflakeConfigDir = defaultIfNotSet(process.env.SNOWFLAKE_HOME, path.join(os.homedir(), '.snowflake'));
const filePath = path.join(snowflakeConfigDir, 'connections.toml');
const resolvedPath = fs.realpathSync(filePath);
validateOnlyUserReadWritePermission(resolvedPath);
const str = fs.readFileSync(resolvedPath, { encoding: 'utf8' });
const configurationChecksum = generateChecksum(str);
Logger.getInstance().info('Connection configuration file is read from file: %s. Checksum: %s', resolvedPath, configurationChecksum);
const parsingResult = toml.parse(str);
const configurationName = defaultIfNotSet(process.env.SNOWFLAKE_DEFAULT_CONNECTION_NAME, 'default');
if (parsingResult[configurationName] !== undefined) {
const fixedConfiguration = fixUserKey(parsingResult[configurationName]);
if (shouldReadTokenFromFile(fixedConfiguration)) {
readTokenFromFile(fixedConfiguration);
}
return fixedConfiguration;
} else {
throw new Error(`Connection configuration with name ${configurationName} does not exist`);
}
}
function fixUserKey(parsingResult) {
if (parsingResult['username'] === undefined && parsingResult['user'] !== undefined){
parsingResult['username'] = parsingResult['user'];
}
return parsingResult;
}
exports.loadConnectionConfiguration = loadConnectionConfiguration;