@@ -19,7 +19,7 @@ import ( | |||||
// Test that go1.1 tag above is included in builds. main.go refers to this definition. | // Test that go1.1 tag above is included in builds. main.go refers to this definition. | ||||
const go11tag = true | const go11tag = true | ||||
const APP_VER = "0.0.1.0306" | |||||
const APP_VER = "0.0.1.0307" | |||||
func init() { | func init() { | ||||
runtime.GOMAXPROCS(runtime.NumCPU()) | runtime.GOMAXPROCS(runtime.NumCPU()) | ||||
@@ -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("/") | |||||
} | |||||
} | |||||
} |
@@ -5,14 +5,16 @@ | |||||
package routers | package routers | ||||
import ( | import ( | ||||
"github.com/gogits/gogs/modules/base" | |||||
"github.com/gogits/gogs/routers/user" | |||||
"github.com/martini-contrib/render" | "github.com/martini-contrib/render" | ||||
"github.com/martini-contrib/sessions" | "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) { | func Home(r render.Render, data base.TmplData, session sessions.Session) { | ||||
if user.IsSignedIn(session) { | |||||
if auth.IsSignedIn(session) { | |||||
user.Dashboard(r, data, session) | user.Dashboard(r, data, session) | ||||
return | return | ||||
} | } | ||||
@@ -10,19 +10,21 @@ import ( | |||||
"strconv" | "strconv" | ||||
"github.com/martini-contrib/render" | "github.com/martini-contrib/render" | ||||
"github.com/martini-contrib/sessions" | |||||
"github.com/gogits/gogs/models" | "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" { | if req.Method == "GET" { | ||||
r.HTML(200, "repo/create", map[string]interface{}{ | 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 | return | ||||
} | } | ||||
@@ -42,7 +44,7 @@ func Create(req *http.Request, r render.Render, session sessions.Session) { | |||||
if err == nil { | if err == nil { | ||||
r.HTML(200, "repo/created", map[string]interface{}{ | r.HTML(200, "repo/created", map[string]interface{}{ | ||||
"RepoName": u.Name + "/" + req.FormValue("name"), | "RepoName": u.Name + "/" + req.FormValue("name"), | ||||
"IsSigned": user.IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
return | return | ||||
} | } | ||||
@@ -51,7 +53,7 @@ func Create(req *http.Request, r render.Render, session sessions.Session) { | |||||
if err != nil { | if err != nil { | ||||
r.HTML(200, "base/error", map[string]interface{}{ | r.HTML(200, "base/error", map[string]interface{}{ | ||||
"Error": fmt.Sprintf("%v", err), | "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" { | if req.Method == "GET" { | ||||
r.HTML(200, "repo/delete", map[string]interface{}{ | r.HTML(200, "repo/delete", map[string]interface{}{ | ||||
"Title": "Delete repository", | "Title": "Delete repository", | ||||
"IsSigned": user.IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
return | return | ||||
} | } | ||||
@@ -70,19 +72,19 @@ func Delete(req *http.Request, r render.Render, session sessions.Session) { | |||||
if err != nil { | if err != nil { | ||||
r.HTML(200, "base/error", map[string]interface{}{ | r.HTML(200, "base/error", map[string]interface{}{ | ||||
"Error": fmt.Sprintf("%v", err), | "Error": fmt.Sprintf("%v", err), | ||||
"IsSigned": user.IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
} | } | ||||
} | } | ||||
func List(req *http.Request, r render.Render, session sessions.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) | repos, err := models.GetRepositories(u) | ||||
fmt.Println("repos", repos) | fmt.Println("repos", repos) | ||||
if err != nil { | if err != nil { | ||||
r.HTML(200, "base/error", map[string]interface{}{ | r.HTML(200, "base/error", map[string]interface{}{ | ||||
"Error": fmt.Sprintf("%v", err), | "Error": fmt.Sprintf("%v", err), | ||||
"IsSigned": user.IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
return | return | ||||
} | } | ||||
@@ -90,6 +92,6 @@ func List(req *http.Request, r render.Render, session sessions.Session) { | |||||
r.HTML(200, "repo/list", map[string]interface{}{ | r.HTML(200, "repo/list", map[string]interface{}{ | ||||
"Title": "repositories", | "Title": "repositories", | ||||
"Repos": repos, | "Repos": repos, | ||||
"IsSigned": user.IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
} | } |
@@ -9,21 +9,22 @@ import ( | |||||
"net/http" | "net/http" | ||||
"github.com/martini-contrib/render" | "github.com/martini-contrib/render" | ||||
"github.com/martini-contrib/sessions" | |||||
"github.com/gogits/gogs/models" | "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) { | func AddPublicKey(req *http.Request, r render.Render, session sessions.Session) { | ||||
if req.Method == "GET" { | if req.Method == "GET" { | ||||
r.HTML(200, "user/publickey_add", map[string]interface{}{ | r.HTML(200, "user/publickey_add", map[string]interface{}{ | ||||
"Title": "Add Public Key", | "Title": "Add Public Key", | ||||
"IsSigned": IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
return | return | ||||
} | } | ||||
k := &models.PublicKey{OwnerId: SignedInId(session), | |||||
k := &models.PublicKey{OwnerId: auth.SignedInId(session), | |||||
Name: req.FormValue("keyname"), | Name: req.FormValue("keyname"), | ||||
Content: req.FormValue("key_content"), | Content: req.FormValue("key_content"), | ||||
} | } | ||||
@@ -31,7 +32,7 @@ func AddPublicKey(req *http.Request, r render.Render, session sessions.Session) | |||||
if err != nil { | if err != nil { | ||||
r.HTML(403, "status/403", map[string]interface{}{ | r.HTML(403, "status/403", map[string]interface{}{ | ||||
"Title": fmt.Sprintf("%v", err), | "Title": fmt.Sprintf("%v", err), | ||||
"IsSigned": IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
} else { | } else { | ||||
r.HTML(200, "user/publickey_added", map[string]interface{}{}) | 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) { | 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 { | if err != nil { | ||||
r.HTML(200, "base/error", map[string]interface{}{ | r.HTML(200, "base/error", map[string]interface{}{ | ||||
"Error": fmt.Sprintf("%v", err), | "Error": fmt.Sprintf("%v", err), | ||||
"IsSigned": IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
return | 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{}{ | r.HTML(200, "user/publickey_list", map[string]interface{}{ | ||||
"Title": "repositories", | "Title": "repositories", | ||||
"Keys": keys, | "Keys": keys, | ||||
"IsSigned": IsSignedIn(session), | |||||
"IsSigned": auth.IsSignedIn(session), | |||||
}) | }) | ||||
} | } |
@@ -8,7 +8,6 @@ import ( | |||||
"fmt" | "fmt" | ||||
"net/http" | "net/http" | ||||
//"github.com/martini-contrib/binding" | |||||
"github.com/martini-contrib/render" | "github.com/martini-contrib/render" | ||||
"github.com/martini-contrib/sessions" | "github.com/martini-contrib/sessions" | ||||
@@ -19,80 +18,23 @@ import ( | |||||
) | ) | ||||
func Dashboard(r render.Render, data base.TmplData, session sessions.Session) { | 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["Title"] = "Dashboard" | ||||
data["PageIsUserDashboard"] = true | |||||
r.HTML(200, "user/dashboard", data) | r.HTML(200, "user/dashboard", data) | ||||
} | } | ||||
func Profile(r render.Render, data base.TmplData, session sessions.Session) { | func Profile(r render.Render, data base.TmplData, session sessions.Session) { | ||||
data["Title"] = "Profile" | data["Title"] = "Profile" | ||||
data["IsSigned"] = IsSignedIn(session) | |||||
data["IsSigned"] = auth.IsSignedIn(session) | |||||
// TODO: Need to check view self or others. | // TODO: Need to check view self or others. | ||||
user := SignedInUser(session) | |||||
user := auth.SignedInUser(session) | |||||
data["Avatar"] = user.Avatar | data["Avatar"] = user.Avatar | ||||
data["Username"] = user.Name | data["Username"] = user.Name | ||||
r.HTML(200, "user/profile", data) | 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) { | 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" | data["Title"] = "Log In" | ||||
if req.Method == "GET" { | 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) { | func SignOut(r render.Render, session sessions.Session) { | ||||
if !IsSignedIn(session) { | |||||
r.Redirect("/") | |||||
return | |||||
} | |||||
session.Delete("userId") | session.Delete("userId") | ||||
session.Delete("userName") | session.Delete("userName") | ||||
r.Redirect("/") | r.Redirect("/") | ||||
@@ -10,6 +10,7 @@ | |||||
<input type="hidden" value="{{.UserId}}" name="userId"/> | <input type="hidden" value="{{.UserId}}" name="userId"/> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<label class="col-md-2 control-label">Repository<strong class="text-danger">*</strong></label> | <label class="col-md-2 control-label">Repository<strong class="text-danger">*</strong></label> | ||||
<div class="col-md-8"> | <div class="col-md-8"> | ||||
@@ -17,12 +18,21 @@ | |||||
<span class="help-block">Great repository names are short and memorable. </span> | <span class="help-block">Great repository names are short and memorable. </span> | ||||
</div> | </div> | ||||
</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"> | <div class="form-group"> | ||||
<label class="col-md-2 control-label">Description</label> | <label class="col-md-2 control-label">Description</label> | ||||
<div class="col-md-8"> | <div class="col-md-8"> | ||||
<textarea name="desc" class="form-control" placeholder="Type your repository name"></textarea> | <textarea name="desc" class="form-control" placeholder="Type your repository name"></textarea> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<label class="col-md-2 control-label">Language</label> | <label class="col-md-2 control-label">Language</label> | ||||
<div class="col-md-8"> | <div class="col-md-8"> | ||||
@@ -36,6 +46,7 @@ | |||||
</select> | </select> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<div class="col-md-8 col-md-offset-2"> | <div class="col-md-8 col-md-offset-2"> | ||||
<div class="checkbox"> | <div class="checkbox"> | ||||
@@ -46,6 +57,7 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-group"> | <div class="form-group"> | ||||
<div class="col-md-offset-2 col-md-8"> | <div class="col-md-offset-2 col-md-8"> | ||||
<button type="submit" class="btn btn-lg btn-primary">Create repository</button> | <button type="submit" class="btn btn-lg btn-primary">Create repository</button> | ||||
@@ -57,17 +57,17 @@ func runWeb(*cli.Context) { | |||||
m.Use(sessions.Sessions("my_session", store)) | m.Use(sessions.Sessions("my_session", store)) | ||||
// Routers. | // 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.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/add", user.AddPublicKey) | ||||
m.Any("/user/publickey/list", user.ListPublicKey) | 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) | m.Any("/repo/list", repo.List) | ||||
listenAddr := fmt.Sprintf("%s:%s", | listenAddr := fmt.Sprintf("%s:%s", | ||||