Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 28 additions & 6 deletions lib/mongoose-field-encryption.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,24 @@ const fieldEncryption = function(schema, options) {
const fieldsToEncrypt = options.fields || [];
const secret = options.secret;

// for mongoose 4/5 compatibility
const defaultNext = function defaultNext(err) {
if (err) { throw err }
}
function getCompatitibleNextFunc(next) {
if (typeof next !== 'function') {
return defaultNext;
}
return next;
}
function getCompatibleData(next, data) {
// in mongoose5, 'data' field is undefined
if (!data) {
return next;
}
return data;
}

// add marker fields to schema
for (let field of fieldsToEncrypt) {
const encryptedFieldName = encryptedFieldNamePrefix + field;
Expand All @@ -47,7 +65,7 @@ const fieldEncryption = function(schema, options) {
const fieldValue = obj[field];

if (!obj[encryptedFieldName] && fieldValue) {
if (typeof fieldValue === 'string') { // handle strings separately to maintain searchability
if (typeof fieldValue === 'string') { // handle strings separately to maintain searchability
const value = encrypt(fieldValue, secret);
obj[field] = value;
} else {
Expand All @@ -73,7 +91,7 @@ const fieldEncryption = function(schema, options) {
obj[encryptedFieldName] = false;
obj[encryptedFieldData] = '';

} else if (obj[encryptedFieldName]) { // handle strings separately to maintain searchability
} else if (obj[encryptedFieldName]) { // handle strings separately to maintain searchability
const encryptedValue = obj[field];

obj[field] = decrypt(encryptedValue, secret);
Expand All @@ -82,7 +100,9 @@ const fieldEncryption = function(schema, options) {
}
};

schema.pre('init', function(next, data) {
schema.pre('init', function(_next, _data) {
const next = getCompatitibleNextFunc(_next)
const data = getCompatibleData(_next, _data)
try {
decryptFields(data, fieldsToEncrypt, secret);
next();
Expand All @@ -91,7 +111,9 @@ const fieldEncryption = function(schema, options) {
}
});

schema.pre('save', function(next) {
schema.pre('save', function(_next) {
const next = getCompatitibleNextFunc(_next)

try {
encryptFields(this, fieldsToEncrypt, secret);
next();
Expand All @@ -100,8 +122,8 @@ const fieldEncryption = function(schema, options) {
}
});

schema.pre('update', function(next) {

schema.pre('update', function(_next) {
const next = getCompatitibleNextFunc(_next)
for (let field of fieldsToEncrypt) {

let encryptedFieldName = encryptedFieldNamePrefix + field;
Expand Down