Skip to content

Commit

Permalink
feat(edit-logs): filter confidential fields
Browse files Browse the repository at this point in the history
  • Loading branch information
naholyr committed Sep 8, 2017
1 parent 654c905 commit b708294
Showing 1 changed file with 32 additions and 5 deletions.
37 changes: 32 additions & 5 deletions server/routes/editLog.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const { EditLog, flattenDiff } = require('../lib/edit-logs')
const { requiresAuthentication, scopeOrganizationMiddleware } = require('../lib/permissions')
const models = require('../lib/model')
const { fillIncompleteDate } = require('../export/helpers')
const { getAccessMonitoringPaths } = require('../lib/schemas')
const { getAccessMonitoringPaths, computeConfidentialPaths } = require('../lib/schemas')
const config = require('config')


Expand Down Expand Up @@ -152,8 +152,13 @@ function getEditLog(req, res){
}
})

const editsP = whoIdsItemIdsP
.then(whoIdsItemIds => {
const canViewConfidentialP = req.userCanViewConfidentialFields()

const editsP = Promise.all([
whoIdsItemIdsP,
canViewConfidentialP,
])
.then(([whoIdsItemIds, canViewConfidential]) => {
// build the mongo query to editLog collection
const mongoQuery = {model}
if (whoIdsItemIds.itemIds)
Expand Down Expand Up @@ -246,7 +251,7 @@ function getEditLog(req, res){
aggregationPipeline.push({'$limit':+query.limit})

return EditLog.aggregate(aggregationPipeline)
.then(data => query.count ? data[0] : formatEdits(data, model))
.then(data => query.count ? data[0] : formatEdits(data, model, !canViewConfidential))
})

return editsP
Expand All @@ -269,7 +274,7 @@ function formatItemName(data, model){
}
}

function formatEdits(data, model){
function formatEdits(data, model, removeConfidential){
const edits = []
data.forEach(d => {
const edit = {}
Expand Down Expand Up @@ -333,6 +338,10 @@ function formatEdits(data, model){
})
}

if (removeConfidential) {
edit.diff = edit.diff.filter(isNotConfidentialChange(model))
}

edit.accessMonitorings = getAccessMonitorings(model, edit.diff)

// if (edit.diff.length === 0){
Expand All @@ -356,3 +365,21 @@ const getAccessMonitorings = (model, formattedDiff) => {
}))
return Array.from(result)
}

const isNotConfidentialChange = model => {
const paths = computeConfidentialPaths(model)
// Remove all '.*' from schema path, as collection indices won't appear in formatted change
// Also add a final dot to compare proper paths and avoid confusion with field with same prefix
.map(path => path.replace(/\.\*/g, '') + '.')
return change => {
const currPath = change.path.join('.') + '.'
const isConfidential = paths.some(confidentialPath => {
//console.log({confidentialPath, currPath, matches: currPath.startsWith(confidentialPath)})
return currPath.startsWith(confidentialPath)
})
if (isConfidential) {
debug('Filtered confidential change', change)
}
return !isConfidential
}
}

0 comments on commit b708294

Please sign in to comment.