@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
141 lines (140 loc) • 5.46 kB
JavaScript
;
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;