Skip to content

Commit 494ec24

Browse files
committed
NC | IAM | Return Empty List On Unimplemented List Operations
Add LIST operations in IAM Signed-off-by: shirady <[email protected]>
1 parent 1535c1e commit 494ec24

31 files changed

+1662
-3
lines changed

docs/design/iam.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,38 @@ Here attached a diagram with all the accounts that we have in our system:
127127
- IAM ListAccessKeys: UserName (not supported: Marker, MaxItems)
128128

129129
### Other
130-
- IAM ListGroupsForUser - would always return empty list (to check that the user exists it runs GetUser).
130+
Would always return an empty list (to check that the user exists it runs GetUser)
131+
- IAM ListGroupsForUser
132+
- IAM ListAttachedUserPolicies
133+
- IAM ListMFADevices
134+
- IAM ListServiceSpecificCredentials
135+
- IAM ListSigningCertificates
136+
- IAM ListSSHPublicKeys
137+
- IAM ListUserPolicies
138+
- IAM ListUserTags
139+
Would always return an empty list
140+
- IAM ListAccountAliases
141+
- IAM ListAttachedGroupPolicies
142+
- IAM ListAttachedRolePolicies
143+
- IAM ListGroupPolicies
144+
- IAM ListGroups
145+
- IAM ListInstanceProfiles
146+
- IAM ListOpenIDConnectProviders
147+
- IAM ListPolicies
148+
- IAM ListRoles
149+
- IAM ListSAMLProviders
150+
- IAM ListServerCertificates
151+
- IAM ListVirtualMFADevices
152+
Would always return `NoSuchEntity` error
153+
- IAM ListEntitiesForPolicy
154+
- IAM ListInstanceProfilesForRole
155+
- IAM ListInstanceProfileTags
156+
- IAM ListMFADeviceTags
157+
- IAM ListOpenIDConnectProviderTags
158+
- IAM ListPolicyTags
159+
- IAM ListPolicyVersions
160+
- IAM ListRoleTags
161+
- IAM ListServerCertificateTags
131162

132163
### Configuration Directory Components With users
133164
If account creates a user its config file will be created under identities/<user-id>.identity.json and under the account will be created `users/` directory and inside it it will link to the config.

src/endpoint/iam/iam_rest.js

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,34 @@ const ACTIONS = Object.freeze({
3535
'DeleteAccessKey': 'delete_access_key',
3636
'ListAccessKeys': 'list_access_keys',
3737
'ListGroupsForUser': 'list_groups_for_user',
38+
'ListAccountAliases': 'list_account_aliases',
39+
'ListAttachedGroupPolicies': 'list_attached_group_policies',
40+
'ListAttachedRolePolicies': 'list_attached_role_policies',
41+
'ListAttachedUserPolicies': 'list_attached_user_policies',
42+
'ListEntitiesForPolicy': 'list_entities_for_policy',
43+
'ListGroupPolicies': 'list_group_policies',
44+
'ListGroups': 'list_groups',
45+
'ListInstanceProfiles': 'list_instance_profiles',
46+
'ListInstanceProfilesForRole': 'list_instance_profiles_for_role',
47+
'ListInstanceProfileTags': 'list_instance_profile_tags',
48+
'ListMFADevices': 'list_mfa_devices',
49+
'ListMFADeviceTags': 'list_mfa_device_tags',
50+
'ListOpenIDConnectProviders': 'list_open_id_connect_providers',
51+
'ListOpenIDConnectProviderTags': 'list_open_id_connect_provider_tags',
52+
'ListPolicies': 'list_policies',
53+
'ListPolicyTags': 'list_policy_tags',
54+
'ListPolicyVersions': 'list_policy_versions',
55+
'ListRoles': 'list_roles',
56+
'ListRoleTags': 'list_role_tags',
57+
'ListSAMLProviders': 'list_saml_providers',
58+
'ListServerCertificates': 'list_server_certificates',
59+
'ListServerCertificateTags': 'list_server_certificate_tags',
60+
'ListServiceSpecificCredentials': 'list_service_specific_credentials',
61+
'ListSigningCertificates': 'list_signing_certificates',
62+
'ListSSHPublicKeys': 'list_ssh_public_keys',
63+
'ListUserPolicies': 'list_user_policies',
64+
'ListUserTags': 'list_user_tags',
65+
'ListVirtualMFADevices': 'list_virtual_mfa_devices',
3866
});
3967

4068
// notice: shows all methods as method post
@@ -51,8 +79,36 @@ const IAM_OPS = js_utils.deep_freeze({
5179
post_update_access_key: require('./ops/iam_update_access_key'),
5280
post_delete_access_key: require('./ops/iam_delete_access_key'),
5381
post_list_access_keys: require('./ops/iam_list_access_keys'),
54-
// other (currently ops that return empty just not to fail them)
82+
// other (currently ops that return empty or NoSuchEntity error - just not to fail them)
5583
post_list_groups_for_user: require('./ops/iam_list_groups_for_user.js'),
84+
post_list_account_aliases: require('./ops/iam_list_account_aliases.js'),
85+
post_list_attached_group_policies: require('./ops/iam_list_attached_group_policies.js'),
86+
post_list_attached_role_policies: require('./ops/iam_list_attached_role_policies.js'),
87+
post_list_attached_user_policies: require('./ops/iam_list_attached_user_policies.js'),
88+
post_list_entities_for_policy: require('./ops/iam_list_entities_for_policy.js'),
89+
post_list_group_policies: require('./ops/iam_list_group_policies.js'),
90+
post_list_groups: require('./ops/iam_list_groups.js'),
91+
post_list_instance_profiles: require('./ops/iam_list_instance_profiles.js'),
92+
post_list_instance_profiles_for_role: require('./ops/iam_list_instance_profiles_for_role.js'),
93+
post_list_instance_profile_tags: require('./ops/iam_list_instance_profile_tags.js'),
94+
post_list_mfa_devices: require('./ops/iam_list_mfa_devices.js'),
95+
post_list_mfa_device_tags: require('./ops/iam_list_mfa_device_tags.js'),
96+
post_list_open_id_connect_providers: require('./ops/iam_list_open_id_connect_providers.js'),
97+
post_list_open_id_connect_provider_tags: require('./ops/iam_list_open_id_connect_provider_tags.js'),
98+
post_list_policies: require('./ops/iam_list_policies.js'),
99+
post_list_policy_tags: require('./ops/iam_list_policy_tags.js'),
100+
post_list_policy_versions: require('./ops/iam_list_policy_versions.js'),
101+
post_list_roles: require('./ops/iam_list_roles.js'),
102+
post_list_role_tags: require('./ops/iam_list_role_tags.js'),
103+
post_list_saml_providers: require('./ops/iam_list_saml_providers.js'),
104+
post_list_server_certificates: require('./ops/iam_list_server_certificates.js'),
105+
post_list_server_certificate_tags: require('./ops/iam_list_server_certificate_tags.js'),
106+
post_list_service_specific_credentials: require('./ops/iam_list_service_specific_credentials.js'),
107+
post_list_signing_certificates: require('./ops/iam_list_signing_certificates.js'),
108+
post_list_ssh_public_keys: require('./ops/iam_list_ssh_public_keys.js'),
109+
post_list_user_policies: require('./ops/iam_list_user_policies.js'),
110+
post_list_user_tags: require('./ops/iam_list_user_tags.js'),
111+
post_list_virtual_mfa_devices: require('./ops/iam_list_virtual_mfa_devices.js'),
56112
});
57113

