UNPKG

aws-iam-policy-tool

Version:
109 lines (108 loc) 3.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const iam_1 = require("./iam"); const operation_1 = require("./operation"); class PolicyEntry { constructor(arn, policy, document) { this.arn = arn; this.policyNode = policy; this.document = document; } get policyName() { return this.policyNode.PolicyName; } asJson() { return { Policy: this.policyNode, Document: this.document, }; } documentAsJson() { return this.convertDocToJSON(this.document, 4); } toCreatePolicyParams(indent) { return { PolicyName: this.policyNode.PolicyName, Path: this.policyNode.Path, PolicyDocument: this.convertDocToJSON(this.document, indent), }; } convertDocToJSON(doc, indent = 4) { return JSON.stringify(doc, null, indent); } } exports.PolicyEntry = PolicyEntry; class PolicyFetcher { constructor(arnPrefix) { this.arnPrefix = arnPrefix; } async getPolicyEntry(arn, versionId) { const [policyInfo, docNode] = await Promise.all([ operation_1.getPolicy(arn), this.getPolicyDocumentVersion(arn, versionId), ]); const policyNode = { PolicyName: policyInfo.PolicyName, Path: policyInfo.Path || '/', }; return new PolicyEntry(arn, policyNode, docNode); } async getPolicyDefaultWithVersionInfo(entry) { const { arn } = entry; const versions = await operation_1.listPolicyVersions(arn); if (versions.length === 0) { throw new Error('Failed to get policy versions'); } const { defaultId, oldestId, count } = this.getPolicyVersionsInfoFrom(versions); return { defaultId, oldestId, count, currentPolicy: await this.getPolicyEntry(arn, defaultId), }; } async getPolicyDocumentVersion(policyArn, verionId) { const result = await operation_1.getPolicyVersion(policyArn, verionId); return JSON.parse(decodeURIComponent(result.Document)); } getPolicyVersionsInfoFrom(versions) { let defaultId = ''; let oldestId = ''; let createDate = new Date('2099-12-31T00:00:00.000Z'); versions.forEach((ver) => { if (ver.IsDefaultVersion) { defaultId = ver.VersionId; } else { const date = ver.CreateDate; if (date < createDate) { createDate = date; oldestId = ver.VersionId; } } }); return { defaultId, oldestId, count: versions.length, }; } } exports.PolicyFetcher = PolicyFetcher; let _policyArnPrefix = null; async function getPolicyArnPrefix() { if (_policyArnPrefix) { return _policyArnPrefix; } const params = { Scope: 'Local', MaxItems: 1, }; const data = await iam_1.iam.listPolicies(params).promise(); const policies = data.Policies; if (policies.length) { _policyArnPrefix = policies[0].Arn.split('/')[0]; } return _policyArnPrefix; } exports.getPolicyArnPrefix = getPolicyArnPrefix;