@ -13,7 +13,8 @@ import (
"github.com/grafana/grafana/pkg/services/ldap"
"github.com/grafana/grafana/pkg/services/ldap"
"github.com/grafana/grafana/pkg/services/multildap"
"github.com/grafana/grafana/pkg/services/multildap"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/setting"
. "github.com/smartystreets/goconvey/convey"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gopkg.in/macaron.v1"
"gopkg.in/macaron.v1"
)
)
@ -68,55 +69,65 @@ func prepareMiddleware(t *testing.T, req *http.Request, store *remotecache.Remot
func TestMiddlewareContext ( t * testing . T ) {
func TestMiddlewareContext ( t * testing . T ) {
logger := log . New ( "test" )
logger := log . New ( "test" )
Convey ( "auth_proxy helper" , t , func ( ) {
req , err := http . NewRequest ( "POST" , "http://example.com" , nil )
req , err := http . NewRequest ( "POST" , "http://example.com" , nil )
So ( err , ShouldBeNil )
require . NoError ( t , err )
setting . AuthProxyHeaderName = "X-Killa"
setting . AuthProxyHeaderName = "X-Killa"
store := remotecache . NewFakeStore ( t )
store := remotecache . NewFakeStore ( t )
name := "markelog"
name := "markelog"
req . Header . Add ( setting . AuthProxyHeaderName , name )
req . Header . Add ( setting . AuthProxyHeaderName , name )
Convey ( "when the cache only contains the main header " , func ( ) {
t . Run ( "When the cache only contains the main header with a simple cache key ", func ( t * testing . T ) {
Convey ( "with a simple cache key" , func ( ) {
const id int64 = 33
// Set cache key
// Set cache key
key := fmt . Sprintf ( CachePrefix , HashCacheKey ( name ) )
key := fmt . Sprintf ( CachePrefix , HashCacheKey ( name ) )
err := store . Set ( key , int64 ( 33 ) , 0 )
err := store . Set ( key , id , 0 )
So ( err , ShouldBeNil )
require . NoError ( t , err )
// Set up the middleware
// Set up the middleware
auth := prepareMiddleware ( t , req , store )
auth := prepareMiddleware ( t , req , store )
So ( auth . getKey ( ) , ShouldEqual , "auth-proxy-sync-ttl:0a7f3374e9659b10980fd66247b0cf2f" )
assert . Equal ( t , "auth-proxy-sync-ttl:0a7f3374e9659b10980fd66247b0cf2f" , auth . getKey ( ) )
id , err := auth . Login ( logger , false )
gotID , err := auth . Login ( logger , false )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( id , ShouldEqual , 33 )
assert . Equal ( t , id , gotID )
} )
} )
Convey ( "when the cache key contains additional headers" , func ( ) {
t . Run ( "When the cache key contains additional headers" , func ( t * testing . T ) {
const id int64 = 33
setting . AuthProxyHeaders = map [ string ] string { "Groups" : "X-WEBAUTH-GROUPS" }
setting . AuthProxyHeaders = map [ string ] string { "Groups" : "X-WEBAUTH-GROUPS" }
group := "grafana-core-team"
group := "grafana-core-team"
req . Header . Add ( "X-WEBAUTH-GROUPS" , group )
req . Header . Add ( "X-WEBAUTH-GROUPS" , group )
key := fmt . Sprintf ( CachePrefix , HashCacheKey ( name + "-" + group ) )
key := fmt . Sprintf ( CachePrefix , HashCacheKey ( name + "-" + group ) )
err := store . Set ( key , int64 ( 33 ) , 0 )
err := store . Set ( key , id , 0 )
So ( err , ShouldBeNil )
require . NoError ( t , err )
auth := prepareMiddleware ( t , req , store )
auth := prepareMiddleware ( t , req , store )
So ( auth . getKey ( ) , ShouldEqual , "auth-proxy-sync-ttl:14f69b7023baa0ac98c96b31cec07bc0" )
assert . Equal ( t , "auth-proxy-sync-ttl:14f69b7023baa0ac98c96b31cec07bc0" , auth . getKey ( ) )
id , err := auth . Login ( logger , false )
gotID , err := auth . Login ( logger , false )
So ( err , ShouldBeNil )
require . NoError ( t , err )
So ( id , ShouldEqual , 33 )
assert . Equal ( t , id , gotID )
} )
} )
} )
}
func TestMiddlewareContext_ldap ( t * testing . T ) {
logger := log . New ( "test" )
req , err := http . NewRequest ( "POST" , "http://example.com" , nil )
require . NoError ( t , err )
setting . AuthProxyHeaderName = "X-Killa"
const headerName = "markelog"
req . Header . Add ( setting . AuthProxyHeaderName , headerName )
t . Run ( "Logs in via LDAP" , func ( t * testing . T ) {
const id int64 = 42
Convey ( "LDAP" , func ( ) {
Convey ( "logs in via LDAP" , func ( ) {
bus . AddHandler ( "test" , func ( cmd * models . UpsertUserCommand ) error {
bus . AddHandler ( "test" , func ( cmd * models . UpsertUserCommand ) error {
cmd . Result = & models . User {
cmd . Result = & models . User {
Id : 42 ,
Id : id ,
}
}
return nil
return nil
@ -127,7 +138,7 @@ func TestMiddlewareContext(t *testing.T) {
}
}
stub := & fakeMultiLDAP {
stub := & fakeMultiLDAP {
ID : 42 ,
ID : id ,
}
}
getLDAPConfig = func ( ) ( * ldap . Config , error ) {
getLDAPConfig = func ( ) ( * ldap . Config , error ) {
@ -155,20 +166,21 @@ func TestMiddlewareContext(t *testing.T) {
auth := prepareMiddleware ( t , req , store )
auth := prepareMiddleware ( t , req , store )
id , err := auth . Login ( logger , false )
gotID , err := auth . Login ( logger , false )
require . NoError ( t , err )
So ( err , ShouldBeNil )
assert . Equal ( t , id , gotID )
So ( id , ShouldEqual , 42 )
assert . True ( t , stub . userCalled )
So ( stub . userCalled , ShouldEqual , true )
} )
} )
Convey ( "gets nice error if ldap is enabled but not configured" , func ( ) {
t . Run ( "Gets nice error if ldap is enabled but not configured" , func ( t * testing . T ) {
const id int64 = 42
isLDAPEnabled = func ( ) bool {
isLDAPEnabled = func ( ) bool {
return true
return true
}
}
getLDAPConfig = func ( ) ( * ldap . Config , error ) {
getLDAPConfig = func ( ) ( * ldap . Config , error ) {
return nil , errors . New ( "S omething went wrong" )
return nil , errors . New ( "s omething went wrong" )
}
}
defer func ( ) {
defer func ( ) {
@ -182,20 +194,17 @@ func TestMiddlewareContext(t *testing.T) {
auth := prepareMiddleware ( t , req , store )
auth := prepareMiddleware ( t , req , store )
stub := & fakeMultiLDAP {
stub := & fakeMultiLDAP {
ID : 42 ,
ID : id ,
}
}
newLDAP = func ( servers [ ] * ldap . ServerConfig ) multildap . IMultiLDAP {
newLDAP = func ( servers [ ] * ldap . ServerConfig ) multildap . IMultiLDAP {
return stub
return stub
}
}
id , err := auth . Login ( logger , false )
gotID , err := auth . Login ( logger , false )
require . EqualError ( t , err , "failed to get the user" )
So ( err , ShouldNotBeNil )
assert . NotEqual ( t , id , gotID )
So ( err . Error ( ) , ShouldContainSubstring , "failed to get the user" )
assert . False ( t , stub . loginCalled )
So ( id , ShouldNotEqual , 42 )
So ( stub . loginCalled , ShouldEqual , false )
} )
} )
} )
} )
}
}