LuckPerms

LuckPerms

41.4k Downloads

hasPermission() returns UNDEFINED on BungeeCord while getPermissions() lists it

XLordalX opened this issue ยท 5 comments

commented

Permission check returns UNDEFINED on BungeeCord even though the permission is present.

Node node = api.buildNode("shadee.maintenance.bypass").build();

System.out.println(node);
System.out.println(user.hasPermission(node));
System.out.println(user.hasTransientPermission(node));
System.out.println(user.getPermissions());

if(maintenance.isEnabled() && !user.hasPermission(node).asBoolean())
{
    event.setCancelReason(new TextComponent("We're currently undergoing maintenance. Please reconnect later."));
    event.setCancelled(true);
}

Console output:

08:27:35 [INFO] ImmutableNode(permission=shadee.maintenance.bypass, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={}))
08:27:35 [INFO] UNDEFINED
08:27:35 [INFO] UNDEFINED
08:27:35 [INFO] [ImmutableLocalizedNode(node=ImmutableNode(permission=essentials.repair, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={})), location=e6961694-053c-4ce2-9b8e-c50c966955f1), ImmutableLocalizedNode(node=ImmutableNode(permission=group.owner, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={})), location=e6961694-053c-4ce2-9b8e-c50c966955f1), ImmutableLocalizedNode(node=ImmutableNode(permission=shaded.staffchat, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={})), location=e6961694-053c-4ce2-9b8e-c50c966955f1), ImmutableLocalizedNode(node=ImmutableNode(permission=shaded.title.executioner, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={})), location=e6961694-053c-4ce2-9b8e-c50c966955f1), ImmutableLocalizedNode(node=ImmutableNode(permission=shaded.title.slayer, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={})), location=e6961694-053c-4ce2-9b8e-c50c966955f1), ImmutableLocalizedNode(node=ImmutableNode(permission=shadee.maintenance.bypass, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={})), location=e6961694-053c-4ce2-9b8e-c50c966955f1), ImmutableLocalizedNode(node=ImmutableNode(permission=shadee.staffchat, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={})), location=e6961694-053c-4ce2-9b8e-c50c966955f1)]

lp permission info:

08:25:03 [INFO] [LP] xlordalx's Permissions:  (showing page 1 of 1 - 6 entries)
08:25:03 [INFO] > essentials.repair (true)
08:25:03 [INFO] > shaded.staffchat (true)
08:25:03 [INFO] > shaded.title.executioner (true)
08:25:03 [INFO] > shaded.title.slayer (true)
08:25:03 [INFO] > shadee.maintenance.bypass (true)
08:25:03 [INFO] > shadee.staffchat (true)
08:25:03 [INFO] 
08:25:03 [INFO] [LP] xlordalx's Temporary Permissions:
08:25:03 [INFO] None

Config: https://hastebin.com/ireberuhaj.coffeescript

commented

Which version of LP are you using?

commented

I'm using ver 4.0.8.

commented

I can't reproduce.

var player = c.sender();

var LuckPerms = Java.type("me.lucko.luckperms.LuckPerms");
var lp = LuckPerms.getApi();

var user = lp.getUser(player.getUniqueId());
var perms = user.getPermissions();
var node = lp.buildNode("special.test.permission").build();

logger.info("perms: " + perms.toString());
logger.info("node: " + node.toString())
logger.info("check: " + user.hasPermission(node))
[17:01:04 INFO]: Luck issued server command: /lptest
[17:01:04 INFO]: [helper-js] [lptest] perms: [ImmutableLocalizedNode(node=ImmutableNode(permission=group.default, value=true, override=false, server=Optional.empty, world=Optional.empty, expireA
t=0, contexts=ImmutableContextSet(contexts={})), location=c1d60c50-70b5-4722-8057-87767557e50d)]
[17:01:04 INFO]: [helper-js] [lptest] node: ImmutableNode(permission=special.test.permission, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=Immuta
bleContextSet(contexts={}))
[17:01:04 INFO]: [helper-js] [lptest] check: UNDEFINED
> lp user Luck p set special.test.permission
[17:01:37 INFO]: [LP] Set special.test.permission to true for luck in context global.
[17:01:40 INFO]: Luck issued server command: /lptest
[17:01:40 INFO]: [helper-js] [lptest] perms: [ImmutableLocalizedNode(node=ImmutableNode(permission=group.default, value=true, override=false, server=Optional.empty, world=Optional.empty, expireA
t=0, contexts=ImmutableContextSet(contexts={})), location=c1d60c50-70b5-4722-8057-87767557e50d), ImmutableLocalizedNode(node=ImmutableNode(permission=special.test.permission, value=true, overrid
e=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=ImmutableContextSet(contexts={})), location=c1d60c50-70b5-4722-8057-87767557e50d)]
[17:01:40 INFO]: [helper-js] [lptest] node: ImmutableNode(permission=special.test.permission, value=true, override=false, server=Optional.empty, world=Optional.empty, expireAt=0, contexts=Immuta
bleContextSet(contexts={}))
[17:01:40 INFO]: [helper-js] [lptest] check: TRUE
commented

Seems to be an issue related to immediately calling hasPermission() after load. I expected the User object to be fully inflated once it's available (does not return null) using api.getUser(). I don't know if this is intended, or I might be misusing the API.

After delaying the permission check by a few ms, it starts to work. Here's the full context:
https://hastebin.com/xiqarefita.cs

commented

Yeah, the issue is, LuckPerms also loads it's data on the BungeeCord LoginEvent.

However, due to the design of BungeeCord, event priorities do not apply to async events. Everything is called at the same time, and plugins run their own tasks within the scheduler, before completing their intent. (as I'm sure you're aware)

The issue with this is that it can cause race conditions if you try to query LP data during the LoginEvent.

You can use the LuckPerms UserLoginProcessEvent to get around this.

It's a bit trickier if you still need to access the LoginEvent instance, but it's still do-able.

I appreciate it's not super straight forward - here's an example you can refer to.
https://gist.github.com/lucko/44b61e46cbc192e346aef118061c1350

However, this is not a LP bug or issue. The LoginEvent is the first chance I have to load the users data - I can't retrieve it before then. And, the issue with async events is (in my opinion) a flaw in BungeeCord.