]> source.dussan.org Git - gitea.git/commitdiff
Add SignInRequire and SignOutRequire middleware
authorUnknown <joe2010xtmf@163.com>
Fri, 7 Mar 2014 21:05:18 +0000 (16:05 -0500)
committerUnknown <joe2010xtmf@163.com>
Fri, 7 Mar 2014 21:05:18 +0000 (16:05 -0500)
gogs.go
modules/auth/user.go [new file with mode: 0644]
routers/dashboard.go
routers/repo/repo.go
routers/user/ssh.go
routers/user/user.go
templates/repo/create.tmpl
web.go

diff --git a/gogs.go b/gogs.go
index 4c4d7da1f754c9ce1204a6365b90184c0e324ba1..e239737e23fad1f97157e1cd6950fb94c0e5ada9 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -19,7 +19,7 @@ import (
 // Test that go1.1 tag above is included in builds. main.go refers to this definition.
 const go11tag = true
 
-const APP_VER = "0.0.1.0306"
+const APP_VER = "0.0.1.0307"
 
 func init() {
        runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/modules/auth/user.go b/modules/auth/user.go
new file mode 100644 (file)
index 0000000..3a793f4
--- /dev/null
@@ -0,0 +1,82 @@
+// 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 auth
+
+import (
+       "github.com/codegangsta/martini"
+       "github.com/martini-contrib/render"
+       "github.com/martini-contrib/sessions"
+
+       "github.com/gogits/gogs/models"
+       "github.com/gogits/gogs/modules/base"
+       "github.com/gogits/gogs/utils/log"
+)
+
+func SignedInId(session sessions.Session) int64 {
+       userId := session.Get("userId")
+       if userId == nil {
+               return 0
+       }
+       if s, ok := userId.(int64); ok {
+               return s
+       }
+       return 0
+}
+
+func SignedInName(session sessions.Session) string {
+       userName := session.Get("userName")
+       if userName == nil {
+               return ""
+       }
+       if s, ok := userName.(string); ok {
+               return s
+       }
+       return ""
+}
+
+func SignedInUser(session sessions.Session) *models.User {
+       id := SignedInId(session)
+       if id <= 0 {
+               return nil
+       }
+
+       user, err := models.GetUserById(id)
+       if err != nil {
+               log.Error("user.SignedInUser: %v", err)
+               return nil
+       }
+       return user
+}
+
+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
+               }
+
+               data["IsSigned"] = true
+               data["SignedUserId"] = SignedInId(session)
+               data["SignedUserName"] = SignedInName(session)
+               data["Avatar"] = SignedInUser(session).Avatar
+       }
+}
+
+func SignOutRequire() martini.Handler {
+       return func(r render.Render, session sessions.Session) {
+               if IsSignedIn(session) {
+                       r.Redirect("/")
+               }
+       }
+}
index 8eda9cf248fa11752bdf8f848cefce95fa3cd465..a75445003aac880b3b4d344f168056b63dc30eac 100644 (file)
@@ -5,14 +5,16 @@
 package routers
 
 import (
-       "github.com/gogits/gogs/modules/base"
-       "github.com/gogits/gogs/routers/user"
        "github.com/martini-contrib/render"
        "github.com/martini-contrib/sessions"
+
+       "github.com/gogits/gogs/modules/auth"
+       "github.com/gogits/gogs/modules/base"
+       "github.com/gogits/gogs/routers/user"
 )
 
 func Home(r render.Render, data base.TmplData, session sessions.Session) {
-       if user.IsSignedIn(session) {
+       if auth.IsSignedIn(session) {
                user.Dashboard(r, data, session)
                return
        }
index 3a958f9adb08c8fb0c3891b3468036591ca76e5e..c34c33d74cac30272f8ac657c152a5c18b570e83 100644 (file)
@@ -10,19 +10,21 @@ import (
        "strconv"
 
        "github.com/martini-contrib/render"
+       "github.com/martini-contrib/sessions"
 
        "github.com/gogits/gogs/models"
-       "github.com/gogits/gogs/routers/user"
-       "github.com/martini-contrib/sessions"
+       "github.com/gogits/gogs/modules/auth"
+       "github.com/gogits/gogs/modules/base"
 )
 
-func Create(req *http.Request, r render.Render, session sessions.Session) {
+func Create(req *http.Request, r render.Render, data base.TmplData, session sessions.Session) {
+       data["Title"] = "Create repository"
+
        if req.Method == "GET" {
                r.HTML(200, "repo/create", map[string]interface{}{
-                       "Title":    "Create repository",
-                       "UserName": user.SignedInName(session),
-                       "UserId":   user.SignedInId(session),
-                       "IsSigned": user.IsSignedIn(session),
+                       "UserName": auth.SignedInName(session),
+                       "UserId":   auth.SignedInId(session),
+                       "IsSigned": auth.IsSignedIn(session),
                })
                return
        }
@@ -42,7 +44,7 @@ func Create(req *http.Request, r render.Render, session sessions.Session) {
                if err == nil {
                        r.HTML(200, "repo/created", map[string]interface{}{
                                "RepoName": u.Name + "/" + req.FormValue("name"),
-                               "IsSigned": user.IsSignedIn(session),
+                               "IsSigned": auth.IsSignedIn(session),
                        })
                        return
                }
@@ -51,7 +53,7 @@ func Create(req *http.Request, r render.Render, session sessions.Session) {
        if err != nil {
                r.HTML(200, "base/error", map[string]interface{}{
                        "Error":    fmt.Sprintf("%v", err),
-                       "IsSigned": user.IsSignedIn(session),
+                       "IsSigned": auth.IsSignedIn(session),
                })
        }
 }
@@ -60,7 +62,7 @@ func Delete(req *http.Request, r render.Render, session sessions.Session) {
        if req.Method == "GET" {
                r.HTML(200, "repo/delete", map[string]interface{}{
                        "Title":    "Delete repository",
-                       "IsSigned": user.IsSignedIn(session),
+                       "IsSigned": auth.IsSignedIn(session),
                })
                return
        }
@@ -70,19 +72,19 @@ func Delete(req *http.Request, r render.Render, session sessions.Session) {
        if err != nil {
                r.HTML(200, "base/error", map[string]interface{}{
                        "Error":    fmt.Sprintf("%v", err),
-                       "IsSigned": user.IsSignedIn(session),
+                       "IsSigned": auth.IsSignedIn(session),
                })
        }
 }
 
 func List(req *http.Request, r render.Render, session sessions.Session) {
-       u := user.SignedInUser(session)
+       u := auth.SignedInUser(session)
        repos, err := models.GetRepositories(u)
        fmt.Println("repos", repos)
        if err != nil {
                r.HTML(200, "base/error", map[string]interface{}{
                        "Error":    fmt.Sprintf("%v", err),
-                       "IsSigned": user.IsSignedIn(session),
+                       "IsSigned": auth.IsSignedIn(session),
                })
                return
        }
@@ -90,6 +92,6 @@ func List(req *http.Request, r render.Render, session sessions.Session) {
        r.HTML(200, "repo/list", map[string]interface{}{
                "Title":    "repositories",
                "Repos":    repos,
-               "IsSigned": user.IsSignedIn(session),
+               "IsSigned": auth.IsSignedIn(session),
        })
 }
index 9e9cf009fe1d0c3dca693ef33b58ab2a15ec9463..c928407d4a4709bc1b4ce09c1ae0bc1b36e0aaee 100644 (file)
@@ -9,21 +9,22 @@ import (
        "net/http"
 
        "github.com/martini-contrib/render"
+       "github.com/martini-contrib/sessions"
 
        "github.com/gogits/gogs/models"
-       "github.com/martini-contrib/sessions"
+       "github.com/gogits/gogs/modules/auth"
 )
 
 func AddPublicKey(req *http.Request, r render.Render, session sessions.Session) {
        if req.Method == "GET" {
                r.HTML(200, "user/publickey_add", map[string]interface{}{
                        "Title":    "Add Public Key",
-                       "IsSigned": IsSignedIn(session),
+                       "IsSigned": auth.IsSignedIn(session),
                })
                return
        }
 
-       k := &models.PublicKey{OwnerId: SignedInId(session),
+       k := &models.PublicKey{OwnerId: auth.SignedInId(session),
                Name:    req.FormValue("keyname"),
                Content: req.FormValue("key_content"),
        }
@@ -31,7 +32,7 @@ func AddPublicKey(req *http.Request, r render.Render, session sessions.Session)
        if err != nil {
                r.HTML(403, "status/403", map[string]interface{}{
                        "Title":    fmt.Sprintf("%v", err),
-                       "IsSigned": IsSignedIn(session),
+                       "IsSigned": auth.IsSignedIn(session),
                })
        } else {
                r.HTML(200, "user/publickey_added", map[string]interface{}{})
@@ -39,11 +40,11 @@ func AddPublicKey(req *http.Request, r render.Render, session sessions.Session)
 }
 
 func ListPublicKey(req *http.Request, r render.Render, session sessions.Session) {
-       keys, err := models.ListPublicKey(SignedInId(session))
+       keys, err := models.ListPublicKey(auth.SignedInId(session))
        if err != nil {
                r.HTML(200, "base/error", map[string]interface{}{
                        "Error":    fmt.Sprintf("%v", err),
-                       "IsSigned": IsSignedIn(session),
+                       "IsSigned": auth.IsSignedIn(session),
                })
                return
        }
@@ -51,6 +52,6 @@ func ListPublicKey(req *http.Request, r render.Render, session sessions.Session)
        r.HTML(200, "user/publickey_list", map[string]interface{}{
                "Title":    "repositories",
                "Keys":     keys,
-               "IsSigned": IsSignedIn(session),
+               "IsSigned": auth.IsSignedIn(session),
        })
 }
index 90494b28344985499515de767b3f844d4b4031fd..fae376dd286d5b7f384a031d480ca58f1e1c32cc 100644 (file)
@@ -8,7 +8,6 @@ import (
        "fmt"
        "net/http"
 
-       //"github.com/martini-contrib/binding"
        "github.com/martini-contrib/render"
        "github.com/martini-contrib/sessions"
 
@@ -19,80 +18,23 @@ import (
 )
 
 func Dashboard(r render.Render, data base.TmplData, session sessions.Session) {
-       if !IsSignedIn(session) {
-               // todo : direct to logout
-               r.Redirect("/")
-               return
-       }
-
-       data["IsSigned"] = true
-       data["SignedUserId"] = SignedInId(session)
-       data["SignedUserName"] = SignedInName(session)
-       data["PageIsUserDashboard"] = true
-       data["Avatar"] = SignedInUser(session).Avatar
-
        data["Title"] = "Dashboard"
+       data["PageIsUserDashboard"] = true
        r.HTML(200, "user/dashboard", data)
 }
 
 func Profile(r render.Render, data base.TmplData, session sessions.Session) {
        data["Title"] = "Profile"
 
-       data["IsSigned"] = IsSignedIn(session)
+       data["IsSigned"] = auth.IsSignedIn(session)
        // TODO: Need to check view self or others.
-       user := SignedInUser(session)
+       user := auth.SignedInUser(session)
        data["Avatar"] = user.Avatar
        data["Username"] = user.Name
        r.HTML(200, "user/profile", data)
 }
 
-func IsSignedIn(session sessions.Session) bool {
-       return SignedInId(session) > 0
-}
-
-func SignedInId(session sessions.Session) int64 {
-       userId := session.Get("userId")
-       if userId == nil {
-               return 0
-       }
-       if s, ok := userId.(int64); ok {
-               return s
-       }
-       return 0
-}
-
-func SignedInName(session sessions.Session) string {
-       userName := session.Get("userName")
-       if userName == nil {
-               return ""
-       }
-       if s, ok := userName.(string); ok {
-               return s
-       }
-       return ""
-}
-
-func SignedInUser(session sessions.Session) *models.User {
-       id := SignedInId(session)
-       if id <= 0 {
-               return nil
-       }
-
-       user, err := models.GetUserById(id)
-       if err != nil {
-               log.Error("user.SignedInUser: %v", err)
-               return nil
-       }
-       return user
-}
-
 func SignIn(form auth.LogInForm, data base.TmplData, req *http.Request, r render.Render, session sessions.Session) {
-       // if logged, do not show login page
-       if IsSignedIn(session) {
-               r.Redirect("/")
-               return
-       }
-
        data["Title"] = "Log In"
 
        if req.Method == "GET" {
@@ -128,11 +70,6 @@ func SignIn(form auth.LogInForm, data base.TmplData, req *http.Request, r render
 }
 
 func SignOut(r render.Render, session sessions.Session) {
-       if !IsSignedIn(session) {
-               r.Redirect("/")
-               return
-       }
-
        session.Delete("userId")
        session.Delete("userName")
        r.Redirect("/")
index 809637c4ebf8b9113ba78dfcc52863688c04227a..ffcffb09e36e88f0959d9e562ba060f5ca27efac 100644 (file)
@@ -10,6 +10,7 @@
                 <input type="hidden" value="{{.UserId}}" name="userId"/>
             </div>
         </div>
+
         <div class="form-group">
             <label class="col-md-2 control-label">Repository<strong class="text-danger">*</strong></label>
             <div class="col-md-8">
                 <span class="help-block">Great repository names are short and memorable. </span>
             </div>
         </div>
+
+        <div class="form-group">
+            <label class="col-md-2 control-label">Visibility<strong class="text-danger">*</strong></label>
+            <div class="col-md-8">
+                <p class="form-control-static">Public</p>
+            </div>
+        </div>
+
         <div class="form-group">
             <label class="col-md-2 control-label">Description</label>
             <div class="col-md-8">
                 <textarea name="desc" class="form-control" placeholder="Type your repository name"></textarea>
             </div>
         </div>
+
         <div class="form-group">
             <label class="col-md-2 control-label">Language</label>
             <div class="col-md-8">
@@ -36,6 +46,7 @@
                 </select>
             </div>
         </div>
+
         <div class="form-group">
             <div class="col-md-8 col-md-offset-2">
                 <div class="checkbox">
@@ -46,6 +57,7 @@
                 </div>
             </div>
         </div>
+
         <div class="form-group">
             <div class="col-md-offset-2 col-md-8">
                 <button type="submit" class="btn btn-lg btn-primary">Create repository</button>
diff --git a/web.go b/web.go
index 34892b129dc04af5c78ba52a9282bec32d065386..b0474669910cccde353a47a90e34e85523650f03 100644 (file)
--- a/web.go
+++ b/web.go
@@ -57,17 +57,17 @@ func runWeb(*cli.Context) {
        m.Use(sessions.Sessions("my_session", store))
 
        // Routers.
-       m.Get("/", routers.Home)
-       m.Any("/user/login", binding.BindIgnErr(auth.LogInForm{}), user.SignIn)
-       m.Any("/user/logout", user.SignOut)
-       m.Any("/user/sign_up", binding.BindIgnErr(auth.RegisterForm{}), user.SignUp)
-
+       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.Get("/user/profile", user.Profile) // should be /username
-       m.Any("/user/delete", user.Delete)
+       m.Any("/user/delete", auth.SignInRequire(true), user.Delete)
        m.Any("/user/publickey/add", user.AddPublicKey)
        m.Any("/user/publickey/list", user.ListPublicKey)
-       m.Any("/repo/create", repo.Create)
-       m.Any("/repo/delete", repo.Delete)
+
+       m.Any("/repo/create", auth.SignInRequire(true), repo.Create)
+       m.Any("/repo/delete", auth.SignInRequire(true), repo.Delete)
        m.Any("/repo/list", repo.List)
 
        listenAddr := fmt.Sprintf("%s:%s",