From 8c05252378946d51f66ed0e6f848f6e4ad422bc9 Mon Sep 17 00:00:00 2001 From: June Date: Mon, 15 Mar 2021 10:17:32 +0800 Subject: [PATCH 01/10] Fix issue #4528 --- adapter/beego.go | 3 ++- adapter/namespace.go | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/adapter/beego.go b/adapter/beego.go index 331aa786..48eed9bc 100644 --- a/adapter/beego.go +++ b/adapter/beego.go @@ -44,7 +44,8 @@ var ( // The hookfuncs will run in beego.Run() // such as initiating session , starting middleware , building template, starting admin control and so on. func AddAPPStartHook(hf ...hookfunc) { - for _, f := range hf { + for i := 0; i < len(hf); i++ { + f := hf[i] web.AddAPPStartHook(func() error { return f() }) diff --git a/adapter/namespace.go b/adapter/namespace.go index 709f6aa5..943aace2 100644 --- a/adapter/namespace.go +++ b/adapter/namespace.go @@ -39,7 +39,8 @@ func NewNamespace(prefix string, params ...LinkNamespace) *Namespace { func oldToNewLinkNs(params []LinkNamespace) []web.LinkNamespace { nps := make([]web.LinkNamespace, 0, len(params)) - for _, p := range params { + for i := 0; i < len(params); i++ { + p := params[i] nps = append(nps, func(namespace *web.Namespace) { p((*Namespace)(namespace)) }) @@ -82,7 +83,8 @@ func (n *Namespace) Filter(action string, filter ...FilterFunc) *Namespace { func oldToNewFilter(filter []FilterFunc) []web.FilterFunc { nfs := make([]web.FilterFunc, 0, len(filter)) - for _, f := range filter { + for i := 0; i < len(filter); i++ { + f := filter[i] nfs = append(nfs, func(ctx *context.Context) { f((*adtContext.Context)(ctx)) }) From e9df04014231b763495ecbb7a63d78bc70b16a74 Mon Sep 17 00:00:00 2001 From: Ming Deng Date: Tue, 27 Apr 2021 23:48:11 +0800 Subject: [PATCH 02/10] Fix 4590: Forget to check URL when FilterChain invoke next() --- server/web/filter_chain_test.go | 25 ++++++++++++++++++++++++- server/web/router.go | 6 +++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/server/web/filter_chain_test.go b/server/web/filter_chain_test.go index 2a428b78..29a6d82a 100644 --- a/server/web/filter_chain_test.go +++ b/server/web/filter_chain_test.go @@ -15,16 +15,18 @@ package web import ( + "github.com/beego/beego/v2/core/logs" "net/http" "net/http/httptest" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/beego/beego/v2/server/web/context" ) -func TestControllerRegister_InsertFilterChain(t *testing.T) { +func TestControllerRegisterInsertFilterChain(t *testing.T) { InsertFilterChain("/*", func(next FilterFunc) FilterFunc { return func(ctx *context.Context) { @@ -46,3 +48,24 @@ func TestControllerRegister_InsertFilterChain(t *testing.T) { assert.Equal(t, "filter-chain", w.Header().Get("filter")) } + +func TestFilterChainRouter(t *testing.T) { + InsertFilterChain("/app/hello1/*", func(next FilterFunc) FilterFunc { + return func(ctx *context.Context) { + logs.Info("aaa") + next(ctx) + } + }) + + InsertFilterChain("/app/*", func(next FilterFunc) FilterFunc { + return func(ctx *context.Context) { + start := time.Now() + ctx.Input.SetData("start", start) + logs.Info("start_time", start) + next(ctx) + logs.Info("run_time", time.Since(start).String()) + } + }) + + Run() +} diff --git a/server/web/router.go b/server/web/router.go index 7e78c76c..93c77e7d 100644 --- a/server/web/router.go +++ b/server/web/router.go @@ -486,7 +486,11 @@ func (p *ControllerRegister) InsertFilter(pattern string, pos int, filter Filter // } func (p *ControllerRegister) InsertFilterChain(pattern string, chain FilterChain, opts ...FilterOpt) { root := p.chainRoot - filterFunc := chain(root.filterFunc) + //filterFunc := chain(root.filterFunc) + filterFunc := chain(func(ctx *beecontext.Context) { + var preFilterParams map[string]string + root.filter(ctx, p.getUrlPath(ctx), preFilterParams) + }) opts = append(opts, WithCaseSensitive(p.cfg.RouterCaseSensitive)) p.chainRoot = newFilterRouter(pattern, filterFunc, opts...) p.chainRoot.next = root From 7b2ef8c7acd8a5bdea2f78208c323cda9cc9ecbb Mon Sep 17 00:00:00 2001 From: Ming Deng Date: Tue, 27 Apr 2021 23:53:08 +0800 Subject: [PATCH 03/10] Add change log --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc786fb1..ea3a4bc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - Fix 4480: log format incorrect. [4482](https://github.com/beego/beego/pull/4482) - Remove `duration` from prometheus labels. [4391](https://github.com/beego/beego/pull/4391) - Fix `unknown escape sequence` in generated code. [4385](https://github.com/beego/beego/pull/4385) +- Fix 4590: Forget to check URL when FilterChain invoke `next()`. [4593](https://github.com/beego/beego/pull/4593) - Using fixed name `commentRouter.go` as generated file name. [4385](https://github.com/beego/beego/pull/4385) - Fix 4383: ORM Adapter produces panic when using orm.RegisterModelWithPrefix. [4386](https://github.com/beego/beego/pull/4386) - Fix 4444: panic when 404 not found. [4446](https://github.com/beego/beego/pull/4446) From 822e0df7875f88d5f19ab147525be7255bceb7bc Mon Sep 17 00:00:00 2001 From: Ming Deng Date: Tue, 27 Apr 2021 23:58:30 +0800 Subject: [PATCH 04/10] Add more tests --- server/web/filter_chain_test.go | 55 ++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/server/web/filter_chain_test.go b/server/web/filter_chain_test.go index 29a6d82a..ee19b1e9 100644 --- a/server/web/filter_chain_test.go +++ b/server/web/filter_chain_test.go @@ -15,13 +15,10 @@ package web import ( - "github.com/beego/beego/v2/core/logs" + "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" "testing" - "time" - - "github.com/stretchr/testify/assert" "github.com/beego/beego/v2/server/web/context" ) @@ -50,22 +47,56 @@ func TestControllerRegisterInsertFilterChain(t *testing.T) { } func TestFilterChainRouter(t *testing.T) { - InsertFilterChain("/app/hello1/*", func(next FilterFunc) FilterFunc { + + + app := NewHttpSever() + + const filterNonMatch = "filter-chain-non-match" + app.InsertFilterChain("/app/nonMatch/before/*", func(next FilterFunc) FilterFunc { return func(ctx *context.Context) { - logs.Info("aaa") + ctx.Output.Header("filter", filterNonMatch) next(ctx) } }) - InsertFilterChain("/app/*", func(next FilterFunc) FilterFunc { + const filterAll = "filter-chain-all" + app.InsertFilterChain("/*", func(next FilterFunc) FilterFunc { return func(ctx *context.Context) { - start := time.Now() - ctx.Input.SetData("start", start) - logs.Info("start_time", start) + ctx.Output.Header("filter", filterAll) next(ctx) - logs.Info("run_time", time.Since(start).String()) } }) - Run() + app.InsertFilterChain("/app/nonMatch/after/*", func(next FilterFunc) FilterFunc { + return func(ctx *context.Context) { + ctx.Output.Header("filter", filterNonMatch) + next(ctx) + } + }) + + app.InsertFilterChain("/app/match/*", func(next FilterFunc) FilterFunc { + return func(ctx *context.Context) { + ctx.Output.Header("match", "yes") + next(ctx) + } + }) + + r, _ := http.NewRequest("GET", "/app/match", nil) + w := httptest.NewRecorder() + + app.Handlers.ServeHTTP(w, r) + assert.Equal(t, filterAll, w.Header().Get("filter")) + assert.Equal(t, "yes", w.Header().Get("match")) + + r, _ = http.NewRequest("GET", "/app/match1", nil) + w = httptest.NewRecorder() + app.Handlers.ServeHTTP(w, r) + assert.Equal(t, filterAll, w.Header().Get("filter")) + assert.NotEqual(t, "yes", w.Header().Get("match")) + + r, _ = http.NewRequest("GET", "/app/nonMatch", nil) + w = httptest.NewRecorder() + app.Handlers.ServeHTTP(w, r) + assert.Equal(t, filterAll, w.Header().Get("filter")) + assert.NotEqual(t, "yes", w.Header().Get("match")) } From bb3d162c2cb4d986d28e2c31d2edb8e0f1ecf80e Mon Sep 17 00:00:00 2001 From: Ming Deng Date: Sat, 8 May 2021 19:44:07 +0800 Subject: [PATCH 05/10] Add english tag --- .github/ISSUE_TEMPLATE | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE index 8e474075..7a8d1691 100644 --- a/.github/ISSUE_TEMPLATE +++ b/.github/ISSUE_TEMPLATE @@ -1,3 +1,5 @@ +**English Only**. Please use English because other could join the discussion if they got similar issue! + Please answer these questions before submitting your issue. Thanks! 1. What version of Go and beego are you using (`bee version`)? From 08cde0b55d89f6ad43d87da0a64590719dd61119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B3=AB?= Date: Sat, 22 May 2021 11:15:03 +0800 Subject: [PATCH 06/10] [fix bug]console more empty line --- core/logs/console.go | 2 +- core/logs/console_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/logs/console.go b/core/logs/console.go index 66e2c7ea..05b13cd7 100644 --- a/core/logs/console.go +++ b/core/logs/console.go @@ -62,7 +62,7 @@ func (c *consoleWriter) Format(lm *LogMsg) string { msg = strings.Replace(msg, levelPrefix[lm.Level], colors[lm.Level](levelPrefix[lm.Level]), 1) } h, _, _ := formatTimeHeader(lm.When) - bytes := append(append(h, msg...), '\n') + bytes := append(h, msg...) return string(bytes) } diff --git a/core/logs/console_test.go b/core/logs/console_test.go index 02bff3ec..3ba932ab 100644 --- a/core/logs/console_test.go +++ b/core/logs/console_test.go @@ -76,7 +76,7 @@ func TestFormat(t *testing.T) { Prefix: "Cus", } res := log.Format(lm) - assert.Equal(t, "2020/09/19 20:12:37.000 \x1b[1;44m[D]\x1b[0m Cus Hello, world\n", res) + assert.Equal(t, "2020/09/19 20:12:37.000 \x1b[1;44m[D]\x1b[0m Cus Hello, world", res) err := log.WriteMsg(lm) assert.Nil(t, err) } From e5dbdd77af44e73622039dfa7a5a9a297248d2c7 Mon Sep 17 00:00:00 2001 From: zhengmingfu Date: Mon, 31 May 2021 14:06:04 +0800 Subject: [PATCH 07/10] fix: cannot set SessionIDPrefix through config --- server/web/config.go | 1 + server/web/hooks.go | 1 + 2 files changed, 2 insertions(+) diff --git a/server/web/config.go b/server/web/config.go index d89c59cb..c8b5bc51 100644 --- a/server/web/config.go +++ b/server/web/config.go @@ -116,6 +116,7 @@ type SessionConfig struct { SessionEnableSidInHTTPHeader bool // enable store/get the sessionId into/from http headers SessionNameInHTTPHeader string SessionEnableSidInURLQuery bool // enable get the sessionId from Url Query params + SessionIDPrefix string } // LogConfig holds Log related config diff --git a/server/web/hooks.go b/server/web/hooks.go index 438496a0..d44f477f 100644 --- a/server/web/hooks.go +++ b/server/web/hooks.go @@ -63,6 +63,7 @@ func registerSession() error { conf.EnableSidInHTTPHeader = BConfig.WebConfig.Session.SessionEnableSidInHTTPHeader conf.SessionNameInHTTPHeader = BConfig.WebConfig.Session.SessionNameInHTTPHeader conf.EnableSidInURLQuery = BConfig.WebConfig.Session.SessionEnableSidInURLQuery + conf.SessionIDPrefix = BConfig.WebConfig.Session.SessionIDPrefix } else { if err = json.Unmarshal([]byte(sessionConfig), conf); err != nil { return err From 167749d46477edfb5787a477c10488262ffbb18f Mon Sep 17 00:00:00 2001 From: Anker Jam Date: Fri, 6 Aug 2021 00:23:06 +0800 Subject: [PATCH 08/10] hotfix:reflect.ValueOf(nil) in getFlatParams --- client/orm/db_utils.go | 3 +- client/orm/models_test.go | 5 +++ client/orm/orm_test.go | 76 +++++++++++++++++++++++---------------- 3 files changed, 51 insertions(+), 33 deletions(-) diff --git a/client/orm/db_utils.go b/client/orm/db_utils.go index 7ae10ca5..8d86b54a 100644 --- a/client/orm/db_utils.go +++ b/client/orm/db_utils.go @@ -58,13 +58,12 @@ func getFlatParams(fi *fieldInfo, args []interface{}, tz *time.Location) (params outFor: for _, arg := range args { - val := reflect.ValueOf(arg) - if arg == nil { params = append(params, arg) continue } + val := reflect.ValueOf(arg) kind := val.Kind() if kind == reflect.Ptr { val = val.Elem() diff --git a/client/orm/models_test.go b/client/orm/models_test.go index e3f74c0b..9b71d968 100644 --- a/client/orm/models_test.go +++ b/client/orm/models_test.go @@ -332,6 +332,11 @@ func NewPost() *Post { return obj } +type NullValue struct { + ID int `orm:"column(id)"` + Value string `orm:"size(30);null"` +} + type Tag struct { ID int `orm:"column(id)"` Name string `orm:"size(30)"` diff --git a/client/orm/orm_test.go b/client/orm/orm_test.go index 08997177..eb0d644f 100644 --- a/client/orm/orm_test.go +++ b/client/orm/orm_test.go @@ -191,6 +191,7 @@ func TestSyncDb(t *testing.T) { RegisterModel(new(Profile)) RegisterModel(new(Post)) RegisterModel(new(Tag)) + RegisterModel(new(NullValue)) RegisterModel(new(Comment)) RegisterModel(new(UserBig)) RegisterModel(new(PostTags)) @@ -217,6 +218,7 @@ func TestRegisterModels(t *testing.T) { RegisterModel(new(User)) RegisterModel(new(Profile)) RegisterModel(new(Post)) + RegisterModel(new(NullValue)) RegisterModel(new(Tag)) RegisterModel(new(Comment)) RegisterModel(new(UserBig)) @@ -1962,69 +1964,81 @@ func TestRawValues(t *testing.T) { } } +func TestForIssue4709(t *testing.T) { + pre, err := dORM.Raw("INSERT into null_value (value) VALUES (?)").Prepare() + assert.Nil(t, err) + _, err = pre.Exec(nil) + assert.Nil(t, err) +} + func TestRawPrepare(t *testing.T) { + var ( + result sql.Result + err error + pre RawPreparer + ) switch { case IsMysql || IsSqlite: - pre, err := dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare() - throwFail(t, err) + pre, err = dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare() + assert.Nil(t, err) if pre != nil { - r, err := pre.Exec("name1") - throwFail(t, err) + result, err = pre.Exec("name1") + assert.Nil(t, err) - tid, err := r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(tid > 0, true)) + tid, err := result.LastInsertId() + assert.Nil(t, err) + assert.True(t, tid > 0) - r, err = pre.Exec("name2") - throwFail(t, err) + result, err = pre.Exec("name2") + assert.Nil(t, err) - id, err := r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(id, tid+1)) + id, err := result.LastInsertId() + assert.Nil(t, err) + assert.Equal(t, id, tid+1) - r, err = pre.Exec("name3") - throwFail(t, err) + result, err = pre.Exec("name3") + assert.Nil(t, err) - id, err = r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(id, tid+2)) + id, err = result.LastInsertId() + assert.Nil(t, err) + assert.Equal(t, id, tid+2) err = pre.Close() - throwFail(t, err) + assert.Nil(t, err) res, err := dORM.Raw("DELETE FROM tag WHERE name IN (?, ?, ?)", []string{"name1", "name2", "name3"}).Exec() - throwFail(t, err) + assert.Nil(t, err) num, err := res.RowsAffected() - throwFail(t, err) - throwFail(t, AssertIs(num, 3)) + assert.Nil(t, err) + assert.Equal(t, num, int64(3)) } case IsPostgres: - pre, err := dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare() - throwFail(t, err) + pre, err = dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare() + assert.Nil(t, err) if pre != nil { - _, err := pre.Exec("name1") - throwFail(t, err) + _, err = pre.Exec("name1") + assert.Nil(t, err) _, err = pre.Exec("name2") - throwFail(t, err) + assert.Nil(t, err) _, err = pre.Exec("name3") - throwFail(t, err) + assert.Nil(t, err) err = pre.Close() - throwFail(t, err) + assert.Nil(t, err) res, err := dORM.Raw(`DELETE FROM "tag" WHERE "name" IN (?, ?, ?)`, []string{"name1", "name2", "name3"}).Exec() - throwFail(t, err) + assert.Nil(t, err) if err == nil { num, err := res.RowsAffected() - throwFail(t, err) - throwFail(t, AssertIs(num, 3)) + assert.Nil(t, err) + assert.Equal(t, num, int64(3)) } } } From 72f24210e8134580536a838c76cf9df4bd9b2d45 Mon Sep 17 00:00:00 2001 From: Anker Jam Date: Fri, 6 Aug 2021 00:25:27 +0800 Subject: [PATCH 09/10] changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea3a4bc7..fef1fb7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,4 +7,5 @@ - Using fixed name `commentRouter.go` as generated file name. [4385](https://github.com/beego/beego/pull/4385) - Fix 4383: ORM Adapter produces panic when using orm.RegisterModelWithPrefix. [4386](https://github.com/beego/beego/pull/4386) - Fix 4444: panic when 404 not found. [4446](https://github.com/beego/beego/pull/4446) -- Fix 4435: fix panic when controller dir not found. [4452](https://github.com/beego/beego/pull/4452) \ No newline at end of file +- Fix 4435: fix panic when controller dir not found. [4452](https://github.com/beego/beego/pull/4452) +- Hotfix:reflect.ValueOf(nil) in getFlatParams [4716](https://github.com/beego/beego/issues/4716) \ No newline at end of file From e37e84b3d71cc1c281613cf0ea0f2b40d712f611 Mon Sep 17 00:00:00 2001 From: Ming Deng Date: Tue, 17 Aug 2021 00:31:41 +0800 Subject: [PATCH 10/10] Fix 4727: CSS when the request URI is invalid --- CHANGELOG.md | 1 + server/web/admin.go | 7 ++----- server/web/statistics.go | 3 ++- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fef1fb7c..989bcede 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Remove `duration` from prometheus labels. [4391](https://github.com/beego/beego/pull/4391) - Fix `unknown escape sequence` in generated code. [4385](https://github.com/beego/beego/pull/4385) - Fix 4590: Forget to check URL when FilterChain invoke `next()`. [4593](https://github.com/beego/beego/pull/4593) +- Fix 4727: CSS when request URI is invalid. [4729](https://github.com/beego/beego/pull/4729) - Using fixed name `commentRouter.go` as generated file name. [4385](https://github.com/beego/beego/pull/4385) - Fix 4383: ORM Adapter produces panic when using orm.RegisterModelWithPrefix. [4386](https://github.com/beego/beego/pull/4386) - Fix 4444: panic when 404 not found. [4446](https://github.com/beego/beego/pull/4446) diff --git a/server/web/admin.go b/server/web/admin.go index 3f665b09..1d4e5d49 100644 --- a/server/web/admin.go +++ b/server/web/admin.go @@ -82,13 +82,10 @@ type adminApp struct { *HttpServer } -// Route adds http.HandlerFunc to adminApp with url pattern. +// Run start Beego admin func (admin *adminApp) Run() { - // if len(task.AdminTaskList) > 0 { - // task.StartTask() - // } - logs.Warning("now we don't start tasks here, if you use task module," + + logs.Debug("now we don't start tasks here, if you use task module," + " please invoke task.StartTask, or task will not be executed") addr := BConfig.Listen.AdminAddr diff --git a/server/web/statistics.go b/server/web/statistics.go index 3677271b..42bf9287 100644 --- a/server/web/statistics.go +++ b/server/web/statistics.go @@ -16,6 +16,7 @@ package web import ( "fmt" + "html/template" "sync" "time" @@ -98,7 +99,7 @@ func (m *URLMap) GetMap() map[string]interface{} { for k, v := range m.urlmap { for kk, vv := range v { result := []string{ - fmt.Sprintf("% -50s", k), + fmt.Sprintf("% -50s", template.HTMLEscapeString(k)), fmt.Sprintf("% -10s", kk), fmt.Sprintf("% -16d", vv.RequestNum), fmt.Sprintf("%d", vv.TotalTime),