Fix permissions not being removed on Sponge

This commit is contained in:
Luck
2016-09-04 17:59:01 +01:00
Unverified
parent ed85eee36c
commit 770b7dc282
10 changed files with 84 additions and 117 deletions
@@ -22,7 +22,6 @@
package me.lucko.luckperms;
import me.lucko.luckperms.api.sponge.LuckPermsSubject;
import me.lucko.luckperms.constants.Message;
import me.lucko.luckperms.users.User;
import me.lucko.luckperms.utils.AbstractListener;
@@ -31,8 +30,6 @@ import org.spongepowered.api.event.network.ClientConnectionEvent;
import org.spongepowered.api.profile.GameProfile;
import org.spongepowered.api.text.serializer.TextSerializers;
import java.util.Iterator;
@SuppressWarnings("WeakerAccess")
public class SpongeListener extends AbstractListener {
private final LPSpongePlugin plugin;
@@ -78,12 +75,5 @@ public class SpongeListener extends AbstractListener {
@Listener
public void onClientLeave(ClientConnectionEvent.Disconnect e) {
onLeave(e.getTargetEntity().getUniqueId());
Iterator<LuckPermsSubject> iterator = plugin.getService().getUserSubjects().getCache().iterator();
while (iterator.hasNext()) {
LuckPermsSubject subject = iterator.next();
if (subject.getIdentifier().equalsIgnoreCase(e.getTargetEntity().getUniqueId().toString())) {
iterator.remove();
}
}
}
}
@@ -52,13 +52,17 @@ import static me.lucko.luckperms.utils.ArgumentChecker.unescapeCharacters;
@EqualsAndHashCode(of = {"holder"})
public class LuckPermsSubject implements Subject {
public static Subject wrapHolder(PermissionHolder holder, LuckPermsService service) {
return new LuckPermsSubject(holder, service);
}
@Getter
private final PermissionHolder holder;
private final EnduringData enduringData;
private final TransientData transientData;
private final LuckPermsService service;
public LuckPermsSubject(PermissionHolder holder, LuckPermsService service) {
private LuckPermsSubject(PermissionHolder holder, LuckPermsService service) {
this.holder = holder;
this.enduringData = new EnduringData(this, service, holder);
this.transientData = new TransientData(service, holder);
@@ -77,13 +81,13 @@ public class LuckPermsSubject implements Subject {
@Override
public String getIdentifier() {
return enduringData.getHolder().getObjectName();
return holder.getObjectName();
}
@Override
public Optional<CommandSource> getCommandSource() {
if (enduringData.getHolder() instanceof User) {
final UUID uuid = ((User) enduringData.getHolder()).getUuid();
if (holder instanceof User) {
final UUID uuid = ((User) holder).getUuid();
Optional<Player> p = Sponge.getServer().getPlayer(uuid);
if (p.isPresent()) {
@@ -96,7 +100,7 @@ public class LuckPermsSubject implements Subject {
@Override
public SubjectCollection getContainingCollection() {
if (enduringData.getHolder() instanceof Group) {
if (holder instanceof Group) {
return service.getGroupSubjects();
} else {
return service.getUserSubjects();
@@ -130,18 +134,16 @@ public class LuckPermsSubject implements Subject {
context.put(c.getKey(), c.getValue());
}
me.lucko.luckperms.api.Tristate t = enduringData.getHolder().inheritsPermission(new me.lucko.luckperms.utils.Node.Builder(node).withExtraContext(context).build());
if (t == me.lucko.luckperms.api.Tristate.UNDEFINED) {
return Tristate.UNDEFINED;
switch (holder.inheritsPermission(new me.lucko.luckperms.utils.Node.Builder(node).withExtraContext(context).build())) {
case UNDEFINED:
return Tristate.UNDEFINED;
case TRUE:
return Tristate.TRUE;
case FALSE:
return Tristate.FALSE;
default:
return null;
}
if (t == me.lucko.luckperms.api.Tristate.TRUE) {
return Tristate.TRUE;
}
if (t == me.lucko.luckperms.api.Tristate.FALSE) {
return Tristate.FALSE;
}
return null;
}
@Override
@@ -27,7 +27,6 @@ import lombok.NonNull;
import me.lucko.luckperms.api.sponge.LuckPermsService;
import me.lucko.luckperms.api.sponge.LuckPermsSubject;
import me.lucko.luckperms.api.sponge.simple.SimpleSubject;
import me.lucko.luckperms.core.PermissionHolder;
import me.lucko.luckperms.groups.GroupManager;
import org.spongepowered.api.service.context.Context;
import org.spongepowered.api.service.permission.PermissionService;
@@ -35,17 +34,14 @@ import org.spongepowered.api.service.permission.Subject;
import org.spongepowered.api.service.permission.SubjectCollection;
import org.spongepowered.api.service.permission.SubjectData;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@AllArgsConstructor
public class GroupCollection implements SubjectCollection {
private final LuckPermsService service;
private final GroupManager manager;
private final Set<LuckPermsSubject> cache = ConcurrentHashMap.newKeySet();
@Override
public String getIdentifier() {
@@ -55,16 +51,7 @@ public class GroupCollection implements SubjectCollection {
@Override
public Subject get(@NonNull String id) {
if (manager.isLoaded(id)) {
PermissionHolder holder = manager.get(id);
for (LuckPermsSubject subject : cache) {
if (subject.getHolder().getObjectName().equalsIgnoreCase(holder.getObjectName())) {
return subject;
}
}
LuckPermsSubject subject = new LuckPermsSubject(manager.get(id), service);
cache.add(subject);
return subject;
return LuckPermsSubject.wrapHolder(manager.get(id), service);
}
return new SimpleSubject(id, service, this);
@@ -78,7 +65,7 @@ public class GroupCollection implements SubjectCollection {
@Override
public Iterable<Subject> getAllSubjects() {
return manager.getAll().values().stream()
.map(u -> new LuckPermsSubject(u, service))
.map(u -> LuckPermsSubject.wrapHolder(u, service))
.collect(Collectors.toList());
}
@@ -90,10 +77,9 @@ public class GroupCollection implements SubjectCollection {
@Override
public Map<Subject, Boolean> getAllWithPermission(@NonNull Set<Context> contexts, @NonNull String node) {
return manager.getAll().values().stream()
.map(u -> new LuckPermsSubject(u, service))
.map(u -> LuckPermsSubject.wrapHolder(u, service))
.filter(sub -> sub.hasPermission(contexts, node))
.map(sub -> new AbstractMap.SimpleEntry<Subject, Boolean>(sub, sub.getPermissionValue(contexts, node).asBoolean()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
.collect(Collectors.toMap(sub -> sub, sub -> sub.getPermissionValue(contexts, node).asBoolean()));
}
@Override
@@ -23,7 +23,6 @@
package me.lucko.luckperms.api.sponge.collections;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import me.lucko.luckperms.api.sponge.LuckPermsService;
import me.lucko.luckperms.api.sponge.LuckPermsSubject;
@@ -37,11 +36,9 @@ import org.spongepowered.api.service.permission.Subject;
import org.spongepowered.api.service.permission.SubjectCollection;
import org.spongepowered.api.service.permission.SubjectData;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@AllArgsConstructor
@@ -49,9 +46,6 @@ public class UserCollection implements SubjectCollection {
private final LuckPermsService service;
private final UserManager manager;
@Getter
private final Set<LuckPermsSubject> cache = ConcurrentHashMap.newKeySet();
@Override
public String getIdentifier() {
return PermissionService.SUBJECTS_USER;
@@ -74,15 +68,7 @@ public class UserCollection implements SubjectCollection {
}
if (holder != null) {
for (LuckPermsSubject subject : cache) {
if (subject.getHolder().getObjectName().equalsIgnoreCase(holder.getObjectName())) {
return subject;
}
}
LuckPermsSubject subject = new LuckPermsSubject(holder, service);
cache.add(subject);
return subject;
return LuckPermsSubject.wrapHolder(holder, service);
}
service.getPlugin().getLog().warn("Couldn't get subject for: " + id);
@@ -106,7 +92,7 @@ public class UserCollection implements SubjectCollection {
@Override
public Iterable<Subject> getAllSubjects() {
return manager.getAll().values().stream()
.map(u -> new LuckPermsSubject(u, service))
.map(u -> LuckPermsSubject.wrapHolder(u, service))
.collect(Collectors.toList());
}
@@ -118,10 +104,9 @@ public class UserCollection implements SubjectCollection {
@Override
public Map<Subject, Boolean> getAllWithPermission(@NonNull Set<Context> contexts, @NonNull String node) {
return manager.getAll().values().stream()
.map(u -> new LuckPermsSubject(u, service))
.map(u -> LuckPermsSubject.wrapHolder(u, service))
.filter(sub -> sub.hasPermission(contexts, node))
.map(sub -> new AbstractMap.SimpleEntry<Subject, Boolean>(sub, sub.getPermissionValue(contexts, node).asBoolean()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
.collect(Collectors.toMap(sub -> sub, sub -> sub.getPermissionValue(contexts, node).asBoolean()));
}
@Override
@@ -34,16 +34,9 @@ public class SpongeUserManager extends UserManager {
this.plugin = plugin;
}
@Override
public void unload(User user) {
if (user != null) {
getAll().remove(user.getUuid());
}
}
@Override
public void cleanup(User user) {
if (plugin.getGame().getServer().getPlayer(plugin.getUuidCache().getExternalUUID(user.getUuid())).isPresent()) {
if (!plugin.getGame().getServer().getPlayer(plugin.getUuidCache().getExternalUUID(user.getUuid())).isPresent()) {
unload(user);
}
}