From 5adc6ef753ba59fea10069c5e7d0e81ccc8c3f8d Mon Sep 17 00:00:00 2001 From: David Maes Date: Mon, 24 Aug 2020 22:35:35 +0200 Subject: [PATCH 01/11] Use context aware groups --- .../authme/permission/handlers/LuckPermsHandler.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java index 58656ec37..3677d3c65 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java @@ -7,6 +7,8 @@ import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.cacheddata.CachedPermissionData; +import net.luckperms.api.context.ContextSetFactory; +import net.luckperms.api.context.ImmutableContextSet; import net.luckperms.api.model.data.DataMutateResult; import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; @@ -15,10 +17,14 @@ import net.luckperms.api.query.QueryMode; import net.luckperms.api.query.QueryOptions; import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -168,10 +174,8 @@ public List getGroups(OfflinePlayer player) { return Collections.emptyList(); } - return user.getDistinctNodes().stream() - .filter(node -> node instanceof InheritanceNode) - .map(node -> (InheritanceNode) node) - .map(node -> luckPerms.getGroupManager().getGroup(node.getGroupName())) + Collection groups = user.getInheritedGroups(user.getQueryOptions()); + return groups.stream() .filter(Objects::nonNull) .sorted((o1, o2) -> { if (o1.getName().equals(user.getPrimaryGroup()) || o2.getName().equals(user.getPrimaryGroup())) { From 4275b0d9db7fb7a6c09775a497d2944b00933977 Mon Sep 17 00:00:00 2001 From: David Maes Date: Tue, 25 Aug 2020 20:24:03 +0200 Subject: [PATCH 02/11] Revert "Use context aware groups" This reverts commit 5adc6ef7 --- .../authme/permission/handlers/LuckPermsHandler.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java index 3677d3c65..58656ec37 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java @@ -7,8 +7,6 @@ import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.cacheddata.CachedPermissionData; -import net.luckperms.api.context.ContextSetFactory; -import net.luckperms.api.context.ImmutableContextSet; import net.luckperms.api.model.data.DataMutateResult; import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; @@ -17,14 +15,10 @@ import net.luckperms.api.query.QueryMode; import net.luckperms.api.query.QueryOptions; import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; -import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -174,8 +168,10 @@ public List getGroups(OfflinePlayer player) { return Collections.emptyList(); } - Collection groups = user.getInheritedGroups(user.getQueryOptions()); - return groups.stream() + return user.getDistinctNodes().stream() + .filter(node -> node instanceof InheritanceNode) + .map(node -> (InheritanceNode) node) + .map(node -> luckPerms.getGroupManager().getGroup(node.getGroupName())) .filter(Objects::nonNull) .sorted((o1, o2) -> { if (o1.getName().equals(user.getPrimaryGroup()) || o2.getName().equals(user.getPrimaryGroup())) { From 3ccc4f7f503d9b726653eb6f68a4a79eaca6040f Mon Sep 17 00:00:00 2001 From: David Maes Date: Wed, 26 Aug 2020 02:36:19 +0200 Subject: [PATCH 03/11] Keep luckperm contexts after authentication --- .../authme/debug/PermissionGroups.java | 11 +++- .../authme/data/limbo/AuthGroupHandler.java | 10 +-- .../xephi/authme/data/limbo/LimboPlayer.java | 6 +- .../authme/data/limbo/LimboServiceHelper.java | 15 +++-- .../fr/xephi/authme/data/limbo/UserGroup.java | 41 +++++++++++++ .../persistence/LimboPlayerDeserializer.java | 29 +++++++-- .../persistence/LimboPlayerSerializer.java | 17 +++++- .../authme/permission/PermissionsManager.java | 43 ++++++------- .../permission/handlers/LuckPermGroup.java | 23 +++++++ .../permission/handlers/LuckPermsHandler.java | 61 +++++++++++++------ .../handlers/PermissionHandler.java | 15 ++--- .../handlers/PermissionsExHandler.java | 26 +++++--- .../permission/handlers/VaultHandler.java | 32 +++++----- .../handlers/ZPermissionsHandler.java | 26 +++++--- .../data/limbo/LimboPlayerMatchers.java | 19 ++++-- .../limbo/LimboPlayerTaskManagerTest.java | 4 +- .../data/limbo/LimboServiceHelperTest.java | 10 +-- .../authme/data/limbo/LimboServiceTest.java | 6 +- ...istributedFilesPersistenceHandlerTest.java | 11 ++-- ...IndividualFilesPersistenceHandlerTest.java | 5 +- .../permission/handlers/VaultHandlerTest.java | 10 ++- 21 files changed, 293 insertions(+), 127 deletions(-) create mode 100644 src/main/java/fr/xephi/authme/data/limbo/UserGroup.java create mode 100644 src/main/java/fr/xephi/authme/permission/handlers/LuckPermGroup.java diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java b/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java index 72965601e..99ba41b2e 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java @@ -1,5 +1,6 @@ package fr.xephi.authme.command.executable.authme.debug; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.permission.DebugSectionPermissions; import fr.xephi.authme.permission.PermissionNode; import fr.xephi.authme.permission.PermissionsManager; @@ -10,6 +11,9 @@ import javax.inject.Inject; import java.util.List; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; /** * Outputs the permission groups of a player. @@ -37,8 +41,11 @@ public void execute(CommandSender sender, List arguments) { if (player == null) { sender.sendMessage("Player " + name + " could not be found"); } else { - sender.sendMessage("Player " + name + " has permission groups: " - + String.join(", ", permissionsManager.getGroups(player))); + List groupNames = permissionsManager.getGroups(player).stream() + .map(UserGroup::getGroupName) + .collect(toList()); + + sender.sendMessage("Player " + name + " has permission groups: " + String.join(", ", groupNames)); sender.sendMessage("Primary group is: " + permissionsManager.getGroups(player)); } } diff --git a/src/main/java/fr/xephi/authme/data/limbo/AuthGroupHandler.java b/src/main/java/fr/xephi/authme/data/limbo/AuthGroupHandler.java index 366db7c94..6e8c241af 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/AuthGroupHandler.java +++ b/src/main/java/fr/xephi/authme/data/limbo/AuthGroupHandler.java @@ -35,8 +35,8 @@ class AuthGroupHandler implements Reloadable { @Inject private Settings settings; - private String unregisteredGroup; - private String registeredGroup; + private UserGroup unregisteredGroup; + private UserGroup registeredGroup; AuthGroupHandler() { } @@ -53,7 +53,7 @@ void setGroup(Player player, LimboPlayer limbo, AuthGroupType groupType) { return; } - Collection previousGroups = limbo == null ? Collections.emptyList() : limbo.getGroups(); + Collection previousGroups = limbo == null ? Collections.emptyList() : limbo.getGroups(); switch (groupType) { // Implementation note: some permission systems don't support players not being in any group, @@ -107,8 +107,8 @@ private boolean useAuthGroups() { @Override @PostConstruct public void reload() { - unregisteredGroup = settings.getProperty(PluginSettings.UNREGISTERED_GROUP); - registeredGroup = settings.getProperty(PluginSettings.REGISTERED_GROUP); + unregisteredGroup = new UserGroup(settings.getProperty(PluginSettings.UNREGISTERED_GROUP)); + registeredGroup = new UserGroup(settings.getProperty(PluginSettings.REGISTERED_GROUP)); } } diff --git a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java index 03c3ea138..d86f7a768 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java +++ b/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java @@ -17,7 +17,7 @@ public class LimboPlayer { private final boolean canFly; private final boolean operator; - private final Collection groups; + private final Collection groups; private final Location loc; private final float walkSpeed; private final float flySpeed; @@ -25,7 +25,7 @@ public class LimboPlayer { private MessageTask messageTask = null; private LimboPlayerState state = LimboPlayerState.PASSWORD_REQUIRED; - public LimboPlayer(Location loc, boolean operator, Collection groups, boolean fly, float walkSpeed, + public LimboPlayer(Location loc, boolean operator, Collection groups, boolean fly, float walkSpeed, float flySpeed) { this.loc = loc; this.operator = operator; @@ -58,7 +58,7 @@ public boolean isOperator() { * * @return The permissions groups the player belongs to */ - public Collection getGroups() { + public Collection getGroups() { return groups; } diff --git a/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java b/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java index d51afbef7..23b4ff7f5 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java +++ b/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java @@ -12,8 +12,11 @@ import javax.inject.Inject; import java.util.Collection; import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; import static fr.xephi.authme.util.Utils.isCollectionEmpty; +import static java.util.stream.Collectors.toList; /** * Helper class for the LimboService. @@ -42,10 +45,14 @@ LimboPlayer createLimboPlayer(Player player, boolean isRegistered, Location loca boolean flyEnabled = player.getAllowFlight(); float walkSpeed = player.getWalkSpeed(); float flySpeed = player.getFlySpeed(); - Collection playerGroups = permissionsManager.hasGroupSupport() + Collection playerGroups = permissionsManager.hasGroupSupport() ? permissionsManager.getGroups(player) : Collections.emptyList(); - logger.debug("Player `{0}` has groups `{1}`", player.getName(), String.join(", ", playerGroups)); + List groupNames = playerGroups.stream() + .map(UserGroup::getGroupName) + .collect(toList()); + + logger.debug("Player `{0}` has groups `{1}`", player.getName(), String.join(", ", groupNames)); return new LimboPlayer(location, isOperator, playerGroups, flyEnabled, walkSpeed, flySpeed); } @@ -91,7 +98,7 @@ LimboPlayer merge(LimboPlayer newLimbo, LimboPlayer oldLimbo) { boolean canFly = newLimbo.isCanFly() || oldLimbo.isCanFly(); float flySpeed = Math.max(newLimbo.getFlySpeed(), oldLimbo.getFlySpeed()); float walkSpeed = Math.max(newLimbo.getWalkSpeed(), oldLimbo.getWalkSpeed()); - Collection groups = getLimboGroups(oldLimbo.getGroups(), newLimbo.getGroups()); + Collection groups = getLimboGroups(oldLimbo.getGroups(), newLimbo.getGroups()); Location location = firstNotNull(oldLimbo.getLocation(), newLimbo.getLocation()); return new LimboPlayer(location, isOperator, groups, canFly, walkSpeed, flySpeed); @@ -101,7 +108,7 @@ private static Location firstNotNull(Location first, Location second) { return first == null ? second : first; } - private Collection getLimboGroups(Collection oldLimboGroups, Collection newLimboGroups) { + private Collection getLimboGroups(Collection oldLimboGroups, Collection newLimboGroups) { logger.debug("Limbo merge: new and old groups are `{0}` and `{1}`", newLimboGroups, oldLimboGroups); return isCollectionEmpty(oldLimboGroups) ? newLimboGroups : oldLimboGroups; } diff --git a/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java b/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java new file mode 100644 index 000000000..49b6ca671 --- /dev/null +++ b/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java @@ -0,0 +1,41 @@ +package fr.xephi.authme.data.limbo; + +import java.util.Map; +import java.util.Objects; + +public class UserGroup { + + private String groupName; + private Map contextMap; + + public UserGroup(String groupName) { + this.groupName = groupName; + } + + public UserGroup(String groupName, Map contextMap) { + this.groupName = groupName; + this.contextMap = contextMap; + } + + public String getGroupName() { + return groupName; + } + + public Map getContextMap() { + return contextMap; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + UserGroup userGroup = (UserGroup) o; + return Objects.equals(groupName, userGroup.groupName) && + Objects.equals(contextMap, userGroup.contextMap); + } + + @Override + public int hashCode() { + return Objects.hash(groupName, contextMap); + } +} diff --git a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java index c56885413..40c17bcea 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java +++ b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java @@ -1,10 +1,13 @@ package fr.xephi.authme.data.limbo.persistence; +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.data.limbo.LimboPlayer; import fr.xephi.authme.service.BukkitService; import org.bukkit.Location; @@ -15,6 +18,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.function.Function; import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.CAN_FLY; @@ -37,6 +41,8 @@ class LimboPlayerDeserializer implements JsonDeserializer { private static final String GROUP_LEGACY = "group"; + private static final String CONTEXT_MAP = "contextMap"; + private static final String GROUP_NAME = "groupName"; private BukkitService bukkitService; @@ -54,7 +60,7 @@ public LimboPlayer deserialize(JsonElement jsonElement, Type type, JsonDeseriali Location loc = deserializeLocation(jsonObject); boolean operator = getBoolean(jsonObject, IS_OP); - Collection groups = getLimboGroups(jsonObject); + Collection groups = getLimboGroups(jsonObject); boolean canFly = getBoolean(jsonObject, CAN_FLY); float walkSpeed = getFloat(jsonObject, WALK_SPEED, LimboPlayer.DEFAULT_WALK_SPEED); float flySpeed = getFloat(jsonObject, FLY_SPEED, LimboPlayer.DEFAULT_FLY_SPEED); @@ -84,16 +90,29 @@ private static String getString(JsonObject jsonObject, String memberName) { return element != null ? element.getAsString() : ""; } - private static List getLimboGroups(JsonObject jsonObject) { + private static List getLimboGroups(JsonObject jsonObject) { JsonElement element = jsonObject.get(GROUPS); if (element == null) { String legacyGroup = ofNullable(jsonObject.get(GROUP_LEGACY)).map(JsonElement::getAsString).orElse(null); - return legacyGroup == null ? Collections.emptyList() : Collections.singletonList(legacyGroup); + return legacyGroup == null ? Collections.emptyList() : Collections.singletonList(new UserGroup(legacyGroup, null)); } - List result = new ArrayList<>(); + List result = new ArrayList<>(); JsonArray jsonArray = element.getAsJsonArray(); for (JsonElement arrayElement : jsonArray) { - result.add(arrayElement.getAsString()); + if(!arrayElement.isJsonObject()) { + result.add(new UserGroup(arrayElement.getAsString(), null)); + } else { + JsonObject jsonGroup = arrayElement.getAsJsonObject(); + Map contextMap = null; + if(jsonGroup.has(CONTEXT_MAP)) { + JsonElement contextMapJson = jsonGroup.get("contextMap"); + Type type = new TypeToken>(){}.getType(); + contextMap = new Gson().fromJson(contextMapJson.getAsString(), type); + } + + String groupName = jsonGroup.get(GROUP_NAME).getAsString(); + result.add(new UserGroup(groupName, contextMap)); + } } return result; } diff --git a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java index 5f9b40ede..fc516f5e3 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java +++ b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java @@ -1,6 +1,7 @@ package fr.xephi.authme.data.limbo.persistence; import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; @@ -9,6 +10,8 @@ import org.bukkit.Location; import java.lang.reflect.Type; +import java.util.List; +import java.util.stream.Collectors; /** * Converts a LimboPlayer to a JsonElement. @@ -45,7 +48,19 @@ public JsonElement serialize(LimboPlayer limboPlayer, Type type, JsonSerializati JsonObject obj = new JsonObject(); obj.add(LOCATION, locationObject); - obj.add(GROUPS, GSON.toJsonTree(limboPlayer.getGroups()).getAsJsonArray()); + + List groups = limboPlayer.getGroups().stream().map(g -> { + JsonObject jsonGroup = new JsonObject(); + jsonGroup.addProperty("groupName", g.getGroupName()); + if(g.getContextMap() != null) { + jsonGroup.addProperty("contextMap", GSON.toJson(g.getContextMap())); + } + return jsonGroup; + }).collect(Collectors.toList()); + + JsonArray jsonGroups = new JsonArray(); + groups.forEach(jsonGroups::add); + obj.add(GROUPS, jsonGroups); obj.addProperty(IS_OP, limboPlayer.isOperator()); obj.addProperty(CAN_FLY, limboPlayer.isCanFly()); diff --git a/src/main/java/fr/xephi/authme/permission/PermissionsManager.java b/src/main/java/fr/xephi/authme/permission/PermissionsManager.java index a05582f19..113393d25 100644 --- a/src/main/java/fr/xephi/authme/permission/PermissionsManager.java +++ b/src/main/java/fr/xephi/authme/permission/PermissionsManager.java @@ -2,6 +2,7 @@ import com.google.common.annotations.VisibleForTesting; import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.initialization.Reloadable; import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.permission.handlers.LuckPermsHandler; @@ -285,7 +286,7 @@ public boolean hasGroupSupport() { * * @return Permission groups, or an empty collection if this feature is not supported. */ - public Collection getGroups(OfflinePlayer player) { + public Collection getGroups(OfflinePlayer player) { return isEnabled() ? handler.getGroups(player) : Collections.emptyList(); } @@ -296,7 +297,7 @@ public Collection getGroups(OfflinePlayer player) { * * @return The name of the primary permission group. Or null. */ - public String getPrimaryGroup(OfflinePlayer player) { + public UserGroup getPrimaryGroup(OfflinePlayer player) { return isEnabled() ? handler.getPrimaryGroup(player) : null; } @@ -309,7 +310,7 @@ public String getPrimaryGroup(OfflinePlayer player) { * @return True if the player is in the specified group, false otherwise. * False is also returned if groups aren't supported by the used permissions system. */ - public boolean isInGroup(OfflinePlayer player, String groupName) { + public boolean isInGroup(OfflinePlayer player, UserGroup groupName) { return isEnabled() && handler.isInGroup(player, groupName); } @@ -322,8 +323,8 @@ public boolean isInGroup(OfflinePlayer player, String groupName) { * @return True if succeed, false otherwise. * False is also returned if this feature isn't supported for the current permissions system. */ - public boolean addGroup(OfflinePlayer player, String groupName) { - if (!isEnabled() || StringUtils.isEmpty(groupName)) { + public boolean addGroup(OfflinePlayer player, UserGroup groupName) { + if (!isEnabled() || StringUtils.isEmpty(groupName.getGroupName())) { return false; } return handler.addToGroup(player, groupName); @@ -338,7 +339,7 @@ public boolean addGroup(OfflinePlayer player, String groupName) { * @return True if at least one group was added, false otherwise. * False is also returned if this feature isn't supported for the current permissions system. */ - public boolean addGroups(OfflinePlayer player, Collection groupNames) { + public boolean addGroups(OfflinePlayer player, Collection groupNames) { // If no permissions system is used, return false if (!isEnabled()) { return false; @@ -346,9 +347,9 @@ public boolean addGroups(OfflinePlayer player, Collection groupNames) { // Add each group to the user boolean result = false; - for (String groupName : groupNames) { - if (!groupName.isEmpty()) { - result |= handler.addToGroup(player, groupName); + for (UserGroup group : groupNames) { + if (!group.getGroupName().isEmpty()) { + result |= handler.addToGroup(player, group); } } @@ -360,13 +361,13 @@ public boolean addGroups(OfflinePlayer player, Collection groupNames) { * Remove the permission group of a player, if supported. * * @param player The player - * @param groupName The name of the group. + * @param group The name of the group. * * @return True if succeed, false otherwise. * False is also returned if this feature isn't supported for the current permissions system. */ - public boolean removeGroup(OfflinePlayer player, String groupName) { - return isEnabled() && handler.removeFromGroup(player, groupName); + public boolean removeGroup(OfflinePlayer player, UserGroup group) { + return isEnabled() && handler.removeFromGroup(player, group); } /** @@ -378,7 +379,7 @@ public boolean removeGroup(OfflinePlayer player, String groupName) { * @return True if at least one group was removed, false otherwise. * False is also returned if this feature isn't supported for the current permissions system. */ - public boolean removeGroups(OfflinePlayer player, Collection groupNames) { + public boolean removeGroups(OfflinePlayer player, Collection groupNames) { // If no permissions system is used, return false if (!isEnabled()) { return false; @@ -386,9 +387,9 @@ public boolean removeGroups(OfflinePlayer player, Collection groupNames) // Add each group to the user boolean result = false; - for (String groupName : groupNames) { - if (!groupName.isEmpty()) { - result |= handler.removeFromGroup(player, groupName); + for (UserGroup group : groupNames) { + if (!group.getGroupName().isEmpty()) { + result |= handler.removeFromGroup(player, group); } } @@ -401,13 +402,13 @@ public boolean removeGroups(OfflinePlayer player, Collection groupNames) * This clears the current groups of the player. * * @param player The player - * @param groupName The name of the group. + * @param group The name of the group. * * @return True if succeed, false otherwise. * False is also returned if this feature isn't supported for the current permissions system. */ - public boolean setGroup(OfflinePlayer player, String groupName) { - return isEnabled() && handler.setGroup(player, groupName); + public boolean setGroup(OfflinePlayer player, UserGroup group) { + return isEnabled() && handler.setGroup(player, group); } /** @@ -427,10 +428,10 @@ public boolean removeAllGroups(OfflinePlayer player) { } // Get a list of current groups - Collection groupNames = getGroups(player); + Collection groups = getGroups(player); // Remove each group - return removeGroups(player, groupNames); + return removeGroups(player, groups); } /** diff --git a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermGroup.java b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermGroup.java new file mode 100644 index 000000000..81a34a4ec --- /dev/null +++ b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermGroup.java @@ -0,0 +1,23 @@ +package fr.xephi.authme.permission.handlers; + +import net.luckperms.api.context.ImmutableContextSet; +import net.luckperms.api.model.group.Group; + +public class LuckPermGroup { + private Group group; + private ImmutableContextSet contexts; + + public LuckPermGroup(Group group, ImmutableContextSet contexts) { + this.group = group; + + this.contexts = contexts; + } + + public Group getGroup() { + return group; + } + + public ImmutableContextSet getContexts() { + return contexts; + } +} diff --git a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java index 58656ec37..546f7caf5 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java @@ -1,12 +1,14 @@ package fr.xephi.authme.permission.handlers; import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.permission.PermissionNode; import fr.xephi.authme.permission.PermissionsSystemType; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.cacheddata.CachedPermissionData; +import net.luckperms.api.context.ContextSetFactory; import net.luckperms.api.model.data.DataMutateResult; import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; @@ -15,6 +17,7 @@ import net.luckperms.api.query.QueryMode; import net.luckperms.api.query.QueryOptions; import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; @@ -45,8 +48,8 @@ public LuckPermsHandler() throws PermissionHandlerException { } @Override - public boolean addToGroup(OfflinePlayer player, String group) { - Group newGroup = luckPerms.getGroupManager().getGroup(group); + public boolean addToGroup(OfflinePlayer player, UserGroup group) { + Group newGroup = luckPerms.getGroupManager().getGroup(group.getGroupName()); if (newGroup == null) { return false; } @@ -60,7 +63,8 @@ public boolean addToGroup(OfflinePlayer player, String group) { return false; } - InheritanceNode node = InheritanceNode.builder(group).build(); + InheritanceNode node = buildGroupNode(group); + DataMutateResult result = user.data().add(node); if (result == DataMutateResult.FAIL) { return false; @@ -85,12 +89,12 @@ public boolean hasPermissionOffline(String name, PermissionNode node) { } CachedPermissionData permissionData = user.getCachedData() - .getPermissionData(QueryOptions.builder(QueryMode.NON_CONTEXTUAL).build()); + .getPermissionData(QueryOptions.builder(QueryMode.CONTEXTUAL).build()); return permissionData.checkPermission(node.getNode()).asBoolean(); } @Override - public boolean isInGroup(OfflinePlayer player, String group) { + public boolean isInGroup(OfflinePlayer player, UserGroup group) { String playerName = player.getName(); if (playerName == null) { return false; @@ -102,12 +106,12 @@ public boolean isInGroup(OfflinePlayer player, String group) { return false; } - InheritanceNode inheritanceNode = InheritanceNode.builder(group).build(); + InheritanceNode inheritanceNode = InheritanceNode.builder(group.getGroupName()).build(); return user.data().contains(inheritanceNode, NodeEqualityPredicate.EXACT).asBoolean(); } @Override - public boolean removeFromGroup(OfflinePlayer player, String group) { + public boolean removeFromGroup(OfflinePlayer player, UserGroup group) { String playerName = player.getName(); if (playerName == null) { return false; @@ -119,7 +123,7 @@ public boolean removeFromGroup(OfflinePlayer player, String group) { return false; } - InheritanceNode groupNode = InheritanceNode.builder(group).build(); + InheritanceNode groupNode = InheritanceNode.builder(group.getGroupName()).build(); boolean result = user.data().remove(groupNode) != DataMutateResult.FAIL; luckPerms.getUserManager().saveUser(user); @@ -127,7 +131,7 @@ public boolean removeFromGroup(OfflinePlayer player, String group) { } @Override - public boolean setGroup(OfflinePlayer player, String group) { + public boolean setGroup(OfflinePlayer player, UserGroup group) { String playerName = player.getName(); if (playerName == null) { return false; @@ -138,7 +142,9 @@ public boolean setGroup(OfflinePlayer player, String group) { + player.getName() + " but it isn't loaded!"); return false; } - InheritanceNode groupNode = InheritanceNode.builder(group).build(); + + InheritanceNode groupNode = buildGroupNode(group); + DataMutateResult result = user.data().add(groupNode); if (result == DataMutateResult.FAIL) { return false; @@ -156,7 +162,7 @@ public boolean setGroup(OfflinePlayer player, String group) { } @Override - public List getGroups(OfflinePlayer player) { + public List getGroups(OfflinePlayer player) { String playerName = player.getName(); if (playerName == null) { return Collections.emptyList(); @@ -171,17 +177,16 @@ public List getGroups(OfflinePlayer player) { return user.getDistinctNodes().stream() .filter(node -> node instanceof InheritanceNode) .map(node -> (InheritanceNode) node) - .map(node -> luckPerms.getGroupManager().getGroup(node.getGroupName())) - .filter(Objects::nonNull) - .sorted((o1, o2) -> { - if (o1.getName().equals(user.getPrimaryGroup()) || o2.getName().equals(user.getPrimaryGroup())) { - return o1.getName().equals(user.getPrimaryGroup()) ? 1 : -1; + .map(node -> { + Group group = luckPerms.getGroupManager().getGroup(node.getGroupName()); + if (group == null) { + return null; } - - int i = Integer.compare(o2.getWeight().orElse(0), o1.getWeight().orElse(0)); - return i != 0 ? i : o1.getName().compareToIgnoreCase(o2.getName()); + return new LuckPermGroup(group, node.getContexts()); }) - .map(Group::getName) + .filter(Objects::nonNull) + .sorted((o1, o2) -> sortGroups(user, o1, o2)) + .map(g -> new UserGroup(g.getGroup().getName(), g.getContexts().toFlattenedMap())) .collect(Collectors.toList()); } @@ -199,4 +204,20 @@ public void loadUserData(UUID uuid) throws PermissionLoadUserException { } } + @NotNull + private InheritanceNode buildGroupNode(UserGroup group) { + ContextSetFactory contextSetFactory = luckPerms.getContextManager().getContextSetFactory(); + InheritanceNode.Builder builder = InheritanceNode.builder(group.getGroupName()); + group.getContextMap().forEach((k, v) -> builder.withContext((contextSetFactory.immutableOf(k, v)))); + return builder.build(); + } + + private int sortGroups(User user, LuckPermGroup o1, LuckPermGroup o2) { + if (o1.getGroup().getName().equals(user.getPrimaryGroup()) || o2.getGroup().getName().equals(user.getPrimaryGroup())) { + return o1.getGroup().getName().equals(user.getPrimaryGroup()) ? 1 : -1; + } + + int i = Integer.compare(o2.getGroup().getWeight().orElse(0), o1.getGroup().getWeight().orElse(0)); + return i != 0 ? i : o1.getGroup().getName().compareToIgnoreCase(o2.getGroup().getName()); + } } diff --git a/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java index 428fbed74..efdc989e3 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java @@ -1,5 +1,6 @@ package fr.xephi.authme.permission.handlers; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.permission.PermissionNode; import fr.xephi.authme.permission.PermissionsSystemType; import fr.xephi.authme.util.Utils; @@ -19,7 +20,7 @@ public interface PermissionHandler { * @return True if succeed, false otherwise. * False is also returned if this feature isn't supported for the current permissions system. */ - boolean addToGroup(OfflinePlayer player, String group); + boolean addToGroup(OfflinePlayer player, UserGroup group); /** * Check whether the current permissions system has group support. @@ -49,7 +50,7 @@ public interface PermissionHandler { * @return True if the player is in the specified group, false otherwise. * False is also returned if groups aren't supported by the used permissions system. */ - default boolean isInGroup(OfflinePlayer player, String group) { + default boolean isInGroup(OfflinePlayer player, UserGroup group) { return getGroups(player).contains(group); } @@ -62,7 +63,7 @@ default boolean isInGroup(OfflinePlayer player, String group) { * @return True if succeed, false otherwise. * False is also returned if this feature isn't supported for the current permissions system. */ - boolean removeFromGroup(OfflinePlayer player, String group); + boolean removeFromGroup(OfflinePlayer player, UserGroup group); /** * Set the permission group of a player, if supported. @@ -74,7 +75,7 @@ default boolean isInGroup(OfflinePlayer player, String group) { * @return True if succeed, false otherwise. * False is also returned if this feature isn't supported for the current permissions system. */ - boolean setGroup(OfflinePlayer player, String group); + boolean setGroup(OfflinePlayer player, UserGroup group); /** * Get the permission groups of a player, if available. @@ -83,7 +84,7 @@ default boolean isInGroup(OfflinePlayer player, String group) { * * @return Permission groups, or an empty list if this feature is not supported. */ - Collection getGroups(OfflinePlayer player); + Collection getGroups(OfflinePlayer player); /** * Get the primary group of a player, if available. @@ -92,8 +93,8 @@ default boolean isInGroup(OfflinePlayer player, String group) { * * @return The name of the primary permission group. Or null. */ - default String getPrimaryGroup(OfflinePlayer player) { - Collection groups = getGroups(player); + default UserGroup getPrimaryGroup(OfflinePlayer player) { + Collection groups = getGroups(player); if (Utils.isCollectionEmpty(groups)) { return null; } diff --git a/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java index df2845aac..88ad0bf36 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java @@ -1,5 +1,6 @@ package fr.xephi.authme.permission.handlers; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.permission.PermissionNode; import fr.xephi.authme.permission.PermissionsSystemType; import org.bukkit.OfflinePlayer; @@ -9,6 +10,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; /** * Handler for PermissionsEx. @@ -28,13 +32,13 @@ public PermissionsExHandler() throws PermissionHandlerException { } @Override - public boolean addToGroup(OfflinePlayer player, String group) { + public boolean addToGroup(OfflinePlayer player, UserGroup group) { if (!PermissionsEx.getPermissionManager().getGroupNames().contains(group)) { return false; } PermissionUser user = PermissionsEx.getUser(player.getName()); - user.addGroup(group); + user.addGroup(group.getGroupName()); return true; } @@ -50,22 +54,22 @@ public boolean hasPermissionOffline(String name, PermissionNode node) { } @Override - public boolean isInGroup(OfflinePlayer player, String group) { + public boolean isInGroup(OfflinePlayer player, UserGroup group) { PermissionUser user = permissionManager.getUser(player.getName()); - return user.inGroup(group); + return user.inGroup(group.getGroupName()); } @Override - public boolean removeFromGroup(OfflinePlayer player, String group) { + public boolean removeFromGroup(OfflinePlayer player, UserGroup group) { PermissionUser user = permissionManager.getUser(player.getName()); - user.removeGroup(group); + user.removeGroup(group.getGroupName()); return true; } @Override - public boolean setGroup(OfflinePlayer player, String group) { + public boolean setGroup(OfflinePlayer player, UserGroup group) { List groups = new ArrayList<>(); - groups.add(group); + groups.add(group.getGroupName()); PermissionUser user = permissionManager.getUser(player.getName()); user.setParentsIdentifier(groups); @@ -73,9 +77,11 @@ public boolean setGroup(OfflinePlayer player, String group) { } @Override - public List getGroups(OfflinePlayer player) { + public List getGroups(OfflinePlayer player) { PermissionUser user = permissionManager.getUser(player.getName()); - return user.getParentIdentifiers(null); + return user.getParentIdentifiers(null).stream() + .map(i -> new UserGroup(i, null)) + .collect(toList()); } @Override diff --git a/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java index dad2fba50..8859c91fa 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java @@ -1,6 +1,7 @@ package fr.xephi.authme.permission.handlers; import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.permission.PermissionNode; import fr.xephi.authme.permission.PermissionsSystemType; import net.milkbowl.vault.permission.Permission; @@ -11,6 +12,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; /** * Handler for permissions via Vault. @@ -51,8 +55,8 @@ Permission getVaultPermission(Server server) throws PermissionHandlerException { } @Override - public boolean addToGroup(OfflinePlayer player, String group) { - return vaultProvider.playerAddGroup(null, player, group); + public boolean addToGroup(OfflinePlayer player, UserGroup group) { + return vaultProvider.playerAddGroup(null, player, group.getGroupName()); } @Override @@ -66,33 +70,33 @@ public boolean hasPermissionOffline(String name, PermissionNode node) { } @Override - public boolean isInGroup(OfflinePlayer player, String group) { - return vaultProvider.playerInGroup(null, player, group); + public boolean isInGroup(OfflinePlayer player, UserGroup group) { + return vaultProvider.playerInGroup(null, player, group.getGroupName()); } @Override - public boolean removeFromGroup(OfflinePlayer player, String group) { - return vaultProvider.playerRemoveGroup(null, player, group); + public boolean removeFromGroup(OfflinePlayer player, UserGroup group) { + return vaultProvider.playerRemoveGroup(null, player, group.getGroupName()); } @Override - public boolean setGroup(OfflinePlayer player, String group) { - for (String groupName : getGroups(player)) { - removeFromGroup(player, groupName); + public boolean setGroup(OfflinePlayer player, UserGroup group) { + for (UserGroup g : getGroups(player)) { + removeFromGroup(player, g); } - return vaultProvider.playerAddGroup(null, player, group); + return vaultProvider.playerAddGroup(null, player, group.getGroupName()); } @Override - public List getGroups(OfflinePlayer player) { + public List getGroups(OfflinePlayer player) { String[] groups = vaultProvider.getPlayerGroups(null, player); - return groups == null ? Collections.emptyList() : Arrays.asList(groups); + return groups == null ? Collections.emptyList() : Arrays.stream(groups).map(UserGroup::new).collect(toList()); } @Override - public String getPrimaryGroup(OfflinePlayer player) { - return vaultProvider.getPrimaryGroup(null, player); + public UserGroup getPrimaryGroup(OfflinePlayer player) { + return new UserGroup(vaultProvider.getPrimaryGroup(null, player)); } @Override diff --git a/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java index dc3901237..9865395f2 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java @@ -1,5 +1,6 @@ package fr.xephi.authme.permission.handlers; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.permission.PermissionNode; import fr.xephi.authme.permission.PermissionsSystemType; import org.bukkit.Bukkit; @@ -8,6 +9,9 @@ import java.util.Collection; import java.util.Map; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; /** * Handler for zPermissions. @@ -29,9 +33,9 @@ public ZPermissionsHandler() throws PermissionHandlerException { } @Override - public boolean addToGroup(OfflinePlayer player, String group) { + public boolean addToGroup(OfflinePlayer player, UserGroup group) { return Bukkit.dispatchCommand(Bukkit.getConsoleSender(), - "permissions player " + player.getName() + " addgroup " + group); + "permissions player " + player.getName() + " addgroup " + group.getGroupName()); } @Override @@ -46,25 +50,27 @@ public boolean hasPermissionOffline(String name, PermissionNode node) { } @Override - public boolean removeFromGroup(OfflinePlayer player, String group) { + public boolean removeFromGroup(OfflinePlayer player, UserGroup group) { return Bukkit.dispatchCommand(Bukkit.getConsoleSender(), - "permissions player " + player.getName() + " removegroup " + group); + "permissions player " + player.getName() + " removegroup " + group.getGroupName()); } @Override - public boolean setGroup(OfflinePlayer player, String group) { + public boolean setGroup(OfflinePlayer player, UserGroup group) { return Bukkit.dispatchCommand(Bukkit.getConsoleSender(), - "permissions player " + player.getName() + " setgroup " + group); + "permissions player " + player.getName() + " setgroup " + group.getGroupName()); } @Override - public Collection getGroups(OfflinePlayer player) { - return zPermissionsService.getPlayerGroups(player.getName()); + public Collection getGroups(OfflinePlayer player) { + return zPermissionsService.getPlayerGroups(player.getName()).stream() + .map(UserGroup::new) + .collect(toList()); } @Override - public String getPrimaryGroup(OfflinePlayer player) { - return zPermissionsService.getPlayerPrimaryGroup(player.getName()); + public UserGroup getPrimaryGroup(OfflinePlayer player) { + return new UserGroup(zPermissionsService.getPlayerPrimaryGroup(player.getName())); } @Override diff --git a/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerMatchers.java b/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerMatchers.java index 78386e2d3..6e83350af 100644 --- a/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerMatchers.java +++ b/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerMatchers.java @@ -6,9 +6,13 @@ import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; +import java.util.Arrays; import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; import static java.lang.String.format; +import static java.util.stream.Collectors.toList; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; /** @@ -21,12 +25,12 @@ private LimboPlayerMatchers() { } public static Matcher isLimbo(LimboPlayer limbo) { - String[] groups = limbo.getGroups().toArray(new String[limbo.getGroups().size()]); + UserGroup[] groups = limbo.getGroups().toArray(new UserGroup[limbo.getGroups().size()]); return isLimbo(limbo.isOperator(), limbo.isCanFly(), limbo.getWalkSpeed(), limbo.getFlySpeed(), groups); } public static Matcher isLimbo(boolean isOp, boolean canFly, float walkSpeed, float flySpeed, - String... groups) { + UserGroup... groups) { return new TypeSafeMatcher() { @Override protected boolean matchesSafely(LimboPlayer item) { @@ -39,14 +43,19 @@ && collectionContains(item.getGroups(), groups) @Override public void describeTo(Description description) { + List groupNames = Arrays.stream(groups).map(UserGroup::getGroupName).collect(toList()); description.appendText(format("Limbo with isOp=%s, groups={%s}, canFly=%s, walkSpeed=%f, flySpeed=%f", - isOp, String.join(" ,", groups), canFly, walkSpeed, flySpeed)); + isOp, String.join(" ,", groupNames), canFly, walkSpeed, flySpeed)); } @Override public void describeMismatchSafely(LimboPlayer item, Description description) { + List groupNames = item.getGroups().stream() + .map(UserGroup::getGroupName) + .collect(toList()); + description.appendText(format("Limbo with isOp=%s, groups={%s}, canFly=%s, walkSpeed=%f, flySpeed=%f", - item.isOperator(), String.join(" ,", item.getGroups()), item.isCanFly(), + item.isOperator(), String.join(" ,", groupNames), item.isCanFly(), item.getWalkSpeed(), item.getFlySpeed())); } }; @@ -119,7 +128,7 @@ public static Matcher hasLocation(Location location) { } // Hamcrest's contains() doesn't like it when there are no items, so we need to check for the empty case explicitly - private static boolean collectionContains(Collection givenItems, String... expectedItems) { + private static boolean collectionContains(Collection givenItems, UserGroup... expectedItems) { if (expectedItems.length == 0) { return givenItems.isEmpty(); } diff --git a/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManagerTest.java b/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManagerTest.java index 4151843c6..5cbbb1ffe 100644 --- a/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManagerTest.java +++ b/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManagerTest.java @@ -106,7 +106,7 @@ public void shouldCancelExistingMessageTask() { String name = "rats"; Player player = mock(Player.class); given(player.getName()).willReturn(name); - LimboPlayer limboPlayer = new LimboPlayer(null, true, Collections.singletonList("grp"), false, 0.1f, 0.0f); + LimboPlayer limboPlayer = new LimboPlayer(null, true, Collections.singletonList(new UserGroup("grp")), false, 0.1f, 0.0f); MessageTask existingMessageTask = mock(MessageTask.class); limboPlayer.setMessageTask(existingMessageTask); given(settings.getProperty(RegistrationSettings.MESSAGE_INTERVAL)).willReturn(8); @@ -129,7 +129,7 @@ public void shouldInitializeMessageTaskWithCaptchaMessage() { String name = "race"; Player player = mock(Player.class); given(player.getName()).willReturn(name); - LimboPlayer limboPlayer = new LimboPlayer(null, true, Collections.singletonList("grp"), false, 0.1f, 0.0f); + LimboPlayer limboPlayer = new LimboPlayer(null, true, Collections.singletonList(new UserGroup("grp")), false, 0.1f, 0.0f); given(settings.getProperty(RegistrationSettings.MESSAGE_INTERVAL)).willReturn(12); given(registrationCaptchaManager.isCaptchaRequired(name)).willReturn(true); String captcha = "M032"; diff --git a/src/test/java/fr/xephi/authme/data/limbo/LimboServiceHelperTest.java b/src/test/java/fr/xephi/authme/data/limbo/LimboServiceHelperTest.java index a2aceee18..418ce698c 100644 --- a/src/test/java/fr/xephi/authme/data/limbo/LimboServiceHelperTest.java +++ b/src/test/java/fr/xephi/authme/data/limbo/LimboServiceHelperTest.java @@ -37,9 +37,9 @@ public static void initLogger() { public void shouldMergeLimboPlayers() { // given Location newLocation = mock(Location.class); - LimboPlayer newLimbo = new LimboPlayer(newLocation, false, Collections.singletonList("grp-new"), false, 0.0f, 0.0f); + LimboPlayer newLimbo = new LimboPlayer(newLocation, false, Collections.singletonList(new UserGroup("grp-new")), false, 0.0f, 0.0f); Location oldLocation = mock(Location.class); - LimboPlayer oldLimbo = new LimboPlayer(oldLocation, true, Collections.singletonList("grp-old"), true, 0.1f, 0.8f); + LimboPlayer oldLimbo = new LimboPlayer(oldLocation, true, Collections.singletonList(new UserGroup("grp-old")), true, 0.1f, 0.8f); // when LimboPlayer result = limboServiceHelper.merge(newLimbo, oldLimbo); @@ -47,7 +47,7 @@ public void shouldMergeLimboPlayers() { // then assertThat(result.getLocation(), equalTo(oldLocation)); assertThat(result.isOperator(), equalTo(true)); - assertThat(result.getGroups(), contains("grp-old")); + assertThat(result.getGroups(), contains(new UserGroup("grp-old"))); assertThat(result.isCanFly(), equalTo(true)); assertThat(result.getWalkSpeed(), equalTo(0.1f)); assertThat(result.getFlySpeed(), equalTo(0.8f)); @@ -57,7 +57,7 @@ public void shouldMergeLimboPlayers() { public void shouldFallBackToNewLimboForMissingData() { // given Location newLocation = mock(Location.class); - LimboPlayer newLimbo = new LimboPlayer(newLocation, false, Collections.singletonList("grp-new"), true, 0.3f, 0.0f); + LimboPlayer newLimbo = new LimboPlayer(newLocation, false, Collections.singletonList(new UserGroup("grp-new")), true, 0.3f, 0.0f); LimboPlayer oldLimbo = new LimboPlayer(null, false, Collections.emptyList(), false, 0.1f, 0.1f); // when @@ -66,7 +66,7 @@ public void shouldFallBackToNewLimboForMissingData() { // then assertThat(result.getLocation(), equalTo(newLocation)); assertThat(result.isOperator(), equalTo(false)); - assertThat(result.getGroups(), contains("grp-new")); + assertThat(result.getGroups(), contains(new UserGroup("grp-new"))); assertThat(result.isCanFly(), equalTo(true)); assertThat(result.getWalkSpeed(), equalTo(0.3f)); assertThat(result.getFlySpeed(), equalTo(0.1f)); diff --git a/src/test/java/fr/xephi/authme/data/limbo/LimboServiceTest.java b/src/test/java/fr/xephi/authme/data/limbo/LimboServiceTest.java index eb7bdfe9e..44839c13b 100644 --- a/src/test/java/fr/xephi/authme/data/limbo/LimboServiceTest.java +++ b/src/test/java/fr/xephi/authme/data/limbo/LimboServiceTest.java @@ -83,7 +83,7 @@ public void shouldCreateLimboPlayer() { Location playerLoc = mock(Location.class); given(spawnLoader.getPlayerLocationOrSpawn(player)).willReturn(playerLoc); given(permissionsManager.hasGroupSupport()).willReturn(true); - given(permissionsManager.getGroups(player)).willReturn(Collections.singletonList("permgrwp")); + given(permissionsManager.getGroups(player)).willReturn(Collections.singletonList(new UserGroup("permgrwp"))); given(settings.getProperty(LimboSettings.RESTORE_ALLOW_FLIGHT)).willReturn(AllowFlightRestoreType.ENABLE); // when @@ -105,7 +105,7 @@ public void shouldCreateLimboPlayer() { assertThat(limbo.isCanFly(), equalTo(false)); assertThat(limbo.getFlySpeed(), equalTo(0.2f)); assertThat(limbo.getLocation(), equalTo(playerLoc)); - assertThat(limbo.getGroups(), equalTo(Collections.singletonList("permgrwp"))); + assertThat(limbo.getGroups(), equalTo(Collections.singletonList(new UserGroup("permgrwp")))); } @Test @@ -241,7 +241,7 @@ private static Player newPlayer(String name, boolean isOp, float walkSpeed, bool return player; } - private static LimboPlayer convertToLimboPlayer(Player player, Location location, Collection groups) { + private static LimboPlayer convertToLimboPlayer(Player player, Location location, Collection groups) { return new LimboPlayer(location, player.isOp(), groups, player.getAllowFlight(), player.getWalkSpeed(), player.getFlySpeed()); } diff --git a/src/test/java/fr/xephi/authme/data/limbo/persistence/DistributedFilesPersistenceHandlerTest.java b/src/test/java/fr/xephi/authme/data/limbo/persistence/DistributedFilesPersistenceHandlerTest.java index fd41134a1..f223bdf1c 100644 --- a/src/test/java/fr/xephi/authme/data/limbo/persistence/DistributedFilesPersistenceHandlerTest.java +++ b/src/test/java/fr/xephi/authme/data/limbo/persistence/DistributedFilesPersistenceHandlerTest.java @@ -6,6 +6,7 @@ import com.google.common.io.Files; import fr.xephi.authme.TestHelper; import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.initialization.DataFolder; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.settings.Settings; @@ -48,22 +49,22 @@ public class DistributedFilesPersistenceHandlerTest { /** Player is in seg32-10110 and should be migrated into seg16-f. */ private static final UUID MIGRATED_UUID = fromString("f6a97c88-7c8f-c12e-4931-6206d4ca067d"); private static final Matcher MIGRATED_LIMBO_MATCHER = - isLimbo(false, true, 0.2f, 0.1f, "noob"); + isLimbo(false, true, 0.2f, 0.1f, new UserGroup("noob")); /** Existing player in seg16-f. */ private static final UUID UUID_FAB69 = fromString("fab69c88-2cd0-1fed-f00d-dead14ca067d"); private static final Matcher FAB69_MATCHER = - isLimbo(false, false, 0.2f, 0.1f, ""); + isLimbo(false, false, 0.2f, 0.1f, new UserGroup("")); /** Player in seg16-8. */ private static final UUID UUID_STAFF = fromString("88897c88-7c8f-c12e-4931-6206d4ca067d"); private static final Matcher STAFF_MATCHER = - isLimbo(true, false, 0.3f, 0.1f, "staff", "mod"); + isLimbo(true, false, 0.3f, 0.1f, new UserGroup("staff"), new UserGroup("mod")); /** Player in seg16-8. */ private static final UUID UUID_8C679 = fromString("8c679491-1234-abcd-9102-1fa6e0cc3f81"); private static final Matcher SC679_MATCHER = - isLimbo(false, true, 0.1f, 0.0f, "primary"); + isLimbo(false, true, 0.1f, 0.0f, new UserGroup("primary")); /** UUID for which no data is stored (belongs to a segment file that does not exist, seg16-4). */ private static final UUID UNKNOWN_UUID = fromString("42d1cc0b-8f12-d04a-e7ba-a067d05cdc39"); @@ -156,7 +157,7 @@ public void shouldAddPlayer() { // given Player uuidToAdd1 = mockPlayerWithUuid(UNKNOWN_UUID); Location location1 = mockLocation("1world"); - LimboPlayer limbo1 = new LimboPlayer(location1, false, Collections.singletonList("group-1"), true, 0.1f, 0.2f); + LimboPlayer limbo1 = new LimboPlayer(location1, false, Collections.singletonList(new UserGroup("group-1")), true, 0.1f, 0.2f); Player uuidToAdd2 = mockPlayerWithUuid(UNKNOWN_UUID2); Location location2 = mockLocation("2world"); LimboPlayer limbo2 = new LimboPlayer(location2, true, Collections.emptyList(), false, 0.0f, 0.25f); diff --git a/src/test/java/fr/xephi/authme/data/limbo/persistence/IndividualFilesPersistenceHandlerTest.java b/src/test/java/fr/xephi/authme/data/limbo/persistence/IndividualFilesPersistenceHandlerTest.java index 06df57bf0..77af85677 100644 --- a/src/test/java/fr/xephi/authme/data/limbo/persistence/IndividualFilesPersistenceHandlerTest.java +++ b/src/test/java/fr/xephi/authme/data/limbo/persistence/IndividualFilesPersistenceHandlerTest.java @@ -5,6 +5,7 @@ import ch.jalu.injector.testing.InjectDelayed; import fr.xephi.authme.TestHelper; import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.initialization.DataFolder; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.util.FileUtils; @@ -80,7 +81,7 @@ public void shouldReadDataFromFile() { assertThat(data.isCanFly(), equalTo(true)); assertThat(data.getWalkSpeed(), equalTo(0.2f)); assertThat(data.getFlySpeed(), equalTo(0.1f)); - assertThat(data.getGroups(), contains("players")); + assertThat(data.getGroups(), contains(new UserGroup("players"))); Location location = data.getLocation(); assertThat(location.getX(), equalTo(-113.219)); assertThat(location.getY(), equalTo(72.0)); @@ -114,7 +115,7 @@ public void shouldSavePlayerData() { World world = mock(World.class); given(world.getName()).willReturn("player-world"); Location location = new Location(world, 0.2, 102.25, -89.28, 3.02f, 90.13f); - LimboPlayer limbo = new LimboPlayer(location, true, Collections.singletonList("primary-grp"), true, 1.2f, 0.8f); + LimboPlayer limbo = new LimboPlayer(location, true, Collections.singletonList(new UserGroup("primary-grp")), true, 1.2f, 0.8f); // when handler.saveLimboPlayer(player, limbo); diff --git a/src/test/java/fr/xephi/authme/permission/handlers/VaultHandlerTest.java b/src/test/java/fr/xephi/authme/permission/handlers/VaultHandlerTest.java index 006e865d4..852dcaefb 100644 --- a/src/test/java/fr/xephi/authme/permission/handlers/VaultHandlerTest.java +++ b/src/test/java/fr/xephi/authme/permission/handlers/VaultHandlerTest.java @@ -1,12 +1,15 @@ package fr.xephi.authme.permission.handlers; +import fr.xephi.authme.data.limbo.UserGroup; import net.milkbowl.vault.permission.Permission; import org.bukkit.Server; import org.bukkit.entity.Player; import org.junit.Test; import java.util.List; +import java.util.stream.Collectors; +import static java.util.stream.Collectors.toList; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; import static org.junit.Assert.assertThat; @@ -29,10 +32,11 @@ public void shouldReturnGroups() { given(permissionMock.getPlayerGroups(null, player)).willReturn(new String[]{"abc", "test"}); // when - List result = vaultHandlerTest.getGroups(player); + List result = vaultHandlerTest.getGroups(player); // then - assertThat(result, contains("abc", "test")); + List groupNames = result.stream().map(UserGroup::getGroupName).collect(toList()); + assertThat(groupNames, contains("abc", "test")); verify(permissionMock).getPlayerGroups(null, player); } @@ -47,7 +51,7 @@ public void shouldHandleNullAsGroups() { given(permissionMock.getPlayerGroups(null, player)).willReturn(null); // when - List result = vaultHandlerTest.getGroups(player); + List result = vaultHandlerTest.getGroups(player); // then assertThat(result, empty()); From 28b9094f8793bfafdb749ef0936a067dd4d407ba Mon Sep 17 00:00:00 2001 From: David Maes Date: Wed, 26 Aug 2020 02:49:36 +0200 Subject: [PATCH 04/11] Code cleanup --- .../authme/debug/PermissionGroups.java | 1 - .../authme/data/limbo/LimboServiceHelper.java | 8 ++++---- .../fr/xephi/authme/data/limbo/UserGroup.java | 12 ++++++++---- .../persistence/LimboPlayerDeserializer.java | 17 +++++++++++------ .../permission/handlers/LuckPermsHandler.java | 10 ++++++---- .../handlers/PermissionsExHandler.java | 1 - .../permission/handlers/VaultHandler.java | 1 - .../handlers/ZPermissionsHandler.java | 1 - .../authme/data/limbo/LimboPlayerMatchers.java | 1 - 9 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java b/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java index 99ba41b2e..4515ca0bd 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java @@ -11,7 +11,6 @@ import javax.inject.Inject; import java.util.List; -import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; diff --git a/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java b/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java index 23b4ff7f5..a3edb164f 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java +++ b/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java @@ -13,7 +13,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import static fr.xephi.authme.util.Utils.isCollectionEmpty; import static java.util.stream.Collectors.toList; @@ -34,9 +33,9 @@ class LimboServiceHelper { /** * Creates a LimboPlayer with the given player's details. * - * @param player the player to process + * @param player the player to process * @param isRegistered whether the player is registered - * @param location the player location + * @param location the player location * @return limbo player with the player's data */ LimboPlayer createLimboPlayer(Player player, boolean isRegistered, Location location) { @@ -108,7 +107,8 @@ private static Location firstNotNull(Location first, Location second) { return first == null ? second : first; } - private Collection getLimboGroups(Collection oldLimboGroups, Collection newLimboGroups) { + private Collection getLimboGroups(Collection oldLimboGroups, + Collection newLimboGroups) { logger.debug("Limbo merge: new and old groups are `{0}` and `{1}`", newLimboGroups, oldLimboGroups); return isCollectionEmpty(oldLimboGroups) ? newLimboGroups : oldLimboGroups; } diff --git a/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java b/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java index 49b6ca671..9ed028a56 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java +++ b/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java @@ -27,11 +27,15 @@ public Map getContextMap() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } UserGroup userGroup = (UserGroup) o; - return Objects.equals(groupName, userGroup.groupName) && - Objects.equals(contextMap, userGroup.contextMap); + return Objects.equals(groupName, userGroup.groupName) + && Objects.equals(contextMap, userGroup.contextMap); } @Override diff --git a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java index 40c17bcea..6dea20efe 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java +++ b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java @@ -7,8 +7,8 @@ import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.data.limbo.UserGroup; import fr.xephi.authme.service.BukkitService; import org.bukkit.Location; import org.bukkit.World; @@ -90,23 +90,29 @@ private static String getString(JsonObject jsonObject, String memberName) { return element != null ? element.getAsString() : ""; } + /** + * @param jsonObject LimboPlayer represented as JSON + * @return The list of UserGroups create from JSON + */ private static List getLimboGroups(JsonObject jsonObject) { JsonElement element = jsonObject.get(GROUPS); if (element == null) { String legacyGroup = ofNullable(jsonObject.get(GROUP_LEGACY)).map(JsonElement::getAsString).orElse(null); - return legacyGroup == null ? Collections.emptyList() : Collections.singletonList(new UserGroup(legacyGroup, null)); + return legacyGroup == null ? Collections.emptyList() : + Collections.singletonList(new UserGroup(legacyGroup, null)); } List result = new ArrayList<>(); JsonArray jsonArray = element.getAsJsonArray(); for (JsonElement arrayElement : jsonArray) { - if(!arrayElement.isJsonObject()) { + if (!arrayElement.isJsonObject()) { result.add(new UserGroup(arrayElement.getAsString(), null)); } else { JsonObject jsonGroup = arrayElement.getAsJsonObject(); Map contextMap = null; - if(jsonGroup.has(CONTEXT_MAP)) { + if (jsonGroup.has(CONTEXT_MAP)) { JsonElement contextMapJson = jsonGroup.get("contextMap"); - Type type = new TypeToken>(){}.getType(); + Type type = new TypeToken>() { + }.getType(); contextMap = new Gson().fromJson(contextMapJson.getAsString(), type); } @@ -141,7 +147,6 @@ private static double getDouble(JsonObject jsonObject, String memberName) { * @param numberFunction the function to get the number from the element * @param defaultValue the value to return if the element is null or the number cannot be retrieved * @param the number type - * * @return the number from the given JSON element, or the default value */ private static N getNumberFromElement(JsonElement jsonElement, diff --git a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java index 546f7caf5..bcf1edd56 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java @@ -213,11 +213,13 @@ private InheritanceNode buildGroupNode(UserGroup group) { } private int sortGroups(User user, LuckPermGroup o1, LuckPermGroup o2) { - if (o1.getGroup().getName().equals(user.getPrimaryGroup()) || o2.getGroup().getName().equals(user.getPrimaryGroup())) { - return o1.getGroup().getName().equals(user.getPrimaryGroup()) ? 1 : -1; + Group group1 = o1.getGroup(); + Group group2 = o2.getGroup(); + if (group1.getName().equals(user.getPrimaryGroup()) || group2.getName().equals(user.getPrimaryGroup())) { + return group1.getName().equals(user.getPrimaryGroup()) ? 1 : -1; } - int i = Integer.compare(o2.getGroup().getWeight().orElse(0), o1.getGroup().getWeight().orElse(0)); - return i != 0 ? i : o1.getGroup().getName().compareToIgnoreCase(o2.getGroup().getName()); + int i = Integer.compare(group2.getWeight().orElse(0), group1.getWeight().orElse(0)); + return i != 0 ? i : group1.getName().compareToIgnoreCase(group2.getName()); } } diff --git a/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java index 88ad0bf36..db834ca4f 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; diff --git a/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java index 8859c91fa..87f5fc272 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java @@ -12,7 +12,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; diff --git a/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java index 9865395f2..0b632de6b 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java @@ -9,7 +9,6 @@ import java.util.Collection; import java.util.Map; -import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; diff --git a/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerMatchers.java b/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerMatchers.java index 6e83350af..8a47a5812 100644 --- a/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerMatchers.java +++ b/src/test/java/fr/xephi/authme/data/limbo/LimboPlayerMatchers.java @@ -9,7 +9,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; import static java.lang.String.format; import static java.util.stream.Collectors.toList; From 808896e2e6f4c92f44368de09507fa776051f337 Mon Sep 17 00:00:00 2001 From: David Maes Date: Wed, 26 Aug 2020 02:51:10 +0200 Subject: [PATCH 05/11] Code cleanup --- .../authme/data/limbo/persistence/LimboPlayerSerializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java index fc516f5e3..eaad86b7e 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java +++ b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java @@ -52,7 +52,7 @@ public JsonElement serialize(LimboPlayer limboPlayer, Type type, JsonSerializati List groups = limboPlayer.getGroups().stream().map(g -> { JsonObject jsonGroup = new JsonObject(); jsonGroup.addProperty("groupName", g.getGroupName()); - if(g.getContextMap() != null) { + if (g.getContextMap() != null) { jsonGroup.addProperty("contextMap", GSON.toJson(g.getContextMap())); } return jsonGroup; From 83bf76a8730454e92f145091c7af2b5cc4340318 Mon Sep 17 00:00:00 2001 From: David Maes Date: Mon, 31 Aug 2020 09:25:48 +0200 Subject: [PATCH 06/11] Fix nullpointer for context maps --- .../fr/xephi/authme/permission/handlers/LuckPermsHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java index bcf1edd56..7146d9484 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java @@ -208,7 +208,9 @@ public void loadUserData(UUID uuid) throws PermissionLoadUserException { private InheritanceNode buildGroupNode(UserGroup group) { ContextSetFactory contextSetFactory = luckPerms.getContextManager().getContextSetFactory(); InheritanceNode.Builder builder = InheritanceNode.builder(group.getGroupName()); - group.getContextMap().forEach((k, v) -> builder.withContext((contextSetFactory.immutableOf(k, v)))); + if(group.getContextMap() != null) { + group.getContextMap().forEach((k, v) -> builder.withContext((contextSetFactory.immutableOf(k, v)))); + } return builder.build(); } From 8a852ebb7581657170718881d55fac3edbd58f9a Mon Sep 17 00:00:00 2001 From: David Maes Date: Mon, 31 Aug 2020 11:14:11 +0200 Subject: [PATCH 07/11] Code cleanup --- .../fr/xephi/authme/permission/handlers/LuckPermsHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java index 7146d9484..3e786f33d 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java @@ -208,7 +208,7 @@ public void loadUserData(UUID uuid) throws PermissionLoadUserException { private InheritanceNode buildGroupNode(UserGroup group) { ContextSetFactory contextSetFactory = luckPerms.getContextManager().getContextSetFactory(); InheritanceNode.Builder builder = InheritanceNode.builder(group.getGroupName()); - if(group.getContextMap() != null) { + if (group.getContextMap() != null) { group.getContextMap().forEach((k, v) -> builder.withContext((contextSetFactory.immutableOf(k, v)))); } return builder.build(); From 05296e5f23bd4379a89647656f08432c718e6f9c Mon Sep 17 00:00:00 2001 From: David Maes Date: Mon, 7 Sep 2020 20:06:18 +0200 Subject: [PATCH 08/11] Use uuids for sqlite and postgresql --- .../fr/xephi/authme/datasource/PostgreSqlDataSource.java | 5 +++++ src/main/java/fr/xephi/authme/datasource/SQLite.java | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java b/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java index b0186f4b7..92cd8ebaa 100644 --- a/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java @@ -12,6 +12,7 @@ import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.DatabaseSettings; import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.util.UuidUtils; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -24,6 +25,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.UUID; import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; @@ -444,6 +446,8 @@ public boolean setTotpKey(String user, String totpKey) { private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { String salt = col.SALT.isEmpty() ? null : row.getString(col.SALT); int group = col.GROUP.isEmpty() ? -1 : row.getInt(col.GROUP); + UUID uuid = col.PLAYER_UUID.isEmpty() + ? null : UuidUtils.parseUuidSafely(row.getString(col.PLAYER_UUID)); return PlayerAuth.builder() .name(row.getString(col.NAME)) .realName(row.getString(col.REAL_NAME)) @@ -461,6 +465,7 @@ private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { .locZ(row.getDouble(col.LASTLOC_Z)) .locYaw(row.getFloat(col.LASTLOC_YAW)) .locPitch(row.getFloat(col.LASTLOC_PITCH)) + .uuid(uuid) .build(); } } diff --git a/src/main/java/fr/xephi/authme/datasource/SQLite.java b/src/main/java/fr/xephi/authme/datasource/SQLite.java index da1851bd3..171a134a6 100644 --- a/src/main/java/fr/xephi/authme/datasource/SQLite.java +++ b/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -7,6 +7,7 @@ import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.util.UuidUtils; import java.io.File; import java.sql.Connection; @@ -21,6 +22,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.UUID; import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; @@ -366,7 +368,8 @@ public boolean setTotpKey(String user, String totpKey) { private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { String salt = !col.SALT.isEmpty() ? row.getString(col.SALT) : null; - + UUID uuid = col.PLAYER_UUID.isEmpty() + ? null : UuidUtils.parseUuidSafely(row.getString(col.PLAYER_UUID)); return PlayerAuth.builder() .name(row.getString(col.NAME)) .email(row.getString(col.EMAIL)) @@ -383,6 +386,7 @@ private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { .locWorld(row.getString(col.LASTLOC_WORLD)) .locYaw(row.getFloat(col.LASTLOC_YAW)) .locPitch(row.getFloat(col.LASTLOC_PITCH)) + .uuid(uuid) .build(); } From 034753a24330646ac19eb496bfd86d44a58b0c8f Mon Sep 17 00:00:00 2001 From: David Maes Date: Tue, 8 Sep 2020 01:55:16 +0200 Subject: [PATCH 09/11] Revert "Use uuids for sqlite and postgresql" This reverts commit 05296e5f23bd4379a89647656f08432c718e6f9c. --- .../fr/xephi/authme/datasource/PostgreSqlDataSource.java | 5 ----- src/main/java/fr/xephi/authme/datasource/SQLite.java | 6 +----- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java b/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java index 92cd8ebaa..b0186f4b7 100644 --- a/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java @@ -12,7 +12,6 @@ import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.DatabaseSettings; import fr.xephi.authme.settings.properties.HooksSettings; -import fr.xephi.authme.util.UuidUtils; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -25,7 +24,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.UUID; import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; @@ -446,8 +444,6 @@ public boolean setTotpKey(String user, String totpKey) { private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { String salt = col.SALT.isEmpty() ? null : row.getString(col.SALT); int group = col.GROUP.isEmpty() ? -1 : row.getInt(col.GROUP); - UUID uuid = col.PLAYER_UUID.isEmpty() - ? null : UuidUtils.parseUuidSafely(row.getString(col.PLAYER_UUID)); return PlayerAuth.builder() .name(row.getString(col.NAME)) .realName(row.getString(col.REAL_NAME)) @@ -465,7 +461,6 @@ private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { .locZ(row.getDouble(col.LASTLOC_Z)) .locYaw(row.getFloat(col.LASTLOC_YAW)) .locPitch(row.getFloat(col.LASTLOC_PITCH)) - .uuid(uuid) .build(); } } diff --git a/src/main/java/fr/xephi/authme/datasource/SQLite.java b/src/main/java/fr/xephi/authme/datasource/SQLite.java index 171a134a6..da1851bd3 100644 --- a/src/main/java/fr/xephi/authme/datasource/SQLite.java +++ b/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -7,7 +7,6 @@ import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.DatabaseSettings; -import fr.xephi.authme.util.UuidUtils; import java.io.File; import java.sql.Connection; @@ -22,7 +21,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.UUID; import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; @@ -368,8 +366,7 @@ public boolean setTotpKey(String user, String totpKey) { private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { String salt = !col.SALT.isEmpty() ? row.getString(col.SALT) : null; - UUID uuid = col.PLAYER_UUID.isEmpty() - ? null : UuidUtils.parseUuidSafely(row.getString(col.PLAYER_UUID)); + return PlayerAuth.builder() .name(row.getString(col.NAME)) .email(row.getString(col.EMAIL)) @@ -386,7 +383,6 @@ private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { .locWorld(row.getString(col.LASTLOC_WORLD)) .locYaw(row.getFloat(col.LASTLOC_YAW)) .locPitch(row.getFloat(col.LASTLOC_PITCH)) - .uuid(uuid) .build(); } From da11e005e997150ee903eab74460b344d3f62342 Mon Sep 17 00:00:00 2001 From: David Maes Date: Thu, 5 Aug 2021 22:05:19 +0200 Subject: [PATCH 10/11] Cleanup imports --- .../authme/data/limbo/persistence/LimboPlayerSerializer.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java index 599483838..4c4595c79 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java +++ b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java @@ -1,10 +1,8 @@ package fr.xephi.authme.data.limbo.persistence; import com.google.gson.Gson; -import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import fr.xephi.authme.data.limbo.LimboPlayer; From e61105b95714d230a392b69286748fd8e38edb93 Mon Sep 17 00:00:00 2001 From: David Maes Date: Fri, 6 Aug 2021 20:54:57 +0200 Subject: [PATCH 11/11] Fix test --- .../authme/data/limbo/persistence/LimboPlayerSerializer.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java index 4c4595c79..eaad86b7e 100644 --- a/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java +++ b/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java @@ -1,6 +1,7 @@ package fr.xephi.authme.data.limbo.persistence; import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; @@ -57,6 +58,10 @@ public JsonElement serialize(LimboPlayer limboPlayer, Type type, JsonSerializati return jsonGroup; }).collect(Collectors.toList()); + JsonArray jsonGroups = new JsonArray(); + groups.forEach(jsonGroups::add); + obj.add(GROUPS, jsonGroups); + obj.addProperty(IS_OP, limboPlayer.isOperator()); obj.addProperty(CAN_FLY, limboPlayer.isCanFly()); obj.addProperty(WALK_SPEED, limboPlayer.getWalkSpeed());