Skip to content

Commit 14394c8

Browse files
committed
Fix issue with SameSite in session config being a http.SameSiteMode
Signed-off-by: Andrew Thornton <[email protected]>
1 parent 28d8709 commit 14394c8

File tree

9 files changed

+43
-55
lines changed

9 files changed

+43
-55
lines changed

modules/auth/sso/sso.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore
135135
setting.SessionConfig.Domain,
136136
setting.SessionConfig.Secure,
137137
true,
138-
middleware.SameSiteString(setting.SessionConfig.SameSite))
138+
middleware.SameSite(setting.SessionConfig.SameSite))
139139

140140
// Clear whatever CSRF has right now, force to generate a new one
141141
middleware.SetCookie(resp, setting.CSRFCookieName, "",
@@ -144,5 +144,5 @@ func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore
144144
setting.SessionConfig.Domain,
145145
setting.SessionConfig.Secure,
146146
true,
147-
middleware.SameSiteString(setting.SessionConfig.SameSite))
147+
middleware.SameSite(setting.SessionConfig.SameSite))
148148
}

modules/context/auth.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
package context
77

88
import (
9+
"net/http"
10+
911
"code.gitea.io/gitea/models"
1012
"code.gitea.io/gitea/modules/log"
1113
"code.gitea.io/gitea/modules/setting"
@@ -45,7 +47,7 @@ func Toggle(options *ToggleOptions) func(ctx *Context) {
4547
ctx.SetCookie("redirect_to", setting.AppSubURL+ctx.Req.URL.RequestURI(),
4648
0,
4749
setting.AppSubURL,
48-
middleware.SameSiteString("lax")) // TODO: I think this is correct!
50+
middleware.SameSite(http.SameSiteLaxMode)) // TODO: I think this is correct!
4951
}
5052
ctx.Redirect(setting.AppSubURL + "/user/settings/change_password")
5153
return
@@ -76,7 +78,7 @@ func Toggle(options *ToggleOptions) func(ctx *Context) {
7678
ctx.SetCookie("redirect_to", setting.AppSubURL+ctx.Req.URL.RequestURI(),
7779
0,
7880
setting.AppSubURL,
79-
middleware.SameSiteString("lax")) // TODO: I think this is correct!
81+
middleware.SameSite(http.SameSiteLaxMode)) // TODO: I think this is correct!
8082
}
8183
ctx.Redirect(setting.AppSubURL + "/user/login")
8284
return
@@ -94,7 +96,7 @@ func Toggle(options *ToggleOptions) func(ctx *Context) {
9496
ctx.SetCookie("redirect_to", setting.AppSubURL+ctx.Req.URL.RequestURI(),
9597
0,
9698
setting.AppSubURL,
97-
middleware.SameSiteString("lax")) // TODO: I think this is correct!
99+
middleware.SameSite(http.SameSiteLaxMode)) // TODO: I think this is correct!
98100
}
99101
ctx.Redirect(setting.AppSubURL + "/user/login")
100102
return

modules/context/context.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -524,14 +524,6 @@ func SignedUserName(req *http.Request) string {
524524
}
525525

526526
func getCsrfOpts() CsrfOptions {
527-
sameSite := http.SameSiteStrictMode
528-
switch strings.ToLower(setting.SessionConfig.SameSite) {
529-
case "none":
530-
sameSite = http.SameSiteNoneMode
531-
case "lax":
532-
sameSite = http.SameSiteLaxMode
533-
}
534-
535527
return CsrfOptions{
536528
Secret: setting.SecretKey,
537529
Cookie: setting.CSRFCookieName,
@@ -541,7 +533,7 @@ func getCsrfOpts() CsrfOptions {
541533
Header: "X-Csrf-Token",
542534
CookieDomain: setting.SessionConfig.Domain,
543535
CookiePath: setting.SessionConfig.CookiePath,
544-
SameSite: sameSite,
536+
SameSite: setting.SessionConfig.SameSite,
545537
}
546538
}
547539

@@ -606,7 +598,7 @@ func Contexter() func(next http.Handler) http.Handler {
606598
middleware.Domain(setting.SessionConfig.Domain),
607599
middleware.HTTPOnly(true),
608600
middleware.Secure(setting.SessionConfig.Secure),
609-
middleware.SameSiteString(setting.SessionConfig.SameSite),
601+
middleware.SameSite(setting.SessionConfig.SameSite),
610602
)
611603
return
612604
}
@@ -616,7 +608,7 @@ func Contexter() func(next http.Handler) http.Handler {
616608
middleware.Domain(setting.SessionConfig.Domain),
617609
middleware.HTTPOnly(true),
618610
middleware.Secure(setting.SessionConfig.Secure),
619-
middleware.SameSiteString(setting.SessionConfig.SameSite),
611+
middleware.SameSite(setting.SessionConfig.SameSite),
620612
)
621613
})
622614

