Chore: Replace appcontext.User(ctx) with identity.GetRequester(ctx) (#91030)
This commit is contained in:
@@ -1,79 +0,0 @@
|
||||
package appcontext
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/grafana/grafana/pkg/apimachinery/identity"
|
||||
grpccontext "github.com/grafana/grafana/pkg/services/grpcserver/context"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
)
|
||||
|
||||
type ctxUserKey struct{}
|
||||
|
||||
// WithUser adds the supplied SignedInUser to the context.
|
||||
func WithUser(ctx context.Context, usr *user.SignedInUser) context.Context {
|
||||
ctx = context.WithValue(ctx, ctxUserKey{}, usr)
|
||||
// make sure it is also in the simplified version
|
||||
if usr == nil || usr.IsNil() {
|
||||
return identity.WithRequester(ctx, nil)
|
||||
}
|
||||
return identity.WithRequester(ctx, usr)
|
||||
}
|
||||
|
||||
// User extracts the SignedInUser from the supplied context.
|
||||
// Supports context set by appcontext.WithUser, gRPC server context, and HTTP ReqContext.
|
||||
// Deprecated: use identity.GetRequester(ctx) when possible
|
||||
func User(ctx context.Context) (*user.SignedInUser, error) {
|
||||
// Set by appcontext.WithUser
|
||||
u, ok := ctx.Value(ctxUserKey{}).(*user.SignedInUser)
|
||||
if ok && u != nil {
|
||||
return u, nil
|
||||
}
|
||||
|
||||
// Set by incoming gRPC server request
|
||||
grpcCtx := grpccontext.FromContext(ctx)
|
||||
if grpcCtx != nil && grpcCtx.SignedInUser != nil {
|
||||
return grpcCtx.SignedInUser, nil
|
||||
}
|
||||
|
||||
// If the identity was set via requester, but not appcontext, we can map values
|
||||
// NOTE: this path
|
||||
requester, _ := identity.GetRequester(ctx)
|
||||
if requester != nil {
|
||||
id := requester.GetID()
|
||||
userId, _ := id.UserID()
|
||||
orgId := requester.GetOrgID()
|
||||
return &user.SignedInUser{
|
||||
NamespacedID: id,
|
||||
UserID: userId,
|
||||
UserUID: requester.GetUID().ID(),
|
||||
OrgID: orgId,
|
||||
OrgName: requester.GetOrgName(),
|
||||
OrgRole: requester.GetOrgRole(),
|
||||
Login: requester.GetLogin(),
|
||||
Email: requester.GetEmail(),
|
||||
IsGrafanaAdmin: requester.GetIsGrafanaAdmin(),
|
||||
Teams: requester.GetTeams(),
|
||||
AuthID: requester.GetAuthID(),
|
||||
AuthenticatedBy: requester.GetAuthenticatedBy(),
|
||||
IDToken: requester.GetIDToken(),
|
||||
Permissions: map[int64]map[string][]string{
|
||||
0: requester.GetGlobalPermissions(),
|
||||
orgId: requester.GetPermissions(),
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("a SignedInUser was not found in the context")
|
||||
}
|
||||
|
||||
// MustUser extracts the SignedInUser from the supplied context, and panics if a user is not found.
|
||||
// Supports context set by appcontext.WithUser, gRPC server context, and HTTP ReqContext.
|
||||
func MustUser(ctx context.Context) *user.SignedInUser {
|
||||
usr, err := User(ctx)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return usr
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
package appcontext_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"math/big"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/grafana/grafana/pkg/apimachinery/identity"
|
||||
"github.com/grafana/grafana/pkg/infra/appcontext"
|
||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||
grpccontext "github.com/grafana/grafana/pkg/services/grpcserver/context"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
)
|
||||
|
||||
func TestUserFromContext(t *testing.T) {
|
||||
t.Run("User should error when context is missing user", func(t *testing.T) {
|
||||
usr, err := appcontext.User(context.Background())
|
||||
require.Nil(t, usr)
|
||||
require.Error(t, err)
|
||||
})
|
||||
|
||||
t.Run("MustUser should panic when context is missing user", func(t *testing.T) {
|
||||
require.Panics(t, func() {
|
||||
_ = appcontext.MustUser(context.Background())
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("should return user set by ContextWithUser", func(t *testing.T) {
|
||||
expected := testUser()
|
||||
ctx := appcontext.WithUser(context.Background(), expected)
|
||||
actual, err := appcontext.User(ctx)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expected.UserID, actual.UserID)
|
||||
|
||||
// The requester is also in context
|
||||
requester, err := identity.GetRequester(ctx)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expected.GetUID(), requester.GetUID())
|
||||
})
|
||||
|
||||
t.Run("should return user set by gRPC context", func(t *testing.T) {
|
||||
expected := testUser()
|
||||
handler := grpccontext.ProvideContextHandler(tracing.InitializeTracerForTest())
|
||||
ctx := handler.SetUser(context.Background(), expected)
|
||||
actual, err := appcontext.User(ctx)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expected.UserID, actual.UserID)
|
||||
})
|
||||
|
||||
t.Run("should return user set as a requester", func(t *testing.T) {
|
||||
expected := testUser()
|
||||
ctx := identity.WithRequester(context.Background(), expected)
|
||||
actual, err := appcontext.User(ctx)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expected.UserID, actual.UserID)
|
||||
})
|
||||
}
|
||||
|
||||
func testUser() *user.SignedInUser {
|
||||
i, err := rand.Int(rand.Reader, big.NewInt(100000))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return &user.SignedInUser{
|
||||
UserID: i.Int64(),
|
||||
OrgID: 1,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user