From 2ee8e18ceb8c86ba5d1e91564a21a25e8bdef5d5 Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Tue, 29 Jul 2025 16:32:30 +0530 Subject: [PATCH 1/2] fix(go): permissions for network graph; --- pro/controllers/metrics.go | 19 ------------------- pro/controllers/networks.go | 31 +++++++++++++++++++++++++++++++ pro/initialize.go | 1 + 3 files changed, 32 insertions(+), 19 deletions(-) create mode 100644 pro/controllers/networks.go diff --git a/pro/controllers/metrics.go b/pro/controllers/metrics.go index c15c32e0..b670d7a3 100644 --- a/pro/controllers/metrics.go +++ b/pro/controllers/metrics.go @@ -20,7 +20,6 @@ func MetricHandlers(r *mux.Router) { r.HandleFunc("/api/metrics/{network}", logic.SecurityCheck(true, http.HandlerFunc(getNetworkNodesMetrics))).Methods(http.MethodGet) r.HandleFunc("/api/metrics", logic.SecurityCheck(true, http.HandlerFunc(getAllMetrics))).Methods(http.MethodGet) r.HandleFunc("/api/metrics-ext/{network}", logic.SecurityCheck(true, http.HandlerFunc(getNetworkExtMetrics))).Methods(http.MethodGet) - r.HandleFunc("/api/v1/graph/{network}", logic.SecurityCheck(true, http.HandlerFunc(graph))).Methods(http.MethodGet) } // get the metrics of a given node @@ -166,21 +165,3 @@ func getAllMetrics(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(networkMetrics) } - -func graph(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - - var params = mux.Vars(r) - network := params["network"] - networkNodes, err := logic.GetNetworkNodes(network) - if err != nil { - logger.Log(1, r.Header.Get("user"), "failed to get network nodes", err.Error()) - return - } - networkNodes = logic.AddStaticNodestoList(networkNodes) - // return all the nodes in JSON/API format - apiNodes := logic.GetAllNodesAPIWithLocation(networkNodes[:]) - logic.SortApiNodes(apiNodes[:]) - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(apiNodes) -} diff --git a/pro/controllers/networks.go b/pro/controllers/networks.go new file mode 100644 index 00000000..5120705d --- /dev/null +++ b/pro/controllers/networks.go @@ -0,0 +1,31 @@ +package controllers + +import ( + "encoding/json" + "github.com/gorilla/mux" + "github.com/gravitl/netmaker/logger" + "github.com/gravitl/netmaker/logic" + "net/http" +) + +func NetworkHandlers(r *mux.Router) { + r.HandleFunc("/api/v1/networks/{network}/graph", logic.SecurityCheck(true, http.HandlerFunc(getNetworkGraph))).Methods(http.MethodGet) +} + +func getNetworkGraph(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + + var params = mux.Vars(r) + network := params["network"] + networkNodes, err := logic.GetNetworkNodes(network) + if err != nil { + logger.Log(1, r.Header.Get("user"), "failed to get network nodes", err.Error()) + return + } + networkNodes = logic.AddStaticNodestoList(networkNodes) + // return all the nodes in JSON/API format + apiNodes := logic.GetAllNodesAPIWithLocation(networkNodes[:]) + logic.SortApiNodes(apiNodes[:]) + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(apiNodes) +} diff --git a/pro/initialize.go b/pro/initialize.go index 3d6b7210..4bf43104 100644 --- a/pro/initialize.go +++ b/pro/initialize.go @@ -35,6 +35,7 @@ func InitPro() { proControllers.RacHandlers, proControllers.EventHandlers, proControllers.TagHandlers, + proControllers.NetworkHandlers, ) controller.ListRoles = proControllers.ListRoles logic.EnterpriseCheckFuncs = append(logic.EnterpriseCheckFuncs, func() { From d90ad6f916abb25ed7c17948f5ae775d320c61b3 Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Wed, 30 Jul 2025 22:34:43 +0530 Subject: [PATCH 2/2] fix(go): allow platform user to get network graph; --- controllers/middleware.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/controllers/middleware.go b/controllers/middleware.go index abc22611..2f07ab1c 100644 --- a/controllers/middleware.go +++ b/controllers/middleware.go @@ -60,6 +60,11 @@ func userMiddleWare(handler http.Handler) http.Handler { if strings.Contains(route, "networks") { r.Header.Set("TARGET_RSRC", models.NetworkRsrc.String()) } + // check 'graph' after 'networks', otherwise the + // header will be overwritten. + if strings.Contains(route, "graph") { + r.Header.Set("TARGET_RSRC", models.HostRsrc.String()) + } if strings.Contains(route, "acls") { r.Header.Set("TARGET_RSRC", models.AclRsrc.String()) }