@@ -336,10 +336,11 @@ func server() *cobra.Command {
336
336
return xerrors .Errorf ("generate random admin password for dev: %w" , err )
337
337
}
338
338
}
339
- err = createFirstUser (cmd , client , config , devUserEmail , devUserPassword )
339
+ cleanupSession , err : = createFirstUser (logger , cmd , client , config , devUserEmail , devUserPassword )
340
340
if err != nil {
341
341
return xerrors .Errorf ("create first user: %w" , err )
342
342
}
343
+ defer cleanupSession ()
343
344
_ , _ = fmt .Fprintf (cmd .ErrOrStderr (), "email: %s\n " , devUserEmail )
344
345
_ , _ = fmt .Fprintf (cmd .ErrOrStderr (), "password: %s\n " , devUserPassword )
345
346
_ , _ = fmt .Fprintln (cmd .ErrOrStderr ())
@@ -518,12 +519,14 @@ func server() *cobra.Command {
518
519
return root
519
520
}
520
521
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 ) {
522
525
if email == "" {
523
- return xerrors .New ("email is empty" )
526
+ return nil , xerrors .New ("email is empty" )
524
527
}
525
528
if password == "" {
526
- return xerrors .New ("password is empty" )
529
+ return nil , xerrors .New ("password is empty" )
527
530
}
528
531
_ , err := client .CreateFirstUser (cmd .Context (), codersdk.CreateFirstUserRequest {
529
532
Email : email ,
@@ -532,26 +535,67 @@ func createFirstUser(cmd *cobra.Command, client *codersdk.Client, cfg config.Roo
532
535
OrganizationName : "acme-corp" ,
533
536
})
534
537
if err != nil {
535
- return xerrors .Errorf ("create first user: %w" , err )
538
+ return nil , xerrors .Errorf ("create first user: %w" , err )
536
539
}
537
540
token , err := client .LoginWithPassword (cmd .Context (), codersdk.LoginWithPasswordRequest {
538
541
Email : email ,
539
542
Password : password ,
540
543
})
541
544
if err != nil {
542
- return xerrors .Errorf ("login with first user: %w" , err )
545
+ return nil , xerrors .Errorf ("login with first user: %w" , err )
543
546
}
544
547
client .SessionToken = token .SessionToken
545
548
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
+
546
589
err = cfg .URL ().Write (client .URL .String ())
547
590
if err != nil {
548
- return xerrors .Errorf ("write local url: %w" , err )
591
+ return nil , xerrors .Errorf ("write local url: %w" , err )
549
592
}
550
593
err = cfg .Session ().Write (token .SessionToken )
551
594
if err != nil {
552
- return xerrors .Errorf ("write session token: %w" , err )
595
+ return nil , xerrors .Errorf ("write session token: %w" , err )
553
596
}
554
- return nil
597
+
598
+ return cleanup , nil
555
599
}
556
600
557
601
// nolint:revive
0 commit comments