UNPKG

@csermet/multiprovider

Version:

cloud-graph provider plugin for AWS used to fetch AWS cloud data.

141 lines (140 loc) 5.46 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatIamJsonPolicy = exports.parseCSV = exports.pascalize = exports.camelize = exports.obfuscateSensitiveString = exports.formatTagsFromMap = exports.convertAwsTagsToTagMap = void 0; const parse_1 = require("@fast-csv/parse"); const sdk_1 = __importStar(require("@cloudgraph/sdk")); const isArray_1 = __importDefault(require("lodash/isArray")); const toString_1 = __importDefault(require("lodash/toString")); const { logger } = sdk_1.default; /** * Function to convert aws formatted tags to TagMap */ const convertAwsTagsToTagMap = (tags = []) => { const tagsMap = {}; for (const tag of tags) { const { Key, Value } = tag; tagsMap[Key] = Value; } return tagsMap; }; exports.convertAwsTagsToTagMap = convertAwsTagsToTagMap; const formatTagsFromMap = (tags) => { const result = []; for (const [key, value] of Object.entries(tags)) { // We need an id here to enfore uniqueness for Dgraph, otherwise we get duplicate tags result.push({ id: `${key}:${value}`, key, value }); } return result; }; exports.formatTagsFromMap = formatTagsFromMap; const obfuscateSensitiveString = (s) => { const stars = '*'.repeat(Math.min(30, s.length - 6)); return s.slice(0, 3) + stars + s.slice(stars.length + 3, s.length); }; exports.obfuscateSensitiveString = obfuscateSensitiveString; /** * Transform key from snake_case to camelCase */ const camelize = (key) => key.replace(/[\-_\s]+(.)?/g, (_, character) => { return character ? character.toUpperCase() : ''; }); exports.camelize = camelize; /** * Transform key from snake_case to PascalCase */ const pascalize = (key) => { const camelized = exports.camelize(key); // TODO: Change to String.slice? return camelized.substr(0, 1).toUpperCase() + camelized.substr(1); }; exports.pascalize = pascalize; const parseCSV = (csv) => new Promise(resolve => { const credentialReportData = []; parse_1.parseString(csv, { headers: headers => headers.map(h => exports.pascalize(h)), }) .on('error', () => resolve([])) .on('data', row => credentialReportData.push(row)) .on('end', (rowCount) => { logger.debug(`Parsed ${rowCount} rows`); resolve(credentialReportData); }); }); exports.parseCSV = parseCSV; const formatIamJsonPolicy = (json) => { let object; try { object = JSON.parse(json.replace(/\\"/g, '"')); } catch (err) { return null; } const statement = isArray_1.default(object.Statement) ? object.Statement : [object.Statement]; const formatCondition = (condition) => { if (!condition) return null; return Object.entries(condition).map(([key, value = {}]) => { const entry = Object.entries(value)[0] || []; const conVal = (isArray_1.default(entry[1]) ? entry[1] : [entry[1]]) || []; return { operator: key, key: entry[0], value: conVal.map(val => toString_1.default(val)), }; }); }; const formatPrincipal = (principal) => { if (!principal) return null; return Object.entries(principal).map(([key, value]) => { const conVal = (isArray_1.default(value) ? value : [value]) || []; return { key: key === '0' ? '' : key.toString(), value: conVal.map(val => toString_1.default(val)), }; }); }; return { id: sdk_1.generateUniqueId(json), version: object.Version, statement: statement.map((el) => ({ action: isArray_1.default(el.Action) ? el.Action : [toString_1.default(el.Action)], notAction: isArray_1.default(el.NotAction) ? el.NotAction : [toString_1.default(el.NotAction)], condition: formatCondition(el.Condition), effect: el.Effect, principal: formatPrincipal(el.Principal), notPrincipal: formatPrincipal(el.NotPrincipal), resource: isArray_1.default(el.Resource) ? el.Resource : [toString_1.default(el.Resource)], notResource: isArray_1.default(el.NotResource) ? el.NotResource : [toString_1.default(el.NotResource)], })), }; }; exports.formatIamJsonPolicy = formatIamJsonPolicy;