| @@ -23,6 +23,7 @@ const go11tag = true | |||
| const APP_VER = "0.0.8.0315" | |||
| func init() { | |||
| base.AppVer = APP_VER | |||
| runtime.GOMAXPROCS(runtime.NumCPU()) | |||
| } | |||
| @@ -9,7 +9,6 @@ import ( | |||
| "reflect" | |||
| "github.com/codegangsta/martini" | |||
| "github.com/martini-contrib/render" | |||
| "github.com/martini-contrib/sessions" | |||
| "github.com/gogits/binding" | |||
| @@ -62,39 +61,6 @@ func IsSignedIn(session sessions.Session) bool { | |||
| return SignedInId(session) > 0 | |||
| } | |||
| // SignInRequire checks user status from session. | |||
| // It will assign correspoding values to | |||
| // template data map if user has signed in. | |||
| func SignInRequire(redirect bool) martini.Handler { | |||
| return func(r render.Render, data base.TmplData, session sessions.Session) { | |||
| if !IsSignedIn(session) { | |||
| if redirect { | |||
| r.Redirect("/") | |||
| } | |||
| return | |||
| } | |||
| user := SignedInUser(session) | |||
| if user == nil { | |||
| r.Redirect("/") | |||
| return | |||
| } | |||
| data["IsSigned"] = true | |||
| data["SignedUser"] = user | |||
| data["SignedUserId"] = user.Id | |||
| data["SignedUserName"] = user.LowerName | |||
| } | |||
| } | |||
| func SignOutRequire() martini.Handler { | |||
| return func(r render.Render, session sessions.Session) { | |||
| if IsSignedIn(session) { | |||
| r.Redirect("/") | |||
| } | |||
| } | |||
| } | |||
| type FeedsForm struct { | |||
| UserId int64 `form:"userid" binding:"Required"` | |||
| Offset int64 `form:"offset"` | |||
| @@ -4,17 +4,9 @@ | |||
| package base | |||
| import ( | |||
| "github.com/codegangsta/martini" | |||
| ) | |||
| import () | |||
| type ( | |||
| // Type TmplData represents data in the templates. | |||
| TmplData map[string]interface{} | |||
| ) | |||
| func InitContext() martini.Handler { | |||
| return func(context martini.Context) { | |||
| context.Map(TmplData{}) | |||
| } | |||
| } | |||
| @@ -15,7 +15,11 @@ import ( | |||
| "github.com/Unknwon/goconfig" | |||
| ) | |||
| var Cfg *goconfig.ConfigFile | |||
| var ( | |||
| AppVer string | |||
| AppName string | |||
| Cfg *goconfig.ConfigFile | |||
| ) | |||
| func exeDir() (string, error) { | |||
| file, err := exec.LookPath(os.Args[0]) | |||
| @@ -52,4 +56,6 @@ func init() { | |||
| } | |||
| } | |||
| Cfg.BlockMode = false | |||
| AppName = Cfg.MustValue("", "APP_NAME") | |||
| } | |||
| @@ -0,0 +1,28 @@ | |||
| // 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 base | |||
| import ( | |||
| "html/template" | |||
| ) | |||
| func Str2html(raw string) template.HTML { | |||
| return template.HTML(raw) | |||
| } | |||
| var TemplateFuncs template.FuncMap = map[string]interface{}{ | |||
| "AppName": func() string { | |||
| return AppName | |||
| }, | |||
| "AppVer": func() string { | |||
| return AppVer | |||
| }, | |||
| "str2html": Str2html, | |||
| "TimeSince": TimeSince, | |||
| "Subtract": Subtract, | |||
| "ActionIcon": ActionIcon, | |||
| "ActionDesc": ActionDesc, | |||
| "DateFormat": DateFormat, | |||
| } | |||
| @@ -8,7 +8,6 @@ import ( | |||
| "crypto/md5" | |||
| "encoding/hex" | |||
| "fmt" | |||
| "html/template" | |||
| "strings" | |||
| "time" | |||
| ) | |||
| @@ -30,10 +29,6 @@ const ( | |||
| Year = 12 * Month | |||
| ) | |||
| func Str2html(raw string) template.HTML { | |||
| return template.HTML(raw) | |||
| } | |||
| // TimeSince calculates the time interval and generate user-friendly string. | |||
| func TimeSince(then time.Time) string { | |||
| now := time.Now() | |||
| @@ -0,0 +1,28 @@ | |||
| // 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 middleware | |||
| import ( | |||
| "github.com/codegangsta/martini" | |||
| ) | |||
| func SignInRequire(redirect bool) martini.Handler { | |||
| return func(ctx *Context) { | |||
| if !ctx.IsSigned { | |||
| if redirect { | |||
| ctx.Render.Redirect("/") | |||
| } | |||
| return | |||
| } | |||
| } | |||
| } | |||
| func SignOutRequire() martini.Handler { | |||
| return func(ctx *Context) { | |||
| if ctx.IsSigned { | |||
| ctx.Render.Redirect("/") | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,75 @@ | |||
| // 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 middleware | |||
| import ( | |||
| "net/http" | |||
| "github.com/codegangsta/martini" | |||
| "github.com/martini-contrib/render" | |||
| "github.com/martini-contrib/sessions" | |||
| "github.com/gogits/gogs/models" | |||
| "github.com/gogits/gogs/modules/auth" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| ) | |||
| type Context struct { | |||
| c martini.Context | |||
| p martini.Params | |||
| Req *http.Request | |||
| Res http.ResponseWriter | |||
| Session sessions.Session | |||
| Data base.TmplData | |||
| Render render.Render | |||
| User *models.User | |||
| IsSigned bool | |||
| } | |||
| func (ctx *Context) Query(name string) string { | |||
| ctx.Req.ParseForm() | |||
| return ctx.Req.Form.Get(name) | |||
| } | |||
| // func (ctx *Context) Param(name string) string { | |||
| // return ctx.p[name] | |||
| // } | |||
| func (ctx *Context) Log(status int, title string, err error) { | |||
| log.Handle(status, title, ctx.Data, ctx.Render, err) | |||
| } | |||
| func InitContext() martini.Handler { | |||
| return func(res http.ResponseWriter, r *http.Request, c martini.Context, | |||
| session sessions.Session, rd render.Render) { | |||
| data := base.TmplData{} | |||
| ctx := &Context{ | |||
| c: c, | |||
| // p: p, | |||
| Req: r, | |||
| Res: res, | |||
| Data: data, | |||
| Render: rd, | |||
| } | |||
| // Get user from session if logined. | |||
| user := auth.SignedInUser(session) | |||
| ctx.User = user | |||
| ctx.IsSigned = ctx != nil | |||
| data["IsSigned"] = true | |||
| data["SignedUser"] = user | |||
| data["SignedUserId"] = user.Id | |||
| data["SignedUserName"] = user.LowerName | |||
| c.Map(ctx) | |||
| c.Map(data) | |||
| c.Next() | |||
| } | |||
| } | |||
| @@ -15,6 +15,7 @@ import ( | |||
| "github.com/gogits/gogs/modules/auth" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/middleware" | |||
| ) | |||
| func Dashboard(r render.Render, data base.TmplData, session sessions.Session) { | |||
| @@ -29,35 +30,34 @@ func Dashboard(r render.Render, data base.TmplData, session sessions.Session) { | |||
| r.HTML(200, "user/dashboard", data) | |||
| } | |||
| func Profile(params martini.Params, r render.Render, req *http.Request, data base.TmplData, session sessions.Session) { | |||
| data["Title"] = "Profile" | |||
| func Profile(ctx *middleware.Context, params martini.Params) { | |||
| ctx.Data["Title"] = "Profile" | |||
| // TODO: Need to check view self or others. | |||
| user, err := models.GetUserByName(params["username"]) | |||
| if err != nil { | |||
| log.Handle(200, "user.Profile", data, r, err) | |||
| ctx.Log(200, "user.Profile", err) | |||
| return | |||
| } | |||
| data["Owner"] = user | |||
| ctx.Data["Owner"] = user | |||
| req.ParseForm() | |||
| tab := req.Form.Get("tab") | |||
| data["TabName"] = tab | |||
| tab := ctx.Query("tab") | |||
| ctx.Data["TabName"] = tab | |||
| switch tab { | |||
| case "activity": | |||
| feeds, err := models.GetFeeds(user.Id, 0, true) | |||
| if err != nil { | |||
| log.Handle(200, "user.Profile", data, r, err) | |||
| ctx.Log(200, "user.Profile", err) | |||
| return | |||
| } | |||
| data["Feeds"] = feeds | |||
| ctx.Data["Feeds"] = feeds | |||
| default: | |||
| } | |||
| r.HTML(200, "user/profile", data) | |||
| ctx.Render.HTML(200, "user/profile", ctx.Data) | |||
| } | |||
| func SignIn(form auth.LogInForm, data base.TmplData, req *http.Request, r render.Render, session sessions.Session) { | |||
| @@ -19,6 +19,7 @@ import ( | |||
| "github.com/gogits/gogs/modules/auth" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/middleware" | |||
| "github.com/gogits/gogs/routers" | |||
| "github.com/gogits/gogs/routers/repo" | |||
| "github.com/gogits/gogs/routers/user" | |||
| @@ -33,60 +34,46 @@ gogs web`, | |||
| Flags: []cli.Flag{}, | |||
| } | |||
| var AppHelpers template.FuncMap = map[string]interface{}{ | |||
| "AppName": func() string { | |||
| return base.Cfg.MustValue("", "APP_NAME") | |||
| }, | |||
| "AppVer": func() string { | |||
| return APP_VER | |||
| }, | |||
| "str2html": base.Str2html, | |||
| "TimeSince": base.TimeSince, | |||
| "Subtract": base.Subtract, | |||
| "ActionIcon": base.ActionIcon, | |||
| "ActionDesc": base.ActionDesc, | |||
| "DateFormat": base.DateFormat, | |||
| } | |||
| func runWeb(*cli.Context) { | |||
| log.Info("%s %s", base.Cfg.MustValue("", "APP_NAME"), APP_VER) | |||
| log.Info("%s %s", base.AppName, base.AppVer) | |||
| m := martini.Classic() | |||
| // Middlewares. | |||
| m.Use(render.Renderer(render.Options{Funcs: []template.FuncMap{AppHelpers}})) | |||
| m.Use(base.InitContext()) | |||
| m.Use(render.Renderer(render.Options{Funcs: []template.FuncMap{base.TemplateFuncs}})) | |||
| // TODO: should use other store because cookie store is not secure. | |||
| store := sessions.NewCookieStore([]byte("secret123")) | |||
| m.Use(sessions.Sessions("my_session", store)) | |||
| m.Use(middleware.InitContext()) | |||
| // Routers. | |||
| m.Get("/", auth.SignInRequire(false), routers.Home) | |||
| m.Any("/user/login", auth.SignOutRequire(), binding.BindIgnErr(auth.LogInForm{}), user.SignIn) | |||
| m.Any("/user/logout", auth.SignInRequire(true), user.SignOut) | |||
| m.Any("/user/sign_up", auth.SignOutRequire(), binding.BindIgnErr(auth.RegisterForm{}), user.SignUp) | |||
| m.Any("/user/delete", auth.SignInRequire(true), user.Delete) | |||
| m.Get("/", middleware.SignInRequire(false), routers.Home) | |||
| m.Any("/user/login", middleware.SignOutRequire(), binding.BindIgnErr(auth.LogInForm{}), user.SignIn) | |||
| m.Any("/user/logout", middleware.SignInRequire(true), user.SignOut) | |||
| m.Any("/user/sign_up", middleware.SignOutRequire(), binding.BindIgnErr(auth.RegisterForm{}), user.SignUp) | |||
| m.Any("/user/delete", middleware.SignInRequire(true), user.Delete) | |||
| m.Get("/user/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds) | |||
| m.Any("/user/setting", auth.SignInRequire(true), binding.BindIgnErr(auth.UpdateProfileForm{}), user.Setting) | |||
| m.Any("/user/setting/password", auth.SignInRequire(true), binding.BindIgnErr(auth.UpdatePasswdForm{}), user.SettingPassword) | |||
| m.Any("/user/setting/ssh", auth.SignInRequire(true), binding.BindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys) | |||
| m.Any("/user/setting/notification", auth.SignInRequire(true), user.SettingNotification) | |||
| m.Any("/user/setting/security", auth.SignInRequire(true), user.SettingSecurity) | |||
| m.Any("/user/setting", middleware.SignInRequire(true), binding.BindIgnErr(auth.UpdateProfileForm{}), user.Setting) | |||
| m.Any("/user/setting/password", middleware.SignInRequire(true), binding.BindIgnErr(auth.UpdatePasswdForm{}), user.SettingPassword) | |||
| m.Any("/user/setting/ssh", middleware.SignInRequire(true), binding.BindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys) | |||
| m.Any("/user/setting/notification", middleware.SignInRequire(true), user.SettingNotification) | |||
| m.Any("/user/setting/security", middleware.SignInRequire(true), user.SettingSecurity) | |||
| m.Get("/user/:username", auth.SignInRequire(false), user.Profile) | |||
| m.Get("/user/:username", middleware.SignInRequire(false), user.Profile) | |||
| m.Any("/repo/create", auth.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create) | |||
| m.Any("/repo/delete", auth.SignInRequire(true), binding.Bind(auth.DeleteRepoForm{}), repo.Delete) | |||
| m.Any("/repo/list", auth.SignInRequire(false), repo.List) | |||
| m.Any("/repo/create", middleware.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create) | |||
| m.Any("/repo/delete", middleware.SignInRequire(true), binding.Bind(auth.DeleteRepoForm{}), repo.Delete) | |||
| m.Any("/repo/list", middleware.SignInRequire(false), repo.List) | |||
| m.Get("/:username/:reponame/settings", auth.SignInRequire(false), auth.RepoAssignment(true), repo.Setting) | |||
| m.Get("/:username/:reponame/settings", middleware.SignInRequire(false), auth.RepoAssignment(true), repo.Setting) | |||
| m.Get("/:username/:reponame/tree/:branchname/**", | |||
| auth.SignInRequire(false), auth.RepoAssignment(true), repo.Single) | |||
| middleware.SignInRequire(false), auth.RepoAssignment(true), repo.Single) | |||
| m.Get("/:username/:reponame/tree/:branchname", | |||
| auth.SignInRequire(false), auth.RepoAssignment(true), repo.Single) | |||
| m.Get("/:username/:reponame", auth.SignInRequire(false), auth.RepoAssignment(true), repo.Single) | |||
| middleware.SignInRequire(false), auth.RepoAssignment(true), repo.Single) | |||
| m.Get("/:username/:reponame", middleware.SignInRequire(false), auth.RepoAssignment(true), repo.Single) | |||
| //m.Get("/:username/:reponame", repo.Repo) | |||