2015-05-01 04:55:59 -05:00
package middleware
import (
2019-04-30 07:42:01 -05:00
"context"
2019-04-08 06:31:46 -05:00
"fmt"
2021-11-17 09:11:56 -06:00
"io"
2020-11-25 00:55:22 -06:00
"net"
2015-05-01 04:55:59 -05:00
"net/http"
2015-05-01 15:26:16 -05:00
"path/filepath"
2021-07-22 08:49:58 -05:00
"strconv"
2021-11-17 09:11:56 -06:00
"strings"
2015-05-01 04:55:59 -05:00
"testing"
2019-02-05 14:14:23 -06:00
"time"
2015-05-01 04:55:59 -05:00
2021-09-21 06:08:52 -05:00
"github.com/grafana/grafana-plugin-sdk-go/backend/gtime"
2022-09-27 06:58:49 -05:00
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2019-05-06 02:22:59 -05:00
"github.com/grafana/grafana/pkg/api/dtos"
2020-12-15 12:09:04 -06:00
"github.com/grafana/grafana/pkg/infra/fs"
2021-01-12 00:42:32 -06:00
"github.com/grafana/grafana/pkg/infra/log"
2019-04-08 06:31:46 -05:00
"github.com/grafana/grafana/pkg/infra/remotecache"
2022-01-20 04:10:12 -06:00
"github.com/grafana/grafana/pkg/infra/tracing"
2020-12-11 04:44:44 -06:00
"github.com/grafana/grafana/pkg/login"
2019-06-26 01:47:03 -05:00
"github.com/grafana/grafana/pkg/models"
2022-08-04 07:19:09 -05:00
"github.com/grafana/grafana/pkg/services/apikey"
2022-08-02 09:55:19 -05:00
"github.com/grafana/grafana/pkg/services/apikey/apikeytest"
2019-03-08 08:15:17 -06:00
"github.com/grafana/grafana/pkg/services/auth"
2020-12-11 04:44:44 -06:00
"github.com/grafana/grafana/pkg/services/contexthandler"
"github.com/grafana/grafana/pkg/services/contexthandler/authproxy"
2022-03-30 10:01:24 -05:00
"github.com/grafana/grafana/pkg/services/login/loginservice"
2022-04-08 03:33:19 -05:00
"github.com/grafana/grafana/pkg/services/login/logintest"
2022-09-22 15:04:48 -05:00
"github.com/grafana/grafana/pkg/services/navtree"
2022-08-10 04:56:48 -05:00
"github.com/grafana/grafana/pkg/services/org"
2020-12-11 04:44:44 -06:00
"github.com/grafana/grafana/pkg/services/rendering"
2022-03-30 10:01:24 -05:00
"github.com/grafana/grafana/pkg/services/sqlstore/mockstore"
2022-06-28 07:32:25 -05:00
"github.com/grafana/grafana/pkg/services/user"
2022-08-04 08:44:14 -05:00
"github.com/grafana/grafana/pkg/services/user/usertest"
2015-05-02 02:24:56 -05:00
"github.com/grafana/grafana/pkg/setting"
2015-05-01 15:26:16 -05:00
"github.com/grafana/grafana/pkg/util"
2021-10-11 07:30:59 -05:00
"github.com/grafana/grafana/pkg/web"
2015-05-01 04:55:59 -05:00
)
2020-12-11 04:44:44 -06:00
func fakeGetTime ( ) func ( ) time . Time {
2019-06-26 01:47:03 -05:00
var timeSeed int64
2020-12-11 04:44:44 -06:00
return func ( ) time . Time {
2019-06-26 01:47:03 -05:00
fakeNow := time . Unix ( timeSeed , 0 )
timeSeed ++
return fakeNow
}
}
2019-06-18 13:24:23 -05:00
func TestMiddleWareSecurityHeaders ( t * testing . T ) {
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "middleware should get correct x-xss-protection header" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/" ) . exec ( )
assert . Equal ( t , "1; mode=block" , sc . resp . Header ( ) . Get ( "X-XSS-Protection" ) )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
cfg . XSSProtectionHeader = true
2020-12-03 01:28:54 -06:00
} )
2019-06-18 13:24:23 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "middleware should not get x-xss-protection when disabled" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/" ) . exec ( )
assert . Empty ( t , sc . resp . Header ( ) . Get ( "X-XSS-Protection" ) )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
cfg . XSSProtectionHeader = false
2020-12-03 01:28:54 -06:00
} )
2019-06-18 13:24:23 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "middleware should add correct Strict-Transport-Security header" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/" ) . exec ( )
assert . Equal ( t , "max-age=64000" , sc . resp . Header ( ) . Get ( "Strict-Transport-Security" ) )
2020-12-11 04:44:44 -06:00
sc . cfg . StrictTransportSecurityPreload = true
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/" ) . exec ( )
assert . Equal ( t , "max-age=64000; preload" , sc . resp . Header ( ) . Get ( "Strict-Transport-Security" ) )
2020-12-11 04:44:44 -06:00
sc . cfg . StrictTransportSecuritySubDomains = true
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/" ) . exec ( )
assert . Equal ( t , "max-age=64000; preload; includeSubDomains" , sc . resp . Header ( ) . Get ( "Strict-Transport-Security" ) )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
cfg . StrictTransportSecurity = true
cfg . StrictTransportSecurityMaxAge = 64000
2019-06-18 13:24:23 -05:00
} )
}
2015-05-01 09:23:36 -05:00
func TestMiddlewareContext ( t * testing . T ) {
2020-12-15 12:09:04 -06:00
const noCache = "no-cache"
2015-05-01 04:55:59 -05:00
2022-09-09 04:05:58 -05:00
configureJWTAuthHeader := func ( cfg * setting . Cfg ) {
cfg . JWTAuthEnabled = true
cfg . JWTAuthHeaderName = "Authorization"
}
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "middleware should add context to injector" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . exec ( )
assert . NotNil ( t , sc . context )
} )
2015-05-01 04:55:59 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Default middleware should allow get request" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . exec ( )
assert . Equal ( t , 200 , sc . resp . Code )
} )
2015-05-01 09:23:36 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "middleware should add Cache-Control header for requests to API" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/search" ) . exec ( )
2020-12-15 12:09:04 -06:00
assert . Equal ( t , noCache , sc . resp . Header ( ) . Get ( "Cache-Control" ) )
assert . Equal ( t , noCache , sc . resp . Header ( ) . Get ( "Pragma" ) )
2020-12-03 01:28:54 -06:00
assert . Equal ( t , "-1" , sc . resp . Header ( ) . Get ( "Expires" ) )
} )
2017-07-04 09:33:37 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "middleware should not add Cache-Control header for requests to datasource proxy API" , func (
t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/datasources/proxy/1/test" ) . exec ( )
assert . Empty ( t , sc . resp . Header ( ) . Get ( "Cache-Control" ) )
assert . Empty ( t , sc . resp . Header ( ) . Get ( "Pragma" ) )
assert . Empty ( t , sc . resp . Header ( ) . Get ( "Expires" ) )
} )
2019-05-06 02:22:59 -05:00
2020-12-15 12:09:04 -06:00
middlewareScenario ( t , "middleware should add Cache-Control header for requests with HTML response" , func (
2020-12-04 04:09:32 -06:00
t * testing . T , sc * scenarioContext ) {
2020-12-15 12:09:04 -06:00
sc . handlerFunc = func ( c * models . ReqContext ) {
t . Log ( "Handler called" )
2020-12-03 01:28:54 -06:00
data := & dtos . IndexViewData {
User : & dtos . CurrentUser { } ,
Settings : map [ string ] interface { } { } ,
2022-09-28 01:29:35 -05:00
NavTree : & navtree . NavTreeRoot { } ,
2020-12-03 01:28:54 -06:00
}
2021-08-10 06:29:46 -05:00
t . Log ( "Calling HTML" , "data" , data )
2022-04-15 07:01:58 -05:00
c . HTML ( http . StatusOK , "index-template" , data )
2020-12-15 12:09:04 -06:00
t . Log ( "Returned HTML with code 200" )
}
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . exec ( )
2020-12-15 12:09:04 -06:00
require . Equal ( t , 200 , sc . resp . Code )
assert . Equal ( t , noCache , sc . resp . Header ( ) . Get ( "Cache-Control" ) )
assert . Equal ( t , noCache , sc . resp . Header ( ) . Get ( "Pragma" ) )
2020-12-03 01:28:54 -06:00
assert . Equal ( t , "-1" , sc . resp . Header ( ) . Get ( "Expires" ) )
} )
2017-07-04 09:33:37 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "middleware should add X-Frame-Options header with deny for request when not allowing embedding" , func (
t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/search" ) . exec ( )
assert . Equal ( t , "deny" , sc . resp . Header ( ) . Get ( "X-Frame-Options" ) )
} )
2019-05-06 02:56:23 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "middleware should not add X-Frame-Options header for request when allowing embedding" , func (
t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/api/search" ) . exec ( )
assert . Empty ( t , sc . resp . Header ( ) . Get ( "X-Frame-Options" ) )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
cfg . AllowEmbedding = true
2020-12-03 01:28:54 -06:00
} )
2019-05-06 02:56:23 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Invalid api key" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . apiKey = "invalid_key_test"
sc . fakeReq ( "GET" , "/" ) . exec ( )
2015-05-01 15:26:16 -05:00
2020-12-03 01:28:54 -06:00
assert . Empty ( t , sc . resp . Header ( ) . Get ( "Set-Cookie" ) )
assert . Equal ( t , 401 , sc . resp . Code )
2020-12-11 04:44:44 -06:00
assert . Equal ( t , contexthandler . InvalidAPIKey , sc . respJson [ "message" ] )
2020-12-03 01:28:54 -06:00
} )
2015-05-01 15:26:16 -05:00
2020-12-15 12:09:04 -06:00
middlewareScenario ( t , "Valid API key" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
const orgID int64 = 12
keyhash , err := util . EncodePassword ( "v5nAwpMafFP6znaS4urhdWDLS5511M42" , "asd" )
require . NoError ( t , err )
2022-08-10 04:56:48 -05:00
sc . apiKeyService . ExpectedAPIKey = & apikey . APIKey { OrgId : orgID , Role : org . RoleEditor , Key : keyhash }
2015-06-30 02:37:52 -05:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . withValidApiKey ( ) . exec ( )
2015-05-01 15:26:16 -05:00
2020-12-15 12:09:04 -06:00
require . Equal ( t , 200 , sc . resp . Code )
2015-05-01 15:26:16 -05:00
2020-12-03 01:28:54 -06:00
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , orgID , sc . context . OrgID )
2022-08-10 04:56:48 -05:00
assert . Equal ( t , org . RoleEditor , sc . context . OrgRole )
2020-12-03 01:28:54 -06:00
} )
2015-05-01 15:26:16 -05:00
2022-09-09 04:05:58 -05:00
middlewareScenario ( t , "Valid API key with JWT enabled" , func ( t * testing . T , sc * scenarioContext ) {
const orgID int64 = 12
keyhash , err := util . EncodePassword ( "v5nAwpMafFP6znaS4urhdWDLS5511M42" , "asd" )
require . NoError ( t , err )
sc . apiKeyService . ExpectedAPIKey = & apikey . APIKey { OrgId : orgID , Role : org . RoleEditor , Key : keyhash }
sc . fakeReq ( "GET" , "/" ) . withValidApiKey ( ) . exec ( )
require . Equal ( t , 200 , sc . resp . Code )
assert . True ( t , sc . context . IsSignedIn )
assert . Equal ( t , orgID , sc . context . OrgID )
assert . Equal ( t , org . RoleEditor , sc . context . OrgRole )
} , configureJWTAuthHeader )
2020-12-15 12:09:04 -06:00
middlewareScenario ( t , "Valid API key, but does not match DB hash" , func ( t * testing . T , sc * scenarioContext ) {
const keyhash = "Something_not_matching"
2022-08-10 04:56:48 -05:00
sc . apiKeyService . ExpectedAPIKey = & apikey . APIKey { OrgId : 12 , Role : org . RoleEditor , Key : keyhash }
2015-05-01 15:26:16 -05:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . withValidApiKey ( ) . exec ( )
2015-05-02 02:24:56 -05:00
2020-12-03 01:28:54 -06:00
assert . Equal ( t , 401 , sc . resp . Code )
2020-12-11 04:44:44 -06:00
assert . Equal ( t , contexthandler . InvalidAPIKey , sc . respJson [ "message" ] )
2020-12-03 01:28:54 -06:00
} )
2015-05-02 02:24:56 -05:00
2020-12-11 04:44:44 -06:00
middlewareScenario ( t , "Valid API key, but expired" , func ( t * testing . T , sc * scenarioContext ) {
sc . contextHandler . GetTime = fakeGetTime ( )
2015-05-02 02:24:56 -05:00
2020-12-03 01:28:54 -06:00
keyhash , err := util . EncodePassword ( "v5nAwpMafFP6znaS4urhdWDLS5511M42" , "asd" )
require . NoError ( t , err )
2022-04-06 09:31:26 -05:00
expires := sc . contextHandler . GetTime ( ) . Add ( - 1 * time . Second ) . Unix ( )
2022-08-10 04:56:48 -05:00
sc . apiKeyService . ExpectedAPIKey = & apikey . APIKey { OrgId : 12 , Role : org . RoleEditor , Key : keyhash , Expires : & expires }
2015-05-02 02:24:56 -05:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . withValidApiKey ( ) . exec ( )
2019-06-26 01:47:03 -05:00
2020-12-03 01:28:54 -06:00
assert . Equal ( t , 401 , sc . resp . Code )
assert . Equal ( t , "Expired API key" , sc . respJson [ "message" ] )
} )
2019-06-26 01:47:03 -05:00
2020-12-11 04:44:44 -06:00
middlewareScenario ( t , "Non-expired auth token in cookie which is not being rotated" , func (
2020-12-04 04:09:32 -06:00
t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
const userID int64 = 12
2019-06-26 01:47:03 -05:00
2020-12-03 01:28:54 -06:00
sc . withTokenSessionCookie ( "token" )
2022-08-16 09:08:59 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : 2 , UserID : userID }
2019-06-26 01:47:03 -05:00
2020-12-03 01:28:54 -06:00
sc . userAuthTokenService . LookupTokenProvider = func ( ctx context . Context , unhashedToken string ) ( * models . UserToken , error ) {
return & models . UserToken {
UserId : userID ,
UnhashedToken : unhashedToken ,
} , nil
}
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . exec ( )
2019-02-04 16:44:28 -06:00
2020-12-15 12:09:04 -06:00
require . NotNil ( t , sc . context )
require . NotNil ( t , sc . context . UserToken )
2020-12-03 01:28:54 -06:00
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
2020-12-03 01:28:54 -06:00
assert . Equal ( t , userID , sc . context . UserToken . UserId )
assert . Equal ( t , "token" , sc . context . UserToken . UnhashedToken )
2020-12-15 12:09:04 -06:00
assert . Empty ( t , sc . resp . Header ( ) . Get ( "Set-Cookie" ) )
2020-12-03 01:28:54 -06:00
} )
2015-05-02 02:24:56 -05:00
2020-12-15 12:09:04 -06:00
middlewareScenario ( t , "Non-expired auth token in cookie which is being rotated" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
const userID int64 = 12
2015-05-02 02:24:56 -05:00
2020-12-03 01:28:54 -06:00
sc . withTokenSessionCookie ( "token" )
2022-08-16 09:08:59 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : 2 , UserID : userID }
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
sc . userAuthTokenService . LookupTokenProvider = func ( ctx context . Context , unhashedToken string ) ( * models . UserToken , error ) {
return & models . UserToken {
UserId : userID ,
UnhashedToken : "" ,
} , nil
}
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
sc . userAuthTokenService . TryRotateTokenProvider = func ( ctx context . Context , userToken * models . UserToken ,
clientIP net . IP , userAgent string ) ( bool , error ) {
userToken . UnhashedToken = "rotated"
return true , nil
}
2019-02-04 16:44:28 -06:00
2020-12-15 12:09:04 -06:00
maxAge := int ( sc . cfg . LoginMaxLifetime . Seconds ( ) )
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
sameSiteModes := [ ] http . SameSite {
http . SameSiteNoneMode ,
http . SameSiteLaxMode ,
http . SameSiteStrictMode ,
}
for _ , sameSiteMode := range sameSiteModes {
t . Run ( fmt . Sprintf ( "Same site mode %d" , sameSiteMode ) , func ( t * testing . T ) {
origCookieSameSiteMode := setting . CookieSameSiteMode
t . Cleanup ( func ( ) {
setting . CookieSameSiteMode = origCookieSameSiteMode
} )
setting . CookieSameSiteMode = sameSiteMode
2019-02-05 14:14:23 -06:00
2020-04-06 09:56:19 -05:00
expectedCookiePath := "/"
2020-12-15 12:09:04 -06:00
if len ( sc . cfg . AppSubURL ) > 0 {
expectedCookiePath = sc . cfg . AppSubURL
2020-04-06 09:56:19 -05:00
}
2019-08-09 01:10:08 -05:00
expectedCookie := & http . Cookie {
2020-12-15 12:09:04 -06:00
Name : sc . cfg . LoginCookieName ,
2019-08-09 01:10:08 -05:00
Value : "rotated" ,
2020-04-06 09:56:19 -05:00
Path : expectedCookiePath ,
2019-08-09 01:10:08 -05:00
HttpOnly : true ,
2020-09-14 08:57:38 -05:00
MaxAge : maxAge ,
2019-08-09 01:10:08 -05:00
Secure : setting . CookieSecure ,
2020-12-03 01:28:54 -06:00
SameSite : sameSiteMode ,
2019-08-09 01:10:08 -05:00
}
2019-02-04 16:44:28 -06:00
2019-08-09 01:10:08 -05:00
sc . fakeReq ( "GET" , "/" ) . exec ( )
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
2020-12-03 01:28:54 -06:00
assert . Equal ( t , userID , sc . context . UserToken . UserId )
assert . Equal ( t , "rotated" , sc . context . UserToken . UnhashedToken )
assert . Equal ( t , expectedCookie . String ( ) , sc . resp . Header ( ) . Get ( "Set-Cookie" ) )
} )
}
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
t . Run ( "Should not set cookie with SameSite attribute when setting.CookieSameSiteDisabled is true" , func ( t * testing . T ) {
origCookieSameSiteDisabled := setting . CookieSameSiteDisabled
origCookieSameSiteMode := setting . CookieSameSiteMode
t . Cleanup ( func ( ) {
setting . CookieSameSiteDisabled = origCookieSameSiteDisabled
setting . CookieSameSiteMode = origCookieSameSiteMode
} )
setting . CookieSameSiteDisabled = true
setting . CookieSameSiteMode = http . SameSiteLaxMode
2020-01-14 10:41:54 -06:00
2020-12-03 01:28:54 -06:00
expectedCookiePath := "/"
2020-12-15 12:09:04 -06:00
if len ( sc . cfg . AppSubURL ) > 0 {
expectedCookiePath = sc . cfg . AppSubURL
2020-12-03 01:28:54 -06:00
}
expectedCookie := & http . Cookie {
2020-12-15 12:09:04 -06:00
Name : sc . cfg . LoginCookieName ,
2020-12-03 01:28:54 -06:00
Value : "rotated" ,
Path : expectedCookiePath ,
HttpOnly : true ,
MaxAge : maxAge ,
Secure : setting . CookieSecure ,
}
2020-01-14 10:41:54 -06:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . exec ( )
assert . Equal ( t , expectedCookie . String ( ) , sc . resp . Header ( ) . Get ( "Set-Cookie" ) )
2019-02-04 16:44:28 -06:00
} )
2020-12-03 01:28:54 -06:00
} )
2019-02-04 16:44:28 -06:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Invalid/expired auth token in cookie" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . withTokenSessionCookie ( "token" )
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
sc . userAuthTokenService . LookupTokenProvider = func ( ctx context . Context , unhashedToken string ) ( * models . UserToken , error ) {
return nil , models . ErrUserTokenNotFound
}
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . exec ( )
2019-02-04 16:44:28 -06:00
2020-12-03 01:28:54 -06:00
assert . False ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , int64 ( 0 ) , sc . context . UserID )
2020-12-03 01:28:54 -06:00
assert . Nil ( t , sc . context . UserToken )
} )
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "When anonymous access is enabled" , func ( t * testing . T , sc * scenarioContext ) {
2022-04-06 09:31:26 -05:00
sc . mockSQLStore . ExpectedOrg = & models . Org { Id : 1 , Name : sc . cfg . AnonymousOrgName }
2022-08-10 04:56:48 -05:00
orga , err := sc . mockSQLStore . CreateOrgWithMember ( sc . cfg . AnonymousOrgName , 1 )
2021-01-07 04:36:13 -06:00
require . NoError ( t , err )
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" ) . exec ( )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , int64 ( 0 ) , sc . context . UserID )
assert . Equal ( t , orga . Id , sc . context . OrgID )
2022-08-10 04:56:48 -05:00
assert . Equal ( t , org . RoleEditor , sc . context . OrgRole )
2020-12-03 01:28:54 -06:00
assert . False ( t , sc . context . IsSignedIn )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
cfg . AnonymousEnabled = true
cfg . AnonymousOrgName = "test"
2022-08-10 04:56:48 -05:00
cfg . AnonymousOrgRole = string ( org . RoleEditor )
2020-12-03 01:28:54 -06:00
} )
t . Run ( "auth_proxy" , func ( t * testing . T ) {
const userID int64 = 33
const orgID int64 = 4
2021-07-22 08:49:58 -05:00
const defaultOrgId int64 = 1
const orgRole = "Admin"
2020-12-03 01:28:54 -06:00
2020-12-11 04:44:44 -06:00
configure := func ( cfg * setting . Cfg ) {
cfg . AuthProxyEnabled = true
cfg . AuthProxyAutoSignUp = true
cfg . LDAPEnabled = true
cfg . AuthProxyHeaderName = "X-WEBAUTH-USER"
cfg . AuthProxyHeaderProperty = "username"
2021-07-22 08:49:58 -05:00
cfg . AuthProxyHeaders = map [ string ] string { "Groups" : "X-WEBAUTH-GROUPS" , "Role" : "X-WEBAUTH-ROLE" }
2020-12-11 04:44:44 -06:00
}
2020-12-03 01:28:54 -06:00
const hdrName = "markelog"
const group = "grafana-core-team"
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Should not sync the user if it's in the cache" , func ( t * testing . T , sc * scenarioContext ) {
2022-09-27 06:58:49 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : orgID , UserID : userID }
2020-12-15 02:32:06 -06:00
h , err := authproxy . HashCacheKey ( hdrName + "-" + group )
require . NoError ( t , err )
key := fmt . Sprintf ( authproxy . CachePrefix , h )
2021-12-22 04:02:42 -06:00
err = sc . remoteCacheService . Set ( context . Background ( ) , key , userID , 0 )
2020-12-03 01:28:54 -06:00
require . NoError ( t , err )
sc . fakeReq ( "GET" , "/" )
2015-05-02 02:24:56 -05:00
2020-12-11 04:44:44 -06:00
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
2020-12-03 01:28:54 -06:00
sc . req . Header . Set ( "X-WEBAUTH-GROUPS" , group )
sc . exec ( )
2015-05-02 02:24:56 -05:00
2020-12-03 01:28:54 -06:00
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
assert . Equal ( t , orgID , sc . context . OrgID )
2020-12-11 04:44:44 -06:00
} , configure )
2015-05-02 05:06:58 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Should respect auto signup option" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
var actualAuthProxyAutoSignUp * bool = nil
2022-06-28 07:32:25 -05:00
sc . loginService . ExpectedUserFunc = func ( cmd * models . UpsertUserCommand ) * user . User {
2020-12-03 01:28:54 -06:00
actualAuthProxyAutoSignUp = & cmd . SignupAllowed
2022-03-30 10:01:24 -05:00
return nil
}
sc . loginService . ExpectedError = login . ErrInvalidCredentials
2018-12-18 21:16:29 -06:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" )
2020-12-11 04:44:44 -06:00
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
2020-12-03 01:28:54 -06:00
sc . exec ( )
2019-07-01 06:29:41 -05:00
2020-12-03 01:28:54 -06:00
assert . False ( t , * actualAuthProxyAutoSignUp )
2020-12-11 04:44:44 -06:00
assert . Equal ( t , 407 , sc . resp . Code )
2020-12-03 01:28:54 -06:00
assert . Nil ( t , sc . context )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
configure ( cfg )
cfg . LDAPEnabled = false
cfg . AuthProxyAutoSignUp = false
2020-12-03 01:28:54 -06:00
} )
2019-07-01 06:29:41 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Should create an user from a header" , func ( t * testing . T , sc * scenarioContext ) {
2022-06-28 07:32:25 -05:00
sc . loginService . ExpectedUser = & user . User { ID : userID }
2022-09-27 06:58:49 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : orgID , UserID : userID }
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" )
2020-12-11 04:44:44 -06:00
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
2020-12-03 01:28:54 -06:00
sc . exec ( )
2018-12-18 21:16:29 -06:00
2020-12-03 01:28:54 -06:00
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
assert . Equal ( t , orgID , sc . context . OrgID )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
configure ( cfg )
cfg . LDAPEnabled = false
cfg . AuthProxyAutoSignUp = true
2020-12-03 01:28:54 -06:00
} )
2018-12-18 21:16:29 -06:00
2021-07-22 08:49:58 -05:00
middlewareScenario ( t , "Should assign role from header to default org" , func ( t * testing . T , sc * scenarioContext ) {
2022-08-10 04:56:48 -05:00
var storedRoleInfo map [ int64 ] org . RoleType = nil
2022-06-28 07:32:25 -05:00
sc . loginService . ExpectedUserFunc = func ( cmd * models . UpsertUserCommand ) * user . User {
2021-07-22 08:49:58 -05:00
storedRoleInfo = cmd . ExternalUser . OrgRoles
2022-09-27 06:58:49 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : defaultOrgId , UserID : userID , OrgRole : storedRoleInfo [ defaultOrgId ] }
2022-06-28 07:32:25 -05:00
return & user . User { ID : userID }
2022-03-30 10:01:24 -05:00
}
2021-07-22 08:49:58 -05:00
sc . fakeReq ( "GET" , "/" )
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
sc . req . Header . Set ( "X-WEBAUTH-ROLE" , orgRole )
sc . exec ( )
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
assert . Equal ( t , defaultOrgId , sc . context . OrgID )
2021-07-22 08:49:58 -05:00
assert . Equal ( t , orgRole , string ( sc . context . OrgRole ) )
} , func ( cfg * setting . Cfg ) {
configure ( cfg )
cfg . LDAPEnabled = false
cfg . AuthProxyAutoSignUp = true
} )
middlewareScenario ( t , "Should NOT assign role from header to non-default org" , func ( t * testing . T , sc * scenarioContext ) {
2022-08-10 04:56:48 -05:00
var storedRoleInfo map [ int64 ] org . RoleType = nil
2022-06-28 07:32:25 -05:00
sc . loginService . ExpectedUserFunc = func ( cmd * models . UpsertUserCommand ) * user . User {
2021-07-22 08:49:58 -05:00
storedRoleInfo = cmd . ExternalUser . OrgRoles
2022-09-27 06:58:49 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : orgID , UserID : userID , OrgRole : storedRoleInfo [ orgID ] }
2022-06-28 07:32:25 -05:00
return & user . User { ID : userID }
2022-03-30 10:01:24 -05:00
}
2021-07-22 08:49:58 -05:00
sc . fakeReq ( "GET" , "/" )
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
sc . req . Header . Set ( "X-WEBAUTH-ROLE" , "Admin" )
sc . req . Header . Set ( "X-Grafana-Org-Id" , strconv . FormatInt ( orgID , 10 ) )
sc . exec ( )
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
assert . Equal ( t , orgID , sc . context . OrgID )
2021-07-22 08:49:58 -05:00
// For non-default org, the user role should be empty
assert . Equal ( t , "" , string ( sc . context . OrgRole ) )
} , func ( cfg * setting . Cfg ) {
configure ( cfg )
cfg . LDAPEnabled = false
cfg . AuthProxyAutoSignUp = true
} )
2021-11-17 09:11:56 -06:00
middlewareScenario ( t , "Should use organisation specified by targetOrgId parameter" , func ( t * testing . T , sc * scenarioContext ) {
2022-03-30 10:01:24 -05:00
var targetOrgID int64 = 123
2022-09-27 06:58:49 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : targetOrgID , UserID : userID }
2022-06-28 07:32:25 -05:00
sc . loginService . ExpectedUser = & user . User { ID : userID }
2021-11-17 09:11:56 -06:00
sc . fakeReq ( "GET" , fmt . Sprintf ( "/?targetOrgId=%d" , targetOrgID ) )
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
sc . exec ( )
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
assert . Equal ( t , targetOrgID , sc . context . OrgID )
2021-11-17 09:11:56 -06:00
} , func ( cfg * setting . Cfg ) {
configure ( cfg )
cfg . LDAPEnabled = false
cfg . AuthProxyAutoSignUp = true
} )
middlewareScenario ( t , "Request body should not be read in default context handler" , func ( t * testing . T , sc * scenarioContext ) {
sc . fakeReq ( "POST" , "/?targetOrgId=123" )
body := "key=value"
sc . req . Body = io . NopCloser ( strings . NewReader ( body ) )
sc . handlerFunc = func ( c * models . ReqContext ) {
t . Log ( "Handler called" )
defer func ( ) {
err := c . Req . Body . Close ( )
require . NoError ( t , err )
} ( )
bodyAfterHandler , e := io . ReadAll ( c . Req . Body )
require . NoError ( t , e )
require . Equal ( t , body , string ( bodyAfterHandler ) )
}
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
sc . req . Header . Set ( "Content-Type" , "application/x-www-form-urlencoded" )
sc . req . Header . Set ( "Content-Length" , strconv . Itoa ( len ( body ) ) )
sc . m . Post ( "/" , sc . defaultHandler )
sc . exec ( )
} )
2022-07-27 09:10:47 -05:00
middlewareScenario ( t , "Request body should not be read in default context handler, but query should be altered - jwt" , func ( t * testing . T , sc * scenarioContext ) {
sc . fakeReq ( "POST" , "/?targetOrgId=123&auth_token=token" )
body := "key=value"
sc . req . Body = io . NopCloser ( strings . NewReader ( body ) )
sc . handlerFunc = func ( c * models . ReqContext ) {
t . Log ( "Handler called" )
defer func ( ) {
err := c . Req . Body . Close ( )
require . NoError ( t , err )
} ( )
require . Equal ( t , "" , c . Req . URL . Query ( ) . Get ( "auth_token" ) )
bodyAfterHandler , e := io . ReadAll ( c . Req . Body )
require . NoError ( t , e )
require . Equal ( t , body , string ( bodyAfterHandler ) )
}
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
sc . req . Header . Set ( "Content-Type" , "application/x-www-form-urlencoded" )
sc . req . Header . Set ( "Content-Length" , strconv . Itoa ( len ( body ) ) )
sc . m . Post ( "/" , sc . defaultHandler )
sc . exec ( )
} , func ( cfg * setting . Cfg ) {
cfg . JWTAuthEnabled = true
cfg . JWTAuthURLLogin = true
cfg . JWTAuthHeaderName = "X-WEBAUTH-TOKEN"
} )
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Should get an existing user from header" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
const userID int64 = 12
const orgID int64 = 2
2016-02-23 07:22:28 -06:00
2022-09-27 06:58:49 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : orgID , UserID : userID }
2022-06-28 07:32:25 -05:00
sc . loginService . ExpectedUser = & user . User { ID : userID }
2016-02-23 07:22:28 -06:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" )
2020-12-11 04:44:44 -06:00
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
2020-12-03 01:28:54 -06:00
sc . exec ( )
2016-02-23 07:22:28 -06:00
2020-12-03 01:28:54 -06:00
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
assert . Equal ( t , orgID , sc . context . OrgID )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
configure ( cfg )
cfg . LDAPEnabled = false
2020-12-03 01:28:54 -06:00
} )
2018-03-23 14:50:07 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Should allow the request from whitelist IP" , func ( t * testing . T , sc * scenarioContext ) {
2022-09-27 06:58:49 -05:00
sc . userService . ExpectedSignedInUser = & user . SignedInUser { OrgID : orgID , UserID : userID }
2022-06-28 07:32:25 -05:00
sc . loginService . ExpectedUser = & user . User { ID : userID }
2016-02-23 07:22:28 -06:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" )
2020-12-11 04:44:44 -06:00
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
2020-12-03 01:28:54 -06:00
sc . req . RemoteAddr = "[2001::23]:12345"
sc . exec ( )
2016-02-23 07:22:28 -06:00
2020-12-03 01:28:54 -06:00
assert . True ( t , sc . context . IsSignedIn )
2022-08-11 06:28:55 -05:00
assert . Equal ( t , userID , sc . context . UserID )
assert . Equal ( t , orgID , sc . context . OrgID )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
configure ( cfg )
cfg . AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
cfg . LDAPEnabled = false
2020-12-03 01:28:54 -06:00
} )
2016-02-23 07:22:28 -06:00
2020-12-11 04:44:44 -06:00
middlewareScenario ( t , "Should not allow the request from whitelisted IP" , func ( t * testing . T , sc * scenarioContext ) {
2022-06-28 07:32:25 -05:00
sc . loginService . ExpectedUser = & user . User { ID : userID }
2018-03-23 14:50:07 -05:00
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" )
2020-12-11 04:44:44 -06:00
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
2020-12-03 01:28:54 -06:00
sc . req . RemoteAddr = "[2001::23]:12345"
sc . exec ( )
2016-02-23 07:22:28 -06:00
2020-12-03 01:28:54 -06:00
assert . Equal ( t , 407 , sc . resp . Code )
assert . Nil ( t , sc . context )
2020-12-11 04:44:44 -06:00
} , func ( cfg * setting . Cfg ) {
configure ( cfg )
cfg . AuthProxyWhitelist = "8.8.8.8"
cfg . LDAPEnabled = false
2020-12-03 01:28:54 -06:00
} )
2016-02-23 07:22:28 -06:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Should return 407 status code if LDAP says no" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" )
2020-12-11 04:44:44 -06:00
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
2020-12-03 01:28:54 -06:00
sc . exec ( )
2019-08-20 12:13:27 -05:00
2020-12-03 01:28:54 -06:00
assert . Equal ( t , 407 , sc . resp . Code )
assert . Nil ( t , sc . context )
2020-12-11 04:44:44 -06:00
} , configure )
2019-08-20 12:13:27 -05:00
2020-12-04 04:09:32 -06:00
middlewareScenario ( t , "Should return 407 status code if there is cache mishap" , func ( t * testing . T , sc * scenarioContext ) {
2020-12-03 01:28:54 -06:00
sc . fakeReq ( "GET" , "/" )
2020-12-11 04:44:44 -06:00
sc . req . Header . Set ( sc . cfg . AuthProxyHeaderName , hdrName )
2020-12-03 01:28:54 -06:00
sc . exec ( )
2019-08-20 12:13:27 -05:00
2020-12-03 01:28:54 -06:00
assert . Equal ( t , 407 , sc . resp . Code )
assert . Nil ( t , sc . context )
2020-12-11 04:44:44 -06:00
} , configure )
2015-05-01 04:55:59 -05:00
} )
}
2015-05-02 02:24:56 -05:00
2020-12-11 04:44:44 -06:00
func middlewareScenario ( t * testing . T , desc string , fn scenarioFunc , cbs ... func ( * setting . Cfg ) ) {
2020-12-03 01:28:54 -06:00
t . Helper ( )
t . Run ( desc , func ( t * testing . T ) {
2021-01-12 00:42:32 -06:00
logger := log . New ( "test" )
2020-12-11 04:44:44 -06:00
loginMaxLifetime , err := gtime . ParseDuration ( "30d" )
2020-11-02 12:26:19 -06:00
require . NoError ( t , err )
2020-12-11 04:44:44 -06:00
cfg := setting . NewCfg ( )
cfg . LoginCookieName = "grafana_session"
cfg . LoginMaxLifetime = loginMaxLifetime
2020-12-15 12:09:04 -06:00
// Required when rendering errors
cfg . ErrTemplateName = "error-template"
2020-12-11 04:44:44 -06:00
for _ , cb := range cbs {
cb ( cfg )
}
2019-02-05 14:14:23 -06:00
2020-12-11 04:44:44 -06:00
sc := & scenarioContext { t : t , cfg : cfg }
2020-02-17 10:31:44 -06:00
viewsPath , err := filepath . Abs ( "../../public/views" )
require . NoError ( t , err )
2020-12-15 12:09:04 -06:00
exists , err := fs . Exists ( viewsPath )
require . NoError ( t , err )
require . Truef ( t , exists , "Views directory should exist at %q" , viewsPath )
2015-05-02 02:24:56 -05:00
2021-10-11 07:30:59 -05:00
sc . m = web . New ( )
2020-12-11 04:44:44 -06:00
sc . m . Use ( AddDefaultResponseHeaders ( cfg ) )
2021-08-10 02:03:22 -05:00
sc . m . UseMiddleware ( AddCSPHeader ( cfg , logger ) )
2021-10-11 07:30:59 -05:00
sc . m . UseMiddleware ( web . Renderer ( viewsPath , "[[" , "]]" ) )
2015-05-02 02:24:56 -05:00
2022-03-30 10:01:24 -05:00
sc . mockSQLStore = mockstore . NewSQLStoreMock ( )
sc . loginService = & loginservice . LoginServiceMock { }
2022-08-16 09:08:59 -05:00
sc . userService = usertest . NewUserServiceFake ( )
2022-08-02 09:55:19 -05:00
sc . apiKeyService = & apikeytest . Service { }
2022-08-16 09:08:59 -05:00
ctxHdlr := getContextHandler ( t , cfg , sc . mockSQLStore , sc . loginService , sc . apiKeyService , sc . userService )
2021-01-07 04:36:13 -06:00
sc . sqlStore = ctxHdlr . SQLStore
2020-12-11 04:44:44 -06:00
sc . contextHandler = ctxHdlr
sc . m . Use ( ctxHdlr . Middleware )
2022-09-27 06:58:49 -05:00
sc . m . Use ( OrgRedirect ( sc . cfg , sc . userService ) )
2015-05-02 02:24:56 -05:00
2020-12-11 04:44:44 -06:00
sc . userAuthTokenService = ctxHdlr . AuthTokenService . ( * auth . FakeUserAuthTokenService )
2021-03-31 10:40:44 -05:00
sc . jwtAuthService = ctxHdlr . JWTAuthService . ( * models . FakeJWTService )
2020-12-11 04:44:44 -06:00
sc . remoteCacheService = ctxHdlr . RemoteCache
2019-06-26 01:47:03 -05:00
sc . defaultHandler = func ( c * models . ReqContext ) {
2020-12-11 04:44:44 -06:00
require . NotNil ( t , c )
t . Log ( "Default HTTP handler called" )
2015-05-02 02:24:56 -05:00
sc . context = c
if sc . handlerFunc != nil {
sc . handlerFunc ( sc . context )
2022-08-09 07:58:50 -05:00
if ! c . Resp . Written ( ) {
c . Resp . WriteHeader ( http . StatusOK )
}
2020-01-15 06:03:12 -06:00
} else {
2020-12-15 12:09:04 -06:00
t . Log ( "Returning JSON OK" )
2020-11-17 04:51:31 -06:00
resp := make ( map [ string ] interface { } )
resp [ "message" ] = "OK"
2022-04-15 07:01:58 -05:00
c . JSON ( http . StatusOK , resp )
2015-05-02 02:24:56 -05:00
}
2015-05-02 05:06:58 -05:00
}
sc . m . Get ( "/" , sc . defaultHandler )
2015-05-02 02:24:56 -05:00
2020-12-04 04:09:32 -06:00
fn ( t , sc )
2015-05-02 02:24:56 -05:00
} )
}
2020-02-17 10:31:44 -06:00
2022-08-16 09:08:59 -05:00
func getContextHandler ( t * testing . T , cfg * setting . Cfg , mockSQLStore * mockstore . SQLStoreMock , loginService * loginservice . LoginServiceMock , apiKeyService * apikeytest . Service , userService * usertest . FakeUserService ) * contexthandler . ContextHandler {
2020-12-03 01:28:54 -06:00
t . Helper ( )
2020-12-11 04:44:44 -06:00
if cfg == nil {
cfg = setting . NewCfg ( )
2020-11-02 12:26:19 -06:00
}
2020-12-11 04:44:44 -06:00
cfg . RemoteCacheOptions = & setting . RemoteCacheOptions {
Name : "database" ,
2020-02-17 10:31:44 -06:00
}
2022-02-10 05:42:06 -06:00
remoteCacheSvc := remotecache . NewFakeStore ( t )
2020-12-11 04:44:44 -06:00
userAuthTokenSvc := auth . NewFakeUserAuthTokenService ( )
renderSvc := & fakeRenderService { }
2021-03-31 10:40:44 -05:00
authJWTSvc := models . NewFakeJWTService ( )
2022-06-15 05:40:41 -05:00
tracer := tracing . InitializeTracerForTest ( )
2022-09-27 06:58:49 -05:00
authProxy := authproxy . ProvideAuthProxy ( cfg , remoteCacheSvc , loginService , userService , mockSQLStore )
2022-06-28 07:32:25 -05:00
authenticator := & logintest . AuthenticatorFake { ExpectedUser : & user . User { } }
2022-08-16 09:08:59 -05:00
return contexthandler . ProvideService ( cfg , userAuthTokenSvc , authJWTSvc , remoteCacheSvc , renderSvc , mockSQLStore , tracer , authProxy , loginService , apiKeyService , authenticator , userService )
2020-02-17 10:31:44 -06:00
}
2020-12-11 04:44:44 -06:00
type fakeRenderService struct {
rendering . Service
2020-02-17 10:31:44 -06:00
}
2020-12-11 04:44:44 -06:00
func ( s * fakeRenderService ) Init ( ) error {
2020-06-29 12:15:11 -05:00
return nil
}