Skip to content

Commit eb982e7

Browse files
committed
Return 404 for all network operations without network controller.
This will prevent the api from trying to serve network requests in systems where libnetwork is not enabled, returning 404 responses in any case. Signed-off-by: David Calavera <[email protected]>
1 parent 365a0db commit eb982e7

4 files changed

Lines changed: 38 additions & 6 deletions

File tree

api/server/router/network/network.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package network
22

33
import (
4+
"net/http"
5+
6+
"github.com/docker/docker/api/server/httputils"
47
"github.com/docker/docker/api/server/router"
58
"github.com/docker/docker/api/server/router/local"
69
"github.com/docker/docker/daemon"
10+
"github.com/docker/docker/errors"
11+
"golang.org/x/net/context"
712
)
813

914
// networkRouter is a router to talk with the network controller
@@ -29,13 +34,24 @@ func (r *networkRouter) Routes() []router.Route {
2934
func (r *networkRouter) initRoutes() {
3035
r.routes = []router.Route{
3136
// GET
32-
local.NewGetRoute("/networks", r.getNetworksList),
33-
local.NewGetRoute("/networks/{id:.*}", r.getNetwork),
37+
local.NewGetRoute("/networks", r.controllerEnabledMiddleware(r.getNetworksList)),
38+
local.NewGetRoute("/networks/{id:.*}", r.controllerEnabledMiddleware(r.getNetwork)),
3439
// POST
35-
local.NewPostRoute("/networks/create", r.postNetworkCreate),
36-
local.NewPostRoute("/networks/{id:.*}/connect", r.postNetworkConnect),
37-
local.NewPostRoute("/networks/{id:.*}/disconnect", r.postNetworkDisconnect),
40+
local.NewPostRoute("/networks/create", r.controllerEnabledMiddleware(r.postNetworkCreate)),
41+
local.NewPostRoute("/networks/{id:.*}/connect", r.controllerEnabledMiddleware(r.postNetworkConnect)),
42+
local.NewPostRoute("/networks/{id:.*}/disconnect", r.controllerEnabledMiddleware(r.postNetworkDisconnect)),
3843
// DELETE
39-
local.NewDeleteRoute("/networks/{id:.*}", r.deleteNetwork),
44+
local.NewDeleteRoute("/networks/{id:.*}", r.controllerEnabledMiddleware(r.deleteNetwork)),
45+
}
46+
}
47+
48+
func (r *networkRouter) controllerEnabledMiddleware(handler httputils.APIFunc) httputils.APIFunc {
49+
if r.daemon.NetworkControllerEnabled() {
50+
return handler
4051
}
52+
return networkControllerDisabled
53+
}
54+
55+
func networkControllerDisabled(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
56+
return errors.ErrorNetworkControllerNotEnabled.WithArgs()
4157
}

api/server/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ func (s *Server) makeHTTPHandler(handler httputils.APIFunc) http.HandlerFunc {
170170
func (s *Server) InitRouters(d *daemon.Daemon) {
171171
s.addRouter(local.NewRouter(d))
172172
s.addRouter(network.NewRouter(d))
173+
173174
for _, srv := range s.servers {
174175
srv.srv.Handler = s.CreateMux()
175176
}

daemon/network.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ const (
1717
NetworkByName
1818
)
1919

20+
// NetworkControllerEnabled checks if the networking stack is enabled.
21+
// This feature depends on OS primitives and it's dissabled in systems like Windows.
22+
func (daemon *Daemon) NetworkControllerEnabled() bool {
23+
return daemon.netController != nil
24+
}
25+
2026
// FindNetwork function finds a network for a given string that can represent network name or id
2127
func (daemon *Daemon) FindNetwork(idName string) (libnetwork.Network, error) {
2228
// Find by Name

errors/server.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,13 @@ var (
2424
Description: "The client version is too old for the server",
2525
HTTPStatusCode: http.StatusBadRequest,
2626
})
27+
28+
// ErrorNetworkControllerNotEnabled is generated when the networking stack in not enabled
29+
// for certain platforms, like windows.
30+
ErrorNetworkControllerNotEnabled = errcode.Register(errGroup, errcode.ErrorDescriptor{
31+
Value: "NETWORK_CONTROLLER_NOT_ENABLED",
32+
Message: "the network controller is not enabled for this platform",
33+
Description: "Docker's networking stack is disabled for this platform",
34+
HTTPStatusCode: http.StatusNotFound,
35+
})
2736
)

0 commit comments

Comments
 (0)