@ -1,4 +1,4 @@
// Package mock implements a mock connector which requires no user interaction .
// Package mock implements connectors which help test various server components .
package mock
import (
@ -11,22 +11,24 @@ import (
"github.com/coreos/dex/connector"
)
// New returns a mock connector which requires no user interaction. It always returns
// NewCallbackConnector returns a mock connector which requires no user interaction. It always returns
// the same (fake) identity.
func New ( ) connector . Connector {
return mo ckConnector{ }
func NewCallbackConnector ( ) connector . Connector {
return callba ckConnector{ }
}
var (
_ connector . CallbackConnector = mockConnector { }
_ connector . GroupsConnector = mockConnector { }
_ connector . CallbackConnector = callbackConnector { }
_ connector . GroupsConnector = callbackConnector { }
_ connector . PasswordConnector = passwordConnector { }
)
type mo ckConnector struct { }
type callba ckConnector struct { }
func ( m mo ckConnector) Close ( ) error { return nil }
func ( m callba ckConnector) Close ( ) error { return nil }
func ( m mo ckConnector) LoginURL ( callbackURL , state string ) ( string , error ) {
func ( m callba ckConnector) LoginURL ( callbackURL , state string ) ( string , error ) {
u , err := url . Parse ( callbackURL )
if err != nil {
return "" , fmt . Errorf ( "failed to parse callbackURL %q: %v" , callbackURL , err )
@ -39,7 +41,7 @@ func (m mockConnector) LoginURL(callbackURL, state string) (string, error) {
var connectorData = [ ] byte ( "foobar" )
func ( m mo ckConnector) HandleCallback ( r * http . Request ) ( connector . Identity , string , error ) {
func ( m callba ckConnector) HandleCallback ( r * http . Request ) ( connector . Identity , string , error ) {
return connector . Identity {
UserID : "0-385-28089-0" ,
Username : "Kilgore Trout" ,
@ -49,17 +51,54 @@ func (m mockConnector) HandleCallback(r *http.Request) (connector.Identity, stri
} , r . URL . Query ( ) . Get ( "state" ) , nil
}
func ( m mo ckConnector) Groups ( identity connector . Identity ) ( [ ] string , error ) {
func ( m callba ckConnector) Groups ( identity connector . Identity ) ( [ ] string , error ) {
if ! bytes . Equal ( identity . ConnectorData , connectorData ) {
return nil , errors . New ( "connector data mismatch" )
}
return [ ] string { "authors" } , nil
}
// Config holds the configuration parameters for the mock connector .
type Config struct { }
// CallbackConfig holds the configuration parameters for a connector which requires no interaction .
type CallbackC onfig struct { }
// Open returns an authentication strategy which requires no user interaction.
func ( c * Config ) Open ( ) ( connector . Connector , error ) {
return New ( ) , nil
func ( c * CallbackConfig ) Open ( ) ( connector . Connector , error ) {
return NewCallbackConnector ( ) , nil
}
// PasswordConfig holds the configuration for a mock connector which prompts for the supplied
// username and password.
type PasswordConfig struct {
Username string ` yaml:"username" `
Password string ` yaml:"password" `
}
// Open returns an authentication strategy which prompts for a predefined username and password.
func ( c * PasswordConfig ) Open ( ) ( connector . Connector , error ) {
if c . Username == "" {
return nil , errors . New ( "no username supplied" )
}
if c . Password == "" {
return nil , errors . New ( "no password supplied" )
}
return & passwordConnector { c . Username , c . Password } , nil
}
type passwordConnector struct {
username string
password string
}
func ( p passwordConnector ) Close ( ) error { return nil }
func ( p passwordConnector ) Login ( username , password string ) ( identity connector . Identity , validPassword bool , err error ) {
if username == p . username && password == p . password {
return connector . Identity {
UserID : "0-385-28089-0" ,
Username : "Kilgore Trout" ,
Email : "kilgore@kilgore.trout" ,
EmailVerified : true ,
} , true , nil
}
return identity , false , nil
}