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