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

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

View file

@ -54,3 +54,19 @@ v 1.5:
- Better commenting in config.yml
- Fixed GM to recognize Superperm 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.
bukkit_perms_override: false
# Default setting for 'mantoglevalidate'
# true will cause GroupManager to attempt name matching by default.
validate_toggle: true
data:
save:
# 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: true
permissions:
- essentials.help
- essentials.helpop
- essentials.list
- essentials.motd
- essentials.rules
- essentials.spawn
- groupmanager.notify.self
inheritance: []
- -bukkit.command.kill
inheritance:
- g:essentials_default
- g:bukkit_default
info:
prefix: '&e'
build: false
suffix: ''
Builder:
default: false
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
permissions: []
inheritance:
- default
- g:essentials_builder
info:
prefix: '&2'
build: true
suffix: ''
Moderator:
default: false
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
permissions: []
inheritance:
- builder
- g:essentials_moderator
- g:bukkit_moderator
info:
prefix: '&5'
build: true
suffix: ''
Admin:
default: false
permissions:
- -essentials.backup
- -essentials.essentials
- -essentials.setspawn
- -essentials.reloadall
- -essentials.plugin
- essentials.*
- groupmanager.mantogglevalidate
- groupmanager.mansave
- groupmanager.mangcheckp
- groupmanager.manglistp
- groupmanager.manucheckp
- groupmanager.manulistp
permissions: []
inheritance:
- moderator
- g:essentials_admin
- g:bukkit_admin
info:
prefix: '&c'
build: true

View file

