update session
This commit is contained in:
		
							parent
							
								
									0d1872ebe3
								
							
						
					
					
						commit
						f9c07c4186
					
				
					 7 changed files with 79 additions and 21 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -5,6 +5,7 @@ gogs
 | 
			
		|||
*.db
 | 
			
		||||
*.log
 | 
			
		||||
custom/
 | 
			
		||||
data/
 | 
			
		||||
.vendor/
 | 
			
		||||
.idea/
 | 
			
		||||
*.iml
 | 
			
		||||
							
								
								
									
										27
									
								
								conf/app.ini
									
										
									
									
									
								
							
							
						
						
									
										27
									
								
								conf/app.ini
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								web.go
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								web.go
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue