Skip to content

Commit 6cf3ce6

Browse files
authored
Add more fetchers for AWS IAM (#95)
1 parent 4ef40fb commit 6cf3ce6

38 files changed

+1655
-6
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* This file was generated by the Gradle 'init' task.
3+
*
4+
* This project uses @Incubating APIs which are subject to change.
5+
*/
6+
7+
plugins {
8+
id 'blaze-query.java-conventions'
9+
}
10+
11+
dependencies {
12+
api project(':blaze-query-connector-aws-base')
13+
api libs.awssdk.accessanalyzer
14+
testImplementation project(':blaze-query-core-impl')
15+
testImplementation libs.junit.jupiter
16+
testImplementation libs.assertj.core
17+
}
18+
19+
description = 'blaze-query-connector-aws-accessanalyzer'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.accessanalyzer;
6+
7+
import com.blazebit.query.connector.aws.base.AwsConnectorConfig;
8+
import com.blazebit.query.connector.aws.base.AwsConventionContext;
9+
import com.blazebit.query.connector.base.DataFormats;
10+
import com.blazebit.query.spi.DataFetchContext;
11+
import com.blazebit.query.spi.DataFetcher;
12+
import com.blazebit.query.spi.DataFetcherException;
13+
import com.blazebit.query.spi.DataFormat;
14+
import software.amazon.awssdk.http.SdkHttpClient;
15+
import software.amazon.awssdk.regions.Region;
16+
import software.amazon.awssdk.services.accessanalyzer.AccessAnalyzerClient;
17+
import software.amazon.awssdk.services.accessanalyzer.AccessAnalyzerClientBuilder;
18+
import software.amazon.awssdk.services.accessanalyzer.model.AnalyzerSummary;
19+
import software.amazon.awssdk.services.accessanalyzer.model.ListAnalyzersRequest;
20+
21+
import java.io.Serializable;
22+
import java.util.ArrayList;
23+
import java.util.List;
24+
import java.util.StringTokenizer;
25+
26+
/**
27+
* @author Donghwi Kim
28+
* @since 1.0.0
29+
*/
30+
public class AccessAnalyzerAnalyzerDataFetcher implements DataFetcher<AwsAccessAnalyzerAnalyzer>, Serializable {
31+
32+
public static final AccessAnalyzerAnalyzerDataFetcher INSTANCE = new AccessAnalyzerAnalyzerDataFetcher();
33+
34+
private AccessAnalyzerAnalyzerDataFetcher() {
35+
}
36+
37+
@Override
38+
public List<AwsAccessAnalyzerAnalyzer> fetch(DataFetchContext context) {
39+
try {
40+
List<AwsConnectorConfig.Account> accounts = AwsConnectorConfig.ACCOUNT.getAll( context );
41+
SdkHttpClient sdkHttpClient = AwsConnectorConfig.HTTP_CLIENT.find( context );
42+
List<AwsAccessAnalyzerAnalyzer> list = new ArrayList<>();
43+
for ( AwsConnectorConfig.Account account : accounts ) {
44+
for ( Region region : account.getRegions() ) {
45+
AccessAnalyzerClientBuilder clientBuilder = AccessAnalyzerClient.builder()
46+
.region( region )
47+
.credentialsProvider( account.getCredentialsProvider() );
48+
if ( sdkHttpClient != null ) {
49+
clientBuilder.httpClient( sdkHttpClient );
50+
}
51+
try (AccessAnalyzerClient client = clientBuilder.build()) {
52+
for ( AnalyzerSummary analyzer : client.listAnalyzersPaginator( ListAnalyzersRequest.builder().build() ).analyzers() ) {
53+
StringTokenizer tokenizer = new StringTokenizer( analyzer.arn(), ":" );
54+
// arn
55+
tokenizer.nextToken();
56+
// aws
57+
tokenizer.nextToken();
58+
// access-analyzer
59+
tokenizer.nextToken();
60+
// region
61+
tokenizer.nextToken();
62+
// account id
63+
tokenizer.nextToken();
64+
// resource id
65+
String resourceId = tokenizer.nextToken();
66+
67+
list.add( new AwsAccessAnalyzerAnalyzer(
68+
account.getAccountId(),
69+
region.id(),
70+
resourceId,
71+
analyzer
72+
) );
73+
}
74+
}
75+
}
76+
}
77+
return list;
78+
}
79+
catch (RuntimeException e) {
80+
throw new DataFetcherException( "Could not fetch analyzer list", e );
81+
}
82+
}
83+
84+
@Override
85+
public DataFormat getDataFormat() {
86+
return DataFormats.componentMethodConvention( AwsAccessAnalyzerAnalyzer.class, AwsConventionContext.INSTANCE );
87+
}
88+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.accessanalyzer;
6+
7+
import com.blazebit.query.connector.aws.base.AwsWrapper;
8+
import software.amazon.awssdk.services.accessanalyzer.model.AnalyzerSummary;
9+
10+
/**
11+
* @author Donghwi Kim
12+
* @since 1.0.0
13+
*/
14+
public class AwsAccessAnalyzerAnalyzer extends AwsWrapper<AnalyzerSummary> {
15+
16+
public AwsAccessAnalyzerAnalyzer(String accountId, String region, String resourceId, AnalyzerSummary payload) {
17+
super( accountId, region, resourceId, payload );
18+
}
19+
20+
@Override
21+
public AnalyzerSummary getPayload() {
22+
return super.getPayload();
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.accessanalyzer;
6+
7+
import com.blazebit.query.spi.ConfigurationProvider;
8+
import com.blazebit.query.spi.DataFetcher;
9+
import com.blazebit.query.spi.QuerySchemaProvider;
10+
11+
import java.util.Set;
12+
13+
/**
14+
* @author Donghwi Kim
15+
* @since 1.0.0
16+
*/
17+
public final class AwsAccessAnalyzerSchemaProvider implements QuerySchemaProvider {
18+
@Override
19+
public Set<? extends DataFetcher<?>> resolveSchemaObjects(ConfigurationProvider configurationProvider) {
20+
return Set.of(
21+
AccessAnalyzerAnalyzerDataFetcher.INSTANCE );
22+
}
23+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
6+
/**
7+
* Connector for the AWS Access Analyzer SDK.
8+
*/
9+
package com.blazebit.query.connector.aws.accessanalyzer;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
com.blazebit.query.connector.aws.accessanalyzer.AwsAccessAnalyzerSchemaProvider

connector/aws/base/src/main/java/com/blazebit/query/connector/aws/base/AwsConventionContext.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public ConventionContext getSubFilter(Class<?> concreteClass, Member member) {
2929
case "serializableBuilderClass":
3030
case "getValueForField":
3131
case "sdkHttpResponse":
32+
case "base32StringSeed":
33+
case "qrCodePNG":
34+
3235
return null;
3336
default:
3437
return this;

connector/aws/iam/src/main/java/com/blazebit/query/connector/aws/iam/AwsIAMSchemaProvider.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,21 @@ public final class AwsIAMSchemaProvider implements QuerySchemaProvider {
2121
public Set<? extends DataFetcher<?>> resolveSchemaObjects(ConfigurationProvider configurationProvider) {
2222
return Set.of(
2323
AwsIamUserDataFetcher.INSTANCE,
24+
AwsIamRoleDataFetcher.INSTANCE,
25+
AwsIamGroupDataFetcher.INSTANCE,
2426
AwsIamPasswordPolicyDataFetcher.INSTANCE,
2527
MFADeviceDataFetcher.INSTANCE,
28+
VirtualMfaDeviceDataFetcher.INSTANCE,
2629
AwsIamLoginProfileDataFetcher.INSTANCE,
2730
AwsIamAccountSummaryDataFetcher.INSTANCE,
28-
AwsIamAccessKeyMetaDataLastUsedDataFetcher.INSTANCE );
31+
AwsIamAccessKeyMetaDataLastUsedDataFetcher.INSTANCE,
32+
AwsIamPolicyDataFetcher.INSTANCE,
33+
AwsIamUserAttachedPolicyDataFetcher.INSTANCE,
34+
AwsIamUserInlinePolicyDataFetcher.INSTANCE,
35+
AwsIamGroupInlinePolicyDataFetcher.INSTANCE,
36+
AwsIamRoleInlinePolicyDataFetcher.INSTANCE,
37+
AwsIamGroupAttachedPolicyDataFetcher.INSTANCE,
38+
AwsIamRoleAttachedPolicyDataFetcher.INSTANCE,
39+
AwsIamServerCertificateDataFetcher.INSTANCE );
2940
}
3041
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.iam;
6+
7+
import com.blazebit.query.connector.aws.base.AwsWrapper;
8+
import software.amazon.awssdk.services.iam.model.GetGroupResponse;
9+
10+
/**
11+
* @author Donghwi Kim
12+
* @since 1.0.0
13+
*/
14+
public class AwsIamGroup extends AwsWrapper<GetGroupResponse> {
15+
public AwsIamGroup(String accountId, String resourceId, GetGroupResponse payload) {
16+
super( accountId, null, resourceId, payload );
17+
}
18+
19+
@Override
20+
public GetGroupResponse getPayload() {
21+
return super.getPayload();
22+
}
23+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.iam;
6+
7+
import software.amazon.awssdk.services.iam.model.AttachedPolicy;
8+
9+
/**
10+
* @author Donghwi Kim
11+
* @since 1.0.0
12+
*/
13+
public record AwsIamGroupAttachedPolicy(
14+
String accountId,
15+
String groupName,
16+
String policyName,
17+
String policyArn
18+
) {
19+
public static AwsIamGroupAttachedPolicy from(String accountId, String groupName, AttachedPolicy attachedPolicy) {
20+
return new AwsIamGroupAttachedPolicy(
21+
accountId,
22+
groupName,
23+
attachedPolicy.policyName(),
24+
attachedPolicy.policyArn()
25+
);
26+
}
27+
}

0 commit comments

Comments
 (0)