@@ -82,19 +82,12 @@ func AutoSignIn(ctx *context.Context) (bool, error) {
8282
8383 isSucceed = true
8484
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 )
9891 }
9992
10093 if err := resetLocale (ctx , u ); err != nil {
@@ -252,32 +245,17 @@ func SignInPost(ctx *context.Context) {
252245 return
253246 }
254247
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 ,
269252 }
270-
271253 if hasTOTPtwofa {
272254 // 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
277256 }
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 )
281259 return
282260 }
283261
@@ -308,29 +286,23 @@ func handleSignInFull(ctx *context.Context, u *user_model.User, remember, obeyRe
308286 setting .CookieRememberName , u .Name , days )
309287 }
310288
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 {
312302 ctx .ServerError ("RegenerateSession" , err )
313303 return setting .AppSubURL + "/"
314304 }
315305
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-
334306 // Language setting of the user overwrites the one previously set
335307 // If the user does not have a locale set, we save the current one.
336308 if len (u .Language ) == 0 {
@@ -762,22 +734,15 @@ func handleAccountActivation(ctx *context.Context, user *user_model.User) {
762734
763735 log .Trace ("User activated: %s" , user .Name )
764736
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 {
766741 log .Error ("Unable to regenerate session for user: %-v with email: %s: %v" , user , user .Email , err )
767742 ctx .ServerError ("ActivateUserEmail" , err )
768743 return
769744 }
770745
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-
781746 if err := resetLocale (ctx , user ); err != nil {
782747 ctx .ServerError ("resetLocale" , err )
783748 return
@@ -821,3 +786,25 @@ func ActivateEmail(ctx *context.Context) {
821786 // Should users be logged in automatically here? (consider 2FA requirements, etc.)
822787 ctx .Redirect (setting .AppSubURL + "/user/settings/account" )
823788}
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