package main import ( "os" "strings" "testing" ) // Appendix E's line is `forge runner `, with no address, which needs the last one remembered. func TestRememberAndRecallAServer(t *testing.T) { t.Setenv("XDG_CONFIG_HOME", t.TempDir()) if os.Getenv("HOME") != "" { t.Setenv("HOME", t.TempDir()) } if got := recallServer("rt_live_never_seen"); got != "" { t.Errorf("a token that never attached recalled %q", got) } rememberServer("rt_live_aaa", "https://one.example") rememberServer("rt_live_bbb", "https://two.example") if got := recallServer("rt_live_aaa"); got != "https://one.example" { t.Errorf("recall = %q", got) } // Two forges on one machine must not answer for each other. if got := recallServer("rt_live_bbb"); got != "https://two.example" { t.Errorf("the second token recalled %q", got) } // Re-attaching somewhere else replaces rather than appends. rememberServer("rt_live_aaa", "https://moved.example") if got := recallServer("rt_live_aaa"); got != "https://moved.example" { t.Errorf("a moved server recalled %q", got) } // The file names servers, never tokens, so it is not a place secrets sit. path, err := serversFile() if err != nil { t.Fatal(err) } body, err := os.ReadFile(path) if err != nil { t.Fatal(err) } for _, secret := range []string{"rt_live_aaa", "rt_live_bbb"} { if strings.Contains(string(body), secret) { t.Errorf("the file holds the token %q", secret) } } if info, err := os.Stat(path); err == nil && info.Mode().Perm() != 0o600 { t.Errorf("the file is mode %v, and it names where a token works", info.Mode().Perm()) } }