Files

78 lines
2.9 KiB
Go

package webui
import (
"net/http"
"net/http/httptest"
"net/url"
"strings"
"testing"
)
// TestLetsEncryptSaveBlankMeansKeepExisting confirms a secret field submitted blank
// doesn't wipe a previously-saved credential, while a non-empty submission does
// overwrite it — the whole reason this page has its own save handler instead of using
// the generic settingsUpdate reflection.
func TestLetsEncryptSaveBlankMeansKeepExisting(t *testing.T) {
app := newTestApp(t)
mux := app.Mux()
cookie := loginSession(t, app)
app.Cfg.Section("LetsEncrypt").Key("cloudflare_api_token").SetValue("original-secret-token")
// Submit the form with the secret field blank (and a plain field changed).
form := url.Values{
"enabled": {"true"},
"dns_provider": {"cloudflare"},
"domains": {"mail.example.com"},
"contact_email": {"admin@example.com"},
}
req := httptest.NewRequest(http.MethodPost, Prefix+"/letsencrypt/save", strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.AddCookie(cookie)
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, req)
if rec.Code != http.StatusFound {
t.Fatalf("expected redirect, got %d: %s", rec.Code, rec.Body.String())
}
if got := app.Cfg.Section("LetsEncrypt").Key("cloudflare_api_token").String(); got != "original-secret-token" {
t.Fatalf("expected the blank submission to keep the existing token, got %q", got)
}
if got := app.Cfg.Section("LetsEncrypt").Key("enabled").String(); got != "true" {
t.Fatalf("expected the plain field to be updated, got %q", got)
}
// Now submit a real value for the secret field — it must overwrite.
form.Set("cloudflare_api_token", "new-secret-token")
req2 := httptest.NewRequest(http.MethodPost, Prefix+"/letsencrypt/save", strings.NewReader(form.Encode()))
req2.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req2.AddCookie(cookie)
rec2 := httptest.NewRecorder()
mux.ServeHTTP(rec2, req2)
if rec2.Code != http.StatusFound {
t.Fatalf("expected redirect, got %d", rec2.Code)
}
if got := app.Cfg.Section("LetsEncrypt").Key("cloudflare_api_token").String(); got != "new-secret-token" {
t.Fatalf("expected a non-empty submission to overwrite the token, got %q", got)
}
}
// TestLetsEncryptPageNeverRendersSecrets confirms secret fields are always blank in
// the rendered form, even when a value is stored.
func TestLetsEncryptPageNeverRendersSecrets(t *testing.T) {
app := newTestApp(t)
mux := app.Mux()
cookie := loginSession(t, app)
app.Cfg.Section("LetsEncrypt").Key("cloudflare_api_token").SetValue("super-secret-value")
req := httptest.NewRequest(http.MethodGet, Prefix+"/letsencrypt", nil)
req.AddCookie(cookie)
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, req)
if rec.Code != http.StatusOK {
t.Fatalf("status = %d", rec.Code)
}
if strings.Contains(rec.Body.String(), "super-secret-value") {
t.Fatal("expected the stored secret to never be rendered back into the page")
}
}