core/ui: add user info link (#5158)

* core/ui: add user info link

* open in new window

* fix header test
This commit is contained in:
Caleb Doxsey 2024-06-28 14:07:24 -06:00 committed by GitHub
parent f5f5e5fddc
commit d55cb097cc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 9 deletions

View file

@ -123,10 +123,10 @@ func NewHeadersEvaluator(ctx context.Context, store *store.Store, options ...fun
} }
// Evaluate evaluates the headers.rego script. // Evaluate evaluates the headers.rego script.
func (e *HeadersEvaluator) Evaluate(ctx context.Context, req *HeadersRequest) (*HeadersResponse, error) { func (e *HeadersEvaluator) Evaluate(ctx context.Context, req *HeadersRequest, options ...rego.EvalOption) (*HeadersResponse, error) {
ctx, span := trace.StartSpan(ctx, "authorize.HeadersEvaluator.Evaluate") ctx, span := trace.StartSpan(ctx, "authorize.HeadersEvaluator.Evaluate")
defer span.End() defer span.End()
rs, err := safeEval(ctx, e.q, rego.EvalInput(req)) rs, err := safeEval(ctx, e.q, append([]rego.EvalOption{rego.EvalInput(req)}, options...)...)
if err != nil { if err != nil {
return nil, fmt.Errorf("authorize: error evaluating headers.rego: %w", err) return nil, fmt.Errorf("authorize: error evaluating headers.rego: %w", err)
} }

View file

@ -75,7 +75,7 @@ func TestHeadersEvaluator(t *testing.T) {
publicJWK, err := cryptutil.PublicJWKFromBytes(encodedSigningKey) publicJWK, err := cryptutil.PublicJWKFromBytes(encodedSigningKey)
require.NoError(t, err) require.NoError(t, err)
evalTime := time.Now().Round(time.Second) iat := time.Unix(1686870680, 0)
eval := func(t *testing.T, data []proto.Message, input *HeadersRequest) (*HeadersResponse, error) { eval := func(t *testing.T, data []proto.Message, input *HeadersRequest) (*HeadersResponse, error) {
ctx := context.Background() ctx := context.Background()
@ -83,13 +83,11 @@ func TestHeadersEvaluator(t *testing.T) {
store := store.New() store := store.New()
store.UpdateJWTClaimHeaders(config.NewJWTClaimHeaders("email", "groups", "user", "CUSTOM_KEY")) store.UpdateJWTClaimHeaders(config.NewJWTClaimHeaders("email", "groups", "user", "CUSTOM_KEY"))
store.UpdateSigningKey(privateJWK) store.UpdateSigningKey(privateJWK)
e, err := NewHeadersEvaluator(ctx, store, rego.Time(evalTime)) e, err := NewHeadersEvaluator(ctx, store, rego.Time(iat))
require.NoError(t, err) require.NoError(t, err)
return e.Evaluate(ctx, input) return e.Evaluate(ctx, input, rego.EvalTime(iat))
} }
iat := time.Unix(1686870680, 0)
t.Run("jwt", func(t *testing.T) { t.Run("jwt", func(t *testing.T) {
output, err := eval(t, output, err := eval(t,
[]proto.Message{ []proto.Message{
@ -122,9 +120,9 @@ func TestHeadersEvaluator(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// The 'iat' and 'exp' claims are set based on the current time. // The 'iat' and 'exp' claims are set based on the current time.
assert.Equal(t, json.Number(fmt.Sprint(evalTime.Unix())), jwtPayloadDecoded["iat"], assert.Equal(t, json.Number(fmt.Sprint(iat.Unix())), jwtPayloadDecoded["iat"],
"unexpected 'iat' timestamp format") "unexpected 'iat' timestamp format")
assert.Equal(t, json.Number(fmt.Sprint(evalTime.Add(5*time.Minute).Unix())), jwtPayloadDecoded["exp"], assert.Equal(t, json.Number(fmt.Sprint(iat.Add(5*time.Minute).Unix())), jwtPayloadDecoded["exp"],
"unexpected 'exp' timestamp format") "unexpected 'exp' timestamp format")
rawJWT, err := jwt.ParseSigned(jwtHeader) rawJWT, err := jwt.ParseSigned(jwtHeader)

View file

@ -68,6 +68,11 @@ const Header: FC<HeaderProps> = ({ includeSidebar, data }) => {
setDrawerOpen(false); setDrawerOpen(false);
}; };
const handleUserInfo = (evt: React.MouseEvent): void => {
evt.preventDefault();
window.open("/.pomerium/");
};
const handleLogout = (evt: React.MouseEvent): void => { const handleLogout = (evt: React.MouseEvent): void => {
evt.preventDefault(); evt.preventDefault();
location.href = "/.pomerium/sign_out"; location.href = "/.pomerium/sign_out";
@ -139,6 +144,7 @@ const Header: FC<HeaderProps> = ({ includeSidebar, data }) => {
open={!!anchorEl} open={!!anchorEl}
anchorEl={anchorEl} anchorEl={anchorEl}
> >
<MenuItem onClick={handleUserInfo}>User Info</MenuItem>
<MenuItem onClick={handleLogout}>Logout</MenuItem> <MenuItem onClick={handleLogout}>Logout</MenuItem>
</Menu> </Menu>
</Toolbar> </Toolbar>