123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- /* eslint-disable @typescript-eslint/no-var-requires */
- import type { Document } from './bson';
- import type { ProxyOptions } from './cmap/connection';
- import { MongoMissingDependencyError } from './error';
- import type { MongoClient } from './mongo_client';
- import type { Callback } from './utils';
- function makeErrorModule(error: any) {
- const props = error ? { kModuleError: error } : {};
- return new Proxy(props, {
- get: (_: any, key: any) => {
- if (key === 'kModuleError') {
- return error;
- }
- throw error;
- },
- set: () => {
- throw error;
- }
- });
- }
- export let Kerberos: typeof import('kerberos') | { kModuleError: MongoMissingDependencyError } =
- makeErrorModule(
- new MongoMissingDependencyError(
- 'Optional module `kerberos` not found. Please install it to enable kerberos authentication'
- )
- );
- export function getKerberos(): typeof Kerberos | { kModuleError: MongoMissingDependencyError } {
- try {
- // Ensure you always wrap an optional require in the try block NODE-3199
- Kerberos = require('kerberos');
- return Kerberos;
- } catch {
- return Kerberos;
- }
- }
- export interface KerberosClient {
- step(challenge: string): Promise<string>;
- step(challenge: string, callback: Callback<string>): void;
- wrap(challenge: string, options: { user: string }): Promise<string>;
- wrap(challenge: string, options: { user: string }, callback: Callback<string>): void;
- unwrap(challenge: string): Promise<string>;
- unwrap(challenge: string, callback: Callback<string>): void;
- }
- type ZStandardLib = {
- /**
- * Compress using zstd.
- * @param buf - Buffer to be compressed.
- */
- compress(buf: Buffer, level?: number): Promise<Buffer>;
- /**
- * Decompress using zstd.
- */
- decompress(buf: Buffer): Promise<Buffer>;
- };
- export let ZStandard: ZStandardLib | { kModuleError: MongoMissingDependencyError } =
- makeErrorModule(
- new MongoMissingDependencyError(
- 'Optional module `@mongodb-js/zstd` not found. Please install it to enable zstd compression'
- )
- );
- export function getZstdLibrary(): typeof ZStandard | { kModuleError: MongoMissingDependencyError } {
- try {
- ZStandard = require('@mongodb-js/zstd');
- return ZStandard;
- } catch {
- return ZStandard;
- }
- }
- /**
- * @internal
- * Copy of the AwsCredentialIdentityProvider interface from [`smithy/types`](https://socket.dev/npm/package/\@smithy/types/files/1.1.1/dist-types/identity/awsCredentialIdentity.d.ts),
- * the return type of the aws-sdk's `fromNodeProviderChain().provider()`.
- */
- export interface AWSCredentials {
- accessKeyId: string;
- secretAccessKey: string;
- sessionToken: string;
- expiration?: Date;
- }
- type CredentialProvider = {
- fromNodeProviderChain(
- this: void,
- options: { clientConfig: { region: string } }
- ): () => Promise<AWSCredentials>;
- fromNodeProviderChain(this: void): () => Promise<AWSCredentials>;
- };
- export function getAwsCredentialProvider():
- | CredentialProvider
- | { kModuleError: MongoMissingDependencyError } {
- try {
- // Ensure you always wrap an optional require in the try block NODE-3199
- const credentialProvider = require('@aws-sdk/credential-providers');
- return credentialProvider;
- } catch {
- return makeErrorModule(
- new MongoMissingDependencyError(
- 'Optional module `@aws-sdk/credential-providers` not found.' +
- ' Please install it to enable getting aws credentials via the official sdk.'
- )
- );
- }
- }
- /** @internal */
- export type SnappyLib = {
- /**
- * In order to support both we must check the return value of the function
- * @param buf - Buffer to be compressed
- */
- compress(buf: Buffer): Promise<Buffer>;
- /**
- * In order to support both we must check the return value of the function
- * @param buf - Buffer to be compressed
- */
- uncompress(buf: Buffer, opt: { asBuffer: true }): Promise<Buffer>;
- };
- export function getSnappy(): SnappyLib | { kModuleError: MongoMissingDependencyError } {
- try {
- // Ensure you always wrap an optional require in the try block NODE-3199
- const value = require('snappy');
- return value;
- } catch (cause) {
- const kModuleError = new MongoMissingDependencyError(
- 'Optional module `snappy` not found. Please install it to enable snappy compression',
- { cause }
- );
- return { kModuleError };
- }
- }
- export let saslprep:
- | typeof import('@mongodb-js/saslprep')
- | { kModuleError: MongoMissingDependencyError } = makeErrorModule(
- new MongoMissingDependencyError(
- 'Optional module `saslprep` not found.' +
- ' Please install it to enable Stringprep Profile for User Names and Passwords'
- )
- );
- try {
- // Ensure you always wrap an optional require in the try block NODE-3199
- saslprep = require('@mongodb-js/saslprep');
- } catch {} // eslint-disable-line
- interface AWS4 {
- /**
- * Created these inline types to better assert future usage of this API
- * @param options - options for request
- * @param credentials - AWS credential details, sessionToken should be omitted entirely if its false-y
- */
- sign(
- this: void,
- options: {
- path: '/';
- body: string;
- host: string;
- method: 'POST';
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded';
- 'Content-Length': number;
- 'X-MongoDB-Server-Nonce': string;
- 'X-MongoDB-GS2-CB-Flag': 'n';
- };
- service: string;
- region: string;
- },
- credentials:
- | {
- accessKeyId: string;
- secretAccessKey: string;
- sessionToken: string;
- }
- | {
- accessKeyId: string;
- secretAccessKey: string;
- }
- | undefined
- ): {
- headers: {
- Authorization: string;
- 'X-Amz-Date': string;
- };
- };
- }
- export let aws4: AWS4 | { kModuleError: MongoMissingDependencyError } = makeErrorModule(
- new MongoMissingDependencyError(
- 'Optional module `aws4` not found. Please install it to enable AWS authentication'
- )
- );
- try {
- // Ensure you always wrap an optional require in the try block NODE-3199
- aws4 = require('aws4');
- } catch {} // eslint-disable-line
- /** @public */
- export const AutoEncryptionLoggerLevel = Object.freeze({
- FatalError: 0,
- Error: 1,
- Warning: 2,
- Info: 3,
- Trace: 4
- } as const);
- /** @public */
- export type AutoEncryptionLoggerLevel =
- (typeof AutoEncryptionLoggerLevel)[keyof typeof AutoEncryptionLoggerLevel];
- /** @public */
- export interface AutoEncryptionTlsOptions {
- /**
- * Specifies the location of a local .pem file that contains
- * either the client's TLS/SSL certificate and key or only the
- * client's TLS/SSL key when tlsCertificateFile is used to
- * provide the certificate.
- */
- tlsCertificateKeyFile?: string;
- /**
- * Specifies the password to de-crypt the tlsCertificateKeyFile.
- */
- tlsCertificateKeyFilePassword?: string;
- /**
- * Specifies the location of a local .pem file that contains the
- * root certificate chain from the Certificate Authority.
- * This file is used to validate the certificate presented by the
- * KMS provider.
- */
- tlsCAFile?: string;
- }
- /** @public */
- export interface AutoEncryptionOptions {
- /** @internal client for metadata lookups */
- metadataClient?: MongoClient;
- /** A `MongoClient` used to fetch keys from a key vault */
- keyVaultClient?: MongoClient;
- /** The namespace where keys are stored in the key vault */
- keyVaultNamespace?: string;
- /** Configuration options that are used by specific KMS providers during key generation, encryption, and decryption. */
- kmsProviders?: {
- /** Configuration options for using 'aws' as your KMS provider */
- aws?:
- | {
- /** The access key used for the AWS KMS provider */
- accessKeyId: string;
- /** The secret access key used for the AWS KMS provider */
- secretAccessKey: string;
- /**
- * An optional AWS session token that will be used as the
- * X-Amz-Security-Token header for AWS requests.
- */
- sessionToken?: string;
- }
- | Record<string, never>;
- /** Configuration options for using 'local' as your KMS provider */
- local?: {
- /**
- * The master key used to encrypt/decrypt data keys.
- * A 96-byte long Buffer or base64 encoded string.
- */
- key: Buffer | string;
- };
- /** Configuration options for using 'azure' as your KMS provider */
- azure?:
- | {
- /** The tenant ID identifies the organization for the account */
- tenantId: string;
- /** The client ID to authenticate a registered application */
- clientId: string;
- /** The client secret to authenticate a registered application */
- clientSecret: string;
- /**
- * If present, a host with optional port. E.g. "example.com" or "example.com:443".
- * This is optional, and only needed if customer is using a non-commercial Azure instance
- * (e.g. a government or China account, which use different URLs).
- * Defaults to "login.microsoftonline.com"
- */
- identityPlatformEndpoint?: string | undefined;
- }
- | {
- /**
- * If present, an access token to authenticate with Azure.
- */
- accessToken: string;
- }
- | Record<string, never>;
- /** Configuration options for using 'gcp' as your KMS provider */
- gcp?:
- | {
- /** The service account email to authenticate */
- email: string;
- /** A PKCS#8 encrypted key. This can either be a base64 string or a binary representation */
- privateKey: string | Buffer;
- /**
- * If present, a host with optional port. E.g. "example.com" or "example.com:443".
- * Defaults to "oauth2.googleapis.com"
- */
- endpoint?: string | undefined;
- }
- | {
- /**
- * If present, an access token to authenticate with GCP.
- */
- accessToken: string;
- }
- | Record<string, never>;
- /**
- * Configuration options for using 'kmip' as your KMS provider
- */
- kmip?: {
- /**
- * The output endpoint string.
- * The endpoint consists of a hostname and port separated by a colon.
- * E.g. "example.com:123". A port is always present.
- */
- endpoint?: string;
- };
- };
- /**
- * A map of namespaces to a local JSON schema for encryption
- *
- * **NOTE**: Supplying options.schemaMap provides more security than relying on JSON Schemas obtained from the server.
- * It protects against a malicious server advertising a false JSON Schema, which could trick the client into sending decrypted data that should be encrypted.
- * Schemas supplied in the schemaMap only apply to configuring automatic encryption for Client-Side Field Level Encryption.
- * Other validation rules in the JSON schema will not be enforced by the driver and will result in an error.
- */
- schemaMap?: Document;
- /** Supply a schema for the encrypted fields in the document */
- encryptedFieldsMap?: Document;
- /** Allows the user to bypass auto encryption, maintaining implicit decryption */
- bypassAutoEncryption?: boolean;
- /** Allows users to bypass query analysis */
- bypassQueryAnalysis?: boolean;
- options?: {
- /** An optional hook to catch logging messages from the underlying encryption engine */
- logger?: (level: AutoEncryptionLoggerLevel, message: string) => void;
- };
- extraOptions?: {
- /**
- * A local process the driver communicates with to determine how to encrypt values in a command.
- * Defaults to "mongodb://%2Fvar%2Fmongocryptd.sock" if domain sockets are available or "mongodb://localhost:27020" otherwise
- */
- mongocryptdURI?: string;
- /** If true, autoEncryption will not attempt to spawn a mongocryptd before connecting */
- mongocryptdBypassSpawn?: boolean;
- /** The path to the mongocryptd executable on the system */
- mongocryptdSpawnPath?: string;
- /** Command line arguments to use when auto-spawning a mongocryptd */
- mongocryptdSpawnArgs?: string[];
- /**
- * Full path to a MongoDB Crypt shared library to be used (instead of mongocryptd).
- *
- * This needs to be the path to the file itself, not a directory.
- * It can be an absolute or relative path. If the path is relative and
- * its first component is `$ORIGIN`, it will be replaced by the directory
- * containing the mongodb-client-encryption native addon file. Otherwise,
- * the path will be interpreted relative to the current working directory.
- *
- * Currently, loading different MongoDB Crypt shared library files from different
- * MongoClients in the same process is not supported.
- *
- * If this option is provided and no MongoDB Crypt shared library could be loaded
- * from the specified location, creating the MongoClient will fail.
- *
- * If this option is not provided and `cryptSharedLibRequired` is not specified,
- * the AutoEncrypter will attempt to spawn and/or use mongocryptd according
- * to the mongocryptd-specific `extraOptions` options.
- *
- * Specifying a path prevents mongocryptd from being used as a fallback.
- *
- * Requires the MongoDB Crypt shared library, available in MongoDB 6.0 or higher.
- */
- cryptSharedLibPath?: string;
- /**
- * If specified, never use mongocryptd and instead fail when the MongoDB Crypt
- * shared library could not be loaded.
- *
- * This is always true when `cryptSharedLibPath` is specified.
- *
- * Requires the MongoDB Crypt shared library, available in MongoDB 6.0 or higher.
- */
- cryptSharedLibRequired?: boolean;
- /**
- * Search paths for a MongoDB Crypt shared library to be used (instead of mongocryptd)
- * Only for driver testing!
- * @internal
- */
- cryptSharedLibSearchPaths?: string[];
- };
- proxyOptions?: ProxyOptions;
- /** The TLS options to use connecting to the KMS provider */
- tlsOptions?: {
- aws?: AutoEncryptionTlsOptions;
- local?: AutoEncryptionTlsOptions;
- azure?: AutoEncryptionTlsOptions;
- gcp?: AutoEncryptionTlsOptions;
- kmip?: AutoEncryptionTlsOptions;
- };
- }
- /**
- * @public
- * @deprecated This interface will be removed in the next major version.
- */
- export interface AutoEncrypter {
- // eslint-disable-next-line @typescript-eslint/no-misused-new
- new (client: MongoClient, options: AutoEncryptionOptions): AutoEncrypter;
- init(cb: Callback): void;
- teardown(force: boolean, callback: Callback): void;
- encrypt(ns: string, cmd: Document, options: any, callback: Callback<Document>): void;
- decrypt(cmd: Document, options: any, callback: Callback<Document>): void;
- /** @experimental */
- readonly cryptSharedLibVersionInfo: { version: bigint; versionStr: string } | null;
- }
|