1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.UniqueStringSet = exports.mergePrincipal = exports.AttachedPolicies = exports.generatePolicyName = exports.undefinedIfEmpty = exports.LITERAL_STRING_KEY = void 0;
|
4 | const core_1 = require("@aws-cdk/core");
|
5 | const MAX_POLICY_NAME_LEN = 128;
|
6 | exports.LITERAL_STRING_KEY = 'LiteralString';
|
7 | function undefinedIfEmpty(f) {
|
8 | return core_1.Lazy.list({
|
9 | produce: () => {
|
10 | const array = f();
|
11 | return (array && array.length > 0) ? array : undefined;
|
12 | },
|
13 | });
|
14 | }
|
15 | exports.undefinedIfEmpty = undefinedIfEmpty;
|
16 | /**
|
17 | * Used to generate a unique policy name based on the policy resource construct.
|
18 | * The logical ID of the resource is a great candidate as long as it doesn't exceed
|
19 | * 128 characters, so we take the last 128 characters (in order to make sure the hash
|
20 | * is there).
|
21 | */
|
22 | function generatePolicyName(scope, logicalId) {
|
23 | // as logicalId is itself a Token, resolve it first
|
24 | const resolvedLogicalId = core_1.Tokenization.resolve(logicalId, {
|
25 | scope,
|
26 | resolver: new core_1.DefaultTokenResolver(new core_1.StringConcat()),
|
27 | });
|
28 | return lastNCharacters(resolvedLogicalId, MAX_POLICY_NAME_LEN);
|
29 | }
|
30 | exports.generatePolicyName = generatePolicyName;
|
31 | /**
|
32 | * Returns a string composed of the last n characters of str.
|
33 | * If str is shorter than n, returns str.
|
34 | *
|
35 | * @param str the string to return the last n characters of
|
36 | * @param n how many characters to return
|
37 | */
|
38 | function lastNCharacters(str, n) {
|
39 | const startIndex = Math.max(str.length - n, 0);
|
40 | return str.substring(startIndex, str.length);
|
41 | }
|
42 | /**
|
43 | * Helper class that maintains the set of attached policies for a principal.
|
44 | */
|
45 | class AttachedPolicies {
|
46 | constructor() {
|
47 | this.policies = new Array();
|
48 | }
|
49 | /**
|
50 | * Adds a policy to the list of attached policies.
|
51 | *
|
52 | * If this policy is already, attached, returns false.
|
53 | * If there is another policy attached with the same name, throws an exception.
|
54 | */
|
55 | attach(policy) {
|
56 | if (this.policies.find(p => p === policy)) {
|
57 | return; // already attached
|
58 | }
|
59 | if (this.policies.find(p => p.policyName === policy.policyName)) {
|
60 | throw new Error(`A policy named "${policy.policyName}" is already attached`);
|
61 | }
|
62 | this.policies.push(policy);
|
63 | }
|
64 | }
|
65 | exports.AttachedPolicies = AttachedPolicies;
|
66 | /**
|
67 | * Merge two dictionaries that represent IAM principals
|
68 | *
|
69 | * Does an in-place merge.
|
70 | */
|
71 | function mergePrincipal(target, source) {
|
72 | var _a;
|
73 | // If one represents a literal string, the other one must be empty
|
74 | if ((exports.LITERAL_STRING_KEY in source && !isEmptyObject(target)) ||
|
75 | (exports.LITERAL_STRING_KEY in target && !isEmptyObject(source))) {
|
76 | throw new Error(`Cannot merge principals ${JSON.stringify(target)} and ${JSON.stringify(source)}; if one uses a literal principal string the other one must be empty`);
|
77 | }
|
78 | for (const key of Object.keys(source)) {
|
79 | target[key] = (_a = target[key]) !== null && _a !== void 0 ? _a : [];
|
80 | let value = source[key];
|
81 | if (!Array.isArray(value)) {
|
82 | value = [value];
|
83 | }
|
84 | target[key].push(...value);
|
85 | }
|
86 | return target;
|
87 | }
|
88 | exports.mergePrincipal = mergePrincipal;
|
89 | /**
|
90 | * Lazy string set token that dedupes entries
|
91 | *
|
92 | * Needs to operate post-resolve, because the inputs could be
|
93 | * `[ '${Token[TOKEN.9]}', '${Token[TOKEN.10]}', '${Token[TOKEN.20]}' ]`, which
|
94 | * still all resolve to the same string value.
|
95 | *
|
96 | * Needs to JSON.stringify() results because strings could resolve to literal
|
97 | * strings but could also resolve to `{ Fn::Join: [...] }`.
|
98 | */
|
99 | class UniqueStringSet {
|
100 | constructor(fn) {
|
101 | this.fn = fn;
|
102 | this.creationStack = core_1.captureStackTrace();
|
103 | }
|
104 | static from(fn) {
|
105 | return core_1.Token.asList(new UniqueStringSet(fn));
|
106 | }
|
107 | resolve(context) {
|
108 | context.registerPostProcessor(this);
|
109 | return this.fn();
|
110 | }
|
111 | postProcess(input, _context) {
|
112 | if (!Array.isArray(input)) {
|
113 | return input;
|
114 | }
|
115 | if (input.length === 0) {
|
116 | return undefined;
|
117 | }
|
118 | const uniq = {};
|
119 | for (const el of input) {
|
120 | uniq[JSON.stringify(el)] = el;
|
121 | }
|
122 | return Object.values(uniq);
|
123 | }
|
124 | toString() {
|
125 | return core_1.Token.asString(this);
|
126 | }
|
127 | }
|
128 | exports.UniqueStringSet = UniqueStringSet;
|
129 | function isEmptyObject(x) {
|
130 | return Object.keys(x).length === 0;
|
131 | }
|
132 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0NBQStKO0FBSS9KLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBRW5CLFFBQUEsa0JBQWtCLEdBQUcsZUFBZSxDQUFDO0FBRWxELFNBQWdCLGdCQUFnQixDQUFDLENBQWlCO0lBQ2hELE9BQU8sV0FBSSxDQUFDLElBQUksQ0FBQztRQUNmLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDWixNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3pELENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBUEQsNENBT0M7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLEtBQWlCLEVBQUUsU0FBaUI7SUFDckUsbURBQW1EO0lBQ25ELE1BQU0saUJBQWlCLEdBQUcsbUJBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1FBQ3hELEtBQUs7UUFDTCxRQUFRLEVBQUUsSUFBSSwyQkFBb0IsQ0FBQyxJQUFJLG1CQUFZLEVBQUUsQ0FBQztLQUN2RCxDQUFDLENBQUM7SUFDSCxPQUFPLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFQRCxnREFPQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsZUFBZSxDQUFDLEdBQVcsRUFBRSxDQUFTO0lBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMs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QUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDL0I7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDNUI7SUFFTSxRQUFRO1FBQ2IsT0FBTyxZQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzdCO0NBQ0Y7QUE5QkQsMENBOEJDO0FBRUQsU0FBUyxhQUFhLENBQUMsQ0FBeUI7SUFDOUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhcHR1cmVTdGFja1RyYWNlLCBEZWZhdWx0VG9rZW5SZXNvbHZlciwgSVBvc3RQcm9jZXNzb3IsIElSZXNvbHZhYmxlLCBJUmVzb2x2ZUNvbnRleHQsIExhenksIFN0cmluZ0NvbmNhdCwgVG9rZW4sIFRva2VuaXphdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSVBvbGljeSB9IGZyb20gJy4vcG9saWN5JztcblxuY29uc3QgTUFYX1BPTElDWV9OQU1FX0xFTiA9IDEyODtcblxuZXhwb3J0IGNvbnN0IExJVEVSQUxfU1RSSU5HX0tFWSA9ICdMaXRlcmFsU3RyaW5nJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVuZGVmaW5lZElmRW1wdHkoZjogKCkgPT4gc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBMYXp5Lmxpc3Qoe1xuICAgIHByb2R1Y2U6ICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5ID0gZigpO1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSA/IGFycmF5IDogdW5kZWZpbmVkO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgcG9saWN5IG5hbWUgYmFzZWQgb24gdGhlIHBvbGljeSByZXNvdXJjZSBjb25zdHJ1Y3QuXG4gKiBUaGUgbG9naWNhbCBJRCBvZiB0aGUgcmVzb3VyY2UgaXMgYSBncmVhdCBjYW5kaWRhdGUgYXMgbG9uZyBhcyBpdCBkb2Vzbid0IGV4Y2VlZFxuICogMTI4IGNoYXJhY3RlcnMsIHNvIHdlIHRha2UgdGhlIGxhc3QgMTI4IGNoYXJhY3RlcnMgKGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGUgaGFzaFxuICogaXMgdGhlcmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQb2xpY3lOYW1lKHNjb3BlOiBJQ29uc3RydWN0LCBsb2dpY2FsSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGFzIGxvZ2ljYWxJZCBpcyBpdHNlbGYgYSBUb2tlbiwgcmVzb2x2ZSBpdCBmaXJzdFxuICBjb25zdCByZXNvbHZlZExvZ2ljYWxJZCA9IFRva2VuaXphdGlvbi5yZXNvbHZlKGxvZ2ljYWxJZCwge1xuICAgIHNjb3BlLFxuICAgIHJlc29sdmVyOiBuZXcgRGVmYXVsdFRva2VuUmVzb2x2ZXIobmV3IFN0cmluZ0NvbmNhdCgpKSxcbiAgfSk7XG4gIHJldHVybiBsYXN0TkNoYXJhY3RlcnMocmVzb2x2ZWRMb2dpY2FsSWQsIE1BWF9QT0xJQ1lfTkFNRV9MRU4pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgY29tcG9zZWQgb2YgdGhlIGxhc3QgbiBjaGFyYWN0ZXJzIG9mIHN0ci5cbiAqIElmIHN0ciBpcyBzaG9ydGVyIHRoYW4gbiwgcmV0dXJucyBzdHIuXG4gKlxuICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIHJldHVybiB0aGUgbGFzdCBuIGNoYXJhY3RlcnMgb2ZcbiAqIEBwYXJhbSBuIGhvdyBtYW55IGNoYXJhY3RlcnMgdG8gcmV0dXJuXG4gKi9cbmZ1bmN0aW9uIGxhc3ROQ2hhcmFjdGVycyhzdHI6IHN0cmluZywgbjogbnVtYmVyKSB7XG4gIGNvbnN0IHN0YXJ0SW5kZXggPSBNYXRoLm1heChzdHIubGVuZ3RoIC0gbiwgMCk7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIHN0ci5sZW5ndGgpO1xufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0aGF0IG1haW50YWlucyB0aGUgc2V0IG9mIGF0dGFjaGVkIHBvbGljaWVzIGZvciBhIHByaW5jaXBhbC5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0dGFjaGVkUG9saWNpZXMge1xuICBwcml2YXRlIHBvbGljaWVzID0gbmV3IEFycmF5PElQb2xpY3k+KCk7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwb2xpY3kgdG8gdGhlIGxpc3Qgb2YgYXR0YWNoZWQgcG9saWNpZXMuXG4gICAqXG4gICAqIElmIHRoaXMgcG9saWN5IGlzIGFscmVhZHksIGF0dGFjaGVkLCByZXR1cm5zIGZhbHNlLlxuICAgKiBJZiB0aGVyZSBpcyBhbm90aGVyIHBvbGljeSBhdHRhY2hlZCB3aXRoIHRoZSBzYW1lIG5hbWUsIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAqL1xuICBwdWJsaWMgYXR0YWNoKHBvbGljeTogSVBvbGljeSkge1xuICAgIGlmICh0aGlzLnBvbGljaWVzLmZpbmQocCA9PiBwID09PSBwb2xpY3kpKSB7XG4gICAgICByZXR1cm47IC8vIGFscmVhZHkgYXR0YWNoZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb2xpY2llcy5maW5kKHAgPT4gcC5wb2xpY3lOYW1lID09PSBwb2xpY3kucG9saWN5TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSBwb2xpY3kgbmFtZWQgXCIke3BvbGljeS5wb2xpY3lOYW1lfVwiIGlzIGFscmVhZHkgYXR0YWNoZWRgKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvbGljaWVzLnB1c2gocG9saWN5KTtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIHR3byBkaWN0aW9uYXJpZXMgdGhhdCByZXByZXNlbnQgSUFNIHByaW5jaXBhbHNcbiAqXG4gKiBEb2VzIGFuIGluLXBsYWNlIG1lcmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmluY2lwYWwodGFyZ2V0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sIHNvdXJjZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9KSB7XG4gIC8vIElmIG9uZSByZXByZXNlbnRzIGEgbGl0ZXJhbCBzdHJpbmcsIHRoZSBvdGhlciBvbmUgbXVzdCBiZSBlbXB0eVxuICBpZiAoKExJVEVSQUxfU1RSSU5HX0tFWSBpbiBzb3VyY2UgJiYgIWlzRW1wdHlPYmplY3QodGFyZ2V0KSkgfHxcbiAgICAoTElURVJBTF9TVFJJTkdfS0VZIGluIHRhcmdldCAmJiAhaXNFbXB0eU9iamVjdChzb3VyY2UpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1lcmdlIHByaW5jaXBhbHMgJHtKU09OLnN0cmluZ2lmeSh0YXJnZXQpfSBhbmQgJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfTsgaWYgb25lIHVzZXMgYSBsaXRlcmFsIHByaW5jaXBhbCBzdHJpbmcgdGhlIG90aGVyIG9uZSBtdXN0IGJlIGVtcHR5YCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB0YXJnZXRba2V5XSA/PyBbXTtcblxuICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gW3ZhbHVlXTtcbiAgICB9XG5cbiAgICB0YXJnZXRba2V5XS5wdXNoKC4uLnZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogTGF6eSBzdHJpbmcgc2V0IHRva2VuIHRoYXQgZGVkdXBlcyBlbnRyaWVzXG4gKlxuICogTmVlZHMgdG8gb3BlcmF0ZSBwb3N0LXJlc29sdmUsIGJlY2F1c2UgdGhlIGlucHV0cyBjb3VsZCBiZVxuICogYFsgJyR7VG9rZW5bVE9LRU4uOV19JywgJyR7VG9rZW5bVE9LRU4uMTBdfScsICcke1Rva2VuW1RPS0VOLjIwXX0nIF1gLCB3aGljaFxuICogc3RpbGwgYWxsIHJlc29sdmUgdG8gdGhlIHNhbWUgc3RyaW5nIHZhbHVlLlxuICpcbiAqIE5lZWRzIHRvIEpTT04uc3RyaW5naWZ5KCkgcmVzdWx0cyBiZWNhdXNlIHN0cmluZ3MgY291bGQgcmVzb2x2ZSB0byBsaXRlcmFsXG4gKiBzdHJpbmdzIGJ1dCBjb3VsZCBhbHNvIHJlc29sdmUgdG8gYHsgRm46OkpvaW46IFsuLi5dIH1gLlxuICovXG5leHBvcnQgY2xhc3MgVW5pcXVlU3RyaW5nU2V0IGltcGxlbWVudHMgSVJlc29sdmFibGUsIElQb3N0UHJvY2Vzc29yIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tKGZuOiAoKSA9PiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBUb2tlbi5hc0xpc3QobmV3IFVuaXF1ZVN0cmluZ1NldChmbikpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0aW9uU3RhY2s6IHN0cmluZ1tdO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBmbjogKCkgPT4gc3RyaW5nW10pIHtcbiAgICB0aGlzLmNyZWF0aW9uU3RhY2sgPSBjYXB0dXJlU3RhY2tUcmFjZSgpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgY29udGV4dC5yZWdpc3RlclBvc3RQcm9jZXNzb3IodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuZm4oKTtcbiAgfVxuXG4gIHB1YmxpYyBwb3N0UHJvY2VzcyhpbnB1dDogYW55LCBfY29udGV4dDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkgeyByZXR1cm4gaW5wdXQ7IH1cbiAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cblxuICAgIGNvbnN0IHVuaXE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIGlucHV0KSB7XG4gICAgICB1bmlxW0pTT04uc3RyaW5naWZ5KGVsKV0gPSBlbDtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModW5pcSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNFbXB0eU9iamVjdCh4OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh4KS5sZW5ndGggPT09IDA7XG59XG4iXX0= |
\ | No newline at end of file |