@@ -82,19 +82,12 @@ func AutoSignIn(ctx *context.Context) (bool, error) {
82
82
83
83
isSucceed = true
84
84
85
- if _ , err := session .RegenerateSession (ctx .Resp , ctx .Req ); err != nil {
86
- return false , fmt .Errorf ("unable to RegenerateSession: Error: %w" , err )
87
- }
88
-
89
- // Set session IDs
90
- if err := ctx .Session .Set ("uid" , u .ID ); err != nil {
91
- return false , err
92
- }
93
- if err := ctx .Session .Set ("uname" , u .Name ); err != nil {
94
- return false , err
95
- }
96
- if err := ctx .Session .Release (); err != nil {
97
- return false , err
85
+ if err := updateSession (ctx , nil , map [string ]interface {}{
86
+ // Set session IDs
87
+ "uid" : u .ID ,
88
+ "uname" : u .Name ,
89
+ }); err != nil {
90
+ return false , fmt .Errorf ("unable to updateSession: %w" , err )
98
91
}
99
92
100
93
if err := resetLocale (ctx , u ); err != nil {
@@ -252,32 +245,17 @@ func SignInPost(ctx *context.Context) {
252
245
return
253
246
}
254
247
255
- if _ , err := session .RegenerateSession (ctx .Resp , ctx .Req ); err != nil {
256
- ctx .ServerError ("UserSignIn: Unable to set regenerate session" , err )
257
- return
258
- }
259
-
260
- // User will need to use 2FA TOTP or WebAuthn, save data
261
- if err := ctx .Session .Set ("twofaUid" , u .ID ); err != nil {
262
- ctx .ServerError ("UserSignIn: Unable to set twofaUid in session" , err )
263
- return
264
- }
265
-
266
- if err := ctx .Session .Set ("twofaRemember" , form .Remember ); err != nil {
267
- ctx .ServerError ("UserSignIn: Unable to set twofaRemember in session" , err )
268
- return
248
+ updates := map [string ]interface {}{
249
+ // User will need to use 2FA TOTP or WebAuthn, save data
250
+ "twofaUid" : u .ID ,
251
+ "twofaRemember" : form .Remember ,
269
252
}
270
-
271
253
if hasTOTPtwofa {
272
254
// User will need to use WebAuthn, save data
273
- if err := ctx .Session .Set ("totpEnrolled" , u .ID ); err != nil {
274
- ctx .ServerError ("UserSignIn: Unable to set WebAuthn Enrolled in session" , err )
275
- return
276
- }
255
+ updates ["totpEnrolled" ] = u .ID
277
256
}
278
-
279
- if err := ctx .Session .Release (); err != nil {
280
- ctx .ServerError ("UserSignIn: Unable to save session" , err )
257
+ if err := updateSession (ctx , nil , updates ); err != nil {
258
+ ctx .ServerError ("UserSignIn: Unable to update session" , err )
281
259
return
282
260
}
283
261
@@ -308,29 +286,23 @@ func handleSignInFull(ctx *context.Context, u *user_model.User, remember, obeyRe
308
286
setting .CookieRememberName , u .Name , days )
309
287
}
310
288
311
- if _ , err := session .RegenerateSession (ctx .Resp , ctx .Req ); err != nil {
289
+ if err := updateSession (ctx , []string {
290
+ // Delete the openid, 2fa and linkaccount data
291
+ "openid_verified_uri" ,
292
+ "openid_signin_remember" ,
293
+ "openid_determined_email" ,
294
+ "openid_determined_username" ,
295
+ "twofaUid" ,
296
+ "twofaRemember" ,
297
+ "linkAccount" ,
298
+ }, map [string ]interface {}{
299
+ "uid" : u .ID ,
300
+ "uname" : u .Name ,
301
+ }); err != nil {
312
302
ctx .ServerError ("RegenerateSession" , err )
313
303
return setting .AppSubURL + "/"
314
304
}
315
305
316
- // Delete the openid, 2fa and linkaccount data
317
- _ = ctx .Session .Delete ("openid_verified_uri" )
318
- _ = ctx .Session .Delete ("openid_signin_remember" )
319
- _ = ctx .Session .Delete ("openid_determined_email" )
320
- _ = ctx .Session .Delete ("openid_determined_username" )
321
- _ = ctx .Session .Delete ("twofaUid" )
322
- _ = ctx .Session .Delete ("twofaRemember" )
323
- _ = ctx .Session .Delete ("linkAccount" )
324
- if err := ctx .Session .Set ("uid" , u .ID ); err != nil {
325
- log .Error ("Error setting uid %d in session: %v" , u .ID , err )
326
- }
327
- if err := ctx .Session .Set ("uname" , u .Name ); err != nil {
328
- log .Error ("Error setting uname %s session: %v" , u .Name , err )
329
- }
330
- if err := ctx .Session .Release (); err != nil {
331
- log .Error ("Unable to store session: %v" , err )
332
- }
333
-
334
306
// Language setting of the user overwrites the one previously set
335
307
// If the user does not have a locale set, we save the current one.
336
308
if len (u .Language ) == 0 {
@@ -762,22 +734,15 @@ func handleAccountActivation(ctx *context.Context, user *user_model.User) {
762
734
763
735
log .Trace ("User activated: %s" , user .Name )
764
736
765
- if _ , err := session .RegenerateSession (ctx .Resp , ctx .Req ); err != nil {
737
+ if err := updateSession (ctx , nil , map [string ]interface {}{
738
+ "uid" : user .ID ,
739
+ "uname" : user .Name ,
740
+ }); err != nil {
766
741
log .Error ("Unable to regenerate session for user: %-v with email: %s: %v" , user , user .Email , err )
767
742
ctx .ServerError ("ActivateUserEmail" , err )
768
743
return
769
744
}
770
745
771
- if err := ctx .Session .Set ("uid" , user .ID ); err != nil {
772
- log .Error ("Error setting uid in session[%s]: %v" , ctx .Session .ID (), err )
773
- }
774
- if err := ctx .Session .Set ("uname" , user .Name ); err != nil {
775
- log .Error ("Error setting uname in session[%s]: %v" , ctx .Session .ID (), err )
776
- }
777
- if err := ctx .Session .Release (); err != nil {
778
- log .Error ("Error storing session[%s]: %v" , ctx .Session .ID (), err )
779
- }
780
-
781
746
if err := resetLocale (ctx , user ); err != nil {
782
747
ctx .ServerError ("resetLocale" , err )
783
748
return
@@ -821,3 +786,25 @@ func ActivateEmail(ctx *context.Context) {
821
786
// Should users be logged in automatically here? (consider 2FA requirements, etc.)
822
787
ctx .Redirect (setting .AppSubURL + "/user/settings/account" )
823
788
}
789
+
790
+ func updateSession (ctx * context.Context , deletes []string , updates map [string ]interface {}) error {
791
+ if _ , err := session .RegenerateSession (ctx .Resp , ctx .Req ); err != nil {
792
+ return fmt .Errorf ("regenerate session: %w" , err )
793
+ }
794
+ sess := ctx .Session
795
+ sessID := sess .ID ()
796
+ for _ , k := range deletes {
797
+ if err := sess .Delete (k ); err != nil {
798
+ return fmt .Errorf ("delete %v in session[%s]: %w" , k , sessID , err )
799
+ }
800
+ }
801
+ for k , v := range updates {
802
+ if err := sess .Set (k , v ); err != nil {
803
+ return fmt .Errorf ("set %v in session[%s]: %w" , k , sessID , err )
804
+ }
805
+ }
806
+ if err := sess .Release (); err != nil {
807
+ return fmt .Errorf ("store session[%s]: %w" , sessID , err )
808
+ }
809
+ return nil
810
+ }
0 commit comments