Skip to content

Commit

Permalink
add user group and user group policy for iam resource
Browse files Browse the repository at this point in the history
  • Loading branch information
aanamshaikh committed Feb 9, 2023
1 parent 801143c commit d922e6f
Show file tree
Hide file tree
Showing 14 changed files with 267 additions and 10 deletions.
34 changes: 26 additions & 8 deletions internal/aws/iam.go
Expand Up @@ -8,7 +8,6 @@ import (
"github.com/aws/aws-sdk-go/service/iam"
)


func GetUsers(sess session.Session) []IAMUSerResp {
iamSrv := iam.New(&sess)
result, err := iamSrv.ListUsers(&iam.ListUsersInput{})
Expand All @@ -27,19 +26,30 @@ func GetUsers(sess session.Session) []IAMUSerResp {
ARN: *u.Arn,
CreationTime: IST.Format("Mon Jan _2 15:04:05 2006"),
}
users = append(users,*user)
users = append(users, *user)
}
return users
}

func GetUserGroups(sess session.Session) []*iam.Group {
func GetUserGroups(sess session.Session) []IAMUSerGroupResp {
iamSrv := iam.New(&sess)
result, err := iamSrv.ListGroups(&iam.ListGroupsInput{})
if err != nil {
fmt.Println("Error in fetching Iam Groups: ", " err: ", err)
return nil
}
return result.Groups
var userGroups []IAMUSerGroupResp
for _, u := range result.Groups {
// log.Info().Msg(fmt.Sprintf("Group Date : %v", *u))
userGroup := &IAMUSerGroupResp{
GroupId: *u.GroupId,
GroupName: *u.GroupName,
ARN: *u.Arn,
// CreationTime: fmt.Sprintf("%v",*u.CreateDate),
}
userGroups = append(userGroups, *userGroup)
}
return userGroups
}

func GetGroupUsers(sess session.Session, grpName string) []*iam.User {
Expand All @@ -54,7 +64,7 @@ func GetGroupUsers(sess session.Session, grpName string) []*iam.User {
return result.Users
}

func GetPoliciesOfGrp(sess session.Session, grpName string) []*iam.AttachedPolicy {
func GetPoliciesOfGrp(sess session.Session, grpName string) []IAMUSerGroupPolicyResponse {
imaSrv := iam.New(&sess)
result, err := imaSrv.ListAttachedGroupPolicies(&iam.ListAttachedGroupPoliciesInput{
GroupName: &grpName,
Expand All @@ -63,12 +73,20 @@ func GetPoliciesOfGrp(sess session.Session, grpName string) []*iam.AttachedPolic
fmt.Println("Error in fetching Iam policies of the Group: ", grpName, " err: ", err)
return nil
}
return result.AttachedPolicies
var grpPolicies []IAMUSerGroupPolicyResponse
for _, up := range result.AttachedPolicies {
grpPolicy := &IAMUSerGroupPolicyResponse{
PolicyArn: *up.PolicyArn,
PolicyName: *up.PolicyName,
}
grpPolicies = append(grpPolicies, *grpPolicy)
}
return grpPolicies
}

// If a user belong to a Group then we can't see the user's attached policy here,
// their policies are governed on the top of the group
func GetPoliciesOfUser(sess session.Session, usrName string) []IAMUSerPolicyResponse{
func GetPoliciesOfUser(sess session.Session, usrName string) []IAMUSerPolicyResponse {
imaSrv := iam.New(&sess)
result, err := imaSrv.ListAttachedUserPolicies(&iam.ListAttachedUserPoliciesInput{
UserName: &usrName,
Expand All @@ -83,7 +101,7 @@ func GetPoliciesOfUser(sess session.Session, usrName string) []IAMUSerPolicyResp
PolicyArn: *up.PolicyArn,
PolicyName: *up.PolicyName,
}
usersPolicy = append(usersPolicy,*userPolicy)
usersPolicy = append(usersPolicy, *userPolicy)
}
return usersPolicy
}
Expand Down
12 changes: 12 additions & 0 deletions internal/aws/types.go
Expand Up @@ -33,6 +33,13 @@ type IAMUSerResp struct {
CreationTime string
}

type IAMUSerGroupResp struct {
GroupId string
GroupName string
ARN string
CreationTime string
}

type IAMUSerPolicyResponse struct {
PolicyArn string
PolicyName string
Expand All @@ -47,3 +54,8 @@ type EBSResp struct {
Snapshot string
CreationTime string
}

type IAMUSerGroupPolicyResponse struct {
PolicyArn string
PolicyName string
}
3 changes: 3 additions & 0 deletions internal/config/alias.go
Expand Up @@ -133,6 +133,9 @@ func (a *Aliases) loadDefaultAliases() {
a.declare("sg", "SG")
a.declare("iam:u", "IAM:U")
a.declare("ebs", "EBS")
a.declare("iam:u","IAM:U")
a.declare("iam:g","IAM:G")


a.declare("help", "h", "?")
a.declare("quit", "q", "q!", "Q")
Expand Down
37 changes: 37 additions & 0 deletions internal/dao/iam_user_group.go
@@ -0,0 +1,37 @@
package dao

import (
"context"
"fmt"

"github.com/aws/aws-sdk-go/aws/session"
"github.com/one2nc/cloud-lens/internal"
"github.com/one2nc/cloud-lens/internal/aws"
"github.com/rs/zerolog/log"
)

type IAMUG struct {
Accessor
ctx context.Context
}

func (iamug *IAMUG) Init(ctx context.Context) {
iamug.ctx = ctx
}

func (iamug *IAMUG) List(ctx context.Context) ([]Object, error) {
sess, ok := ctx.Value(internal.KeySession).(*session.Session)
if !ok {
log.Err(fmt.Errorf("conversion err: Expected session.session but got %v", sess))
}
usrGroup := aws.GetUserGroups(*sess)
objs := make([]Object, len(usrGroup))
for i, obj := range usrGroup {
objs[i] = obj
}
return objs, nil
}

func (iamug *IAMUG) Get(ctx context.Context, path string) (Object, error) {
return nil, nil
}
38 changes: 38 additions & 0 deletions internal/dao/iam_user_group_policy.go
@@ -0,0 +1,38 @@
package dao

import (
"context"
"fmt"

"github.com/aws/aws-sdk-go/aws/session"
"github.com/one2nc/cloud-lens/internal"
"github.com/one2nc/cloud-lens/internal/aws"
"github.com/rs/zerolog/log"
)

type IAMUGP struct {
Accessor
ctx context.Context
}

func (iamugp *IAMUGP) Init(ctx context.Context) {
iamugp.ctx = ctx
}

func (iamugp *IAMUGP) List(ctx context.Context) ([]Object, error) {
sess, ok := ctx.Value(internal.KeySession).(*session.Session)
if !ok {
log.Err(fmt.Errorf("conversion err: Expected session.session but got %v", sess))
}
grpName := fmt.Sprintf("%v", ctx.Value(internal.GroupName))
grpPolicy := aws.GetPoliciesOfGrp(*sess, grpName)
objs := make([]Object, len(grpPolicy))
for i, obj := range grpPolicy {
objs[i] = obj
}
return objs, nil
}

func (iamugp *IAMUGP) Get(ctx context.Context, path string) (Object, error) {
return nil, nil
}
1 change: 1 addition & 0 deletions internal/keys.go
Expand Up @@ -15,4 +15,5 @@ const (
FolderName ContextKey = "folder_name"
KeyAliases ContextKey = "aliases"
UserName ContextKey = "user_name"
GroupName ContextKey = "group_name"
)
8 changes: 8 additions & 0 deletions internal/model/registry.go
Expand Up @@ -26,6 +26,10 @@ var Registry = map[string]ResourceMeta{
DAO: &dao.IAMU{},
Renderer: &render.IAMU{},
},
"iam:g": {
DAO: &dao.IAMUG{},
Renderer: &render.IAMUG{},
},
"User Policy": {
DAO: &dao.IAMUP{},
Renderer: &render.IamUserPloicy{},
Expand All @@ -34,4 +38,8 @@ var Registry = map[string]ResourceMeta{
DAO: &dao.EBS{},
Renderer: &render.EBS{},
},
"User Group Policy": {
DAO: &dao.IAMUGP{},
Renderer: &render.IamUserGroupPloicy{},
},
}
2 changes: 1 addition & 1 deletion internal/render/iam_user.go
Expand Up @@ -22,7 +22,7 @@ func (iamu IAMU) Header() Header {
func (iamu IAMU) Render(o interface{}, ns string, row *Row) error {
iamuResp, ok := o.(aws.IAMUSerResp)
if !ok {
return fmt.Errorf("Expected S3Resp, but got %T", o)
return fmt.Errorf("Expected iamuResp, but got %T", o)
}

row.ID = ns
Expand Down
36 changes: 36 additions & 0 deletions internal/render/iam_user_group.go
@@ -0,0 +1,36 @@
package render

import (
"fmt"

"github.com/derailed/tview"
"github.com/one2nc/cloud-lens/internal/aws"
)

type IAMUG struct {
}

func (iamug IAMUG) Header() Header {
return Header{
HeaderColumn{Name: "Group-Id", SortIndicatorIdx: 5, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: false},
HeaderColumn{Name: "Group-Name", SortIndicatorIdx: 5, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: false},
HeaderColumn{Name: "ARN", SortIndicatorIdx: -1, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: false},
HeaderColumn{Name: "Created-Date", SortIndicatorIdx: 8, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: true},
}
}

func (iamug IAMUG) Render(o interface{}, ns string, row *Row) error {
iamugResp, ok := o.(aws.IAMUSerGroupResp)
if !ok {
return fmt.Errorf("Expected iamugResp, but got %T", o)
}

row.ID = ns
row.Fields = Fields{
iamugResp.GroupId,
iamugResp.GroupName,
iamugResp.ARN,
iamugResp.CreationTime,
}
return nil
}
33 changes: 33 additions & 0 deletions internal/render/iam_user_group_policy.go
@@ -0,0 +1,33 @@
package render

import (
"fmt"

"github.com/derailed/tview"
"github.com/one2nc/cloud-lens/internal/aws"
)

type IamUserGroupPloicy struct {
}

func (iugp IamUserGroupPloicy) Header() Header {
return Header{
HeaderColumn{Name: "Policy-ARN", SortIndicatorIdx: 7, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: false},
HeaderColumn{Name: "Policy-Name", SortIndicatorIdx: 7, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: false},
}
}

func (iugp IamUserGroupPloicy) Render(o interface{}, ns string, row *Row) error {
usrGroupPolicy, ok := o.(aws.IAMUSerGroupPolicyResponse)
if !ok {
return fmt.Errorf("expected usrGroupPolicy, but got %T", o)
}

row.ID = ns
row.Fields = Fields{
usrGroupPolicy.PolicyArn,
usrGroupPolicy.PolicyName,

}
return nil
}
2 changes: 1 addition & 1 deletion internal/render/iam_user_policy.go
Expand Up @@ -20,7 +20,7 @@ func (iup IamUserPloicy) Header() Header {
func (iup IamUserPloicy) Render(o interface{}, ns string, row *Row) error {
usrPolicy, ok := o.(aws.IAMUSerPolicyResponse)
if !ok {
return fmt.Errorf("expected S3Resp, but got %T", o)
return fmt.Errorf("expected usrPolicy, but got %T", o)
}

row.ID = ns
Expand Down
43 changes: 43 additions & 0 deletions internal/view/iam_user_group.go
@@ -0,0 +1,43 @@
package view

import (
"context"

"github.com/gdamore/tcell/v2"
"github.com/one2nc/cloud-lens/internal"
"github.com/one2nc/cloud-lens/internal/ui"
)

type IAMUG struct {
ResourceViewer
}

// NewUG returns a new viewer.
func NewIAMUG(resource string) ResourceViewer {
var iamug IAMUG
iamug.ResourceViewer = NewBrowser(resource)
iamug.AddBindKeysFn(iamug.bindKeys)
return &iamug
}

func (iamug IAMUG) bindKeys(aa ui.KeyActions) {
aa.Add(ui.KeyActions{
ui.KeyShiftI: ui.NewKeyAction("Sort Group-Id ", iamug.GetTable().SortColCmd("Group-Id", true), true),
ui.KeyShiftN: ui.NewKeyAction("Sort Group-Name", iamug.GetTable().SortColCmd("Group-Name", true), true),
ui.KeyShiftD: ui.NewKeyAction("Sort Created-Date", iamug.GetTable().SortColCmd("Created-Date", true), true),
tcell.KeyEscape: ui.NewKeyAction("Back", iamug.App().PrevCmd, true),
ui.KeyShiftP: ui.NewKeyAction("View", iamug.enterCmd, true),
})
}

func (iamug *IAMUG) enterCmd(evt *tcell.EventKey) *tcell.EventKey {
grpName := iamug.GetTable().GetSecondColumn()
if grpName != "" {
up := NewIamUserGroupPloicy("User Group Policy")
ctx := context.WithValue(iamug.App().GetContext(), internal.GroupName, grpName)
iamug.App().SetContext(ctx)
iamug.App().Flash().Info("userName: " + grpName)
iamug.App().inject(up)
}
return nil
}
25 changes: 25 additions & 0 deletions internal/view/iam_user_group_policy.go
@@ -0,0 +1,25 @@
package view

import (
"github.com/gdamore/tcell/v2"
"github.com/one2nc/cloud-lens/internal/ui"
)

type iamUserGroupPloicy struct {
ResourceViewer
}

func NewIamUserGroupPloicy(resource string) ResourceViewer {
var ugp iamUserGroupPloicy
ugp.ResourceViewer = NewBrowser(resource)
ugp.AddBindKeysFn(ugp.bindKeys)
return &ugp
}

func (ugp *iamUserGroupPloicy) bindKeys(aa ui.KeyActions) {
aa.Add(ui.KeyActions{
tcell.KeyEscape: ui.NewKeyAction("Back", ugp.App().PrevCmd, true),
ui.KeyShiftA: ui.NewKeyAction("Policy-ARN", ugp.GetTable().SortColCmd("Policy-ARN", true), true),
ui.KeyShiftN: ui.NewKeyAction("Policy-Name", ugp.GetTable().SortColCmd("Policy-Name", true), true),
})
}
3 changes: 3 additions & 0 deletions internal/view/registrar.go
Expand Up @@ -22,4 +22,7 @@ func coreViewers(vv MetaViewers) {
vv["ebs"] = MetaViewer{
viewerFn: NewEBS,
}
vv["iam:g"] = MetaViewer{
viewerFn: NewIAMUG,
}
}

0 comments on commit d922e6f

Please sign in to comment.