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…
	
		Reference in a new issue