|
|
@ -5,17 +5,21 @@
|
|
|
|
package models
|
|
|
|
package models
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
|
|
|
|
"bytes"
|
|
|
|
"container/list"
|
|
|
|
"container/list"
|
|
|
|
"crypto/sha256"
|
|
|
|
"crypto/sha256"
|
|
|
|
"encoding/hex"
|
|
|
|
"encoding/hex"
|
|
|
|
"errors"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"image"
|
|
|
|
|
|
|
|
"image/jpeg"
|
|
|
|
"os"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/Unknwon/com"
|
|
|
|
"github.com/Unknwon/com"
|
|
|
|
|
|
|
|
"github.com/nfnt/resize"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/gogits/gogs/modules/base"
|
|
|
|
"github.com/gogits/gogs/modules/base"
|
|
|
|
"github.com/gogits/gogs/modules/git"
|
|
|
|
"github.com/gogits/gogs/modules/git"
|
|
|
@ -45,33 +49,40 @@ var (
|
|
|
|
|
|
|
|
|
|
|
|
// User represents the object of individual and member of organization.
|
|
|
|
// User represents the object of individual and member of organization.
|
|
|
|
type User struct {
|
|
|
|
type User struct {
|
|
|
|
Id int64
|
|
|
|
Id int64
|
|
|
|
LowerName string `xorm:"UNIQUE NOT NULL"`
|
|
|
|
LowerName string `xorm:"UNIQUE NOT NULL"`
|
|
|
|
Name string `xorm:"UNIQUE NOT NULL"`
|
|
|
|
Name string `xorm:"UNIQUE NOT NULL"`
|
|
|
|
FullName string
|
|
|
|
FullName string
|
|
|
|
Email string `xorm:"UNIQUE NOT NULL"`
|
|
|
|
Email string `xorm:"UNIQUE NOT NULL"`
|
|
|
|
Passwd string `xorm:"NOT NULL"`
|
|
|
|
Passwd string `xorm:"NOT NULL"`
|
|
|
|
LoginType LoginType
|
|
|
|
LoginType LoginType
|
|
|
|
LoginSource int64 `xorm:"NOT NULL DEFAULT 0"`
|
|
|
|
LoginSource int64 `xorm:"NOT NULL DEFAULT 0"`
|
|
|
|
LoginName string
|
|
|
|
LoginName string
|
|
|
|
Type UserType
|
|
|
|
Type UserType
|
|
|
|
Orgs []*User `xorm:"-"`
|
|
|
|
Orgs []*User `xorm:"-"`
|
|
|
|
Repos []*Repository `xorm:"-"`
|
|
|
|
Repos []*Repository `xorm:"-"`
|
|
|
|
|
|
|
|
Location string
|
|
|
|
|
|
|
|
Website string
|
|
|
|
|
|
|
|
Rands string `xorm:"VARCHAR(10)"`
|
|
|
|
|
|
|
|
Salt string `xorm:"VARCHAR(10)"`
|
|
|
|
|
|
|
|
Created time.Time `xorm:"CREATED"`
|
|
|
|
|
|
|
|
Updated time.Time `xorm:"UPDATED"`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Permissions.
|
|
|
|
|
|
|
|
IsActive bool
|
|
|
|
|
|
|
|
IsAdmin bool
|
|
|
|
|
|
|
|
AllowGitHook bool
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Avatar.
|
|
|
|
|
|
|
|
Avatar string `xorm:"VARCHAR(2048) NOT NULL"`
|
|
|
|
|
|
|
|
AvatarEmail string `xorm:"NOT NULL"`
|
|
|
|
|
|
|
|
UseCustomAvatar bool
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Counters.
|
|
|
|
NumFollowers int
|
|
|
|
NumFollowers int
|
|
|
|
NumFollowings int
|
|
|
|
NumFollowings int
|
|
|
|
NumStars int
|
|
|
|
NumStars int
|
|
|
|
NumRepos int
|
|
|
|
NumRepos int
|
|
|
|
Avatar string `xorm:"VARCHAR(2048) NOT NULL"`
|
|
|
|
|
|
|
|
AvatarEmail string `xorm:"NOT NULL"`
|
|
|
|
|
|
|
|
Location string
|
|
|
|
|
|
|
|
Website string
|
|
|
|
|
|
|
|
IsActive bool
|
|
|
|
|
|
|
|
IsAdmin bool
|
|
|
|
|
|
|
|
AllowGitHook bool
|
|
|
|
|
|
|
|
Rands string `xorm:"VARCHAR(10)"`
|
|
|
|
|
|
|
|
Salt string `xorm:"VARCHAR(10)"`
|
|
|
|
|
|
|
|
Created time.Time `xorm:"CREATED"`
|
|
|
|
|
|
|
|
Updated time.Time `xorm:"UPDATED"`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// For organization.
|
|
|
|
// For organization.
|
|
|
|
Description string
|
|
|
|
Description string
|
|
|
@ -96,9 +107,12 @@ func (u *User) HomeLink() string {
|
|
|
|
|
|
|
|
|
|
|
|
// AvatarLink returns user gravatar link.
|
|
|
|
// AvatarLink returns user gravatar link.
|
|
|
|
func (u *User) AvatarLink() string {
|
|
|
|
func (u *User) AvatarLink() string {
|
|
|
|
if setting.DisableGravatar {
|
|
|
|
switch {
|
|
|
|
|
|
|
|
case u.UseCustomAvatar:
|
|
|
|
|
|
|
|
return setting.AppSubUrl + "/avatars/" + com.ToStr(u.Id)
|
|
|
|
|
|
|
|
case setting.DisableGravatar:
|
|
|
|
return setting.AppSubUrl + "/img/avatar_default.jpg"
|
|
|
|
return setting.AppSubUrl + "/img/avatar_default.jpg"
|
|
|
|
} else if setting.Service.EnableCacheAvatar {
|
|
|
|
case setting.Service.EnableCacheAvatar:
|
|
|
|
return setting.AppSubUrl + "/avatar/" + u.Avatar
|
|
|
|
return setting.AppSubUrl + "/avatar/" + u.Avatar
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return setting.GravatarSource + u.Avatar
|
|
|
|
return setting.GravatarSource + u.Avatar
|
|
|
@ -126,6 +140,43 @@ func (u *User) ValidtePassword(passwd string) bool {
|
|
|
|
return u.Passwd == newUser.Passwd
|
|
|
|
return u.Passwd == newUser.Passwd
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// UploadAvatar saves custom avatar for user.
|
|
|
|
|
|
|
|
// FIXME: splite uploads to different subdirs in case we have massive users.
|
|
|
|
|
|
|
|
func (u *User) UploadAvatar(data []byte) error {
|
|
|
|
|
|
|
|
savePath := filepath.Join(setting.AvatarUploadPath, com.ToStr(u.Id))
|
|
|
|
|
|
|
|
u.UseCustomAvatar = true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
img, _, err := image.Decode(bytes.NewReader(data))
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
m := resize.Resize(200, 200, img, resize.NearestNeighbor)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sess := x.NewSession()
|
|
|
|
|
|
|
|
defer sess.Close()
|
|
|
|
|
|
|
|
if err = sess.Begin(); err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if _, err = sess.Id(u.Id).AllCols().Update(u); err != nil {
|
|
|
|
|
|
|
|
sess.Rollback()
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fw, err := os.Create(savePath)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
sess.Rollback()
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer fw.Close()
|
|
|
|
|
|
|
|
if err = jpeg.Encode(fw, m, nil); err != nil {
|
|
|
|
|
|
|
|
sess.Rollback()
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return sess.Commit()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// IsOrganization returns true if user is actually a organization.
|
|
|
|
// IsOrganization returns true if user is actually a organization.
|
|
|
|
func (u *User) IsOrganization() bool {
|
|
|
|
func (u *User) IsOrganization() bool {
|
|
|
|
return u.Type == ORGANIZATION
|
|
|
|
return u.Type == ORGANIZATION
|
|
|
@ -517,41 +568,38 @@ func GetUserIdsByNames(names []string) []int64 {
|
|
|
|
|
|
|
|
|
|
|
|
// UserCommit represtns a commit with validation of user.
|
|
|
|
// UserCommit represtns a commit with validation of user.
|
|
|
|
type UserCommit struct {
|
|
|
|
type UserCommit struct {
|
|
|
|
UserName string
|
|
|
|
User *User
|
|
|
|
*git.Commit
|
|
|
|
*git.Commit
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ValidateCommitWithEmail chceck if author's e-mail of commit is corresponsind to a user.
|
|
|
|
// ValidateCommitWithEmail chceck if author's e-mail of commit is corresponsind to a user.
|
|
|
|
func ValidateCommitWithEmail(c *git.Commit) (uname string) {
|
|
|
|
func ValidateCommitWithEmail(c *git.Commit) *User {
|
|
|
|
u, err := GetUserByEmail(c.Author.Email)
|
|
|
|
u, err := GetUserByEmail(c.Author.Email)
|
|
|
|
if err == nil {
|
|
|
|
if err != nil {
|
|
|
|
uname = u.Name
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return uname
|
|
|
|
return u
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ValidateCommitsWithEmails checks if authors' e-mails of commits are corresponding to users.
|
|
|
|
// ValidateCommitsWithEmails checks if authors' e-mails of commits are corresponding to users.
|
|
|
|
func ValidateCommitsWithEmails(oldCommits *list.List) *list.List {
|
|
|
|
func ValidateCommitsWithEmails(oldCommits *list.List) *list.List {
|
|
|
|
emails := map[string]string{}
|
|
|
|
emails := map[string]*User{}
|
|
|
|
newCommits := list.New()
|
|
|
|
newCommits := list.New()
|
|
|
|
e := oldCommits.Front()
|
|
|
|
e := oldCommits.Front()
|
|
|
|
for e != nil {
|
|
|
|
for e != nil {
|
|
|
|
c := e.Value.(*git.Commit)
|
|
|
|
c := e.Value.(*git.Commit)
|
|
|
|
|
|
|
|
|
|
|
|
uname := ""
|
|
|
|
var u *User
|
|
|
|
if v, ok := emails[c.Author.Email]; !ok {
|
|
|
|
if v, ok := emails[c.Author.Email]; !ok {
|
|
|
|
u, err := GetUserByEmail(c.Author.Email)
|
|
|
|
u, _ = GetUserByEmail(c.Author.Email)
|
|
|
|
if err == nil {
|
|
|
|
emails[c.Author.Email] = u
|
|
|
|
uname = u.Name
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
emails[c.Author.Email] = uname
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
uname = v
|
|
|
|
u = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
newCommits.PushBack(UserCommit{
|
|
|
|
newCommits.PushBack(UserCommit{
|
|
|
|
UserName: uname,
|
|
|
|
User: u,
|
|
|
|
Commit: c,
|
|
|
|
Commit: c,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
e = e.Next()
|
|
|
|
e = e.Next()
|
|
|
|
}
|
|
|
|
}
|
|
|
|