aws-iam-policy-tool
Version:
AWS IAM role/policy management cli tool
109 lines (108 loc) • 3.34 kB
JavaScript
;
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;