From 3d65b258b333763487e9200cbd702ba58a16325c Mon Sep 17 00:00:00 2001 From: Luck Date: Wed, 17 Jan 2018 20:28:24 +0000 Subject: [PATCH] Add support for LuckPerms offline permission checks --- pom.xml | 5 + .../java/org/dynmap/bukkit/DynmapPlugin.java | 3 + .../permissions/LuckPermsPermissions.java | 96 +++++++++++++++++++ src/main/resources/plugin.yml | 2 +- 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/dynmap/bukkit/permissions/LuckPermsPermissions.java diff --git a/pom.xml b/pom.xml index 90cf6d3d..8e675a03 100644 --- a/pom.xml +++ b/pom.xml @@ -145,6 +145,11 @@ EssentialsGroupManager 2.10.1 + + me.lucko.luckperms + luckperms-api + 4.0 + org.bstats bstats-bukkit diff --git a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java index 6ef7a0fd..0eee2b1e 100644 --- a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java +++ b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -78,6 +78,7 @@ import org.dynmap.MapManager; import org.dynmap.MapType; import org.dynmap.PlayerList; import org.dynmap.bukkit.permissions.BukkitPermissions; +import org.dynmap.bukkit.permissions.LuckPermsPermissions; import org.dynmap.bukkit.permissions.NijikokunPermissions; import org.dynmap.bukkit.permissions.OpPermissions; import org.dynmap.bukkit.permissions.PEXPermissions; @@ -800,6 +801,8 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { permissions = NijikokunPermissions.create(getServer(), "dynmap"); if (permissions == null) permissions = GroupManagerPermissions.create(getServer(), "dynmap"); + if (permissions == null) + permissions = LuckPermsPermissions.create(getServer(), "dynmap"); if (permissions == null) permissions = BukkitPermissions.create("dynmap", perdefs); if (permissions == null) diff --git a/src/main/java/org/dynmap/bukkit/permissions/LuckPermsPermissions.java b/src/main/java/org/dynmap/bukkit/permissions/LuckPermsPermissions.java new file mode 100644 index 00000000..384d33e0 --- /dev/null +++ b/src/main/java/org/dynmap/bukkit/permissions/LuckPermsPermissions.java @@ -0,0 +1,96 @@ +package org.dynmap.bukkit.permissions; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + + +import me.lucko.luckperms.api.LuckPermsApi; +import me.lucko.luckperms.api.User; +import me.lucko.luckperms.api.caching.PermissionData; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.dynmap.Log; + +public class LuckPermsPermissions implements PermissionProvider { + String name; + LuckPermsApi luckPerms; + + public static LuckPermsPermissions create(Server server, String name) { + if (!server.getPluginManager().isPluginEnabled("LuckPerms")) + return null; + LuckPermsApi luckPerms = server.getServicesManager().load(LuckPermsApi.class); + if(luckPerms == null) + return null; + Log.info("Using LuckPerms " + luckPerms.getPlatformInfo().getVersion() + " for access control"); + return new LuckPermsPermissions(name, luckPerms); + } + + public LuckPermsPermissions(String name, LuckPermsApi luckPerms) { + this.name = name; + this.luckPerms = luckPerms; + } + + @Override + public boolean has(CommandSender sender, String permission) { + return sender.hasPermission(name + "." + permission); + } + + @Override + public Set hasOfflinePermissions(String player, Set perms) { + Set result = new HashSet<>(); + PermissionData user = getUser(player); + if(user != null) { + for (String p : perms) { + if(user.getPermissionValue(name + "." + p).asBoolean()) + result.add(p); + } + } + return result; + } + + @Override + public boolean hasOfflinePermission(String player, String perm) { + PermissionData user = getUser(player); + if (user == null) + return false; + return user.getPermissionValue(name + "." + perm).asBoolean(); + } + + private PermissionData getUser(String username) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(username); + UUID uuid; + + if(offlinePlayer != null && offlinePlayer.getUniqueId() != null) + uuid = offlinePlayer.getUniqueId(); + else + uuid = joinFuture(luckPerms.getStorage().getUUID(username)); + + if(uuid == null) + return null; + + User user = luckPerms.getUser(uuid); + if(user == null) { + joinFuture(luckPerms.getStorage().loadUser(uuid)); + user = luckPerms.getUser(uuid); + } + + if(user == null) + return null; + + return user.getCachedData().getPermissionData(luckPerms.getContextManager().getStaticContexts()); + } + + private static T joinFuture(Future future) { + try { + return future.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3cfc9d0c..c75230e2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ main: org.dynmap.bukkit.DynmapPlugin version: "${project.version}-${BUILD_NUMBER}" authors: [mikeprimm] website: "http://www.minecraftforum.net/topic/1543523-dynmap-dynamic-web-based-maps-for-minecraft/" -softdepend: [ Permissions, PermissionEx, bPermissions, PermissionsBukkit, GroupManager ] +softdepend: [ Permissions, PermissionEx, bPermissions, PermissionsBukkit, GroupManager, LuckPerms ] commands: dynmap: description: Controls Dynmap.