Correctly return when repo name is not available
The branch that executes after a failed request authorization due to a missing repo name now correctly returns an error. This is somewhat superficial since the response would have already been executed. Although, unintended repository operations may have occurred. Documentations and comments have also been updated to be in line with surrounding changes. Signed-off-by: Stephen J Day <stephen.day@docker.com>
This commit is contained in:
parent
9bde7d9835
commit
287e11e1d4
1 changed files with 10 additions and 7 deletions
17
docs/app.go
17
docs/app.go
|
@ -222,6 +222,7 @@ func (app *App) dispatcher(dispatch dispatchFunc) http.Handler {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if err := app.authorized(w, r, context); err != nil {
|
if err := app.authorized(w, r, context); err != nil {
|
||||||
|
ctxu.GetLogger(context).Errorf("error authorizing context: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,8 +271,8 @@ func (app *App) context(w http.ResponseWriter, r *http.Request) *Context {
|
||||||
}
|
}
|
||||||
|
|
||||||
// authorized checks if the request can proceed with access to the requested
|
// authorized checks if the request can proceed with access to the requested
|
||||||
// repository. If it succeeds, the repository will be available on the
|
// repository. If it succeeds, the context may access the requested
|
||||||
// context. An error will be if access is not available.
|
// repository. An error will be returned if access is not available.
|
||||||
func (app *App) authorized(w http.ResponseWriter, r *http.Request, context *Context) error {
|
func (app *App) authorized(w http.ResponseWriter, r *http.Request, context *Context) error {
|
||||||
ctxu.GetLogger(context).Debug("authorizing request")
|
ctxu.GetLogger(context).Debug("authorizing request")
|
||||||
repo := getName(context)
|
repo := getName(context)
|
||||||
|
@ -319,17 +320,19 @@ func (app *App) authorized(w http.ResponseWriter, r *http.Request, context *Cont
|
||||||
route := mux.CurrentRoute(r)
|
route := mux.CurrentRoute(r)
|
||||||
|
|
||||||
if route == nil || route.GetName() != v2.RouteNameBase {
|
if route == nil || route.GetName() != v2.RouteNameBase {
|
||||||
// For this to be properly secured, context.Name must always be set
|
// For this to be properly secured, repo must always be set for a
|
||||||
// for a resource that may make a modification. The only condition
|
// resource that may make a modification. The only condition under
|
||||||
// under which name is not set and we still allow access is when the
|
// which name is not set and we still allow access is when the
|
||||||
// base route is accessed. This section prevents us from making that
|
// base route is accessed. This section prevents us from making
|
||||||
// mistake elsewhere in the code, allowing any operation to proceed.
|
// that mistake elsewhere in the code, allowing any operation to
|
||||||
|
// proceed.
|
||||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
w.WriteHeader(http.StatusForbidden)
|
w.WriteHeader(http.StatusForbidden)
|
||||||
|
|
||||||
var errs v2.Errors
|
var errs v2.Errors
|
||||||
errs.Push(v2.ErrorCodeUnauthorized)
|
errs.Push(v2.ErrorCodeUnauthorized)
|
||||||
serveJSON(w, errs)
|
serveJSON(w, errs)
|
||||||
|
return fmt.Errorf("forbidden: no repository name")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue