@@ -5,6 +5,7 @@ gogs | |||
*.db | |||
*.log | |||
custom/ | |||
data/ | |||
.vendor/ | |||
.idea/ | |||
*.iml |
@@ -72,6 +72,33 @@ INTERVAL = 60 | |||
; memcache: "127.0.0.1:11211" | |||
HOST = | |||
[session] | |||
; Either "memory", "file", "redis" or "mysql", default is "memory" | |||
PROVIDER = file | |||
; provider config | |||
; memory: not have any config yet | |||
; file: session file path | |||
; e.g. tmp/sessions | |||
; redis: config like redis server addr,poolSize,password | |||
; e.g. 127.0.0.1:6379,100,astaxie | |||
; mysql: go-sql-driver/mysql dsn config string | |||
; e.g. root:password@/session_table | |||
PROVIDER_CONFIG = data/sessions | |||
; session cookie name | |||
COOKIE_NAME = i_like_gogits | |||
; if you use session in https only, default is false | |||
COOKIE_SECURE = false | |||
; enable set cookie, default is true | |||
ENABLE_SET_COOKIE = true | |||
; session gc time interval, default is 86400 | |||
GC_INTERVAL_TIME = 86400 | |||
; session life time, default is 86400 | |||
SESSION_LIFE_TIME = 86400 | |||
; session id hash func, default is sha1 | |||
SESSION_ID_HASHFUNC = sha1 | |||
; session hash key, default is use random string | |||
SESSION_ID_HASHKEY = | |||
[picture] | |||
; The place to picture data, either "server" or "qiniu", default is "server" | |||
SERVICE = server | |||
@@ -9,7 +9,8 @@ import ( | |||
"reflect" | |||
"github.com/codegangsta/martini" | |||
"github.com/martini-contrib/sessions" | |||
"github.com/gogits/session" | |||
"github.com/gogits/binding" | |||
@@ -19,7 +20,7 @@ import ( | |||
) | |||
// SignedInId returns the id of signed in user. | |||
func SignedInId(session sessions.Session) int64 { | |||
func SignedInId(session session.SessionStore) int64 { | |||
userId := session.Get("userId") | |||
if userId == nil { | |||
return 0 | |||
@@ -34,7 +35,7 @@ func SignedInId(session sessions.Session) int64 { | |||
} | |||
// SignedInName returns the name of signed in user. | |||
func SignedInName(session sessions.Session) string { | |||
func SignedInName(session session.SessionStore) string { | |||
userName := session.Get("userName") | |||
if userName == nil { | |||
return "" | |||
@@ -46,7 +47,7 @@ func SignedInName(session sessions.Session) string { | |||
} | |||
// SignedInUser returns the user object of signed user. | |||
func SignedInUser(session sessions.Session) *models.User { | |||
func SignedInUser(session session.SessionStore) *models.User { | |||
id := SignedInId(session) | |||
if id <= 0 { | |||
return nil | |||
@@ -61,7 +62,7 @@ func SignedInUser(session sessions.Session) *models.User { | |||
} | |||
// IsSignedIn check if any user has signed in. | |||
func IsSignedIn(session sessions.Session) bool { | |||
func IsSignedIn(session session.SessionStore) bool { | |||
return SignedInId(session) > 0 | |||
} | |||
@@ -16,6 +16,7 @@ import ( | |||
"github.com/Unknwon/goconfig" | |||
"github.com/gogits/cache" | |||
"github.com/gogits/session" | |||
"github.com/gogits/gogs/modules/log" | |||
) | |||
@@ -49,6 +50,10 @@ var ( | |||
LogMode string | |||
LogConfig string | |||
SessionProvider string | |||
SessionConfig *session.Config | |||
SessionManager *session.Manager | |||
) | |||
var Service struct { | |||
@@ -164,6 +169,30 @@ func newCacheService() { | |||
log.Info("Cache Service Enabled") | |||
} | |||
func newSessionService() { | |||
SessionProvider = Cfg.MustValue("session", "PROVIDER", "memory") | |||
SessionConfig = new(session.Config) | |||
SessionConfig.ProviderConfig = Cfg.MustValue("session", "PROVIDER_CONFIG") | |||
SessionConfig.CookieName = Cfg.MustValue("session", "COOKIE_NAME", "i_like_gogits") | |||
SessionConfig.CookieSecure = Cfg.MustBool("session", "COOKIE_SECURE") | |||
SessionConfig.EnableSetCookie = Cfg.MustBool("session", "ENABLE_SET_COOKIE", true) | |||
SessionConfig.GcIntervalTime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400) | |||
SessionConfig.SessionLifeTime = Cfg.MustInt64("session", "SESSION_LIFE_TIME", 86400) | |||
SessionConfig.SessionIDHashFunc = Cfg.MustValue("session", "SESSION_ID_HASHFUNC", "sha1") | |||
SessionConfig.SessionIDHashKey = Cfg.MustValue("session", "SESSION_ID_HASHKEY") | |||
var err error | |||
SessionManager, err = session.NewManager(SessionProvider, *SessionConfig) | |||
if err != nil { | |||
fmt.Printf("Init session system failed, provider: %s, %v\n", | |||
SessionProvider, err) | |||
os.Exit(2) | |||
} | |||
log.Info("Session Service Enabled") | |||
} | |||
func newMailService() { | |||
// Check mailer setting. | |||
if Cfg.MustBool("mailer", "ENABLED") { | |||
@@ -234,6 +263,7 @@ func NewServices() { | |||
newService() | |||
newLogService() | |||
newCacheService() | |||
newSessionService() | |||
newMailService() | |||
newRegisterMailService() | |||
} |
@@ -10,9 +10,9 @@ import ( | |||
"time" | |||
"github.com/codegangsta/martini" | |||
"github.com/martini-contrib/sessions" | |||
"github.com/gogits/cache" | |||
"github.com/gogits/session" | |||
"github.com/gogits/gogs/models" | |||
"github.com/gogits/gogs/modules/auth" | |||
@@ -27,7 +27,7 @@ type Context struct { | |||
p martini.Params | |||
Req *http.Request | |||
Res http.ResponseWriter | |||
Session sessions.Session | |||
Session session.SessionStore | |||
Cache cache.Cache | |||
User *models.User | |||
IsSigned bool | |||
@@ -92,21 +92,25 @@ func (ctx *Context) Handle(status int, title string, err error) { | |||
// InitContext initializes a classic context for a request. | |||
func InitContext() martini.Handler { | |||
return func(res http.ResponseWriter, r *http.Request, c martini.Context, | |||
session sessions.Session, rd *Render) { | |||
return func(res http.ResponseWriter, r *http.Request, c martini.Context, rd *Render) { | |||
ctx := &Context{ | |||
c: c, | |||
// p: p, | |||
Req: r, | |||
Res: res, | |||
Session: session, | |||
Cache: base.Cache, | |||
Render: rd, | |||
Req: r, | |||
Res: res, | |||
Cache: base.Cache, | |||
Render: rd, | |||
} | |||
// start session | |||
ctx.Session = base.SessionManager.SessionStart(res, r) | |||
defer func() { | |||
ctx.Session.SessionRelease(res) | |||
}() | |||
// Get user from session if logined. | |||
user := auth.SignedInUser(session) | |||
user := auth.SignedInUser(ctx.Session) | |||
ctx.User = user | |||
ctx.IsSigned = user != nil | |||
@@ -88,7 +88,7 @@ func SignIn(ctx *middleware.Context, form auth.LogInForm) { | |||
user, err := models.LoginUserPlain(form.UserName, form.Password) | |||
if err != nil { | |||
if err.Error() == models.ErrUserNotExist.Error() { | |||
if err == models.ErrUserNotExist { | |||
ctx.RenderWithErr("Username or password is not correct", "user/signin", &form) | |||
return | |||
} | |||
@@ -12,7 +12,6 @@ import ( | |||
"github.com/codegangsta/cli" | |||
"github.com/codegangsta/martini" | |||
"github.com/martini-contrib/sessions" | |||
"github.com/gogits/binding" | |||
@@ -81,10 +80,6 @@ func runWeb(*cli.Context) { | |||
// Middlewares. | |||
m.Use(middleware.Renderer(middleware.RenderOptions{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()) | |||
reqSignIn := middleware.SignInRequire(true) | |||