adding logic for key checks, OS on server

This commit is contained in:
afeiszli 2022-02-04 14:19:26 -05:00
parent 3248717585
commit 2cbf08ad1e
7 changed files with 42 additions and 26 deletions

View file

@ -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

View file

@ -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,

View file

@ -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 {

View file

@ -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
}

View file

@ -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)

View file

@ -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")

View file

@ -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