organizations

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 14, 2026 License: MIT Imports: 8 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var OrganizationsCalls = []types.AWSService{
	{
		Name: "organizations:ListAccounts",
		Call: func(ctx context.Context, sess *session.Session) (interface{}, error) {
			svc := organizations.New(sess, globalRegionConfig)

			var allAccounts []*organizations.Account
			input := &organizations.ListAccountsInput{}
			for {
				output, err := svc.ListAccountsWithContext(ctx, input)
				if err != nil {
					return nil, err
				}
				allAccounts = append(allAccounts, output.Accounts...)
				if output.NextToken == nil {
					break
				}
				input.NextToken = output.NextToken
			}
			return allAccounts, nil
		},
		Process: func(output interface{}, err error, debug bool) []types.ScanResult {
			var results []types.ScanResult

			if err != nil {
				utils.HandleAWSError(debug, "organizations:ListAccounts", err)
				return []types.ScanResult{
					{
						ServiceName: "Organizations",
						MethodName:  "organizations:ListAccounts",
						Error:       err,
						Timestamp:   time.Now(),
					},
				}
			}

			accounts, ok := output.([]*organizations.Account)
			if !ok {
				utils.HandleAWSError(debug, "organizations:ListAccounts", fmt.Errorf("unexpected output type %T", output))
				return results
			}

			for _, account := range accounts {
				accountId := ""
				if account.Id != nil {
					accountId = *account.Id
				}

				accountName := ""
				if account.Name != nil {
					accountName = *account.Name
				}

				accountEmail := ""
				if account.Email != nil {
					accountEmail = *account.Email
				}

				accountStatus := ""
				if account.Status != nil {
					accountStatus = *account.Status
				}

				accountArn := ""
				if account.Arn != nil {
					accountArn = *account.Arn
				}

				joinedTimestamp := ""
				if account.JoinedTimestamp != nil {
					joinedTimestamp = account.JoinedTimestamp.Format(time.RFC3339)
				}

				results = append(results, types.ScanResult{
					ServiceName:  "Organizations",
					MethodName:   "organizations:ListAccounts",
					ResourceType: "account",
					ResourceName: accountName,
					Details: map[string]interface{}{
						"AccountId":       accountId,
						"Email":           accountEmail,
						"Status":          accountStatus,
						"Arn":             accountArn,
						"JoinedTimestamp": joinedTimestamp,
					},
					Timestamp: time.Now(),
				})

				utils.PrintResult(debug, "", "organizations:ListAccounts",
					fmt.Sprintf("Organizations Account: %s (ID: %s, Status: %s)", utils.ColorizeItem(accountName), accountId, accountStatus), nil)
			}
			return results
		},
		ModuleName: types.DefaultModuleName,
	},
	{
		Name: "organizations:ListOrganizationalUnits",
		Call: func(ctx context.Context, sess *session.Session) (interface{}, error) {
			svc := organizations.New(sess, globalRegionConfig)

			var allOUs []orgOU
			var queue []string

			rootsInput := &organizations.ListRootsInput{}
			for {
				rootsOutput, err := svc.ListRootsWithContext(ctx, rootsInput)
				if err != nil {
					return nil, err
				}
				for _, root := range rootsOutput.Roots {
					if root.Id != nil {
						queue = append(queue, *root.Id)
					}
				}
				if rootsOutput.NextToken == nil {
					break
				}
				rootsInput.NextToken = rootsOutput.NextToken
			}

			for len(queue) > 0 {
				parentId := queue[0]
				queue = queue[1:]

				ouInput := &organizations.ListOrganizationalUnitsForParentInput{
					ParentId: aws.String(parentId),
				}
				for {
					ouOutput, err := svc.ListOrganizationalUnitsForParentWithContext(ctx, ouInput)
					if err != nil {
						utils.HandleAWSError(false, "organizations:ListOrganizationalUnits", err)
						break
					}
					for _, ou := range ouOutput.OrganizationalUnits {
						ouId := ""
						if ou.Id != nil {
							ouId = *ou.Id
							queue = append(queue, ouId)
						}
						ouName := ""
						if ou.Name != nil {
							ouName = *ou.Name
						}
						ouArn := ""
						if ou.Arn != nil {
							ouArn = *ou.Arn
						}
						allOUs = append(allOUs, orgOU{
							OUId:     ouId,
							OUName:   ouName,
							OUArn:    ouArn,
							ParentId: parentId,
						})
					}
					if ouOutput.NextToken == nil {
						break
					}
					ouInput.NextToken = ouOutput.NextToken
				}
			}
			return allOUs, nil
		},
		Process: func(output interface{}, err error, debug bool) []types.ScanResult {
			var results []types.ScanResult

			if err != nil {
				utils.HandleAWSError(debug, "organizations:ListOrganizationalUnits", err)
				return []types.ScanResult{
					{
						ServiceName: "Organizations",
						MethodName:  "organizations:ListOrganizationalUnits",
						Error:       err,
						Timestamp:   time.Now(),
					},
				}
			}

			ous, ok := output.([]orgOU)
			if !ok {
				utils.HandleAWSError(debug, "organizations:ListOrganizationalUnits", fmt.Errorf("unexpected output type %T", output))
				return results
			}

			for _, ou := range ous {
				results = append(results, types.ScanResult{
					ServiceName:  "Organizations",
					MethodName:   "organizations:ListOrganizationalUnits",
					ResourceType: "organizational-unit",
					ResourceName: ou.OUName,
					Details: map[string]interface{}{
						"OUId":     ou.OUId,
						"Arn":      ou.OUArn,
						"ParentId": ou.ParentId,
					},
					Timestamp: time.Now(),
				})

				utils.PrintResult(debug, "", "organizations:ListOrganizationalUnits",
					fmt.Sprintf("Organizations OU: %s (ID: %s, Parent: %s)", utils.ColorizeItem(ou.OUName), ou.OUId, ou.ParentId), nil)
			}
			return results
		},
		ModuleName: types.DefaultModuleName,
	},
	{
		Name: "organizations:ListPolicies",
		Call: func(ctx context.Context, sess *session.Session) (interface{}, error) {
			svc := organizations.New(sess, globalRegionConfig)

			var allPolicies []*organizations.PolicySummary
			input := &organizations.ListPoliciesInput{
				Filter: aws.String("SERVICE_CONTROL_POLICY"),
			}
			for {
				output, err := svc.ListPoliciesWithContext(ctx, input)
				if err != nil {
					return nil, err
				}
				allPolicies = append(allPolicies, output.Policies...)
				if output.NextToken == nil {
					break
				}
				input.NextToken = output.NextToken
			}
			return allPolicies, nil
		},
		Process: func(output interface{}, err error, debug bool) []types.ScanResult {
			var results []types.ScanResult

			if err != nil {
				utils.HandleAWSError(debug, "organizations:ListPolicies", err)
				return []types.ScanResult{
					{
						ServiceName: "Organizations",
						MethodName:  "organizations:ListPolicies",
						Error:       err,
						Timestamp:   time.Now(),
					},
				}
			}

			policies, ok := output.([]*organizations.PolicySummary)
			if !ok {
				utils.HandleAWSError(debug, "organizations:ListPolicies", fmt.Errorf("unexpected output type %T", output))
				return results
			}

			for _, policy := range policies {
				policyId := ""
				if policy.Id != nil {
					policyId = *policy.Id
				}

				policyName := ""
				if policy.Name != nil {
					policyName = *policy.Name
				}

				policyArn := ""
				if policy.Arn != nil {
					policyArn = *policy.Arn
				}

				results = append(results, types.ScanResult{
					ServiceName:  "Organizations",
					MethodName:   "organizations:ListPolicies",
					ResourceType: "service-control-policy",
					ResourceName: policyName,
					Details: map[string]interface{}{
						"PolicyId": policyId,
						"Arn":      policyArn,
					},
					Timestamp: time.Now(),
				})

				utils.PrintResult(debug, "", "organizations:ListPolicies",
					fmt.Sprintf("Organizations SCP: %s (ID: %s)", utils.ColorizeItem(policyName), policyId), nil)
			}
			return results
		},
		ModuleName: types.DefaultModuleName,
	},
}

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL