From 0320baeb5b9b26bc0f6d8285384f821ace9f9889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 14 Jul 2015 16:42:55 +0200 Subject: [PATCH] feat(ldap): user org role sync working --- pkg/auth/ldap.go | 17 ++++++++++-- pkg/auth/ldap_test.go | 60 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/pkg/auth/ldap.go b/pkg/auth/ldap.go index 1277259b5ba..a6bf9109fec 100644 --- a/pkg/auth/ldap.go +++ b/pkg/auth/ldap.go @@ -27,7 +27,7 @@ func init() { SearchFilter: "(cn=%s)", SearchBaseDNs: []string{"dc=grafana,dc=org"}, LdapGroups: []*LdapGroupToOrgRole{ - {GroupDN: "cn=users,dc=grafana,dc=org", OrgRole: m.ROLE_EDITOR}, + {GroupDN: "cn=users,dc=grafana,dc=org", OrgId: 1, OrgRole: m.ROLE_VIEWER}, }, }, } @@ -143,16 +143,29 @@ func (a *ldapAuther) syncOrgRoles(user *m.User, ldapUser *ldapUserInfo) error { // remove or update org roles for _, org := range orgsQuery.Result { for _, group := range a.server.LdapGroups { - if group.OrgId == org.OrgId && ldapUser.isMemberOf(group.GroupDN) { + if org.OrgId != group.OrgId { + continue + } + + if ldapUser.isMemberOf(group.GroupDN) { if org.Role != group.OrgRole { // update role + cmd := m.UpdateOrgUserCommand{OrgId: org.OrgId, UserId: user.Id, Role: group.OrgRole} + if err := bus.Dispatch(&cmd); err != nil { + return err + } } } else { // remove role + cmd := m.RemoveOrgUserCommand{OrgId: org.OrgId, UserId: user.Id} + if err := bus.Dispatch(&cmd); err != nil { + return err + } } } } + // add missing org roles for _, group := range a.server.LdapGroups { if !ldapUser.isMemberOf(group.GroupDN) { continue diff --git a/pkg/auth/ldap_test.go b/pkg/auth/ldap_test.go index afa5ba88aee..fa767d7397c 100644 --- a/pkg/auth/ldap_test.go +++ b/pkg/auth/ldap_test.go @@ -97,10 +97,48 @@ func TestLdapAuther(t *testing.T) { Convey("Should create new org user", func() { So(err, ShouldBeNil) - So(sc.addOrgUserCommand, ShouldNotBeNil) - So(sc.addOrgUserCommand.Role, ShouldEqual, m.ROLE_ADMIN) + So(sc.addOrgUserCmd, ShouldNotBeNil) + So(sc.addOrgUserCmd.Role, ShouldEqual, m.ROLE_ADMIN) }) }) + + ldapAutherScenario("given different current org role", func(sc *scenarioContext) { + ldapAuther := NewLdapAuthenticator(&LdapServerConf{ + LdapGroups: []*LdapGroupToOrgRole{ + {GroupDN: "cn=users", OrgId: 1, OrgRole: "Admin"}, + }, + }) + + sc.userOrgsQueryReturns([]*m.UserOrgDTO{{OrgId: 1, Role: m.ROLE_EDITOR}}) + err := ldapAuther.syncOrgRoles(&m.User{}, &ldapUserInfo{ + MemberOf: []string{"cn=users"}, + }) + + Convey("Should update org role", func() { + So(err, ShouldBeNil) + So(sc.updateOrgUserCmd, ShouldNotBeNil) + So(sc.updateOrgUserCmd.Role, ShouldEqual, m.ROLE_ADMIN) + }) + }) + + ldapAutherScenario("given current org role is removed in ldap", func(sc *scenarioContext) { + ldapAuther := NewLdapAuthenticator(&LdapServerConf{ + LdapGroups: []*LdapGroupToOrgRole{ + {GroupDN: "cn=users", OrgId: 1, OrgRole: "Admin"}, + }, + }) + + sc.userOrgsQueryReturns([]*m.UserOrgDTO{{OrgId: 1, Role: m.ROLE_EDITOR}}) + err := ldapAuther.syncOrgRoles(&m.User{}, &ldapUserInfo{ + MemberOf: []string{"cn=other"}, + }) + + Convey("Should remove org role", func() { + So(err, ShouldBeNil) + So(sc.removeOrgUserCmd, ShouldNotBeNil) + }) + }) + }) } @@ -117,7 +155,17 @@ func ldapAutherScenario(desc string, fn scenarioFunc) { }) bus.AddHandler("test", func(cmd *m.AddOrgUserCommand) error { - sc.addOrgUserCommand = cmd + sc.addOrgUserCmd = cmd + return nil + }) + + bus.AddHandler("test", func(cmd *m.UpdateOrgUserCommand) error { + sc.updateOrgUserCmd = cmd + return nil + }) + + bus.AddHandler("test", func(cmd *m.RemoveOrgUserCommand) error { + sc.removeOrgUserCmd = cmd return nil }) @@ -126,8 +174,10 @@ func ldapAutherScenario(desc string, fn scenarioFunc) { } type scenarioContext struct { - createUserCmd *m.CreateUserCommand - addOrgUserCommand *m.AddOrgUserCommand + createUserCmd *m.CreateUserCommand + addOrgUserCmd *m.AddOrgUserCommand + updateOrgUserCmd *m.UpdateOrgUserCommand + removeOrgUserCmd *m.RemoveOrgUserCommand } func (sc *scenarioContext) userQueryReturns(user *m.User) {