@ -48,7 +48,10 @@ public class GMConfiguration {
} catch (Exception ex) {
throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex);
}
// Setup defaults
adjustLoggerLevel();
plugin.setValidateOnlinePlayer(isToggleValidate());
}
public boolean isOpOverride() {
@ -57,6 +60,9 @@ public class GMConfiguration {
public boolean isBukkitPermsOverride() {
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() {
// 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

@ -47,7 +47,7 @@ import org.bukkit.plugin.java.JavaPlugin;
*/
public class GroupManager extends JavaPlugin {
private File configFile;
// private File configFile;
private File backupFolder;
private Runnable commiter;
private ScheduledThreadPoolExecutor scheduler;
@ -55,9 +55,26 @@ public class GroupManager extends JavaPlugin {
private Map<CommandSender, String> selectedWorlds = new HashMap<CommandSender, String>();
private WorldsHolder worldsHolder;
private boolean validateOnlinePlayer = true;
/**
* @return the validateOnlinePlayer
*/
public boolean isValidateOnlinePlayer() {
return validateOnlinePlayer;
}
/**
* @param validateOnlinePlayer the validateOnlinePlayer to set
*/
public void setValidateOnlinePlayer(boolean validateOnlinePlayer) {
this.validateOnlinePlayer = validateOnlinePlayer;
}
private boolean isReady = false;
private static boolean isLoaded = false;
protected GMConfiguration config;
protected static GlobalGroups globalGroups;
private GMLoggerHandler ch;
public static BukkitPermissions BukkitPermissions;
private static WorldListener WorldEvents;
@ -71,15 +88,20 @@ public class GroupManager extends JavaPlugin {
public void onDisable() {
setLoaded(false);
disableScheduler(); // Shutdown before we save, so it doesn't interfere.
if (worldsHolder != null) {
worldsHolder.saveChanges();
try {
worldsHolder.saveChanges(false);
} catch (IllegalStateException ex) {
GroupManager.logger.log(Level.WARNING, ex.getMessage());
}
}
disableScheduler();
WorldEvents = null;
BukkitPermissions = null;
// EXAMPLE: Custom code, here we just output some info so we can check all is well
// EXAMPLE: Custom code, here we just output some info so we can check
// all is well
PluginDescriptionFile pdfFile = this.getDescription();
System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is disabled!");
GroupManager.logger.removeHandler(ch);
@ -92,8 +114,12 @@ public class GroupManager extends JavaPlugin {
GroupManager.logger.addHandler(ch);
logger.setLevel(Level.ALL);
if (worldsHolder == null) {
// Create the backup folder, if it doesn't exist.
prepareFileFields();
// Load the config.yml
prepareConfig();
// Load the global groups
globalGroups = new GlobalGroups(this);
worldsHolder = new WorldsHolder(this);
}
@ -104,15 +130,16 @@ public class GroupManager extends JavaPlugin {
throw new IllegalStateException("An error ocurred while loading GroupManager");
}
// Initialize the world listener and bukkit permissions to handle events.
// Initialize the world listener and bukkit permissions to handle
// events.
WorldEvents = new GMWorldListener(this);
BukkitPermissions = new BukkitPermissions(this);
enableScheduler();
/*
* Schedule a Bukiit Permissions update for 1 tick later.
* All plugins will be loaded by then
* Schedule a Bukiit Permissions update for 1 tick later. All plugins
* will be loaded by then
*/
if (getServer().getScheduler().scheduleSyncDelayedTask(this, new BukkitPermsUpdateTask(), 1) == -1) {
@ -123,8 +150,6 @@ public class GroupManager extends JavaPlugin {
System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!");
}
public static boolean isLoaded() {
return isLoaded;
}
@ -138,7 +163,7 @@ public class GroupManager extends JavaPlugin {
}
private void prepareFileFields() {
configFile = new File(this.getDataFolder(), "config.yml");
// configFile = new File(this.getDataFolder(), "config.yml");
backupFolder = new File(this.getDataFolder(), "backup");
if (!backupFolder.exists()) {
getBackupFolder().mkdirs();
@ -156,13 +181,22 @@ public class GroupManager extends JavaPlugin {
@Override
public void run() {
worldsHolder.saveChanges();
try {
worldsHolder.saveChanges(false);
GroupManager.logger.log(Level.INFO, " Data files refreshed.");
} catch (IllegalStateException ex) {
GroupManager.logger.log(Level.WARNING, ex.getMessage());
}
}
};
scheduler = new ScheduledThreadPoolExecutor(1);
int minutes = getGMConfig().getSaveInterval();
long minutes = (long)getGMConfig().getSaveInterval();
if (minutes > 0) {
scheduler.scheduleAtFixedRate(commiter, minutes, minutes, TimeUnit.MINUTES);
GroupManager.logger.info("Scheduled Data Saving is set for every " + minutes + " minutes!");
} else
GroupManager.logger.info("Scheduled Data Saving is Disabled!");
GroupManager.logger.info("Backups will be retained for " + getGMConfig().getBackupDuration() + " hours!");
}
}
@ -181,8 +215,7 @@ public class GroupManager extends JavaPlugin {
}
/**
* Use the WorldsHolder saveChanges directly instead
* Saves the data on file
* Use the WorldsHolder saveChanges directly instead Saves the data on file
*/
@Deprecated
public void commit() {
@ -192,8 +225,7 @@ public class GroupManager extends JavaPlugin {
}
/**
* Use worlds holder to reload a specific world
* Reloads the data
* Use worlds holder to reload a specific world Reloads the data
*/
@Deprecated
public void reload() {
@ -206,7 +238,8 @@ public class GroupManager extends JavaPlugin {
/**
* The handler in the interface created by AnjoCaido
* @return
*
* @return AnjoPermissionsHandler
*/
@Deprecated
public AnjoPermissionsHandler getPermissionHandler() {
@ -216,6 +249,7 @@ public class GroupManager extends JavaPlugin {
/**
* A simple interface, for ones that don't want to mess with overloading.
* Yet it is affected by overloading. But seamless.
*
* @return the dataholder with all information
*/
@Deprecated
@ -225,6 +259,7 @@ public class GroupManager extends JavaPlugin {
/**
* Use this if you want to play with overloading.
*
* @return a dataholder with overloading interface
*/
@Deprecated
@ -234,6 +269,7 @@ public class GroupManager extends JavaPlugin {
/**
* Called when a command registered by this plugin is received.
*
* @param sender
* @param cmd
* @param args
@ -248,7 +284,6 @@ public class GroupManager extends JavaPlugin {
User senderUser = null;
boolean isOpOverride = config.isOpOverride();
// DETERMINING PLAYER INFORMATION
if (sender instanceof Player) {
senderPlayer = (Player) sender;
@ -283,7 +318,6 @@ public class GroupManager extends JavaPlugin {
// VARIABLES USED IN COMMANDS
int count;
PermissionCheckResult permissionResult = null;
ArrayList<User> removeList = null;
@ -374,7 +408,8 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' group to '" + auxGroup.getName() + "'.");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) BukkitPermissions.updatePermissions(targetPlayer);
if (targetPlayer != null)
BukkitPermissions.updatePermissions(targetPlayer);
return true;
// break;
@ -411,7 +446,8 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' to default settings.");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) BukkitPermissions.updatePermissions(targetPlayer);
if (targetPlayer != null)
BukkitPermissions.updatePermissions(targetPlayer);
return true;
case manuaddsub:
@ -455,7 +491,8 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' group to '" + auxGroup.getName() + "'.");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) BukkitPermissions.updatePermissions(targetPlayer);
if (targetPlayer != null)
BukkitPermissions.updatePermissions(targetPlayer);
return true;
case manudelsub:
@ -497,7 +534,8 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "You removed subgroup '" + auxGroup.getName() + "' from player '" + auxUser.getName() + "' list.");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) BukkitPermissions.updatePermissions(targetPlayer);
if (targetPlayer != null)
BukkitPermissions.updatePermissions(targetPlayer);
return true;
case mangadd:
@ -573,8 +611,7 @@ public class GroupManager extends JavaPlugin {
return false;
}
permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]);
if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)
|| permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
sender.sendMessage(ChatColor.RED + "Can't add a permission you don't have.");
return false;
}
@ -608,7 +645,8 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "You added '" + args[1] + "' to player '" + auxUser.getName() + "' permissions.");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) BukkitPermissions.updatePermissions(targetPlayer);
if (targetPlayer != null)
BukkitPermissions.updatePermissions(targetPlayer);
return true;
// break;
@ -641,8 +679,7 @@ public class GroupManager extends JavaPlugin {
return false;
}
permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]);
if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)
|| permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have.");
return false;
}
@ -662,7 +699,8 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "You removed '" + args[1] + "' from player '" + auxUser.getName() + "' permissions.");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) BukkitPermissions.updatePermissions(targetPlayer);
if (targetPlayer != null)
BukkitPermissions.updatePermissions(targetPlayer);
return true;
// break;
@ -732,7 +770,6 @@ public class GroupManager extends JavaPlugin {
}
}
return true;
case manucheckp:
// VALIDANDO ESTADO DO SENDER
@ -767,7 +804,8 @@ public class GroupManager extends JavaPlugin {
return false;
}
// PARECE OK
//auxString = permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
// auxString =
// permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
if (permissionResult.owner instanceof User) {
if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
sender.sendMessage(ChatColor.RED + "The user has directly a negation node for that permission.");
@ -789,7 +827,6 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "SuperPerms reports Node: " + targetPlayer.hasPermission(args[1]));
}
return true;
case mangaddp:
// VALIDANDO ESTADO DO SENDER
@ -809,8 +846,7 @@ public class GroupManager extends JavaPlugin {
}
// VALIDANDO SUA PERMISSAO
permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]);
if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)
|| permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
sender.sendMessage(ChatColor.RED + "Can't add a permission you don't have.");
return false;
}
@ -864,8 +900,7 @@ public class GroupManager extends JavaPlugin {
}
// VALIDANDO SUA PERMISSAO
permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]);
if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)
|| permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have.");
return false;
}
@ -958,7 +993,8 @@ public class GroupManager extends JavaPlugin {
return false;
}
// PARECE OK
//auxString = permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
// auxString =
// permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
if (permissionResult.owner instanceof Group) {
if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
sender.sendMessage(ChatColor.RED + "The group inherits the a negation permission from group: " + permissionResult.owner.getName());
@ -1167,11 +1203,18 @@ public class GroupManager extends JavaPlugin {
}
// VALIDANDO PERMISSAO
auxGroup = auxUser.getGroup();
auxGroup2 = permissionHandler.nextGroupWithVariable(auxGroup, args[1], null);
auxGroup2 = permissionHandler.nextGroupWithVariable(auxGroup, args[1]);
if (!auxUser.getVariables().hasVar(args[1])) {
// Check sub groups
if (!auxUser.isSubGroupsEmpty() && auxGroup2 == null)
for (Group subGroup : auxUser.subGroupListCopy()) {
auxGroup2 = permissionHandler.nextGroupWithVariable(subGroup, args[1]);
if (auxGroup2 != null) continue;
}
if (auxGroup2 == null) {
sender.sendMessage(ChatColor.RED + "The user doesn't have access to that variable!");
return false;
}
}
// PARECE OK
@ -1470,9 +1513,20 @@ public class GroupManager extends JavaPlugin {
return true;
case mansave:
worldsHolder.saveChanges();
boolean forced = false;
if ((args.length == 1) && (args[0].equalsIgnoreCase("force")))
forced = true;
try {
worldsHolder.saveChanges(forced);
sender.sendMessage(ChatColor.YELLOW + " The changes were saved.");
} catch (IllegalStateException ex) {
sender.sendMessage(ChatColor.RED + ex.getMessage());
}
return true;
case manload:
// THIS CASE DONT NEED SENDER
if (args.length > 0) {
@ -1537,6 +1591,9 @@ public class GroupManager extends JavaPlugin {
for (Group g : dataHolder.getGroupList()) {
auxString += g.getName() + ", ";
}
for (Group g : getGlobalGroups().getGroupList()) {
auxString += g.getName() + ", ";
}
if (auxString.lastIndexOf(",") > 0) {
auxString = auxString.substring(0, auxString.lastIndexOf(","));
}
@ -1597,7 +1654,8 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "You changed " + auxUser.getName() + " group to " + auxGroup.getName() + ".");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) BukkitPermissions.updatePermissions(targetPlayer);
if (targetPlayer != null)
BukkitPermissions.updatePermissions(targetPlayer);
return true;
// break;
@ -1656,7 +1714,8 @@ public class GroupManager extends JavaPlugin {
sender.sendMessage(ChatColor.YELLOW + "You changed " + auxUser.getName() + " group to " + auxGroup.getName() + ".");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) BukkitPermissions.updatePermissions(targetPlayer);
if (targetPlayer != null)
BukkitPermissions.updatePermissions(targetPlayer);
return true;
// break;
@ -1759,11 +1818,9 @@ public class GroupManager extends JavaPlugin {
}
/**
* Send confirmation of a group change.
* using permission nodes...
* Send confirmation of a group change. using permission nodes...
*
* groupmanager.notify.self
* groupmanager.notify.other
* groupmanager.notify.self groupmanager.notify.other
*
* @param name
* @param msg
@ -1776,8 +1833,7 @@ public class GroupManager extends JavaPlugin {
if (!test.equals(player)) {
if (test.hasPermission("groupmanager.notify.other"))
test.sendMessage(ChatColor.YELLOW + name + " was" + msg);
} else
if ((player != null) && ((player.hasPermission("groupmanager.notify.self")) || (player.hasPermission("groupmanager.notify.other"))))
} else if ((player != null) && ((player.hasPermission("groupmanager.notify.self")) || (player.hasPermission("groupmanager.notify.other"))))
player.sendMessage(ChatColor.YELLOW + "You were" + msg);
}
@ -1796,4 +1852,9 @@ public class GroupManager extends JavaPlugin {
public File getBackupFolder() {
return backupFolder;
}
public static GlobalGroups getGlobalGroups() {
return globalGroups;
}
}

View file

@ -26,6 +26,10 @@ public abstract class DataUnit {
this.name = name;
}
public DataUnit(String name) {
this.name = name;
}
/**
* Every group is matched only by their names and DataSources names.
* @param o
@ -64,7 +68,15 @@ public abstract class DataUnit {
}
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()){
// GroupManager.logger.finest(st.toString());
// }
@ -76,7 +88,15 @@ public abstract class DataUnit {
}
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;
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -49,16 +49,19 @@ public class WorldDataHolder {
* The actual users holder
*/
protected Map<String, User> users = new HashMap<String, User>();
/**
* Points to the default group
*/
protected Group defaultGroup = null;
/**
* The file, which this class loads/save data from/to
* @deprecated
*/
@Deprecated
protected File f;
/**
*
*/
@ -79,6 +82,15 @@ public class WorldDataHolder {
*
*/
protected boolean haveGroupsChanged = false;
/**
*
*/
protected long timeStampGroups = 0;
/**
*
*/
protected long timeStampUsers = 0;
/**
* Prevent direct instantiation
@ -151,7 +163,7 @@ public class WorldDataHolder {
/**
*
* @param userName
* @return
* @return true if we have data for this player.
*/
public boolean isUserDeclared(String userName) {
return users.containsKey(userName.toLowerCase());
@ -183,6 +195,9 @@ public class WorldDataHolder {
* @return a group if it is found. null if not found.
*/
public Group getGroup(String groupName) {
if (groupName.startsWith("g:"))
return GroupManager.getGlobalGroups().getGroup(groupName);
else
return groups.get(groupName.toLowerCase());
}
@ -193,6 +208,9 @@ public class WorldDataHolder {
* @return true if exists. false if not.
*/
public boolean groupExists(String groupName) {
if (groupName.startsWith("g:"))
return GroupManager.getGlobalGroups().hasGroup(groupName);
else
return groups.containsKey(groupName.toLowerCase());
}
@ -201,6 +219,11 @@ public class WorldDataHolder {
* @param groupToAdd
*/
public void addGroup(Group groupToAdd) {
if (groupToAdd.getName().startsWith("g:")) {
GroupManager.getGlobalGroups().addGroup(groupToAdd);
return;
}
if (groupToAdd.getDataSource() != 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
*/
public boolean removeGroup(String groupName) {
if (groupName.startsWith("g:")) {
return GroupManager.getGlobalGroups().removeGroup(groupName);
}
if (defaultGroup != null && groupName.equalsIgnoreCase(defaultGroup.getName())) {
return false;
}
@ -251,9 +278,15 @@ public class WorldDataHolder {
* @return null if group already exists. or new Group
*/
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())) {
return null;
}
Group newGroup = new Group(this, groupName);
this.addGroup(newGroup);
haveGroupsChanged = true;
@ -281,15 +314,35 @@ public class WorldDataHolder {
*/
public void reload() {
try {
WorldDataHolder ph = load(this.getName(), getGroupsFile(), getUsersFile());
this.defaultGroup = ph.defaultGroup;
this.groups = ph.groups;
this.users = ph.users;
reloadGroups();
reloadUsers();
} catch (Exception 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!
* @deprecated
@ -302,9 +355,11 @@ public class WorldDataHolder {
/**
* Returns a data holder for the given file
*
* @param worldName
* @param file
* @return
* @return a new WorldDataHolder
*
* @throws Exception
* @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 groupsFile
* @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 IOException
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public static WorldDataHolder load(String worldName, File groupsFile, File usersFile) throws FileNotFoundException, IOException {
WorldDataHolder ph = new WorldDataHolder(worldName);
ph.groupsFile = groupsFile;
ph.usersFile = usersFile;
protected static void loadGroups(WorldDataHolder ph, File groupsFile) throws FileNotFoundException, IOException {
//READ GROUPS FILE
Yaml yamlGroups = new Yaml(new SafeConstructor());
Map<String, Object> groupsRootDataNode;
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);
try {
@ -483,7 +578,7 @@ public class WorldDataHolder {
//PROCESS GROUPS FILE
Map<String, List<String>> inheritance = new HashMap<String, List<String>>();
try {
//try {
Map<String, Object> allGroupsNode = (Map<String, Object>) groupsRootDataNode.get("groups");
for (String groupKey : allGroupsNode.keySet()) {
Map<String, Object> thisGroupNode = (Map<String, Object>) allGroupsNode.get(groupKey);
@ -513,17 +608,22 @@ public class WorldDataHolder {
} else if (thisGroupNode.get("permissions") instanceof String) {
thisGrp.addPermission((String) thisGroupNode.get("permissions"));
} 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
if (thisGroupNode.get("info") instanceof Map) {
Map<String, Object> infoNode = (Map<String, Object>) thisGroupNode.get("info");
if (infoNode != null) {
thisGrp.setVariables(infoNode);
}
} else
throw new IllegalArgumentException("Unknown entry found in Info section for group: " + thisGrp.getName());
//END INFO NODE
if (thisGroupNode.get("inheritance") == null || thisGroupNode.get("inheritance") instanceof List) {
Object inheritNode = thisGroupNode.get("inheritance");
if (inheritNode == null) {
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) {
ex.printStackTrace();
throw new IllegalArgumentException("Your Permissions config file is invalid. See console for details.");
}
//} catch (Exception ex) {
// ex.printStackTrace();
// throw new IllegalArgumentException("Your Permissions config file is invalid. See console for details.");
//}
if (ph.defaultGroup == null) {
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
Yaml yamlUsers = new Yaml(new SafeConstructor());
Map<String, Object> usersRootDataNode;
if (!groupsFile.exists()) {
throw new IllegalArgumentException("The file which should contain permissions does not exist!\n" + usersFile.getPath());
if (!usersFile.exists()) {
throw new IllegalArgumentException("The file which should contain users does not exist!\n" + usersFile.getPath());
}
FileInputStream usersInputStream = new FileInputStream(usersFile);
try {
@ -581,7 +702,7 @@ public class WorldDataHolder {
// Stop loading if the file is empty
if (allUsersNode == null)
return ph;
return ;
for (String usersKey : allUsersNode.keySet()) {
Map<String, Object> thisUserNode = (Map<String, Object>) allUsersNode.get(usersKey);
@ -644,7 +765,13 @@ public class WorldDataHolder {
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;
try {
tx = new FileWriter(groupsFile, false);
@ -842,6 +974,12 @@ public class WorldDataHolder {
} catch (FileNotFoundException ex) {
}
}
// Update the LastModified time.
ph.usersFile = usersFile;
ph.setTimeStampUsers(usersFile.lastModified());
ph.removeUsersChangedFlag();
/*FileWriter tx = null;
try {
tx = new FileWriter(usersFile, false);
@ -894,7 +1032,7 @@ public class WorldDataHolder {
/**
*
* @return
* @return true if any user data has changed
*/
public boolean haveUsersChanged() {
if (haveUsersChanged) {
@ -910,7 +1048,7 @@ public class WorldDataHolder {
/**
*
* @return
* @return true if any group data has changed.
*/
public boolean haveGroupsChanged() {
if (haveGroupsChanged) {
@ -964,4 +1102,64 @@ public class WorldDataHolder {
public String getName() {
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.
*/
if (!worldsData.containsKey(folder.getName().toLowerCase())
|| !mirrors.containsKey(folder.getName().toLowerCase())) {
&& !mirrors.containsKey(folder.getName().toLowerCase())) {
loadWorld(folder.getName());
}
@ -149,6 +149,8 @@ public class WorldsHolder {
w.reload();
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() {
saveChanges(true);
}
/**
*
*/
public void saveChanges(boolean overwrite) {
ArrayList<WorldDataHolder> alreadyDone = new ArrayList<WorldDataHolder>();
Tasks.removeOldFiles(plugin, plugin.getBackupFolder());
for (OverloadedWorldHolder w : worldsData.values()) {
if (alreadyDone.contains(w)) {
continue;
}
Tasks.removeOldFiles(plugin, plugin.getBackupFolder());
if (w == null) {
GroupManager.logger.severe("WHAT HAPPENED?");
continue;
}
if (w.haveGroupsChanged()) {
//String groupsFolderName = w.getGroupsFile().getParentFile().getName();
File backupGroups = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + "_g_" + Tasks.getDateString() + ".yml");
try {
Tasks.copy(w.getGroupsFile(), backupGroups);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
if (overwrite || (!overwrite && (w.getTimeStampGroups() >= w.getGroupsFile().lastModified()))) {
// Backup Groups file
backupFile(w,true);
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()) {
File backupUsers = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + "_u_" + Tasks.getDateString() + ".yml");
try {
Tasks.copy(w.getUsersFile(), backupUsers);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
if (overwrite || (!overwrite && (w.getTimeStampUsers() >= w.getUsersFile().lastModified()))) {
// Backup Users file
backupFile(w,false);
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);
}
// 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.
*
* @param worldName
* @return
* @return OverloadedWorldHolder
*/
public OverloadedWorldHolder getWorldData(String worldName) {
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)
* @param p
* @return
* @param player
* @return OverloadedWorldHolder
*/
public OverloadedWorldHolder getWorldData(Player p) {
return getWorldData(p.getWorld().getName());
public OverloadedWorldHolder getWorldData(Player player) {
return getWorldData(player.getWorld().getName());
}
/**
* It does getWorld(worldName).getPermissionsHandler()
* @param worldName
* @return
* @return AnjoPermissionsHandler
*/
public AnjoPermissionsHandler getWorldPermissions(String worldName) {
return getWorldData(worldName).getPermissionsHandler();
}
/**
*It does getWorldData(p).getPermission
* @param p
* @return
* Returns the PermissionsHandler for this player data
* @param player
* @return AnjoPermissionsHandler
*/
public AnjoPermissionsHandler getWorldPermissions(Player p) {
return getWorldData(p).getPermissionsHandler();
public AnjoPermissionsHandler getWorldPermissions(Player player) {
return getWorldData(player).getPermissionsHandler();
}
/**
@ -352,7 +408,7 @@ public class WorldsHolder {
* Copies the specified world data to another world
* @param fromWorld
* @param toWorld
* @return
* @return true if successfully copied.
*/
public boolean cloneWorld(String fromWorld, String toWorld) {
File fromWorldFolder = new File(worldsFolder, fromWorld);
@ -401,6 +457,10 @@ public class WorldsHolder {
}
try {
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) {
GroupManager.logger.finest("Successful load of world " + worldName + "...");
worldsData.put(worldName.toLowerCase(), thisWorldData);
@ -454,7 +514,7 @@ public class WorldsHolder {
/**
* Returns all physically loaded worlds.
* @return
* @return ArrayList<OverloadedWorldHolder> of all loaded worlds
*/
public ArrayList<OverloadedWorldHolder> allWorldsDataList() {
ArrayList<OverloadedWorldHolder> list = new ArrayList<OverloadedWorldHolder>();

View file

@ -34,6 +34,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/**
* It needs a WorldDataHolder to work with.
*
* @param holder
*/
public AnjoPermissionsHandler(WorldDataHolder holder) {
@ -42,9 +43,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/**
* A short name method, for permission method.
*
* @param player
* @param permission
* @return
* @return true if the player has the permission
*/
@Override
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.
*
* @param player
* @param permission
* @return
* @return true if the player has the permission
*/
@Override
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.
*
* @param playerName
* @param permission
* @return
* @return true if the player has the permission
*/
public boolean permission(String playerName, String 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.
*
* @param userName
* @return
* @return String of players group name.
*/
@Override
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
* @return
* @return List<String> of all players permissions.
*/
@Override
public List<String> getAllPlayersPermissions(String userName) {
@ -94,6 +100,23 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
List<String> playerPermArray = new ArrayList<String>(ph.getUser(userName).getPermissionList());
for (String group : getGroups(userName)) {
if (group.startsWith("g:") && GroupManager.getGlobalGroups().hasGroup(group)) {
for (String perm : GroupManager.getGlobalGroups().getGroupsPermissions(group)) {
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);
}
}
}
}
} else {
for (String perm : ph.getGroup(group).getPermissionList()) {
if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm))) {
playerPermArray.add(perm);
@ -110,25 +133,25 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
}
}
}
return playerPermArray;
}
/**
* Verify if player is in suck group.
* It will check it's groups inheritance.
* Verify if player is in such group. It will check it's groups inheritance.
*
* So if you have a group Admin > Moderator
*
* And verify the player 'MyAdmin', which is Admin, it will return true for both
* Admin or Moderator groups.
* And verify the player 'MyAdmin', which is Admin, it will return true for
* both Admin or Moderator groups.
*
* Mas if you have a player 'MyModerator', which is Moderator,
* it will give false if you pass Admin in group parameter.
* If you have a player 'MyModerator', which is Moderator, it will give
* false if you pass Admin in group parameter.
*
* @param name
* @param group
* @return
* @return true if in group (with inheritance)
*/
@Override
public boolean inGroup(String name, String group) {
@ -144,11 +167,13 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* Gets the appropriate prefix for the user.
* 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.
* Returns an empty string if user has no parent groups.
* @param user Player's name
* Gets the appropriate prefix for the user. 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. Returns an empty string if user has no
* parent groups.
*
* @param user
* Player's name
* @return Player's prefix
*/
@Override
@ -163,11 +188,13 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* Gets the appropriate prefix for the user.
* 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.
* Returns an empty string if user has no parent groups.
* @param user Player's name
* Gets the appropriate prefix for the user. 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. Returns an empty string if user has no
* parent groups.
*
* @param user
* Player's name
* @return Player's prefix
*/
@Override
@ -183,10 +210,12 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* Gets name of the primary group of the user.
* Returns the name of the default group if user has no parent groups,
* or "Default" if there is no default group for that world.
* @param user Player's name
* Gets name of the primary group of the user. Returns the name of the
* default group if user has no parent groups, or "Default" if there is no
* default group for that world.
*
* @param user
* Player's name
* @return Name of player's primary group
*/
public String getPrimaryGroup(String user) {
@ -196,24 +225,20 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* Check if user can build.
* @param world Player's world
* @param user Player's name
* @return Whether the user can build
* Check if user can build. Checks inheritance and subgroups.
*
* @param userName Player's name
* @return true if the user can build
*/
public boolean canUserBuild(String user) {
boolean test = ph.getUser(user).getVariables().getVarBoolean("build");
public boolean canUserBuild(String userName) {
if (test) {
return test;
}
return canGroupBuild(getGroup(user));
return getPermissionBoolean(userName, "build");
}
/**
* Returns the String prefix for the given group
*
* @param groupName
* @return empty string if found none.
*/
@ -228,8 +253,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/**
* Return the suffix for the given group name
*
* @param groupName
* @return
* @return empty string if not found.
*/
@Override
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
* @return
* @return true if can build
*/
@Override
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 will harvest inheritance for value.
* It returns a string variable value, set in the INFO node of the group. It
* will harvest inheritance for value.
*
* @param groupName
* @param variable
* @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 will harvest inheritance for value.
* It returns a Integer variable value It will harvest inheritance for
* value.
*
* @param groupName
* @param variable
* @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.
* It will harvest inheritance for value.
* Returns a boolean for given variable in INFO node. It will harvest
* inheritance for value.
*
* @param group
* @param variable
* @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.
* It will harvest inheritance for value.
* Returns a double value for the given variable name in INFO node. It will
* harvest inheritance for value.
*
* @param group
* @param variable
* @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.
*
* @param user
* @param variable
* @return
* @return empty string if not found
*/
@Override
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.
*
* @param user
* @param variable
* @return
* @return -1 if not found
*/
@Override
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.
*
* @param user
* @param variable
* @return
* @return boolean value
*/
@Override
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.
*
* @param user
* @param variable
* @return
* @return -1 if not found
*/
@Override
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.
* If not found, it will search for his Group variables.
* It will harvest the inheritance.
* Returns the variable value of the user, in INFO node. If not found, it
* will search for his Group variables. It will harvest the inheritance and
* subgroups.
*
* @param user
* @param variable
* @return empty string if not found
@ -417,6 +454,15 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
Group result = nextGroupWithVariable(start, variable);
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 result.getVariables().getVarString(variable);
@ -424,9 +470,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* Returns the variable value of the user, in INFO node.
* If not found, it will search for his Group variables.
* It will harvest the inheritance.
* Returns the variable value of the user, in INFO node. If not found, it
* will search for his Group variables. It will harvest the inheritance and
* subgroups.
*
* @param user
* @param variable
* @return -1 if not found
@ -446,6 +493,15 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
Group result = nextGroupWithVariable(start, variable);
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 result.getVariables().getVarInteger(variable);
@ -453,9 +509,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* Returns the variable value of the user, in INFO node.
* If not found, it will search for his Group variables.
* It will harvest the inheritance.
* Returns the variable value of the user, in INFO node. If not found, it
* will search for his Group variables. It will harvest the inheritance and
* subgroups.
*
* @param user
* @param variable
* @return false if not found or not parseable to true.
@ -475,6 +532,15 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
Group result = nextGroupWithVariable(start, variable);
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 result.getVariables().getVarBoolean(variable);
@ -482,9 +548,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* Returns the variable value of the user, in INFO node.
* If not found, it will search for his Group variables.
* It will harvest the inheritance.
* Returns the variable value of the user, in INFO node. If not found, it
* will search for his Group variables. It will harvest the inheritance and
* subgroups.
*
* @param user
* @param variable
* @return -1 if not found.
@ -504,6 +571,15 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
Group result = nextGroupWithVariable(start, variable);
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 result.getVariables().getVarDouble(variable);
@ -512,9 +588,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/**
* Does not include User's group permission
*
* @param user
* @param permission
* @return
* @return PermissionCheckResult
*/
public PermissionCheckResult checkUserOnlyPermission(User user, String permission) {
user.sortPermissions();
@ -539,8 +616,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* Returns the node responsible for that permission.
* Does not include User's group permission.
* Returns the node responsible for that permission. Does not include User's
* group permission.
*
* @param group
* @param permission
* @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.
*
* @param user
* @param permission
* @return true if permission was found. false if not, or was negated.
*/
public boolean checkUserPermission(User user, String permission) {
PermissionCheckResult result = checkFullUserPermission(user, permission);
if (result.resultType.equals(PermissionCheckResult.Type.EXCEPTION)
|| result.resultType.equals(PermissionCheckResult.Type.FOUND)) {
if (result.resultType.equals(PermissionCheckResult.Type.EXCEPTION) || result.resultType.equals(PermissionCheckResult.Type.FOUND)) {
return true;
}
if (Bukkit.getPlayer(user.getName()).hasPermission(permission))
if ((Bukkit.getPlayer(user.getName()) != null) && (Bukkit.getPlayer(user.getName()).hasPermission(permission)))
return true;
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 targetPermission
* @return
* @return PermissionCheckResult
*/
public PermissionCheckResult checkFullUserPermission(User user, String targetPermission) {
PermissionCheckResult result = new PermissionCheckResult();
result.askedPermission = targetPermission;
result.resultType = PermissionCheckResult.Type.NOTFOUND;
if (user == null || targetPermission == null) {
if (user == null || targetPermission == null || targetPermission.isEmpty()) {
return result;
}
@ -619,7 +699,7 @@ 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.owner = user;
return result;
@ -639,7 +719,8 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @param variable
* @param alreadyChecked
* @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
public Group nextGroupWithVariable(Group start, String variable, List<Group> alreadyChecked) {
@ -652,8 +733,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*
* It does Breadth-first search
*
* @param start the starting group to look for
* @param targetVariable the variable name
* @param start
* the starting group to look for
* @param targetVariable
* the variable name
* @return The group if found. Null if not.
*/
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
* in the future releases.
*
* @param start The group to start the search.
* @param askedGroup Name of the group you're looking for
* @param alreadyChecked groups to ignore(pass null on it, please)
* @param start
* The group to start the search.
* @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.
* @deprecated prefer using hasGroupInInheritance(Group start, String askedGroup)
* @deprecated prefer using hasGroupInInheritance(Group start, String
* askedGroup)
*/
@Deprecated
public boolean searchGroupInInheritance(Group start, String askedGroup, List<Group> alreadyChecked) {
@ -702,8 +789,10 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*
* It does Breadth-first search
*
* @param start The group to start the search.
* @param askedGroup Name of the group you're looking for
* @param start
* The group to start the search.
* @param askedGroup
* Name of the group you're looking for
* @return true if it inherits the group.
*/
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
*
* @param start
* @param permission
* @param alreadyChecked
* @return true if PermissionCheckResult is EXCEPTION or FOUND
* @deprecated use the other checkGroupPermissionWithInheritance for everything
* @deprecated use the other checkGroupPermissionWithInheritance for
* everything
*/
@Deprecated
public boolean checkGroupPermissionWithInheritance(Group start, String permission, List<Group> alreadyChecked) {
PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission);
if (result.resultType.equals(Type.EXCEPTION)
|| result.resultType.equals(Type.FOUND)) {
if (result.resultType.equals(Type.EXCEPTION) || result.resultType.equals(Type.FOUND)) {
return true;
}
return false;
}
/**
* Returns the result of permission check. Including inheritance.
* If found anything, the PermissionCheckResult that retuns will
* include the Group name, and the result type.
* Result types will be EXCEPTION, NEGATION, FOUND.
* Returns the result of permission check. Including inheritance. If found
* anything, the PermissionCheckResult that retuns will include the Group
* name, and the result type. Result types will be EXCEPTION, NEGATION,
* FOUND.
*
* If returned type NOTFOUND, the owner will be null,
* and ownerType too.
* If returned type NOTFOUND, the owner will be null, and ownerType too.
*
* It does Breadth-first search
*
* @param start
* @param targetPermission
* @return
* @return PermissionCheckResult
*/
public PermissionCheckResult checkGroupPermissionWithInheritance(Group start, String targetPermission) {
if (start == null || targetPermission == null) {
@ -792,8 +881,8 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
/**
* It uses checkGroupPermissionWithInheritance
* and cast the owner to Group type if result type was EXCEPTION or FOUND.
* It uses checkGroupPermissionWithInheritance and cast the owner to Group
* type if result type was EXCEPTION or FOUND.
*
* @param start
* @param permission
@ -804,8 +893,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
@Deprecated
public Group nextGroupWithPermission(Group start, String permission, List<Group> alreadyChecked) {
PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission);
if (result.resultType.equals(Type.EXCEPTION)
|| result.resultType.equals(Type.FOUND)) {
if (result.resultType.equals(Type.EXCEPTION) || result.resultType.equals(Type.FOUND)) {
return (Group) checkGroupPermissionWithInheritance(start, permission).owner;
}
return null;
@ -815,8 +903,8 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* Return whole list of names of groups in a inheritance chain. Including a
* starting group.
*
* it now redirects to the other method. but get away from this one,
* it will disappear in a future release.
* it now redirects to the other method. but get away from this one, it will
* disappear in a future release.
*
* @param start
* @param alreadyChecked
@ -860,17 +948,17 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/**
* Compare a user permission like 'myplugin.*' against a full plugin
* permission name, like 'myplugin.dosomething'.
* As the example above, will return true.
* permission name, like 'myplugin.dosomething'. As the example above, will
* return true.
*
* Please sort permissions before sending them here. So negative tokens
* get priority.
* Please sort permissions before sending them here. So negative tokens get
* priority.
*
* You must test if it start with negative outside this method. It will
* only tell if the nodes are matching or not.
* You must test if it start with negative outside this method. It will only
* tell if the nodes are matching or not.
*
* Every '-' or '+' in the beginning is ignored. It will match only
* node names.
* Every '-' or '+' in the beginning is ignored. It will match only node
* names.
*
* @param userAcessLevel
* @param fullPermissionName
@ -894,7 +982,6 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
fullPermissionName = fullPermissionName.substring(1);
}
StringTokenizer levelATokenizer = new StringTokenizer(userAcessLevel, ".");
StringTokenizer levelBTokenizer = new StringTokenizer(fullPermissionName, ".");
while (levelATokenizer.hasMoreTokens() && levelBTokenizer.hasMoreTokens()) {
@ -926,8 +1013,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* Returns a list of all groups.
*
* Including subgroups.
*
* @param userName
* @return
* @return String[] of all group names.
*/
@Override
public String[] getGroups(String userName) {
@ -935,6 +1023,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
for (Group subg : ph.getUser(userName).subGroupListCopy()) {
allGroups.addAll(listAllGroupsInherited(subg));
}
String[] arr = new String[allGroups.size()];
return allGroups.toArray(arr);
}
@ -942,8 +1031,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/**
* A Breadth-first search thru inheritance model.
*
* Just a model to copy and paste.
* This will guarantee the closer groups will be checked first.
* Just a model to copy and paste. This will guarantee the closer groups
* will be checked first.
*
* @param start
* @param targerPermission
* @return
@ -960,8 +1050,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
while (!stack.isEmpty()) {
Group now = stack.pop();
PermissionCheckResult resultNow = checkGroupOnlyPermission(now, targerPermission);
if (resultNow.resultType.equals(PermissionCheckResult.Type.EXCEPTION)
|| resultNow.resultType.equals(PermissionCheckResult.Type.FOUND)) {
if (resultNow.resultType.equals(PermissionCheckResult.Type.EXCEPTION) || resultNow.resultType.equals(PermissionCheckResult.Type.FOUND)) {
return now;
}
if (resultNow.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
@ -984,8 +1073,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
@Override
public String getInfoString(String entryName, String path,
boolean isGroup) {
public String getInfoString(String entryName, String path, boolean isGroup) {
if (isGroup) {
Group data = ph.getGroup(entryName);
if (data == null) {
@ -1002,8 +1090,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
@Override
public int getInfoInteger(String entryName, String path,
boolean isGroup) {
public int getInfoInteger(String entryName, String path, boolean isGroup) {
if (isGroup) {
Group data = ph.getGroup(entryName);
if (data == null) {
@ -1020,8 +1107,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
@Override
public double getInfoDouble(String entryName, String path,
boolean isGroup) {
public double getInfoDouble(String entryName, String path, boolean isGroup) {
if (isGroup) {
Group data = ph.getGroup(entryName);
if (data == null) {
@ -1039,8 +1125,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
@Override
public boolean getInfoBoolean(String entryName, String path,
boolean isGroup) {
public boolean getInfoBoolean(String entryName, String path, boolean isGroup) {
if (isGroup) {
Group data = ph.getGroup(entryName);
if (data == null) {

View file

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

View file

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