|
@@ -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.
|