github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/internal/adapters/cloud/aws/api-gateway/apis_v2.go (about)

     1  package api_gateway
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/khulnasoft-lab/defsec/pkg/concurrency"
     7  	"github.com/khulnasoft-lab/defsec/pkg/types"
     8  
     9  	v2 "github.com/khulnasoft-lab/defsec/pkg/providers/aws/apigateway/v2"
    10  
    11  	api "github.com/aws/aws-sdk-go-v2/service/apigatewayv2"
    12  	agTypes "github.com/aws/aws-sdk-go-v2/service/apigatewayv2/types"
    13  )
    14  
    15  func (a *adapter) getAPIsV2() ([]v2.API, error) {
    16  	a.Tracker().SetServiceLabel("Discovering v2 APIs...")
    17  
    18  	var input api.GetApisInput
    19  	var apiApis []agTypes.Api
    20  	for {
    21  		output, err := a.clientV2.GetApis(a.Context(), &input)
    22  		if err != nil {
    23  			return nil, err
    24  		}
    25  		apiApis = append(apiApis, output.Items...)
    26  		a.Tracker().SetTotalResources(len(apiApis))
    27  		if output.NextToken == nil {
    28  			break
    29  		}
    30  		input.NextToken = output.NextToken
    31  	}
    32  
    33  	a.Tracker().SetServiceLabel("Adapting v2 APIs...")
    34  	return concurrency.Adapt(apiApis, a.RootAdapter, a.adaptAPIV2), nil
    35  }
    36  
    37  func (a *adapter) adaptAPIV2(remoteAPI agTypes.Api) (*v2.API, error) {
    38  
    39  	metadata := a.CreateMetadata(fmt.Sprintf("/apis/%s", *remoteAPI.ApiId))
    40  
    41  	var stages []v2.Stage
    42  	input := &api.GetStagesInput{
    43  		ApiId: remoteAPI.ApiId,
    44  	}
    45  	for {
    46  		stagesOutput, err := a.clientV2.GetStages(a.Context(), input)
    47  		if err != nil {
    48  			return nil, err
    49  		}
    50  		for _, apiStage := range stagesOutput.Items {
    51  			stages = append(stages, a.adaptStageV2(remoteAPI, apiStage))
    52  		}
    53  		if stagesOutput.NextToken == nil {
    54  			break
    55  		}
    56  		input.NextToken = stagesOutput.NextToken
    57  	}
    58  
    59  	return &v2.API{
    60  		Metadata:     metadata,
    61  		Name:         types.String(*remoteAPI.Name, metadata),
    62  		ProtocolType: types.String(string(remoteAPI.ProtocolType), metadata),
    63  		Stages:       stages,
    64  	}, nil
    65  }
    66  
    67  func (a *adapter) adaptStageV2(remoteAPI agTypes.Api, stage agTypes.Stage) v2.Stage {
    68  	metadata := a.CreateMetadata(fmt.Sprintf("/apis/%s/stages/%s", *remoteAPI.ApiId, *stage.StageName))
    69  
    70  	var logARN string
    71  	if stage.AccessLogSettings != nil && stage.AccessLogSettings.DestinationArn != nil {
    72  		logARN = *stage.AccessLogSettings.DestinationArn
    73  	}
    74  
    75  	return v2.Stage{
    76  		Metadata: metadata,
    77  		Name:     types.String(*stage.StageName, metadata),
    78  		AccessLogging: v2.AccessLogging{
    79  			Metadata:              metadata,
    80  			CloudwatchLogGroupARN: types.String(logARN, metadata),
    81  		},
    82  	}
    83  }