blob: c9518bf31d0f28a678fd527581eea6007bc55276 [file] [log] [blame]
package util
import (
"net/http"
"net/http/httptest"
"strings"
"testing"
)
func TestCSRFTokenWithoutCookie(t *testing.T) {
cookieName := "VeyronCSRFTestCookie"
r := newRequest()
c := NewCSRFCop()
w := httptest.NewRecorder()
tok, err := c.NewToken(w, r, cookieName)
if err != nil {
t.Errorf("NewToken failed: %v", err)
}
cookie := cookieSet(w, cookieName)
if len(cookie) == 0 {
t.Errorf("Cookie should have been set. Request: [%v], Response: [%v]", r, w)
}
// Cookie needs to be present for validation
r.AddCookie(&http.Cookie{Name: cookieName, Value: cookie})
if err := c.ValidateToken(tok, r, cookieName); err != nil {
t.Error("CSRF token failed validation:", err)
}
if err := c.ValidateToken(tok+"junk", r, cookieName); err == nil {
t.Error("CSRF token should have failed validation")
}
}
func TestCSRFTokenWithCookie(t *testing.T) {
cookieName := "VeyronCSRFTestCookie"
r := newRequest()
c := NewCSRFCop()
w := httptest.NewRecorder()
r.AddCookie(&http.Cookie{Name: cookieName, Value: "u776AC7hf794pTtGVlO50w=="})
tok, err := c.NewToken(w, r, cookieName)
if err != nil {
t.Errorf("NewToken failed: %v", err)
}
if len(cookieSet(w, cookieName)) > 0 {
t.Errorf("Cookie should not be set when it is already present. Request: [%v], Response: [%v]", r, w)
}
if err := c.ValidateToken(tok, r, cookieName); err != nil {
t.Error("CSRF token failed validation:", err)
}
if err := c.ValidateToken(tok+"junk", r, cookieName); err == nil {
t.Error("CSRF token should have failed validation")
}
}
func cookieSet(w *httptest.ResponseRecorder, cookieName string) string {
cookies := strings.Split(w.Header().Get("Set-Cookie"), ";")
for _, c := range cookies {
if strings.HasPrefix(c, cookieName) {
return strings.TrimPrefix(c, cookieName+"=")
}
}
return ""
}