|
|
@ -21,10 +21,11 @@ import ( |
|
|
|
"github.com/gogits/gogs/modules/setting" |
|
|
|
) |
|
|
|
|
|
|
|
// User types.
|
|
|
|
type UserType int |
|
|
|
|
|
|
|
const ( |
|
|
|
UT_INDIVIDUAL = iota + 1 |
|
|
|
UT_ORGANIZATION |
|
|
|
INDIVIDUAL UserType = iota // Historic reason to make it starts at 0.
|
|
|
|
ORGANIZATION |
|
|
|
) |
|
|
|
|
|
|
|
var ( |
|
|
@ -50,7 +51,8 @@ type User struct { |
|
|
|
LoginType LoginType |
|
|
|
LoginSource int64 `xorm:"not null default 0"` |
|
|
|
LoginName string |
|
|
|
Type int |
|
|
|
Type UserType |
|
|
|
Orgs []*User `xorm:"-"` |
|
|
|
NumFollowers int |
|
|
|
NumFollowings int |
|
|
|
NumStars int |
|
|
@ -65,36 +67,60 @@ type User struct { |
|
|
|
Salt string `xorm:"VARCHAR(10)"` |
|
|
|
Created time.Time `xorm:"created"` |
|
|
|
Updated time.Time `xorm:"updated"` |
|
|
|
|
|
|
|
// For organization.
|
|
|
|
NumTeams int |
|
|
|
NumMembers int |
|
|
|
} |
|
|
|
|
|
|
|
// HomeLink returns the user home page link.
|
|
|
|
func (user *User) HomeLink() string { |
|
|
|
return "/user/" + user.Name |
|
|
|
func (u *User) HomeLink() string { |
|
|
|
return "/user/" + u.Name |
|
|
|
} |
|
|
|
|
|
|
|
// AvatarLink returns user gravatar link.
|
|
|
|
func (user *User) AvatarLink() string { |
|
|
|
func (u *User) AvatarLink() string { |
|
|
|
if setting.DisableGravatar { |
|
|
|
return "/img/avatar_default.jpg" |
|
|
|
} else if setting.Service.EnableCacheAvatar { |
|
|
|
return "/avatar/" + user.Avatar |
|
|
|
return "/avatar/" + u.Avatar |
|
|
|
} |
|
|
|
return "//1.gravatar.com/avatar/" + user.Avatar |
|
|
|
return "//1.gravatar.com/avatar/" + u.Avatar |
|
|
|
} |
|
|
|
|
|
|
|
// NewGitSig generates and returns the signature of given user.
|
|
|
|
func (user *User) NewGitSig() *git.Signature { |
|
|
|
func (u *User) NewGitSig() *git.Signature { |
|
|
|
return &git.Signature{ |
|
|
|
Name: user.Name, |
|
|
|
Email: user.Email, |
|
|
|
Name: u.Name, |
|
|
|
Email: u.Email, |
|
|
|
When: time.Now(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// EncodePasswd encodes password to safe format.
|
|
|
|
func (user *User) EncodePasswd() { |
|
|
|
newPasswd := base.PBKDF2([]byte(user.Passwd), []byte(user.Salt), 10000, 50, sha256.New) |
|
|
|
user.Passwd = fmt.Sprintf("%x", newPasswd) |
|
|
|
func (u *User) EncodePasswd() { |
|
|
|
newPasswd := base.PBKDF2([]byte(u.Passwd), []byte(u.Salt), 10000, 50, sha256.New) |
|
|
|
u.Passwd = fmt.Sprintf("%x", newPasswd) |
|
|
|
} |
|
|
|
|
|
|
|
func (u *User) IsOrganization() bool { |
|
|
|
return u.Type == ORGANIZATION |
|
|
|
} |
|
|
|
|
|
|
|
func (u *User) GetOrganizations() error { |
|
|
|
ous, err := GetOrgUsersByUserId(u.Id) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
u.Orgs = make([]*User, len(ous)) |
|
|
|
for i, ou := range ous { |
|
|
|
u.Orgs[i], err = GetUserById(ou.OrgId) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// Member represents user is member of organization.
|
|
|
@ -126,49 +152,135 @@ func GetUserSalt() string { |
|
|
|
return base.GetRandomString(10) |
|
|
|
} |
|
|
|
|
|
|
|
// RegisterUser creates record of a new user.
|
|
|
|
func RegisterUser(user *User) (*User, error) { |
|
|
|
// CreateUser creates record of a new user.
|
|
|
|
func CreateUser(u *User) (*User, error) { |
|
|
|
if !IsLegalName(u.Name) { |
|
|
|
return nil, ErrUserNameIllegal |
|
|
|
} |
|
|
|
|
|
|
|
isExist, err := IsUserExist(u.Name) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} else if isExist { |
|
|
|
return nil, ErrUserAlreadyExist |
|
|
|
} |
|
|
|
|
|
|
|
isExist, err = IsEmailUsed(u.Email) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} else if isExist { |
|
|
|
return nil, ErrEmailAlreadyUsed |
|
|
|
} |
|
|
|
|
|
|
|
u.LowerName = strings.ToLower(u.Name) |
|
|
|
u.Avatar = base.EncodeMd5(u.Email) |
|
|
|
u.AvatarEmail = u.Email |
|
|
|
u.Rands = GetUserSalt() |
|
|
|
u.Salt = GetUserSalt() |
|
|
|
u.EncodePasswd() |
|
|
|
|
|
|
|
sess := x.NewSession() |
|
|
|
defer sess.Close() |
|
|
|
if err = sess.Begin(); err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
if !IsLegalName(user.Name) { |
|
|
|
if _, err = sess.Insert(u); err != nil { |
|
|
|
sess.Rollback() |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
if err = os.MkdirAll(UserPath(u.Name), os.ModePerm); err != nil { |
|
|
|
sess.Rollback() |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
if err = sess.Commit(); err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
// Auto-set admin for user whose ID is 1.
|
|
|
|
if u.Id == 1 { |
|
|
|
u.IsAdmin = true |
|
|
|
u.IsActive = true |
|
|
|
_, err = x.Id(u.Id).UseBool().Update(u) |
|
|
|
} |
|
|
|
return u, err |
|
|
|
} |
|
|
|
|
|
|
|
// CreateOrganization creates record of a new organization.
|
|
|
|
func CreateOrganization(org, owner *User) (*User, error) { |
|
|
|
if !IsLegalName(org.Name) { |
|
|
|
return nil, ErrUserNameIllegal |
|
|
|
} |
|
|
|
|
|
|
|
isExist, err := IsUserExist(user.Name) |
|
|
|
isExist, err := IsUserExist(org.Name) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} else if isExist { |
|
|
|
return nil, ErrUserAlreadyExist |
|
|
|
} |
|
|
|
|
|
|
|
isExist, err = IsEmailUsed(user.Email) |
|
|
|
isExist, err = IsEmailUsed(org.Email) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} else if isExist { |
|
|
|
return nil, ErrEmailAlreadyUsed |
|
|
|
} |
|
|
|
|
|
|
|
user.LowerName = strings.ToLower(user.Name) |
|
|
|
user.Avatar = base.EncodeMd5(user.Email) |
|
|
|
user.AvatarEmail = user.Email |
|
|
|
user.Rands = GetUserSalt() |
|
|
|
user.Salt = GetUserSalt() |
|
|
|
user.EncodePasswd() |
|
|
|
if _, err = x.Insert(user); err != nil { |
|
|
|
org.LowerName = strings.ToLower(org.Name) |
|
|
|
org.Avatar = base.EncodeMd5(org.Email) |
|
|
|
org.AvatarEmail = org.Email |
|
|
|
// No password for organization.
|
|
|
|
org.NumTeams = 1 |
|
|
|
org.NumMembers = 1 |
|
|
|
|
|
|
|
sess := x.NewSession() |
|
|
|
defer sess.Close() |
|
|
|
if err = sess.Begin(); err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
if _, err = sess.Insert(org); err != nil { |
|
|
|
sess.Rollback() |
|
|
|
return nil, err |
|
|
|
} else if err = os.MkdirAll(UserPath(user.Name), os.ModePerm); err != nil { |
|
|
|
if _, err := x.Id(user.Id).Delete(&User{}); err != nil { |
|
|
|
return nil, errors.New(fmt.Sprintf( |
|
|
|
"both create userpath %s and delete table record faild: %v", user.Name, err)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Create default owner team.
|
|
|
|
t := &Team{ |
|
|
|
OrgId: org.Id, |
|
|
|
Name: "Owner", |
|
|
|
Authorize: ORG_ADMIN, |
|
|
|
NumMembers: 1, |
|
|
|
} |
|
|
|
if _, err = sess.Insert(t); err != nil { |
|
|
|
sess.Rollback() |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
if user.Id == 1 { |
|
|
|
user.IsAdmin = true |
|
|
|
user.IsActive = true |
|
|
|
_, err = x.Id(user.Id).UseBool().Update(user) |
|
|
|
// Add initial creator to organization and owner team.
|
|
|
|
ou := &OrgUser{ |
|
|
|
Uid: owner.Id, |
|
|
|
OrgId: org.Id, |
|
|
|
IsOwner: true, |
|
|
|
NumTeam: 1, |
|
|
|
} |
|
|
|
return user, err |
|
|
|
if _, err = sess.Insert(ou); err != nil { |
|
|
|
sess.Rollback() |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
tu := &TeamUser{ |
|
|
|
Uid: owner.Id, |
|
|
|
OrgId: org.Id, |
|
|
|
TeamId: t.Id, |
|
|
|
} |
|
|
|
if _, err = sess.Insert(tu); err != nil { |
|
|
|
sess.Rollback() |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return org, sess.Commit() |
|
|
|
} |
|
|
|
|
|
|
|
// GetUsers returns given number of user objects with offset.
|
|
|
|