Browse Source

fix HTTP/HTTPS push update func call panic #1037 and `http: multiple response.WriteHeader calls`

Unknwon 10 years ago
parent
commit
4aafeace23
5 changed files with 32 additions and 30 deletions
  1. 1 1
      gogs.go
  2. 2 4
      models/login.go
  3. 4 3
      models/publickey.go
  4. 24 21
      routers/repo/http.go
  5. 1 1
      templates/.VERSION

+ 1 - 1
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())

+ 2 - 4
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
 }

+ 4 - 3
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
 			}

+ 24 - 21
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()

+ 1 - 1
templates/.VERSION

@@ -1 +1 @@
-0.5.16.0311 Beta
+0.5.16.0312 Beta