Skip to content

Commit

Permalink
Add list user groups methods (#2)
Browse files Browse the repository at this point in the history
* Add list user groups methods
* Improving tests
* Add codecov.yml
  • Loading branch information
dlampsi committed Mar 1, 2021
1 parent 5f548dd commit 53a42af
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 20 deletions.
31 changes: 18 additions & 13 deletions adc.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,6 @@ func (cl *Client) Config() *Config {

// Connects to AD server and store connection into client.
func (cl *Client) Connect() error {
if cl.ldapCl != nil {
return nil
}
conn, err := cl.connect(cl.cfg.Bind)
if err != nil {
return fmt.Errorf("can't connect: %s", err.Error())
Expand All @@ -67,21 +64,29 @@ func (cl *Client) Connect() error {
}

// Connects and bind to LDAP server by provided bind account.
func (cl *Client) connect(bind *BindAccount) (*ldap.Conn, error) {
var opts []ldap.DialOpt
if strings.HasPrefix("ldaps://", cl.cfg.URL) {
opts = append(opts, ldap.DialWithTLSConfig(&tls.Config{InsecureSkipVerify: cl.cfg.InsecureTLS}))
}
conn, err := ldap.DialURL(cl.cfg.URL, opts...)
if err != nil {
return nil, err
func (cl *Client) connect(bind *BindAccount) (ldap.Client, error) {
ldapCl := cl.ldapCl

// Use default ldap module connection if no ldap client provided in client
if ldapCl == nil {
var opts []ldap.DialOpt
if strings.HasPrefix("ldaps://", cl.cfg.URL) {
opts = append(opts, ldap.DialWithTLSConfig(&tls.Config{InsecureSkipVerify: cl.cfg.InsecureTLS}))
}
conn, err := ldap.DialURL(cl.cfg.URL, opts...)
if err != nil {
return nil, err
}
ldapCl = conn
}

if bind != nil {
if err := conn.Bind(bind.DN, bind.Password); err != nil {
if err := ldapCl.Bind(bind.DN, bind.Password); err != nil {
return nil, err
}
}
return conn, nil

return ldapCl, nil
}

// Closes connection to AD.
Expand Down
24 changes: 24 additions & 0 deletions adc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,28 @@ func Test_Client_Connect(t *testing.T) {
err := cl.Connect()
require.NoError(t, err)
cl.Disconnect()

cfg := &Config{
Bind: &BindAccount{DN: "fakeone", Password: "fake"},
}
cl = New(cfg, WithLdapClient(mock))
err = cl.Connect()
require.Error(t, err)

cfg.Bind.DN = "mrError"
cl = New(cfg, WithLdapClient(mock))
err = cl.Connect()
require.Error(t, err)

cfg.Bind.DN = "validUser"
cfg.Bind.Password = "badPass"
cl = New(cfg, WithLdapClient(mock))
err = cl.Connect()
require.Error(t, err)

cfg.Bind.DN = "validUser"
cfg.Bind.Password = "validPass"
cl = New(cfg, WithLdapClient(mock))
err = cl.Connect()
require.NoError(t, err)
}
2 changes: 2 additions & 0 deletions codecov.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ignore:
- "mock.go"
55 changes: 50 additions & 5 deletions group_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,20 @@ func Test_Client_GetGroup(t *testing.T) {
_, err = cl.GetGroup(req)
require.Error(t, err)

req = &GetGroupequest{Id: "group1", SkipMembersSearch: true}
req = &GetGroupequest{Id: "groupFake", SkipMembersSearch: true}
group, err := cl.GetGroup(req)
require.NoError(t, err)
require.Nil(t, group)

dnReq := &GetGroupequest{Dn: "OU=group1,DC=company,DC=com", SkipMembersSearch: true}
groupByDn, err := cl.GetGroup(dnReq)
require.NoError(t, err)
require.NotNil(t, groupByDn)
require.Equal(t, dnReq.Dn, groupByDn.DN)

req = &GetGroupequest{Id: "group1", SkipMembersSearch: true}
group, err = cl.GetGroup(req)
require.NoError(t, err)
require.NotNil(t, group)
require.Equal(t, req.Id, group.Id)

Expand Down Expand Up @@ -90,9 +101,26 @@ func Test_AddGroupMembers(t *testing.T) {
_, err := cl.AddGroupMembers("group2", "user1")
require.Error(t, err)

toAdd, err := cl.AddGroupMembers("group1", "user3")
_, err = cl.AddGroupMembers("groupFake", "user1")
require.Error(t, err)

// Non exists user
added, err := cl.AddGroupMembers("group1", "userFake")
require.NoError(t, err)
require.Equal(t, 0, added)
// Error user
added, err = cl.AddGroupMembers("group1", "user2")
require.NoError(t, err)
require.Equal(t, 1, toAdd)
require.Equal(t, 0, added)
// Already member user
added, err = cl.AddGroupMembers("group1", "user1")
require.NoError(t, err)
require.Equal(t, 0, added)
// Ok user
added, err = cl.AddGroupMembers("group1", "user3")
require.NoError(t, err)
require.Equal(t, 1, added)

}

func Test_popDelGroupMembers(t *testing.T) {
Expand All @@ -117,9 +145,26 @@ func Test_DeleteGroupMembers(t *testing.T) {
_, err := cl.DeleteGroupMembers("group2", "user1")
require.Error(t, err)

toAdd, err := cl.DeleteGroupMembers("group1", "user1")
_, err = cl.DeleteGroupMembers("groupFake", "user1")
require.Error(t, err)

// Non exists user
deleted, err := cl.DeleteGroupMembers("group1", "userFake")
require.NoError(t, err)
require.Equal(t, 1, toAdd)
require.Equal(t, 0, deleted)
// Error user
deleted, err = cl.DeleteGroupMembers("group1", "user2")
require.NoError(t, err)
require.Equal(t, 0, deleted)
// Already not member user
deleted, err = cl.DeleteGroupMembers("group1", "user3")
require.NoError(t, err)
require.Equal(t, 0, deleted)
// Ok user
deleted, err = cl.DeleteGroupMembers("group1", "user1")
require.NoError(t, err)
require.Equal(t, 1, deleted)

}

func Test_Group_MembersDn(t *testing.T) {
Expand Down
10 changes: 9 additions & 1 deletion mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,15 @@ func (cl *mockClient) Close() {}
func (cl *mockClient) SetTimeout(time.Duration) {}

func (cl *mockClient) Bind(username, password string) error {
return nil
if username == "mrError" {
return errors.New("error for tests")
}
if username == "validUser" {
if password == "validPass" {
return nil
}
}
return errors.New("unauthorised")
}

func (cl *mockClient) UnauthenticatedBind(username string) error {
Expand Down
18 changes: 18 additions & 0 deletions user.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,21 @@ func (u *User) IsGroupMember(groupId string) bool {
}
return false
}

// Returns list of user groups DNs.
func (u *User) GroupsDn() []string {
var result []string
for _, g := range u.Groups {
result = append(result, g.DN)
}
return result
}

// Returns list of user groups IDs.
func (u *User) GroupsId() []string {
var result []string
for _, g := range u.Groups {
result = append(result, g.Id)
}
return result
}
37 changes: 36 additions & 1 deletion user_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,20 @@ func Test_Client_GetUser(t *testing.T) {
_, err = cl.GetUser(req)
require.Error(t, err)

req = &GetUserRequest{Id: "user1", SkipGroupsSearch: true}
req = &GetUserRequest{Id: "userFake", SkipGroupsSearch: true}
user, err := cl.GetUser(req)
require.NoError(t, err)
require.Nil(t, user)

dnReq := &GetUserRequest{Dn: "OU=user1,DC=company,DC=com", SkipGroupsSearch: true}
groupByDn, err := cl.GetUser(dnReq)
require.NoError(t, err)
require.NotNil(t, groupByDn)
require.Equal(t, dnReq.Dn, groupByDn.DN)

req = &GetUserRequest{Id: "user1", SkipGroupsSearch: true}
user, err = cl.GetUser(req)
require.NoError(t, err)
require.NotNil(t, user)
require.Equal(t, req.Id, user.Id)
require.Nil(t, user.Groups)
Expand Down Expand Up @@ -84,3 +95,27 @@ func Test_User_IsGroupMember(t *testing.T) {
require.Equal(t, true, u.IsGroupMember("group1"))
require.Equal(t, true, u.IsGroupMember("group2"))
}

func Test_User_GroupsDn(t *testing.T) {
u := &User{
Groups: []UserGroup{},
}
require.Nil(t, u.GroupsDn())

newGroup := UserGroup{Id: "someId", DN: "someDn"}
u.Groups = append(u.Groups, newGroup)
require.NotNil(t, u.GroupsDn())
require.Contains(t, u.GroupsDn(), newGroup.DN)
}

func Test_User_GroupsId(t *testing.T) {
u := &User{
Groups: []UserGroup{},
}

require.Nil(t, u.GroupsId())
newGroup := UserGroup{Id: "someId", DN: "someDn"}
u.Groups = append(u.Groups, newGroup)
require.NotNil(t, u.GroupsId())
require.Contains(t, u.GroupsId(), newGroup.Id)
}

0 comments on commit 53a42af

Please sign in to comment.