github.com/gofiber/fiber/v2@v2.47.0/middleware/session/config.go (about)

     1  package session
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  	"time"
     8  
     9  	"github.com/gofiber/fiber/v2"
    10  	"github.com/gofiber/fiber/v2/utils"
    11  )
    12  
    13  // Config defines the config for middleware.
    14  type Config struct {
    15  	// Allowed session duration
    16  	// Optional. Default value 24 * time.Hour
    17  	Expiration time.Duration
    18  
    19  	// Storage interface to store the session data
    20  	// Optional. Default value memory.New()
    21  	Storage fiber.Storage
    22  
    23  	// KeyLookup is a string in the form of "<source>:<name>" that is used
    24  	// to extract session id from the request.
    25  	// Possible values: "header:<name>", "query:<name>" or "cookie:<name>"
    26  	// Optional. Default value "cookie:session_id".
    27  	KeyLookup string
    28  
    29  	// Domain of the CSRF cookie.
    30  	// Optional. Default value "".
    31  	CookieDomain string
    32  
    33  	// Path of the CSRF cookie.
    34  	// Optional. Default value "".
    35  	CookiePath string
    36  
    37  	// Indicates if CSRF cookie is secure.
    38  	// Optional. Default value false.
    39  	CookieSecure bool
    40  
    41  	// Indicates if CSRF cookie is HTTP only.
    42  	// Optional. Default value false.
    43  	CookieHTTPOnly bool
    44  
    45  	// Value of SameSite cookie.
    46  	// Optional. Default value "Lax".
    47  	CookieSameSite string
    48  
    49  	// Decides whether cookie should last for only the browser sesison.
    50  	// Ignores Expiration if set to true
    51  	// Optional. Default value false.
    52  	CookieSessionOnly bool
    53  
    54  	// KeyGenerator generates the session key.
    55  	// Optional. Default value utils.UUIDv4
    56  	KeyGenerator func() string
    57  
    58  	// Deprecated: Please use KeyLookup
    59  	CookieName string
    60  
    61  	// Source defines where to obtain the session id
    62  	source Source
    63  
    64  	// The session name
    65  	sessionName string
    66  }
    67  
    68  type Source string
    69  
    70  const (
    71  	SourceCookie   Source = "cookie"
    72  	SourceHeader   Source = "header"
    73  	SourceURLQuery Source = "query"
    74  )
    75  
    76  // ConfigDefault is the default config
    77  var ConfigDefault = Config{
    78  	Expiration:   24 * time.Hour,
    79  	KeyLookup:    "cookie:session_id",
    80  	KeyGenerator: utils.UUIDv4,
    81  	source:       "cookie",
    82  	sessionName:  "session_id",
    83  }
    84  
    85  // Helper function to set default values
    86  func configDefault(config ...Config) Config {
    87  	// Return default config if nothing provided
    88  	if len(config) < 1 {
    89  		return ConfigDefault
    90  	}
    91  
    92  	// Override default config
    93  	cfg := config[0]
    94  
    95  	// Set default values
    96  	if int(cfg.Expiration.Seconds()) <= 0 {
    97  		cfg.Expiration = ConfigDefault.Expiration
    98  	}
    99  	if cfg.CookieName != "" {
   100  		log.Printf("[Warning] - [SESSION] CookieName is deprecated, please use KeyLookup\n")
   101  		cfg.KeyLookup = fmt.Sprintf("cookie:%s", cfg.CookieName)
   102  	}
   103  	if cfg.KeyLookup == "" {
   104  		cfg.KeyLookup = ConfigDefault.KeyLookup
   105  	}
   106  	if cfg.KeyGenerator == nil {
   107  		cfg.KeyGenerator = ConfigDefault.KeyGenerator
   108  	}
   109  
   110  	selectors := strings.Split(cfg.KeyLookup, ":")
   111  	const numSelectors = 2
   112  	if len(selectors) != numSelectors {
   113  		panic("[session] KeyLookup must in the form of <source>:<name>")
   114  	}
   115  	switch Source(selectors[0]) {
   116  	case SourceCookie:
   117  		cfg.source = SourceCookie
   118  	case SourceHeader:
   119  		cfg.source = SourceHeader
   120  	case SourceURLQuery:
   121  		cfg.source = SourceURLQuery
   122  	default:
   123  		panic("[session] source is not supported")
   124  	}
   125  	cfg.sessionName = selectors[1]
   126  
   127  	return cfg
   128  }