initial server implementation for using google as a single-sign-on oauth service

Этот коммит содержится в:
JoramWilander
2015-08-13 12:03:47 -04:00
родитель b9aef9f2a6
Коммит e27db2ed63
7 изменённых файлов: 146 добавлений и 59 удалений

57
model/gitlab.go Обычный файл
Просмотреть файл

@@ -0,0 +1,57 @@
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
// See License.txt for license information.
package model
import (
"encoding/json"
"io"
"strconv"
"strings"
)
const (
USER_AUTH_SERVICE_GITLAB = "gitlab"
)
type GitLabUser struct {
Id int64 `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
Name string `json:"name"`
}
func UserFromGitLabUser(glu *GitLabUser) *User {
user := &User{}
user.Username = glu.Username
splitName := strings.Split(glu.Name, " ")
if len(splitName) == 2 {
user.FirstName = splitName[0]
user.LastName = splitName[1]
} else if len(splitName) >= 2 {
user.FirstName = splitName[0]
user.LastName = strings.Join(splitName[1:], " ")
} else {
user.FirstName = glu.Name
}
user.Email = glu.Email
user.AuthData = strconv.FormatInt(glu.Id, 10)
user.AuthService = USER_AUTH_SERVICE_GITLAB
return user
}
func GitLabUserFromJson(data io.Reader) *GitLabUser {
decoder := json.NewDecoder(data)
var glu GitLabUser
err := decoder.Decode(&glu)
if err == nil {
return &glu
} else {
return nil
}
}
func (glu *GitLabUser) GetAuthData() string {
return strconv.FormatInt(glu.Id, 10)
}

54
model/google.go Обычный файл
Просмотреть файл

@@ -0,0 +1,54 @@
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
// See License.txt for license information.
package model
import (
"encoding/json"
"io"
)
const (
USER_AUTH_SERVICE_GOOGLE = "google"
)
type GoogleUser struct {
Id string `json:"id"`
Nickname string `json:"nickname"`
Emails []map[string]string `json:"emails"`
Names map[string]string `json:"name"`
}
func UserFromGoogleUser(gu *GoogleUser) *User {
user := &User{}
user.Username = gu.Nickname
user.FirstName = gu.Names["givenName"]
user.LastName = gu.Names["familyName"]
user.Nickname = gu.Nickname
for _, e := range gu.Emails {
if e["type"] == "account" {
user.Email = e["value"]
}
}
user.AuthData = gu.Id
user.AuthService = USER_AUTH_SERVICE_GOOGLE
return user
}
func GoogleUserFromJson(data io.Reader) *GoogleUser {
decoder := json.NewDecoder(data)
var gu GoogleUser
err := decoder.Decode(&gu)
if err == nil {
return &gu
} else {
return nil
}
}
func (gu *GoogleUser) GetAuthData() string {
return gu.Id
}

Просмотреть файл

@@ -8,24 +8,22 @@ import (
"encoding/json"
"io"
"regexp"
"strconv"
"strings"
)
const (
ROLE_ADMIN = "admin"
ROLE_SYSTEM_ADMIN = "system_admin"
ROLE_SYSTEM_SUPPORT = "system_support"
USER_AWAY_TIMEOUT = 5 * 60 * 1000 // 5 minutes
USER_OFFLINE_TIMEOUT = 1 * 60 * 1000 // 1 minute
USER_OFFLINE = "offline"
USER_AWAY = "away"
USER_ONLINE = "online"
USER_NOTIFY_ALL = "all"
USER_NOTIFY_MENTION = "mention"
USER_NOTIFY_NONE = "none"
BOT_USERNAME = "valet"
USER_AUTH_SERVICE_GITLAB = "gitlab"
ROLE_ADMIN = "admin"
ROLE_SYSTEM_ADMIN = "system_admin"
ROLE_SYSTEM_SUPPORT = "system_support"
USER_AWAY_TIMEOUT = 5 * 60 * 1000 // 5 minutes
USER_OFFLINE_TIMEOUT = 1 * 60 * 1000 // 1 minute
USER_OFFLINE = "offline"
USER_AWAY = "away"
USER_ONLINE = "online"
USER_NOTIFY_ALL = "all"
USER_NOTIFY_MENTION = "mention"
USER_NOTIFY_NONE = "none"
BOT_USERNAME = "valet"
)
type User struct {
@@ -54,13 +52,6 @@ type User struct {
FailedAttempts int `json:"failed_attempts"`
}
type GitLabUser struct {
Id int64 `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
Name string `json:"name"`
}
// IsValid validates the user and returns an error if it isn't configured
// correctly.
func (u *User) IsValid() *AppError {
@@ -355,38 +346,3 @@ func IsUsernameValid(username string) bool {
return true
}
func UserFromGitLabUser(glu *GitLabUser) *User {
user := &User{}
user.Username = glu.Username
splitName := strings.Split(glu.Name, " ")
if len(splitName) == 2 {
user.FirstName = splitName[0]
user.LastName = splitName[1]
} else if len(splitName) >= 2 {
user.FirstName = splitName[0]
user.LastName = strings.Join(splitName[1:], " ")
} else {
user.FirstName = glu.Name
}
user.Email = glu.Email
user.AuthData = strconv.FormatInt(glu.Id, 10)
user.AuthService = USER_AUTH_SERVICE_GITLAB
return user
}
func GitLabUserFromJson(data io.Reader) *GitLabUser {
decoder := json.NewDecoder(data)
var glu GitLabUser
err := decoder.Decode(&glu)
if err == nil {
return &glu
} else {
return nil
}
}
func (glu *GitLabUser) GetAuthData() string {
return strconv.FormatInt(glu.Id, 10)
}