diff --git a/controllers/node.go b/controllers/node.go index 3981dede..8f3ef7d7 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -635,6 +635,10 @@ func updateNode(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) return } + if len(newData.Metadata) > 255 { + logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("metadata cannot be longer than 255 characters"), "badrequest")) + return + } newNode := newData.ConvertToServerNode(¤tNode) relayUpdate := logic.RelayUpdates(¤tNode, newNode) _, err = logic.GetHost(newNode.HostID.String()) diff --git a/logic/gateway.go b/logic/gateway.go index a96511f5..546dc51d 100644 --- a/logic/gateway.go +++ b/logic/gateway.go @@ -174,6 +174,9 @@ func CreateIngressGateway(netid string, nodeid string, ingress models.IngressReq node.IngressGatewayRange6 = network.AddressRange6 node.IngressDNS = ingress.ExtclientDNS node.SetLastModified() + if node.Metadata == "" { + node.Metadata = "This host can be used for remote access" + } err = UpsertNode(&node) if err != nil { return models.Node{}, err @@ -224,6 +227,7 @@ func DeleteIngressGateway(nodeid string) (models.Node, []models.ExtClient, error node.IsIngressGateway = false node.IsInternetGateway = false node.IngressGatewayRange = "" + node.Metadata = "" err = UpsertNode(&node) if err != nil { return models.Node{}, removedClients, err diff --git a/models/api_node.go b/models/api_node.go index 7a841f18..eb269fa9 100644 --- a/models/api_node.go +++ b/models/api_node.go @@ -11,9 +11,9 @@ import ( type ApiNode struct { ID string `json:"id,omitempty" validate:"required,min=5,id_unique"` HostID string `json:"hostid,omitempty" validate:"required,min=5,id_unique"` - Address string `json:"address" validate:"omitempty,ipv4"` - Address6 string `json:"address6" validate:"omitempty,ipv6"` - LocalAddress string `json:"localaddress" validate:"omitempty,ipv4"` + Address string `json:"address" validate:"omitempty,cidrv4"` + Address6 string `json:"address6" validate:"omitempty,cidrv6"` + LocalAddress string `json:"localaddress" validate:"omitempty,cidr"` AllowedIPs []string `json:"allowedips"` LastModified int64 `json:"lastmodified"` ExpirationDateTime int64 `json:"expdatetime"` @@ -37,6 +37,7 @@ type ApiNode struct { InternetGateway string `json:"internetgateway"` Connected bool `json:"connected"` PendingDelete bool `json:"pendingdelete"` + Metadata string `json:"metadata" validate:"max=256"` // == PRO == DefaultACL string `json:"defaultacl,omitempty" validate:"checkyesornoorunset"` IsFailOver bool `json:"is_fail_over"` @@ -104,6 +105,7 @@ func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node { convertedNode.LastCheckIn = time.Unix(a.LastCheckIn, 0) convertedNode.LastPeerUpdate = time.Unix(a.LastPeerUpdate, 0) convertedNode.ExpirationDateTime = time.Unix(a.ExpirationDateTime, 0) + convertedNode.Metadata = a.Metadata return &convertedNode } @@ -158,6 +160,7 @@ func (nm *Node) ConvertToAPINode() *ApiNode { apiNode.IsFailOver = nm.IsFailOver apiNode.FailOverPeers = nm.FailOverPeers apiNode.FailedOverBy = nm.FailedOverBy + apiNode.Metadata = nm.Metadata return &apiNode } diff --git a/models/node.go b/models/node.go index 05f1b4d5..fcbc6510 100644 --- a/models/node.go +++ b/models/node.go @@ -87,6 +87,7 @@ type Node struct { EgressGatewayRequest EgressGatewayRequest `json:"egressgatewayrequest" bson:"egressgatewayrequest" yaml:"egressgatewayrequest"` IngressGatewayRange string `json:"ingressgatewayrange" bson:"ingressgatewayrange" yaml:"ingressgatewayrange"` IngressGatewayRange6 string `json:"ingressgatewayrange6" bson:"ingressgatewayrange6" yaml:"ingressgatewayrange6"` + Metadata string `json:"metadata"` // == PRO == DefaultACL string `json:"defaultacl,omitempty" bson:"defaultacl,omitempty" yaml:"defaultacl,omitempty" validate:"checkyesornoorunset"` OwnerID string `json:"ownerid,omitempty" bson:"ownerid,omitempty" yaml:"ownerid,omitempty"` diff --git a/models/structs.go b/models/structs.go index fc03cc95..d35e4b54 100644 --- a/models/structs.go +++ b/models/structs.go @@ -71,6 +71,7 @@ type UserRemoteGws struct { IsInternetGateway bool `json:"is_internet_gateway"` GwClient ExtClient `json:"gw_client"` GwPeerPublicKey string `json:"gw_peer_public_key"` + Metadata string `json:"metadata"` } // UserRemoteGwsReq - struct to hold user remote acccess gws req diff --git a/pro/controllers/users.go b/pro/controllers/users.go index 7384a47b..468c667b 100644 --- a/pro/controllers/users.go +++ b/pro/controllers/users.go @@ -212,6 +212,7 @@ func getUserRemoteAccessGws(w http.ResponseWriter, r *http.Request) { Connected: true, IsInternetGateway: node.IsInternetGateway, GwPeerPublicKey: host.PublicKey.String(), + Metadata: node.Metadata, }) userGws[node.Network] = gws delete(user.RemoteGwIDs, node.ID.String()) @@ -226,6 +227,7 @@ func getUserRemoteAccessGws(w http.ResponseWriter, r *http.Request) { Connected: true, IsInternetGateway: node.IsInternetGateway, GwPeerPublicKey: host.PublicKey.String(), + Metadata: node.Metadata, }) userGws[node.Network] = gws processedAdminNodeIds[node.ID.String()] = struct{}{} @@ -258,6 +260,7 @@ func getUserRemoteAccessGws(w http.ResponseWriter, r *http.Request) { Network: node.Network, IsInternetGateway: node.IsInternetGateway, GwPeerPublicKey: host.PublicKey.String(), + Metadata: node.Metadata, }) userGws[node.Network] = gws } @@ -284,6 +287,7 @@ func getUserRemoteAccessGws(w http.ResponseWriter, r *http.Request) { Network: node.Network, IsInternetGateway: node.IsInternetGateway, GwPeerPublicKey: host.PublicKey.String(), + Metadata: node.Metadata, }) userGws[node.Network] = gws }