Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion api/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1170,6 +1170,24 @@ func (c *Client) CreateResetPasswordToken(ctx context.Context, req *proto.Create
return token, nil
}

func (c *Client) ListResetPasswordTokens(ctx context.Context, pageSize int, pageToken string) ([]types.UserToken, string, error) {
req := &proto.ListResetPasswordTokenRequest{
PageSize: int32(pageSize),
PageToken: pageToken,
}
resp, err := c.grpc.ListResetPasswordTokens(ctx, req)
if err != nil {
return nil, "", trace.Wrap(err)
}

// Convert concrete type []*types.UserTokenV3 to interface type []types.UserToken
tokens := make([]types.UserToken, len(resp.UserTokens))
for i, token := range resp.UserTokens {
tokens[i] = token
}
return tokens, resp.NextPageToken, nil
}

// GetAccessRequests retrieves a list of all access requests matching the provided filter.
func (c *Client) GetAccessRequests(ctx context.Context, filter types.AccessRequestFilter) ([]types.AccessRequest, error) {
requests, err := c.ListAllAccessRequests(ctx, &proto.ListAccessRequestsRequest{
Expand Down Expand Up @@ -2312,8 +2330,10 @@ func (c *Client) GetToken(ctx context.Context, name string) (types.ProvisionToke
}

// GetTokens returns a list of active provision tokens for nodes and users.
// Deprecated: Use [ListProvisionTokens], [GetStaticTokens], and [ListResetPasswordTokens] instead.
// TODO(hugoShaka): DELETE IN 19.0.0
func (c *Client) GetTokens(ctx context.Context) ([]types.ProvisionToken, error) {
resp, err := c.grpc.GetTokens(ctx, &emptypb.Empty{})
resp, err := c.grpc.GetTokens(ctx, &emptypb.Empty{}) //nolint:staticcheck // Provides backward compatibility, will be removed later.
if err != nil {
return nil, trace.Wrap(err)
}
Expand All @@ -2325,6 +2345,16 @@ func (c *Client) GetTokens(ctx context.Context) ([]types.ProvisionToken, error)
return tokens, nil
}

// GetStaticTokens returns the cluster static tokens.
func (c *Client) GetStaticTokens(ctx context.Context) (types.StaticTokens, error) {
tokens, err := c.grpc.GetStaticTokens(ctx, &emptypb.Empty{})
if err != nil {
return nil, trace.Wrap(err)
}

return tokens, nil
}

// ListProvisionTokens retrieves a paginated list of provision tokens.
func (c *Client) ListProvisionTokens(ctx context.Context, pageSize int, pageToken string, anyRoles types.SystemRoles, botName string) ([]types.ProvisionToken, string, error) {
resp, err := c.grpc.ListProvisionTokens(ctx, &proto.ListProvisionTokensRequest{
Expand Down
2,768 changes: 1,620 additions & 1,148 deletions api/client/proto/authservice.pb.go

Large diffs are not rendered by default.

87 changes: 87 additions & 0 deletions api/client/proto/authservice_grpc.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 28 additions & 1 deletion api/proto/teleport/legacy/client/proto/authservice.proto
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,24 @@ message CreateResetPasswordTokenRequest {
];
}

// ListResetPasswordTokenRequest is a request for a page of user tokens.
message ListResetPasswordTokenRequest {
// PageSize is the maximum amount of resources to retrieve.
int32 page_size = 1;
// StartKey is used to start listing resources from a specific spot. It
// should be set to the previous NextKey value if using pagination, or
// left empty.
string page_token = 2;
}

// ListResetPasswordTokenResponse contains a page of user tokens.
message ListResetPasswordTokenResponse {
// UserTokens is a list of user tokens.
repeated types.UserTokenV3 user_tokens = 1;
// NextKey is the key for the next page of user tokens.
string next_page_token = 2;
}

// RenewableCertsRequest is a request to generate a first set of renewable
// certificates from a bot join token.
message RenewableCertsRequest {
Expand Down Expand Up @@ -2846,6 +2864,9 @@ service AuthService {
// Only local users may be reset.
rpc CreateResetPasswordToken(CreateResetPasswordTokenRequest) returns (types.UserTokenV3);

// ListResetPasswordTokens returns a page of user tokens.
rpc ListResetPasswordTokens(ListResetPasswordTokenRequest) returns (ListResetPasswordTokenResponse);

// GetUser gets a user resource by name.
//
// Deprecated: Use [teleport.users.v1.UsersService] instead.
Expand Down Expand Up @@ -3198,7 +3219,13 @@ service AuthService {
// GetToken retrieves a token described by the given request.
rpc GetToken(types.ResourceRequest) returns (types.ProvisionTokenV2);
// GetToken retrieves all tokens.
rpc GetTokens(google.protobuf.Empty) returns (types.ProvisionTokenV2List);
// Deprecated: Use [ListProvisionTokens], [GetStaticTokens], and [ListResetPasswordTokens] instead.
// TODO(hugoShaka): DELETE IN 21.0.0
rpc GetTokens(google.protobuf.Empty) returns (types.ProvisionTokenV2List) {
option deprecated = true;
}
// GetStaticTokens retrieves all static tokens.
rpc GetStaticTokens(google.protobuf.Empty) returns (types.StaticTokensV2);
// ListToken retrieves a paginated list of filtered provision tokens.
rpc ListProvisionTokens(ListProvisionTokensRequest) returns (ListProvisionTokensResponse);
// CreateTokenV2 creates a token in a backend.
Expand Down
27 changes: 20 additions & 7 deletions lib/auth/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ import (
apievents "github.com/gravitational/teleport/api/types/events"
"github.com/gravitational/teleport/api/types/wrappers"
apiutils "github.com/gravitational/teleport/api/utils"
"github.com/gravitational/teleport/api/utils/clientutils"
"github.com/gravitational/teleport/api/utils/keys"
"github.com/gravitational/teleport/api/utils/keys/hardwarekey"
"github.com/gravitational/teleport/api/utils/retryutils"
Expand Down Expand Up @@ -112,6 +113,7 @@ import (
"github.com/gravitational/teleport/lib/gitlab"
"github.com/gravitational/teleport/lib/integrations/awsra/createsession"
"github.com/gravitational/teleport/lib/inventory"
iterstream "github.com/gravitational/teleport/lib/itertools/stream"
kubetoken "github.com/gravitational/teleport/lib/kube/token"
"github.com/gravitational/teleport/lib/limiter"
"github.com/gravitational/teleport/lib/loginrule"
Expand Down Expand Up @@ -5163,7 +5165,7 @@ const TokenExpiredOrNotFound = "token expired or not found"
// a list of roles this token allows its owner to assume and token labels, or an error if the token
// cannot be found.
func (a *Server) ValidateToken(ctx context.Context, token string) (types.ProvisionToken, error) {
tkns, err := a.GetStaticTokens()
tkns, err := a.GetStaticTokens(ctx)
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down Expand Up @@ -5218,7 +5220,7 @@ func (a *Server) checkTokenTTL(tok types.ProvisionToken) bool {
}

func (a *Server) DeleteToken(ctx context.Context, token string) (err error) {
tkns, err := a.GetStaticTokens()
tkns, err := a.GetStaticTokens(ctx)
if err != nil {
return trace.Wrap(err)
}
Expand All @@ -5242,24 +5244,35 @@ func (a *Server) DeleteToken(ctx context.Context, token string) (err error) {

// GetTokens returns all tokens (machine provisioning ones and user tokens). Machine
// tokens usually have "node roles", like auth,proxy,node and user invitation tokens have 'signup' role
func (a *Server) GetTokens(ctx context.Context, opts ...services.MarshalOption) (tokens []types.ProvisionToken, err error) {
// Deprecated: Use [ListProvisionTokens], [ListUserTokens], and [GetStaticTokens] instead.
// TODO(hugoShaka): DELETE IN 21.0.0
func (a *Server) GetTokens(ctx context.Context, opts ...services.MarshalOption) ([]types.ProvisionToken, error) {
// get node tokens:
tokens, err = a.Services.GetTokens(ctx)
tokens, err := iterstream.Collect(
clientutils.Resources(
ctx,
// ListProvisionTokens take too many arguments for [clientutils.Resources]
// so we wrap it to get the usual paginated signature.
func(ctx context.Context, pageSize int, pageKey string) ([]types.ProvisionToken, string, error) {
return a.Services.ListProvisionTokens(ctx, pageSize, pageKey, nil, "")
},
),
)
if err != nil {
return nil, trace.Wrap(err)
}
// get static tokens:
tkns, err := a.GetStaticTokens()
tkns, err := a.GetStaticTokens(ctx)
if err != nil && !trace.IsNotFound(err) {
return nil, trace.Wrap(err)
}
if err == nil {
tokens = append(tokens, tkns.GetStaticTokens()...)
}
// get user tokens:
userTokens, err := a.GetUserTokens(ctx)
userTokens, err := iterstream.Collect(clientutils.Resources(ctx, a.Services.ListUserTokens))
if err != nil {
return nil, trace.Wrap(err)
return nil, trace.Wrap(err, "retrieving user tokens")
}
// convert user tokens to machine tokens:
for _, t := range userTokens {
Expand Down
Loading
Loading