@ -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 | |||
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" | |||
func init() { | |||
runtime.GOMAXPROCS(runtime.NumCPU()) | |||
} | |||
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) | |||
} |