add fabric-permissions & luckperms provider

This commit is contained in:
PssbleTrngle 2022-06-21 11:44:17 +02:00
parent 5818919607
commit 53f048ac86
4 changed files with 170 additions and 3 deletions

View File

@ -18,6 +18,11 @@ configurations {
implementation.extendsFrom(shadow)
}
repositories {
mavenCentral()
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}
dependencies {
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
@ -27,6 +32,9 @@ dependencies {
compileOnly group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
shadow project(path: ':DynmapCore', configuration: 'shadow')
modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT"
compileOnly 'net.luckperms:api:5.4'
}
processResources {

View File

@ -396,9 +396,19 @@ public class DynmapPlugin {
registerPlayerLoginListener();
/* Initialize permissions handler */
permissions = FilePermissions.create();
if (permissions == null) {
permissions = new OpPermissions(new String[]{"webchat", "marker.icons", "marker.list", "webregister", "stats", "hide.self", "show.self"});
if (FabricLoader.getInstance().isModLoaded("luckperms")) {
Log.info("Using luckperms for access control");
permissions = new LuckPermissions();
}
else if (FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0")) {
Log.info("Using fabric-permissions-api for access control");
permissions = new FabricPermissions();
} else {
/* Initialize permissions handler */
permissions = FilePermissions.create();
if (permissions == null) {
permissions = new OpPermissions(new String[]{"webchat", "marker.icons", "marker.list", "webregister", "stats", "hide.self", "show.self"});
}
}
/* Get and initialize data folder */
File dataDirectory = new File("dynmap");

View File

@ -0,0 +1,47 @@
package org.dynmap.fabric_1_18_2.permissions;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.Log;
import org.dynmap.fabric_1_18_2.DynmapPlugin;
import org.dynmap.json.simple.parser.JSONParser;
import java.util.Set;
import java.util.stream.Collectors;
public class FabricPermissions implements PermissionProvider {
private String permissionKey(String perm) {
return "dynmap." + perm;
}
@Override
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
return perms.stream()
.filter(perm -> hasOfflinePermission(player, perm))
.collect(Collectors.toSet());
}
@Override
public boolean hasOfflinePermission(String player, String perm) {
return DynmapPlugin.plugin.isOp(player.toLowerCase());
}
@Override
public boolean has(PlayerEntity player, String permission) {
if (player == null) return false;
String name = player.getName().getString().toLowerCase();
if (DynmapPlugin.plugin.isOp(name)) return true;
return Permissions.check(player, permissionKey(permission));
}
@Override
public boolean hasPermissionNode(PlayerEntity player, String permission) {
if (player != null) {
String name = player.getName().getString().toLowerCase();
return DynmapPlugin.plugin.isOp(name);
}
return false;
}
}

View File

@ -0,0 +1,102 @@
package org.dynmap.fabric_1_18_2.permissions;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import net.luckperms.api.cacheddata.CachedPermissionData;
import net.luckperms.api.model.user.User;
import net.luckperms.api.util.Tristate;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import org.dynmap.Log;
import org.dynmap.fabric_1_18_2.DynmapPlugin;
import org.dynmap.json.simple.JSONArray;
import org.dynmap.json.simple.JSONObject;
import org.dynmap.json.simple.parser.JSONParser;
import org.dynmap.json.simple.parser.ParseException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
public class LuckPermissions implements PermissionProvider {
private final JSONParser parser = new JSONParser();
private LuckPerms api = null;
private Optional<LuckPerms> getApi() {
if (api != null) return Optional.of(api);
try {
api = LuckPermsProvider.get();
return Optional.of(api);
} catch (Exception ex) {
Log.warning("Trying to access LuckPerms before it has loaded");
return Optional.empty();
}
}
private Optional<UUID> cachedUUID(String username) {
try {
BufferedReader reader = new BufferedReader(new FileReader(MinecraftServer.USER_CACHE_FILE));
JSONArray cache = (JSONArray) parser.parse(reader);
for (Object it : cache) {
JSONObject user = (JSONObject) it;
if (user.get("name").toString().equalsIgnoreCase(username)) {
String uuid = user.get("uuid").toString();
return Optional.of(UUID.fromString(uuid));
}
}
reader.close();
} catch (IOException | ParseException ex) {
Log.warning("Unable to read usercache.json");
}
return Optional.empty();
}
private String permissionKey(String perm) {
return "dynmap." + perm;
}
@Override
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
return perms.stream()
.filter(perm -> hasOfflinePermission(player, perm))
.collect(Collectors.toSet());
}
@Override
public boolean hasOfflinePermission(String player, String perm) {
if (DynmapPlugin.plugin.isOp(player.toLowerCase())) return true;
Optional<LuckPerms> api = getApi();
Optional<UUID> uuid = cachedUUID(player);
if (!uuid.isPresent() || !api.isPresent()) return false;
User user = api.get().getUserManager().loadUser(uuid.get()).join();
CachedPermissionData permissions = user.getCachedData().getPermissionData();
Tristate state = permissions.checkPermission(permissionKey(perm));
return state.asBoolean();
}
@Override
public boolean has(PlayerEntity player, String permission) {
if (player == null) return false;
String name = player.getName().getString().toLowerCase();
if (DynmapPlugin.plugin.isOp(name)) return true;
return Permissions.check(player, permissionKey(permission));
}
@Override
public boolean hasPermissionNode(PlayerEntity player, String permission) {
if (player != null) {
String name = player.getName().getString().toLowerCase();
return DynmapPlugin.plugin.isOp(name);
}
return false;
}
}