diff --git a/pkg/modules/auth/openid/openid.go b/pkg/modules/auth/openid/openid.go index 504810e81..6501ea7a0 100644 --- a/pkg/modules/auth/openid/openid.go +++ b/pkg/modules/auth/openid/openid.go @@ -200,23 +200,24 @@ func HandleCallback(c echo.Context) error { // does the oidc token contain well formed "vikunja_groups" through vikunja_scope teamData, errs := getTeamDataFromToken(cl.VikunjaGroups, provider) - for _, err := range errs { - log.Errorf("Error creating teams for user and vikunja groups %s: %v", cl.VikunjaGroups, err) - } + if teamData != nil { + for _, err := range errs { + log.Errorf("Error creating teams for user and vikunja groups %s: %v", cl.VikunjaGroups, err) + } - //find old teams for user through oidc - oldOidcTeams, err := models.FindAllOidcTeamIDsForUser(s, u.ID) - if err != nil { - log.Errorf("No Oidc Teams found for user %v", err) - } - oidcTeams, err := AssignOrCreateUserToTeams(s, u, teamData) - if err != nil { - log.Errorf("Could not proceed with group routine %v", err) - } - errs = RemoveUserFromTeamsByIds(s, u, utils.NotIn(oldOidcTeams, oidcTeams)) - log.Errorf("%v", errs) - for _, err := range errs { - log.Errorf("Found Error while signing out from teams %v", err) + //find old teams for user through oidc + oldOidcTeams, err := models.FindAllOidcTeamIDsForUser(s, u.ID) + if err != nil { + log.Errorf("No Oidc Teams found for user %v", err) + } + oidcTeams, err := AssignOrCreateUserToTeams(s, u, teamData) + if err != nil { + log.Errorf("Could not proceed with group routine %v", err) + } + errs = RemoveUserFromTeamsByIds(s, u, utils.NotIn(oldOidcTeams, oidcTeams)) + for _, err := range errs { + log.Errorf("Found Error while signing out from teams %v", err) + } } err = s.Commit() if err != nil { @@ -229,29 +230,30 @@ func HandleCallback(c echo.Context) error { } func AssignOrCreateUserToTeams(s *xorm.Session, u *user.User, teamData []models.OIDCTeamData) (oidcTeams []int64, err error) { - if len(teamData) > 0 { - // check if we have seen these teams before. - // find or create Teams and assign user as teammember. - teams, err := GetOrCreateTeamsByOIDCAndNames(s, teamData, u) - if err != nil { - log.Errorf("Error verifying team for %v, got %v. Error: %v", u.Name, teams, err) - return nil, err - } - for _, team := range teams { - tm := models.TeamMember{TeamID: team.ID, UserID: u.ID, Username: u.Username} - exists, _ := tm.CheckMembership(s) - if !exists { - err = tm.Create(s, u) - if err != nil { - log.Errorf("Could not assign %v to %v. %v", u.Username, team.Name, err) - } + if len(teamData) == 0 { + return + } + // check if we have seen these teams before. + // find or create Teams and assign user as teammember. + teams, err := GetOrCreateTeamsByOIDCAndNames(s, teamData, u) + if err != nil { + log.Errorf("Error verifying team for %v, got %v. Error: %v", u.Name, teams, err) + return nil, err + } + for _, team := range teams { + tm := models.TeamMember{TeamID: team.ID, UserID: u.ID, Username: u.Username} + exists, _ := tm.CheckMembership(s) + if !exists { + err = tm.Create(s, u) + if err != nil { + log.Errorf("Could not assign %v to %v. %v", u.Username, team.Name, err) } - oidcTeams = append(oidcTeams, team.ID) } + oidcTeams = append(oidcTeams, team.ID) } return oidcTeams, err - } + func RemoveUserFromTeamsByIds(s *xorm.Session, u *user.User, teamIDs []int64) (errs []error) { errs = []error{} for _, teamID := range teamIDs { @@ -310,19 +312,19 @@ func getTeamDataFromToken(groups []map[string]interface{}, provider *Provider) ( } func CreateTeamWithData(s *xorm.Session, teamData models.OIDCTeamData, u *user.User) (team *models.Team, err error) { - tea := &models.Team{ + team = &models.Team{ Name: teamData.TeamName, Description: teamData.Description, OidcID: teamData.OidcID, } - err = tea.Create(s, u) - return tea, err + err = team.Create(s, u) + return team, err } // this functions creates an array of existing teams that was generated from the oidc data. func GetOrCreateTeamsByOIDCAndNames(s *xorm.Session, teamData []models.OIDCTeamData, u *user.User) (te []*models.Team, err error) { te = []*models.Team{} - // Procedure can only be successful if oidcID is set and converted to string + // Procedure can only be successful if oidcID is set for _, oidcTeam := range teamData { team, err := models.GetTeamByOidcIDAndName(s, oidcTeam.OidcID, oidcTeam.TeamName) if err != nil {