[MM-28125] einterface/oauthprovide: return parsing errors (#15426)
* einterface/oauthprovide: return parsing errors * Update app/oauth.go * reflect review comments * fix var name error Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
90738de75f
Коммит
c05ee81c9f
34
app/oauth.go
34
app/oauth.go
@@ -574,19 +574,18 @@ func (a *App) LoginByOAuth(service string, userData io.Reader, teamId string) (*
|
|||||||
return nil, model.NewAppError("LoginByOAuth", "api.user.login_by_oauth.parse.app_error",
|
return nil, model.NewAppError("LoginByOAuth", "api.user.login_by_oauth.parse.app_error",
|
||||||
map[string]interface{}{"Service": service}, "", http.StatusBadRequest)
|
map[string]interface{}{"Service": service}, "", http.StatusBadRequest)
|
||||||
}
|
}
|
||||||
authUser := provider.GetUserFromJson(bytes.NewReader(buf.Bytes()))
|
|
||||||
|
|
||||||
authData := ""
|
authUser, err1 := provider.GetUserFromJson(bytes.NewReader(buf.Bytes()))
|
||||||
if authUser.AuthData != nil {
|
if err1 != nil {
|
||||||
authData = *authUser.AuthData
|
return nil, model.NewAppError("LoginByOAuth", "api.user.login_by_oauth.parse.app_error",
|
||||||
|
map[string]interface{}{"Service": service}, err1.Error(), http.StatusBadRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(authData) == 0 {
|
if *authUser.AuthData == "" {
|
||||||
return nil, model.NewAppError("LoginByOAuth", "api.user.login_by_oauth.parse.app_error",
|
return nil, model.NewAppError("LoginByOAuth", "api.user.login_by_oauth.parse.app_error",
|
||||||
map[string]interface{}{"Service": service}, "", http.StatusBadRequest)
|
map[string]interface{}{"Service": service}, "", http.StatusBadRequest)
|
||||||
}
|
}
|
||||||
|
user, err := a.GetUserByAuth(model.NewString(*authUser.AuthData), service)
|
||||||
user, err := a.GetUserByAuth(&authData, service)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err.Id == store.MISSING_AUTH_ACCOUNT_ERROR {
|
if err.Id == store.MISSING_AUTH_ACCOUNT_ERROR {
|
||||||
user, err = a.CreateOAuthUser(service, bytes.NewReader(buf.Bytes()), teamId)
|
user, err = a.CreateOAuthUser(service, bytes.NewReader(buf.Bytes()), teamId)
|
||||||
@@ -622,23 +621,22 @@ func (a *App) CompleteSwitchWithOAuth(service string, userData io.Reader, email
|
|||||||
return nil, model.NewAppError("CompleteSwitchWithOAuth", "api.user.complete_switch_with_oauth.unavailable.app_error",
|
return nil, model.NewAppError("CompleteSwitchWithOAuth", "api.user.complete_switch_with_oauth.unavailable.app_error",
|
||||||
map[string]interface{}{"Service": strings.Title(service)}, "", http.StatusNotImplemented)
|
map[string]interface{}{"Service": strings.Title(service)}, "", http.StatusNotImplemented)
|
||||||
}
|
}
|
||||||
ssoUser := provider.GetUserFromJson(userData)
|
|
||||||
ssoEmail := ssoUser.Email
|
|
||||||
|
|
||||||
authData := ""
|
if email == "" {
|
||||||
if ssoUser.AuthData != nil {
|
return nil, model.NewAppError("CompleteSwitchWithOAuth", "api.user.complete_switch_with_oauth.blank_email.app_error", nil, "", http.StatusBadRequest)
|
||||||
authData = *ssoUser.AuthData
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(authData) == 0 {
|
ssoUser, err1 := provider.GetUserFromJson(userData)
|
||||||
|
if err1 != nil {
|
||||||
|
return nil, model.NewAppError("CompleteSwitchWithOAuth", "api.user.complete_switch_with_oauth.parse.app_error",
|
||||||
|
map[string]interface{}{"Service": service}, err1.Error(), http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
if *ssoUser.AuthData == "" {
|
||||||
return nil, model.NewAppError("CompleteSwitchWithOAuth", "api.user.complete_switch_with_oauth.parse.app_error",
|
return nil, model.NewAppError("CompleteSwitchWithOAuth", "api.user.complete_switch_with_oauth.parse.app_error",
|
||||||
map[string]interface{}{"Service": service}, "", http.StatusBadRequest)
|
map[string]interface{}{"Service": service}, "", http.StatusBadRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(email) == 0 {
|
|
||||||
return nil, model.NewAppError("CompleteSwitchWithOAuth", "api.user.complete_switch_with_oauth.blank_email.app_error", nil, "", http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
|
|
||||||
user, err := a.Srv().Store.User().GetByEmail(email)
|
user, err := a.Srv().Store.User().GetByEmail(email)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -648,7 +646,7 @@ func (a *App) CompleteSwitchWithOAuth(service string, userData io.Reader, email
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = a.Srv().Store.User().UpdateAuthData(user.Id, service, &authData, ssoEmail, true); err != nil {
|
if _, err = a.Srv().Store.User().UpdateAuthData(user.Id, service, model.NewString(*ssoUser.AuthData), ssoUser.Email, true); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
app/user.go
13
app/user.go
@@ -328,10 +328,9 @@ func (a *App) CreateOAuthUser(service string, userData io.Reader, teamId string)
|
|||||||
if provider == nil {
|
if provider == nil {
|
||||||
return nil, model.NewAppError("CreateOAuthUser", "api.user.create_oauth_user.not_available.app_error", map[string]interface{}{"Service": strings.Title(service)}, "", http.StatusNotImplemented)
|
return nil, model.NewAppError("CreateOAuthUser", "api.user.create_oauth_user.not_available.app_error", map[string]interface{}{"Service": strings.Title(service)}, "", http.StatusNotImplemented)
|
||||||
}
|
}
|
||||||
user := provider.GetUserFromJson(userData)
|
user, err1 := provider.GetUserFromJson(userData)
|
||||||
|
if err1 != nil {
|
||||||
if user == nil {
|
return nil, model.NewAppError("CreateOAuthUser", "api.user.create_oauth_user.create.app_error", map[string]interface{}{"Service": service}, err1.Error(), http.StatusInternalServerError)
|
||||||
return nil, model.NewAppError("CreateOAuthUser", "api.user.create_oauth_user.create.app_error", map[string]interface{}{"Service": service}, "", http.StatusInternalServerError)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
suchan := make(chan store.StoreResult, 1)
|
suchan := make(chan store.StoreResult, 1)
|
||||||
@@ -1857,9 +1856,9 @@ func (a *App) AutocompleteUsersInTeam(teamId string, term string, options *model
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) UpdateOAuthUserAttrs(userData io.Reader, user *model.User, provider einterfaces.OauthProvider, service string) *model.AppError {
|
func (a *App) UpdateOAuthUserAttrs(userData io.Reader, user *model.User, provider einterfaces.OauthProvider, service string) *model.AppError {
|
||||||
oauthUser := provider.GetUserFromJson(userData)
|
oauthUser, err1 := provider.GetUserFromJson(userData)
|
||||||
if oauthUser == nil {
|
if err1 != nil {
|
||||||
return model.NewAppError("UpdateOAuthUserAttrs", "api.user.update_oauth_user_attrs.get_user.app_error", map[string]interface{}{"Service": service}, "", http.StatusBadRequest)
|
return model.NewAppError("UpdateOAuthUserAttrs", "api.user.update_oauth_user_attrs.get_user.app_error", map[string]interface{}{"Service": service}, err1.Error(), http.StatusBadRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
userAttrsChanged := false
|
userAttrsChanged := false
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type OauthProvider interface {
|
type OauthProvider interface {
|
||||||
GetUserFromJson(data io.Reader) *model.User
|
GetUserFromJson(data io.Reader) (*model.User, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
var oauthProviders = make(map[string]OauthProvider)
|
var oauthProviders = make(map[string]OauthProvider)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ package oauthgitlab
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -55,15 +56,14 @@ func userFromGitLabUser(glu *GitLabUser) *model.User {
|
|||||||
return user
|
return user
|
||||||
}
|
}
|
||||||
|
|
||||||
func gitLabUserFromJson(data io.Reader) *GitLabUser {
|
func gitLabUserFromJson(data io.Reader) (*GitLabUser, error) {
|
||||||
decoder := json.NewDecoder(data)
|
decoder := json.NewDecoder(data)
|
||||||
var glu GitLabUser
|
var glu GitLabUser
|
||||||
err := decoder.Decode(&glu)
|
err := decoder.Decode(&glu)
|
||||||
if err == nil {
|
if err != nil {
|
||||||
return &glu
|
return nil, err
|
||||||
} else {
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
return &glu, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (glu *GitLabUser) ToJson() string {
|
func (glu *GitLabUser) ToJson() string {
|
||||||
@@ -75,27 +75,30 @@ func (glu *GitLabUser) ToJson() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (glu *GitLabUser) IsValid() bool {
|
func (glu *GitLabUser) IsValid() error {
|
||||||
if glu.Id == 0 {
|
if glu.Id == 0 {
|
||||||
return false
|
return errors.New("user id can't be 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(glu.Email) == 0 {
|
if glu.Email == "" {
|
||||||
return false
|
return errors.New("user e-mail should not be empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (glu *GitLabUser) getAuthData() string {
|
func (glu *GitLabUser) getAuthData() string {
|
||||||
return strconv.FormatInt(glu.Id, 10)
|
return strconv.FormatInt(glu.Id, 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *GitLabProvider) GetUserFromJson(data io.Reader) *model.User {
|
func (m *GitLabProvider) GetUserFromJson(data io.Reader) (*model.User, error) {
|
||||||
glu := gitLabUserFromJson(data)
|
glu, err := gitLabUserFromJson(data)
|
||||||
if glu.IsValid() {
|
if err != nil {
|
||||||
return userFromGitLabUser(glu)
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = glu.IsValid(); err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &model.User{}
|
return userFromGitLabUser(glu), nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -549,10 +549,10 @@ func closeBody(r *http.Response) {
|
|||||||
type MattermostTestProvider struct {
|
type MattermostTestProvider struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MattermostTestProvider) GetUserFromJson(data io.Reader) *model.User {
|
func (m *MattermostTestProvider) GetUserFromJson(data io.Reader) (*model.User, error) {
|
||||||
user := model.UserFromJson(data)
|
user := model.UserFromJson(data)
|
||||||
user.AuthData = &user.Email
|
user.AuthData = &user.Email
|
||||||
return user
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateTestAppName() string {
|
func GenerateTestAppName() string {
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user