@ -1,44 +1,49 @@ | |||||
// Copyright 2014 The Gogs Authors. All rights reserved. | |||||
// Use of this source code is governed by a MIT-style | |||||
// license that can be found in the LICENSE file. | |||||
// Copyright 2013-2014 gogs authors. | |||||
// | |||||
// Licensed under the Apache License, Version 2.0 (the "License"): you may | |||||
// not use this file except in compliance with the License. You may obtain | |||||
// a copy of the License at | |||||
// | |||||
// http://www.apache.org/licenses/LICENSE-2.0 | |||||
// | |||||
// Unless required by applicable law or agreed to in writing, software | |||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |||||
// License for the specific language governing permissions and limitations | |||||
// under the License. | |||||
// gogs(Go Git Service) is a Go clone of Github. | |||||
package main | package main | ||||
import ( | import ( | ||||
"fmt" | |||||
"net/http" | |||||
"github.com/codegangsta/martini" | |||||
"github.com/martini-contrib/render" | |||||
"os" | |||||
"runtime" | |||||
"github.com/gogits/gogs/routers" | |||||
"github.com/gogits/gogs/routers/user" | |||||
"github.com/gogits/gogs/utils" | |||||
"github.com/gogits/gogs/utils/log" | |||||
"github.com/codegangsta/cli" | |||||
) | ) | ||||
// +build go1.1 | |||||
// Test that go1.1 tag above is included in builds. main.go refers to this definition. | |||||
const go11tag = true | |||||
const APP_VER = "0.0.0.0218" | const APP_VER = "0.0.0.0218" | ||||
func init() { | func init() { | ||||
runtime.GOMAXPROCS(runtime.NumCPU()) | |||||
} | } | ||||
func main() { | func main() { | ||||
log.Info("%s %s", utils.Cfg.MustValue("", "APP_NAME"), APP_VER) | |||||
m := martini.Classic() | |||||
// Middleware. | |||||
m.Use(render.Renderer()) | |||||
// Routers. | |||||
m.Get("/", routers.Dashboard) | |||||
m.Get("/user/signin", user.SignIn) | |||||
m.Any("/user/signup", user.SignUp) | |||||
listenAddr := fmt.Sprintf("%s:%s", | |||||
utils.Cfg.MustValue("server", "HTTP_ADDR"), | |||||
utils.Cfg.MustValue("server", "HTTP_PORT", "3000")) | |||||
log.Info("Listen: %s", listenAddr) | |||||
http.ListenAndServe(listenAddr, m) | |||||
app := cli.NewApp() | |||||
app.Name = "gogs" | |||||
app.Usage = "Go Git Service" | |||||
app.Version = APP_VER | |||||
app.Commands = []cli.Command{ | |||||
CmdWeb, | |||||
CmdServ, | |||||
} | |||||
app.Flags = append(app.Flags, []cli.Flag{ | |||||
cli.BoolFlag{"noterm", "disable color output"}, | |||||
}...) | |||||
app.Run(os.Args) | |||||
} | } |
@ -0,0 +1,164 @@ | |||||
package main | |||||
import ( | |||||
"fmt" | |||||
"os" | |||||
"os/exec" | |||||
"path/filepath" | |||||
"strconv" | |||||
"strings" | |||||
"github.com/codegangsta/cli" | |||||
"github.com/gogits/gogs/models" | |||||
"github.com/gogits/gogs/utils/log" | |||||
) | |||||
var ( | |||||
COMMANDS_READONLY = map[string]int{ | |||||
"git-upload-pack": models.AU_WRITABLE, | |||||
"git upload-pack": models.AU_WRITABLE, | |||||
} | |||||
COMMANDS_WRITE = map[string]int{ | |||||
"git-receive-pack": models.AU_READABLE, | |||||
"git receive-pack": models.AU_READABLE, | |||||
} | |||||
) | |||||
var CmdServ = cli.Command{ | |||||
Name: "serv", | |||||
Usage: "just run", | |||||
Description: ` | |||||
gogs serv`, | |||||
Action: runServ, | |||||
Flags: []cli.Flag{ | |||||
//cli.BoolFlag{"update, u", "update pakcage(s) and dependencies if any"}, | |||||
//cli.BoolFlag{"verbose, v", "show process details"}, | |||||
}, | |||||
} | |||||
func In(b string, sl map[string]int) bool { | |||||
_, e := sl[b] | |||||
return e | |||||
} | |||||
func runServ(*cli.Context) { | |||||
keys := strings.Split(os.Args[2], "-") | |||||
if len(keys) != 2 { | |||||
fmt.Println("auth file format error") | |||||
return | |||||
} | |||||
keyId, err := strconv.ParseInt(keys[1], 10, 64) | |||||
if err != nil { | |||||
fmt.Println("auth file format error") | |||||
return | |||||
} | |||||
user, err := models.GetUserByKeyId(keyId) | |||||
if err != nil { | |||||
fmt.Println("You have no right to access") | |||||
return | |||||
} | |||||
cmd := os.Getenv("SSH_ORIGINAL_COMMAND") | |||||
if cmd == "" { | |||||
fmt.Printf("Hi %s! You've successfully authenticated, but Gogits does not provide shell access.\n", user.Name) | |||||
return | |||||
} | |||||
f, _ := os.Create("test2.log") | |||||
f.WriteString(cmd) | |||||
f.Close() | |||||
log.Info("cmd is %s", cmd) | |||||
verb, args := parseCmd(cmd) | |||||
rr := strings.SplitN(strings.Trim(args, "'"), "/", 1) | |||||
if len(rr) != 2 { | |||||
fmt.Printf("Unavilable repository") | |||||
return | |||||
} | |||||
repoName := rr[1] | |||||
if strings.HasSuffix(repoName, ".git") { | |||||
repoName = repoName[:len(repoName)-4] | |||||
} | |||||
isWrite := In(verb, COMMANDS_WRITE) | |||||
isRead := In(verb, COMMANDS_READONLY) | |||||
switch { | |||||
case isWrite: | |||||
has, err := models.HasAccess(user.Name, repoName, COMMANDS_WRITE[verb]) | |||||
if err != nil { | |||||
fmt.Println("Inernel error") | |||||
return | |||||
} | |||||
if !has { | |||||
fmt.Println("You have no right to access this repository") | |||||
return | |||||
} | |||||
case isRead: | |||||
has, err := models.HasAccess(user.Name, repoName, COMMANDS_READONLY[verb]) | |||||
if err != nil { | |||||
fmt.Println("Inernel error") | |||||
return | |||||
} | |||||
if !has { | |||||
has, err = models.HasAccess(user.Name, repoName, COMMANDS_WRITE[verb]) | |||||
if err != nil { | |||||
fmt.Println("Inernel error") | |||||
return | |||||
} | |||||
} | |||||
if !has { | |||||
fmt.Println("You have no right to access this repository") | |||||
return | |||||
} | |||||
default: | |||||
fmt.Println("Unknown command") | |||||
return | |||||
} | |||||
isExist, err := models.IsRepositoryExist(user, repoName) | |||||
if err != nil { | |||||
fmt.Println("Inernel error") | |||||
return | |||||
} | |||||
if !isExist { | |||||
if isRead { | |||||
fmt.Println("Repository is not exist") | |||||
return | |||||
} else if isWrite { | |||||
_, err := models.CreateRepository(user, repoName) | |||||
if err != nil { | |||||
fmt.Println("Create repository failed") | |||||
return | |||||
} | |||||
} | |||||
} | |||||
fullPath := filepath.Join(models.RepoRootPath, user.Name, repoName+".git") | |||||
newcmd := fmt.Sprintf("%s '%s'", verb, fullPath) | |||||
fmt.Println(newcmd) | |||||
gitcmd := exec.Command("git", "shell", "-c", newcmd) | |||||
gitcmd.Stdout = os.Stdout | |||||
gitcmd.Stderr = os.Stderr | |||||
err = gitcmd.Run() | |||||
if err != nil { | |||||
log.Error("execute command error: %s", err) | |||||
} | |||||
} | |||||
func parseCmd(cmd string) (string, string) { | |||||
ss := strings.SplitN(cmd, " ", 1) | |||||
if len(ss) != 2 { | |||||
return "", "" | |||||
} | |||||
verb, args := ss[0], ss[1] | |||||
if verb == "git" { | |||||
ss = strings.SplitN(args, " ", 1) | |||||
args = ss[1] | |||||
verb = fmt.Sprintf("%s %s", verb, ss[0]) | |||||
} | |||||
return verb, args | |||||
} |
@ -0,0 +1,51 @@ | |||||
// Copyright 2014 The Gogs Authors. All rights reserved. | |||||
// Use of this source code is governed by a MIT-style | |||||
// license that can be found in the LICENSE file. | |||||
package main | |||||
import ( | |||||
"fmt" | |||||
"net/http" | |||||
"github.com/codegangsta/cli" | |||||
"github.com/codegangsta/martini" | |||||
"github.com/martini-contrib/render" | |||||
"github.com/gogits/gogs/routers" | |||||
"github.com/gogits/gogs/routers/user" | |||||
"github.com/gogits/gogs/utils" | |||||
"github.com/gogits/gogs/utils/log" | |||||
) | |||||
var CmdWeb = cli.Command{ | |||||
Name: "web", | |||||
Usage: "just run", | |||||
Description: ` | |||||
gogs web`, | |||||
Action: runWeb, | |||||
Flags: []cli.Flag{ | |||||
//cli.BoolFlag{"update, u", "update pakcage(s) and dependencies if any"}, | |||||
//cli.BoolFlag{"verbose, v", "show process details"}, | |||||
}, | |||||
} | |||||
func runWeb(*cli.Context) { | |||||
log.Info("%s %s", utils.Cfg.MustValue("", "APP_NAME"), APP_VER) | |||||
m := martini.Classic() | |||||
// Middleware. | |||||
m.Use(render.Renderer()) | |||||
// Routers. | |||||
m.Get("/", routers.Dashboard) | |||||
m.Get("/user/signin", user.SignIn) | |||||
m.Any("/user/signup", user.SignUp) | |||||
listenAddr := fmt.Sprintf("%s:%s", | |||||
utils.Cfg.MustValue("server", "HTTP_ADDR"), | |||||
utils.Cfg.MustValue("server", "HTTP_PORT", "3000")) | |||||
log.Info("Listen: %s", listenAddr) | |||||
http.ListenAndServe(listenAddr, m) | |||||
} |