Separate authn flow from analytics (#68327)
* separate authn flow from analytics * lint fix
This commit is contained in:
@@ -1,16 +1,23 @@
|
||||
package web
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/login"
|
||||
databaseAuthInfo "github.com/grafana/grafana/pkg/services/login/authinfoservice/database"
|
||||
"github.com/grafana/grafana/pkg/services/secrets/database"
|
||||
secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/grafana/grafana/pkg/tests/testinfra"
|
||||
)
|
||||
@@ -44,38 +51,6 @@ func TestIntegrationIndexView(t *testing.T) {
|
||||
assert.Empty(t, resp.Header.Get("Content-Security-Policy"))
|
||||
assert.Regexp(t, `<script nonce=""`, html)
|
||||
})
|
||||
|
||||
t.Run("Test the exposed user data contains the analytics identifiers", func(t *testing.T) {
|
||||
grafDir, cfgPath := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
|
||||
EnableFeatureToggles: []string{"authnService"},
|
||||
})
|
||||
|
||||
addr, store := testinfra.StartGrafana(t, grafDir, cfgPath)
|
||||
createdUser := testinfra.CreateUser(t, store, user.CreateUserCommand{
|
||||
Login: "admin",
|
||||
Password: "admin",
|
||||
Email: "admin@grafana.com",
|
||||
OrgID: 1,
|
||||
})
|
||||
|
||||
// insert user_auth relationship
|
||||
query := fmt.Sprintf(`INSERT INTO "user_auth" ("user_id", "auth_module", "auth_id", "created") VALUES ('%d', 'oauth_grafana_com', 'test-id-oauth-grafana', '2023-03-13 14:08:11')`, createdUser.ID)
|
||||
_, err := store.GetEngine().Exec(query)
|
||||
require.NoError(t, err)
|
||||
|
||||
// nolint:bodyclose
|
||||
response, html := makeRequest(t, addr, "admin", "admin")
|
||||
assert.Equal(t, 200, response.StatusCode)
|
||||
|
||||
// parse User.Analytics HTML view into user.AnalyticsSettings model
|
||||
parsedHTML := strings.Split(html, "analytics\":")[1]
|
||||
parsedHTML = strings.Split(parsedHTML, "},\n")[0]
|
||||
|
||||
var analyticsSettings user.AnalyticsSettings
|
||||
require.NoError(t, json.Unmarshal([]byte(parsedHTML), &analyticsSettings))
|
||||
|
||||
require.Equal(t, "test-id-oauth-grafana", analyticsSettings.Identifier)
|
||||
})
|
||||
}
|
||||
|
||||
func makeRequest(t *testing.T, addr, username, passwowrd string) (*http.Response, string) {
|
||||
@@ -102,7 +77,99 @@ func makeRequest(t *testing.T, addr, username, passwowrd string) (*http.Response
|
||||
var b strings.Builder
|
||||
_, err = io.Copy(&b, resp.Body)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 200, resp.StatusCode)
|
||||
require.Equal(t, 200, resp.StatusCode, b.String())
|
||||
|
||||
return resp, b.String()
|
||||
}
|
||||
|
||||
// TestIntegrationIndexViewAnalytics tests the Grafana index view has the analytics identifiers.
|
||||
func TestIntegrationIndexViewAnalytics(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("skipping integration test")
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
authModule string
|
||||
setID string
|
||||
wantIdentifier string
|
||||
secondModule string
|
||||
secondID string
|
||||
}{
|
||||
{
|
||||
name: "gcom only and last",
|
||||
authModule: login.GrafanaComAuthModule,
|
||||
setID: "test-id-oauth-grafana",
|
||||
wantIdentifier: "test-id-oauth-grafana",
|
||||
},
|
||||
{
|
||||
name: "okta only and last",
|
||||
authModule: login.OktaAuthModule,
|
||||
setID: "uuid-1234-5678-9101",
|
||||
wantIdentifier: "admin@grafana.com@http://localhost:3000/",
|
||||
},
|
||||
{
|
||||
name: "gcom last",
|
||||
authModule: login.OktaAuthModule,
|
||||
setID: "test-id-oauth-grafana",
|
||||
wantIdentifier: "60042",
|
||||
secondModule: login.GrafanaComAuthModule,
|
||||
secondID: "60042",
|
||||
},
|
||||
}
|
||||
|
||||
// can be removed once ff is removed
|
||||
testCaseFeatures := map[string][]string{"none": {}, "authnService": {featuremgmt.FlagAuthnService}}
|
||||
|
||||
for k, tcFeatures := range testCaseFeatures {
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name+"-"+k, func(t *testing.T) {
|
||||
grafDir, cfgPath := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
|
||||
EnableFeatureToggles: tcFeatures,
|
||||
})
|
||||
addr, store := testinfra.StartGrafana(t, grafDir, cfgPath)
|
||||
createdUser := testinfra.CreateUser(t, store, user.CreateUserCommand{
|
||||
Login: "admin",
|
||||
Password: "admin",
|
||||
Email: "admin@grafana.com",
|
||||
OrgID: 1,
|
||||
})
|
||||
|
||||
secretsService := secretsManager.SetupTestService(t, database.ProvideSecretsStore(store))
|
||||
authInfoStore := databaseAuthInfo.ProvideAuthInfoStore(store, secretsService, nil)
|
||||
|
||||
// insert user_auth relationship
|
||||
err := authInfoStore.SetAuthInfo(context.Background(), &login.SetAuthInfoCommand{
|
||||
AuthModule: tc.authModule,
|
||||
AuthId: tc.setID,
|
||||
UserId: createdUser.ID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
if tc.secondModule != "" {
|
||||
// wait for the user_auth relationship to be inserted. TOFIX: this is a hack
|
||||
time.Sleep(1 * time.Second)
|
||||
err := authInfoStore.SetAuthInfo(context.Background(), &login.SetAuthInfoCommand{
|
||||
AuthModule: tc.secondModule,
|
||||
AuthId: tc.secondID,
|
||||
UserId: createdUser.ID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// nolint:bodyclose
|
||||
response, html := makeRequest(t, addr, "admin", "admin")
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
|
||||
// parse User.Analytics HTML view into user.AnalyticsSettings model
|
||||
parsedHTML := strings.Split(html, "analytics\":")[1]
|
||||
parsedHTML = strings.Split(parsedHTML, "},\n")[0]
|
||||
|
||||
var analyticsSettings user.AnalyticsSettings
|
||||
require.NoError(t, json.Unmarshal([]byte(parsedHTML), &analyticsSettings))
|
||||
|
||||
require.NotEmpty(t, analyticsSettings.IntercomIdentifier)
|
||||
require.Equal(t, tc.wantIdentifier, analyticsSettings.Identifier)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user