|
@@ -11,6 +11,8 @@ import (
|
|
|
"github.com/gravitl/netmaker/functions"
|
|
|
"github.com/gravitl/netmaker/logger"
|
|
|
"github.com/gravitl/netmaker/logic"
|
|
|
+ "github.com/gravitl/netmaker/logic/acls"
|
|
|
+ nodeacls "github.com/gravitl/netmaker/logic/acls/node-acls"
|
|
|
"github.com/gravitl/netmaker/models"
|
|
|
"github.com/gravitl/netmaker/mq"
|
|
|
"github.com/gravitl/netmaker/servercfg"
|
|
@@ -34,7 +36,9 @@ func nodeHandlers(r *mux.Router) {
|
|
|
r.HandleFunc("/api/nodes/{network}", createNode).Methods("POST")
|
|
|
r.HandleFunc("/api/nodes/adm/{network}/lastmodified", authorize(true, "network", http.HandlerFunc(getLastModified))).Methods("GET")
|
|
|
r.HandleFunc("/api/nodes/adm/{network}/authenticate", authenticate).Methods("POST")
|
|
|
-
|
|
|
+ // ACLs
|
|
|
+ r.HandleFunc("/api/nodes/{network}/{nodeid}/acls", authorize(true, "node", http.HandlerFunc(getNodeACL))).Methods("GET")
|
|
|
+ r.HandleFunc("/api/nodes/{network}/{nodeid}/acls", authorize(true, "node", http.HandlerFunc(updateNodeACL))).Methods("PUT")
|
|
|
}
|
|
|
|
|
|
func authenticate(response http.ResponseWriter, request *http.Request) {
|
|
@@ -339,6 +343,25 @@ func getNode(w http.ResponseWriter, r *http.Request) {
|
|
|
json.NewEncoder(w).Encode(node)
|
|
|
}
|
|
|
|
|
|
+// Get an individual node. Nothin fancy here folks.
|
|
|
+func getNodeACL(w http.ResponseWriter, r *http.Request) {
|
|
|
+ // set header.
|
|
|
+ w.Header().Set("Content-Type", "application/json")
|
|
|
+
|
|
|
+ var params = mux.Vars(r)
|
|
|
+ var nodeID = params["nodeid"]
|
|
|
+ var networkID = params["network"]
|
|
|
+
|
|
|
+ nodeACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(networkID), nodeacls.NodeID(nodeID))
|
|
|
+ if err != nil {
|
|
|
+ returnErrorResponse(w, r, formatError(err, "notfound"))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ logger.Log(2, r.Header.Get("user"), "fetched node ACL", params["nodeid"])
|
|
|
+ w.WriteHeader(http.StatusOK)
|
|
|
+ json.NewEncoder(w).Encode(nodeACL)
|
|
|
+}
|
|
|
+
|
|
|
//Get the time that a network of nodes was last modified.
|
|
|
//TODO: This needs to be refactored
|
|
|
//Potential way to do this: On UpdateNode, set a new field for "LastModified"
|
|
@@ -623,6 +646,31 @@ func deleteNode(w http.ResponseWriter, r *http.Request) {
|
|
|
runForceServerUpdate(&node)
|
|
|
}
|
|
|
|
|
|
+func updateNodeACL(w http.ResponseWriter, r *http.Request) {
|
|
|
+ w.Header().Set("Content-Type", "application/json")
|
|
|
+
|
|
|
+ var params = mux.Vars(r)
|
|
|
+ var nodeID = params["nodeid"]
|
|
|
+ var networkID = params["network"]
|
|
|
+ var newNodeACL acls.ACL
|
|
|
+ // we decode our body request params
|
|
|
+ err := json.NewDecoder(r.Body).Decode(&newNodeACL)
|
|
|
+ if err != nil {
|
|
|
+ returnErrorResponse(w, r, formatError(err, "badrequest"))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ newNodeACL, err = nodeacls.UpdateNodeACL(nodeacls.NetworkID(networkID), nodeacls.NodeID(nodeID), newNodeACL)
|
|
|
+ if err != nil {
|
|
|
+ returnErrorResponse(w, r, formatError(err, "internal"))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ logger.Log(1, r.Header.Get("user"), "updated node ACL for", nodeID, "on network", networkID)
|
|
|
+ w.WriteHeader(http.StatusOK)
|
|
|
+ json.NewEncoder(w).Encode(newNodeACL)
|
|
|
+}
|
|
|
+
|
|
|
func runUpdates(node *models.Node, ifaceDelta bool) {
|
|
|
go func() { // don't block http response
|
|
|
// publish node update if not server
|