Skip to content

Commit

Permalink
Remove the auth namespaces REST API
Browse files Browse the repository at this point in the history
Eliminates the namespace CRUD API as part of
#49509.

The most notable change introduce here is with flushCache in the
auth helpers. It was ironically using namespaces because they
were deprecated, however, it has since been updated to use a role
instead. The helpers.go file was also updated not to rely on testify
in attempt to prevent it from being included in production builds.

Updates #6394.
  • Loading branch information
rosstimothy committed Jan 13, 2025
1 parent 646329d commit 8c01005
Show file tree
Hide file tree
Showing 19 changed files with 67 additions and 650 deletions.
55 changes: 0 additions & 55 deletions lib/auth/apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,12 +144,6 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) {
// TODO(strideynet): REMOVE IN 18.0.0 - this method is now gRPC
srv.POST("/:version/tokens/register", srv.WithAuth(srv.registerUsingToken))

// Namespaces
srv.POST("/:version/namespaces", srv.WithAuth(srv.upsertNamespace))
srv.GET("/:version/namespaces", srv.WithAuth(srv.getNamespaces))
srv.GET("/:version/namespaces/:namespace", srv.WithAuth(srv.getNamespace))
srv.DELETE("/:version/namespaces/:namespace", srv.WithAuth(srv.deleteNamespace))

// cluster configuration
srv.GET("/:version/configuration/name", srv.WithAuth(srv.getClusterName))
srv.POST("/:version/configuration/name", srv.WithAuth(srv.setClusterName))
Expand Down Expand Up @@ -669,55 +663,6 @@ func (s *APIServer) searchSessionEvents(auth *ServerWithRoles, w http.ResponseWr
return eventsList, nil
}

type upsertNamespaceReq struct {
Namespace types.Namespace `json:"namespace"`
}

func (s *APIServer) upsertNamespace(auth *ServerWithRoles, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
var req *upsertNamespaceReq
if err := httplib.ReadJSON(r, &req); err != nil {
return nil, trace.Wrap(err)
}
if err := auth.UpsertNamespace(req.Namespace); err != nil {
return nil, trace.Wrap(err)
}
return message("ok"), nil
}

func (s *APIServer) getNamespaces(auth *ServerWithRoles, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
namespaces, err := auth.GetNamespaces()
if err != nil {
return nil, trace.Wrap(err)
}
return namespaces, nil
}

func (s *APIServer) getNamespace(auth *ServerWithRoles, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
name := p.ByName("namespace")
if !types.IsValidNamespace(name) {
return nil, trace.BadParameter("invalid namespace %q", name)
}

namespace, err := auth.GetNamespace(name)
if err != nil {
return nil, trace.Wrap(err)
}
return namespace, nil
}

func (s *APIServer) deleteNamespace(auth *ServerWithRoles, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
name := p.ByName("namespace")
if !types.IsValidNamespace(name) {
return nil, trace.BadParameter("invalid namespace %q", name)
}

err := auth.DeleteNamespace(name)
if err != nil {
return nil, trace.Wrap(err)
}
return message("ok"), nil
}

func (s *APIServer) getClusterName(auth *ServerWithRoles, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
cn, err := auth.GetClusterName()
if err != nil {
Expand Down
15 changes: 0 additions & 15 deletions lib/auth/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -5065,21 +5065,6 @@ func (a *Server) GetWebSessionInfo(ctx context.Context, user, sessionID string)
return sess.WithoutSecrets(), nil
}

func (a *Server) DeleteNamespace(namespace string) error {
ctx := context.TODO()
if namespace == apidefaults.Namespace {
return trace.AccessDenied("can't delete default namespace")
}
nodes, err := a.GetNodes(ctx, namespace)
if err != nil {
return trace.Wrap(err)
}
if len(nodes) != 0 {
return trace.BadParameter("can't delete namespace %v that has %v registered nodes", namespace, len(nodes))
}
return a.Services.DeleteNamespace(namespace)
}

// IterateRoles is a helper used to read a page of roles with a custom matcher, used by access-control logic to handle
// per-resource read permissions.
func (a *Server) IterateRoles(ctx context.Context, req *proto.ListRolesRequest, match func(*types.RoleV6) (bool, error)) ([]*types.RoleV6, string, error) {
Expand Down
4 changes: 0 additions & 4 deletions lib/auth/auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,10 +194,6 @@ func newTestPack(
return p, trace.Wrap(err)
}

if err := p.a.UpsertNamespace(types.DefaultNamespace()); err != nil {
return p, trace.Wrap(err)
}

return p, nil
}

Expand Down
32 changes: 0 additions & 32 deletions lib/auth/auth_with_roles.go
Original file line number Diff line number Diff line change
Expand Up @@ -4346,38 +4346,6 @@ func (a *ServerWithRoles) findSessionEndEvent(ctx context.Context, sid session.I
return nil, trace.NotFound("session end event not found for session ID %q", sid)
}

// GetNamespaces returns a list of namespaces
func (a *ServerWithRoles) GetNamespaces() ([]types.Namespace, error) {
if err := a.action(types.KindNamespace, types.VerbList, types.VerbRead); err != nil {
return nil, trace.Wrap(err)
}
return a.authServer.GetNamespaces()
}

// GetNamespace returns namespace by name
func (a *ServerWithRoles) GetNamespace(name string) (*types.Namespace, error) {
if err := a.action(types.KindNamespace, types.VerbRead); err != nil {
return nil, trace.Wrap(err)
}
return a.authServer.GetNamespace(name)
}

// UpsertNamespace upserts namespace
func (a *ServerWithRoles) UpsertNamespace(ns types.Namespace) error {
if err := a.action(types.KindNamespace, types.VerbCreate, types.VerbUpdate); err != nil {
return trace.Wrap(err)
}
return a.authServer.UpsertNamespace(ns)
}

// DeleteNamespace deletes namespace by name
func (a *ServerWithRoles) DeleteNamespace(name string) error {
if err := a.action(types.KindNamespace, types.VerbDelete); err != nil {
return trace.Wrap(err)
}
return a.authServer.DeleteNamespace(name)
}

// GetRoles returns a list of roles
func (a *ServerWithRoles) GetRoles(ctx context.Context) ([]types.Role, error) {
// delegate all access-control logic to ListRoles, which will eventually
Expand Down
54 changes: 0 additions & 54 deletions lib/auth/authclient/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,12 +144,6 @@ type ReadNodeAccessPoint interface {
// GetRoles returns a list of roles
GetRoles(ctx context.Context) ([]types.Role, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetNetworkRestrictions returns networking restrictions for restricted shell to enforce
GetNetworkRestrictions(ctx context.Context) (types.NetworkRestrictions, error)
}
Expand Down Expand Up @@ -208,12 +202,6 @@ type ReadProxyAccessPoint interface {
// GetUser returns a services.User for this cluster.
GetUser(ctx context.Context, name string, withSecrets bool) (types.User, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetNode returns a node by name and namespace.
GetNode(ctx context.Context, namespace, name string) (types.Server, error)

Expand Down Expand Up @@ -378,12 +366,6 @@ type ReadRemoteProxyAccessPoint interface {
// GetRoles returns a list of roles
GetRoles(ctx context.Context) ([]types.Role, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetNode returns a node by name and namespace.
GetNode(ctx context.Context, namespace, name string) (types.Server, error)

Expand Down Expand Up @@ -472,12 +454,6 @@ type ReadKubernetesAccessPoint interface {
// GetRoles returns a list of roles
GetRoles(ctx context.Context) ([]types.Role, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetKubernetesServers returns a list of kubernetes servers registered in the cluster
GetKubernetesServers(context.Context) ([]types.KubeServer, error)

Expand Down Expand Up @@ -551,12 +527,6 @@ type ReadAppsAccessPoint interface {
// GetProxies returns a list of proxy servers registered in the cluster
GetProxies() ([]types.Server, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetApps returns all application resources.
GetApps(ctx context.Context) ([]types.Application, error)

Expand Down Expand Up @@ -618,12 +588,6 @@ type ReadDatabaseAccessPoint interface {
// GetProxies returns a list of proxy servers registered in the cluster
GetProxies() ([]types.Server, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetDatabases returns all database resources.
GetDatabases(ctx context.Context) ([]types.Database, error)

Expand Down Expand Up @@ -682,12 +646,6 @@ type ReadWindowsDesktopAccessPoint interface {
// GetRoles returns a list of roles
GetRoles(ctx context.Context) ([]types.Role, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetWindowsDesktops returns windows desktop hosts.
GetWindowsDesktops(ctx context.Context, filter types.WindowsDesktopFilter) ([]types.WindowsDesktop, error)

Expand Down Expand Up @@ -728,12 +686,6 @@ type ReadDiscoveryAccessPoint interface {
// GetClusterName gets the name of the cluster from the backend.
GetClusterName(opts ...services.MarshalOption) (types.ClusterName, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetNodes returns a list of registered servers for this cluster.
GetNodes(ctx context.Context, namespace string) ([]types.Server, error)
// GetKubernetesCluster returns a kubernetes cluster resource identified by name.
Expand Down Expand Up @@ -994,12 +946,6 @@ type Cache interface {
// GetSessionRecordingConfig returns session recording configuration.
GetSessionRecordingConfig(ctx context.Context) (types.SessionRecordingConfig, error)

// GetNamespaces returns a list of namespaces
GetNamespaces() ([]types.Namespace, error)

// GetNamespace returns namespace by name
GetNamespace(name string) (*types.Namespace, error)

// GetNode returns a node by name and namespace.
GetNode(ctx context.Context, namespace, name string) (types.Server, error)

Expand Down
42 changes: 0 additions & 42 deletions lib/auth/authclient/http_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import (
"github.com/gravitational/teleport/lib/defaults"
"github.com/gravitational/teleport/lib/httplib"
"github.com/gravitational/teleport/lib/services"
"github.com/gravitational/teleport/lib/utils"
)

// HTTPClientConfig contains configuration for an HTTP client.
Expand Down Expand Up @@ -797,47 +796,6 @@ func (c *HTTPClient) ValidateGithubAuthCallback(ctx context.Context, q url.Value
return &response, nil
}

// GetNamespaces returns a list of namespaces
func (c *HTTPClient) GetNamespaces() ([]types.Namespace, error) {
out, err := c.Get(context.TODO(), c.Endpoint("namespaces"), url.Values{})
if err != nil {
return nil, trace.Wrap(err)
}
var re []types.Namespace
if err := utils.FastUnmarshal(out.Bytes(), &re); err != nil {
return nil, trace.Wrap(err)
}
return re, nil
}

// GetNamespace returns namespace by name
func (c *HTTPClient) GetNamespace(name string) (*types.Namespace, error) {
if name == "" {
return nil, trace.BadParameter("missing namespace name")
}
out, err := c.Get(context.TODO(), c.Endpoint("namespaces", name), url.Values{})
if err != nil {
return nil, trace.Wrap(err)
}
return services.UnmarshalNamespace(out.Bytes())
}

type upsertNamespaceReq struct {
Namespace types.Namespace `json:"namespace"`
}

// UpsertNamespace upserts namespace
func (c *HTTPClient) UpsertNamespace(ns types.Namespace) error {
_, err := c.PostJSON(context.TODO(), c.Endpoint("namespaces"), upsertNamespaceReq{Namespace: ns})
return trace.Wrap(err)
}

// DeleteNamespace deletes namespace by name
func (c *HTTPClient) DeleteNamespace(name string) error {
_, err := c.Delete(context.TODO(), c.Endpoint("namespaces", name))
return trace.Wrap(err)
}

// GetClusterName returns a cluster name
func (c *HTTPClient) GetClusterName(opts ...services.MarshalOption) (types.ClusterName, error) {
out, err := c.Get(context.TODO(), c.Endpoint("configuration", "name"), url.Values{})
Expand Down
Loading

0 comments on commit 8c01005

Please sign in to comment.