Yevgeny Zaspitsky has uploaded a new change for review. Change subject: engine: Add separate validation for multicast MAC address ......................................................................
engine: Add separate validation for multicast MAC address Split MAC address format validation into two separate ones: 1. Valid MAC address 2. Unicast MAC address Change-Id: I4077a14fb61c2e082db9f81f1ded3b25ca98fc3f Bug-Url: https://bugzilla.redhat.com/1118385 Signed-off-by: Yevgeny Zaspitsky <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 4 files changed, 40 insertions(+), 17 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/96/32196/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java index d8edf59..a8b7ba2 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java @@ -58,7 +58,7 @@ private List<DiskImage> _templateDisks; private StorageDomain sourceDomain; private Guid sourceDomainId = Guid.Empty; - private final static Pattern VALIDATE_MAC_ADDRESS = Pattern.compile(VmNic.UNICAST_MAC_ADDRESS_FORMAT); + private final static Pattern VALIDATE_MAC_ADDRESS = Pattern.compile("\\p{XDigit}[02468AaCcEe](:\\p{XDigit}{2}){5}"); /** * Constructor for command creation when compensation is applied on startup diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java index eabbfaa..5e7b344 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java @@ -13,14 +13,21 @@ private Guid macPoolId; - @Pattern(regexp = VmNic.UNICAST_MAC_ADDRESS_FORMAT, - message = VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID) + @Pattern.List({ + @Pattern(regexp = VmNic.VALID_MAC_ADDRESS_FORMAT, + message = VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID), + @Pattern(regexp = VmNic.NON_MULTICAST_MAC_ADDRESS_FORMAT, + message = VmNic.VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST) + }) @NotNull(message= "VALIDATION.VM.NETWORK.MAC.ADDRESS.NOT_NULL") private String macFrom; - @Pattern(regexp = VmNic.UNICAST_MAC_ADDRESS_FORMAT, - message = VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID) - @NotNull(message = "VALIDATION.VM.NETWORK.MAC.ADDRESS.NOT_NULL") + @Pattern.List({ + @Pattern(regexp = VmNic.VALID_MAC_ADDRESS_FORMAT, + message = VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID), + @Pattern(regexp = VmNic.NON_MULTICAST_MAC_ADDRESS_FORMAT, + message = VmNic.VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST) + }) private String macTo; public String getMacFrom() { diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java index 93f406a..ba5159b 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java @@ -14,15 +14,24 @@ * <code>VmNic</code> defines a type of {@link NetworkInterface} for instances of {@link VM}. */ public class VmNic extends NetworkInterface<VmNetworkStatistics> { - public static final String UNICAST_MAC_ADDRESS_FORMAT = "\\p{XDigit}[02468aAcCeE](:\\p{XDigit}{2}){5}"; - public static final String NON_NULLABLE_MAC_ADDRESS_FORMAT = "^.*(?<!(00:){5}00)$"; private static final long serialVersionUID = 7428150502868988886L; + + private static final String ODD_HEX_DIGIT_PATTERN = "[13579BbDbFdf]"; + + public static final String NON_MULTICAST_MAC_ADDRESS_FORMAT = + ".*(?<!^\\p{XDigit}" + ODD_HEX_DIGIT_PATTERN + "(:\\p{XDigit}{2}){5}$)"; + public static final String VALID_MAC_ADDRESS_FORMAT = + "^(\\p{XDigit}{2}:){5}\\p{XDigit}{2}$"; + + public static final String NON_NULLABLE_MAC_ADDRESS_FORMAT = "^.*(?<!(00:){5}00)$"; protected static final String VALIDATION_MESSAGE_MAC_ADDRESS_NOT_NULL = "VALIDATION.VM.NETWORK.MAC.ADDRESS.NOT_NULL"; protected static final String VALIDATION_MESSAGE_NAME_NOT_NULL = "VALIDATION.VM.NETWORK.NAME.NOT_NULL"; public static final String VALIDATION_MESSAGE_MAC_ADDRESS_INVALID = "VALIDATION.VM.NETWORK.MAC.ADDRESS.INVALID"; + public static final String VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST = + "VALIDATION.VM.NETWORK.MAC.ADDRESS.MULTICAST"; private Guid vmId; private Guid vnicProfileId; @@ -74,15 +83,21 @@ @NotNull(message = VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_NOT_NULL, groups = { UpdateVmNic.class }) @Pattern.List({ - @Pattern(regexp = "(^$)|(" + UNICAST_MAC_ADDRESS_FORMAT + ")", - message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID, - groups = { CreateEntity.class }), - @Pattern(regexp = UNICAST_MAC_ADDRESS_FORMAT, - message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID, - groups = { UpdateEntity.class }), - @Pattern(regexp = NON_NULLABLE_MAC_ADDRESS_FORMAT, - message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID, - groups = { CreateEntity.class, UpdateEntity.class }) + @Pattern(regexp = "(^$)|(" + VALID_MAC_ADDRESS_FORMAT + ")", + message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID, + groups = { CreateEntity.class }), + @Pattern(regexp = "(^$)|(" + NON_MULTICAST_MAC_ADDRESS_FORMAT + ")", + message = VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST, + groups = { CreateEntity.class }), + @Pattern(regexp = VALID_MAC_ADDRESS_FORMAT, + message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID, + groups = { UpdateEntity.class }), + @Pattern(regexp = NON_MULTICAST_MAC_ADDRESS_FORMAT, + message = VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST, + groups = { UpdateEntity.class }), + @Pattern(regexp = NON_NULLABLE_MAC_ADDRESS_FORMAT, + message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID, + groups = { CreateEntity.class, UpdateEntity.class }) }) @Override public String getMacAddress() { diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index c5b3ff3..b8bccb1 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -829,6 +829,7 @@ VALIDATION_INVALID_CORRELATION_ID=The correlation ID must be formed of "a-z0-9A-Z" or "-_" VALIDATION.SOURCE_SNAPSHOT_ID.NOT_NULL=Source snapshot is required VALIDATION.VM.NETWORK.MAC.ADDRESS.INVALID=MAC address must be in format "HH:HH:HH:HH:HH:HH" where H is a hexadecimal character (either a digit or A-F, case is insignificant). +VALIDATION.VM.NETWORK.MAC.ADDRESS.MULTICAST=Multi-cast MAC address is not allowed. VALIDATION.VM.NETWORK.MAC.ADDRESS.NOT_NULL=MAC address is required. VALIDATION.VM.NETWORK.NAME.NOT_NULL=Interface name is required. VALIDATION.CONNECTIVITY.TIMEOUT.INVALID=Connectivity timeout is not valid. Timeout must be between 1 and 120. -- To view, visit http://gerrit.ovirt.org/32196 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4077a14fb61c2e082db9f81f1ded3b25ca98fc3f Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yevgeny Zaspitsky <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
