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

This commit is contained in:
Unknwon 2015-03-12 01:15:01 -04:00
parent 34102f7889
commit 4aafeace23
5 changed files with 32 additions and 30 deletions

View File

@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
const APP_VER = "0.5.16.0311 Beta" const APP_VER = "0.5.16.0312 Beta"
func init() { func init() {
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())

View File

@ -215,11 +215,9 @@ func UserSignIn(uname, passwd string) (*User, error) {
switch u.LoginType { switch u.LoginType {
case LDAP: case LDAP:
return LoginUserLdapSource(u, u.LoginName, passwd, return LoginUserLdapSource(u, u.LoginName, passwd, source.Id, source.Cfg.(*LDAPConfig), false)
source.Id, source.Cfg.(*LDAPConfig), false)
case SMTP: case SMTP:
return LoginUserSMTPSource(u, u.LoginName, passwd, return LoginUserSMTPSource(u, u.LoginName, passwd, source.Id, source.Cfg.(*SMTPConfig), false)
source.Id, source.Cfg.(*SMTPConfig), false)
} }
return nil, ErrUnsupportedLoginType return nil, ErrUnsupportedLoginType
} }

View File

@ -254,15 +254,16 @@ func saveAuthorizedKeyFile(keys ...*PublicKey) error {
} }
defer f.Close() defer f.Close()
finfo, err := f.Stat() fi, err := f.Stat()
if err != nil { if err != nil {
return err return err
} }
// FIXME: following command does not support in Windows. // FIXME: following command does not support in Windows.
if !setting.IsWindows { if !setting.IsWindows {
if finfo.Mode().Perm() > 0600 { // .ssh directory should have mode 700, and authorized_keys file should have mode 600.
log.Error(4, "authorized_keys file has unusual permission flags: %s - setting to -rw-------", finfo.Mode().Perm().String()) 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 { if err = f.Chmod(0600); err != nil {
return err return err
} }

View File

@ -105,7 +105,7 @@ func Http(ctx *middleware.Context) {
return return
} }
authUser, err := models.UserSignIn(authUsername, authPasswd) authUser, err = models.UserSignIn(authUsername, authPasswd)
if err != nil { if err != nil {
if err != models.ErrUserNotExist { if err != models.ErrUserNotExist {
ctx.Handle(500, "UserSignIn error: %v", err) 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" { if rpc == "receive-pack" {
var lastLine int64 = 0 var lastLine int64 = 0
@ -189,6 +189,7 @@ func Http(ctx *middleware.Context) {
newCommitId := fields[1] newCommitId := fields[1]
refName := fields[2] refName := fields[2]
// FIXME: handle error.
models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id) models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id)
} }
lastLine = lastLine + size 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() runtime.GC()
} }
type route struct {
cr *regexp.Regexp
method string
handler func(handler)
}
type Config struct { type Config struct {
ReposRoot string RepoRootPath string
GitBinPath string GitBinPath string
UploadPack bool UploadPack bool
ReceivePack bool ReceivePack bool
OnSucceed func(rpc string, input []byte) OnSucceed func(rpc string, input []byte)
} }
type handler struct { type handler struct {
@ -228,6 +227,12 @@ type handler struct {
File string File string
} }
type route struct {
cr *regexp.Regexp
method string
handler func(handler)
}
var routes = []route{ var routes = []route{
{regexp.MustCompile("(.*?)/git-upload-pack$"), "POST", serviceUploadPack}, {regexp.MustCompile("(.*?)/git-upload-pack$"), "POST", serviceUploadPack},
{regexp.MustCompile("(.*?)/git-receive-pack$"), "POST", serviceReceivePack}, {regexp.MustCompile("(.*?)/git-receive-pack$"), "POST", serviceReceivePack},
@ -243,7 +248,7 @@ var routes = []route{
} }
// Request handling function // Request handling function
func HttpBackend(config *Config) http.HandlerFunc { func HTTPBackend(config *Config) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
for _, route := range routes { for _, route := range routes {
r.URL.Path = strings.ToLower(r.URL.Path) // blue: In case some repo name has upper case name 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) { func serviceRpc(rpc string, hr handler) {
w, r, dir := hr.w, hr.r, hr.Dir w, r, dir := hr.w, hr.r, hr.Dir
access := hasAccess(r, hr.Config, dir, rpc, true) if !hasAccess(r, hr.Config, dir, rpc, true) {
if access == false {
renderNoAccess(w) renderNoAccess(w)
return return
} }
@ -337,7 +341,6 @@ func serviceRpc(rpc string, hr handler) {
if hr.Config.OnSucceed != nil { if hr.Config.OnSucceed != nil {
hr.Config.OnSucceed(rpc, input) hr.Config.OnSucceed(rpc, input)
} }
w.WriteHeader(http.StatusOK)
} }
func getInfoRefs(hr handler) { func getInfoRefs(hr handler) {
@ -408,7 +411,7 @@ func sendFile(contentType string, hr handler) {
} }
func getGitDir(config *Config, fPath string) (string, error) { func getGitDir(config *Config, fPath string) (string, error) {
root := config.ReposRoot root := config.RepoRootPath
if root == "" { if root == "" {
cwd, err := os.Getwd() cwd, err := os.Getwd()

View File

@ -1 +1 @@
0.5.16.0311 Beta 0.5.16.0312 Beta