Skip to content

Commit 8a15144

Browse files
committed
.
1 parent 628a56b commit 8a15144

5 files changed

+446
-39
lines changed

pkg/build_info.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,5 @@ var (
3333

3434
const (
3535
// VERSION represent Bhojpur Session - Application Framework version.
36-
VERSION = "0.0.1"
36+
VERSION = "0.0.2"
3737
)

pkg/engine/server.go

+22-38
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ package engine
2222

2323
// Usage:
2424
// import(
25-
// "github.com/bhojpur/session/pkg/engine"
25+
// session "github.com/bhojpur/session/pkg/engine"
2626
// )
2727
//
2828
// func init() {
@@ -47,12 +47,12 @@ import (
4747

4848
// Store contains all data for one session process with specific id.
4949
type Store interface {
50-
Set(ctx context.Context, key, value interface{}) error //set session value
51-
Get(ctx context.Context, key interface{}) interface{} //get session value
52-
Delete(ctx context.Context, key interface{}) error //delete session value
53-
SessionID(ctx context.Context) string //back current sessionID
50+
Set(ctx context.Context, key, value interface{}) error // set session value
51+
Get(ctx context.Context, key interface{}) interface{} // get session value
52+
Delete(ctx context.Context, key interface{}) error // delete session value
53+
SessionID(ctx context.Context) string // back current sessionID
5454
SessionRelease(ctx context.Context, w http.ResponseWriter) // release the resource & save data to provider & return the data
55-
Flush(ctx context.Context) error //delete all data
55+
Flush(ctx context.Context) error // delete all data
5656
}
5757

5858
// Provider contains global session methods and saved SessionStores.
@@ -63,7 +63,7 @@ type Provider interface {
6363
SessionExist(ctx context.Context, sid string) (bool, error)
6464
SessionRegenerate(ctx context.Context, oldsid, sid string) (Store, error)
6565
SessionDestroy(ctx context.Context, sid string) error
66-
SessionAll(ctx context.Context) int //get all active session
66+
SessionAll(ctx context.Context) int // get all active session
6767
SessionGC(ctx context.Context)
6868
}
6969

@@ -73,45 +73,23 @@ var provides = make(map[string]Provider)
7373
var SLogger = NewSessionLog(os.Stderr)
7474

7575
// Register makes a session provide available by the provided name.
76-
// If Register is called twice with the same name or if driver is nil,
77-
// it panics.
76+
// If provider is nil, it panic
7877
func Register(name string, provide Provider) {
7978
if provide == nil {
80-
panic("session: Register provider is nil")
81-
}
82-
if _, dup := provides[name]; dup {
83-
panic("session: Register called twice for provider " + name)
79+
panic("session: Register provide is nil")
8480
}
8581
provides[name] = provide
8682
}
8783

88-
//GetProvider
84+
// GetProvider
8985
func GetProvider(name string) (Provider, error) {
9086
provider, ok := provides[name]
9187
if !ok {
92-
return nil, fmt.Errorf("session: unknown provider %q (forgotten import?)", name)
88+
return nil, fmt.Errorf("session: unknown provide %q (forgotten import?)", name)
9389
}
9490
return provider, nil
9591
}
9692

97-
// ManagerConfig define the session config
98-
type ManagerConfig struct {
99-
CookieName string `json:"cookieName"`
100-
EnableSetCookie bool `json:"enableSetCookie,omitempty"`
101-
Gclifetime int64 `json:"gclifetime"`
102-
Maxlifetime int64 `json:"maxLifetime"`
103-
DisableHTTPOnly bool `json:"disableHTTPOnly"`
104-
Secure bool `json:"secure"`
105-
CookieLifeTime int `json:"cookieLifeTime"`
106-
ProviderConfig string `json:"providerConfig"`
107-
Domain string `json:"domain"`
108-
SessionIDLength int64 `json:"sessionIDLength"`
109-
EnableSidInHTTPHeader bool `json:"EnableSidInHTTPHeader"`
110-
SessionNameInHTTPHeader string `json:"SessionNameInHTTPHeader"`
111-
EnableSidInURLQuery bool `json:"EnableSidInURLQuery"`
112-
SessionIDPrefix string `json:"sessionIDPrefix"`
113-
}
114-
11593
// Manager contains Provider and its configuration.
11694
type Manager struct {
11795
provider Provider
@@ -133,7 +111,7 @@ type Manager struct {
133111
func NewManager(provideName string, cf *ManagerConfig) (*Manager, error) {
134112
provider, ok := provides[provideName]
135113
if !ok {
136-
return nil, fmt.Errorf("session: unknown provider %q (forgotten import?)", provideName)
114+
return nil, fmt.Errorf("session: unknown provide %q (forgotten import?)", provideName)
137115
}
138116

139117
if cf.Maxlifetime == 0 {
@@ -242,6 +220,7 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se
242220
HttpOnly: !manager.config.DisableHTTPOnly,
243221
Secure: manager.isSecure(r),
244222
Domain: manager.config.Domain,
223+
SameSite: manager.config.CookieSameSite,
245224
}
246225
if manager.config.CookieLifeTime > 0 {
247226
cookie.MaxAge = manager.config.CookieLifeTime
@@ -276,12 +255,15 @@ func (manager *Manager) SessionDestroy(w http.ResponseWriter, r *http.Request) {
276255
manager.provider.SessionDestroy(nil, sid)
277256
if manager.config.EnableSetCookie {
278257
expiration := time.Now()
279-
cookie = &http.Cookie{Name: manager.config.CookieName,
258+
cookie = &http.Cookie{
259+
Name: manager.config.CookieName,
280260
Path: "/",
281261
HttpOnly: !manager.config.DisableHTTPOnly,
282262
Expires: expiration,
283263
MaxAge: -1,
284-
Domain: manager.config.Domain}
264+
Domain: manager.config.Domain,
265+
SameSite: manager.config.CookieSameSite,
266+
}
285267

286268
http.SetCookie(w, cookie)
287269
}
@@ -311,17 +293,19 @@ func (manager *Manager) SessionRegenerateID(w http.ResponseWriter, r *http.Reque
311293

312294
cookie, err := r.Cookie(manager.config.CookieName)
313295
if err != nil || cookie.Value == "" {
314-
//delete old cookie
296+
// delete old cookie
315297
session, err = manager.provider.SessionRead(nil, sid)
316298
if err != nil {
317299
return nil, err
318300
}
319-
cookie = &http.Cookie{Name: manager.config.CookieName,
301+
cookie = &http.Cookie{
302+
Name: manager.config.CookieName,
320303
Value: url.QueryEscape(sid),
321304
Path: "/",
322305
HttpOnly: !manager.config.DisableHTTPOnly,
323306
Secure: manager.isSecure(r),
324307
Domain: manager.config.Domain,
308+
SameSite: manager.config.CookieSameSite,
325309
}
326310
} else {
327311
oldsid, err := url.QueryUnescape(cookie.Value)

pkg/engine/session_config.go

+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package engine
2+
3+
import "net/http"
4+
5+
// ManagerConfig define the session config
6+
type ManagerConfig struct {
7+
EnableSetCookie bool `json:"enableSetCookie,omitempty"`
8+
DisableHTTPOnly bool `json:"disableHTTPOnly"`
9+
Secure bool `json:"secure"`
10+
EnableSidInHTTPHeader bool `json:"EnableSidInHTTPHeader"`
11+
EnableSidInURLQuery bool `json:"EnableSidInURLQuery"`
12+
CookieName string `json:"cookieName"`
13+
Gclifetime int64 `json:"gclifetime"`
14+
Maxlifetime int64 `json:"maxLifetime"`
15+
CookieLifeTime int `json:"cookieLifeTime"`
16+
ProviderConfig string `json:"providerConfig"`
17+
Domain string `json:"domain"`
18+
SessionIDLength int64 `json:"sessionIDLength"`
19+
SessionNameInHTTPHeader string `json:"SessionNameInHTTPHeader"`
20+
SessionIDPrefix string `json:"sessionIDPrefix"`
21+
CookieSameSite http.SameSite `json:"cookieSameSite"`
22+
}
23+
24+
func (c *ManagerConfig) Opts(opts ...ManagerConfigOpt) {
25+
for _, opt := range opts {
26+
opt(c)
27+
}
28+
}
29+
30+
type ManagerConfigOpt func(config *ManagerConfig)
31+
32+
func NewManagerConfig(opts ...ManagerConfigOpt) *ManagerConfig {
33+
config := &ManagerConfig{}
34+
for _, opt := range opts {
35+
opt(config)
36+
}
37+
return config
38+
}
39+
40+
// CfgCookieName set key of session id
41+
func CfgCookieName(cookieName string) ManagerConfigOpt {
42+
return func(config *ManagerConfig) {
43+
config.CookieName = cookieName
44+
}
45+
}
46+
47+
// CfgCookieName set len of session id
48+
func CfgSessionIdLength(length int64) ManagerConfigOpt {
49+
return func(config *ManagerConfig) {
50+
config.SessionIDLength = length
51+
}
52+
}
53+
54+
// CfgSessionIdPrefix set prefix of session id
55+
func CfgSessionIdPrefix(prefix string) ManagerConfigOpt {
56+
return func(config *ManagerConfig) {
57+
config.SessionIDPrefix = prefix
58+
}
59+
}
60+
61+
// CfgSetCookie whether set `Set-Cookie` header in HTTP response
62+
func CfgSetCookie(enable bool) ManagerConfigOpt {
63+
return func(config *ManagerConfig) {
64+
config.EnableSetCookie = enable
65+
}
66+
}
67+
68+
// CfgGcLifeTime set session gc lift time
69+
func CfgGcLifeTime(lifeTime int64) ManagerConfigOpt {
70+
return func(config *ManagerConfig) {
71+
config.Gclifetime = lifeTime
72+
}
73+
}
74+
75+
// CfgMaxLifeTime set session lift time
76+
func CfgMaxLifeTime(lifeTime int64) ManagerConfigOpt {
77+
return func(config *ManagerConfig) {
78+
config.Maxlifetime = lifeTime
79+
}
80+
}
81+
82+
// CfgGcLifeTime set session lift time
83+
func CfgCookieLifeTime(lifeTime int) ManagerConfigOpt {
84+
return func(config *ManagerConfig) {
85+
config.CookieLifeTime = lifeTime
86+
}
87+
}
88+
89+
// CfgProviderConfig configure session provider
90+
func CfgProviderConfig(providerConfig string) ManagerConfigOpt {
91+
return func(config *ManagerConfig) {
92+
config.ProviderConfig = providerConfig
93+
}
94+
}
95+
96+
// CfgDomain set cookie domain
97+
func CfgDomain(domain string) ManagerConfigOpt {
98+
return func(config *ManagerConfig) {
99+
config.Domain = domain
100+
}
101+
}
102+
103+
// CfgSessionIdInHTTPHeader enable session id in http header
104+
func CfgSessionIdInHTTPHeader(enable bool) ManagerConfigOpt {
105+
return func(config *ManagerConfig) {
106+
config.EnableSidInHTTPHeader = enable
107+
}
108+
}
109+
110+
// CfgSetSessionNameInHTTPHeader set key of session id in http header
111+
func CfgSetSessionNameInHTTPHeader(name string) ManagerConfigOpt {
112+
return func(config *ManagerConfig) {
113+
config.SessionNameInHTTPHeader = name
114+
}
115+
}
116+
117+
// EnableSidInURLQuery enable session id in query string
118+
func CfgEnableSidInURLQuery(enable bool) ManagerConfigOpt {
119+
return func(config *ManagerConfig) {
120+
config.EnableSidInURLQuery = enable
121+
}
122+
}
123+
124+
// DisableHTTPOnly set HTTPOnly for http.Cookie
125+
func CfgHTTPOnly(HTTPOnly bool) ManagerConfigOpt {
126+
return func(config *ManagerConfig) {
127+
config.DisableHTTPOnly = !HTTPOnly
128+
}
129+
}
130+
131+
// CfgSecure set Secure for http.Cookie
132+
func CfgSecure(Enable bool) ManagerConfigOpt {
133+
return func(config *ManagerConfig) {
134+
config.Secure = Enable
135+
}
136+
}
137+
138+
// CfgSameSite set http.SameSite
139+
func CfgSameSite(sameSite http.SameSite) ManagerConfigOpt {
140+
return func(config *ManagerConfig) {
141+
config.CookieSameSite = sameSite
142+
}
143+
}

0 commit comments

Comments
 (0)