Je crois avoir trouvé. Malheureusement, si je m'aventure dans une refonte de la configuration elle ne sera plus compatible à la prochaine mise à jour (si l'auteur la change), et même, ça risque de complétement niquer le système de config si je fais une couille.
Le problème se trouve, à mon avis, dans com.nijiko.permissions.Control.java
package com.nijiko.permissions;
import com.nijiko.Messaging;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.bukkit.entity.Player;
import org.bukkit.util.config.Configuration;
public class Control extends PermissionHandler
{
private Map<String, Set<String>> UserPermissions;
private Map<String, String> UserGroups;
private Map<String, Set<String>> Groups;
private Map<String, Object[]> GroupsData;
private Map<String, Set<String>> GroupsInheritance;
private Map<String, Boolean> Cached;
private String base = "";
private Configuration config;
public Control(Configuration config)
{
this.config = config;
}
public void load()
{
this.UserPermissions = new HashMap();
this.UserGroups = new HashMap();
this.Groups = new HashMap();
this.GroupsData = new HashMap();
this.GroupsInheritance = new HashMap();
this.Cached = new HashMap();
List userKeys = this.config.getKeys("users");
List groupKeys = this.config.getKeys("groups");
Set Permissions = new HashSet();
Set Inheritance = new HashSet();
if (groupKeys != null) {
for (String key : groupKeys) {
Inheritance = new HashSet();
Permissions = new HashSet();
List inheritance = this.config.getStringList("groups." + key + ".inheritance", null);
List permissions = this.config.getStringList("groups." + key + ".permissions", null);
boolean Default = this.config.getBoolean("groups." + key + ".default", false);
String prefix = this.config.getString("groups." + key + ".info.prefix", null);
String suffix = this.config.getString("groups." + key + ".info.suffix", null);
boolean build = this.config.getBoolean("groups." + key + ".info.build", false);
if ((Default) && (this.base == null ? "" == null : this.base.equals(""))) {
this.base = key.toLowerCase();
}
if (inheritance.size() > 0) {
Inheritance.addAll(inheritance);
}
if (permissions.size() > 0) {
Permissions.addAll(permissions);
}
this.Groups.put(key.toLowerCase(), Permissions);
this.GroupsData.put(key.toLowerCase(), new Object[] { key, prefix, suffix, Boolean.valueOf(build) });
if (Inheritance.size() > 0) {
this.GroupsInheritance.put(key.toLowerCase(), Inheritance);
}
}
}
if (userKeys != null)
for (String key : userKeys) {
Permissions = new HashSet();
List permissions = this.config.getStringList("users." + key + ".permissions", null);
String group = this.config.getString("users." + key + ".group");
if (group != null) {
if (!group.isEmpty())
this.UserGroups.put(key.toLowerCase(), group);
}
else {
this.UserGroups.put(key.toLowerCase(), this.base);
}
if (permissions.size() > 0) {
Permissions.addAll(permissions);
}
this.UserPermissions.put(key.toLowerCase(), Permissions);
}
}
private String toArrayListString(Collection variable)
{
return new ArrayList(variable).toString();
}
public boolean has(Player player, String permission)
{
return permission(player, permission);
}
public boolean permission(Player player, String permission)
{
Set Permissions = new HashSet();
Set GroupPermissions = new HashSet();
Set GroupInheritedPermissions = new HashSet();
String group = "";
String name = player.getName().toLowerCase();
if (this.Cached.containsKey(name + "," + permission)) {
return ((Boolean)this.Cached.get(name + "," + permission)).booleanValue();
}
if (this.UserPermissions.containsKey(name)) {
Permissions = (Set)this.UserPermissions.get(name);
group = ((String)this.UserGroups.get(name)).toLowerCase();
if ((!this.Groups.isEmpty()) || (this.Groups != null)) {
if (this.Groups.containsKey(group)) {
GroupPermissions = (Set)this.Groups.get(group);
}
if (this.GroupsInheritance.containsKey(group))
GroupInheritedPermissions = getInheritancePermissions(group);
}
else {
this.Cached.put(name + "," + permission, Boolean.valueOf(false));
return false;
}
} else {
if (this.base == null ? "" == null : this.base.equals("")) {
this.Cached.put(name + "," + permission, Boolean.valueOf(false));
return false;
}
group = this.base.toLowerCase();
if ((!this.Groups.isEmpty()) || (this.Groups != null)) {
if (this.Groups.containsKey(group)) {
GroupPermissions = (Set)this.Groups.get(group);
}
if (this.GroupsInheritance.containsKey(group))
GroupInheritedPermissions = getInheritancePermissions(group);
}
else {
this.Cached.put(name + "," + permission, Boolean.valueOf(false));
return false;
}
}
StringTokenizer globalized = new StringTokenizer(permission, ".");
if (GroupInheritedPermissions.size() > 0) {
GroupPermissions.addAll(GroupInheritedPermissions);
}
if ((Permissions == null) || (GroupPermissions == null)) {
this.Cached.put(name + "," + permission, Boolean.valueOf(false));
return false;
}
if ((GroupPermissions.contains("*")) || (Permissions.contains("*"))) {
this.Cached.put(name + "," + permission, Boolean.valueOf(true));
return true;
}
if ((GroupPermissions.contains(permission)) || (Permissions.contains(permission))) {
this.Cached.put(name + "," + permission, Boolean.valueOf(true));
return true;
}
if (permission.contains(".")) {
String setting = "";
String node = "";
while (globalized.hasMoreElements()) {
setting = setting + globalized.nextToken() + ".";
node = setting + "*";
if ((GroupPermissions.contains(node)) || (Permissions.contains(node))) {
this.Cached.put(name + "," + permission, Boolean.valueOf(true));
return true;
}
}
}
this.Cached.put(name + "," + permission, Boolean.valueOf(false));
return false;
}
private Set<String> getInheritance(String group) {
if (this.GroupsInheritance.containsKey(group)) {
if (this.GroupsInheritance.size() > 0) {
return (Set)this.GroupsInheritance.get(group);
}
return new HashSet();
}
return new HashSet();
}
private Object[] getInheritancePermissions(Set<String> Permissions, Set<String> Inheritance, Set<String> Checked, String group) {
group = group.toLowerCase();
if (Inheritance.size() > 0) {
for (String inherited : Inheritance) {
inherited = inherited.toLowerCase();
Set GroupPermissions = (Set)this.Groups.get(inherited.toLowerCase());
Set GottenInheritance = getInheritance(inherited);
if (GroupPermissions == null)
{
continue;
}
if (GroupPermissions.size() > 0) {
Permissions.addAll(GroupPermissions);
}
if (!Checked.contains(inherited)) {
Checked.add(inherited);
Object[] InheritedPermissions = getInheritancePermissions(Permissions, GottenInheritance, Checked, inherited);
if (((Set)InheritedPermissions[0]).size() > 0)
Permissions.addAll((Set)InheritedPermissions[0]);
}
}
}
else {
Set GroupPermissions = (Set)this.Groups.get(group);
if (GroupPermissions.size() > 0) {
Permissions.addAll(GroupPermissions);
}
}
return new Object[] { Permissions, Checked };
}
private Set<String> getInheritancePermissions(String group) {
group = group.toLowerCase();
Set Permissions = new HashSet();
Set Inheritance = getInheritance(group);
Set Checked = new HashSet();
if ((Inheritance.size() > 0) && (!Inheritance.isEmpty())) {
for (String inherited : Inheritance) {
inherited = inherited.toLowerCase();
Set GroupPermissions = (Set)this.Groups.get(inherited);
if (GroupPermissions.size() > 0) {
Permissions.addAll(GroupPermissions);
}
if ((getInheritance(inherited).size() > 0) && (!Checked.contains(inherited))) {
Checked.add(inherited);
Object[] InheritedPermissions = getInheritancePermissions(Permissions, getInheritance(inherited), Checked, inherited);
if (((Set)InheritedPermissions[0]).size() > 0) {
Permissions.addAll((Set)InheritedPermissions[0]);
}
}
}
}
return Permissions;
}
public boolean inGroup(String name, String group) {
name = name.toLowerCase();
group = group.toLowerCase();
if (this.UserPermissions.containsKey(name)) {
String Group = (String)this.UserGroups.get(name);
Set Inherited = getInheritance(Group);
if ((Inherited.contains(group)) || (Group.equalsIgnoreCase(group))) {
return true;
}
}
return false;
}
public String getGroup(String name)
{
name = name.toLowerCase();
if ((this.UserPermissions.containsKey(name)) && (this.UserGroups.containsKey(name))) {
String group = (String)((Object[])(Object[])this.GroupsData.get(((String)this.UserGroups.get(name)).toLowerCase()))[0];
return group == null ? null : group;
}
if (this.base.equals("")) {
return null;
}
String group = (String)((Object[])(Object[])this.GroupsData.get(this.base))[0];
return group == null ? null : group;
}
public String getGroupPrefix(String group)
{
group = group.toLowerCase();
if (this.Groups.containsKey(group)) {
String prefix = (String)((Object[])(Object[])this.GroupsData.get(group))[1];
return prefix == null ? null : Messaging.parse(prefix);
}
return null;
}
public String getGroupSuffix(String group)
{
group = group.toLowerCase();
if (this.Groups.containsKey(group)) {
String suffix = (String)((Object[])(Object[])this.GroupsData.get(group))[2];
return suffix == null ? null : Messaging.parse(suffix);
}
return null;
}
public boolean canGroupBuild(String group)
{
group = group.toLowerCase();
if (this.Groups.containsKey(group)) {
return ((Boolean)((Object[])(Object[])this.GroupsData.get(group))[3]).booleanValue();
}
if (this.base.equals("")) {
return false;
}
return ((Boolean)((Object[])(Object[])this.GroupsData.get(this.base))[3]).booleanValue();
}
public String[] getGroups(String name)
{
String Group = (String)this.UserGroups.get(name.toLowerCase());
Set Inherited = getInheritance(Group.toLowerCase());
Inherited.add(Group.toLowerCase());
return (String[])Inherited.toArray(new String[0]);
}
public String getGroupPermissionString(String group, String permission) {
return this.config.getString("groups." + group + ".permissions." + permission) == null ? "" : this.config.getString("groups." + group + ".permissions." + permission);
}
public int getGroupPermissionInteger(String group, String permission)
{
return this.config.getInt("groups." + group + ".permissions." + permission, -1);
}
public boolean getGroupPermissionBoolean(String group, String permission) {
return this.config.getBoolean("groups." + group + ".permissions." + permission, false);
}
public double getGroupPermissionDouble(String group, String permission) {
return this.config.getDouble("groups." + group + ".permissions." + permission, -1.0D);
}
public String getUserPermissionString(String name, String permission) {
return this.config.getString("users." + name + ".permissions." + permission) == null ? "" : this.config.getString("users." + name + ".permissions." + permission);
}
public int getUserPermissionInteger(String name, String permission)
{
return this.config.getInt("users." + name + ".permissions." + permission, -1);
}
public boolean getUserPermissionBoolean(String name, String permission) {
return this.config.getBoolean("users." + name + ".permissions." + permission, false);
}
public double getUserPermissionDouble(String name, String permission) {
return this.config.getDouble("users." + name + ".permissions." + permission, -1.0D);
}
public String getPermissionString(String name, String permission) {
String group = getGroup(name);
String userPermission = getUserPermissionString(name, permission);
String userGroupPermission = "";
if ((group != null) || (!group.isEmpty())) {
userGroupPermission = getGroupPermissionString(group, permission);
}
if (!userPermission.equalsIgnoreCase("")) {
return userPermission;
}
return userGroupPermission;
}
public boolean getPermissionBoolean(String name, String permission)
{
String group = getGroup(name);
boolean userPermission = getUserPermissionBoolean(name, permission);
boolean userGroupPermission = false;
if ((group != null) || (!group.isEmpty())) {
userGroupPermission = getGroupPermissionBoolean(group, permission);
}
if (userPermission) {
return userPermission;
}
return userGroupPermission;
}
public int getPermissionInteger(String name, String permission) {
String group = getGroup(name);
int userPermission = getUserPermissionInteger(name, permission);
int userGroupPermission = -1;
if ((group != null) || (!group.isEmpty())) {
userGroupPermission = getGroupPermissionInteger(group, permission);
}
if (userPermission != -1) {
return userPermission;
}
return userGroupPermission;
}
public double getPermissionDouble(String name, String permission) {
String group = getGroup(name);
double userPermission = getUserPermissionDouble(name, permission);
double userGroupPermission = -1.0D;
if ((group != null) || (!group.isEmpty())) {
userGroupPermission = getGroupPermissionDouble(group, permission);
}
if (userPermission != -1.0D) {
return userPermission;
}
return userGroupPermission;
}
}
Le problème se situe à ce niveau là (toujours, à mon avis), étant donné qu'il traite ses chaînes de caractères avec comme séparateur un point, ce qui fait que pour chaque opération mon pseudo fait qu'il y a x+1 d'arguments demandés (dont une chaîne de caractères vide) au lieu de x.
StringTokenizer globalized = new StringTokenizer(permission, ".");