mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			160 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
package api
 | 
						|
 | 
						|
import (
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/grafana/grafana/pkg/services/accesscontrol"
 | 
						|
	"github.com/grafana/grafana/pkg/setting"
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
)
 | 
						|
 | 
						|
type getSettingsTestCase struct {
 | 
						|
	desc         string
 | 
						|
	expectedCode int
 | 
						|
	expectedBody string
 | 
						|
	permissions  []*accesscontrol.Permission
 | 
						|
}
 | 
						|
 | 
						|
func TestAPI_AdminGetSettings(t *testing.T) {
 | 
						|
	tests := []getSettingsTestCase{
 | 
						|
		{
 | 
						|
			desc:         "should return all settings",
 | 
						|
			expectedCode: http.StatusOK,
 | 
						|
			expectedBody: `{"auth.proxy":{"enable_login_token":"false","enabled":"false"},"auth.saml":{"allow_idp_initiated":"false","enabled":"true"}}`,
 | 
						|
			permissions: []*accesscontrol.Permission{
 | 
						|
				{
 | 
						|
					Action: accesscontrol.ActionSettingsRead,
 | 
						|
					Scope:  accesscontrol.ScopeSettingsAll,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			desc:         "should only return auth.saml settings",
 | 
						|
			expectedCode: http.StatusOK,
 | 
						|
			expectedBody: `{"auth.saml":{"allow_idp_initiated":"false","enabled":"true"}}`,
 | 
						|
			permissions: []*accesscontrol.Permission{
 | 
						|
				{
 | 
						|
					Action: accesscontrol.ActionSettingsRead,
 | 
						|
					Scope:  "settings:auth.saml:*",
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			desc:         "should only partial properties from auth.saml and auth.proxy settings",
 | 
						|
			expectedCode: http.StatusOK,
 | 
						|
			expectedBody: `{"auth.proxy":{"enable_login_token":"false"},"auth.saml":{"enabled":"true"}}`,
 | 
						|
			permissions: []*accesscontrol.Permission{
 | 
						|
				{
 | 
						|
					Action: accesscontrol.ActionSettingsRead,
 | 
						|
					Scope:  "settings:auth.saml:enabled",
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Action: accesscontrol.ActionSettingsRead,
 | 
						|
					Scope:  "settings:auth.proxy:enable_login_token",
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	cfg := setting.NewCfg()
 | 
						|
	//seed sections and keys
 | 
						|
	cfg.Raw.DeleteSection("DEFAULT")
 | 
						|
	saml, err := cfg.Raw.NewSection("auth.saml")
 | 
						|
	assert.NoError(t, err)
 | 
						|
	_, err = saml.NewKey("enabled", "true")
 | 
						|
	assert.NoError(t, err)
 | 
						|
	_, err = saml.NewKey("allow_idp_initiated", "false")
 | 
						|
	assert.NoError(t, err)
 | 
						|
 | 
						|
	proxy, err := cfg.Raw.NewSection("auth.proxy")
 | 
						|
	assert.NoError(t, err)
 | 
						|
	_, err = proxy.NewKey("enabled", "false")
 | 
						|
	assert.NoError(t, err)
 | 
						|
	_, err = proxy.NewKey("enable_login_token", "false")
 | 
						|
	assert.NoError(t, err)
 | 
						|
 | 
						|
	for _, test := range tests {
 | 
						|
		t.Run(test.desc, func(t *testing.T) {
 | 
						|
			sc, hs := setupAccessControlScenarioContext(t, cfg, "/api/admin/settings", test.permissions)
 | 
						|
			hs.SettingsProvider = &setting.OSSImpl{Cfg: cfg}
 | 
						|
 | 
						|
			sc.resp = httptest.NewRecorder()
 | 
						|
			var err error
 | 
						|
			sc.req, err = http.NewRequest(http.MethodGet, "/api/admin/settings", nil)
 | 
						|
			assert.NoError(t, err)
 | 
						|
 | 
						|
			sc.exec()
 | 
						|
 | 
						|
			assert.Equal(t, test.expectedCode, sc.resp.Code)
 | 
						|
			assert.Equal(t, test.expectedBody, sc.resp.Body.String())
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestAdmin_AccessControl(t *testing.T) {
 | 
						|
	tests := []accessControlTestCase{
 | 
						|
		{
 | 
						|
			expectedCode: http.StatusOK,
 | 
						|
			desc:         "AdminGetStats should return 200 for user with correct permissions",
 | 
						|
			url:          "/api/admin/stats",
 | 
						|
			method:       http.MethodGet,
 | 
						|
			permissions: []*accesscontrol.Permission{
 | 
						|
				{
 | 
						|
					Action: accesscontrol.ActionServerStatsRead,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			expectedCode: http.StatusForbidden,
 | 
						|
			desc:         "AdminGetStats should return 403 for user without required permissions",
 | 
						|
			url:          "/api/admin/stats",
 | 
						|
			method:       http.MethodGet,
 | 
						|
			permissions: []*accesscontrol.Permission{
 | 
						|
				{
 | 
						|
					Action: "wrong",
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			expectedCode: http.StatusOK,
 | 
						|
			desc:         "AdminGetSettings should return 200 for user with correct permissions",
 | 
						|
			url:          "/api/admin/settings",
 | 
						|
			method:       http.MethodGet,
 | 
						|
			permissions: []*accesscontrol.Permission{
 | 
						|
				{
 | 
						|
					Action: accesscontrol.ActionSettingsRead,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			expectedCode: http.StatusForbidden,
 | 
						|
			desc:         "AdminGetSettings should return 403 for user without required permissions",
 | 
						|
			url:          "/api/admin/settings",
 | 
						|
			method:       http.MethodGet,
 | 
						|
			permissions: []*accesscontrol.Permission{
 | 
						|
				{
 | 
						|
					Action: "wrong",
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, test := range tests {
 | 
						|
		t.Run(test.desc, func(t *testing.T) {
 | 
						|
			cfg := setting.NewCfg()
 | 
						|
			sc, hs := setupAccessControlScenarioContext(t, cfg, test.url, test.permissions)
 | 
						|
			sc.resp = httptest.NewRecorder()
 | 
						|
			hs.SettingsProvider = &setting.OSSImpl{Cfg: cfg}
 | 
						|
 | 
						|
			var err error
 | 
						|
			sc.req, err = http.NewRequest(test.method, test.url, nil)
 | 
						|
			assert.NoError(t, err)
 | 
						|
 | 
						|
			sc.exec()
 | 
						|
			assert.Equal(t, test.expectedCode, sc.resp.Code)
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 |