Browse Source

added TODO comment and allowed using enrollment key more than once

0xdcarns 2 years ago
parent
commit
0335e258ad
2 changed files with 24 additions and 14 deletions
  1. 23 8
      controllers/enrollmentkeys.go
  2. 1 6
      logic/hostactions/hostactions.go

+ 23 - 8
controllers/enrollmentkeys.go

@@ -152,9 +152,10 @@ func handleHostRegister(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
 		return
 	}
+	hostExists := false
 	// check if host already exists
-	if ok := logic.HostExists(&newHost); ok {
-		logger.Log(0, "host", newHost.ID.String(), newHost.Name, "attempted to re-register")
+	if hostExists = logic.HostExists(&newHost); hostExists && len(enrollmentKey.Networks) == 0 {
+		logger.Log(0, "host", newHost.ID.String(), newHost.Name, "attempted to re-register with no networks")
 		logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("host already exists"), "badrequest"))
 		return
 	}
@@ -176,13 +177,27 @@ func handleHostRegister(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("invalid enrollment key"), "badrequest"))
 		return
 	}
-	// register host
-	logic.CheckHostPorts(&newHost)
-	if err = logic.CreateHost(&newHost); err != nil {
-		logger.Log(0, "host", newHost.ID.String(), newHost.Name, "failed registration -", err.Error())
-		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
-		return
+	if !hostExists {
+		// register host
+		logic.CheckHostPorts(&newHost)
+		if err = logic.CreateHost(&newHost); err != nil {
+			logger.Log(0, "host", newHost.ID.String(), newHost.Name, "failed registration -", err.Error())
+			logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
+			return
+		}
+	} else {
+		// need to revise the list of networks from key
+		// based on the ones host currently has
+		var networksToAdd = []string{}
+		currentNets := logic.GetHostNetworks(newHost.ID.String())
+		for _, newNet := range enrollmentKey.Networks {
+			if !logic.StringSliceContains(currentNets, newNet) {
+				networksToAdd = append(networksToAdd, newNet)
+			}
+		}
+		enrollmentKey.Networks = networksToAdd
 	}
+
 	// ready the response
 	server := servercfg.GetServerInfo()
 	server.TrafficKey = key

+ 1 - 6
logic/hostactions/hostactions.go

@@ -22,6 +22,7 @@ func AddAction(hu models.HostUpdate) {
 }
 
 // GetAction - gets an action if exists
+// TODO: may need to move to DB rather than sync map for HA
 func GetAction(id string) *models.HostUpdate {
 	currentRecords, ok := nodeActionHandler.Load(id)
 	if !ok {
@@ -35,9 +36,3 @@ func GetAction(id string) *models.HostUpdate {
 	}
 	return nil
 }
-
-// [hostID][NodeAction1, NodeAction2]
-// host receives nodeaction1
-// host responds with ACK or something
-// mq then sends next action in list, NodeAction2
-// host responds, list is empty, finished