⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 privacylist.java

📁 基于Jabber协议的即时消息服务器
💻 JAVA
字号:
/** * $RCSfile$ * $Revision: $ * $Date: $ * * Copyright (C) 2006 Jive Software. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */package org.jivesoftware.wildfire.privacy;import org.dom4j.DocumentFactory;import org.dom4j.Element;import org.jivesoftware.util.CacheSizes;import org.jivesoftware.util.Cacheable;import org.jivesoftware.util.Log;import org.jivesoftware.wildfire.XMPPServer;import org.jivesoftware.wildfire.roster.Roster;import org.jivesoftware.wildfire.user.UserNotFoundException;import org.xmpp.packet.JID;import org.xmpp.packet.Packet;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * A privacy list contains a set of rules that define if communication with the list owner * is allowed or denied. Users may have zero, one or more privacy lists. When a list is the * default list then that list is going to be used by default for all user sessions or analyze, * when user is offline, if communication may proceed (e.g. define if a message should be stored * offline). A user may configure is he wants to have a default list or not. When no default list * is defined then communication will not be blocked. However, users may define an active list * for a particular session. Active lists override default list (if there is one) and will be used * only for the duration of the session. * * @author Gaston Dombiak */public class PrivacyList implements Cacheable {    private JID userJID;    private String name;    private boolean isDefault;    private List<PrivacyItem> items = new ArrayList<PrivacyItem>();    private Roster roster;    public PrivacyList(String username, String name, boolean isDefault, Element listElement) {        this.userJID = XMPPServer.getInstance().createJID(username, null);        this.name = name;        this.isDefault = isDefault;        // Set the new list items        updateList(listElement);    }    /**     * Returns the name that uniquely identifies this list among the users lists.     *     * @return the name that uniquely identifies this list among the users lists.     */    public String getName() {        return name;    }    /**     * Returns true if this privacy list is the default list to apply for the user. Default     * privacy lists can be overriden per session by setting an active privacy list.     *     * @return true if this privacy list is the default list to apply for the user.     */    public boolean isDefault() {        return isDefault;    }    /**     * Sets if this privacy list is the default list to apply for the user. Default     * privacy lists can be overriden per session by setting an active privacy list.     *     * @param isDefault true if this privacy list is the default list to apply for the user.     */    public void setDefaultList(boolean isDefault) {        this.isDefault = isDefault;    }    /**     * Returns true if the specified packet must be blocked based on this privacy list rules.     * Rules are going to be analyzed based on their order (in ascending order). When a rule     * is matched then communication will be blocked or allowed based on that rule. No more     * further analysis is going to be made.     *     * @param packet the packet to analyze if it must be blocked.     * @return true if the specified packet must be blocked based on this privacy list rules.     */    public boolean shouldBlockPacket(Packet packet) {        if (packet.getFrom() == null) {            // Sender is the server so it's not denied            return false;        }        // Iterate over the rules and check each rule condition        for (PrivacyItem item : items) {            if (item.matchesCondition(packet, roster, userJID)) {                if (item.isAllow()) {                    return false;                }                if (Log.isDebugEnabled()) {                    Log.debug("Packet was blocked: " + packet);                }                return true;            }        }        // If no rule blocked the communication then allow the packet to flow        return false;    }    /**     * Returns an Element with the privacy list XML representation.     *     * @return an Element with the privacy list XML representation.     */    public Element asElement() {        //Element listElement = DocumentFactory.getInstance().createDocument().addElement("list");        Element listElement = DocumentFactory.getInstance().createDocument()                .addElement("list", "jabber:iq:privacy");        listElement.addAttribute("name", getName());        // Add the list items to the result        for (PrivacyItem item : items) {            listElement.add(item.asElement());        }        return listElement;    }    /**     * Sets the new list items based on the specified Element. The Element must contain     * a list of item elements.     *     * @param listElement the element containing a list of items.     */    public void updateList(Element listElement) {        // Reset the list of items of this list        items = new ArrayList<PrivacyItem>();        List<Element> itemsElements = listElement.elements("item");        for (Element itemElement : itemsElements) {            PrivacyItem newItem = new PrivacyItem(itemElement);            items.add(newItem);            // If the user's roster is required to evaluation whether a packet must be blocked            // then ensure that the roster is available            if (roster == null && newItem.isRosterRequired()) {                try {                    roster = XMPPServer.getInstance().getRosterManager().getRoster(userJID.getNode());                }                catch (UserNotFoundException e) {                    Log.warn("Privacy item removed since roster of user was not found: " +                            userJID.getNode());                    items.remove(newItem);                }            }        }        // Sort items collections        Collections.sort(items);    }    public int getCachedSize() {        // Approximate the size of the object in bytes by calculating the size        // of each field.        int size = 0;        size += CacheSizes.sizeOfObject();                      // overhead of object        size += CacheSizes.sizeOfString(userJID.toString());    // userJID        size += CacheSizes.sizeOfString(name);                  // name        size += CacheSizes.sizeOfBoolean();                     // isDefault        size += CacheSizes.sizeOfCollection(items);             // items of the list        if (roster != null) {            size += roster.getCachedSize();                     // add size of roster        }        return size;    }    public int hashCode() {        return name.hashCode();    }    public boolean equals(Object object) {        if (this == object) {            return true;        }        if (object != null && object instanceof PrivacyList) {            return name.equals(((PrivacyList)object).getName());        }        else {            return false;        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -