mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2026-01-30 23:40:15 +00:00
Several command permission fixes
- Attach permission checks to the first argument (so the literal command name) rather than the last argument. This fixes commands showing up when they shouldn't. - HelpingArgumentBuilder now inherits permissions of its leaf nodes. This only really impacts the "track" subcommand. - Don't autocomplete the computer selector for the "queue" subcommand. As everyone has permission for this command, it's possible to find all computer ids and labels in the world. I'm in mixed minds about this, but don't think this is an exploit - computer ids/labels are sent to in-range players so shouldn't be considered secret - but worth patching none-the-less.
This commit is contained in:
@@ -61,12 +61,36 @@ public enum UserLevel implements Predicate<CommandSource>
|
||||
return source.hasPermission( toLevel() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Take the union of two {@link UserLevel}s.
|
||||
* <p>
|
||||
* This satisfies the property that for all sources {@code s}, {@code a.test(s) || b.test(s) == (a ∪ b).test(s)}.
|
||||
*
|
||||
* @param left The first user level to take the union of.
|
||||
* @param right The second user level to take the union of.
|
||||
* @return The union of two levels.
|
||||
*/
|
||||
public static UserLevel union( UserLevel left, UserLevel right )
|
||||
{
|
||||
if( left == right ) return left;
|
||||
|
||||
// x ∪ ANYONE = ANYONE
|
||||
if( left == ANYONE || right == ANYONE ) return ANYONE;
|
||||
|
||||
// x ∪ OWNER = OWNER
|
||||
if( left == OWNER ) return right;
|
||||
if( right == OWNER ) return left;
|
||||
|
||||
// At this point, we have x != y and x, y ∈ { OP, OWNER_OP }.
|
||||
return OWNER_OP;
|
||||
}
|
||||
|
||||
private static boolean isOwner( CommandSource source )
|
||||
{
|
||||
MinecraftServer server = source.getServer();
|
||||
Entity sender = source.getEntity();
|
||||
return server.isDedicatedServer()
|
||||
? source.getEntity() == null && source.hasPermission( 4 ) && source.getTextName().equals( "Server" )
|
||||
: sender instanceof PlayerEntity && ((PlayerEntity) sender).getGameProfile().getName().equalsIgnoreCase( server.getServerModName() );
|
||||
: sender instanceof PlayerEntity && server.isSingleplayerOwner( ((PlayerEntity) sender).getGameProfile() );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user