oracledb
Version:
A Node.js module for Oracle Database access from JavaScript and TypeScript
200 lines (182 loc) • 6.19 kB
JavaScript
// Copyright (c) 2022, 2025, Oracle and/or its affiliates.
//-----------------------------------------------------------------------------
//
// This software is dual-licensed to you under the Universal Permissive License
// (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
// 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
// either license.
//
// If you elect to accept the software under the Apache License, Version 2.0,
// the following applies:
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//-----------------------------------------------------------------------------
'use strict';
const crypto = require('crypto');
const path = require('path');
const constants = require("./constants.js");
const fs = require("fs");
const {getFlags} = require("./ANO.js");
/**
* Generate UUID (Used for Connection ID)
* @returns Promise
*/
async function genuuid() {
return await new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
reject(err);
} else {
resolve(buf);
}
});
});
}
/**
* Network Session Attributes
*/
class SessionAtts {
constructor(uuid) {
this.largeSDU = false;
this.tdu = constants.NSPDFTDULN;
this.nt = {};
this.nt.tcpNoDelay = true;
this.uuid = uuid;
this.nt.sslServerDNMatch = true;
this.nt.sslAllowWeakDNMatch = false;
this.nt.useSNI = false;
}
/**
* Update Session attributes with input Parameters
* @param {object} Params Input paramters
*/
setFrom(params) {
if (params) {
if (params.sdu > 0) {
this.sdu = parseInt(params.sdu);
}
if (typeof params.networkCompression == 'boolean') {
this.networkCompression = params.networkCompression;
this.networkCompressionLevels = [];
if (params.networkCompressionLevels) {
if (params.networkCompressionLevels.includes('high'))
this.networkCompressionLevels.push('high');
if (params.networkCompressionLevels.length == 0)
this.networkCompressionLevels.push('high');
}
}
if (params.networkCompressionThreshold >= 200) {
this.networkCompressionThreshold = parseInt(params.networkCompressionThreshold);
} else
this.networkCompressionThreshold = 1024;
if (typeof params.walletLocation === 'string') {
this.nt.walletFile = path.join(params.walletLocation, constants.PEM_WALLET_FILE_NAME);
}
if (typeof params.walletPassword === 'string') {
this.nt.walletPassword = params.walletPassword;
}
if (typeof params.walletContent === 'string') {
this.nt.wallet = params.walletContent;
}
if (params.expireTime > 0) {
this.nt.expireTime = params.expireTime * 1000 * 60;
}
if (params.connectTimeout > 0) {
this.connectTimeout = params.connectTimeout * 1000;
}
if (params.transportConnectTimeout > 0) {
this.transportConnectTimeout = params.transportConnectTimeout * 1000;
}
if (params.recvTimeout > 0) {
this.recvTimeout = params.recvTimeout * 1000;
}
if (params.sendTimeout > 0) {
this.sendTimeout = params.sendTimeout * 1000;
}
if (typeof params.connectionIdPrefix === 'string') {
this.connectionIdPrefix = params.connectionIdPrefix;
}
if (typeof params.tcpNoDelay === 'boolean') {
this.nt.tcpNoDelay = params.tcpNoDelay;
}
if (typeof params.sslServerDNMatch === 'boolean') {
this.nt.sslServerDNMatch = params.sslServerDNMatch;
}
if (typeof params.sslAllowWeakDNMatch === 'boolean') {
this.nt.sslAllowWeakDNMatch = params.sslAllowWeakDNMatch;
}
if (typeof params.sslServerCertDN === 'string') {
this.nt.sslServerCertDN = params.sslServerCertDN;
}
if (typeof params.enable === 'string' && params.enable.toUpperCase() == "BROKEN") {
this.nt.enabledDCD = true;
}
if (typeof params.httpsProxy === 'string') {
this.nt.httpsProxy = params.httpsProxy;
}
if (params.httpsProxyPort >= 0) {
this.nt.httpsProxyPort = parseInt(params.httpsProxyPort);
}
if (typeof params.useSNI === 'boolean') {
this.nt.useSNI = params.useSNI;
}
}
}
/**
* Read wallet
* @returns Promise
*/
readWalletFile() {
return new Promise((resolve, reject)=> {
fs.readFile(this.nt.walletFile, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
/**
* Clear wallet
*/
clearWallet() {
if (this.nt.wallet && Buffer.isBuffer(this.nt.wallet))
this.nt.wallet.fill(0);
this.nt.wallet = null;
}
/**
* Prepare attributes for connection, Generate Connection ID and read Wallet file
*
*/
async prepare(protocol, userConfig) {
if (!this.uuid) {
this.uuid = await genuuid();
this.uuid = this.uuid.toString('base64');
}
if (this.connectionIdPrefix) {
this.connectionId = this.connectionIdPrefix + this.uuid;
} else {
this.connectionId = this.uuid;
}
this.nt.connectionId = this.connectionId;
if (protocol && (protocol.toUpperCase() == "TCPS" && !this.nt.wallet && this.nt.walletFile)) {
this.nt.wallet = await this.readWalletFile();
}
if (!this.connectTimeout && !this.transportConnectTimeout)
this.transportConnectTimeout = constants.DEFAULT_TRANSPORT_CONNECT_TIMEOUT; /* Default to 20 secs */
this.NAFlags = getFlags(protocol, userConfig);
}
}
module.exports = SessionAtts;