github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/internal/adapters/cloud/aws/accessanalyzer/adapt.go (about) 1 package api_gateway 2 3 import ( 4 "fmt" 5 6 "github.com/aws/aws-sdk-go-v2/aws/arn" 7 api "github.com/aws/aws-sdk-go-v2/service/accessanalyzer" 8 aatypes "github.com/aws/aws-sdk-go-v2/service/accessanalyzer/types" 9 "github.com/khulnasoft-lab/defsec/internal/adapters/cloud/aws" 10 "github.com/khulnasoft-lab/defsec/pkg/concurrency" 11 "github.com/khulnasoft-lab/defsec/pkg/providers/aws/accessanalyzer" 12 "github.com/khulnasoft-lab/defsec/pkg/state" 13 "github.com/khulnasoft-lab/defsec/pkg/types" 14 ) 15 16 type adapter struct { 17 *aws.RootAdapter 18 api *api.Client 19 } 20 21 func init() { 22 aws.RegisterServiceAdapter(&adapter{}) 23 } 24 25 func (a *adapter) Provider() string { 26 return "aws" 27 } 28 29 func (a *adapter) Name() string { 30 return "accessanalyzer" 31 } 32 33 func (a *adapter) Adapt(root *aws.RootAdapter, state *state.State) error { 34 35 a.RootAdapter = root 36 a.api = api.NewFromConfig(root.SessionConfig()) 37 38 var err error 39 state.AWS.AccessAnalyzer.Analyzers, err = a.adaptAnalyzers() 40 if err != nil { 41 return err 42 } 43 44 return nil 45 } 46 47 func (a *adapter) adaptAnalyzers() ([]accessanalyzer.Analyzer, error) { 48 a.Tracker().SetServiceLabel("Discovering analyzers...") 49 50 var input api.ListAnalyzersInput 51 var apiAnalyzers []aatypes.AnalyzerSummary 52 for { 53 output, err := a.api.ListAnalyzers(a.Context(), &input) 54 if err != nil { 55 return nil, err 56 } 57 apiAnalyzers = append(apiAnalyzers, output.Analyzers...) 58 a.Tracker().SetTotalResources(len(apiAnalyzers)) 59 if output.NextToken == nil { 60 break 61 } 62 input.NextToken = output.NextToken 63 } 64 65 a.Tracker().SetServiceLabel("Adapting analyzers...") 66 return concurrency.Adapt(apiAnalyzers, a.RootAdapter, a.adaptAnalyzer), nil 67 } 68 69 func (a *adapter) adaptAnalyzer(apiAnalyzer aatypes.AnalyzerSummary) (*accessanalyzer.Analyzer, error) { 70 71 if apiAnalyzer.Arn == nil { 72 return nil, fmt.Errorf("missing arn") 73 } 74 parsed, err := arn.Parse(*apiAnalyzer.Arn) 75 if err != nil { 76 return nil, fmt.Errorf("invalid arn: %w", err) 77 } 78 if parsed.Region != a.Region() { 79 return nil, nil // skip other regions 80 } 81 82 metadata := a.CreateMetadataFromARN(*apiAnalyzer.Arn) 83 var name string 84 if apiAnalyzer.Name != nil { 85 name = *apiAnalyzer.Name 86 } 87 88 var findings []accessanalyzer.Findings 89 output, err := a.api.ListFindings(a.Context(), &api.ListFindingsInput{ 90 AnalyzerArn: apiAnalyzer.Arn, 91 }) 92 if err != nil { 93 return nil, err 94 } 95 if output.Findings != nil { 96 for _, r := range output.Findings { 97 findings = append(findings, accessanalyzer.Findings{ 98 Metadata: metadata, 99 }) 100 _ = r 101 } 102 } 103 104 return &accessanalyzer.Analyzer{ 105 Metadata: metadata, 106 ARN: types.String(*apiAnalyzer.Arn, metadata), 107 Name: types.String(name, metadata), 108 Active: types.Bool(apiAnalyzer.Status == aatypes.AnalyzerStatusActive, metadata), 109 Findings: findings, 110 }, nil 111 }