Skip to content

Commit

Permalink
Issue 374: Allow an option to choose the hashing algorithm
Browse files Browse the repository at this point in the history
- hashAlgorithm key added to DEFAULT_OPTIONS
- hashAlgorithm key can be overriden by value given in options argument
- buildOptions function will ensure a default a hashAlgorithm exists,
  and throw an error if the provided option is not supported by the
  system.
  - throws early error during app setup, rather than waiting
    until an upload is attempted
- memHandler and tempFileHandler use the hashAlgorithm option now
- Updated tests for buildOptions function in utilities.spec.js

ref: richardgirges#374
  • Loading branch information
Kpovoc committed Jun 25, 2024
1 parent 3325e62 commit a230423
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 12 deletions.
3 changes: 2 additions & 1 deletion lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ const DEFAULT_OPTIONS = {
createParentPath: false,
parseNested: false,
useTempFiles: false,
tempFileDir: path.join(process.cwd(), 'tmp')
tempFileDir: path.join(process.cwd(), 'tmp'),
hashAlgorithm: 'md5'
};

/**
Expand Down
2 changes: 1 addition & 1 deletion lib/memHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const { debugLog } = require('./utilities');
*/
module.exports = (options, fieldname, filename) => {
const buffers = [];
const hash = crypto.createHash('md5');
const hash = crypto.createHash(options.hashAlgorithm);
let fileSize = 0;
let completed = false;

Expand Down
4 changes: 2 additions & 2 deletions lib/tempFileHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ module.exports = (options, fieldname, filename) => {
checkAndMakeDir({ createParentPath: true }, tempFilePath);

debugLog(options, `Temporary file path is ${tempFilePath}`);
const hash = crypto.createHash('md5');

const hash = crypto.createHash(options.hashAlgorithm);
let fileSize = 0;
let completed = false;

Expand Down
15 changes: 15 additions & 0 deletions lib/utilities.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const { Readable } = require('stream');

// Parameters for safe file name parsing.
Expand Down Expand Up @@ -75,6 +76,20 @@ const buildOptions = function() {
if (!options || typeof options !== 'object') return;
Object.keys(options).forEach(i => result[i] = options[i]);
});

// Ensure a hashAlgorithm option exists.
if (!result.hashAlgorithm) {
result.hashAlgorithm = 'md5';
}

// Ensure the configured hashAlgorithm is available on the system
if (crypto.getHashes().find(h => result.hashAlgorithm === h) === undefined) {
throw Error(
`Hashing algorithm '${result.hashAlgorithm}' is not supported by this system's OpenSSL ` +
`version`
);
}

return result;
};

Expand Down
23 changes: 15 additions & 8 deletions test/utilities.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -199,25 +199,32 @@ describe('utilities: Test of the utilities functions', function() {
describe('Test buildOptions function', () => {

const source = { option1: '1', option2: '2' };
const sourceAddon = { option3: '3'};
const expected = { option1: '1', option2: '2' };
const expectedAddon = { option1: '1', option2: '2', option3: '3'};
const sourceAddon = { option3: '3', hashAlgorithm: 'sha256'};
const expected = { option1: '1', option2: '2', hashAlgorithm: 'md5' };
const expectedAddon = { option1: '1', option2: '2', option3: '3', hashAlgorithm: 'sha256'};

it('buildOptions returns and equal object to the object which was paased', () => {
let result = buildOptions(source);
assert.deepStrictEqual(result, source);
});
it(
'buildOptions returns an equal object to the object which was passed + hashAlgorithm '
+ 'property',
() => {
let result = buildOptions(source);
assert.deepStrictEqual(result, expected);
}
);

it('buildOptions doesnt add non object or null arguments to the result', () => {
let result = buildOptions(source, 2, '3', null);
assert.deepStrictEqual(result, expected);
});

it('buildOptions adds value to the result from the several source argumets', () => {
it('buildOptions adds value to the result from the several source arguments', () => {
let result = buildOptions(source, sourceAddon);
assert.deepStrictEqual(result, expectedAddon);
});

it('buildOptions throws an error when given an unsupported hashAlgorithm', () => {
assert.throws(() => buildOptions({ hashAlgorithm: 'not-actual-algo' }));
});
});
//buildFields tests
describe('Test buildFields function', () => {
Expand Down

0 comments on commit a230423

Please sign in to comment.