diff --git a/pom.xml b/pom.xml index 80db76788..a504c2c4f 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 1.1.0 5.7.0 - 7.9.0 + 7.10.0 0.5.8 ${project.version} diff --git a/src/main/java/com/uid2/admin/vertx/service/SiteService.java b/src/main/java/com/uid2/admin/vertx/service/SiteService.java index 0907b97cd..ae0694c79 100644 --- a/src/main/java/com/uid2/admin/vertx/service/SiteService.java +++ b/src/main/java/com/uid2/admin/vertx/service/SiteService.java @@ -1,6 +1,5 @@ package com.uid2.admin.vertx.service; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectWriter; import com.uid2.admin.auth.AdminAuthMiddleware; import com.uid2.admin.legacy.ILegacyClientKeyProvider; @@ -183,16 +182,7 @@ private void handleSiteAdd(RoutingContext rc) { siteProvider.loadContent(); final String name = rc.queryParam("name").isEmpty() ? "" : rc.queryParam("name").get(0).trim(); - if (name == null || name.isEmpty()) { - ResponseUtil.error(rc, 400, "must specify a valid site name"); - return; - } - - Optional existingSite = this.siteProvider.getAllSites() - .stream().filter(c -> c.getName().equals(name)) - .findFirst(); - if (existingSite.isPresent()) { - ResponseUtil.error(rc, 400, "site existed"); + if (!validateSiteName(rc, name)) { return; } @@ -375,6 +365,7 @@ private void handleSiteUpdate(RoutingContext rc) { } String description = rc.queryParam("description").stream().findFirst().orElse(null); String visibleParam = rc.queryParam("visible").stream().findFirst().orElse(null); + String name = rc.queryParam("name").stream().findFirst().orElse(null); if (description != null) { existingSite.setDescription(description); @@ -388,6 +379,12 @@ private void handleSiteUpdate(RoutingContext rc) { ResponseUtil.error(rc, 400, "Invalid parameter for visible: " + visibleParam); } } + if (name != null) { + if (!validateSiteName(rc, name)) { + return; + } + existingSite.setName(name); + } uploadSiteToStoreWriterAndWriteExistingSiteToResponse(existingSite, rc); } catch (Exception e) { @@ -395,6 +392,22 @@ private void handleSiteUpdate(RoutingContext rc) { } } + private boolean validateSiteName(RoutingContext rc, String name) { + if (name == null || name.isEmpty()) { + ResponseUtil.error(rc, 400, "must specify a valid site name"); + return false; + } + + Optional existingSite = this.siteProvider.getAllSites() + .stream().filter(c -> c.getName().equals(name)) + .findFirst(); + if (existingSite.isPresent()) { + ResponseUtil.error(rc, 400, "site with name " + name + " already exists"); + return false; + } + return true; + } + private static List getNormalizedDomainNames(RoutingContext rc, JsonArray domainNamesJa) { List domainNames = domainNamesJa.stream().map(String::valueOf).collect(Collectors.toList()); diff --git a/src/test/java/com/uid2/admin/vertx/SiteServiceTest.java b/src/test/java/com/uid2/admin/vertx/SiteServiceTest.java index 6d5447df1..9bee9fe95 100644 --- a/src/test/java/com/uid2/admin/vertx/SiteServiceTest.java +++ b/src/test/java/com/uid2/admin/vertx/SiteServiceTest.java @@ -876,4 +876,76 @@ void addSiteWithDuplicateAppNames(Vertx vertx, VertxTestContext testContext) { testContext.completeNow(); }); } + + @Test + void renameSiteTest(Vertx vertx, VertxTestContext testContext) { + fakeAuth(Role.MAINTAINER); + + Site[] sites = { + new Site(11, "site1", false), + new Site(12, "site2", true), + new Site(13, "site3", false, Set.of("test1.com", "test2.net")), + new Site(14, "site4", false, null, Set.of("test1.com", "test2.net"), Set.of("com.123.game.app.android", "12345678")), + }; + setSites(sites); + + post(vertx, testContext, "api/site/update?id=11&name=NewName", null, response -> { + assertEquals(200, response.statusCode()); + assertEquals("NewName", response.bodyAsJsonObject().getString("name")); + assertEquals("NewName", sites[0].getName()); + // Test other sites are unaffected + assertEquals("site2", sites[1].getName()); + assertEquals("site3", sites[2].getName()); + assertEquals("site4", sites[3].getName()); + testContext.completeNow(); + }); + } + + @Test + void renameSiteTestInvalidName(Vertx vertx, VertxTestContext testContext) { + fakeAuth(Role.MAINTAINER); + + Site[] sites = { + new Site(11, "site1", false), + new Site(12, "site2", true), + new Site(13, "site3", false, Set.of("test1.com", "test2.net")), + new Site(14, "site4", false, null, Set.of("test1.com", "test2.net"), Set.of("com.123.game.app.android", "12345678")), + }; + setSites(sites); + + post(vertx, testContext, "api/site/update?id=11&name=", null, response -> { + assertEquals(400, response.statusCode()); + assertEquals("must specify a valid site name", response.bodyAsJsonObject().getString("message")); + assertEquals("site1", sites[0].getName()); + // Test other sites are unaffected + assertEquals("site2", sites[1].getName()); + assertEquals("site3", sites[2].getName()); + assertEquals("site4", sites[3].getName()); + testContext.completeNow(); + }); + } + + @Test + void renameSiteTestDuplicate(Vertx vertx, VertxTestContext testContext) { + fakeAuth(Role.MAINTAINER); + + Site[] sites = { + new Site(11, "site1", false), + new Site(12, "site2", true), + new Site(13, "site3", false, Set.of("test1.com", "test2.net")), + new Site(14, "site4", false, null, Set.of("test1.com", "test2.net"), Set.of("com.123.game.app.android", "12345678")), + }; + setSites(sites); + + post(vertx, testContext, "api/site/update?id=11&name=site2", null, response -> { + assertEquals(400, response.statusCode()); + assertEquals("site with name site2 already exists", response.bodyAsJsonObject().getString("message")); + assertEquals("site1", sites[0].getName()); + // Test other sites are unaffected + assertEquals("site2", sites[1].getName()); + assertEquals("site3", sites[2].getName()); + assertEquals("site4", sites[3].getName()); + testContext.completeNow(); + }); + } } \ No newline at end of file diff --git a/webroot/adm/site.html b/webroot/adm/site.html index 76c6d07a6..55f4c48cb 100644 --- a/webroot/adm/site.html +++ b/webroot/adm/site.html @@ -58,6 +58,7 @@

Operations

+ @@ -153,6 +154,16 @@

Output

doApiCall('POST', url, '#standardOutput', '#errorOutput', JSON.stringify(payload)); }); + $('#doSetName').on('click', function () { + var siteId = encodeURIComponent($('#siteId').val()); + + var name = encodeURIComponent($('#siteName').val()); + + var url = '/api/site/update?id=' + siteId + '&name=' + name; + + doApiCall('POST', url, '#standardOutput', '#errorOutput'); + }); + $('#doSetDescription').on('click', function () { var siteId = encodeURIComponent($('#siteId').val());