1package iam
2
3import (
4	"fmt"
5	"strings"
6
7	"github.com/aws/aws-sdk-go/aws"
8	awsiam "github.com/aws/aws-sdk-go/service/iam"
9	"github.com/genevieve/leftovers/common"
10)
11
12type policiesClient interface {
13	ListPolicies(*awsiam.ListPoliciesInput) (*awsiam.ListPoliciesOutput, error)
14	ListPolicyVersions(*awsiam.ListPolicyVersionsInput) (*awsiam.ListPolicyVersionsOutput, error)
15	DeletePolicyVersion(*awsiam.DeletePolicyVersionInput) (*awsiam.DeletePolicyVersionOutput, error)
16	DeletePolicy(*awsiam.DeletePolicyInput) (*awsiam.DeletePolicyOutput, error)
17}
18
19type Policies struct {
20	client policiesClient
21	logger logger
22}
23
24func NewPolicies(client policiesClient, logger logger) Policies {
25	return Policies{
26		client: client,
27		logger: logger,
28	}
29}
30
31func (p Policies) List(filter string) ([]common.Deletable, error) {
32	policies, err := p.client.ListPolicies(&awsiam.ListPoliciesInput{Scope: aws.String("Local")})
33	if err != nil {
34		return nil, fmt.Errorf("List IAM Policies: %s", err)
35	}
36
37	var resources []common.Deletable
38	for _, o := range policies.Policies {
39		r := NewPolicy(p.client, p.logger, o.PolicyName, o.Arn)
40
41		if !strings.Contains(r.Name(), filter) {
42			continue
43		}
44
45		proceed := p.logger.PromptWithDetails(r.Type(), r.Name())
46		if !proceed {
47			continue
48		}
49
50		resources = append(resources, r)
51	}
52
53	return resources, nil
54}
55
56func (p Policies) Type() string {
57	return "iam-policy"
58}
59