JAMES-2344 Domain routes only makes sens when virtual hosting is enabled Otherwise users are attached to no domain in particular...
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f258987f Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f258987f Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f258987f Branch: refs/heads/master Commit: f258987ff9edb0fd8f5cbacc51073c5a6d19ef07 Parents: 5191b5f Author: benwa <[email protected]> Authored: Tue Mar 13 11:08:44 2018 +0700 Committer: benwa <[email protected]> Committed: Thu Mar 15 14:40:15 2018 +0700 ---------------------------------------------------------------------- .../webadmin/routes/DomainQuotaRoutes.java | 23 +++- .../DomainQuotaRoutesNoVirtualHostingTest.java | 138 +++++++++++++++++++ .../webadmin/routes/DomainQuotaRoutesTest.java | 4 +- 3 files changed, 163 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/f258987f/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java index f8c0ace..4f6b359 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java @@ -34,6 +34,8 @@ import org.apache.james.domainlist.api.DomainList; import org.apache.james.domainlist.api.DomainListException; import org.apache.james.mailbox.quota.QuotaCount; import org.apache.james.mailbox.quota.QuotaSize; +import org.apache.james.user.api.UsersRepository; +import org.apache.james.user.api.UsersRepositoryException; import org.apache.james.webadmin.Routes; import org.apache.james.webadmin.dto.QuotaDTO; import org.apache.james.webadmin.utils.ErrorResponder; @@ -45,6 +47,8 @@ import org.apache.james.webadmin.utils.JsonTransformerModule; import org.apache.james.webadmin.validation.Quotas; import org.eclipse.jetty.http.HttpStatus; +import com.google.common.base.Throwables; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -66,14 +70,16 @@ public class DomainQuotaRoutes implements Routes { private final DomainList domainList; private final DomainQuotaService domainQuotaService; + private final UsersRepository usersRepository; private final JsonTransformer jsonTransformer; private final JsonExtractor<QuotaDTO> jsonExtractor; private Service service; @Inject - public DomainQuotaRoutes(DomainList domainList, DomainQuotaService domainQuotaService, JsonTransformer jsonTransformer, Set<JsonTransformerModule> modules) { + public DomainQuotaRoutes(DomainList domainList, DomainQuotaService domainQuotaService, UsersRepository usersRepository, JsonTransformer jsonTransformer, Set<JsonTransformerModule> modules) { this.domainList = domainList; this.domainQuotaService = domainQuotaService; + this.usersRepository = usersRepository; this.jsonTransformer = jsonTransformer; this.jsonExtractor = new JsonExtractor<>(QuotaDTO.class, modules.stream().map(JsonTransformerModule::asJacksonModule).collect(Collectors.toList())); } @@ -94,6 +100,14 @@ public class DomainQuotaRoutes implements Routes { defineUpdateQuota(); } + public boolean isVirtualHostingSupported() { + try { + return usersRepository.supportVirtualHosting(); + } catch (UsersRepositoryException e) { + throw Throwables.propagate(e); + } + } + @PUT @ApiOperation(value = "Updating count and size at the same time") @ApiImplicitParams({ @@ -255,6 +269,13 @@ public class DomainQuotaRoutes implements Routes { } private String checkDomainExist(Request request) { + if (!isVirtualHostingSupported()) { + throw ErrorResponder.builder() + .statusCode(HttpStatus.METHOD_NOT_ALLOWED_405) + .type(ErrorType.WRONG_STATE) + .message("Domain Quota configuration not supported when virtual hosting is desactivated. Please use global quota configuration instead") + .haltError(); + } String domain = request.params(DOMAIN); try { if (!domainList.containsDomain(domain)) { http://git-wip-us.apache.org/repos/asf/james-project/blob/f258987f/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java new file mode 100644 index 0000000..17d0c21 --- /dev/null +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java @@ -0,0 +1,138 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.webadmin.routes; + +import static com.jayway.restassured.RestAssured.given; +import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION; + +import java.util.Collection; + +import org.apache.james.dnsservice.api.InMemoryDNSService; +import org.apache.james.domainlist.memory.MemoryDomainList; +import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager; +import org.apache.james.metrics.api.NoopMetricFactory; +import org.apache.james.user.memory.MemoryUsersRepository; +import org.apache.james.webadmin.WebAdminServer; +import org.apache.james.webadmin.WebAdminUtils; +import org.apache.james.webadmin.jackson.QuotaModule; +import org.apache.james.webadmin.utils.JsonTransformer; +import org.eclipse.jetty.http.HttpStatus; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.jayway.restassured.RestAssured; + +@RunWith(Parameterized.class) +public class DomainQuotaRoutesNoVirtualHostingTest { + + private static final String QUOTA_DOMAINS = "/quota/domains"; + private static final String FOUND_COM = "found.com"; + private static final String COUNT = "count"; + private static final String SIZE = "size"; + private WebAdminServer webAdminServer; + + @Parameters + public static Collection<Object[]> data() { + return ImmutableList.of( + new String[] {QUOTA_DOMAINS + "/" + FOUND_COM + "/" + COUNT}, + new String[] {QUOTA_DOMAINS + "/" + FOUND_COM + "/" + SIZE}); + } + + private String endpoint; + + public DomainQuotaRoutesNoVirtualHostingTest(String endpoint) { + this.endpoint = endpoint; + } + + @Before + public void setUp() throws Exception { + InMemoryPerUserMaxQuotaManager maxQuotaManager = new InMemoryPerUserMaxQuotaManager(); + MemoryDomainList memoryDomainList = new MemoryDomainList(new InMemoryDNSService()); + memoryDomainList.setAutoDetect(false); + memoryDomainList.addDomain(FOUND_COM); + MemoryDomainList domainList = new MemoryDomainList(new InMemoryDNSService()); + domainList.addDomain(FOUND_COM); + DomainQuotaService domainQuotaService = new DomainQuotaService(maxQuotaManager); + QuotaModule quotaModule = new QuotaModule(); + MemoryUsersRepository usersRepository = MemoryUsersRepository.withoutVirtualHosting(); + DomainQuotaRoutes domainQuotaRoutes = new DomainQuotaRoutes(domainList, domainQuotaService, usersRepository, new JsonTransformer(quotaModule), ImmutableSet.of(quotaModule)); + webAdminServer = WebAdminUtils.createWebAdminServer( + new NoopMetricFactory(), + domainQuotaRoutes); + webAdminServer.configure(NO_CONFIGURATION); + webAdminServer.await(); + + RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer) + .build(); + RestAssured.enableLoggingOfRequestAndResponseIfValidationFails(); + } + + @After + public void stop() { + webAdminServer.destroy(); + } + + @Test + public void allGetEndpointsShouldReturnNotAllowed() { + given() + .get(endpoint) + .then() + .statusCode(HttpStatus.METHOD_NOT_ALLOWED_405); + } + + @Test + public void allPutEndpointsShouldReturnNotAllowed() { + given() + .put(endpoint) + .then() + .statusCode(HttpStatus.METHOD_NOT_ALLOWED_405); + } + + @Test + public void allDeleteEndpointsShouldReturnNotAllowed() { + given() + .delete(endpoint) + .then() + .statusCode(HttpStatus.METHOD_NOT_ALLOWED_405); + } + + @Test + public void domainGetEndpointsShouldReturnNotAllowed() { + given() + .get(QUOTA_DOMAINS + "/" + FOUND_COM) + .then() + .statusCode(HttpStatus.METHOD_NOT_ALLOWED_405); + } + + @Test + public void domainPutEndpointsShouldReturnNotAllowed() { + given() + .put(QUOTA_DOMAINS + "/" + FOUND_COM) + .then() + .statusCode(HttpStatus.METHOD_NOT_ALLOWED_405); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/f258987f/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java index 9f9cab7..d461bc4 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java @@ -32,6 +32,7 @@ import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager; import org.apache.james.mailbox.quota.QuotaCount; import org.apache.james.mailbox.quota.QuotaSize; import org.apache.james.metrics.api.NoopMetricFactory; +import org.apache.james.user.memory.MemoryUsersRepository; import org.apache.james.webadmin.WebAdminServer; import org.apache.james.webadmin.WebAdminUtils; import org.apache.james.webadmin.jackson.QuotaModule; @@ -66,7 +67,8 @@ public class DomainQuotaRoutesTest { domainList.addDomain(TROUVÃ_COM); DomainQuotaService domainQuotaService = new DomainQuotaService(maxQuotaManager); QuotaModule quotaModule = new QuotaModule(); - DomainQuotaRoutes domainQuotaRoutes = new DomainQuotaRoutes(domainList, domainQuotaService, new JsonTransformer(quotaModule), ImmutableSet.of(quotaModule)); + MemoryUsersRepository usersRepository = MemoryUsersRepository.withVirtualHosting(); + DomainQuotaRoutes domainQuotaRoutes = new DomainQuotaRoutes(domainList, domainQuotaService, usersRepository, new JsonTransformer(quotaModule), ImmutableSet.of(quotaModule)); webAdminServer = WebAdminUtils.createWebAdminServer( new NoopMetricFactory(), domainQuotaRoutes); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
