diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/auth/WebPermission.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/auth/WebPermission.java index bfb955960..5aa3502fa 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/auth/WebPermission.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/auth/WebPermission.java @@ -19,6 +19,9 @@ package com.djrapitops.plan.delivery.domain.auth; import com.djrapitops.plan.settings.locale.lang.Lang; import org.apache.commons.lang3.StringUtils; +import java.util.Arrays; +import java.util.Optional; +import java.util.function.Predicate; import java.util.function.Supplier; /** @@ -47,7 +50,8 @@ public enum WebPermission implements Supplier, Lang { PAGE_NETWORK_SESSIONS_LIST("See list of sessions"), PAGE_NETWORK_JOIN_ADDRESSES("See Join Addresses -tab"), PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS("See Join Address graphs"), - PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_PIE("See Latest Join Addresses graph"), + @Deprecated + PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_PIE("See Latest Join Addresses graph", true), PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_TIME("See Join Addresses over time graph"), PAGE_NETWORK_RETENTION("See Player Retention -tab"), PAGE_NETWORK_GEOLOCATIONS("See Geolocations tab"), @@ -82,7 +86,8 @@ public enum WebPermission implements Supplier, Lang { PAGE_SERVER_SESSIONS_LIST("See list of sessions"), PAGE_SERVER_JOIN_ADDRESSES("See Join Addresses -tab"), PAGE_SERVER_JOIN_ADDRESSES_GRAPHS("See Join Address graphs"), - PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_PIE("See Latest Join Addresses graph"), + @Deprecated + PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_PIE("See Latest Join Addresses graph", true), PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_TIME("See Join Addresses over time graph"), PAGE_SERVER_RETENTION("See Player Retention -tab"), PAGE_SERVER_GEOLOCATIONS("See Geolocations tab"), @@ -156,4 +161,23 @@ public enum WebPermission implements Supplier, Lang { public String getDefault() { return description; } + + public static WebPermission[] nonDeprecatedValues() { + return Arrays.stream(values()) + .filter(Predicate.not(WebPermission::isDeprecated)) + .toArray(WebPermission[]::new); + } + + public static Optional findByPermission(String permission) { + String name = StringUtils.upperCase(permission).replace('.', '_'); + try { + return Optional.of(valueOf(name)); + } catch (IllegalArgumentException noSuchEnum) { + return Optional.empty(); + } + } + + public static boolean isDeprecated(String permission) { + return findByPermission(permission).map(WebPermission::isDeprecated).orElse(false); + } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/PlayerJoinAddressJSONResolver.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/PlayerJoinAddressJSONResolver.java index 045426158..86807d8d2 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/PlayerJoinAddressJSONResolver.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/PlayerJoinAddressJSONResolver.java @@ -23,6 +23,7 @@ import com.djrapitops.plan.delivery.rendering.json.JSONFactory; import com.djrapitops.plan.delivery.web.resolver.MimeType; import com.djrapitops.plan.delivery.web.resolver.Response; import com.djrapitops.plan.delivery.web.resolver.request.Request; +import com.djrapitops.plan.delivery.web.resolver.request.URIQuery; import com.djrapitops.plan.delivery.web.resolver.request.WebUser; import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService; import com.djrapitops.plan.delivery.webserver.cache.DataID; @@ -70,10 +71,20 @@ public class PlayerJoinAddressJSONResolver extends JSONResolver { @Override public boolean canAccess(@Untrusted Request request) { WebUser user = request.getUser().orElse(new WebUser("")); - if (request.getQuery().get("server").isPresent()) { - return user.hasPermission(WebPermission.PAGE_SERVER_RETENTION); + @Untrusted URIQuery query = request.getQuery(); + Optional listOnly = query.get("listOnly"); + if (query.get("server").isPresent()) { + if (listOnly.isEmpty()) { + return user.hasPermission(WebPermission.PAGE_SERVER_RETENTION); + } else { + return user.hasPermission(WebPermission.PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_TIME); + } + } + if (listOnly.isEmpty()) { + return user.hasPermission(WebPermission.PAGE_NETWORK_RETENTION); + } else { + return user.hasPermission(WebPermission.PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_TIME); } - return user.hasPermission(WebPermission.PAGE_NETWORK_RETENTION); } @GET diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/webgroup/WebPermissionJSONResolver.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/webgroup/WebPermissionJSONResolver.java index f2b20d796..dd46a295e 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/webgroup/WebPermissionJSONResolver.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/webgroup/WebPermissionJSONResolver.java @@ -37,6 +37,8 @@ import javax.inject.Inject; import javax.inject.Singleton; import java.util.List; import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Collectors; /** * Endpoint for getting list of available Plan web permissions. @@ -75,7 +77,10 @@ public class WebPermissionJSONResolver implements Resolver { } private Response getResponse() { - List permissions = dbSystem.getDatabase().query(WebUserQueries.fetchAvailablePermissions()); + List permissions = dbSystem.getDatabase().query(WebUserQueries.fetchAvailablePermissions()) + .stream() + .filter(Predicate.not(WebPermission::isDeprecated)) + .collect(Collectors.toList()); WebPermissionList permissionList = new WebPermissionList(permissions); return Response.builder() diff --git a/Plan/common/src/main/java/com/djrapitops/plan/settings/locale/LocaleSystem.java b/Plan/common/src/main/java/com/djrapitops/plan/settings/locale/LocaleSystem.java index ffa7991f2..47b002cce 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/settings/locale/LocaleSystem.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/settings/locale/LocaleSystem.java @@ -108,7 +108,7 @@ public class LocaleSystem implements SubSystem { HtmlLang.values(), JSLang.values(), PluginLang.values(), - WebPermission.values(), + WebPermission.nonDeprecatedValues(), }; } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/UpdateWebPermissionsPatch.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/UpdateWebPermissionsPatch.java index 0fa7ceb58..d4891a775 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/UpdateWebPermissionsPatch.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/UpdateWebPermissionsPatch.java @@ -39,7 +39,7 @@ public class UpdateWebPermissionsPatch extends Patch { @Override public boolean hasBeenApplied() { - List defaultPermissions = Arrays.stream(WebPermission.values()) + List defaultPermissions = Arrays.stream(WebPermission.nonDeprecatedValues()) .map(WebPermission::getPermission) .collect(Collectors.toList()); List storedPermissions = query(WebUserQueries.fetchAvailablePermissions()); diff --git a/Plan/common/src/test/java/com/djrapitops/plan/delivery/domain/auth/WebPermissionTest.java b/Plan/common/src/test/java/com/djrapitops/plan/delivery/domain/auth/WebPermissionTest.java new file mode 100644 index 000000000..0d65e0d1c --- /dev/null +++ b/Plan/common/src/test/java/com/djrapitops/plan/delivery/domain/auth/WebPermissionTest.java @@ -0,0 +1,56 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.delivery.domain.auth; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Tests for {@link WebPermission}. + * + * @author AuroraLS3 + */ +class WebPermissionTest { + + @Test + void webPermissionIsFound() { + String permission = "access.player.self"; + WebPermission found = WebPermission.findByPermission(permission).orElseThrow(AssertionError::new); + WebPermission expected = WebPermission.ACCESS_PLAYER_SELF; + assertEquals(expected, found); + } + + @Test + void webPermissionIsDetectedAsDeprecated() { + String permission = "page.server.join.addresses.graphs.pie"; + assertTrue(WebPermission.isDeprecated(permission)); + } + + @Test + void webPermissionIsDetectedAsNonDeprecated() { + String permission = "access.player.self"; + assertFalse(WebPermission.isDeprecated(permission)); + } + + @Test + void customWebPermissionIsDetectedAsNonDeprecated() { + String permission = "custom.permission"; + assertFalse(WebPermission.isDeprecated(permission)); + } + +} \ No newline at end of file diff --git a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/AccessControlTest.java b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/AccessControlTest.java index dd19ffff7..d0427c121 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/AccessControlTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/AccessControlTest.java @@ -107,7 +107,10 @@ class AccessControlTest { Arguments.of("/v1/pingTable?server=" + TestConstants.SERVER_UUID_STRING + "", WebPermission.PAGE_SERVER_GEOLOCATIONS_PING_PER_COUNTRY, 200, 403), Arguments.of("/v1/sessions?server=" + TestConstants.SERVER_UUID_STRING + "", WebPermission.PAGE_SERVER_SESSIONS_LIST, 200, 403), Arguments.of("/v1/retention?server=" + TestConstants.SERVER_UUID_STRING + "", WebPermission.PAGE_SERVER_RETENTION, 200, 403), + Arguments.of("/v1/joinAddresses", WebPermission.PAGE_NETWORK_RETENTION, 200, 403), + Arguments.of("/v1/joinAddresses?listOnly=true", WebPermission.PAGE_NETWORK_JOIN_ADDRESSES_GRAPHS_TIME, 200, 403), Arguments.of("/v1/joinAddresses?server=" + TestConstants.SERVER_UUID_STRING + "", WebPermission.PAGE_SERVER_RETENTION, 200, 403), + Arguments.of("/v1/joinAddresses?server=" + TestConstants.SERVER_UUID_STRING + "&listOnly=true", WebPermission.PAGE_SERVER_JOIN_ADDRESSES_GRAPHS_TIME, 200, 403), Arguments.of("/network", WebPermission.ACCESS_NETWORK, 302, 403), Arguments.of("/v1/network/overview", WebPermission.PAGE_NETWORK_OVERVIEW_NUMBERS, 200, 403), Arguments.of("/v1/network/servers", WebPermission.PAGE_NETWORK_SERVER_LIST, 200, 403),