Skip to content

Commit ba9724e

Browse files
committed
fix: restore previous session on coder server --dev
1 parent 951dc2d commit ba9724e

File tree

1 file changed

+53
-9
lines changed

1 file changed

+53
-9
lines changed

cli/server.go

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -336,10 +336,11 @@ func server() *cobra.Command {
336336
return xerrors.Errorf("generate random admin password for dev: %w", err)
337337
}
338338
}
339-
err = createFirstUser(cmd, client, config, devUserEmail, devUserPassword)
339+
cleanupSession, err := createFirstUser(logger, cmd, client, config, devUserEmail, devUserPassword)
340340
if err != nil {
341341
return xerrors.Errorf("create first user: %w", err)
342342
}
343+
defer cleanupSession()
343344
_, _ = fmt.Fprintf(cmd.ErrOrStderr(), "email: %s\n", devUserEmail)
344345
_, _ = fmt.Fprintf(cmd.ErrOrStderr(), "password: %s\n", devUserPassword)
345346
_, _ = fmt.Fprintln(cmd.ErrOrStderr())
@@ -518,12 +519,14 @@ func server() *cobra.Command {
518519
return root
519520
}
520521

521-
func createFirstUser(cmd *cobra.Command, client *codersdk.Client, cfg config.Root, email, password string) error {
522+
// createFirstUser creates the first user and sets a valid session.
523+
// Caller must call cleanup on server exit.
524+
func createFirstUser(log slog.Logger, cmd *cobra.Command, client *codersdk.Client, cfg config.Root, email, password string) (func(), error) {
522525
if email == "" {
523-
return xerrors.New("email is empty")
526+
return nil, xerrors.New("email is empty")
524527
}
525528
if password == "" {
526-
return xerrors.New("password is empty")
529+
return nil, xerrors.New("password is empty")
527530
}
528531
_, err := client.CreateFirstUser(cmd.Context(), codersdk.CreateFirstUserRequest{
529532
Email: email,
@@ -532,26 +535,67 @@ func createFirstUser(cmd *cobra.Command, client *codersdk.Client, cfg config.Roo
532535
OrganizationName: "acme-corp",
533536
})
534537
if err != nil {
535-
return xerrors.Errorf("create first user: %w", err)
538+
return nil, xerrors.Errorf("create first user: %w", err)
536539
}
537540
token, err := client.LoginWithPassword(cmd.Context(), codersdk.LoginWithPasswordRequest{
538541
Email: email,
539542
Password: password,
540543
})
541544
if err != nil {
542-
return xerrors.Errorf("login with first user: %w", err)
545+
return nil, xerrors.Errorf("login with first user: %w", err)
543546
}
544547
client.SessionToken = token.SessionToken
545548

549+
oldUrl, err := cfg.URL().Read()
550+
if err != nil {
551+
return nil, xerrors.Errorf("write local url: %w", err)
552+
}
553+
oldSession, err := cfg.Session().Read()
554+
if err != nil {
555+
return nil, xerrors.Errorf("write session token: %w", err)
556+
}
557+
558+
// recover session data when server exits
559+
cleanup := func() {
560+
currentUrl, err := cfg.URL().Read()
561+
if err != nil {
562+
log.Error(cmd.Context(), "failed to read current session url", slog.Error(err))
563+
return
564+
}
565+
currentSession, err := cfg.Session().Read()
566+
if err != nil {
567+
log.Error(cmd.Context(), "failed to read current session token", slog.Error(err))
568+
return
569+
}
570+
571+
// if it's changed since we wrote to it don't restore session
572+
if currentUrl != client.URL.String() ||
573+
currentSession != token.SessionToken {
574+
return
575+
}
576+
577+
err = cfg.URL().Write(oldUrl)
578+
if err != nil {
579+
log.Error(cmd.Context(), "failed to recover previous session url", slog.Error(err))
580+
return
581+
}
582+
err = cfg.Session().Write(oldSession)
583+
if err != nil {
584+
log.Error(cmd.Context(), "failed to recover previous session token", slog.Error(err))
585+
return
586+
}
587+
}
588+
546589
err = cfg.URL().Write(client.URL.String())
547590
if err != nil {
548-
return xerrors.Errorf("write local url: %w", err)
591+
return nil, xerrors.Errorf("write local url: %w", err)
549592
}
550593
err = cfg.Session().Write(token.SessionToken)
551594
if err != nil {
552-
return xerrors.Errorf("write session token: %w", err)
595+
return nil, xerrors.Errorf("write session token: %w", err)
553596
}
554-
return nil
597+
598+
return cleanup, nil
555599
}
556600

557601
// nolint:revive

0 commit comments

Comments
 (0)