Jelajahi Sumber

Teams: show proper label for each auth provider (#17860)

* Teams: show proper label for each auth provider

Teams: don't sore AuthModule in team_member table, use JOIN to get it instead

* Teams: fix AddTeamMember after last changes

* Teams: add more auth provider labels

* Teams: show external sync badge if LDAP is not enabled

* Teams: tests for getting auth module
Alexander Zobnin 6 tahun lalu
induk
melakukan
3d848d0fdf

+ 20 - 2
pkg/api/team_members.go

@@ -21,14 +21,32 @@ func GetTeamMembers(c *m.ReqContext) Response {
 		member.AvatarUrl = dtos.GetGravatarUrl(member.Email)
 		member.Labels = []string{}
 
-		if setting.IsEnterprise && setting.LDAPEnabled && member.External {
-			member.Labels = append(member.Labels, "LDAP")
+		if setting.IsEnterprise && member.External {
+			authProvider := GetAuthProviderLabel(member.AuthModule)
+			member.Labels = append(member.Labels, authProvider)
 		}
 	}
 
 	return JSON(200, query.Result)
 }
 
+func GetAuthProviderLabel(authModule string) string {
+	switch authModule {
+	case "oauth_github":
+		return "GitHub"
+	case "oauth_google":
+		return "Google"
+	case "oauth_gitlab":
+		return "GitLab"
+	case "oauth_grafana_com", "oauth_grafananet":
+		return "grafana.com"
+	case "ldap", "":
+		return "LDAP"
+	default:
+		return "OAuth"
+	}
+}
+
 // POST /api/teams/:teamId/members
 func (hs *HTTPServer) AddTeamMember(c *m.ReqContext, cmd m.AddTeamMemberCommand) Response {
 	cmd.OrgId = c.OrgId

+ 1 - 0
pkg/models/team_member.go

@@ -68,6 +68,7 @@ type TeamMemberDTO struct {
 	TeamId     int64          `json:"teamId"`
 	UserId     int64          `json:"userId"`
 	External   bool           `json:"-"`
+	AuthModule string         `json:"auth_module"`
 	Email      string         `json:"email"`
 	Login      string         `json:"login"`
 	AvatarUrl  string         `json:"avatarUrl"`

+ 11 - 2
pkg/services/sqlstore/team.go

@@ -41,7 +41,7 @@ func getTeamSelectSqlBase() string {
 		team.org_id,
 		team.name as name,
 		team.email as email,
-		(SELECT COUNT(*) from team_member where team_member.team_id = team.id) as member_count 
+		(SELECT COUNT(*) from team_member where team_member.team_id = team.id) as member_count
 		FROM team as team `
 }
 
@@ -365,6 +365,15 @@ func GetTeamMembers(query *m.GetTeamMembersQuery) error {
 	query.Result = make([]*m.TeamMemberDTO, 0)
 	sess := x.Table("team_member")
 	sess.Join("INNER", x.Dialect().Quote("user"), fmt.Sprintf("team_member.user_id=%s.id", x.Dialect().Quote("user")))
+
+	// Join with only most recent auth module
+	authJoinCondition := `(
+		SELECT id from user_auth
+			WHERE user_auth.user_id = team_member.user_id
+			ORDER BY user_auth.created DESC `
+	authJoinCondition = "user_auth.id=" + authJoinCondition + dialect.Limit(1) + ")"
+	sess.Join("LEFT", "user_auth", authJoinCondition)
+
 	if query.OrgId != 0 {
 		sess.Where("team_member.org_id=?", query.OrgId)
 	}
@@ -377,7 +386,7 @@ func GetTeamMembers(query *m.GetTeamMembersQuery) error {
 	if query.External {
 		sess.Where("team_member.external=?", dialect.BooleanStr(true))
 	}
-	sess.Cols("team_member.org_id", "team_member.team_id", "team_member.user_id", "user.email", "user.login", "team_member.external", "team_member.permission")
+	sess.Cols("team_member.org_id", "team_member.team_id", "team_member.user_id", "user.email", "user.login", "team_member.external", "team_member.permission", "user_auth.auth_module")
 	sess.Asc("user.login", "user.email")
 
 	err := sess.Find(&query.Result)

+ 26 - 0
pkg/services/sqlstore/team_test.go

@@ -75,6 +75,32 @@ func TestTeamCommandsAndQueries(t *testing.T) {
 				So(q2.Result[0].External, ShouldEqual, true)
 			})
 
+			Convey("Should return latest auth module for users when getting team members", func() {
+				userId := userIds[1]
+				err := SetAuthInfo(&m.SetAuthInfoCommand{UserId: userId, AuthModule: "oauth_github", AuthId: "1234567"})
+				So(err, ShouldBeNil)
+
+				teamQuery := &m.SearchTeamsQuery{OrgId: testOrgId, Name: "group1 name", Page: 1, Limit: 10}
+				err = SearchTeams(teamQuery)
+				So(err, ShouldBeNil)
+				So(teamQuery.Page, ShouldEqual, 1)
+
+				team1 := teamQuery.Result.Teams[0]
+
+				err = AddTeamMember(&m.AddTeamMemberCommand{OrgId: testOrgId, TeamId: team1.Id, UserId: userId, External: true})
+				So(err, ShouldBeNil)
+
+				memberQuery := &m.GetTeamMembersQuery{OrgId: testOrgId, TeamId: team1.Id, External: true}
+				err = GetTeamMembers(memberQuery)
+				So(err, ShouldBeNil)
+				So(memberQuery.Result, ShouldHaveLength, 1)
+				So(memberQuery.Result[0].TeamId, ShouldEqual, team1.Id)
+				So(memberQuery.Result[0].Login, ShouldEqual, "loginuser1")
+				So(memberQuery.Result[0].OrgId, ShouldEqual, testOrgId)
+				So(memberQuery.Result[0].External, ShouldEqual, true)
+				So(memberQuery.Result[0].AuthModule, ShouldEqual, "oauth_github")
+			})
+
 			Convey("Should be able to update users in a team", func() {
 				userId := userIds[0]
 				team := group1.Result