You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/05/23 03:37:59 UTC

[james-project] 11/14: JAMES-2776 DomainsRoutes should not accept same source & destination

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit df4677c36aa70e02fba61bf79433c1ba11cd583c
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Tue May 21 11:27:31 2019 +0700

    JAMES-2776 DomainsRoutes should not accept same source & destination
---
 .../james/webadmin/routes/DomainsRoutes.java       | 13 ++++++++++
 .../james/webadmin/service/DomainAliasService.java |  7 ++++++
 .../james/webadmin/routes/DomainsRoutesTest.java   | 28 ++++++++++++++++++++++
 src/site/markdown/server/manage-webadmin.md        |  2 ++
 4 files changed, 50 insertions(+)

diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
index de7300d..77ed8a6 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
@@ -35,6 +35,7 @@ import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
+import org.apache.james.rrt.api.SameSourceAndDestinationException;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.dto.DomainAliasResponse;
 import org.apache.james.webadmin.service.DomainAliasService;
@@ -303,6 +304,8 @@ public class DomainsRoutes implements Routes {
             return Responses.returnNoContent(response);
         } catch (DomainAliasService.DomainNotFound e) {
             throw domainNotFound(e.getDomain());
+        } catch (SameSourceAndDestinationException e) {
+            throw sameSourceAndDestination(sourceDomain);
         }
     }
 
@@ -315,6 +318,8 @@ public class DomainsRoutes implements Routes {
             return Responses.returnNoContent(response);
         } catch (DomainAliasService.DomainNotFound e) {
             throw domainNotFound(e.getDomain());
+        } catch (SameSourceAndDestinationException e) {
+            throw sameSourceAndDestination(sourceDomain);
         }
     }
 
@@ -333,4 +338,12 @@ public class DomainsRoutes implements Routes {
             .message("The following domain is not in the domain list and has no registered local aliases: " + domain.name())
             .haltError();
     }
+
+    private HaltException sameSourceAndDestination(Domain sameDomain) {
+        return ErrorResponder.builder()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .type(ErrorType.INVALID_ARGUMENT)
+            .message("Source domain and destination domain can not have same value(" + sameDomain.name() + ")")
+            .haltError();
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DomainAliasService.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DomainAliasService.java
index afbc093..bc8e10d 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DomainAliasService.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DomainAliasService.java
@@ -26,6 +26,7 @@ import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
+import org.apache.james.rrt.api.SameSourceAndDestinationException;
 import org.apache.james.rrt.lib.Mapping;
 import org.apache.james.rrt.lib.MappingSource;
 import org.apache.james.webadmin.dto.DomainAliasResponse;
@@ -92,7 +93,13 @@ public class DomainAliasService {
             throw new DomainNotFound(sourceDomain);
         }
 
+        checkSameSourceAndDestination(sourceDomain, destinationDomain);
         operation.perform(MappingSource.fromDomain(sourceDomain), Mapping.domain(destinationDomain));
     }
 
+    private void checkSameSourceAndDestination(Domain source, Domain destination) throws RecipientRewriteTableException {
+        if (source.equals(destination)) {
+            throw new SameSourceAndDestinationException("Source and destination domain can't be the same!");
+        }
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
index 01dbe7e..e68ddc3 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
@@ -398,6 +398,20 @@ class DomainsRoutesTest {
             }
 
             @Test
+            void putShouldReturnBadRequestWhenSourceAndDestinationAreTheSame() {
+                with().put(DOMAIN);
+
+                when()
+                    .put(DOMAIN + "/aliases/" + DOMAIN)
+                .then()
+                    .contentType(ContentType.JSON)
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                    .body("type", is("InvalidArgument"))
+                    .body("message", is("Source domain and destination domain can not have same value(" + DOMAIN + ")"));
+            }
+
+            @Test
             void putShouldNotFailOnExternalDomainAlias() {
                 with().put(DOMAIN);
 
@@ -510,6 +524,20 @@ class DomainsRoutesTest {
             }
 
             @Test
+            void deleteShouldReturnBadRequestWhenSourceAndDestinationAreTheSame() {
+                with().put(DOMAIN);
+
+                when()
+                    .delete(DOMAIN + "/aliases/" + DOMAIN)
+                .then()
+                    .contentType(ContentType.JSON)
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                    .body("type", is("InvalidArgument"))
+                    .body("message", is("Source domain and destination domain can not have same value(" + DOMAIN + ")"));
+            }
+
+            @Test
             void deleteSourceDomainShouldRemoveTheCorrespondingAlias() {
                 with().put(ALIAS_DOMAIN_2);
                 with().put(ALIAS_DOMAIN);
diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 5217042..3d8bb5b 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -223,6 +223,7 @@ Response codes:
 
  - 204: The redirection now exists
  - 400: source.domain.tld or destination.domain.tld have an invalid syntax
+ - 400: source domain and destination domain are the same
  - 404: source.domain.tld are not part of handled domains.
 
 ### Delete an alias for a domain
@@ -242,6 +243,7 @@ Response codes:
 
  - 204: The redirection now exists
  - 400: source.domain.tld or destination.domain.tld have an invalid syntax
+ - 400: source domain and destination domain are the same
  - 404: source.domain.tld are not part of handled domains.
 
 ## Administrating users


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org