1
0
mirror of https://github.com/essentials/Essentials.git synced 2025-08-05 14:18:21 +02:00

Merge remote branch 'remotes/ess/groupmanager' into essmaster

This commit is contained in:
KHobbits
2011-11-04 11:40:33 +00:00
19 changed files with 3959 additions and 3021 deletions

View File

@@ -54,3 +54,19 @@ v 1.5:
- Better commenting in config.yml - Better commenting in config.yml
- Fixed GM to recognize Superperm child nodes. - Fixed GM to recognize Superperm child nodes.
If you add a node like Towny.admin GM will now correctly report on all child nodes. If you add a node like Towny.admin GM will now correctly report on all child nodes.
- Fixed GM loading world data files twice at startup.
- Improved error reporting for invalid groups.yml
- Added Global Groups
Defined in groupmanager/globalgroups.yml.
Create groups in the yml with a g: prefix, then inherit in the worlds groups files.
- Added Info node support to Global Groups.
- Fixed an error on 'manucheckv'. If the users doesn't have the variable it fell through causing an exception.
- Added checking of subgroups for Info nodes.
- Expanded 'canUserBuild()' to include inheritance and subgroups.
- Added a config.yml setting of 'validate_toggle' for those who prefer 'mantogglevalidate' to always be off.
- Prevent setting 'minutes' in the config to zero causing an error.
- GM will now check to see if it's data files have been changed at each scheduled save.
If the files have been altered (on disc) it will reload, so long as the in-memory data hasn't changed.
If the files on Disc have changed AND there have been changes to it's in-memory data it will show a warning.
You then MUST issue a '/mansave force' to overwrite the disc files, or a '/manload' to overwrite the memory data.
- Fix for an error in checkFullUserPermission caused by players disconnecting mid perms update.

View File

@@ -8,6 +8,10 @@ settings:
# If the player is op any permissions set to Op will follow suit. # If the player is op any permissions set to Op will follow suit.
bukkit_perms_override: false bukkit_perms_override: false
# Default setting for 'mantoglevalidate'
# true will cause GroupManager to attempt name matching by default.
validate_toggle: true
data: data:
save: save:
# How often GroupManager will save it's data back to groups and users.yml # How often GroupManager will save it's data back to groups and users.yml

View File

@@ -0,0 +1,181 @@
groups:
g:bukkit_default:
permissions:
- bukkit.broadcast.user
g:essentials_default:
permissions:
- essentials.help
- essentials.helpop
- essentials.list
- essentials.motd
- essentials.rules
- essentials.spawn
- groupmanager.notify.self
g:essentials_builder:
permissions:
- essentials.afk
- essentials.back
- essentials.back.ondeath
- essentials.balance
- essentials.balance.others
- essentials.balancetop
- essentials.chat.color
- essentials.chat.shout
- essentials.chat.question
- essentials.compass
- essentials.depth
- essentials.home
- essentials.ignore
- essentials.kit
- essentials.kit.tools
- essentials.mail
- essentials.mail.send
- essentials.me
- essentials.msg
- essentials.nick
- essentials.pay
- essentials.ping
- essentials.powertool
- essentials.protect
- essentials.sethome
- essentials.signs.use.*
- essentials.signs.create.disposal
- essentials.signs.create.mail
- essentials.signs.create.protection
- essentials.signs.create.trade
- essentials.signs.break.disposal
- essentials.signs.break.mail
- essentials.signs.break.protection
- essentials.signs.break.trade
- essentials.suicide
- essentials.time
- essentials.tpa
- essentials.tpaccept
- essentials.tpahere
- essentials.tpdeny
- essentials.warp
- essentials.warp.list
- essentials.worth
g:essentials_moderator:
permissions:
- essentials.ban
- essentials.ban.notify
- essentials.banip
- essentials.broadcast
- essentials.clearinventory
- essentials.delwarp
- essentials.eco.loan
- essentials.ext
- essentials.getpos
- essentials.helpop.recieve
- essentials.home.others
- essentials.invsee
- essentials.jails
- essentials.jump
- essentials.kick
- essentials.kick.notify
- essentials.kill
- essentials.mute
- essentials.nick.others
- essentials.realname
- essentials.setwarp
- essentials.signs.create.*
- essentials.signs.break.*
- essentials.spawner
- essentials.thunder
- essentials.time
- essentials.time.set
- essentials.protect.alerts
- essentials.protect.admin
- essentials.protect.ownerinfo
- essentials.ptime
- essentials.ptime.others
- essentials.togglejail
- essentials.top
- essentials.tp
- essentials.tphere
- essentials.tppos
- essentials.tptoggle
- essentials.unban
- essentials.unbanip
- essentials.weather
- essentials.whois
- essentials.world
- groupmanager.listgroups
- groupmanager.mandemote
- groupmanager.manpromote
- groupmanager.manselect
- groupmanager.manuadd
- groupmanager.manudel
- groupmanager.manwhois
- groupmanager.notify.other
g:essentials_admin:
permissions:
- -essentials.backup
- -essentials.essentials
- -essentials.setspawn
- -essentials.reloadall
- -essentials.plugin
- essentials.*
- groupmanager.mantogglevalidate
- groupmanager.mansave
- groupmanager.mangcheckp
- groupmanager.manglistp
- groupmanager.manucheckp
- groupmanager.manulistp
g:bukkit_moderator:
permissions:
- bukkit.command.ban
- bukkit.command.ban.ip
- bukkit.command.ban.player
- bukkit.command.gamemode
- bukkit.command.kick
- bukkit.command.unban
- bukkit.command.unban.ip
- bukkit.command.unban.player
g:bukkit_admin:
permissions:
- bPermissions.admin
- bPermissions.demote.admin
- bPermissions.gui
- bPermissions.iplock.lock
- bPermissions.promote.admin
- bukkit.broadcast
- bukkit.broadcast.admin
- bukkit.command
- bukkit.command.give
- bukkit.command.help
- bukkit.command.kill
- bukkit.command.list
- bukkit.command.me
- bukkit.command.op
- bukkit.command.op.give
- bukkit.command.op.take
- bukkit.command.plugins
- bukkit.command.reload
- bukkit.command.save
- bukkit.command.save.disable
- bukkit.command.save.enable
- bukkit.command.save.perform
- bukkit.command.say
- bukkit.command.stop
- bukkit.command.teleport
- bukkit.command.tell
- bukkit.command.time
- bukkit.command.time.add
- bukkit.command.time.set
- bukkit.command.version
- bukkit.command.whitelist
- bukkit.command.whitelist.add
- bukkit.command.whitelist.disable
- bukkit.command.whitelist.enable
- bukkit.command.whitelist.list
- bukkit.command.whitelist.reload
- bukkit.command.whitelist.remove

View File

@@ -2,147 +2,42 @@ groups:
Default: Default:
default: true default: true
permissions: permissions:
- essentials.help - -bukkit.command.kill
- essentials.helpop inheritance:
- essentials.list - g:essentials_default
- essentials.motd - g:bukkit_default
- essentials.rules
- essentials.spawn
- groupmanager.notify.self
inheritance: []
info: info:
prefix: '&e' prefix: '&e'
build: false build: false
suffix: '' suffix: ''
Builder: Builder:
default: false default: false
permissions: permissions: []
- essentials.afk
- essentials.back
- essentials.back.ondeath
- essentials.balance
- essentials.balance.others
- essentials.balancetop
- essentials.chat.color
- essentials.chat.shout
- essentials.chat.question
- essentials.compass
- essentials.depth
- essentials.home
- essentials.ignore
- essentials.kit
- essentials.kit.tools
- essentials.mail
- essentials.mail.send
- essentials.me
- essentials.msg
- essentials.nick
- essentials.pay
- essentials.ping
- essentials.powertool
- essentials.protect
- essentials.sethome
- essentials.signs.use.*
- essentials.signs.create.disposal
- essentials.signs.create.mail
- essentials.signs.create.protection
- essentials.signs.create.trade
- essentials.signs.break.disposal
- essentials.signs.break.mail
- essentials.signs.break.protection
- essentials.signs.break.trade
- essentials.suicide
- essentials.time
- essentials.tpa
- essentials.tpaccept
- essentials.tpahere
- essentials.tpdeny
- essentials.warp
- essentials.warp.list
- essentials.worth
inheritance: inheritance:
- default - default
- g:essentials_builder
info: info:
prefix: '&2' prefix: '&2'
build: true build: true
suffix: '' suffix: ''
Moderator: Moderator:
default: false default: false
permissions: permissions: []
- essentials.ban
- essentials.ban.notify
- essentials.banip
- essentials.broadcast
- essentials.clearinventory
- essentials.delwarp
- essentials.eco.loan
- essentials.ext
- essentials.getpos
- essentials.helpop.recieve
- essentials.home.others
- essentials.invsee
- essentials.jails
- essentials.jump
- essentials.kick
- essentials.kick.notify
- essentials.kill
- essentials.mute
- essentials.nick.others
- essentials.realname
- essentials.setwarp
- essentials.signs.create.*
- essentials.signs.break.*
- essentials.spawner
- essentials.thunder
- essentials.time
- essentials.time.set
- essentials.protect.alerts
- essentials.protect.admin
- essentials.protect.ownerinfo
- essentials.ptime
- essentials.ptime.others
- essentials.togglejail
- essentials.top
- essentials.tp
- essentials.tphere
- essentials.tppos
- essentials.tptoggle
- essentials.unban
- essentials.unbanip
- essentials.weather
- essentials.whois
- essentials.world
- groupmanager.listgroups
- groupmanager.mandemote
- groupmanager.manpromote
- groupmanager.manselect
- groupmanager.manuadd
- groupmanager.manudel
- groupmanager.manwhois
- groupmanager.notify.other
inheritance: inheritance:
- builder - builder
- g:essentials_moderator
- g:bukkit_moderator
info: info:
prefix: '&5' prefix: '&5'
build: true build: true
suffix: '' suffix: ''
Admin: Admin:
default: false default: false
permissions: permissions: []
- -essentials.backup
- -essentials.essentials
- -essentials.setspawn
- -essentials.reloadall
- -essentials.plugin
- essentials.*
- groupmanager.mantogglevalidate
- groupmanager.mansave
- groupmanager.mangcheckp
- groupmanager.manglistp
- groupmanager.manucheckp
- groupmanager.manulistp
inheritance: inheritance:
- moderator - moderator
- g:essentials_admin
- g:bukkit_admin
info: info:
prefix: '&c' prefix: '&c'
build: true build: true

View File

