@@ -90,14 +90,23 @@ func AutoSignIn(ctx *context.Context) (bool, error) {
90
90
91
91
isSucceed = true
92
92
93
+ // Save the session first
94
+ _ = ctx .Session .Release ()
95
+
96
+ // Then regenerate the ID - which should copy the previous data
97
+ newSess , _ := ctx .Session .RegenerateID (ctx .Resp , ctx .Req )
98
+
99
+ // Then flush the old session to delete it
100
+ _ = ctx .Session .Flush ()
101
+
93
102
// Set session IDs
94
- if err := ctx . Session .Set ("uid" , u .ID ); err != nil {
103
+ if err := newSess .Set ("uid" , u .ID ); err != nil {
95
104
return false , err
96
105
}
97
- if err := ctx . Session .Set ("uname" , u .Name ); err != nil {
106
+ if err := newSess .Set ("uname" , u .Name ); err != nil {
98
107
return false , err
99
108
}
100
- if err := ctx . Session .Release (); err != nil {
109
+ if err := newSess .Release (); err != nil {
101
110
return false , err
102
111
}
103
112
@@ -233,26 +242,35 @@ func SignInPost(ctx *context.Context) {
233
242
return
234
243
}
235
244
245
+ // Save the current session
246
+ _ = ctx .Session .Release ()
247
+
248
+ // Regenerate the session - this will copy the data from the old session
249
+ newSess , _ := ctx .Session .RegenerateID (ctx .Resp , ctx .Req )
250
+
251
+ // Delete the old session
252
+ _ = ctx .Session .Flush ()
253
+
236
254
// User will need to use 2FA TOTP or U2F, save data
237
- if err := ctx . Session .Set ("twofaUid" , u .ID ); err != nil {
255
+ if err := newSess .Set ("twofaUid" , u .ID ); err != nil {
238
256
ctx .ServerError ("UserSignIn: Unable to set twofaUid in session" , err )
239
257
return
240
258
}
241
259
242
- if err := ctx . Session .Set ("twofaRemember" , form .Remember ); err != nil {
260
+ if err := newSess .Set ("twofaRemember" , form .Remember ); err != nil {
243
261
ctx .ServerError ("UserSignIn: Unable to set twofaRemember in session" , err )
244
262
return
245
263
}
246
264
247
265
if hasTOTPtwofa {
248
266
// User will need to use U2F, save data
249
- if err := ctx . Session .Set ("totpEnrolled" , u .ID ); err != nil {
267
+ if err := newSess .Set ("totpEnrolled" , u .ID ); err != nil {
250
268
ctx .ServerError ("UserSignIn: Unable to set u2fEnrolled in session" , err )
251
269
return
252
270
}
253
271
}
254
272
255
- if err := ctx . Session .Release (); err != nil {
273
+ if err := newSess .Release (); err != nil {
256
274
ctx .ServerError ("UserSignIn: Unable to save session" , err )
257
275
return
258
276
}
@@ -526,6 +544,7 @@ func handleSignInFull(ctx *context.Context, u *user_model.User, remember bool, o
526
544
setting .CookieRememberName , u .Name , days )
527
545
}
528
546
547
+ // Delete the openid, 2fa and linkaccount data
529
548
_ = ctx .Session .Delete ("openid_verified_uri" )
530
549
_ = ctx .Session .Delete ("openid_signin_remember" )
531
550
_ = ctx .Session .Delete ("openid_determined_email" )
@@ -534,13 +553,25 @@ func handleSignInFull(ctx *context.Context, u *user_model.User, remember bool, o
534
553
_ = ctx .Session .Delete ("twofaRemember" )
535
554
_ = ctx .Session .Delete ("u2fChallenge" )
536
555
_ = ctx .Session .Delete ("linkAccount" )
537
- if err := ctx .Session .Set ("uid" , u .ID ); err != nil {
556
+
557
+ // Save the session
558
+ _ = ctx .Session .Release ()
559
+
560
+ // Regenerate the session copying the old data to the new one
561
+ newSess , _ := ctx .Session .RegenerateID (ctx .Resp , ctx .Req )
562
+
563
+ // delete the old session
564
+ _ = ctx .Session .Flush ()
565
+
566
+ // Now set our login data
567
+ if err := newSess .Set ("uid" , u .ID ); err != nil {
538
568
log .Error ("Error setting uid %d in session: %v" , u .ID , err )
539
569
}
540
- if err := ctx . Session .Set ("uname" , u .Name ); err != nil {
570
+ if err := newSess .Set ("uname" , u .Name ); err != nil {
541
571
log .Error ("Error setting uname %s session: %v" , u .Name , err )
542
572
}
543
- if err := ctx .Session .Release (); err != nil {
573
+
574
+ if err := newSess .Release (); err != nil {
544
575
log .Error ("Unable to store session: %v" , err )
545
576
}
546
577
@@ -799,13 +830,23 @@ func handleOAuth2SignIn(ctx *context.Context, source *login.Source, u *user_mode
799
830
// If this user is enrolled in 2FA and this source doesn't override it,
800
831
// we can't sign the user in just yet. Instead, redirect them to the 2FA authentication page.
801
832
if ! needs2FA {
802
- if err := ctx .Session .Set ("uid" , u .ID ); err != nil {
833
+ // save the current session
834
+ _ = ctx .Session .Release ()
835
+
836
+ // regenerate the session - copying data from the old session to the new.
837
+ newSess , _ := ctx .Session .RegenerateID (ctx .Resp , ctx .Req )
838
+
839
+ // delete the old session
840
+ ctx .Session .Flush ()
841
+
842
+ // Set session IDs
843
+ if err := newSess .Set ("uid" , u .ID ); err != nil {
803
844
log .Error ("Error setting uid in session: %v" , err )
804
845
}
805
- if err := ctx . Session .Set ("uname" , u .Name ); err != nil {
846
+ if err := newSess .Set ("uname" , u .Name ); err != nil {
806
847
log .Error ("Error setting uname in session: %v" , err )
807
848
}
808
- if err := ctx . Session .Release (); err != nil {
849
+ if err := newSess .Release (); err != nil {
809
850
log .Error ("Error storing session: %v" , err )
810
851
}
811
852
@@ -1199,7 +1240,7 @@ func LinkAccountPostRegister(ctx *context.Context) {
1199
1240
return
1200
1241
}
1201
1242
1202
- ctx . Redirect ( setting . AppSubURL + "/user/login" )
1243
+ handleSignIn ( ctx , u , false )
1203
1244
}
1204
1245
1205
1246
// HandleSignOut resets the session and sets the cookies
@@ -1563,13 +1604,23 @@ func handleAccountActivation(ctx *context.Context, user *user_model.User) {
1563
1604
1564
1605
log .Trace ("User activated: %s" , user .Name )
1565
1606
1566
- if err := ctx .Session .Set ("uid" , user .ID ); err != nil {
1607
+ // save the old session
1608
+ _ = ctx .Session .Release ()
1609
+
1610
+ // Regenerate the session copying the old data to the new session
1611
+ newSess , _ := ctx .Session .RegenerateID (ctx .Resp , ctx .Req )
1612
+
1613
+ // delete the old session
1614
+ ctx .Session .Flush ()
1615
+
1616
+ // Set session IDs
1617
+ if err := newSess .Set ("uid" , user .ID ); err != nil {
1567
1618
log .Error ("Error setting uid in session[%s]: %v" , ctx .Session .ID (), err )
1568
1619
}
1569
- if err := ctx . Session .Set ("uname" , user .Name ); err != nil {
1620
+ if err := newSess .Set ("uname" , user .Name ); err != nil {
1570
1621
log .Error ("Error setting uname in session[%s]: %v" , ctx .Session .ID (), err )
1571
1622
}
1572
- if err := ctx . Session .Release (); err != nil {
1623
+ if err := newSess .Release (); err != nil {
1573
1624
log .Error ("Error storing session[%s]: %v" , ctx .Session .ID (), err )
1574
1625
}
1575
1626
0 commit comments