]> source.dussan.org Git - gitea.git/commitdiff
Finish register user
authorUnknown <joe2010xtmf@163.com>
Thu, 6 Mar 2014 16:10:35 +0000 (11:10 -0500)
committerUnknown <joe2010xtmf@163.com>
Thu, 6 Mar 2014 16:10:35 +0000 (11:10 -0500)
conf/app.ini
gogs.go
models/user.go
modules/auth/form.go
routers/user/user.go
templates/base/error.tmpl
templates/user/signup.tmpl

index 3d4a259327c5d06a7da550389d5f0146e5faf1fb..72c968b3e5b9324e7ac355435773b77a76b28ad7 100644 (file)
@@ -16,3 +16,6 @@ NAME = gogs
 USER = root
 PASSWD = 
 PASSWD_jiahua = root
+
+[security]
+USER_PASSWD_SALT = !#@FDEWREWR&*(
diff --git a/gogs.go b/gogs.go
index 1ce0f7f98ebf19d70062034bffde6e0f33ff5da4..42b1f92bae687935a0cf9625b119a0b7b55213fc 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -19,7 +19,7 @@ import (
 // Test that go1.1 tag above is included in builds. main.go refers to this definition.
 const go11tag = true
 
-const APP_VER = "0.0.0.0305"
+const APP_VER = "0.0.0.0306"
 
 func init() {
        runtime.GOMAXPROCS(runtime.NumCPU())
index d8469251e93a77d2bc5e5b0caf839b7b411a4617..912b04a3e461566c0566872e0e50146ca8cb0cc0 100644 (file)
@@ -17,6 +17,12 @@ import (
        "github.com/gogits/gogs/utils"
 )
 
+var UserPasswdSalt string
+
+func init() {
+       UserPasswdSalt = utils.Cfg.MustValue("security", "USER_PASSWD_SALT")
+}
+
 // User types.
 const (
        UT_INDIVIDUAL = iota + 1
@@ -33,9 +39,9 @@ const (
 type User struct {
        Id            int64
        LowerName     string `xorm:"unique not null"`
-       Name          string `xorm:"unique not null" valid:"AlphaDash;MinSize(5);MaxSize(30)"`
-       Email         string `xorm:"unique not null" valid:"Email"`
-       Passwd        string `xorm:"not null" valid:"MinSize(8)"`
+       Name          string `xorm:"unique not null"`
+       Email         string `xorm:"unique not null"`
+       Passwd        string `xorm:"not null"`
        LoginType     int
        Type          int
        NumFollowers  int
@@ -79,6 +85,7 @@ var (
        ErrUserOwnRepos     = errors.New("User still have ownership of repositories")
        ErrUserAlreadyExist = errors.New("User already exist")
        ErrUserNotExist     = errors.New("User does not exist")
+       ErrEmailAlreadyUsed = errors.New("E-mail already used")
 )
 
 // IsUserExist checks if given user name exist,
@@ -87,6 +94,10 @@ func IsUserExist(name string) (bool, error) {
        return orm.Get(&User{LowerName: strings.ToLower(name)})
 }
 
+func IsEmailUsed(email string) (bool, error) {
+       return orm.Get(&User{Email: email})
+}
+
 // RegisterUser creates record of a new user.
 func RegisterUser(user *User) (err error) {
        isExist, err := IsUserExist(user.Name)
@@ -96,9 +107,18 @@ func RegisterUser(user *User) (err error) {
                return ErrUserAlreadyExist
        }
 
+       isExist, err = IsEmailUsed(user.Email)
+       if err != nil {
+               return err
+       } else if isExist {
+               return ErrEmailAlreadyUsed
+       }
+
        user.LowerName = strings.ToLower(user.Name)
        user.Avatar = utils.EncodeMd5(user.Email)
-       user.EncodePasswd()
+       if err = user.EncodePasswd(); err != nil {
+               return err
+       }
        if _, err = orm.Insert(user); err != nil {
                return err
        }
@@ -136,7 +156,7 @@ func DeleteUser(user *User) error {
 
 // EncodePasswd encodes password to safe format.
 func (user *User) EncodePasswd() error {
-       newPasswd, err := scrypt.Key([]byte(user.Passwd), []byte("!#@FDEWREWR&*("), 16384, 8, 1, 64)
+       newPasswd, err := scrypt.Key([]byte(user.Passwd), []byte(UserPasswdSalt), 16384, 8, 1, 64)
        user.Passwd = fmt.Sprintf("%x", newPasswd)
        return err
 }
index f918543fe65ddd7ce70edb6b9bbbd5685cad0167..23c107c86c229be9490f40048369faa23cc3852a 100644 (file)
@@ -17,10 +17,25 @@ import (
        "github.com/gogits/gogs/utils/log"
 )
 
+type Form interface {
+       Name(field string) string
+}
+
 type RegisterForm struct {
-       Username string `form:"username" binding:"Required;AlphaDash;MinSize(5);MaxSize(30)"`
-       Email    string `form:"email" binding:"Required;Email;MaxSize(50)"`
-       Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"`
+       UserName     string `form:"username" binding:"Required;AlphaDash;MinSize(5);MaxSize(30)"`
+       Email        string `form:"email" binding:"Required;Email;MaxSize(50)"`
+       Password     string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"`
+       RetypePasswd string `form:"retypepasswd"`
+}
+
+func (r *RegisterForm) Name(field string) string {
+       names := map[string]string{
+               "UserName":     "Username",
+               "Email":        "E-mail address",
+               "Password":     "Password",
+               "RetypePasswd": "Re-type password",
+       }
+       return names[field]
 }
 
 func getMinMaxSize(field reflect.StructField) string {
@@ -32,7 +47,7 @@ func getMinMaxSize(field reflect.StructField) string {
        return ""
 }
 
-func validate(errors *binding.Errors, data base.TmplData, form interface{}) {
+func validate(errors *binding.Errors, data base.TmplData, form Form) {
        typ := reflect.TypeOf(form)
        val := reflect.ValueOf(form)
 
@@ -54,15 +69,15 @@ func validate(errors *binding.Errors, data base.TmplData, form interface{}) {
                        data["Err_"+field.Name] = true
                        switch err {
                        case binding.RequireError:
-                               data["ErrorMsg"] = field.Name + " cannot be empty"
+                               data["ErrorMsg"] = form.Name(field.Name) + " cannot be empty"
                        case binding.AlphaDashError:
-                               data["ErrorMsg"] = field.Name + " must be valid alpha or numeric or dash(-_) characters"
+                               data["ErrorMsg"] = form.Name(field.Name) + " must be valid alpha or numeric or dash(-_) characters"
                        case binding.MinSizeError:
-                               data["ErrorMsg"] = field.Name + " must contain at least has " + getMinMaxSize(field) + " characters"
+                               data["ErrorMsg"] = form.Name(field.Name) + " must contain at least " + getMinMaxSize(field) + " characters"
                        case binding.MaxSizeError:
-                               data["ErrorMsg"] = field.Name + " must contain at most has " + getMinMaxSize(field) + " characters"
+                               data["ErrorMsg"] = form.Name(field.Name) + " must contain at most " + getMinMaxSize(field) + " characters"
                        case binding.EmailError:
-                               data["ErrorMsg"] = field.Name + " is not valid"
+                               data["ErrorMsg"] = form.Name(field.Name) + " is not valid"
                        default:
                                data["ErrorMsg"] = "Unknown error: " + err
                        }
index 9e4e30bbb674d2b82765a5e937b19dc2101250b1..c6a2752ca0d516a9b61001113609fb3fac1e8731 100644 (file)
@@ -118,30 +118,43 @@ func SignUp(form auth.RegisterForm, data base.TmplData, req *http.Request, r ren
                return
        }
 
+       if form.Password != form.RetypePasswd {
+               data["HasError"] = true
+               data["Err_Password"] = true
+               data["Err_RetypePasswd"] = true
+               data["ErrorMsg"] = "Password and re-type password are not same"
+               auth.AssignForm(form, data)
+       }
+
        if hasErr, ok := data["HasError"]; ok && hasErr.(bool) {
                r.HTML(200, "user/signup", data)
                return
        }
 
-       //Front-end should do double check of password.
        u := &models.User{
-               Name:   form.Username,
+               Name:   form.UserName,
                Email:  form.Email,
                Passwd: form.Password,
        }
 
        if err := models.RegisterUser(u); err != nil {
-               if err.Error() == models.ErrUserAlreadyExist.Error() {
-                       data["HasError"] = true
+               data["HasError"] = true
+               auth.AssignForm(form, data)
+
+               switch err.Error() {
+               case models.ErrUserAlreadyExist.Error():
                        data["Err_Username"] = true
                        data["ErrorMsg"] = "Username has been already taken"
-                       auth.AssignForm(form, data)
                        r.HTML(200, "user/signup", data)
-                       return
+               case models.ErrEmailAlreadyUsed.Error():
+                       data["Err_Email"] = true
+                       data["ErrorMsg"] = "E-mail address has been already used"
+                       r.HTML(200, "user/signup", data)
+               default:
+                       data["ErrorMsg"] = err
+                       log.Error("user.SignUp: %v", data)
+                       r.HTML(500, "base/error", nil)
                }
-
-               log.Error("user.SignUp: %v", err)
-               r.HTML(500, "status/500", nil)
                return
        }
 
index 8d3c36be9a7b2b34381157bb9050e5b4ef74c353..fbd424bff18121826b0f91c9da42d17d530a269d 100644 (file)
@@ -1,6 +1,6 @@
 {{template "base/head" .}}
 {{template "base/navbar" .}}
 <div id="gogs-body" class="container">
-       An error is occupied : {{.Error}}
+       An error is occurred : {{.ErrorMsg}}
 </div>
 {{template "base/footer" .}}
\ No newline at end of file
index 265365bfb7f05487726fa6dca70fe2bbe8f7b3aa..76064bf7600f0ed2f4b0249db8cc088327de2819 100644 (file)
@@ -6,7 +6,7 @@
        {{if .HasError}}
        <div class="alert alert-danger">{{.ErrorMsg}}</div>
        {{end}}
-               <div class="form-group {{if .Err_Username}}has-error has-feedback{{end}}">
+               <div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}">
                        <label class="col-md-4 control-label">Username: </label>
                        <div class="col-md-6">
                                <input name="username" class="form-control" placeholder="Type your username" value="{{.username}}">
@@ -25,7 +25,7 @@
                                <input name="passwd" type="password" class="form-control" placeholder="Type your password">
                        </div>
                </div>
-               <div class="form-group">
+               <div class="form-group {{if .Err_RetypePasswd}}has-error has-feedback{{end}}">
                        <label class="col-md-4 control-label">Re-type: </label>
                        <div class="col-md-6">
                                <input type="password" class="form-control" placeholder="Re-type your password">