@@ -48,7 +48,10 @@ public class GMConfiguration {
} catch (Exception ex) { } catch (Exception ex) {
throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex); throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex);
} }
// Setup defaults
adjustLoggerLevel(); adjustLoggerLevel();
plugin.setValidateOnlinePlayer(isToggleValidate());
} }
public boolean isOpOverride() { public boolean isOpOverride() {
@@ -57,6 +60,9 @@ public class GMConfiguration {
public boolean isBukkitPermsOverride() { public boolean isBukkitPermsOverride() {
return GMconfig.getBoolean("settings.config.bukkit_perms_override", false); return GMconfig.getBoolean("settings.config.bukkit_perms_override", false);
} }
public boolean isToggleValidate() {
return GMconfig.getBoolean("settings.config.validate_toggle", true);
}
public Map<String, Object> getMirrorsMap() { public Map<String, Object> getMirrorsMap() {
// Try to fetch the old mirror path first // Try to fetch the old mirror path first

View File

@@ -0,0 +1,393 @@
package org.anjocaido.groupmanager;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import org.anjocaido.groupmanager.data.Group;
import org.anjocaido.groupmanager.utils.PermissionCheckResult;
import org.anjocaido.groupmanager.utils.Tasks;
import org.bukkit.configuration.MemorySection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
/**
* @author ElgarL
*
*/
public class GlobalGroups {
private GroupManager plugin;
private YamlConfiguration GGroups;
private Map<String, Group> groups;
protected long timeStampGroups = 0;
protected boolean haveGroupsChanged = false;
protected File GlobalGroupsFile = null;
public GlobalGroups(GroupManager plugin) {
this.plugin = plugin;
load();
}
/**
* @return the haveGroupsChanged
*/
public boolean haveGroupsChanged() {
if (this.haveGroupsChanged) {
return true;
}
for (Group g : groups.values()) {
if (g.isChanged()) {
return true;
}
}
return false;
}
/**
* @return the timeStampGroups
*/
public long getTimeStampGroups() {
return timeStampGroups;
}
/**
* @param timeStampGroups the timeStampGroups to set
*/
protected void setTimeStampGroups(long timeStampGroups) {
this.timeStampGroups = timeStampGroups;
}
/**
* @param haveGroupsChanged
* the haveGroupsChanged to set
*/
public void setGroupsChanged(boolean haveGroupsChanged) {
this.haveGroupsChanged = haveGroupsChanged;
}
@SuppressWarnings("unchecked")
public void load() {
GGroups = new YamlConfiguration();
groups = new HashMap<String, Group>();
GroupManager.setLoaded(false);
// READ globalGroups FILE
if (GlobalGroupsFile == null)
GlobalGroupsFile = new File(plugin.getDataFolder(), "globalgroups.yml");
if (!GlobalGroupsFile.exists()) {
try {
// Create a new file if it doesn't exist.
Tasks.copy(plugin.getResourceAsStream("globalgroups.yml"), GlobalGroupsFile);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
}
try {
GGroups.load(GlobalGroupsFile);
} catch (Exception ex) {
throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + GlobalGroupsFile.getPath(), ex);
}
// Read all global groups
Map<String, Object> allGroups = (Map<String, Object>) GGroups.getConfigurationSection("groups").getValues(false);
// Load each groups permissions list.
if (allGroups != null)
for (String groupName : allGroups.keySet()) {
Group newGroup = new Group(groupName.toLowerCase());
Object element;
// Permission nodes
element = GGroups.get("groups." + groupName + ".permissions");
if (element != null)
if (element instanceof List) {
for (String node : (List<String>) element) {
newGroup.addPermission(node);
}
} else if (element instanceof String) {
newGroup.addPermission((String) element);
} else
throw new IllegalArgumentException("Unknown type of permission node for global group: " + groupName);
// Info nodes
element = GGroups.get("groups." + groupName + ".info");
if (element != null)
if (element instanceof MemorySection) {
Map<String, Object> vars = new HashMap<String, Object>();
for (String key : ((MemorySection) element).getKeys(false)) {
vars.put(key, ((MemorySection) element).get(key));
}
newGroup.setVariables(vars);
} else
throw new IllegalArgumentException("Unknown type of info node for global group: " + groupName);
// Push a new group
addGroup(newGroup);
}
removeGroupsChangedFlag();
setTimeStampGroups(GlobalGroupsFile.lastModified());
GroupManager.setLoaded(true);
//GlobalGroupsFile = null;
}
/**
* Write the globalgroups.yml file
*/
public void writeGroups(boolean overwrite) {
//File GlobalGroupsFile = new File(plugin.getDataFolder(), "globalgroups.yml");
if (haveGroupsChanged()) {
if (overwrite || (!overwrite && (getTimeStampGroups() >= GlobalGroupsFile.lastModified()))) {
Map<String, Object> root = new HashMap<String, Object>();
Map<String, Object> groupsMap = new HashMap<String, Object>();
root.put("groups", groupsMap);
for (String groupKey : groups.keySet()) {
Group group = groups.get(groupKey);
// Group header
Map<String, Object> aGroupMap = new HashMap<String, Object>();
groupsMap.put(group.getName(), aGroupMap);
// Info nodes
Map<String, Object> infoMap = new HashMap<String, Object>();
aGroupMap.put("info", infoMap);
for (String infoKey : group.getVariables().getVarKeyList()) {
infoMap.put(infoKey, group.getVariables().getVarObject(infoKey));
}
// Permission nodes
aGroupMap.put("permissions", group.getPermissionList());
}
if (!root.isEmpty()) {
DumperOptions opt = new DumperOptions();
opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
final Yaml yaml = new Yaml(opt);
try {
yaml.dump(root, new OutputStreamWriter(new FileOutputStream(GlobalGroupsFile), "UTF-8"));
} catch (UnsupportedEncodingException ex) {
} catch (FileNotFoundException ex) {
}
}
setTimeStampGroups(GlobalGroupsFile.lastModified());
} else {
// Newer file found.
GroupManager.logger.log(Level.WARNING, "Newer GlobalGroups file found, but we have local changes!");
throw new IllegalStateException("Unable to save unless you issue a '/mansave force'");
}
removeGroupsChangedFlag();
} else {
//Check for newer file as no local changes.
if (getTimeStampGroups() < GlobalGroupsFile.lastModified()) {
System.out.print("Newer GlobalGroups file found (Loading changes)!");
// Backup GlobalGroups file
backupFile();
load();
}
}
}
/**
* Backup the BlobalGroups file
* @param w
*/
private void backupFile() {
File backupFile = new File(plugin.getBackupFolder(), "bkp_ggroups_" + Tasks.getDateString() + ".yml");
try {
Tasks.copy(GlobalGroupsFile, backupFile);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
}
/**
* Adds a group, or replaces an existing one.
*
* @param groupToAdd
*/
public void addGroup(Group groupToAdd) {
// Create a new group if it already exists
if (hasGroup(groupToAdd.getName())) {
groupToAdd = groupToAdd.clone();
removeGroup(groupToAdd.getName());
}
newGroup(groupToAdd);
haveGroupsChanged = true;
}
/**
* Creates a new group if it doesn't already exist.
*
* @param newGroup
*/
public Group newGroup(Group newGroup) {
// Push a new group
if (!groups.containsKey(newGroup.getName().toLowerCase())) {
groups.put(newGroup.getName().toLowerCase(), newGroup);
this.setGroupsChanged(true);
return newGroup;
}
return null;
}
/**
* Delete a group if it exist.
*
* @param groupName
*/
public boolean removeGroup(String groupName) {
// Push a new group
if (groups.containsKey(groupName.toLowerCase())) {
groups.remove(groupName.toLowerCase());
this.setGroupsChanged(true);
return true;
}
return false;
}
/**
* Returns true if the Global Group exists in the globalgroups.yml
*
* @param groupName
* @return true if the group exists
*/
public boolean hasGroup(String groupName) {
return groups.containsKey(groupName.toLowerCase());
}
/**
* Returns true if the group has the correct permission node.
*
* @param groupName
* @param permissionNode
* @return true if node exists
*/
public boolean hasPermission(String groupName, String permissionNode) {
if (!hasGroup(groupName.toLowerCase()))
return false;
return groups.get(groupName.toLowerCase()).hasSamePermissionNode(permissionNode);
}
/**
* Returns a PermissionCheckResult of the permission node for the group to
* be tested against.
*
* @param groupName
* @param permissionNode
* @return PermissionCheckResult object
*/
public PermissionCheckResult checkPermission(String groupName, String permissionNode) {
PermissionCheckResult result = new PermissionCheckResult();
result.askedPermission = permissionNode;
result.resultType = PermissionCheckResult.Type.NOTFOUND;
if (!hasGroup(groupName.toLowerCase()))
return result;
Group tempGroup = groups.get(groupName.toLowerCase());
if (tempGroup.hasSamePermissionNode(permissionNode))
result.resultType = PermissionCheckResult.Type.FOUND;
if (tempGroup.hasSamePermissionNode("-" + permissionNode))
result.resultType = PermissionCheckResult.Type.NEGATION;
if (tempGroup.hasSamePermissionNode("+" + permissionNode))
result.resultType = PermissionCheckResult.Type.EXCEPTION;
return result;
}
/**
* Returns a List of all permission nodes for this group null if none
*
* @param groupName
* @return List of all group names
*/
public List<String> getGroupsPermissions(String groupName) {
if (!hasGroup(groupName.toLowerCase()))
return null;
return groups.get(groupName.toLowerCase()).getPermissionList();
}
/**
* Returns a Set of all global group names.
*
* @return Set containing all group names.
*/
public Set<String> getGlobalGroups() {
return groups.keySet();
}
/**
*
* @return a collection of the groups
*/
public Collection<Group> getGroupList() {
return groups.values();
}
/**
* Returns the Global Group or null if it doesn't exist.
*
* @param groupName
* @return Group object
*/
public Group getGroup(String groupName) {
if (!hasGroup(groupName.toLowerCase()))
return null;
return groups.get(groupName.toLowerCase());
}
/**
* @return the globalGroupsFile
*/
public File getGlobalGroupsFile() {
return GlobalGroupsFile;
}
/**
*
*/
public void removeGroupsChangedFlag() {
setGroupsChanged(false);
for (Group g : groups.values()) {
g.flagAsSaved();
}
}
}

View File

@@ -26,6 +26,10 @@ public abstract class DataUnit {
this.name = name; this.name = name;
} }
public DataUnit(String name) {
this.name = name;
}
/** /**
* Every group is matched only by their names and DataSources names. * Every group is matched only by their names and DataSources names.
* @param o * @param o
@@ -64,7 +68,15 @@ public abstract class DataUnit {
} }
public void flagAsChanged() { public void flagAsChanged() {
GroupManager.logger.finest("DataSource: " + getDataSource().getName() + " - DataUnit: " + getName() + " flagged as changed!"); WorldDataHolder testSource = getDataSource();
String source = "";
if (testSource == null)
source = "GlobalGroups";
else
source = testSource.getName();
GroupManager.logger.finest("DataSource: " + source + " - DataUnit: " + getName() + " flagged as changed!");
// for(StackTraceElement st: Thread.currentThread().getStackTrace()){ // for(StackTraceElement st: Thread.currentThread().getStackTrace()){
// GroupManager.logger.finest(st.toString()); // GroupManager.logger.finest(st.toString());
// } // }
@@ -76,7 +88,15 @@ public abstract class DataUnit {
} }
public void flagAsSaved() { public void flagAsSaved() {
GroupManager.logger.finest("DataSource: " + getDataSource().getName() + " - DataUnit: " + getName() + " flagged as saved!"); WorldDataHolder testSource = getDataSource();
String source = "";
if (testSource == null)
source = "GlobalGroups";
else
source = testSource.getName();
GroupManager.logger.finest("DataSource: " + source + " - DataUnit: " + getName() + " flagged as saved!");
changed = false; changed = false;
} }

View File

@@ -27,6 +27,7 @@ public class Group extends DataUnit implements Cloneable {
private GroupVariables variables = new GroupVariables(this); private GroupVariables variables = new GroupVariables(this);
/** /**
* Constructor for individual World Groups.
* *
* @param name * @param name
*/ */
@@ -34,14 +35,30 @@ public class Group extends DataUnit implements Cloneable {
super(source, name); super(source, name);
} }
/**
* Constructor for Global Groups.
*
* @param name
*/
public Group(String name) {
super(name);
}
/** /**
* Clone this group * Clone this group
* @return a clone of this group * @return a clone of this group
*/ */
@Override @Override
public Group clone() { public Group clone() {
Group clone = new Group(getDataSource(), this.getName()); Group clone;
if (getDataSource() == null) {
clone = new Group(this.getName());
} else {
clone = new Group(getDataSource(), this.getName());
clone.inherits = new ArrayList<String>(this.getInherits()); clone.inherits = new ArrayList<String>(this.getInherits());
}
for (String perm : this.getPermissionList()) { for (String perm : this.getPermissionList()) {
clone.addPermission(perm); clone.addPermission(perm);
} }

View File

@@ -46,7 +46,7 @@ public class GroupVariables extends Variables implements Cloneable {
/** /**
* A clone of all vars here. * A clone of all vars here.
* @return * @return GroupVariables clone
*/ */
protected GroupVariables clone(Group newOwner) { protected GroupVariables clone(Group newOwner) {
GroupVariables clone = new GroupVariables(newOwner); GroupVariables clone = new GroupVariables(newOwner);

View File

@@ -40,7 +40,7 @@ public class User extends DataUnit implements Cloneable {
/** /**
* *
* @return * @return User clone
*/ */
@Override @Override
public User clone() { public User clone() {

View File

@@ -27,7 +27,7 @@ public class UserVariables extends Variables {
/** /**
* A clone of all vars here. * A clone of all vars here.
* @return * @return UserVariables clone
*/ */
protected UserVariables clone(User newOwner) { protected UserVariables clone(User newOwner) {
UserVariables clone = new UserVariables(newOwner); UserVariables clone = new UserVariables(newOwner);

View File

@@ -115,7 +115,7 @@ public abstract class Variables implements Cloneable {
/** /**
* All variable keys this is holding * All variable keys this is holding
* @return * @return Set of all variable names.
*/ */
public Set<String> getVarKeyList() { public Set<String> getVarKeyList() {
return variables.keySet(); return variables.keySet();

View File

@@ -39,7 +39,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
/** /**
* *
* @param userName * @param userName
* @return * @return user object or a new user if none exists.
*/ */
@Override @Override
public User getUser(String userName) { public User getUser(String userName) {
@@ -86,7 +86,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
/** /**
* *
* @param userName * @param userName
* @return * @return true if removed/false if not found.
*/ */
@Override @Override
public boolean removeUser(String userName) { public boolean removeUser(String userName) {
@@ -137,7 +137,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
/** /**
* *
* @return * @return Collection of all users
*/ */
@Override @Override
public Collection<User> getUserList() { public Collection<User> getUserList() {
@@ -156,7 +156,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
/** /**
* *
* @param userName * @param userName
* @return * @return true if user is overloaded.
*/ */
public boolean isOverloaded(String userName) { public boolean isOverloaded(String userName) {
return overloadedUsers.containsKey(userName.toLowerCase()); return overloadedUsers.containsKey(userName.toLowerCase());
@@ -189,8 +189,9 @@ public class OverloadedWorldHolder extends WorldDataHolder {
* Gets the user in normal state. Surpassing the overload state. * Gets the user in normal state. Surpassing the overload state.
* It doesn't affect permissions. But it enables plugins change the * It doesn't affect permissions. But it enables plugins change the
* actual user permissions even in overload mode. * actual user permissions even in overload mode.
*
* @param userName * @param userName
* @return * @return user object
*/ */
public User surpassOverload(String userName) { public User surpassOverload(String userName) {
if (!isOverloaded(userName)) { if (!isOverloaded(userName)) {

View File

@@ -49,16 +49,19 @@ public class WorldDataHolder {
* The actual users holder * The actual users holder
*/ */
protected Map<String, User> users = new HashMap<String, User>(); protected Map<String, User> users = new HashMap<String, User>();
/** /**
* Points to the default group * Points to the default group
*/ */
protected Group defaultGroup = null; protected Group defaultGroup = null;
/** /**
* The file, which this class loads/save data from/to * The file, which this class loads/save data from/to
* @deprecated * @deprecated
*/ */
@Deprecated @Deprecated
protected File f; protected File f;
/** /**
* *
*/ */
@@ -79,6 +82,15 @@ public class WorldDataHolder {
* *
*/ */
protected boolean haveGroupsChanged = false; protected boolean haveGroupsChanged = false;
/**
*
*/
protected long timeStampGroups = 0;
/**
*
*/
protected long timeStampUsers = 0;
/** /**
* Prevent direct instantiation * Prevent direct instantiation
@@ -151,7 +163,7 @@ public class WorldDataHolder {
/** /**
* *
* @param userName * @param userName
* @return * @return true if we have data for this player.
*/ */
public boolean isUserDeclared(String userName) { public boolean isUserDeclared(String userName) {
return users.containsKey(userName.toLowerCase()); return users.containsKey(userName.toLowerCase());
@@ -183,6 +195,9 @@ public class WorldDataHolder {
* @return a group if it is found. null if not found. * @return a group if it is found. null if not found.
*/ */
public Group getGroup(String groupName) { public Group getGroup(String groupName) {
if (groupName.startsWith("g:"))
return GroupManager.getGlobalGroups().getGroup(groupName);
else
return groups.get(groupName.toLowerCase()); return groups.get(groupName.toLowerCase());
} }
@@ -193,6 +208,9 @@ public class WorldDataHolder {
* @return true if exists. false if not. * @return true if exists. false if not.
*/ */
public boolean groupExists(String groupName) { public boolean groupExists(String groupName) {
if (groupName.startsWith("g:"))
return GroupManager.getGlobalGroups().hasGroup(groupName);
else
return groups.containsKey(groupName.toLowerCase()); return groups.containsKey(groupName.toLowerCase());
} }
@@ -201,6 +219,11 @@ public class WorldDataHolder {
* @param groupToAdd * @param groupToAdd
*/ */
public void addGroup(Group groupToAdd) { public void addGroup(Group groupToAdd) {
if (groupToAdd.getName().startsWith("g:")) {
GroupManager.getGlobalGroups().addGroup(groupToAdd);
return;
}
if (groupToAdd.getDataSource() != this) { if (groupToAdd.getDataSource() != this) {
groupToAdd = groupToAdd.clone(this); groupToAdd = groupToAdd.clone(this);
} }
@@ -215,6 +238,10 @@ public class WorldDataHolder {
* @return true if had something to remove. false the group was default or non-existant * @return true if had something to remove. false the group was default or non-existant
*/ */
public boolean removeGroup(String groupName) { public boolean removeGroup(String groupName) {
if (groupName.startsWith("g:")) {
return GroupManager.getGlobalGroups().removeGroup(groupName);
}
if (defaultGroup != null && groupName.equalsIgnoreCase(defaultGroup.getName())) { if (defaultGroup != null && groupName.equalsIgnoreCase(defaultGroup.getName())) {
return false; return false;
} }
@@ -251,9 +278,15 @@ public class WorldDataHolder {
* @return null if group already exists. or new Group * @return null if group already exists. or new Group
*/ */
public Group createGroup(String groupName) { public Group createGroup(String groupName) {
if (groupName.startsWith("g:")) {
Group newGroup = new Group(groupName);
return GroupManager.getGlobalGroups().newGroup(newGroup);
}
if (this.groups.containsKey(groupName.toLowerCase())) { if (this.groups.containsKey(groupName.toLowerCase())) {
return null; return null;
} }
Group newGroup = new Group(this, groupName); Group newGroup = new Group(this, groupName);
this.addGroup(newGroup); this.addGroup(newGroup);
haveGroupsChanged = true; haveGroupsChanged = true;
@@ -281,15 +314,35 @@ public class WorldDataHolder {
*/ */
public void reload() { public void reload() {
try { try {
WorldDataHolder ph = load(this.getName(), getGroupsFile(), getUsersFile()); reloadGroups();
this.defaultGroup = ph.defaultGroup; reloadUsers();
this.groups = ph.groups;
this.users = ph.users;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(WorldDataHolder.class.getName()).log(Level.SEVERE, null, ex); Logger.getLogger(WorldDataHolder.class.getName()).log(Level.SEVERE, null, ex);
} }
} }
public void reloadGroups() {
GroupManager.setLoaded(false);
try {
resetGroups();
loadGroups(this, getGroupsFile());
} catch (Exception ex) {
Logger.getLogger(WorldDataHolder.class.getName()).log(Level.SEVERE, null, ex);
}
GroupManager.setLoaded(true);
}
public void reloadUsers() {
GroupManager.setLoaded(false);
try {
resetUsers();
loadUsers(this, getUsersFile());
} catch (Exception ex) {
Logger.getLogger(WorldDataHolder.class.getName()).log(Level.SEVERE, null, ex);
}
GroupManager.setLoaded(true);
}
/** /**
* Save by yourself! * Save by yourself!
* @deprecated * @deprecated
@@ -302,9 +355,11 @@ public class WorldDataHolder {
/** /**
* Returns a data holder for the given file * Returns a data holder for the given file
*
* @param worldName * @param worldName
* @param file * @param file
* @return * @return a new WorldDataHolder
*
* @throws Exception * @throws Exception
* @deprecated * @deprecated
*/ */
@@ -448,26 +503,66 @@ public class WorldDataHolder {
} }
/** /**
* Returns a data holder for the given file * Returns a NEW data holder containing data read from the files
*
* @param worldName * @param worldName
* @param groupsFile * @param groupsFile
* @param usersFile * @param usersFile
* @return *
* @throws FileNotFoundException
* @throws IOException
*/
public static WorldDataHolder load(String worldName, File groupsFile, File usersFile) throws FileNotFoundException, IOException {
WorldDataHolder ph = new WorldDataHolder(worldName);
GroupManager.setLoaded(false);
loadGroups(ph, groupsFile);
loadUsers(ph, usersFile);
GroupManager.setLoaded(true);
return ph;
}
/**
* Updates the WorldDataHolder from the files
*
* @param ph
* @param groupsFile
* @param usersFile
*
* @throws FileNotFoundException
* @throws IOException
*/
public static WorldDataHolder Update(WorldDataHolder ph, File groupsFile, File usersFile) throws FileNotFoundException, IOException {
GroupManager.setLoaded(false);
ph.resetGroups();
loadGroups(ph, groupsFile);
ph.resetUsers();
loadUsers(ph, usersFile);
GroupManager.setLoaded(true);
return ph;
}
/**
* Updates the WorldDataHolder from the Groups file
*
* @param ph
* @param groupsFile
*
* @throws FileNotFoundException * @throws FileNotFoundException
* @throws IOException * @throws IOException
*/ */
@SuppressWarnings({"rawtypes", "unchecked"}) @SuppressWarnings({"rawtypes", "unchecked"})
public static WorldDataHolder load(String worldName, File groupsFile, File usersFile) throws FileNotFoundException, IOException { protected static void loadGroups(WorldDataHolder ph, File groupsFile) throws FileNotFoundException, IOException {
WorldDataHolder ph = new WorldDataHolder(worldName);
ph.groupsFile = groupsFile;
ph.usersFile = usersFile;
//READ GROUPS FILE //READ GROUPS FILE
Yaml yamlGroups = new Yaml(new SafeConstructor()); Yaml yamlGroups = new Yaml(new SafeConstructor());
Map<String, Object> groupsRootDataNode; Map<String, Object> groupsRootDataNode;
if (!groupsFile.exists()) { if (!groupsFile.exists()) {
throw new IllegalArgumentException("The file which should contain permissions does not exist!\n" + groupsFile.getPath()); throw new IllegalArgumentException("The file which should contain groups does not exist!\n" + groupsFile.getPath());
} }
FileInputStream groupsInputStream = new FileInputStream(groupsFile); FileInputStream groupsInputStream = new FileInputStream(groupsFile);
try { try {
@@ -483,7 +578,7 @@ public class WorldDataHolder {
//PROCESS GROUPS FILE //PROCESS GROUPS FILE
Map<String, List<String>> inheritance = new HashMap<String, List<String>>(); Map<String, List<String>> inheritance = new HashMap<String, List<String>>();
try { //try {
Map<String, Object> allGroupsNode = (Map<String, Object>) groupsRootDataNode.get("groups"); Map<String, Object> allGroupsNode = (Map<String, Object>) groupsRootDataNode.get("groups");
for (String groupKey : allGroupsNode.keySet()) { for (String groupKey : allGroupsNode.keySet()) {
Map<String, Object> thisGroupNode = (Map<String, Object>) allGroupsNode.get(groupKey); Map<String, Object> thisGroupNode = (Map<String, Object>) allGroupsNode.get(groupKey);
@@ -513,17 +608,22 @@ public class WorldDataHolder {
} else if (thisGroupNode.get("permissions") instanceof String) { } else if (thisGroupNode.get("permissions") instanceof String) {
thisGrp.addPermission((String) thisGroupNode.get("permissions")); thisGrp.addPermission((String) thisGroupNode.get("permissions"));
} else { } else {
throw new IllegalArgumentException("Unknown type of permissions node(Should be String or List<String>): " + thisGroupNode.get("permissions").getClass().getName()); throw new IllegalArgumentException("Unknown type of permissions node(Should be String or List<String>) for group: " + thisGrp.getName());
} }
//INFO NODE //INFO NODE
if (thisGroupNode.get("info") instanceof Map) {
Map<String, Object> infoNode = (Map<String, Object>) thisGroupNode.get("info"); Map<String, Object> infoNode = (Map<String, Object>) thisGroupNode.get("info");
if (infoNode != null) { if (infoNode != null) {
thisGrp.setVariables(infoNode); thisGrp.setVariables(infoNode);
} }
} else
throw new IllegalArgumentException("Unknown entry found in Info section for group: " + thisGrp.getName());
//END INFO NODE //END INFO NODE
if (thisGroupNode.get("inheritance") == null || thisGroupNode.get("inheritance") instanceof List) {
Object inheritNode = thisGroupNode.get("inheritance"); Object inheritNode = thisGroupNode.get("inheritance");
if (inheritNode == null) { if (inheritNode == null) {
thisGroupNode.put("inheritance", new ArrayList<String>()); thisGroupNode.put("inheritance", new ArrayList<String>());
@@ -538,11 +638,13 @@ public class WorldDataHolder {
} }
} }
}else
throw new IllegalArgumentException("Unknown entry found in inheritance section for group: " + thisGrp.getName());
} }
} catch (Exception ex) { //} catch (Exception ex) {
ex.printStackTrace(); // ex.printStackTrace();
throw new IllegalArgumentException("Your Permissions config file is invalid. See console for details."); // throw new IllegalArgumentException("Your Permissions config file is invalid. See console for details.");
} //}
if (ph.defaultGroup == null) { if (ph.defaultGroup == null) {
throw new IllegalArgumentException("There was no Default Group declared."); throw new IllegalArgumentException("There was no Default Group declared.");
} }
@@ -557,12 +659,31 @@ public class WorldDataHolder {
} }
} }
ph.removeGroupsChangedFlag();
// Update the LastModified time.
ph.groupsFile = groupsFile;
ph.setTimeStamps();
//return ph;
}
/**
* Updates the WorldDataHolder from the Users file
*
* @param ph
* @param usersFile
*
* @throws FileNotFoundException
* @throws IOException
*/
@SuppressWarnings({"rawtypes", "unchecked"})
protected static void loadUsers(WorldDataHolder ph, File usersFile) throws FileNotFoundException, IOException {
//READ USERS FILE //READ USERS FILE
Yaml yamlUsers = new Yaml(new SafeConstructor()); Yaml yamlUsers = new Yaml(new SafeConstructor());
Map<String, Object> usersRootDataNode; Map<String, Object> usersRootDataNode;
if (!groupsFile.exists()) { if (!usersFile.exists()) {
throw new IllegalArgumentException("The file which should contain permissions does not exist!\n" + usersFile.getPath()); throw new IllegalArgumentException("The file which should contain users does not exist!\n" + usersFile.getPath());
} }
FileInputStream usersInputStream = new FileInputStream(usersFile); FileInputStream usersInputStream = new FileInputStream(usersFile);
try { try {
@@ -581,7 +702,7 @@ public class WorldDataHolder {
// Stop loading if the file is empty // Stop loading if the file is empty
if (allUsersNode == null) if (allUsersNode == null)
return ph; return ;
for (String usersKey : allUsersNode.keySet()) { for (String usersKey : allUsersNode.keySet()) {
Map<String, Object> thisUserNode = (Map<String, Object>) allUsersNode.get(usersKey); Map<String, Object> thisUserNode = (Map<String, Object>) allUsersNode.get(usersKey);
@@ -644,7 +765,13 @@ public class WorldDataHolder {
thisUser.setGroup(ph.defaultGroup); thisUser.setGroup(ph.defaultGroup);
} }
} }
return ph;
ph.removeUsersChangedFlag();
// Update the LastModified time.
ph.usersFile = usersFile;
ph.setTimeStamps();
//return ph;
} }
/** /**
@@ -778,6 +905,11 @@ public class WorldDataHolder {
} }
} }
// Update the LastModified time.
ph.groupsFile = groupsFile;
ph.setTimeStampGroups(groupsFile.lastModified());
ph.removeGroupsChangedFlag();
/*FileWriter tx = null; /*FileWriter tx = null;
try { try {
tx = new FileWriter(groupsFile, false); tx = new FileWriter(groupsFile, false);
@@ -842,6 +974,12 @@ public class WorldDataHolder {
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
} }
} }
// Update the LastModified time.
ph.usersFile = usersFile;
ph.setTimeStampUsers(usersFile.lastModified());
ph.removeUsersChangedFlag();
/*FileWriter tx = null; /*FileWriter tx = null;
try { try {
tx = new FileWriter(usersFile, false); tx = new FileWriter(usersFile, false);
@@ -894,7 +1032,7 @@ public class WorldDataHolder {
/** /**
* *
* @return * @return true if any user data has changed
*/ */
public boolean haveUsersChanged() { public boolean haveUsersChanged() {
if (haveUsersChanged) { if (haveUsersChanged) {
@@ -910,7 +1048,7 @@ public class WorldDataHolder {
/** /**
* *
* @return * @return true if any group data has changed.
*/ */
public boolean haveGroupsChanged() { public boolean haveGroupsChanged() {
if (haveGroupsChanged) { if (haveGroupsChanged) {
@@ -964,4 +1102,64 @@ public class WorldDataHolder {
public String getName() { public String getName() {
return name; return name;
} }
/**
* Resets Groups.
*/
public void resetGroups() {
this.defaultGroup = null;
this.groups = new HashMap<String, Group>();
}
/**
* Resets Users
*/
public void resetUsers() {
this.users = new HashMap<String, User>();
}
/**
* @return the groups
*/
public Map<String, Group> getGroups() {
return groups;
}
/**
* @return the users
*/
public Map<String, User> getUsers() {
return users;
}
/**
* @return the timeStampGroups
*/
public long getTimeStampGroups() {
return timeStampGroups;
}
/**
* @return the timeStampUsers
*/
public long getTimeStampUsers() {
return timeStampUsers;
}
/**
* @param timeStampGroups the timeStampGroups to set
*/
protected void setTimeStampGroups(long timeStampGroups) {
this.timeStampGroups = timeStampGroups;
}
/**
* @param timeStampUsers the timeStampUsers to set
*/
protected void setTimeStampUsers(long timeStampUsers) {
this.timeStampUsers = timeStampUsers;
}
public void setTimeStamps() {
if (groupsFile != null)
setTimeStampGroups(groupsFile.lastModified());
if (usersFile != null)
setTimeStampUsers(usersFile.lastModified());
}
} }

View File

@@ -100,7 +100,7 @@ public class WorldsHolder {
* or mirrored worlds that don't need data. * or mirrored worlds that don't need data.
*/ */
if (!worldsData.containsKey(folder.getName().toLowerCase()) if (!worldsData.containsKey(folder.getName().toLowerCase())
|| !mirrors.containsKey(folder.getName().toLowerCase())) { && !mirrors.containsKey(folder.getName().toLowerCase())) {
loadWorld(folder.getName()); loadWorld(folder.getName());
} }
@@ -149,6 +149,8 @@ public class WorldsHolder {
w.reload(); w.reload();
alreadyDone.add(w); alreadyDone.add(w);
} }
// Load global groups
GroupManager.getGlobalGroups().load();
} }
/** /**
@@ -160,42 +162,96 @@ public class WorldsHolder {
} }
/** /**
* * Wrapper to retain backwards compatibility
* (call this function to auto overwrite files)
*/ */
public void saveChanges() { public void saveChanges() {
saveChanges(true);
}
/**
*
*/
public void saveChanges(boolean overwrite) {
ArrayList<WorldDataHolder> alreadyDone = new ArrayList<WorldDataHolder>(); ArrayList<WorldDataHolder> alreadyDone = new ArrayList<WorldDataHolder>();
Tasks.removeOldFiles(plugin, plugin.getBackupFolder());
for (OverloadedWorldHolder w : worldsData.values()) { for (OverloadedWorldHolder w : worldsData.values()) {
if (alreadyDone.contains(w)) { if (alreadyDone.contains(w)) {
continue; continue;
} }
Tasks.removeOldFiles(plugin, plugin.getBackupFolder());
if (w == null) { if (w == null) {
GroupManager.logger.severe("WHAT HAPPENED?"); GroupManager.logger.severe("WHAT HAPPENED?");
continue; continue;
} }
if (w.haveGroupsChanged()) { if (w.haveGroupsChanged()) {
//String groupsFolderName = w.getGroupsFile().getParentFile().getName(); if (overwrite || (!overwrite && (w.getTimeStampGroups() >= w.getGroupsFile().lastModified()))) {
File backupGroups = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + "_g_" + Tasks.getDateString() + ".yml"); // Backup Groups file
try { backupFile(w,true);
Tasks.copy(w.getGroupsFile(), backupGroups);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
WorldDataHolder.writeGroups(w, w.getGroupsFile()); WorldDataHolder.writeGroups(w, w.getGroupsFile());
w.removeGroupsChangedFlag(); //w.removeGroupsChangedFlag();
} else {
// Newer file found.
GroupManager.logger.log(Level.WARNING, "Newer Groups file found for " + w.getName() + ", but we have local changes!");
throw new IllegalStateException("Unable to save unless you issue a '/mansave force'");
}
} else {
//Check for newer file as no local changes.
if (w.getTimeStampGroups() < w.getGroupsFile().lastModified()) {
System.out.print("Newer Groups file found (Loading changes)!");
// Backup Users file
backupFile(w,false);
w.reloadGroups();
}
} }
if (w.haveUsersChanged()) { if (w.haveUsersChanged()) {
File backupUsers = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + "_u_" + Tasks.getDateString() + ".yml"); if (overwrite || (!overwrite && (w.getTimeStampUsers() >= w.getUsersFile().lastModified()))) {
try { // Backup Users file
Tasks.copy(w.getUsersFile(), backupUsers); backupFile(w,false);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
WorldDataHolder.writeUsers(w, w.getUsersFile()); WorldDataHolder.writeUsers(w, w.getUsersFile());
w.removeUsersChangedFlag(); //w.removeUsersChangedFlag();
} else {
// Newer file found.
GroupManager.logger.log(Level.WARNING, "Newer Users file found for " + w.getName() + ", but we have local changes!");
throw new IllegalStateException("Unable to save unless you issue a '/mansave force'");
}
} else {
//Check for newer file as no local changes.
if (w.getTimeStampUsers() < w.getUsersFile().lastModified()) {
System.out.print("Newer Users file found (Loading changes)!");
// Backup Users file
backupFile(w,false);
w.reloadUsers();
}
} }
alreadyDone.add(w); alreadyDone.add(w);
} }
// Write Global Groups
if (GroupManager.getGlobalGroups().haveGroupsChanged()) {
GroupManager.getGlobalGroups().writeGroups(overwrite);
} else {
if (GroupManager.getGlobalGroups().getTimeStampGroups() < GroupManager.getGlobalGroups().getGlobalGroupsFile().lastModified()) {
System.out.print("Newer GlobalGroups file found (Loading changes)!");
GroupManager.getGlobalGroups().load();
}
}
}
/**
* Backup the Groups/Users file
* @param w
* @param groups
*/
private void backupFile(OverloadedWorldHolder w, Boolean groups) {
File backupFile = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + (groups ? "_g_" : "_u_") + Tasks.getDateString() + ".yml");
try {
Tasks.copy((groups ? w.getGroupsFile() : w.getUsersFile()), backupFile);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
} }
/** /**
@@ -209,7 +265,7 @@ public class WorldsHolder {
* Mirrors prevails original data. * Mirrors prevails original data.
* *
* @param worldName * @param worldName
* @return * @return OverloadedWorldHolder
*/ */
public OverloadedWorldHolder getWorldData(String worldName) { public OverloadedWorldHolder getWorldData(String worldName) {
OverloadedWorldHolder data = worldsData.get(worldName.toLowerCase()); OverloadedWorldHolder data = worldsData.get(worldName.toLowerCase());
@@ -239,31 +295,31 @@ public class WorldsHolder {
} }
/** /**
* Retrieves the field p.getWorld().getName() and do * Retrieves the field player.getWorld().getName() and do
* getWorld(worldName) * getWorld(worldName)
* @param p * @param player
* @return * @return OverloadedWorldHolder
*/ */
public OverloadedWorldHolder getWorldData(Player p) { public OverloadedWorldHolder getWorldData(Player player) {
return getWorldData(p.getWorld().getName()); return getWorldData(player.getWorld().getName());
} }
/** /**
* It does getWorld(worldName).getPermissionsHandler() * It does getWorld(worldName).getPermissionsHandler()
* @param worldName * @param worldName
* @return * @return AnjoPermissionsHandler
*/ */
public AnjoPermissionsHandler getWorldPermissions(String worldName) { public AnjoPermissionsHandler getWorldPermissions(String worldName) {
return getWorldData(worldName).getPermissionsHandler(); return getWorldData(worldName).getPermissionsHandler();
} }
/** /**
*It does getWorldData(p).getPermission * Returns the PermissionsHandler for this player data
* @param p * @param player
* @return * @return AnjoPermissionsHandler
*/ */
public AnjoPermissionsHandler getWorldPermissions(Player p) { public AnjoPermissionsHandler getWorldPermissions(Player player) {
return getWorldData(p).getPermissionsHandler(); return getWorldData(player).getPermissionsHandler();
} }
/** /**
@@ -352,7 +408,7 @@ public class WorldsHolder {
* Copies the specified world data to another world * Copies the specified world data to another world
* @param fromWorld * @param fromWorld
* @param toWorld * @param toWorld
* @return * @return true if successfully copied.
*/ */
public boolean cloneWorld(String fromWorld, String toWorld) { public boolean cloneWorld(String fromWorld, String toWorld) {
File fromWorldFolder = new File(worldsFolder, fromWorld); File fromWorldFolder = new File(worldsFolder, fromWorld);
@@ -401,6 +457,10 @@ public class WorldsHolder {
} }
try { try {
OverloadedWorldHolder thisWorldData = new OverloadedWorldHolder(WorldDataHolder.load(worldName, groupsFile, usersFile)); OverloadedWorldHolder thisWorldData = new OverloadedWorldHolder(WorldDataHolder.load(worldName, groupsFile, usersFile));
// Set the file TimeStamps as it will be default from the initial load.
thisWorldData.setTimeStamps();
if (thisWorldData != null) { if (thisWorldData != null) {
GroupManager.logger.finest("Successful load of world " + worldName + "..."); GroupManager.logger.finest("Successful load of world " + worldName + "...");
worldsData.put(worldName.toLowerCase(), thisWorldData); worldsData.put(worldName.toLowerCase(), thisWorldData);
@@ -454,7 +514,7 @@ public class WorldsHolder {
/** /**
* Returns all physically loaded worlds. * Returns all physically loaded worlds.
* @return * @return ArrayList<OverloadedWorldHolder> of all loaded worlds
*/ */
public ArrayList<OverloadedWorldHolder> allWorldsDataList() { public ArrayList<OverloadedWorldHolder> allWorldsDataList() {
ArrayList<OverloadedWorldHolder> list = new ArrayList<OverloadedWorldHolder>(); ArrayList<OverloadedWorldHolder> list = new ArrayList<OverloadedWorldHolder>();

View File

@@ -34,6 +34,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* It needs a WorldDataHolder to work with. * It needs a WorldDataHolder to work with.
*
* @param holder * @param holder
*/ */
public AnjoPermissionsHandler(WorldDataHolder holder) { public AnjoPermissionsHandler(WorldDataHolder holder) {
@@ -42,9 +43,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* A short name method, for permission method. * A short name method, for permission method.
*
* @param player * @param player
* @param permission * @param permission
* @return * @return true if the player has the permission
*/ */
@Override @Override
public boolean has(Player player, String permission) { public boolean has(Player player, String permission) {
@@ -53,9 +55,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Checks if a player can use that permission node. * Checks if a player can use that permission node.
*
* @param player * @param player
* @param permission * @param permission
* @return * @return true if the player has the permission
*/ */
@Override @Override
public boolean permission(Player player, String permission) { public boolean permission(Player player, String permission) {
@@ -64,9 +67,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Checks if a player can use that permission node. * Checks if a player can use that permission node.
*
* @param playerName * @param playerName
* @param permission * @param permission
* @return * @return true if the player has the permission
*/ */
public boolean permission(String playerName, String permission) { public boolean permission(String playerName, String permission) {
return checkUserPermission(ph.getUser(playerName), permission); return checkUserPermission(ph.getUser(playerName), permission);
@@ -74,8 +78,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Returns the name of the group of that player name. * Returns the name of the group of that player name.
*
* @param userName * @param userName
* @return * @return String of players group name.
*/ */
@Override @Override
public String getGroup(String userName) { public String getGroup(String userName) {
@@ -83,10 +88,11 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Returns All permissions (including inheritance and sub groups) for the player. * Returns All permissions (including inheritance and sub groups) for the
* player.
* *
* @param userName * @param userName
* @return * @return List<String> of all players permissions.
*/ */
@Override @Override
public List<String> getAllPlayersPermissions(String userName) { public List<String> getAllPlayersPermissions(String userName) {
@@ -94,15 +100,32 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
List<String> playerPermArray = new ArrayList<String>(ph.getUser(userName).getPermissionList()); List<String> playerPermArray = new ArrayList<String>(ph.getUser(userName).getPermissionList());
for (String group : getGroups(userName)) { for (String group : getGroups(userName)) {
for (String perm : ph.getGroup(group).getPermissionList()) { if (group.startsWith("g:") && GroupManager.getGlobalGroups().hasGroup(group)) {
if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-"+perm))) { for (String perm : GroupManager.getGlobalGroups().getGroupsPermissions(group)) {
if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm))) {
playerPermArray.add(perm); playerPermArray.add(perm);
Map<String, Boolean> children = GroupManager.BukkitPermissions.getChildren(perm); Map<String, Boolean> children = GroupManager.BukkitPermissions.getChildren(perm);
if (children != null) { if (children != null) {
for (String child : children.keySet()) { for (String child : children.keySet()) {
if (children.get(child)) if (children.get(child))
if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-"+perm))) if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm)))
playerPermArray.add(child);
}
}
}
}
} else {
for (String perm : ph.getGroup(group).getPermissionList()) {
if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm))) {
playerPermArray.add(perm);
Map<String, Boolean> children = GroupManager.BukkitPermissions.getChildren(perm);
if (children != null) {
for (String child : children.keySet()) {
if (children.get(child))
if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm)))
playerPermArray.add(child); playerPermArray.add(child);
} }
} }
@@ -110,25 +133,25 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
} }
} }
}
return playerPermArray; return playerPermArray;
} }
/** /**
* Verify if player is in suck group. * Verify if player is in such group. It will check it's groups inheritance.
* It will check it's groups inheritance.
* *
* So if you have a group Admin > Moderator * So if you have a group Admin > Moderator
* *
* And verify the player 'MyAdmin', which is Admin, it will return true for both * And verify the player 'MyAdmin', which is Admin, it will return true for
* Admin or Moderator groups. * both Admin or Moderator groups.
* *
* Mas if you have a player 'MyModerator', which is Moderator, * If you have a player 'MyModerator', which is Moderator, it will give
* it will give false if you pass Admin in group parameter. * false if you pass Admin in group parameter.
* *
* @param name * @param name
* @param group * @param group
* @return * @return true if in group (with inheritance)
*/ */
@Override @Override
public boolean inGroup(String name, String group) { public boolean inGroup(String name, String group) {
@@ -144,11 +167,13 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Gets the appropriate prefix for the user. * Gets the appropriate prefix for the user. This method is a utility method
* This method is a utility method for chat plugins to get the user's prefix * for chat plugins to get the user's prefix without having to look at every
* without having to look at every one of the user's ancestors. * one of the user's ancestors. Returns an empty string if user has no
* Returns an empty string if user has no parent groups. * parent groups.
* @param user Player's name *
* @param user
* Player's name
* @return Player's prefix * @return Player's prefix
*/ */
@Override @Override
@@ -163,11 +188,13 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Gets the appropriate prefix for the user. * Gets the appropriate prefix for the user. This method is a utility method
* This method is a utility method for chat plugins to get the user's prefix * for chat plugins to get the user's prefix without having to look at every
* without having to look at every one of the user's ancestors. * one of the user's ancestors. Returns an empty string if user has no
* Returns an empty string if user has no parent groups. * parent groups.
* @param user Player's name *
* @param user
* Player's name
* @return Player's prefix * @return Player's prefix
*/ */
@Override @Override
@@ -183,10 +210,12 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Gets name of the primary group of the user. * Gets name of the primary group of the user. Returns the name of the
* Returns the name of the default group if user has no parent groups, * default group if user has no parent groups, or "Default" if there is no
* or "Default" if there is no default group for that world. * default group for that world.
* @param user Player's name *
* @param user
* Player's name
* @return Name of player's primary group * @return Name of player's primary group
*/ */
public String getPrimaryGroup(String user) { public String getPrimaryGroup(String user) {
@@ -196,24 +225,20 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Check if user can build. * Check if user can build. Checks inheritance and subgroups.
* @param world Player's world *
* @param user Player's name * @param userName Player's name
* @return Whether the user can build * @return true if the user can build
*/ */
public boolean canUserBuild(String user) { public boolean canUserBuild(String userName) {
boolean test = ph.getUser(user).getVariables().getVarBoolean("build");
if (test) { return getPermissionBoolean(userName, "build");
return test;
}
return canGroupBuild(getGroup(user));
} }
/** /**
* Returns the String prefix for the given group * Returns the String prefix for the given group
*
* @param groupName * @param groupName
* @return empty string if found none. * @return empty string if found none.
*/ */
@@ -228,8 +253,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Return the suffix for the given group name * Return the suffix for the given group name
*
* @param groupName * @param groupName
* @return * @return empty string if not found.
*/ */
@Override @Override
public String getGroupSuffix(String groupName) { public String getGroupSuffix(String groupName) {
@@ -241,9 +267,11 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Checks the specified group for the Info Build node.
* Does NOT check inheritance
* *
* @param groupName * @param groupName
* @return * @return true if can build
*/ */
@Override @Override
public boolean canGroupBuild(String groupName) { public boolean canGroupBuild(String groupName) {
@@ -255,8 +283,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* It returns a string variable value, set in the INFO node of the group. * It returns a string variable value, set in the INFO node of the group. It
* It will harvest inheritance for value. * will harvest inheritance for value.
*
* @param groupName * @param groupName
* @param variable * @param variable
* @return null if no group with that variable is found. * @return null if no group with that variable is found.
@@ -275,8 +304,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* It returns a Integer variable value * It returns a Integer variable value It will harvest inheritance for
* It will harvest inheritance for value. * value.
*
* @param groupName * @param groupName
* @param variable * @param variable
* @return -1 if none found or not parseable. * @return -1 if none found or not parseable.
@@ -295,8 +325,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Returns a boolean for given variable in INFO node. * Returns a boolean for given variable in INFO node. It will harvest
* It will harvest inheritance for value. * inheritance for value.
*
* @param group * @param group
* @param variable * @param variable
* @return false if not found/not parseable. * @return false if not found/not parseable.
@@ -315,8 +346,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Returns a double value for the given variable name in INFO node. * Returns a double value for the given variable name in INFO node. It will
* It will harvest inheritance for value. * harvest inheritance for value.
*
* @param group * @param group
* @param variable * @param variable
* @return -1 if not found / not parseable. * @return -1 if not found / not parseable.
@@ -336,9 +368,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Returns the variable value of the user, in INFO node. * Returns the variable value of the user, in INFO node.
*
* @param user * @param user
* @param variable * @param variable
* @return * @return empty string if not found
*/ */
@Override @Override
public String getUserPermissionString(String user, String variable) { public String getUserPermissionString(String user, String variable) {
@@ -351,9 +384,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Returns the variable value of the user, in INFO node. * Returns the variable value of the user, in INFO node.
*
* @param user * @param user
* @param variable * @param variable
* @return * @return -1 if not found
*/ */
@Override @Override
public int getUserPermissionInteger(String user, String variable) { public int getUserPermissionInteger(String user, String variable) {
@@ -366,9 +400,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Returns the variable value of the user, in INFO node. * Returns the variable value of the user, in INFO node.
*
* @param user * @param user
* @param variable * @param variable
* @return * @return boolean value
*/ */
@Override @Override
public boolean getUserPermissionBoolean(String user, String variable) { public boolean getUserPermissionBoolean(String user, String variable) {
@@ -381,9 +416,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Returns the variable value of the user, in INFO node. * Returns the variable value of the user, in INFO node.
*
* @param user * @param user
* @param variable * @param variable
* @return * @return -1 if not found
*/ */
@Override @Override
public double getUserPermissionDouble(String user, String variable) { public double getUserPermissionDouble(String user, String variable) {
@@ -395,9 +431,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Returns the variable value of the user, in INFO node. * Returns the variable value of the user, in INFO node. If not found, it
* If not found, it will search for his Group variables. * will search for his Group variables. It will harvest the inheritance and
* It will harvest the inheritance. * subgroups.
*
* @param user * @param user
* @param variable * @param variable
* @return empty string if not found * @return empty string if not found
@@ -417,16 +454,26 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
Group result = nextGroupWithVariable(start, variable); Group result = nextGroupWithVariable(start, variable);
if (result == null) { if (result == null) {
// Check sub groups
if (!auser.isSubGroupsEmpty())
for (Group subGroup : auser.subGroupListCopy()) {
result = nextGroupWithVariable(subGroup, variable);
// Found value?
if (result != null)
continue;
}
if (result == null)
return ""; return "";
} }
return result.getVariables().getVarString(variable); return result.getVariables().getVarString(variable);
//return getUserPermissionString(user, variable); // return getUserPermissionString(user, variable);
} }
/** /**
* Returns the variable value of the user, in INFO node. * Returns the variable value of the user, in INFO node. If not found, it
* If not found, it will search for his Group variables. * will search for his Group variables. It will harvest the inheritance and
* It will harvest the inheritance. * subgroups.
*
* @param user * @param user
* @param variable * @param variable
* @return -1 if not found * @return -1 if not found
@@ -446,16 +493,26 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
Group result = nextGroupWithVariable(start, variable); Group result = nextGroupWithVariable(start, variable);
if (result == null) { if (result == null) {
// Check sub groups
if (!auser.isSubGroupsEmpty())
for (Group subGroup : auser.subGroupListCopy()) {
result = nextGroupWithVariable(subGroup, variable);
// Found value?
if (result != null)
continue;
}
if (result == null)
return -1; return -1;
} }
return result.getVariables().getVarInteger(variable); return result.getVariables().getVarInteger(variable);
//return getUserPermissionInteger(string, string1); // return getUserPermissionInteger(string, string1);
} }
/** /**
* Returns the variable value of the user, in INFO node. * Returns the variable value of the user, in INFO node. If not found, it
* If not found, it will search for his Group variables. * will search for his Group variables. It will harvest the inheritance and
* It will harvest the inheritance. * subgroups.
*
* @param user * @param user
* @param variable * @param variable
* @return false if not found or not parseable to true. * @return false if not found or not parseable to true.
@@ -475,16 +532,26 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
Group result = nextGroupWithVariable(start, variable); Group result = nextGroupWithVariable(start, variable);
if (result == null) { if (result == null) {
// Check sub groups
if (!auser.isSubGroupsEmpty())
for (Group subGroup : auser.subGroupListCopy()) {
result = nextGroupWithVariable(subGroup, variable);
// Found value?
if (result != null)
continue;
}
if (result == null)
return false; return false;
} }
return result.getVariables().getVarBoolean(variable); return result.getVariables().getVarBoolean(variable);
//return getUserPermissionBoolean(user, string1); // return getUserPermissionBoolean(user, string1);
} }
/** /**
* Returns the variable value of the user, in INFO node. * Returns the variable value of the user, in INFO node. If not found, it
* If not found, it will search for his Group variables. * will search for his Group variables. It will harvest the inheritance and
* It will harvest the inheritance. * subgroups.
*
* @param user * @param user
* @param variable * @param variable
* @return -1 if not found. * @return -1 if not found.
@@ -504,17 +571,27 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
Group result = nextGroupWithVariable(start, variable); Group result = nextGroupWithVariable(start, variable);
if (result == null) { if (result == null) {
// Check sub groups
if (!auser.isSubGroupsEmpty())
for (Group subGroup : auser.subGroupListCopy()) {
result = nextGroupWithVariable(subGroup, variable);
// Found value?
if (result != null)
continue;
}
if (result == null)
return -1.0D; return -1.0D;
} }
return result.getVariables().getVarDouble(variable); return result.getVariables().getVarDouble(variable);
//return getUserPermissionDouble(string, string1); // return getUserPermissionDouble(string, string1);
} }
/** /**
* Does not include User's group permission * Does not include User's group permission
*
* @param user * @param user
* @param permission * @param permission
* @return * @return PermissionCheckResult
*/ */
public PermissionCheckResult checkUserOnlyPermission(User user, String permission) { public PermissionCheckResult checkUserOnlyPermission(User user, String permission) {
user.sortPermissions(); user.sortPermissions();
@@ -539,8 +616,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* Returns the node responsible for that permission. * Returns the node responsible for that permission. Does not include User's
* Does not include User's group permission. * group permission.
*
* @param group * @param group
* @param permission * @param permission
* @return the node if permission is found. if not found, return null * @return the node if permission is found. if not found, return null
@@ -569,34 +647,36 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Check permissions, including it's group and inheritance. * Check permissions, including it's group and inheritance.
*
* @param user * @param user
* @param permission * @param permission
* @return true if permission was found. false if not, or was negated. * @return true if permission was found. false if not, or was negated.
*/ */
public boolean checkUserPermission(User user, String permission) { public boolean checkUserPermission(User user, String permission) {
PermissionCheckResult result = checkFullUserPermission(user, permission); PermissionCheckResult result = checkFullUserPermission(user, permission);
if (result.resultType.equals(PermissionCheckResult.Type.EXCEPTION) if (result.resultType.equals(PermissionCheckResult.Type.EXCEPTION) || result.resultType.equals(PermissionCheckResult.Type.FOUND)) {
|| result.resultType.equals(PermissionCheckResult.Type.FOUND)) {
return true; return true;
} }
if (Bukkit.getPlayer(user.getName()).hasPermission(permission)) if ((Bukkit.getPlayer(user.getName()) != null) && (Bukkit.getPlayer(user.getName()).hasPermission(permission)))
return true; return true;
return false; return false;
} }
/** /**
* Do what checkUserPermission did before. But now returning a PermissionCheckResult. * Do what checkUserPermission did before. But now returning a
* PermissionCheckResult.
*
* @param user * @param user
* @param targetPermission * @param targetPermission
* @return * @return PermissionCheckResult
*/ */
public PermissionCheckResult checkFullUserPermission(User user, String targetPermission) { public PermissionCheckResult checkFullUserPermission(User user, String targetPermission) {
PermissionCheckResult result = new PermissionCheckResult(); PermissionCheckResult result = new PermissionCheckResult();
result.askedPermission = targetPermission; result.askedPermission = targetPermission;
result.resultType = PermissionCheckResult.Type.NOTFOUND; result.resultType = PermissionCheckResult.Type.NOTFOUND;
if (user == null || targetPermission == null) { if (user == null || targetPermission == null || targetPermission.isEmpty()) {
return result; return result;
} }
@@ -605,13 +685,13 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
return resultUser; return resultUser;
} }
//IT ONLY CHECKS GROUPS PERMISSIONS IF RESULT FOR USER IS NOT FOUND // IT ONLY CHECKS GROUPS PERMISSIONS IF RESULT FOR USER IS NOT FOUND
PermissionCheckResult resultGroup = checkGroupPermissionWithInheritance(user.getGroup(), targetPermission); PermissionCheckResult resultGroup = checkGroupPermissionWithInheritance(user.getGroup(), targetPermission);
if (!resultGroup.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { if (!resultGroup.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
return resultGroup; return resultGroup;
} }
//SUBGROUPS CHECK // SUBGROUPS CHECK
for (Group subGroup : user.subGroupListCopy()) { for (Group subGroup : user.subGroupListCopy()) {
PermissionCheckResult resultSubGroup = checkGroupPermissionWithInheritance(subGroup, targetPermission); PermissionCheckResult resultSubGroup = checkGroupPermissionWithInheritance(subGroup, targetPermission);
if (!resultSubGroup.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { if (!resultSubGroup.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
@@ -619,13 +699,13 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
} }
if (Bukkit.getPlayer(user.getName()).hasPermission(targetPermission)) { if ((Bukkit.getPlayer(user.getName()) != null) && (Bukkit.getPlayer(user.getName()).hasPermission(targetPermission))) {
result.resultType = PermissionCheckResult.Type.FOUND; result.resultType = PermissionCheckResult.Type.FOUND;
result.owner = user; result.owner = user;
return result; return result;
} }
//THEN IT RETURNS A NOT FOUND // THEN IT RETURNS A NOT FOUND
return result; return result;
} }
@@ -639,7 +719,8 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @param variable * @param variable
* @param alreadyChecked * @param alreadyChecked
* @return returns the closest inherited group with the variable. * @return returns the closest inherited group with the variable.
* @deprecated use now nextGroupWithVariable(Group start, String targetVariable) * @deprecated use now nextGroupWithVariable(Group start, String
* targetVariable)
*/ */
@Deprecated @Deprecated
public Group nextGroupWithVariable(Group start, String variable, List<Group> alreadyChecked) { public Group nextGroupWithVariable(Group start, String variable, List<Group> alreadyChecked) {
@@ -652,8 +733,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* *
* It does Breadth-first search * It does Breadth-first search
* *
* @param start the starting group to look for * @param start
* @param targetVariable the variable name * the starting group to look for
* @param targetVariable
* the variable name
* @return The group if found. Null if not. * @return The group if found. Null if not.
*/ */
public Group nextGroupWithVariable(Group start, String targetVariable) { public Group nextGroupWithVariable(Group start, String targetVariable) {
@@ -686,11 +769,15 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* redirected to the other method. this is deprecated now. and will be gone * redirected to the other method. this is deprecated now. and will be gone
* in the future releases. * in the future releases.
* *
* @param start The group to start the search. * @param start
* @param askedGroup Name of the group you're looking for * The group to start the search.
* @param alreadyChecked groups to ignore(pass null on it, please) * @param askedGroup
* Name of the group you're looking for
* @param alreadyChecked
* groups to ignore(pass null on it, please)
* @return true if it inherits the group. * @return true if it inherits the group.
* @deprecated prefer using hasGroupInInheritance(Group start, String askedGroup) * @deprecated prefer using hasGroupInInheritance(Group start, String
* askedGroup)
*/ */
@Deprecated @Deprecated
public boolean searchGroupInInheritance(Group start, String askedGroup, List<Group> alreadyChecked) { public boolean searchGroupInInheritance(Group start, String askedGroup, List<Group> alreadyChecked) {
@@ -702,8 +789,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* *
* It does Breadth-first search * It does Breadth-first search
* *
* @param start The group to start the search. * @param start
* @param askedGroup Name of the group you're looking for * The group to start the search.
* @param askedGroup
* Name of the group you're looking for
* @return true if it inherits the group. * @return true if it inherits the group.
*/ */
public boolean hasGroupInInheritance(Group start, String askedGroup) { public boolean hasGroupInInheritance(Group start, String askedGroup) {
@@ -732,36 +821,36 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Check if the group has given permission. Including it's inheritance * Check if the group has given permission. Including it's inheritance
*
* @param start * @param start
* @param permission * @param permission
* @param alreadyChecked * @param alreadyChecked
* @return true if PermissionCheckResult is EXCEPTION or FOUND * @return true if PermissionCheckResult is EXCEPTION or FOUND
* @deprecated use the other checkGroupPermissionWithInheritance for everything * @deprecated use the other checkGroupPermissionWithInheritance for
* everything
*/ */
@Deprecated @Deprecated
public boolean checkGroupPermissionWithInheritance(Group start, String permission, List<Group> alreadyChecked) { public boolean checkGroupPermissionWithInheritance(Group start, String permission, List<Group> alreadyChecked) {
PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission); PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission);
if (result.resultType.equals(Type.EXCEPTION) if (result.resultType.equals(Type.EXCEPTION) || result.resultType.equals(Type.FOUND)) {
|| result.resultType.equals(Type.FOUND)) {
return true; return true;
} }
return false; return false;
} }
/** /**
* Returns the result of permission check. Including inheritance. * Returns the result of permission check. Including inheritance. If found
* If found anything, the PermissionCheckResult that retuns will * anything, the PermissionCheckResult that retuns will include the Group
* include the Group name, and the result type. * name, and the result type. Result types will be EXCEPTION, NEGATION,
* Result types will be EXCEPTION, NEGATION, FOUND. * FOUND.
* *
* If returned type NOTFOUND, the owner will be null, * If returned type NOTFOUND, the owner will be null, and ownerType too.
* and ownerType too.
* *
* It does Breadth-first search * It does Breadth-first search
* *
* @param start * @param start
* @param targetPermission * @param targetPermission
* @return * @return PermissionCheckResult
*/ */
public PermissionCheckResult checkGroupPermissionWithInheritance(Group start, String targetPermission) { public PermissionCheckResult checkGroupPermissionWithInheritance(Group start, String targetPermission) {
if (start == null || targetPermission == null) { if (start == null || targetPermission == null) {
@@ -792,8 +881,8 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
/** /**
* It uses checkGroupPermissionWithInheritance * It uses checkGroupPermissionWithInheritance and cast the owner to Group
* and cast the owner to Group type if result type was EXCEPTION or FOUND. * type if result type was EXCEPTION or FOUND.
* *
* @param start * @param start
* @param permission * @param permission
@@ -804,8 +893,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
@Deprecated @Deprecated
public Group nextGroupWithPermission(Group start, String permission, List<Group> alreadyChecked) { public Group nextGroupWithPermission(Group start, String permission, List<Group> alreadyChecked) {
PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission); PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission);
if (result.resultType.equals(Type.EXCEPTION) if (result.resultType.equals(Type.EXCEPTION) || result.resultType.equals(Type.FOUND)) {
|| result.resultType.equals(Type.FOUND)) {
return (Group) checkGroupPermissionWithInheritance(start, permission).owner; return (Group) checkGroupPermissionWithInheritance(start, permission).owner;
} }
return null; return null;
@@ -815,8 +903,8 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* Return whole list of names of groups in a inheritance chain. Including a * Return whole list of names of groups in a inheritance chain. Including a
* starting group. * starting group.
* *
* it now redirects to the other method. but get away from this one, * it now redirects to the other method. but get away from this one, it will
* it will disappear in a future release. * disappear in a future release.
* *
* @param start * @param start
* @param alreadyChecked * @param alreadyChecked
@@ -860,17 +948,17 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* Compare a user permission like 'myplugin.*' against a full plugin * Compare a user permission like 'myplugin.*' against a full plugin
* permission name, like 'myplugin.dosomething'. * permission name, like 'myplugin.dosomething'. As the example above, will
* As the example above, will return true. * return true.
* *
* Please sort permissions before sending them here. So negative tokens * Please sort permissions before sending them here. So negative tokens get
* get priority. * priority.
* *
* You must test if it start with negative outside this method. It will * You must test if it start with negative outside this method. It will only
* only tell if the nodes are matching or not. * tell if the nodes are matching or not.
* *
* Every '-' or '+' in the beginning is ignored. It will match only * Every '-' or '+' in the beginning is ignored. It will match only node
* node names. * names.
* *
* @param userAcessLevel * @param userAcessLevel
* @param fullPermissionName * @param fullPermissionName
@@ -894,7 +982,6 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
fullPermissionName = fullPermissionName.substring(1); fullPermissionName = fullPermissionName.substring(1);
} }
StringTokenizer levelATokenizer = new StringTokenizer(userAcessLevel, "."); StringTokenizer levelATokenizer = new StringTokenizer(userAcessLevel, ".");
StringTokenizer levelBTokenizer = new StringTokenizer(fullPermissionName, "."); StringTokenizer levelBTokenizer = new StringTokenizer(fullPermissionName, ".");
while (levelATokenizer.hasMoreTokens() && levelBTokenizer.hasMoreTokens()) { while (levelATokenizer.hasMoreTokens() && levelBTokenizer.hasMoreTokens()) {
@@ -926,8 +1013,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* Returns a list of all groups. * Returns a list of all groups.
* *
* Including subgroups. * Including subgroups.
*
* @param userName * @param userName
* @return * @return String[] of all group names.
*/ */
@Override @Override
public String[] getGroups(String userName) { public String[] getGroups(String userName) {
@@ -935,6 +1023,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
for (Group subg : ph.getUser(userName).subGroupListCopy()) { for (Group subg : ph.getUser(userName).subGroupListCopy()) {
allGroups.addAll(listAllGroupsInherited(subg)); allGroups.addAll(listAllGroupsInherited(subg));
} }
String[] arr = new String[allGroups.size()]; String[] arr = new String[allGroups.size()];
return allGroups.toArray(arr); return allGroups.toArray(arr);
} }
@@ -942,8 +1031,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/** /**
* A Breadth-first search thru inheritance model. * A Breadth-first search thru inheritance model.
* *
* Just a model to copy and paste. * Just a model to copy and paste. This will guarantee the closer groups
* This will guarantee the closer groups will be checked first. * will be checked first.
*
* @param start * @param start
* @param targerPermission * @param targerPermission
* @return * @return
@@ -960,8 +1050,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
while (!stack.isEmpty()) { while (!stack.isEmpty()) {
Group now = stack.pop(); Group now = stack.pop();
PermissionCheckResult resultNow = checkGroupOnlyPermission(now, targerPermission); PermissionCheckResult resultNow = checkGroupOnlyPermission(now, targerPermission);
if (resultNow.resultType.equals(PermissionCheckResult.Type.EXCEPTION) if (resultNow.resultType.equals(PermissionCheckResult.Type.EXCEPTION) || resultNow.resultType.equals(PermissionCheckResult.Type.FOUND)) {
|| resultNow.resultType.equals(PermissionCheckResult.Type.FOUND)) {
return now; return now;
} }
if (resultNow.resultType.equals(PermissionCheckResult.Type.NEGATION)) { if (resultNow.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
@@ -984,8 +1073,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
@Override @Override
public String getInfoString(String entryName, String path, public String getInfoString(String entryName, String path, boolean isGroup) {
boolean isGroup) {
if (isGroup) { if (isGroup) {
Group data = ph.getGroup(entryName); Group data = ph.getGroup(entryName);
if (data == null) { if (data == null) {
@@ -1002,8 +1090,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
@Override @Override
public int getInfoInteger(String entryName, String path, public int getInfoInteger(String entryName, String path, boolean isGroup) {
boolean isGroup) {
if (isGroup) { if (isGroup) {
Group data = ph.getGroup(entryName); Group data = ph.getGroup(entryName);
if (data == null) { if (data == null) {
@@ -1020,8 +1107,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
@Override @Override
public double getInfoDouble(String entryName, String path, public double getInfoDouble(String entryName, String path, boolean isGroup) {
boolean isGroup) {
if (isGroup) { if (isGroup) {
Group data = ph.getGroup(entryName); Group data = ph.getGroup(entryName);
if (data == null) { if (data == null) {
@@ -1039,8 +1125,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
} }
@Override @Override
public boolean getInfoBoolean(String entryName, String path, public boolean getInfoBoolean(String entryName, String path, boolean isGroup) {
boolean isGroup) {
if (isGroup) { if (isGroup) {
Group data = ph.getGroup(entryName); Group data = ph.getGroup(entryName);
if (data == null) { if (data == null) {

View File

@@ -187,7 +187,7 @@ public class BukkitPermissions {
* null is empty * null is empty
* *
* @param node * @param node
* @return * @return Map of child permissions
*/ */
public Map<String, Boolean> getChildren(String node) { public Map<String, Boolean> getChildren(String node) {
for (Permission permission : registeredPermissions) { for (Permission permission : registeredPermissions) {

View File

@@ -16,6 +16,7 @@ import org.bukkit.entity.Player;
* *
* @author Nijikokun * @author Nijikokun
* @author Gabriel Couto * @author Gabriel Couto
* @author ElgarL
*/ */
public abstract class PermissionsReaderInterface { public abstract class PermissionsReaderInterface {
@@ -23,7 +24,7 @@ public abstract class PermissionsReaderInterface {
* *
* @param player * @param player
* @param string * @param string
* @return * @return true if has permission
*/ */
public abstract boolean has(Player player, String string); public abstract boolean has(Player player, String string);
@@ -31,141 +32,141 @@ public abstract class PermissionsReaderInterface {
* *
* @param player * @param player
* @param string * @param string
* @return * @return true if has permission
*/ */
public abstract boolean permission(Player player, String string); public abstract boolean permission(Player player, String string);
/** /**
* *
* @param string * @param userName
* @return * @return group name for this player.
*/ */
public abstract String getGroup(String string); public abstract String getGroup(String userName);
/** /**
* *
* @param string * @param userName
* @param string1 * @param groupName
* @return * @return true if in group
*/ */
public abstract boolean inGroup(String string, String string1); public abstract boolean inGroup(String userName, String groupName);
/** /**
* *
* @param string * @param groupName
* @return * @return String of prefix
*/ */
public abstract String getGroupPrefix(String string); public abstract String getGroupPrefix(String groupName);
/** /**
* *
* @param string * @param groupName
* @return * @return String of suffix
*/ */
public abstract String getGroupSuffix(String string); public abstract String getGroupSuffix(String groupName);
/** /**
* *
* @param string * @param groupName
* @return * @return true if can build
*/ */
public abstract boolean canGroupBuild(String string); public abstract boolean canGroupBuild(String groupName);
/** /**
* *
* @param string * @param groupName
* @param string1 * @param node
* @return * @return String value
*/ */
public abstract String getGroupPermissionString(String string, String string1); public abstract String getGroupPermissionString(String groupName, String node);
/** /**
* *
* @param string * @param groupName
* @param string1 * @param node
* @return * @return integer value
*/ */
public abstract int getGroupPermissionInteger(String string, String string1); public abstract int getGroupPermissionInteger(String groupName, String node);
/** /**
* *
* @param string * @param groupName
* @param string1 * @param node
* @return * @return boolean value
*/ */
public abstract boolean getGroupPermissionBoolean(String string, String string1); public abstract boolean getGroupPermissionBoolean(String groupName, String node);
/** /**
* *
* @param string * @param groupName
* @param string1 * @param node
* @return * @return double value
*/ */
public abstract double getGroupPermissionDouble(String string, String string1); public abstract double getGroupPermissionDouble(String groupName, String node);
/** /**
* *
* @param string * @param userName
* @param string1 * @param node
* @return * @return String value
*/ */
public abstract String getUserPermissionString(String string, String string1); public abstract String getUserPermissionString(String userName, String node);
/** /**
* *
* @param string * @param userName
* @param string1 * @param node
* @return * @return integer value
*/ */
public abstract int getUserPermissionInteger(String string, String string1); public abstract int getUserPermissionInteger(String userName, String node);
/** /**
* *
* @param string * @param userName
* @param string1 * @param node
* @return * @return boolean value
*/ */
public abstract boolean getUserPermissionBoolean(String string, String string1); public abstract boolean getUserPermissionBoolean(String userName, String node);
/** /**
* *
* @param string * @param userName
* @param string1 * @param node
* @return * @return double value
*/ */
public abstract double getUserPermissionDouble(String string, String string1); public abstract double getUserPermissionDouble(String userName, String node);
/** /**
* *
* @param string * @param userName
* @param string1 * @param node
* @return * @return String value
*/ */
public abstract String getPermissionString(String string, String string1); public abstract String getPermissionString(String userName, String node);
/** /**
* *
* @param string * @param userName
* @param string1 * @param node
* @return * @return integer value
*/ */
public abstract int getPermissionInteger(String string, String string1); public abstract int getPermissionInteger(String userName, String node);
/** /**
* *
* @param string * @param userName
* @param string1 * @param node
* @return * @return boolean value
*/ */
public abstract boolean getPermissionBoolean(String string, String string1); public abstract boolean getPermissionBoolean(String userName, String node);
/** /**
* *
* @param string * @param userName
* @param string1 * @param node
* @return * @return double value
*/ */
public abstract double getPermissionDouble(String string, String string1); public abstract double getPermissionDouble(String userName, String node);
///////////////////////////// /////////////////////////////
/** /**
@@ -173,7 +174,7 @@ public abstract class PermissionsReaderInterface {
* This method is a utility method for chat plugins to get the user's prefix * This method is a utility method for chat plugins to get the user's prefix
* without having to look at every one of the user's ancestors. * without having to look at every one of the user's ancestors.
* Returns an empty string if user has no parent groups. * Returns an empty string if user has no parent groups.
* @param world Player's world *
* @param user Player's name * @param user Player's name
* @return Player's prefix * @return Player's prefix
*/ */
@@ -184,7 +185,7 @@ public abstract class PermissionsReaderInterface {
* This method is a utility method for chat plugins to get the user's suffix * This method is a utility method for chat plugins to get the user's suffix
* without having to look at every one of the user's ancestors. * without having to look at every one of the user's ancestors.
* Returns an empty string if user has no parent groups. * Returns an empty string if user has no parent groups.
* @param world Player's world *
* @param user Player's name * @param user Player's name
* @return Player's suffix * @return Player's suffix
*/ */
@@ -215,7 +216,7 @@ public abstract class PermissionsReaderInterface {
* @param entryName * @param entryName
* @param path * @param path
* @param isGroup * @param isGroup
* @return * @return -1 if not found
*/ */
public abstract double getInfoDouble(String entryName, String path, boolean isGroup); public abstract double getInfoDouble(String entryName, String path, boolean isGroup);
//public abstract double getInfoDouble(String entryName, String path, boolean isGroup, Comparator<Double> comparator); //public abstract double getInfoDouble(String entryName, String path, boolean isGroup, Comparator<Double> comparator);