From 4aafeace230a35e80fb443739c2642d23fc93e51 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Thu, 12 Mar 2015 01:15:01 -0400 Subject: [PATCH] fix HTTP/HTTPS push update func call panic #1037 and `http: multiple response.WriteHeader calls` --- gogs.go | 2 +- models/login.go | 6 ++---- models/publickey.go | 7 ++++--- routers/repo/http.go | 45 +++++++++++++++++++++++--------------------- templates/.VERSION | 2 +- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/gogs.go b/gogs.go index 2d34178d50..fd303fa28f 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.5.16.0311 Beta" +const APP_VER = "0.5.16.0312 Beta" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/login.go b/models/login.go index e00d59b0ed..5e5fbf43fa 100644 --- a/models/login.go +++ b/models/login.go @@ -215,11 +215,9 @@ func UserSignIn(uname, passwd string) (*User, error) { switch u.LoginType { case LDAP: - return LoginUserLdapSource(u, u.LoginName, passwd, - source.Id, source.Cfg.(*LDAPConfig), false) + return LoginUserLdapSource(u, u.LoginName, passwd, source.Id, source.Cfg.(*LDAPConfig), false) case SMTP: - return LoginUserSMTPSource(u, u.LoginName, passwd, - source.Id, source.Cfg.(*SMTPConfig), false) + return LoginUserSMTPSource(u, u.LoginName, passwd, source.Id, source.Cfg.(*SMTPConfig), false) } return nil, ErrUnsupportedLoginType } diff --git a/models/publickey.go b/models/publickey.go index 6bec1139b8..c8098748b2 100644 --- a/models/publickey.go +++ b/models/publickey.go @@ -254,15 +254,16 @@ func saveAuthorizedKeyFile(keys ...*PublicKey) error { } defer f.Close() - finfo, err := f.Stat() + fi, err := f.Stat() if err != nil { return err } // FIXME: following command does not support in Windows. if !setting.IsWindows { - if finfo.Mode().Perm() > 0600 { - log.Error(4, "authorized_keys file has unusual permission flags: %s - setting to -rw-------", finfo.Mode().Perm().String()) + // .ssh directory should have mode 700, and authorized_keys file should have mode 600. + if fi.Mode().Perm() > 0600 { + log.Error(4, "authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String()) if err = f.Chmod(0600); err != nil { return err } diff --git a/routers/repo/http.go b/routers/repo/http.go index 3cfc065999..f5dc00b8df 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -105,7 +105,7 @@ func Http(ctx *middleware.Context) { return } - authUser, err := models.UserSignIn(authUsername, authPasswd) + authUser, err = models.UserSignIn(authUsername, authPasswd) if err != nil { if err != models.ErrUserNotExist { ctx.Handle(500, "UserSignIn error: %v", err) @@ -160,7 +160,7 @@ func Http(ctx *middleware.Context) { } } - var f = func(rpc string, input []byte) { + callback := func(rpc string, input []byte) { if rpc == "receive-pack" { var lastLine int64 = 0 @@ -189,6 +189,7 @@ func Http(ctx *middleware.Context) { newCommitId := fields[1] refName := fields[2] + // FIXME: handle error. models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id) } lastLine = lastLine + size @@ -199,25 +200,23 @@ func Http(ctx *middleware.Context) { } } - config := Config{setting.RepoRootPath, "git", true, true, f} + HTTPBackend(&Config{ + RepoRootPath: setting.RepoRootPath, + GitBinPath: "git", + UploadPack: true, + ReceivePack: true, + OnSucceed: callback, + })(ctx.Resp, ctx.Req.Request) - handler := HttpBackend(&config) - handler(ctx.Resp, ctx.Req.Request) runtime.GC() } -type route struct { - cr *regexp.Regexp - method string - handler func(handler) -} - type Config struct { - ReposRoot string - GitBinPath string - UploadPack bool - ReceivePack bool - OnSucceed func(rpc string, input []byte) + RepoRootPath string + GitBinPath string + UploadPack bool + ReceivePack bool + OnSucceed func(rpc string, input []byte) } type handler struct { @@ -228,6 +227,12 @@ type handler struct { File string } +type route struct { + cr *regexp.Regexp + method string + handler func(handler) +} + var routes = []route{ {regexp.MustCompile("(.*?)/git-upload-pack$"), "POST", serviceUploadPack}, {regexp.MustCompile("(.*?)/git-receive-pack$"), "POST", serviceReceivePack}, @@ -243,7 +248,7 @@ var routes = []route{ } // Request handling function -func HttpBackend(config *Config) http.HandlerFunc { +func HTTPBackend(config *Config) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { for _, route := range routes { r.URL.Path = strings.ToLower(r.URL.Path) // blue: In case some repo name has upper case name @@ -285,8 +290,7 @@ func serviceReceivePack(hr handler) { func serviceRpc(rpc string, hr handler) { w, r, dir := hr.w, hr.r, hr.Dir - access := hasAccess(r, hr.Config, dir, rpc, true) - if access == false { + if !hasAccess(r, hr.Config, dir, rpc, true) { renderNoAccess(w) return } @@ -337,7 +341,6 @@ func serviceRpc(rpc string, hr handler) { if hr.Config.OnSucceed != nil { hr.Config.OnSucceed(rpc, input) } - w.WriteHeader(http.StatusOK) } func getInfoRefs(hr handler) { @@ -408,7 +411,7 @@ func sendFile(contentType string, hr handler) { } func getGitDir(config *Config, fPath string) (string, error) { - root := config.ReposRoot + root := config.RepoRootPath if root == "" { cwd, err := os.Getwd() diff --git a/templates/.VERSION b/templates/.VERSION index cd8bf82a6b..7bc05ce057 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.5.16.0311 Beta \ No newline at end of file +0.5.16.0312 Beta \ No newline at end of file