Skip to content

Commit 2495059

Browse files
committed
Fix binding
1 parent 178989d commit 2495059

File tree

4 files changed

+32
-51
lines changed

4 files changed

+32
-51
lines changed

modules/forms/forms.go

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"reflect"
99
"strings"
1010

11+
"code.gitea.io/gitea/modules/auth"
1112
"code.gitea.io/gitea/modules/translation"
1213
"code.gitea.io/gitea/modules/validation"
1314

@@ -20,29 +21,8 @@ type Form interface {
2021
binding.Validator
2122
}
2223

23-
// AssignForm assign form values back to the template data.
24-
func AssignForm(form interface{}, data map[string]interface{}) {
25-
typ := reflect.TypeOf(form)
26-
val := reflect.ValueOf(form)
27-
28-
if typ.Kind() == reflect.Ptr {
29-
typ = typ.Elem()
30-
val = val.Elem()
31-
}
32-
33-
for i := 0; i < typ.NumField(); i++ {
34-
field := typ.Field(i)
35-
36-
fieldName := field.Tag.Get("form")
37-
// Allow ignored fields in the struct
38-
if fieldName == "-" {
39-
continue
40-
} else if len(fieldName) == 0 {
41-
fieldName = com.ToSnakeCase(field.Name)
42-
}
43-
44-
data[fieldName] = val.Field(i).Interface()
45-
}
24+
func init() {
25+
binding.SetNameMapper(com.ToSnakeCase)
4626
}
4727

4828
func getRuleBody(field reflect.StructField, prefix string) string {
@@ -84,7 +64,7 @@ func validate(errs binding.Errors, data map[string]interface{}, f Form, l transl
8464
// somehow, some code later on will panic on Data["ErrorMsg"].(string).
8565
// So initialize it to some default.
8666
data["ErrorMsg"] = l.Tr("form.unknown_error")
87-
AssignForm(f, data)
67+
auth.AssignForm(f, data)
8868

8969
typ := reflect.TypeOf(f)
9070
val := reflect.ValueOf(f)

modules/forms/install.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import (
1313
"gitea.com/go-chi/binding"
1414
)
1515

16+
var (
17+
_ binding.Validator = &InstallForm{}
18+
)
19+
1620
// InstallForm form for installation page
1721
type InstallForm struct {
1822
DbType string `binding:"Required"`

routers/routes/chi.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ import (
1212
"net/http"
1313
"os"
1414
"path"
15+
"reflect"
1516
"strings"
1617
"text/template"
1718
"time"
1819

19-
"code.gitea.io/gitea/modules/auth"
2020
gitea_context "code.gitea.io/gitea/modules/context"
2121
"code.gitea.io/gitea/modules/httpcache"
2222
"code.gitea.io/gitea/modules/log"
@@ -188,16 +188,12 @@ func Wrap(f func(ctx *gitea_context.DefaultContext)) http.HandlerFunc {
188188
}
189189

190190
// Bind binding an obj to a handler
191-
func Bind(obj interface{}, handler func(ctx *gitea_context.DefaultContext)) http.HandlerFunc {
191+
func Bind(obj interface{}, handler func(ctx *gitea_context.DefaultContext, form interface{})) http.HandlerFunc {
192+
var tp = reflect.TypeOf(obj).Elem()
192193
return Wrap(func(ctx *gitea_context.DefaultContext) {
193-
errs := binding.Bind(ctx.Req, obj)
194-
if errs.Len() > 0 {
195-
ctx.Data["HasError"] = true
196-
ctx.Flash(gitea_context.ErrorFlash, errs[0].Error())
197-
}
198-
auth.AssignForm(obj, ctx.Data)
199-
ctx.Data["form"] = obj
200-
handler(ctx)
194+
var theObj = reflect.New(tp).Interface() // create a new form obj for every request but not use obj directly
195+
binding.Bind(ctx.Req, theObj)
196+
handler(ctx, theObj)
201197
})
202198
}
203199

routers/routes/install.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"time"
1616

1717
"code.gitea.io/gitea/models"
18+
"code.gitea.io/gitea/modules/auth"
1819
"code.gitea.io/gitea/modules/context"
1920
"code.gitea.io/gitea/modules/forms"
2021
"code.gitea.io/gitea/modules/generate"
@@ -163,13 +164,13 @@ func Install(ctx *context.DefaultContext) {
163164
form.DefaultEnableTimetracking = setting.Service.DefaultEnableTimetracking
164165
form.NoReplyAddress = setting.Service.NoReplyAddress
165166

166-
forms.AssignForm(form, ctx.Data)
167+
auth.AssignForm(form, ctx.Data)
167168
_ = ctx.HTML(200, tplInstall)
168169
}
169170

170171
// InstallPost response for submit install items
171-
func InstallPost(ctx *context.DefaultContext) {
172-
form := ctx.Data["form"].(*forms.InstallForm)
172+
func InstallPost(ctx *context.DefaultContext, iForm interface{}) {
173+
form := iForm.(*forms.InstallForm)
173174

174175
ctx.Data["CurDbOption"] = form.DbType
175176
if ctx.HasError() {
@@ -188,7 +189,7 @@ func InstallPost(ctx *context.DefaultContext) {
188189

189190
var err error
190191
if _, err = exec.LookPath("git"); err != nil {
191-
ctx.RenderWithErr(ctx.Tr("install.test_git_failed", err), tplInstall, &form)
192+
ctx.RenderWithErr(ctx.Tr("install.test_git_failed", err), tplInstall, form)
192193
return
193194
}
194195

@@ -207,7 +208,7 @@ func InstallPost(ctx *context.DefaultContext) {
207208
if (setting.Database.Type == "sqlite3") &&
208209
len(setting.Database.Path) == 0 {
209210
ctx.Data["Err_DbPath"] = true
210-
ctx.RenderWithErr(ctx.Tr("install.err_empty_db_path"), tplInstall, &form)
211+
ctx.RenderWithErr(ctx.Tr("install.err_empty_db_path"), tplInstall, form)
211212
return
212213
}
213214

@@ -218,7 +219,7 @@ func InstallPost(ctx *context.DefaultContext) {
218219
ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "https://docs.gitea.io/en-us/install-from-binary/"), tplInstall, &form)
219220
} else {
220221
ctx.Data["Err_DbSetting"] = true
221-
ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), tplInstall, &form)
222+
ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), tplInstall, form)
222223
}
223224
return
224225
}
@@ -227,7 +228,7 @@ func InstallPost(ctx *context.DefaultContext) {
227228
form.RepoRootPath = strings.ReplaceAll(form.RepoRootPath, "\\", "/")
228229
if err = os.MkdirAll(form.RepoRootPath, os.ModePerm); err != nil {
229230
ctx.Data["Err_RepoRootPath"] = true
230-
ctx.RenderWithErr(ctx.Tr("install.invalid_repo_path", err), tplInstall, &form)
231+
ctx.RenderWithErr(ctx.Tr("install.invalid_repo_path", err), tplInstall, form)
231232
return
232233
}
233234

@@ -236,7 +237,7 @@ func InstallPost(ctx *context.DefaultContext) {
236237
form.LFSRootPath = strings.ReplaceAll(form.LFSRootPath, "\\", "/")
237238
if err := os.MkdirAll(form.LFSRootPath, os.ModePerm); err != nil {
238239
ctx.Data["Err_LFSRootPath"] = true
239-
ctx.RenderWithErr(ctx.Tr("install.invalid_lfs_path", err), tplInstall, &form)
240+
ctx.RenderWithErr(ctx.Tr("install.invalid_lfs_path", err), tplInstall, form)
240241
return
241242
}
242243
}
@@ -245,14 +246,14 @@ func InstallPost(ctx *context.DefaultContext) {
245246
form.LogRootPath = strings.ReplaceAll(form.LogRootPath, "\\", "/")
246247
if err = os.MkdirAll(form.LogRootPath, os.ModePerm); err != nil {
247248
ctx.Data["Err_LogRootPath"] = true
248-
ctx.RenderWithErr(ctx.Tr("install.invalid_log_root_path", err), tplInstall, &form)
249+
ctx.RenderWithErr(ctx.Tr("install.invalid_log_root_path", err), tplInstall, form)
249250
return
250251
}
251252

252253
currentUser, match := setting.IsRunUserMatchCurrentUser(form.RunUser)
253254
if !match {
254255
ctx.Data["Err_RunUser"] = true
255-
ctx.RenderWithErr(ctx.Tr("install.run_user_not_match", form.RunUser, currentUser), tplInstall, &form)
256+
ctx.RenderWithErr(ctx.Tr("install.run_user_not_match", form.RunUser, currentUser), tplInstall, form)
256257
return
257258
}
258259

@@ -397,19 +398,19 @@ func InstallPost(ctx *context.DefaultContext) {
397398
cfg.Section("security").Key("INSTALL_LOCK").SetValue("true")
398399
var secretKey string
399400
if secretKey, err = generate.NewSecretKey(); err != nil {
400-
ctx.RenderWithErr(ctx.Tr("install.secret_key_failed", err), tplInstall, &form)
401+
ctx.RenderWithErr(ctx.Tr("install.secret_key_failed", err), tplInstall, form)
401402
return
402403
}
403404
cfg.Section("security").Key("SECRET_KEY").SetValue(secretKey)
404405

405406
err = os.MkdirAll(filepath.Dir(setting.CustomConf), os.ModePerm)
406407
if err != nil {
407-
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, &form)
408+
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, form)
408409
return
409410
}
410411

411412
if err = cfg.SaveTo(setting.CustomConf); err != nil {
412-
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, &form)
413+
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, form)
413414
return
414415
}
415416

@@ -430,7 +431,7 @@ func InstallPost(ctx *context.DefaultContext) {
430431
setting.InstallLock = false
431432
ctx.Data["Err_AdminName"] = true
432433
ctx.Data["Err_AdminEmail"] = true
433-
ctx.RenderWithErr(ctx.Tr("install.invalid_admin_setting", err), tplInstall, &form)
434+
ctx.RenderWithErr(ctx.Tr("install.invalid_admin_setting", err), tplInstall, form)
434435
return
435436
}
436437
log.Info("Admin account already exist")
@@ -444,16 +445,16 @@ func InstallPost(ctx *context.DefaultContext) {
444445

445446
// Auto-login for admin
446447
if err = ctx.SetSession("uid", u.ID); err != nil {
447-
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, &form)
448+
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, form)
448449
return
449450
}
450451
if err = ctx.SetSession("uname", u.Name); err != nil {
451-
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, &form)
452+
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, form)
452453
return
453454
}
454455

455456
if err = ctx.DestroySession(); err != nil {
456-
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, &form)
457+
ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, form)
457458
return
458459
}
459460
}

0 commit comments

Comments
 (0)