Browse Source

adding logic for key checks, OS on server

afeiszli 3 years ago
parent
commit
2cbf08ad1e

+ 1 - 5
controllers/node.go

@@ -2,7 +2,6 @@ package controller
 
 import (
 	"encoding/json"
-	"errors"
 	"fmt"
 	"net/http"
 	"strings"
@@ -610,10 +609,7 @@ func deleteNode(w http.ResponseWriter, r *http.Request) {
 
 func runUpdates(node *models.Node, nodeUpdate bool) error {
 	//don't publish to server node
-	if node.IsServer == "yes" {
-		return errors.New("attempt to publish to server node")
-	}
-	if nodeUpdate {
+	if nodeUpdate && !isServer(node) {
 		if err := mq.NodeUpdate(node); err != nil {
 			logger.Log(1, "error publishing node update", err.Error())
 			return err

+ 10 - 8
controllers/node_grpc.go

@@ -4,10 +4,9 @@ import (
 	"context"
 	"encoding/json"
 	"errors"
-	"log"
+	"fmt"
 	"time"
 
-	"github.com/gravitl/netmaker/functions"
 	nodepb "github.com/gravitl/netmaker/grpc"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
@@ -63,7 +62,6 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object)
 	if err != nil {
 		return nil, err
 	}
-	log.Println("DELETE ME: Operating System = " + node.OS)
 	if !validKey {
 		if node.NetworkSettings.AllowManualSignUp == "yes" {
 			node.IsPending = "yes"
@@ -71,11 +69,6 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object)
 			return nil, errors.New("invalid key, and network does not allow no-key signups")
 		}
 	}
-	unique, _ := functions.IsMacAddressUnique(node.MacAddress, node.Network)
-	if !unique {
-		return nil, errors.New("macaddress is not unique")
-	}
-
 	getServerAddrs(&node)
 
 	key, keyErr := logic.RetrievePublicTrafficKey()
@@ -84,6 +77,15 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object)
 		return nil, keyErr
 	}
 
+	if key == nil {
+		logger.Log(0, "error: server traffic key is nil")
+		return nil, fmt.Errorf("error: server traffic key is nil")
+	}
+	if node.TrafficKeys.Mine == nil {
+		logger.Log(0, "error: node traffic key is nil")
+		return nil, fmt.Errorf("error: node traffic key is nil")
+	}
+
 	node.TrafficKeys = models.TrafficKeys{
 		Mine:   node.TrafficKeys.Mine,
 		Server: key,

+ 0 - 11
functions/helpers.go

@@ -127,17 +127,6 @@ func IsNetworkDisplayNameUnique(name string) (bool, error) {
 	return isunique, nil
 }
 
-// IsMacAddressUnique - checks if mac is unique
-func IsMacAddressUnique(macaddress string, networkName string) (bool, error) {
-
-	_, err := database.FetchRecord(database.NODES_TABLE_NAME, macaddress+"###"+networkName)
-	if err != nil {
-		return database.IsEmptyRecord(err), err
-	}
-
-	return true, nil
-}
-
 // IsKeyValidGlobal - checks if a key is valid globally
 func IsKeyValidGlobal(keyvalue string) bool {
 

+ 23 - 1
logic/nodes.go

@@ -175,8 +175,10 @@ func ValidateNode(node *models.Node, isUpdate bool) error {
 		if isUpdate {
 			return true
 		}
+		unique, _ := isMacAddressUnique(node.MacAddress, node.Network)
+
 		isFieldUnique, _ := IsNodeIDUnique(node)
-		return isFieldUnique
+		return isFieldUnique && unique
 	})
 	_ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
 		_, err := GetNetworkByNode(node)
@@ -592,3 +594,23 @@ func validateServer(currentNode, newNode *models.Node) bool {
 		newNode.ListenPort == currentNode.ListenPort &&
 		newNode.IsServer == "yes")
 }
+
+// isMacAddressUnique - checks if mac is unique
+func isMacAddressUnique(macaddress string, networkName string) (bool, error) {
+
+	isunique := true
+
+	nodes, err := GetNetworkNodes(networkName)
+	if err != nil {
+		return database.IsEmptyRecord(err), err
+	}
+
+	for _, node := range nodes {
+
+		if node.MacAddress == macaddress {
+			isunique = false
+		}
+	}
+
+	return isunique, nil
+}

+ 2 - 0
logic/server.go

@@ -44,6 +44,8 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) {
 		UDPHolePunch: "no",
 		IsLocal:      networkSettings.IsLocal,
 		LocalRange:   networkSettings.LocalRange,
+		OS:           runtime.GOOS,
+		Version:      servercfg.Version,
 	}
 
 	SetNodeDefaults(node)

+ 4 - 1
netclient/functions/daemon.go

@@ -46,7 +46,10 @@ func insert(network, which, cache string) {
 func read(network, which string) string {
 	val, isok := messageCache.Load(fmt.Sprintf("%s%s", network, which))
 	if isok {
-		var readMessage = val.(cachedMessage)                        // fetch current cached message
+		var readMessage = val.(cachedMessage) // fetch current cached message
+		if readMessage.LastSeen.IsZero() {
+			return ""
+		}
 		if time.Now().After(readMessage.LastSeen.Add(time.Minute)) { // check if message has been there over a minute
 			messageCache.Delete(fmt.Sprintf("%s%s", network, which)) // remove old message if expired
 			ncutils.Log("cached message expired")

+ 2 - 0
netclient/functions/join.go

@@ -60,6 +60,8 @@ func JoinNetwork(cfg config.ClientConfig, privateKey string) error {
 	trafficPubKeyBytes, err := ncutils.ConvertKeyToBytes(trafficPubKey)
 	if err != nil {
 		return err
+	} else if trafficPubKeyBytes == nil {
+		return fmt.Errorf("traffic key is nil")
 	}
 
 	cfg.Node.TrafficKeys.Mine = trafficPubKeyBytes