58114
async function iam_rest(req, res) {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/* Copyright (C) 2024 NooBaa */
2+
'use strict';
3+
4+
const dbg = require('../../../util/debug_module')(__filename);
5+
const iam_utils = require('../iam_utils');
6+
const iam_constants = require('../iam_constants');
7+
const { CONTENT_TYPE_APP_FORM_URLENCODED } = require('../../../util/http_utils');
8+
9+
/**
10+
* https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccountAliases.html
11+
*/
12+
async function list_account_aliases(req, res) {
13+
14+
const params = {
15+
marker: req.body.marker,
16+
max_items: iam_utils.parse_max_items(req.body.max_items) ?? iam_constants.DEFAULT_MAX_ITEMS,
17+
};
18+
dbg.log1('IAM LIST ACCOUNT ALIASES (returns empty list on every request)', params);
19+
20+
return {
21+
ListAccountAliasesResponse: {
22+
ListAccountAliasesResult: {
23+
AccountAliases: [],
24+
IsTruncated: false,
25+
},
26+
ResponseMetadata: {
27+
RequestId: req.request_id,
28+
}
29+
},
30+
};
31+
}
32+
33+
module.exports = {
34+
handler: list_account_aliases,
35+
body: {
36+
type: CONTENT_TYPE_APP_FORM_URLENCODED,
37+
},
38+
reply: {
39+
type: 'xml',
40+
},
41+
};
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/* Copyright (C) 2024 NooBaa */
2+
'use strict';
3+
4+
const dbg = require('../../../util/debug_module')(__filename);
5+
const iam_utils = require('../iam_utils');
6+
const iam_constants = require('../iam_constants');
7+
const { CONTENT_TYPE_APP_FORM_URLENCODED } = require('../../../util/http_utils');
8+
9+
/**
10+
* https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedGroupPolicies.html
11+
*/
12+
async function list_attached_group_policies(req, res) {
13+
14+
const params = {
15+
marker: req.body.marker,
16+
max_items: iam_utils.parse_max_items(req.body.max_items) ?? iam_constants.DEFAULT_MAX_ITEMS,
17+
iam_path_prefix: req.body.path_prefix,
18+
};
19+
dbg.log1('IAM LIST ATTACHED GROUP POLICIES (returns empty list on every request)', params);
20+
21+
return {
22+
ListAttachedGroupPoliciesResponse: {
23+
ListAttachedGroupPoliciesResult: {
24+
AttachedPolicies: [],
25+
IsTruncated: false,
26+
},
27+
ResponseMetadata: {
28+
RequestId: req.request_id,
29+
}
30+
},
31+
};
32+
}
33+
34+
module.exports = {
35+
handler: list_attached_group_policies,
36+
body: {
37+
type: CONTENT_TYPE_APP_FORM_URLENCODED,
38+
},
39+
reply: {
40+
type: 'xml',
41+
},
42+
};
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/* Copyright (C) 2024 NooBaa */
2+
'use strict';
3+
4+
const dbg = require('../../../util/debug_module')(__filename);
5+
const iam_utils = require('../iam_utils');
6+
const iam_constants = require('../iam_constants');
7+
const { CONTENT_TYPE_APP_FORM_URLENCODED } = require('../../../util/http_utils');
8+
9+
/**
10+
* https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html
11+
*/
12+
async function list_attached_role_policies(req, res) {
13+
14+
const params = {
15+
role_name: req.body.role_name,
16+
marker: req.body.marker,
17+
max_items: iam_utils.parse_max_items(req.body.max_items) ?? iam_constants.DEFAULT_MAX_ITEMS,
18+
iam_path_prefix: req.body.path_prefix,
19+
};
20+
dbg.log1('IAM LIST ATTACHED ROLE POLICIES (returns empty list on every request)', params);
21+
22+
return {
23+
ListAttachedRolePoliciesResponse: {
24+
ListAttachedRolePoliciesResult: {
25+
AttachedPolicies: [],
26+
},
27+
ResponseMetadata: {
28+
RequestId: req.request_id,
29+
}
30+
},
31+
};
32+
}
33+
34+
module.exports = {
35+
handler: list_attached_role_policies,
36+
body: {
37+
type: CONTENT_TYPE_APP_FORM_URLENCODED,
38+
},
39+
reply: {
40+
type: 'xml',
41+
},
42+
};
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/* Copyright (C) 2024 NooBaa */
2+
'use strict';
3+
4+
const dbg = require('../../../util/debug_module')(__filename);
5+
const iam_utils = require('../iam_utils');
6+
const iam_constants = require('../iam_constants');
7+
const { CONTENT_TYPE_APP_FORM_URLENCODED } = require('../../../util/http_utils');
8+
9+
10+
/**
11+
* https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedUserPolicies.html
12+
*/
13+
async function list_attached_user_policies(req, res) {
14+
15+
const params = {
16+
username: req.body.user_name,
17+
marker: req.body.marker,
18+
max_items: iam_utils.parse_max_items(req.body.max_items) ?? iam_constants.DEFAULT_MAX_ITEMS,
19+
iam_path_prefix: req.body.path_prefix,
20+
};
21+
22+
dbg.log1('To check that we have the user we will run the IAM GET USER', params);
23+
iam_utils.validate_params(iam_constants.IAM_ACTIONS.GET_USER, params);
24+
await req.account_sdk.get_user(params);
25+
26+
dbg.log1('IAM LIST ATTACHED USER POLICIES (returns empty list on every request)', params);
27+
28+
return {
29+
ListAttachedUserPoliciesResponse: {
30+
ListAttachedUserPoliciesResult: {
31+
AttachedPolicies: [],
32+
IsTruncated: false,
33+
},
34+
ResponseMetadata: {
35+
RequestId: req.request_id,
36+
}
37+
},
38+
};
39+
}
40+
41+
module.exports = {
42+
handler: list_attached_user_policies,
43+
body: {
44+
type: CONTENT_TYPE_APP_FORM_URLENCODED,
45+
},
46+
reply: {
47+
type: 'xml',
48+
},
49+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/* Copyright (C) 2024 NooBaa */
2+
'use strict';
3+
4+
const dbg = require('../../../util/debug_module')(__filename);
5+
const iam_utils = require('../iam_utils');
6+
const iam_constants = require('../iam_constants');
7+
const { CONTENT_TYPE_APP_FORM_URLENCODED } = require('../../../util/http_utils');
8+
9+
const IamError = require('../iam_errors').IamError;
10+
11+
/**
12+
* https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListEntitiesForPolicy.html
13+
*/
14+
async function list_entities_for_policy(req, res) {
15+
16+
const params = {
17+
policy_arn: req.body.policy_arn,
18+
marker: req.body.marker,
19+
max_items: iam_utils.parse_max_items(req.body.max_items) ?? iam_constants.DEFAULT_MAX_ITEMS,
20+
iam_path_prefix: req.body.path_prefix,
21+
entity_filter: req.body.entity_filter,
22+
policy_filter_usage: req.body.policy_filter_usage,
23+
};
24+
dbg.log1('IAM LIST ENTITIES FOR POLICY (returns NoSuchEntity on every request)', params);
25+
const message_with_details = ` Policy ${params.policy_arn} does not exist or is not attachable`;
26+
const { code, http_code, type } = IamError.NoSuchEntity;
27+
throw new IamError({ code, message: message_with_details, http_code, type });
28+
}
29+
30+
module.exports = {
31+
handler: list_entities_for_policy,
32+
body: {
33+
type: CONTENT_TYPE_APP_FORM_URLENCODED,
34+
},
35+
reply: {
36+
type: 'xml',
37+
},
38+
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/* Copyright (C) 2024 NooBaa */
2+
'use strict';
3+
4+
const dbg = require('../../../util/debug_module')(__filename);
5+
const iam_utils = require('../iam_utils');
6+
const iam_constants = require('../iam_constants');
7+
const { CONTENT_TYPE_APP_FORM_URLENCODED } = require('../../../util/http_utils');
8+
9+
/**
10+
* https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroupPolicies.html
11+
*/
12+
async function list_groups_policies(req, res) {
13+
14+
const params = {
15+
group_name: req.body.group_name,
16+
marker: req.body.marker,
17+
max_items: iam_utils.parse_max_items(req.body.max_items) ?? iam_constants.DEFAULT_MAX_ITEMS,
18+
};
19+
20+
dbg.log1('IAM LIST GROUP POLICIES (returns empty list on every request)', params);
21+
22+
return {
23+
ListGroupPoliciesResponse: {
24+
ListGroupPoliciesResult: {
25+
PolicyNames: [],
26+
IsTruncated: false,
27+
},
28+
ResponseMetadata: {
29+
RequestId: req.request_id,
30+
}
31+
},
32+
};
33+
}
34+
35+
module.exports = {
36+
handler: list_groups_policies,
37+
body: {
38+
type: CONTENT_TYPE_APP_FORM_URLENCODED,
39+
},
40+
reply: {
41+
type: 'xml',
42+
},
43+
};

0 commit comments

Comments
 (0)