gitea源码

session.go 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package setting
  4. import (
  5. "net/http"
  6. "path/filepath"
  7. "strings"
  8. "code.gitea.io/gitea/modules/json"
  9. "code.gitea.io/gitea/modules/log"
  10. )
  11. // SessionConfig defines Session settings
  12. var SessionConfig = struct {
  13. OriginalProvider string
  14. Provider string
  15. // Provider configuration, it's corresponding to provider.
  16. ProviderConfig string
  17. // Cookie name to save session ID. Default is "MacaronSession".
  18. CookieName string
  19. // Cookie path to store. Default is "/".
  20. CookiePath string
  21. // GC interval time in seconds. Default is 3600.
  22. Gclifetime int64
  23. // Max life time in seconds. Default is whatever GC interval time is.
  24. Maxlifetime int64
  25. // Use HTTPS only. Default is false.
  26. Secure bool
  27. // Cookie domain name. Default is empty.
  28. Domain string
  29. // SameSite declares if your cookie should be restricted to a first-party or same-site context. Valid strings are "none", "lax", "strict". Default is "lax"
  30. SameSite http.SameSite
  31. }{
  32. CookieName: "i_like_gitea",
  33. Gclifetime: 86400,
  34. Maxlifetime: 86400,
  35. SameSite: http.SameSiteLaxMode,
  36. }
  37. func loadSessionFrom(rootCfg ConfigProvider) {
  38. sec := rootCfg.Section("session")
  39. SessionConfig.Provider = sec.Key("PROVIDER").In("memory",
  40. []string{"memory", "file", "redis", "mysql", "postgres", "couchbase", "memcache", "db"})
  41. SessionConfig.ProviderConfig = strings.Trim(sec.Key("PROVIDER_CONFIG").MustString(filepath.Join(AppDataPath, "sessions")), "\" ")
  42. if SessionConfig.Provider == "file" && !filepath.IsAbs(SessionConfig.ProviderConfig) {
  43. SessionConfig.ProviderConfig = filepath.Join(AppWorkPath, SessionConfig.ProviderConfig)
  44. checkOverlappedPath("[session].PROVIDER_CONFIG", SessionConfig.ProviderConfig)
  45. }
  46. SessionConfig.CookieName = sec.Key("COOKIE_NAME").MustString("i_like_gitea")
  47. SessionConfig.CookiePath = AppSubURL
  48. if SessionConfig.CookiePath == "" {
  49. SessionConfig.CookiePath = "/"
  50. }
  51. SessionConfig.Secure = sec.Key("COOKIE_SECURE").MustBool(strings.HasPrefix(strings.ToLower(AppURL), "https://"))
  52. SessionConfig.Gclifetime = sec.Key("GC_INTERVAL_TIME").MustInt64(86400)
  53. SessionConfig.Maxlifetime = sec.Key("SESSION_LIFE_TIME").MustInt64(86400)
  54. SessionConfig.Domain = sec.Key("DOMAIN").String()
  55. samesiteString := sec.Key("SAME_SITE").In("lax", []string{"none", "lax", "strict"})
  56. switch strings.ToLower(samesiteString) {
  57. case "none":
  58. SessionConfig.SameSite = http.SameSiteNoneMode
  59. case "strict":
  60. SessionConfig.SameSite = http.SameSiteStrictMode
  61. default:
  62. SessionConfig.SameSite = http.SameSiteLaxMode
  63. }
  64. shadowConfig, err := json.Marshal(SessionConfig)
  65. if err != nil {
  66. log.Fatal("Can't shadow session config: %v", err)
  67. }
  68. SessionConfig.ProviderConfig = string(shadowConfig)
  69. SessionConfig.OriginalProvider = SessionConfig.Provider
  70. SessionConfig.Provider = "VirtualSession"
  71. }