From 23e1bd2c59f7fe129015e623cce20b209d33261c Mon Sep 17 00:00:00 2001 From: Zach Levis Date: Sun, 26 Jan 2020 20:42:05 -0800 Subject: [PATCH] spigot: Add Vault permissions provider This allows performing permissions checks using any plugin that implements the Vault interfaces without having to provide direct support, including for offline players. --- spigot/build.gradle | 7 ++ .../java/org/dynmap/bukkit/DynmapPlugin.java | 4 + .../bukkit/permissions/VaultPermissions.java | 90 +++++++++++++++++++ spigot/src/main/resources/plugin.yml | 2 +- 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 spigot/src/main/java/org/dynmap/bukkit/permissions/VaultPermissions.java diff --git a/spigot/build.gradle b/spigot/build.gradle index aaebdcab..33c63e82 100644 --- a/spigot/build.gradle +++ b/spigot/build.gradle @@ -1,11 +1,18 @@ description = 'dynmap' +repositories { + maven { + url 'https://jitpack.io' + } +} + dependencies { compile group: 'org.bukkit', name: 'bukkit', version:'1.7.10-R0.1-SNAPSHOT' compile 'com.nijikokun.bukkit:Permissions:3.1.6' compile 'me.lucko.luckperms:luckperms-api:4.3' compile 'net.luckperms:api:5.0' + compile('com.github.MilkBowl:VaultAPI:1.7') { transitive = false } compile project(":dynmap-api") compile project(path: ":DynmapCore", configuration: "shadow") compile group: 'ru.tehkode', name: 'PermissionsEx', version:'1.19.1' diff --git a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java index 20b0bdae..03e652c4 100644 --- a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java +++ b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -89,6 +89,7 @@ import org.dynmap.bukkit.permissions.PEXPermissions; import org.dynmap.bukkit.permissions.PermBukkitPermissions; import org.dynmap.bukkit.permissions.GroupManagerPermissions; import org.dynmap.bukkit.permissions.PermissionProvider; +import org.dynmap.bukkit.permissions.VaultPermissions; import org.dynmap.bukkit.permissions.bPermPermissions; import org.dynmap.bukkit.permissions.LuckPermsPermissions; import org.dynmap.bukkit.permissions.LuckPerms5Permissions; @@ -854,6 +855,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { perdefs.put(p.getName(), p.getDefault() == PermissionDefault.TRUE); } + permissions = PEXPermissions.create(getServer(), "dynmap"); if (permissions == null) permissions = bPermPermissions.create(getServer(), "dynmap", perdefs); @@ -867,6 +869,8 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { permissions = LuckPermsPermissions.create(getServer(), "dynmap"); if (permissions == null) permissions = LuckPerms5Permissions.create(getServer(), "dynmap"); + if (permissions == null) + permissions = VaultPermissions.create(this, "dynmap"); if (permissions == null) permissions = BukkitPermissions.create("dynmap", perdefs); if (permissions == null) diff --git a/spigot/src/main/java/org/dynmap/bukkit/permissions/VaultPermissions.java b/spigot/src/main/java/org/dynmap/bukkit/permissions/VaultPermissions.java new file mode 100644 index 00000000..9f517dfc --- /dev/null +++ b/spigot/src/main/java/org/dynmap/bukkit/permissions/VaultPermissions.java @@ -0,0 +1,90 @@ +package org.dynmap.bukkit.permissions; + +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.server.ServiceRegisterEvent; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.dynmap.Log; +import org.dynmap.bukkit.DynmapPlugin; + +import java.util.HashSet; +import java.util.Set; + +public class VaultPermissions implements PermissionProvider, Listener { + private RegisteredServiceProvider permissionProvider; + private final String prefix; + + public static VaultPermissions create(DynmapPlugin plugin, String name) { + try { + Class.forName("net.milkbowl.vault.permission.Permission"); + } catch (ClassNotFoundException cnfx) { + return null; + } + + RegisteredServiceProvider provider = plugin.getServer().getServicesManager().getRegistration(Permission.class); + if (provider == null || provider.getProvider() == null) + return null; + + Log.info("Using Vault provider " + provider.getProvider().getName() + " for access control"); + VaultPermissions ret = new VaultPermissions(name, provider); + plugin.getServer().getPluginManager().registerEvents(ret, plugin); + return ret; + } + + private VaultPermissions(String prefix, RegisteredServiceProvider initialProvider) { + this.prefix = prefix; + this.permissionProvider = initialProvider; + } + + /** + * Update the used permission provider if a new one becomes available + * + * @param event The event with new service registration details + */ + @SuppressWarnings("unchecked") + @EventHandler + public void onServiceRegister(ServiceRegisterEvent event) { + if (event.getProvider().getService().equals(Permission.class)) { + RegisteredServiceProvider newProvider = (RegisteredServiceProvider) event.getProvider().getProvider(); + if (newProvider != this.permissionProvider && newProvider.getPriority().compareTo(this.permissionProvider.getPriority()) >= 0) { + this.permissionProvider = newProvider; + Log.info("Using Vault provider " + this.permissionProvider.getProvider().getName() + " for access control"); + } + } + } + + @Override + public boolean has(CommandSender sender, String permission) { + return permissionProvider.getProvider().has(sender, processPermission(permission)); + } + + @Override + public Set hasOfflinePermissions(String playerName, Set perms) { + final Permission vault = this.permissionProvider.getProvider(); + OfflinePlayer player = Bukkit.getOfflinePlayer(playerName); + + Set hasperms = new HashSet<>(); + + for (String perm : perms) { + if (vault.playerHas(null, player, processPermission(perm))) { + hasperms.add(perm); + } + } + + return hasperms; + } + + @Override + public boolean hasOfflinePermission(String playerName, String perm) { + OfflinePlayer player = Bukkit.getOfflinePlayer(playerName); + return permissionProvider.getProvider().playerHas(null, player, processPermission(perm)); + } + + private String processPermission(String perm) { + return prefix + "." + perm; + } +} diff --git a/spigot/src/main/resources/plugin.yml b/spigot/src/main/resources/plugin.yml index a1ef6a25..ba03afb2 100644 --- a/spigot/src/main/resources/plugin.yml +++ b/spigot/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ main: org.dynmap.bukkit.DynmapPlugin version: "${version}-${buildnumber}" authors: [mikeprimm] website: "https://forums.dynmap.us" -softdepend: [ Permissions, PermissionEx, bPermissions, PermissionsBukkit, GroupManager, LuckPerms ] +softdepend: [ Permissions, PermissionEx, bPermissions, PermissionsBukkit, GroupManager, LuckPerms, Vault ] commands: dynmap: description: Controls Dynmap.