diff --git a/pkg/compute/regiondrivers/aliyun.go b/pkg/compute/regiondrivers/aliyun.go index f6286d9739..a428589e4f 100644 --- a/pkg/compute/regiondrivers/aliyun.go +++ b/pkg/compute/regiondrivers/aliyun.go @@ -1566,8 +1566,15 @@ func (self *SAliyunRegionDriver) ValidateCreateVpcData(ctx context.Context, user if err := cidrV.Validate(jsonutils.Marshal(input).(*jsonutils.JSONDict)); err != nil { return input, err } - if cidrV.Value.MaskLen < 17 || cidrV.Value.MaskLen > 29 { - return input, httperrors.NewInputParameterError("%s request the mask range should be between 17 and 29", self.GetProvider()) + + err := IsInPrivateIpRange(cidrV.Value.ToIPRange()) + if err != nil { + return input, errors.Wrap(err, "IsInPrivateIpRange") } + + if cidrV.Value.MaskLen > 24 { + return input, httperrors.NewInputParameterError("invalid cidr range %s, mask length should less than or equal to 24", cidrV.Value.String()) + } + return input, nil } diff --git a/pkg/compute/regiondrivers/ctyun.go b/pkg/compute/regiondrivers/ctyun.go index 49fdd9e4bd..67d4731eb0 100644 --- a/pkg/compute/regiondrivers/ctyun.go +++ b/pkg/compute/regiondrivers/ctyun.go @@ -18,6 +18,7 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/secrules" api "yunion.io/x/onecloud/pkg/apis/compute" @@ -82,8 +83,14 @@ func (self *SCtyunRegionDriver) ValidateCreateVpcData(ctx context.Context, userC if err := cidrV.Validate(jsonutils.Marshal(input).(*jsonutils.JSONDict)); err != nil { return input, err } - if cidrV.Value.MaskLen < 16 || cidrV.Value.MaskLen > 29 { - return input, httperrors.NewInputParameterError("%s request the mask range should be between 16 and 29", self.GetProvider()) + + err := IsInPrivateIpRange(cidrV.Value.ToIPRange()) + if err != nil { + return input, errors.Wrap(err, "IsInPrivateIpRange") + } + + if cidrV.Value.MaskLen > 24 { + return input, httperrors.NewInputParameterError("invalid cidr range %s, mask length should less than or equal to 24", cidrV.Value.String()) } return input, nil } diff --git a/pkg/compute/regiondrivers/huawei.go b/pkg/compute/regiondrivers/huawei.go index b57eab9109..1cb959263e 100644 --- a/pkg/compute/regiondrivers/huawei.go +++ b/pkg/compute/regiondrivers/huawei.go @@ -2669,8 +2669,14 @@ func (self *SHuaWeiRegionDriver) ValidateCreateVpcData(ctx context.Context, user if err := cidrV.Validate(jsonutils.Marshal(input).(*jsonutils.JSONDict)); err != nil { return input, err } - if cidrV.Value.MaskLen < 16 || cidrV.Value.MaskLen > 29 { - return input, httperrors.NewInputParameterError("%s request the mask range should be between 16 and 29", self.GetProvider()) + + err := IsInPrivateIpRange(cidrV.Value.ToIPRange()) + if err != nil { + return input, errors.Wrap(err, "IsInPrivateIpRange") + } + + if cidrV.Value.MaskLen > 24 { + return input, httperrors.NewInputParameterError("invalid cidr range %s, mask length should less than or equal to 24", cidrV.Value.String()) } return input, nil } diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index 2a249209b2..26da140bf3 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -24,6 +24,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" + "yunion.io/x/pkg/util/netutils" "yunion.io/x/pkg/util/secrules" "yunion.io/x/pkg/utils" @@ -3198,3 +3199,20 @@ func (self *SManagedVirtualizationRegionDriver) RequestElasticcacheSetAutoRenew( return ec.SetAutoRenew(autoRenew) } + +func IsInPrivateIpRange(ar netutils.IPV4AddrRange) error { + iprs := netutils.GetPrivateIPRanges() + match := false + for _, ipr := range iprs { + if ipr.ContainsRange(ar) { + match = true + break + } + } + + if !match { + return httperrors.NewInputParameterError("invalid cidr range %s", ar.String()) + } + + return nil +} diff --git a/pkg/compute/regiondrivers/qcloud.go b/pkg/compute/regiondrivers/qcloud.go index 6eb3b9f317..70cfab1bce 100644 --- a/pkg/compute/regiondrivers/qcloud.go +++ b/pkg/compute/regiondrivers/qcloud.go @@ -725,6 +725,12 @@ func (self *SQcloudRegionDriver) ValidateCreateVpcData(ctx context.Context, user if err := cidrV.Validate(jsonutils.Marshal(input).(*jsonutils.JSONDict)); err != nil { return input, err } + + err := IsInPrivateIpRange(cidrV.Value.ToIPRange()) + if err != nil { + return input, errors.Wrap(err, "IsInPrivateIpRange") + } + if cidrV.Value.MaskLen < 16 || cidrV.Value.MaskLen > 28 { return input, httperrors.NewInputParameterError("%s request the mask range should be between 16 and 28", self.GetProvider()) } diff --git a/pkg/compute/regiondrivers/ucloud.go b/pkg/compute/regiondrivers/ucloud.go index 674874749d..a1aa486478 100644 --- a/pkg/compute/regiondrivers/ucloud.go +++ b/pkg/compute/regiondrivers/ucloud.go @@ -18,6 +18,7 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/secrules" api "yunion.io/x/onecloud/pkg/apis/compute" @@ -78,8 +79,13 @@ func (self *SUcloudRegionDriver) ValidateCreateVpcData(ctx context.Context, user if err := cidrV.Validate(jsonutils.Marshal(input).(*jsonutils.JSONDict)); err != nil { return input, err } - if cidrV.Value.MaskLen < 16 || cidrV.Value.MaskLen > 29 { - return input, httperrors.NewInputParameterError("%s request the mask range should be between 16 and 29", self.GetProvider()) + err := IsInPrivateIpRange(cidrV.Value.ToIPRange()) + if err != nil { + return input, errors.Wrap(err, "IsInPrivateIpRange") + } + + if cidrV.Value.MaskLen > 29 { + return input, httperrors.NewInputParameterError("%s request the mask range should be less than or equal to 29", self.GetProvider()) } return input, nil }