From 809688401ffed1dddc6c175d2fa63795abe0b996 Mon Sep 17 00:00:00 2001 From: hasezoey Date: Mon, 8 May 2023 14:38:48 +0200 Subject: [PATCH] fix: remove usage of "md5-file" --- .../src/util/MongoBinaryDownload.ts | 5 ++--- .../src/util/__tests__/MongoBinaryDownload.test.ts | 11 ++++------- packages/mongodb-memory-server-core/src/util/utils.ts | 11 ++++++++++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/mongodb-memory-server-core/src/util/MongoBinaryDownload.ts b/packages/mongodb-memory-server-core/src/util/MongoBinaryDownload.ts index 1bab7512c..703dc843a 100644 --- a/packages/mongodb-memory-server-core/src/util/MongoBinaryDownload.ts +++ b/packages/mongodb-memory-server-core/src/util/MongoBinaryDownload.ts @@ -2,7 +2,6 @@ import os from 'os'; import { URL } from 'url'; import path from 'path'; import { promises as fspromises, createWriteStream, createReadStream, constants } from 'fs'; -import md5File from 'md5-file'; import https from 'https'; import { createUnzip } from 'zlib'; import tar from 'tar-stream'; @@ -11,7 +10,7 @@ import MongoBinaryDownloadUrl from './MongoBinaryDownloadUrl'; import { HttpsProxyAgent } from 'https-proxy-agent'; import resolveConfig, { envToBool, ResolveConfigVariables } from './resolveConfig'; import debug from 'debug'; -import { assertion, mkdir, pathExists } from './utils'; +import { assertion, mkdir, pathExists, md5 } from './utils'; import { DryMongoBinary } from './DryMongoBinary'; import { MongoBinaryOpts } from './MongoBinary'; import { clearLine } from 'readline'; @@ -200,7 +199,7 @@ export class MongoBinaryDownload { const signatureContent = (await fspromises.readFile(archiveMD5Path)).toString('utf-8'); const regexMatch = signatureContent.match(/^\s*([\w\d]+)\s*/i); const md5SigRemote = regexMatch ? regexMatch[1] : null; - const md5SigLocal = md5File.sync(mongoDBArchive); + const md5SigLocal = md5(mongoDBArchive); log(`makeMD5check: Local MD5: ${md5SigLocal}, Remote MD5: ${md5SigRemote}`); if (md5SigRemote !== md5SigLocal) { diff --git a/packages/mongodb-memory-server-core/src/util/__tests__/MongoBinaryDownload.test.ts b/packages/mongodb-memory-server-core/src/util/__tests__/MongoBinaryDownload.test.ts index 6b9d7c608..48ebecc44 100644 --- a/packages/mongodb-memory-server-core/src/util/__tests__/MongoBinaryDownload.test.ts +++ b/packages/mongodb-memory-server-core/src/util/__tests__/MongoBinaryDownload.test.ts @@ -1,5 +1,4 @@ import { createWriteStream, promises as fspromises } from 'fs'; -import md5file from 'md5-file'; import { assertIsError } from '../../__tests__/testUtils/test_utils'; import { DryMongoBinary } from '../DryMongoBinary'; import { Md5CheckFailedError } from '../errors'; @@ -13,8 +12,6 @@ import * as yazl from 'yazl'; import { pack } from 'tar-stream'; import { createGzip } from 'zlib'; -jest.mock('md5-file'); - describe('MongoBinaryDownload', () => { afterEach(() => { delete process.env[envName(ResolveConfigVariables.MD5_CHECK)]; @@ -129,7 +126,7 @@ describe('MongoBinaryDownload', () => { const fileWithReferenceMd5 = '/another/path'; jest.spyOn(fspromises, 'readFile').mockResolvedValueOnce(`${someMd5} fileName`); - jest.spyOn(md5file, 'sync').mockImplementationOnce(() => someMd5); + jest.spyOn(utils, 'md5').mockImplementationOnce(() => someMd5); jest.spyOn(fspromises, 'unlink').mockResolvedValue(void 0); const du = new MongoBinaryDownload({ downloadDir: '/', checkMD5: true }); @@ -141,12 +138,12 @@ describe('MongoBinaryDownload', () => { expect(du.download).toBeCalledWith(urlToMongoDBArchivePath); expect(fspromises.readFile).toBeCalledWith(fileWithReferenceMd5); expect(fspromises.unlink).toBeCalledTimes(1); - expect(md5file.sync).toBeCalledWith(mongoDBArchivePath); + expect(utils.md5).toBeCalledWith(mongoDBArchivePath); }); it('makeMD5check throws an error if md5 of downloaded mongoDBArchive is NOT the same as in the reference result', async () => { jest.spyOn(fspromises, 'readFile').mockResolvedValueOnce(`someMD5 fileName`); - jest.spyOn(md5file, 'sync').mockImplementationOnce(() => 'anotherMD5'); + jest.spyOn(utils, 'md5').mockImplementationOnce(() => 'anotherMD5'); const du = new MongoBinaryDownload({ downloadDir: '/', checkMD5: true }); jest.spyOn(du, 'download').mockResolvedValue(''); @@ -162,7 +159,7 @@ describe('MongoBinaryDownload', () => { it('false value of checkMD5 attribute disables makeMD5check validation', async () => { jest.spyOn(fspromises, 'readFile').mockResolvedValueOnce(`someMD5 fileName`); - jest.spyOn(md5file, 'sync').mockImplementationOnce(() => 'anotherMD5'); + jest.spyOn(utils, 'md5').mockImplementationOnce(() => 'anotherMD5'); const du = new MongoBinaryDownload({ downloadDir: '/', checkMD5: false }); const result = await du.makeMD5check('', ''); diff --git a/packages/mongodb-memory-server-core/src/util/utils.ts b/packages/mongodb-memory-server-core/src/util/utils.ts index 6f4d984b6..da02b37f8 100644 --- a/packages/mongodb-memory-server-core/src/util/utils.ts +++ b/packages/mongodb-memory-server-core/src/util/utils.ts @@ -10,7 +10,7 @@ import { } from './errors'; import { tmpdir } from 'os'; import * as path from 'path'; -import { randomUUID } from 'crypto'; +import { BinaryLike, createHash, randomUUID } from 'crypto'; const log = debug('MongoMS:utils'); @@ -365,3 +365,12 @@ export async function removeDir(dirPath: string): Promise { export function uuidv4(): string { return randomUUID(); } + +/** + * Helper function to have md5 generation and definition in one place + * @param content the content to checksum + * @returns a md5 of the input + */ +export function md5(content: BinaryLike): string { + return createHash('md5').update(content).digest('hex'); +}