package org.jivesoftware.xmpp.workgroup.interceptor; import org.jivesoftware.util.StringUtils; import org.jivesoftware.util.EmailService; import org.xmpp.packet.Packet; import org.xmpp.packet.JID; import java.util.*; /** * An interceptor to ban users by preventing them from sending packets to the workgroup. * * @author Gaston Dombiak */ public class UserInterceptor implements PacketInterceptor { /** * A Map of banned bare JIDs. */ private Map<String,String> jidBanMap = new HashMap<String,String>(); /** * A Map of banned domains. */ private Map<String,String> domainBanMap = new HashMap<String,String>(); private String fromEmail; private String fromName; private String emailSubject = ""; private String emailBody = ""; private List<String> emailNotifyList; private String rejectionMessage; /** * Returns the subject of the notification emails. * * @return the subject of the notification emails. */ public String getEmailSubject() { return emailSubject; } /** * Sets the subject of the nofitication emails. * * @param emailSubject the subject of notification emails. */ public void setEmailSubject(String emailSubject) { this.emailSubject = emailSubject; } /** * Returns the body of the nofication emails. * * @return the body of the notification emails. */ public String getEmailBody() { return emailBody; } /** * Sets the body of the nofication emails. * * @param emailBody the body of the notification emails. */ public void setEmailBody(String emailBody) { this.emailBody = emailBody; } /** * Returns the email address that notification emails will appear to be from. * * @return the email address that notification emails will appear from. */ public String getFromEmail() { return fromEmail; } /** * Sets the email address that notification emails will appear to be from. * * @param fromEmail the email address that notification emails will appear from. */ public void setFromEmail(String fromEmail) { this.fromEmail = fromEmail; } /** * Returns the name that notification emails will appear to be from. * * @return the name that notification emails will appear from. */ public String getFromName() { return fromName; } /** * Sets the name that notification emails will appear to be from. * * @param fromName the name that notification emails will appear from. */ public void setFromName(String fromName) { this.fromName = fromName; } /** * Returns the list of email addresses that will be notified when * a user is banned. * * @return the comma-delimited list of notification email addresses. */ public String getEmailNotifyList() { if (emailNotifyList == null || emailNotifyList.isEmpty()) { return ""; } StringBuilder buf = new StringBuilder(); buf.append(emailNotifyList.get(0)); for (int i=1; i<emailNotifyList.size(); i++) { buf.append(", "); buf.append(emailNotifyList.get(i)); } return buf.toString(); } /** * Sets the list of email addresses that will be notified when a user is banned. * * @param notifyList the comma-delimited list of notification email addresses. */ public void setEmailNotifyList(String notifyList) { if (notifyList == null || notifyList.equals("")) { emailNotifyList = null; } else { emailNotifyList = new ArrayList<String>(); StringTokenizer tokenizer = new StringTokenizer(notifyList, ","); while (tokenizer.hasMoreTokens()) { String emailAddress = tokenizer.nextToken().trim(); emailNotifyList.add(emailAddress); } } } /** * Returns the list of banned users as a list of comma-delimited usernames or * the empty string if no banned users exist. * * @return the list of banned users as a list of comma-delimited usernames. */ public String getJidBanList() { return getString(jidBanMap); } /** * Sets the list of banned usernames. The list should be a list of comma-delimited usernames. * * @param usernames the list of banned usernames. */ public void setJidBanList(String usernames) { jidBanMap = getMap(usernames); } /** * Returns the list of banned domains as a list of comma-delimited domains or * the empty string if no banned domains exist. * * @return the list of banned domains as a list of comma-delimited usernames. */ public String getDomainBanList() { return getString(domainBanMap); } /** * Sets the list of banned domains. The list should be a list of comma-delimited usernames. * * @param domains the list of banned usernames. */ public void setDomainBanList(String domains) { domainBanMap = getMap(domains); } public String getRejectionMessage() { return rejectionMessage; } public void setRejectionMessage(String rejectionMessage) { this.rejectionMessage = rejectionMessage; } /** * Checks to see if the sender of the packet is a banned user. If they are, a * PacketRejectedException is thrown and email notifications may be sent. */ public void interceptPacket(String workgroup, Packet packet, boolean read, boolean processed) throws PacketRejectedException { if (!read || processed) { // Ignore packets that are being sent or have been processed return; } JID jid = packet.getFrom(); if (jidBanMap.containsKey(jid.toBareJID()) || domainBanMap.containsKey(jid.getDomain())) { sendNotifications(packet, jid.toString()); PacketRejectedException exception = new PacketRejectedException("User '" + packet.getFrom().toBareJID() + "' not allowed to join queue."); if (rejectionMessage != null) { exception.setRejectionMessage(rejectionMessage); } throw exception; } } private void sendNotifications(Packet packet, String packetSender) { EmailService emailService = EmailService.getInstance(); String body; if (fromEmail == null) { return; } for (String toEmail : emailNotifyList) { body = StringUtils.replace(emailBody, "{packet}", packet.toXML()); body = StringUtils.replace(body, "{sender}", packetSender); emailService.sendMessage(null, toEmail, fromName, fromEmail, emailSubject, body, null); } } private static Map<String,String> getMap(String iPStr) { Map<String,String> newMap = new HashMap<String,String>(); if (iPStr == null) { return newMap; } StringTokenizer tokens = new StringTokenizer(iPStr, ","); while (tokens.hasMoreTokens()) { String address = tokens.nextToken().trim(); newMap.put(address, ""); } return newMap; } private static String getString(Map<String,String> map) { if (map == null || map.size() == 0) { return ""; } // Iterate through the elements in the map. StringBuilder buf = new StringBuilder(); Iterator<String> iter = map.keySet().iterator(); if (iter.hasNext()) { buf.append(iter.next()); } while (iter.hasNext()) { buf.append(", ").append(iter.next()); } return buf.toString(); } }