package org.jivesoftware.openfire.plugin.rules; import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.StringTokenizer; import org.jivesoftware.openfire.event.GroupEventListener; import org.jivesoftware.openfire.group.Group; import org.jivesoftware.openfire.group.GroupManager; import org.jivesoftware.openfire.group.GroupNotFoundException; import org.jivesoftware.openfire.plugin.PacketFilterConstants; import org.jivesoftware.openfire.plugin.rules.Rule.SourceDestType; import org.jivesoftware.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RuleGroupEventListener implements GroupEventListener { private static final Logger Log = LoggerFactory.getLogger(RuleGroupEventListener.class); private RuleManager rm = new RuleManagerProxy(); @Override public void groupDeleting(Group group, Map params) { deleteAllAutoCreatedRules(group); } public void createPassRule(String source, String destination, String groupName) { Pass pass = new Pass(); pass.setPacketType(Rule.PacketType.Any); pass.setDestType(SourceDestType.Group); pass.setDestination(destination); pass.setSourceType(SourceDestType.Group); pass.setSource(source); pass.isDisabled(false); pass.doLog(false); pass.setDescription("Auto created rule for group: " + groupName); rm.addRule(pass, 1); Log.debug("Created rule for group: " + groupName + " rule: " + pass); } @Override public void groupModified(Group group, Map params) { String keyChanged = (String) params.get("propertyKey"); String originalValue = (String) params.get("originalValue"); Log.debug("Group: " + group.getName() + " params: " + params + " originalValue:" + originalValue); if ("sharedRoster.groupList".equals(keyChanged)) { String currentValue = group.getProperties().get("sharedRoster.groupList"); if (currentValue != null && !"".equals(currentValue)) { deleteAllAutoCreatedRules(group); Collection<Group> groupList = parseGroups(currentValue); createPassRule(group.getName(), group.getName(), group.getName()); for (Group tmpGroup : groupList) { createPassRule(tmpGroup.getName(), group.getName(), group.getName()); createPassRule(group.getName(), tmpGroup.getName(), group.getName()); } } } else if ("sharedRoster.showInRoster".equals(keyChanged)) { String currentValue = group.getProperties().get("sharedRoster.showInRoster"); if ("onlyGroup".equals(currentValue)) { deleteAllAutoCreatedRules(group); createPassRule(group.getName(), group.getName(), group.getName()); } else if ("everybody".equals(currentValue)) { deleteAllAutoCreatedRules(group); createPassRule(PacketFilterConstants.ANY_GROUP, group.getName(), group.getName()); createPassRule(group.getName(), PacketFilterConstants.ANY_GROUP, group.getName()); } else if ("nobody".equals(currentValue)) { deleteAllAutoCreatedRules(group); } } } public void deleteAllAutoCreatedRules(Group group) { for (Rule rule : rm.getRules()) { if (Rule.SourceDestType.Group == rule.getSourceType() && (group.getName().equals(rule.getSource()) || group.getName().equals(rule.getDestination()))) { if (rule.getDescription().startsWith("Auto created rule for group: " + group.getName())) { rm.deleteRule(Integer.valueOf(rule.getRuleId())); Log.debug("Deleted rule for group: " + group.getName() + " rule: " + rule); } } } } @Override public void groupCreated(Group group, Map params) { // TODO Auto-generated method stub } @Override public void memberAdded(Group group, Map params) { // TODO Auto-generated method stub } @Override public void memberRemoved(Group group, Map params) { // TODO Auto-generated method stub } @Override public void adminAdded(Group group, Map params) { // TODO Auto-generated method stub } @Override public void adminRemoved(Group group, Map params) { // TODO Auto-generated method stub } /** * Returns a collection of Groups obtained by parsing a comma delimited String with the name of groups. * * @param groupNames * a comma delimited string with group names. * @return a collection of Groups obtained by parsing a comma delimited String with the name of groups. */ private Collection<Group> parseGroups(String groupNames) { Collection<Group> answer = new HashSet<Group>(); for (String groupName : parseGroupNames(groupNames)) { try { answer.add(GroupManager.getInstance().getGroup(groupName)); } catch (GroupNotFoundException e) { // Do nothing. Silently ignore the invalid reference to the group } } return answer; } /** * Returns a collection of Groups obtained by parsing a comma delimited String with the name of groups. * * @param groupNames * a comma delimited string with group names. * @return a collection of Groups obtained by parsing a comma delimited String with the name of groups. */ private static Collection<String> parseGroupNames(String groupNames) { Collection<String> answer = new HashSet<String>(); if (groupNames != null) { StringTokenizer tokenizer = new StringTokenizer(groupNames, ","); while (tokenizer.hasMoreTokens()) { answer.add(tokenizer.nextToken()); } } return answer; } }