address (some) review comments
diff --git a/server/src/main/java/org/apache/cloudstack/dns/DnsProviderManagerImpl.java b/server/src/main/java/org/apache/cloudstack/dns/DnsProviderManagerImpl.java index 69b202d..83c9bb3 100644 --- a/server/src/main/java/org/apache/cloudstack/dns/DnsProviderManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/dns/DnsProviderManagerImpl.java
@@ -164,23 +164,30 @@ } /** - * Rejects a DNS provider URL that resolves to an illegal address before any provider client is given - * the chance to connect to it. See {@link UriUtils#validateUrl(String)} for the exact rules enforced - * (including the requirement that the URL declares an {@code http}/{@code https} scheme). - * Expects {@code url} to already be trimmed. + * Trims and rejects a DNS provider URL that resolves to an illegal address before any provider client + * is given the chance to connect to it. See {@link UriUtils#validateUrl(String)} for the exact rules + * enforced (including the requirement that the URL declares an {@code http}/{@code https} scheme). + * + * @return the trimmed URL. + * @throws InvalidParameterValueException if the URL is blank or fails validation. */ - private void validateDnsServerUrl(String url) { - if (StringUtils.isBlank(url)) { - throw new IllegalArgumentException("URL cannot be blank."); + private String validateDnsServerUrl(String url) { + String trimmedUrl = StringUtils.trim(url); + if (StringUtils.isBlank(trimmedUrl)) { + throw new InvalidParameterValueException("URL cannot be blank."); } - UriUtils.validateUrl(url); + try { + UriUtils.validateUrl(trimmedUrl); + } catch (IllegalArgumentException e) { + throw new InvalidParameterValueException(e.getMessage()); + } + return trimmedUrl; } @Override @ActionEvent(eventType = EventTypes.EVENT_DNS_SERVER_ADD, eventDescription = "Adding a DNS Server") public DnsServer addDnsServer(AddDnsServerCmd cmd) { - String url = StringUtils.trim(cmd.getUrl()); - validateDnsServerUrl(url); + String url = validateDnsServerUrl(cmd.getUrl()); Account caller = CallContext.current().getCallingAccount(); DnsServer existing = dnsServerDao.findByUrlAndAccount(url, caller.getId()); if (existing != null) { @@ -269,7 +276,7 @@ if (cmd.getUrl() != null) { String url = StringUtils.trim(cmd.getUrl()); if (!url.equals(originalUrl)) { - validateDnsServerUrl(url); + url = validateDnsServerUrl(url); DnsServer duplicate = dnsServerDao.findByUrlAndAccount(url, dnsServer.getAccountId()); if (duplicate != null && duplicate.getId() != dnsServer.getId()) { throw new InvalidParameterValueException("Another DNS server with this URL already exists.");
diff --git a/server/src/test/java/org/apache/cloudstack/dns/DnsProviderManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/dns/DnsProviderManagerImplTest.java index 94efaca..7008edf 100644 --- a/server/src/test/java/org/apache/cloudstack/dns/DnsProviderManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/dns/DnsProviderManagerImplTest.java
@@ -803,7 +803,7 @@ verify(dnsServerDao).persist(Mockito.argThat(s -> "http://192.0.2.1:8081".equals(((DnsServerVO) s).getUrl()))); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = InvalidParameterValueException.class) public void testAddDnsServerRejectsLoopbackUrl() { org.apache.cloudstack.api.command.user.dns.AddDnsServerCmd cmd = mock( org.apache.cloudstack.api.command.user.dns.AddDnsServerCmd.class); @@ -811,7 +811,7 @@ manager.addDnsServer(cmd); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = InvalidParameterValueException.class) public void testAddDnsServerRejectsUrlWithoutScheme() { org.apache.cloudstack.api.command.user.dns.AddDnsServerCmd cmd = mock( org.apache.cloudstack.api.command.user.dns.AddDnsServerCmd.class); @@ -868,7 +868,7 @@ manager.updateDnsServer(cmd); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = InvalidParameterValueException.class) public void testUpdateDnsServerRejectsLoopbackUrl() { org.apache.cloudstack.api.command.user.dns.UpdateDnsServerCmd cmd = mock( org.apache.cloudstack.api.command.user.dns.UpdateDnsServerCmd.class);