modules/setting/session.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package setting
66

77
import (
8+
"net/http"
89
"path"
910
"path/filepath"
1011
"strings"
@@ -32,12 +33,12 @@ var (
3233
// Cookie domain name. Default is empty.
3334
Domain string
3435
// SameSite declares if your cookie should be restricted to a first-party or same-site context. Valid strings are "none", "lax", "strict". Default is "strict"
35-
SameSite string
36+
SameSite http.SameSite
3637
}{
3738
CookieName: "i_like_gitea",
3839
Gclifetime: 86400,
3940
Maxlifetime: 86400,
40-
SameSite: "strict",
41+
SameSite: http.SameSiteStrictMode,
4142
}
4243
)
4344

@@ -55,7 +56,15 @@ func newSessionService() {
5556
SessionConfig.Gclifetime = sec.Key("GC_INTERVAL_TIME").MustInt64(86400)
5657
SessionConfig.Maxlifetime = sec.Key("SESSION_LIFE_TIME").MustInt64(86400)
5758
SessionConfig.Domain = sec.Key("DOMAIN").String()
58-
SessionConfig.SameSite = sec.Key("SAME_SITE").In("strict", []string{"none", "lax", "strict"})
59+
samesiteString := sec.Key("SAME_SITE").In("strict", []string{"none", "lax", "strict"})
60+
switch strings.ToLower(samesiteString) {
61+
case "none":
62+
SessionConfig.SameSite = http.SameSiteNoneMode
63+
case "lax":
64+
SessionConfig.SameSite = http.SameSiteLaxMode
65+
default:
66+
SessionConfig.SameSite = http.SameSiteStrictMode
67+
}
5968

6069
json := jsoniter.ConfigCompatibleWithStandardLibrary
6170
shadowConfig, err := json.Marshal(SessionConfig)

modules/web/middleware/cookie.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package middleware
88
import (
99
"net/http"
1010
"net/url"
11-
"strings"
1211
"time"
1312

1413
"code.gitea.io/gitea/modules/setting"
@@ -64,20 +63,6 @@ func SameSite(sameSite http.SameSite) func(*http.Cookie) {
6463
}
6564
}
6665

67-
// SameSiteString sets the SameSite for a provided cookie
68-
func SameSiteString(sameSite string) func(*http.Cookie) {
69-
return func(c *http.Cookie) {
70-
switch strings.ToLower(sameSite) {
71-
case "none":
72-
c.SameSite = http.SameSiteNoneMode
73-
case "lax":
74-
c.SameSite = http.SameSiteLaxMode
75-
default:
76-
c.SameSite = http.SameSiteStrictMode
77-
}
78-
}
79-
}
80-
8166
// NewCookie creates a cookie
8267
func NewCookie(name, value string, maxAge int) *http.Cookie {
8368
return &http.Cookie{

modules/web/middleware/locale.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func Locale(resp http.ResponseWriter, req *http.Request) translation.Locale {
4949
setting.SessionConfig.Domain,
5050
setting.SessionConfig.Secure,
5151
true,
52-
SameSiteString(setting.SessionConfig.SameSite))
52+
SameSite(setting.SessionConfig.SameSite))
5353
}
5454

5555
return translation.NewLocale(lang)

routers/user/auth.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ func AutoSignIn(ctx *context.Context) (bool, error) {
6565
defer func() {
6666
if !isSucceed {
6767
log.Trace("auto-login cookie cleared: %s", uname)
68-
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
69-
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
68+
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
69+
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
7070
}
7171
}()
7272

@@ -96,7 +96,7 @@ func AutoSignIn(ctx *context.Context) (bool, error) {
9696
return false, err
9797
}
9898

99-
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
99+
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
100100
return true, nil
101101
}
102102

@@ -110,13 +110,13 @@ func checkAutoLogin(ctx *context.Context) bool {
110110

111111
redirectTo := ctx.Query("redirect_to")
112112
if len(redirectTo) > 0 {
113-
ctx.SetCookie("redirect_to", redirectTo, 0, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
113+
ctx.SetCookie("redirect_to", redirectTo, 0, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
114114
} else {
115115
redirectTo = ctx.GetCookie("redirect_to")
116116
}
117117

118118
if isSucceed {
119-
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
119+
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
120120
ctx.RedirectToFirst(redirectTo, setting.AppSubURL+string(setting.LandingPageURL))
121121
return true
122122
}
@@ -498,9 +498,9 @@ func handleSignIn(ctx *context.Context, u *models.User, remember bool) {
498498
func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyRedirect bool) string {
499499
if remember {
500500
days := 86400 * setting.LogInRememberDays
501-
ctx.SetCookie(setting.CookieUserName, u.Name, days, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
501+
ctx.SetCookie(setting.CookieUserName, u.Name, days, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
502502
ctx.SetSuperSecureCookie(base.EncodeMD5(u.Rands+u.Passwd),
503-
setting.CookieRememberName, u.Name, days, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
503+
setting.CookieRememberName, u.Name, days, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
504504
}
505505

506506
_ = ctx.Session.Delete("openid_verified_uri")
@@ -531,10 +531,10 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR
531531
}
532532
}
533533

534-
ctx.SetCookie("lang", u.Language, nil, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
534+
ctx.SetCookie("lang", u.Language, nil, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
535535

536536
// Clear whatever CSRF has right now, force to generate a new one
537-
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
537+
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
538538

539539
// Register last login
540540
u.SetLastLogin()
@@ -544,7 +544,7 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR
544544
}
545545

546546
if redirectTo := ctx.GetCookie("redirect_to"); len(redirectTo) > 0 && !utils.IsExternalURL(redirectTo) {
547-
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
547+
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
548548
if obeyRedirect {
549549
ctx.RedirectToFirst(redirectTo)
550550
}
@@ -650,7 +650,7 @@ func handleOAuth2SignIn(u *models.User, gothUser goth.User, ctx *context.Context
650650
}
651651

652652
// Clear whatever CSRF has right now, force to generate a new one
653-
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
653+
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
654654

655655
// Register last login
656656
u.SetLastLogin()
@@ -665,7 +665,7 @@ func handleOAuth2SignIn(u *models.User, gothUser goth.User, ctx *context.Context
665665
}
666666

667667
if redirectTo := ctx.GetCookie("redirect_to"); len(redirectTo) > 0 {
668-
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
668+
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
669669
ctx.RedirectToFirst(redirectTo)
670670
return
671671
}
@@ -1043,11 +1043,11 @@ func LinkAccountPostRegister(ctx *context.Context) {
10431043
func HandleSignOut(ctx *context.Context) {
10441044
_ = ctx.Session.Flush()
10451045
_ = ctx.Session.Destroy(ctx.Resp, ctx.Req)
1046-
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
1047-
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
1048-
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
1049-
ctx.SetCookie("lang", "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite)) // Setting the lang cookie will trigger the middleware to reset the language ot previous state.
1050-
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL) // logout default should set redirect to to default
1046+
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
1047+
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
1048+
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
1049+
ctx.SetCookie("lang", "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite)) // Setting the lang cookie will trigger the middleware to reset the language ot previous state.
1050+
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL) // logout default should set redirect to to default
10511051
}
10521052

10531053
// SignOut sign out from login status

routers/user/auth_openid.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ func SignInOpenID(ctx *context.Context) {
4848

4949
redirectTo := ctx.Query("redirect_to")
5050
if len(redirectTo) > 0 {
51-
ctx.SetCookie("redirect_to", redirectTo, 0, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
51+
ctx.SetCookie("redirect_to", redirectTo, 0, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
5252
} else {
5353
redirectTo = ctx.GetCookie("redirect_to")
5454
}
5555

5656
if isSucceed {
57-
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
57+
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
5858
ctx.RedirectToFirst(redirectTo)
5959
return
6060
}

routers/user/setting/profile.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func ProfilePost(ctx *context.Context) {
117117
}
118118

119119
// Update the language to the one we just set
120-
ctx.SetCookie("lang", ctx.User.Language, nil, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSiteString(setting.SessionConfig.SameSite))
120+
ctx.SetCookie("lang", ctx.User.Language, nil, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true, middleware.SameSite(setting.SessionConfig.SameSite))
121121

122122
log.Trace("User settings updated: %s", ctx.User.Name)
123123
ctx.Flash.Success(i18n.Tr(ctx.User.Language, "settings.update_profile_success"))

0 commit comments

Comments
 (0)