summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gogs.go1
-rw-r--r--modules/auth/user.go34
-rw-r--r--modules/base/base.go10
-rw-r--r--modules/base/conf.go8
-rw-r--r--modules/base/template.go28
-rw-r--r--modules/base/tool.go5
-rw-r--r--modules/middleware/auth.go28
-rw-r--r--modules/middleware/context.go75
-rw-r--r--routers/user/user.go20
-rw-r--r--web.go59
10 files changed, 173 insertions, 95 deletions
diff --git a/gogs.go b/gogs.go
index 056fb2db61..e826ab9f36 100644
--- a/gogs.go
+++ b/gogs.go
@@ -23,6 +23,7 @@ const go11tag = true
const APP_VER = "0.0.8.0315"
func init() {
+ base.AppVer = APP_VER
runtime.GOMAXPROCS(runtime.NumCPU())
}
diff --git a/modules/auth/user.go b/modules/auth/user.go
index d950b25002..9c9ce686df 100644
--- a/modules/auth/user.go
+++ b/modules/auth/user.go
@@ -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"`
diff --git a/modules/base/base.go b/modules/base/base.go
index 0d305ab453..967a78bfbe 100644
--- a/modules/base/base.go
+++ b/modules/base/base.go
@@ -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{})
- }
-}
diff --git a/modules/base/conf.go b/modules/base/conf.go
index 809b2b8c18..f1508d7a62 100644
--- a/modules/base/conf.go
+++ b/modules/base/conf.go
@@ -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")
}
diff --git a/modules/base/template.go b/modules/base/template.go
new file mode 100644
index 0000000000..620bf4a186
--- /dev/null
+++ b/modules/base/template.go
@@ -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,
+}
diff --git a/modules/base/tool.go b/modules/base/tool.go
index 4b84ac0bdd..4802c413ed 100644
--- a/modules/base/tool.go
+++ b/modules/base/tool.go
@@ -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()
diff --git a/modules/middleware/auth.go b/modules/middleware/auth.go
new file mode 100644
index 0000000000..743b982976
--- /dev/null
+++ b/modules/middleware/auth.go
@@ -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("/")
+ }
+ }
+}
diff --git a/modules/middleware/context.go b/modules/middleware/context.go
new file mode 100644
index 0000000000..5ca726d93e
--- /dev/null
+++ b/modules/middleware/context.go
@@ -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()
+ }
+}
diff --git a/routers/user/user.go b/routers/user/user.go
index 680055f661..450f09b6d3 100644
--- a/routers/user/user.go
+++ b/routers/user/user.go
@@ -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) {
diff --git a/web.go b/web.go
index cb6ee4aece..ad19a5da01 100644
--- a/web.go
+++ b/web.go
@@ -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)