mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
chore: implement better 404 for unimplemented scim endpoints (#15232)
Prior to this, html was returned.
This commit is contained in:
@ -455,7 +455,7 @@ func New(ctx context.Context, options *Options) (_ *API, err error) {
|
|||||||
if len(options.SCIMAPIKey) != 0 {
|
if len(options.SCIMAPIKey) != 0 {
|
||||||
api.AGPL.RootHandler.Route("/scim/v2", func(r chi.Router) {
|
api.AGPL.RootHandler.Route("/scim/v2", func(r chi.Router) {
|
||||||
r.Use(
|
r.Use(
|
||||||
api.scimEnabledMW,
|
api.RequireFeatureMW(codersdk.FeatureSCIM),
|
||||||
)
|
)
|
||||||
r.Post("/Users", api.scimPostUser)
|
r.Post("/Users", api.scimPostUser)
|
||||||
r.Route("/Users", func(r chi.Router) {
|
r.Route("/Users", func(r chi.Router) {
|
||||||
@ -464,6 +464,13 @@ func New(ctx context.Context, options *Options) (_ *API, err error) {
|
|||||||
r.Get("/{id}", api.scimGetUser)
|
r.Get("/{id}", api.scimGetUser)
|
||||||
r.Patch("/{id}", api.scimPatchUser)
|
r.Patch("/{id}", api.scimPatchUser)
|
||||||
})
|
})
|
||||||
|
r.NotFound(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
u := r.URL.String()
|
||||||
|
httpapi.Write(r.Context(), w, http.StatusNotFound, codersdk.Response{
|
||||||
|
Message: fmt.Sprintf("SCIM endpoint %s not found", u),
|
||||||
|
Detail: "This endpoint is not implemented. If it is correct and required, please contact support.",
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// Show a helpful 404 error. Because this is not under the /api/v2 routes,
|
// Show a helpful 404 error. Because this is not under the /api/v2 routes,
|
||||||
|
@ -23,17 +23,6 @@ import (
|
|||||||
"github.com/coder/coder/v2/codersdk"
|
"github.com/coder/coder/v2/codersdk"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (api *API) scimEnabledMW(next http.Handler) http.Handler {
|
|
||||||
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
||||||
if !api.Entitlements.Enabled(codersdk.FeatureSCIM) {
|
|
||||||
httpapi.RouteNotFound(rw)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
next.ServeHTTP(rw, r)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (api *API) scimVerifyAuthHeader(r *http.Request) bool {
|
func (api *API) scimVerifyAuthHeader(r *http.Request) bool {
|
||||||
bearer := []byte("Bearer ")
|
bearer := []byte("Bearer ")
|
||||||
hdr := []byte(r.Header.Get("Authorization"))
|
hdr := []byte(r.Header.Get("Authorization"))
|
||||||
|
@ -88,7 +88,7 @@ func TestScim(t *testing.T) {
|
|||||||
res, err := client.Request(ctx, "POST", "/scim/v2/Users", struct{}{})
|
res, err := client.Request(ctx, "POST", "/scim/v2/Users", struct{}{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer res.Body.Close()
|
defer res.Body.Close()
|
||||||
assert.Equal(t, http.StatusNotFound, res.StatusCode)
|
assert.Equal(t, http.StatusForbidden, res.StatusCode)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("noAuth", func(t *testing.T) {
|
t.Run("noAuth", func(t *testing.T) {
|
||||||
@ -424,7 +424,7 @@ func TestScim(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, _ = io.Copy(io.Discard, res.Body)
|
_, _ = io.Copy(io.Discard, res.Body)
|
||||||
_ = res.Body.Close()
|
_ = res.Body.Close()
|
||||||
assert.Equal(t, http.StatusNotFound, res.StatusCode)
|
assert.Equal(t, http.StatusForbidden, res.StatusCode)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("noAuth", func(t *testing.T) {
|
t.Run("noAuth", func(t *testing.T) {
|
||||||
|
Reference in New Issue
Block a user