diff --git a/pkg/login/ext_user.go b/pkg/login/ext_user.go index 66c39ca960f..17630357350 100644 --- a/pkg/login/ext_user.go +++ b/pkg/login/ext_user.go @@ -99,14 +99,17 @@ func updateUser(user *m.User, extUser *m.ExternalUserInfo) error { if extUser.Login != "" && extUser.Login != user.Login { updateCmd.Login = extUser.Login + user.Login = extUser.Login needsUpdate = true } if extUser.Email != "" && extUser.Email != user.Email { updateCmd.Email = extUser.Email + user.Email = extUser.Email needsUpdate = true } if extUser.Name != "" && extUser.Name != user.Name { updateCmd.Name = extUser.Name + user.Name = extUser.Name needsUpdate = true } @@ -172,5 +175,20 @@ func syncOrgRoles(user *m.User, extUser *m.ExternalUserInfo) error { } } + // update user's default org if needed + if _, ok := extUser.OrgRoles[user.OrgId]; !ok { + for orgId := range extUser.OrgRoles { + user.OrgId = orgId + break + } + err := bus.Dispatch(&m.SetUsingOrgCommand{ + UserId: user.Id, + OrgId: user.OrgId, + }) + if err != nil { + return err + } + } + return nil } diff --git a/pkg/login/ldap_test.go b/pkg/login/ldap_test.go index 2e4fcaa5fab..6ad7c261cc6 100644 --- a/pkg/login/ldap_test.go +++ b/pkg/login/ldap_test.go @@ -118,6 +118,7 @@ func TestLdapAuther(t *testing.T) { So(err, ShouldBeNil) So(sc.updateOrgUserCmd, ShouldNotBeNil) So(sc.updateOrgUserCmd.Role, ShouldEqual, m.ROLE_ADMIN) + So(sc.setUsingOrgCmd.OrgId, ShouldEqual, 1) }) }) @@ -139,6 +140,7 @@ func TestLdapAuther(t *testing.T) { Convey("Should remove org role", func() { So(err, ShouldBeNil) So(sc.removeOrgUserCmd, ShouldNotBeNil) + So(sc.setUsingOrgCmd.OrgId, ShouldEqual, 1) }) }) @@ -159,6 +161,7 @@ func TestLdapAuther(t *testing.T) { So(err, ShouldBeNil) So(sc.removeOrgUserCmd, ShouldBeNil) So(sc.updateOrgUserCmd, ShouldNotBeNil) + So(sc.setUsingOrgCmd.OrgId, ShouldEqual, 1) }) }) @@ -178,6 +181,7 @@ func TestLdapAuther(t *testing.T) { Convey("Should take first match, and ignore subsequent matches", func() { So(err, ShouldBeNil) So(sc.updateOrgUserCmd, ShouldBeNil) + So(sc.setUsingOrgCmd.OrgId, ShouldEqual, 1) }) }) @@ -197,6 +201,7 @@ func TestLdapAuther(t *testing.T) { Convey("Should take first match, and ignore subsequent matches", func() { So(err, ShouldBeNil) So(sc.addOrgUserCmd.Role, ShouldEqual, m.ROLE_ADMIN) + So(sc.setUsingOrgCmd.OrgId, ShouldEqual, 1) }) }) @@ -340,6 +345,11 @@ func ldapAutherScenario(desc string, fn scenarioFunc) { return nil }) + bus.AddHandler("test", func(cmd *m.SetUsingOrgCommand) error { + sc.setUsingOrgCmd = cmd + return nil + }) + fn(sc) }) } @@ -352,6 +362,7 @@ type scenarioContext struct { updateOrgUserCmd *m.UpdateOrgUserCommand removeOrgUserCmd *m.RemoveOrgUserCommand updateUserCmd *m.UpdateUserCommand + setUsingOrgCmd *m.SetUsingOrgCommand } func (sc *scenarioContext) userQueryReturns(user *m.User) { diff --git a/pkg/services/sqlstore/user.go b/pkg/services/sqlstore/user.go index 996cc47fc1c..547c0e5a3ce 100644 --- a/pkg/services/sqlstore/user.go +++ b/pkg/services/sqlstore/user.go @@ -295,11 +295,12 @@ func SetUsingOrg(cmd *m.SetUsingOrgCommand) error { } return inTransaction(func(sess *DBSession) error { - user := m.User{} - sess.Id(cmd.UserId).Get(&user) + user := m.User{ + Id: cmd.UserId, + OrgId: cmd.OrgId, + } - user.OrgId = cmd.OrgId - _, err := sess.Id(user.Id).Update(&user) + _, err := sess.Id(cmd.UserId).Update(&user) return err }) }