Ability to list all effective permissions for a specific player or group
This commit is contained in:
parent
85964ed624
commit
133b9917b4
@ -1,6 +1,7 @@
|
||||
package fr.pandacube.lib.core.permissions;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@ -76,6 +77,19 @@ public abstract class PermEntity {
|
||||
}
|
||||
|
||||
|
||||
public Map<String, Boolean> listEffectivePermissions() {
|
||||
return Permissions.resolver.getEffectivePermissionList(name, type, null, null);
|
||||
}
|
||||
|
||||
public Map<String, Boolean> listEffectivePermissions(String server) {
|
||||
return Permissions.resolver.getEffectivePermissionList(name, type, server, null);
|
||||
}
|
||||
|
||||
public Map<String, Boolean> listEffectivePermissions(String server, String world) {
|
||||
return Permissions.resolver.getEffectivePermissionList(name, type, server, world);
|
||||
}
|
||||
|
||||
|
||||
public Boolean hasPermission(String permission) {
|
||||
return Permissions.resolver.getEffectivePermission(name, type, permission, null, null);
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ import fr.pandacube.lib.core.util.Log;
|
||||
playerSelfPerms = playerRawData.get("permissions").stream()
|
||||
.peek(e -> {
|
||||
String value = e.get(SQLPermissions.value);
|
||||
fullPermissionsList.add(value.substring(value.startsWith("-") ? 1 : 0));
|
||||
fullPermissionsList.add(value.substring(value.startsWith("-") ? 1 : 0).toLowerCase());
|
||||
})
|
||||
.collect(Collectors.groupingBy(e -> new ServerWorldKey(e.get(SQLPermissions.server), e.get(SQLPermissions.world)),
|
||||
LinkedHashMap::new,
|
||||
|
@ -2,7 +2,9 @@ package fr.pandacube.lib.core.permissions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
@ -39,6 +41,9 @@ public class PermissionsResolver {
|
||||
synchronized (effectivePermissionsCache) {
|
||||
effectivePermissionsCache.asMap().keySet().removeIf(k -> k.type == EntityType.User && playerId.equals(k.name));
|
||||
}
|
||||
synchronized (effectivePermissionsListCache) {
|
||||
effectivePermissionsListCache.asMap().keySet().removeIf(k -> k.type == EntityType.User && playerId.equals(k.name));
|
||||
}
|
||||
synchronized (effectiveDataCache) {
|
||||
effectiveDataCache.asMap().keySet().removeIf(k -> k.type == EntityType.User && playerId.equals(k.name));
|
||||
}
|
||||
@ -46,6 +51,7 @@ public class PermissionsResolver {
|
||||
|
||||
/* package */ void clearCache() {
|
||||
effectivePermissionsCache.invalidateAll();
|
||||
effectivePermissionsListCache.invalidateAll();
|
||||
effectiveDataCache.invalidateAll();
|
||||
}
|
||||
|
||||
@ -70,7 +76,7 @@ public class PermissionsResolver {
|
||||
}
|
||||
|
||||
private Cache<DataCacheKey, String> effectiveDataCache = CacheBuilder.newBuilder()
|
||||
.expireAfterWrite(5, TimeUnit.MINUTES)
|
||||
.expireAfterAccess(10, TimeUnit.MINUTES)
|
||||
.build();
|
||||
|
||||
private String getEffectiveData(String name, EntityType type, DataType dataType) {
|
||||
@ -221,8 +227,47 @@ public class PermissionsResolver {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private Cache<PermCacheKey, Map<String, Boolean>> effectivePermissionsListCache = CacheBuilder.newBuilder()
|
||||
.expireAfterAccess(10, TimeUnit.MINUTES)
|
||||
.build();
|
||||
|
||||
/* package */ Map<String, Boolean> getEffectivePermissionList(String name, EntityType type, String server, String world) {
|
||||
Preconditions.checkNotNull(name, "name can’t be null");
|
||||
Preconditions.checkNotNull(type, "type can’t be null");
|
||||
Preconditions.checkArgument(world == null || server != null, "world not null but server is null");
|
||||
|
||||
String fServer = server == null ? null : server.toLowerCase();
|
||||
String fWorld = world == null ? null : world.toLowerCase();
|
||||
|
||||
try {
|
||||
return effectivePermissionsListCache.get(new PermCacheKey(name, type, null, fServer, fWorld), () -> {
|
||||
Map<String, Boolean> permList = new LinkedHashMap<>();
|
||||
|
||||
for (String perm : backendReader.getFullPermissionsList()) {
|
||||
Boolean has = getEffectivePermission(name, type, perm, fServer, fWorld);
|
||||
if (has == null)
|
||||
continue;
|
||||
permList.put(perm.toLowerCase(), has);
|
||||
}
|
||||
|
||||
return permList;
|
||||
});
|
||||
} catch (ExecutionException e) {
|
||||
Log.severe(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private Cache<PermCacheKey, PermState> effectivePermissionsCache = CacheBuilder.newBuilder()
|
||||
.expireAfterWrite(5, TimeUnit.MINUTES)
|
||||
.expireAfterAccess(10, TimeUnit.MINUTES)
|
||||
.build();
|
||||
|
||||
/* package */ Boolean getEffectivePermission(String name, EntityType type, String permission, String server, String world) {
|
||||
|
@ -20,11 +20,12 @@ public class ServerWorldKey implements Comparable<ServerWorldKey> {
|
||||
public int hashCode() {
|
||||
return Objects.hash(world, server);
|
||||
}
|
||||
|
||||
private static final Comparator<String> STR_NULL_FIRST_COMPARATOR = Comparator.nullsFirst(String::compareToIgnoreCase);
|
||||
@Override
|
||||
public int compareTo(ServerWorldKey o) {
|
||||
Comparator<String> compStrNullFirst = Comparator.nullsFirst(String::compareToIgnoreCase);
|
||||
return Comparator.comparing((ServerWorldKey k) -> k.server, compStrNullFirst)
|
||||
.thenComparing(k -> k.world, compStrNullFirst)
|
||||
return Comparator.comparing((ServerWorldKey k) -> k.server, STR_NULL_FIRST_COMPARATOR)
|
||||
.thenComparing(k -> k.world, STR_NULL_FIRST_COMPARATOR)
|
||||
.compare(this, o);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user