package basicauthrequest
import (
"net/http"
"testing"
"k8s.io/kubernetes/pkg/auth/user"
)
const (
Username = "frightened_donut"
Password = "don't eat me!"
ValidBase64String = "VGhpc0lzVmFsaWQK" // base64 -- ThisIsValid ctrl+d
)
type mockPasswordAuthenticator struct {
returnUser user.Info
isAuthenticated bool
err error
passedUser string
passedPassword string
}
func (mock *mockPasswordAuthenticator) AuthenticatePassword(username, password string) (user.Info, bool, error) {
mock.passedUser = username
mock.passedPassword = password
return mock.returnUser, mock.isAuthenticated, mock.err
}
func TestAuthenticateRequestValid(t *testing.T) {
passwordAuthenticator := &mockPasswordAuthenticator{}
authRequestHandler := NewBasicAuthAuthentication("example", passwordAuthenticator, true)
req, _ := http.NewRequest("GET", "http://example.org", nil)
req.SetBasicAuth(Username, Password)
_, _, _ = authRequestHandler.AuthenticateRequest(req)
if passwordAuthenticator.passedUser != Username {
t.Errorf("Expected %v, got %v", Username, passwordAuthenticator.passedUser)
}
if passwordAuthenticator.passedPassword != Password {
t.Errorf("Expected %v, got %v", Password, passwordAuthenticator.passedPassword)
}
}
func TestAuthenticateRequestInvalid(t *testing.T) {
const (
ExpectedError = "No valid base64 data in basic auth scheme found"
)
passwordAuthenticator := &mockPasswordAuthenticator{isAuthenticated: true}
authRequestHandler := NewBasicAuthAuthentication("example", passwordAuthenticator, true)
req, _ := http.NewRequest("GET", "http://example.org", nil)
req.Header.Add("Authorization", "Basic invalid:string")
userInfo, authenticated, err := authRequestHandler.AuthenticateRequest(req)
if err == nil {
t.Errorf("Expected error: %v", ExpectedError)
}
if err.Error() != ExpectedError {
t.Errorf("Expected %v, got %v", ExpectedError, err)
}
if userInfo != nil {
t.Errorf("Unexpected user: %v", userInfo)
}
if authenticated {
t.Errorf("Unexpectedly authenticated: %v", authenticated)
}
}
func TestGetBasicAuthInfo(t *testing.T) {
req, _ := http.NewRequest("GET", "http://example.org", nil)
req.SetBasicAuth(Username, Password)
username, password, hasBasicAuth, err := getBasicAuthInfo(req)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if !hasBasicAuth {
t.Errorf("Expected hasBasicAuth")
}
if username != Username {
t.Errorf("Expected %v, got %v", Username, username)
}
if password != Password {
t.Errorf("Expected %v, got %v", Password, password)
}
}
func TestGetBasicAuthInfoNoHeader(t *testing.T) {
req, _ := http.NewRequest("GET", "http://example.org", nil)
username, password, hasBasicAuth, err := getBasicAuthInfo(req)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if hasBasicAuth {
t.Errorf("Expected hasBasicAuth to be false")
}
if len(username) != 0 {
t.Errorf("Unexpected username: %v", username)
}
if len(password) != 0 {
t.Errorf("Unexpected password: %v", password)
}
}
func TestGetBasicAuthInfoNotBasicHeader(t *testing.T) {
req, _ := http.NewRequest("GET", "http://example.org", nil)
req.Header.Add("Authorization", "notbasic")
username, password, hasBasicAuth, err := getBasicAuthInfo(req)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if hasBasicAuth {
t.Errorf("Expected hasBasicAuth to be false")
}
if len(username) != 0 {
t.Errorf("Unexpected username: %v", username)
}
if len(password) != 0 {
t.Errorf("Unexpected password: %v", password)
}
}
func TestGetBasicAuthInfoNotBase64Encoded(t *testing.T) {
const (
ExpectedError = "No valid base64 data in basic auth scheme found"
)
req, _ := http.NewRequest("GET", "http://example.org", nil)
req.Header.Add("Authorization", "Basic invalid:string")
username, password, hasBasicAuth, err := getBasicAuthInfo(req)
if err == nil {
t.Errorf("Expected error: %v", ExpectedError)
}
if hasBasicAuth {
t.Errorf("Expected hasBasicAuth to be false")
}
if err.Error() != ExpectedError {
t.Errorf("Expected %v, got %v", ExpectedError, err)
}
if len(username) != 0 {
t.Errorf("Unexpected username: %v", username)
}
if len(password) != 0 {
t.Errorf("Unexpected password: %v", password)
}
}
func TestGetBasicAuthInfoNotCredentials(t *testing.T) {
const (
ExpectedError = "Invalid Authorization header"
)
req, _ := http.NewRequest("GET", "http://example.org", nil)
req.Header.Add("Authorization", "Basic "+ValidBase64String)
username, password, hasBasicAuth, err := getBasicAuthInfo(req)
if err == nil {
t.Errorf("Expected error: %v", ExpectedError)
}
if hasBasicAuth {
t.Errorf("Expected hasBasicAuth to be false")
}
if err.Error() != ExpectedError {
t.Errorf("Expected %v, got %v", ExpectedError, err)
}
if len(username) != 0 {
t.Errorf("Unexpected username: %v", username)
}
if len(password) != 0 {
t.Errorf("Unexpected password: %v", password)
}
}