index.js
#! /usr/bin/env node
'use strict'
const lib = require('./lib')
const program = require('commander')
const fs = require('fs')
const version = JSON.parse(fs.readFileSync('./package.json')).version
/**
* create a new object out of an existing one
*
* @param {*} object
*/
function clone (object) {
return JSON.parse(JSON.stringify(object))
}
/**
* retreive a line of entry-value pair in a special format
*
* @param {*} format - 'oneline' or 'multiline'
* @param {*} keySet - a set of keys as returnt by the drmgen library
* @param {*} entry - name of the key
* @param {*} key - value of the key
*/
function getLine (format, keySet, entry, key) {
if (format === 'oneline') return `${keySet[entry][key]} `
else return `${entry}-${key} ${keySet[entry][key]}\n`
}
/**
* initialize the CLI program
*
* @param {object} program - commander program object
* @param {string} version - the current tool version
* @param {array} argv - the comman line arguments
* @returns {object} initializedProgram
*/
function initializeProgram (program, version, argv) {
return program
.version(version, '-v, --version')
.option(
'-f, --format [value]',
'output format [multiline,json,oneline] (default:json)'
)
.option('-s, --swap', 'include swapped if set (default:false)')
.option(
'-e, --encoding [value]',
'output endodings one or more of [uuid, hex, base64] (default:all)'
)
.option(
'-i, --ids [value]',
'included id types [key, id, iv] (default:all)'
)
.parse(argv)
}
/**
* delete all swapped Ids from keySet
*
* @param {object} keySet
* @returns {object} keySet - without swapped Ids
*/
function deleteSwapped (keySet) {
let keySetCopy = clone(keySet)
delete keySet.keyFlipped
delete keySet.initializationVectorFlipped
delete keySet.idFlipped
return keySetCopy
}
/**
* make sure only specified ids are included in the key set
*
* @param {object} keySet
* @param {array} ids - array of ids to include
* @returns {object} keySet - including specified ids
*/
function includeIds (keySet, ids) {
let keySetCopy = clone(keySet)
for (let entry in keySetCopy) {
if (!ids.includes(entry.replace('Flipped', ''))) {
delete keySetCopy[entry]
}
}
return keySetCopy
}
/**
* limit the keySet to the specified encodings
*
* @param {object} keySet
* @param {array} encodings - array of encodings to include
* @returns {object} keySet - including specified encodings
*/
function includeEncodings (keySet, encodings) {
let keySetCopy = clone(keySet)
for (let entry in keySetCopy) {
for (let key in keySetCopy[entry]) {
if (!encodings.includes(key)) {
delete keySetCopy[entry][key]
}
}
}
return keySetCopy
}
/**
* restructure the key set generated by the drmgen library
*
* @param {*} keySet - drmgen keySet object
* @param {*} swap - should the swapt keys should be included
* @param {*} ids - included id types [key, id, iv] (default:all)
* @param {*} encoding - output endodings one or more of [uuid, hex, base64] (default:all)
*/
function restructureKeySet (keySet, swap, ids, encoding) {
let restructuredKeySet = clone(keySet)
if (!swap) restructuredKeySet = deleteSwapped(restructuredKeySet)
if (ids) restructuredKeySet = includeIds(keySet, ids)
if (encoding) restructuredKeySet = includeEncodings(keySet, encoding)
return restructuredKeySet
}
/**
* transorm the keyset from json in a desired output format
*
* @param {string} format - 'oneline', 'multiline' - default json
* @param {object} keySet - drmgen keySet object
* @returns {string} output - output to the console
*/
function formatKeySet (keySet, format) {
let output = ''
if (format === 'multiline' || format === 'oneline') {
for (let entry in keySet) {
for (let key in keySet[entry]) {
output += getLine(format, keySet, entry, key)
}
}
} else output = JSON.stringify(keySet, null, 2)
return output
}
if (require.main === module) {
const initProgram = initializeProgram(program, version, process.argv)
const keySet = lib.generateFullSet()
const restructuredKeySet = restructureKeySet(
keySet,
initProgram.swap,
initProgram.ids,
initProgram.encoding
)
console.log(formatKeySet(restructuredKeySet, initProgram.format))
} else {
module.exports = lib
}