ingo-eichhorst/drmgen

View on GitHub
index.js

Summary

Maintainability
A
1 hr
Test Coverage
#! /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
}