diff --git a/controllers/networkHttpController.go b/controllers/networkHttpController.go index d9f0e260..9069ccd1 100644 --- a/controllers/networkHttpController.go +++ b/controllers/networkHttpController.go @@ -112,31 +112,30 @@ func getNetworks(w http.ResponseWriter, r *http.Request) { } } -func ValidateNetworkUpdate(network models.Network) error { - +func ValidateNetworkUpdate(network models.NetworkUpdate) error { v := validator.New() - _ = v.RegisterValidation("addressrange_valid", func(fl validator.FieldLevel) bool { - isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String()) - return isvalid - }) - _ = v.RegisterValidation("addressrange6_valid", func(fl validator.FieldLevel) bool { - isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String()) - return isvalid - }) + // _ = v.RegisterValidation("addressrange_valid", func(fl validator.FieldLevel) bool { + // isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String()) + // return isvalid + // }) + //_ = v.RegisterValidation("addressrange6_valid", func(fl validator.FieldLevel) bool { + // isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String()) + // return isvalid + // }) - _ = v.RegisterValidation("localrange_valid", func(fl validator.FieldLevel) bool { - isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String()) - return isvalid - }) + // _ = v.RegisterValidation("localrange_valid", func(fl validator.FieldLevel) bool { + // isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String()) + // return isvalid + // }) - _ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool { - return true - }) + // _ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool { + // return true + // }) - _ = v.RegisterValidation("displayname_unique", func(fl validator.FieldLevel) bool { - return true - }) + // _ = v.RegisterValidation("displayname_unique", func(fl validator.FieldLevel) bool { + // return true + // }) err := v.Struct(network) @@ -309,14 +308,13 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) { return } - var networkChange models.Network + var networkChange models.NetworkUpdate haschange := false hasrangeupdate := false haslocalrangeupdate := false _ = json.NewDecoder(r.Body).Decode(&networkChange) - if networkChange.AddressRange == "" { networkChange.AddressRange = network.AddressRange } diff --git a/controllers/networkHttpController_test.go b/controllers/networkHttpController_test.go index 849558df..8776649e 100644 --- a/controllers/networkHttpController_test.go +++ b/controllers/networkHttpController_test.go @@ -237,6 +237,112 @@ func TestSecurityCheck(t *testing.T) { }) } func TestValidateNetworkUpdate(t *testing.T) { + //yes := true + //no := false + deleteNet() + //DeleteNetworks + cases := []NetworkValidationTestCase{ + NetworkValidationTestCase{ + testname: "InvalidAddress", + network: models.Network{ + AddressRange: "10.0.0.256", + }, + errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag", + }, + NetworkValidationTestCase{ + testname: "InvalidAddress6", + network: models.Network{ + AddressRange6: "2607::ag", + }, + errMessage: "Field validation for 'AddressRange6' failed on the 'cidr' tag", + }, + + NetworkValidationTestCase{ + testname: "BadDisplayName", + network: models.Network{ + DisplayName: "skynet*", + }, + errMessage: "Field validation for 'DisplayName' failed on the 'alphanum' tag", + }, + NetworkValidationTestCase{ + testname: "DisplayNameTooLong", + network: models.Network{ + DisplayName: "Thisisareallylongdisplaynamethatistoolong", + }, + errMessage: "Field validation for 'DisplayName' failed on the 'max' tag", + }, + NetworkValidationTestCase{ + testname: "DisplayNameTooShort", + network: models.Network{ + DisplayName: "1", + }, + errMessage: "Field validation for 'DisplayName' failed on the 'min' tag", + }, + NetworkValidationTestCase{ + testname: "InvalidNetID", + network: models.Network{ + NetID: "contains spaces", + }, + errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag", + }, + NetworkValidationTestCase{ + testname: "NetIDTooLong", + network: models.Network{ + NetID: "LongNetIDName", + }, + errMessage: "Field validation for 'NetID' failed on the 'max' tag", + }, + NetworkValidationTestCase{ + testname: "ListenPortTooLow", + network: models.Network{ + DefaultListenPort: 1023, + }, + errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag", + }, + NetworkValidationTestCase{ + testname: "ListenPortTooHigh", + network: models.Network{ + DefaultListenPort: 65536, + }, + errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag", + }, + NetworkValidationTestCase{ + testname: "KeepAliveTooBig", + network: models.Network{ + DefaultKeepalive: 1010, + }, + errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag", + }, + NetworkValidationTestCase{ + testname: "InvalidLocalRange", + network: models.Network{ + LocalRange: "192.168.0.1", + }, + errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag", + }, + NetworkValidationTestCase{ + testname: "CheckInIntervalTooBig", + network: models.Network{ + DefaultCheckInInterval: 100001, + }, + errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'max' tag", + }, + NetworkValidationTestCase{ + testname: "CheckInIntervalTooSmall", + network: models.Network{ + DefaultCheckInInterval: 1, + }, + errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'min' tag", + }, + } + for _, tc := range cases { + t.Run(tc.testname, func(t *testing.T) { + network := models.NetworkUpdate(tc.network) + err := ValidateNetworkUpdate(network) + assert.NotNil(t, err) + assert.Contains(t, err.Error(), tc.errMessage) + }) + } } func TestValidateNetworkCreate(t *testing.T) { yes := true diff --git a/models/network.go b/models/network.go index 0345028f..1a3ab64f 100644 --- a/models/network.go +++ b/models/network.go @@ -35,6 +35,33 @@ type Network struct { //can't have min=1 with omitempty DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"` } +type NetworkUpdate struct { + ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"` + AddressRange string `json:"addressrange" bson:"addressrange" validate:"omitempty,cidr"` + + // bug in validator --- required_with does not work with bools issue#683 + // AddressRange6 string `json:"addressrange6" bson:"addressrange6" validate:"required_with=isdualstack true,cidrv6"` + AddressRange6 string `json:"addressrange6" bson:"addressrange6" validate:"omitempty,cidr"` + //can't have min=1 with omitempty + DisplayName string `json:"displayname,omitempty" bson:"displayname,omitempty" validate:"omitempty,alphanum,min=2,max=20"` + NetID string `json:"netid" bson:"netid" validate:"alphanum,min=1,max=12"` + NodesLastModified int64 `json:"nodeslastmodified" bson:"nodeslastmodified"` + NetworkLastModified int64 `json:"networklastmodified" bson:"networklastmodified"` + DefaultInterface string `json:"defaultinterface" bson:"defaultinterface"` + DefaultListenPort int32 `json:"defaultlistenport,omitempty" bson:"defaultlistenport,omitempty" validate:"omitempty,min=1024,max=65535"` + DefaultPostUp string `json:"defaultpostup" bson:"defaultpostup"` + DefaultPostDown string `json:"defaultpostdown" bson:"defaultpostdown"` + KeyUpdateTimeStamp int64 `json:"keyupdatetimestamp" bson:"keyupdatetimestamp"` + DefaultKeepalive int32 `json:"defaultkeepalive" bson:"defaultkeepalive" validate:"omitempty,max=1000"` + DefaultSaveConfig *bool `json:"defaultsaveconfig" bson:"defaultsaveconfig"` + AccessKeys []AccessKey `json:"accesskeys" bson:"accesskeys"` + AllowManualSignUp *bool `json:"allowmanualsignup" bson:"allowmanualsignup"` + IsLocal *bool `json:"islocal" bson:"islocal"` + IsDualStack *bool `json:"isdualstack" bson:"isdualstack"` + LocalRange string `json:"localrange" bson:"localrange" validate:"omitempty,cidr"` + //can't have min=1 with omitempty + DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"` +} //TODO: //Not sure if we need the below two functions. Got rid of one of the calls. May want to revisit