123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- package sessions
- import (
- "time"
- "github.com/iris-contrib/go.uuid"
- )
- const (
- // DefaultCookieName the secret cookie's name for sessions
- DefaultCookieName = "irissessionid"
- )
- // Encoding is the Cookie Encoder/Decoder interface, which can be passed as configuration field
- // alternatively to the `Encode` and `Decode` fields.
- type Encoding interface {
- // Encode the cookie value if not nil.
- // Should accept as first argument the cookie name (config.Name)
- // as second argument the server's generated session id.
- // Should return the new session id, if error the session id setted to empty which is invalid.
- //
- // Note: Errors are not printed, so you have to know what you're doing,
- // and remember: if you use AES it only supports key sizes of 16, 24 or 32 bytes.
- // You either need to provide exactly that amount or you derive the key from what you type in.
- //
- // Defaults to nil
- Encode(cookieName string, value interface{}) (string, error)
- // Decode the cookie value if not nil.
- // Should accept as first argument the cookie name (config.Name)
- // as second second accepts the client's cookie value (the encoded session id).
- // Should return an error if decode operation failed.
- //
- // Note: Errors are not printed, so you have to know what you're doing,
- // and remember: if you use AES it only supports key sizes of 16, 24 or 32 bytes.
- // You either need to provide exactly that amount or you derive the key from what you type in.
- //
- // Defaults to nil
- Decode(cookieName string, cookieValue string, v interface{}) error
- }
- type (
- // Config is the configuration for sessions. Please read it before using sessions.
- Config struct {
- // Cookie string, the session's client cookie name, for example: "mysessionid"
- //
- // Defaults to "irissessionid".
- Cookie string
- // CookieSecureTLS set to true if server is running over TLS
- // and you need the session's cookie "Secure" field to be setted true.
- //
- // Note: The user should fill the Decode configuation field in order for this to work.
- // Recommendation: You don't need this to be setted to true, just fill the Encode and Decode fields
- // with a third-party library like secure cookie, example is provided at the _examples folder.
- //
- // Defaults to false.
- CookieSecureTLS bool
- // AllowReclaim will allow to
- // Destroy and Start a session in the same request handler.
- // All it does is that it removes the cookie for both `Request` and `ResponseWriter` while `Destroy`
- // or add a new cookie to `Request` while `Start`.
- //
- // Defaults to false.
- AllowReclaim bool
- // Encode the cookie value if not nil.
- // Should accept as first argument the cookie name (config.Cookie)
- // as second argument the server's generated session id.
- // Should return the new session id, if error the session id setted to empty which is invalid.
- //
- // Note: Errors are not printed, so you have to know what you're doing,
- // and remember: if you use AES it only supports key sizes of 16, 24 or 32 bytes.
- // You either need to provide exactly that amount or you derive the key from what you type in.
- //
- // Defaults to nil.
- Encode func(cookieName string, value interface{}) (string, error)
- // Decode the cookie value if not nil.
- // Should accept as first argument the cookie name (config.Cookie)
- // as second second accepts the client's cookie value (the encoded session id).
- // Should return an error if decode operation failed.
- //
- // Note: Errors are not printed, so you have to know what you're doing,
- // and remember: if you use AES it only supports key sizes of 16, 24 or 32 bytes.
- // You either need to provide exactly that amount or you derive the key from what you type in.
- //
- // Defaults to nil.
- Decode func(cookieName string, cookieValue string, v interface{}) error
- // Encoding same as Encode and Decode but receives a single instance which
- // completes the "CookieEncoder" interface, `Encode` and `Decode` functions.
- //
- // Defaults to nil.
- Encoding Encoding
- // Expires the duration of which the cookie must expires (created_time.Add(Expires)).
- // If you want to delete the cookie when the browser closes, set it to -1.
- //
- // 0 means no expire, (24 years)
- // -1 means when browser closes
- // > 0 is the time.Duration which the session cookies should expire.
- //
- // Defaults to infinitive/unlimited life duration(0).
- Expires time.Duration
- // SessionIDGenerator should returns a random session id.
- // By default we will use a uuid impl package to generate
- // that, but developers can change that with simple assignment.
- SessionIDGenerator func() string
- // DisableSubdomainPersistence set it to true in order dissallow your subdomains to have access to the session cookie
- //
- // Defaults to false.
- DisableSubdomainPersistence bool
- }
- )
- // Validate corrects missing fields configuration fields and returns the right configuration
- func (c Config) Validate() Config {
- if c.Cookie == "" {
- c.Cookie = DefaultCookieName
- }
- if c.SessionIDGenerator == nil {
- c.SessionIDGenerator = func() string {
- id, _ := uuid.NewV4()
- return id.String()
- }
- }
- if c.Encoding != nil {
- c.Encode = c.Encoding.Encode
- c.Decode = c.Encoding.Decode
- }
- return c
- }
|