Example usage for org.dom4j QName get

List of usage examples for org.dom4j QName get

Introduction

In this page you can find the example usage for org.dom4j QName get.

Prototype

public static QName get(String qualifiedName, String uri) 

Source Link

Usage

From source file:org.jivesoftware.openfire.plugin.SearchPlugin.java

License:Open Source License

/**
 * This utilty method extracts the search query from the request. A query is defined as a set of key->value pairs, where the key denotes
 * a search field, and the value contains the value that was filled out by the user for that field.
 * /*  ww  w .ja  v  a 2  s. com*/
 * The query can be specified in one of two ways. The first way is a query is formed is by filling out any of the the standard search
 * fields. The other search method makes use of extended data forms. Search queries that are supplied to this
 * {@link #extractSearchQuery(Element)} that make use of this last method get forwarded to {@link #extractExtendedSearchQuery(Element)}.
 * 
 * @param incomingForm
 *            The form from which to extract the query
 * @return The search query for a particular user search request.
 */
@SuppressWarnings("unchecked")
private Hashtable<String, String> extractSearchQuery(Element incomingForm) {
    if (incomingForm.element(QName.get("x", "jabber:x:data")) != null) {
        // forward the request.
        return extractExtendedSearchQuery(incomingForm);
    }

    final Hashtable<String, String> searchList = new Hashtable<String, String>();

    // since not all clients request which fields are available for
    // searching attempt to match submitted fields with available search
    // fields
    Iterator<Element> iter = incomingForm.elementIterator();
    while (iter.hasNext()) {
        Element element = iter.next();
        String name = element.getName();

        if (fieldLookup.containsKey(name)) {
            // make best effort to map the fields submitted by
            // the client to those that Openfire can search
            reverseFieldLookup.put(fieldLookup.get(name), name);
            searchList.put(fieldLookup.get(name), element.getText());
        }
    }

    return searchList;
}

From source file:org.jivesoftware.openfire.plugin.SearchPlugin.java

License:Open Source License

/**
 * Extracts a search query from a data form that makes use of data forms to specify the search request. This 'extended' way of
 * constructing a search request is documented in XEP-0055, chapter 3.
 * /*from w w w  .  j  a v a  2 s .c om*/
 * @param incomingForm
 *            The form from which to extract the query
 * @return The search query for a particular user search request.
 * @see #extractSearchQuery(Element)
 */
@SuppressWarnings("unchecked")
private Hashtable<String, String> extractExtendedSearchQuery(Element incomingForm) {
    final Element dataform = incomingForm.element(QName.get("x", "jabber:x:data"));

    Hashtable<String, String> searchList = new Hashtable<String, String>();
    List<String> searchFields = new ArrayList<String>();
    String search = "";

    Iterator<Element> fields = dataform.elementIterator("field");
    while (fields.hasNext()) {
        Element searchField = fields.next();

        String field = searchField.attributeValue("var");
        String value = "";
        if (searchField.element("value") != null) {
            value = searchField.element("value").getTextTrim();
        }
        if (field.equals("search")) {
            search = value;
        } else if (value.equals("1")) {
            searchFields.add(field);
        }
    }

    for (String field : searchFields) {
        searchList.put(field, search);
    }

    return searchList;
}

From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java

License:Open Source License

/**
 * Handles IQ packets sent to the pubsub service. Requests of disco#info and disco#items
 * are not being handled by the engine. Instead the service itself should handle disco packets.
 *
 * @param service the PubSub service this action is to be performed for.
 * @param iq the IQ packet sent to the pubsub service.
 * @return true if the IQ packet was handled by the engine.
 *//* w  w w .j av  a 2 s .  co m*/
public boolean process(PubSubService service, IQ iq) {
    // Ignore IQs of type ERROR or RESULT
    if (IQ.Type.error == iq.getType() || IQ.Type.result == iq.getType()) {
        return true;
    }
    Element childElement = iq.getChildElement();
    String namespace = null;

    if (childElement != null) {
        namespace = childElement.getNamespaceURI();
    }
    if ("http://jabber.org/protocol/pubsub".equals(namespace)) {
        Element action = childElement.element("publish");
        if (action != null) {
            // Entity publishes an item
            publishItemsToNode(service, iq, action);
            return true;
        }
        action = childElement.element("subscribe");
        if (action != null) {
            // Entity subscribes to a node
            subscribeNode(service, iq, childElement, action);
            return true;
        }
        action = childElement.element("options");
        if (action != null) {
            if (IQ.Type.get == iq.getType()) {
                // Subscriber requests subscription options form
                getSubscriptionConfiguration(service, iq, childElement, action);
            } else {
                // Subscriber submits completed options form
                configureSubscription(service, iq, action);
            }
            return true;
        }
        action = childElement.element("create");
        if (action != null) {
            // Entity is requesting to create a new node
            createNode(service, iq, childElement, action);
            return true;
        }
        action = childElement.element("unsubscribe");
        if (action != null) {
            // Entity unsubscribes from a node
            unsubscribeNode(service, iq, action);
            return true;
        }
        action = childElement.element("subscriptions");
        if (action != null) {
            // Entity requests all current subscriptions
            getSubscriptions(service, iq, childElement);
            return true;
        }
        action = childElement.element("affiliations");
        if (action != null) {
            // Entity requests all current affiliations
            getAffiliations(service, iq, childElement);
            return true;
        }
        action = childElement.element("items");
        if (action != null) {
            // Subscriber requests all active items
            getPublishedItems(service, iq, action);
            return true;
        }
        action = childElement.element("retract");
        if (action != null) {
            // Entity deletes an item
            deleteItems(service, iq, action);
            return true;
        }
        // Unknown action requested
        sendErrorPacket(iq, PacketError.Condition.bad_request, null);
        return true;
    } else if ("http://jabber.org/protocol/pubsub#owner".equals(namespace)) {
        Element action = childElement.element("configure");
        if (action != null) {
            String nodeID = action.attributeValue("node");
            if (nodeID == null) {
                // if user is not sysadmin then return nodeid-required error
                if (!service.isServiceAdmin(iq.getFrom()) || !service.isCollectionNodesSupported()) {
                    // Configure elements must have a node attribute so answer an error
                    Element pubsubError = DocumentHelper.createElement(
                            QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors"));
                    sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
                    return true;
                } else {
                    // Sysadmin is trying to configure root collection node
                    nodeID = service.getRootCollectionNode().getNodeID();
                }
            }
            if (IQ.Type.get == iq.getType()) {
                // Owner requests configuration form of a node
                getNodeConfiguration(service, iq, childElement, nodeID);
            } else {
                // Owner submits or cancels node configuration form
                configureNode(service, iq, action, nodeID);
            }
            return true;
        }
        action = childElement.element("default");
        if (action != null) {
            // Owner requests default configuration options for
            // leaf or collection nodes
            getDefaultNodeConfiguration(service, iq, childElement, action);
            return true;
        }
        action = childElement.element("delete");
        if (action != null) {
            // Owner deletes a node
            deleteNode(service, iq, action);
            return true;
        }
        action = childElement.element("subscriptions");
        if (action != null) {
            if (IQ.Type.get == iq.getType()) {
                // Owner requests all affiliated entities
                getNodeSubscriptions(service, iq, action);
            } else {
                modifyNodeSubscriptions(service, iq, action);
            }
            return true;
        }
        action = childElement.element("affiliations");
        if (action != null) {
            if (IQ.Type.get == iq.getType()) {
                // Owner requests all affiliated entities
                getNodeAffiliations(service, iq, action);
            } else {
                modifyNodeAffiliations(service, iq, action);
            }
            return true;
        }
        action = childElement.element("purge");
        if (action != null) {
            // Owner purges items from a node
            purgeNode(service, iq, action);
            return true;
        }
        // Unknown action requested so return error to sender
        sendErrorPacket(iq, PacketError.Condition.bad_request, null);
        return true;
    } else if ("http://jabber.org/protocol/commands".equals(namespace)) {
        // Process ad-hoc command
        IQ reply = service.getManager().process(iq);
        router.route(reply);
        return true;
    }
    return false;
}

From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java

License:Open Source License

private void publishItemsToNode(PubSubService service, IQ iq, Element publishElement) {
    String nodeID = publishElement.attributeValue("node");
    Node node;// ww  w  .j a  v  a 2  s.co  m

    JID from = iq.getFrom();
    // TODO Assuming that owner is the bare JID (as defined in the JEP). This can be replaced with an explicit owner specified in the packet
    JID owner = from.asBareJID();

    if (nodeID == null) {
        // XEP-0060 Section 7.2.3.3 - No node was specified. Return bad_request error
        // This suggests that Instant nodes should not be auto-created
        Element pubsubError = DocumentHelper
                .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        return;
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            if (service instanceof PEPService && service.isServiceAdmin(owner)) {
                // If it is a PEP service & publisher is service owner -
                // auto create nodes.
                Element childElement = iq.getChildElement();
                Element createElement = publishElement.element("publish");
                CreateNodeResponse response = createNodeHelper(service, iq, childElement, createElement);

                if (response.newNode == null) {
                    // New node creation failed. Since pep#auto-create is advertised 
                    // in disco#info, node creation error should be sent to the client.
                    sendErrorPacket(iq, response.creationStatus, response.pubsubError);
                } else {
                    // Node creation succeeded, set node to newNode.
                    node = response.newNode;
                }
            } else {
                // Node does not exist. Return item-not-found error
                sendErrorPacket(iq, PacketError.Condition.item_not_found, null);
                return;
            }
        }
    }

    if (!node.getPublisherModel().canPublish(node, owner) && !service.isServiceAdmin(owner)) {
        // Entity does not have sufficient privileges to publish to node
        sendErrorPacket(iq, PacketError.Condition.forbidden, null);
        return;
    }

    if (node.isCollectionNode()) {
        // Node is a collection node. Return feature-not-implemented error
        Element pubsubError = DocumentHelper
                .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors"));
        pubsubError.addAttribute("feature", "publish");
        sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
        return;
    }

    LeafNode leafNode = (LeafNode) node;
    Iterator itemElements = publishElement.elementIterator("item");

    // Check that an item was included if node persist items or includes payload
    if (!itemElements.hasNext() && leafNode.isItemRequired()) {
        Element pubsubError = DocumentHelper
                .createElement(QName.get("item-required", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        return;
    }
    // Check that no item was included if node doesn't persist items and doesn't
    // includes payload
    if (itemElements.hasNext() && !leafNode.isItemRequired()) {
        Element pubsubError = DocumentHelper
                .createElement(QName.get("item-forbidden", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        return;
    }
    List<Element> items = new ArrayList<Element>();
    List entries;
    Element payload;
    while (itemElements.hasNext()) {
        Element item = (Element) itemElements.next();
        entries = item.elements();
        payload = entries.isEmpty() ? null : (Element) entries.get(0);
        // Check that a payload was included if node is configured to include payload
        // in notifications
        if (payload == null && leafNode.isPayloadDelivered()) {
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("payload-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
        // Check that the payload (if any) contains only one child element
        if (entries.size() > 1) {
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("invalid-payload", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
        items.add(item);
    }

    // Return success operation
    router.route(IQ.createResultIQ(iq));
    // Publish item and send event notifications to subscribers
    leafNode.publishItems(from, items);
}

From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java

License:Open Source License

private void deleteItems(PubSubService service, IQ iq, Element retractElement) {
    String nodeID = retractElement.attributeValue("node");
    Node node;//from  ww  w . jav a 2s  . co m
    if (nodeID == null) {
        // No node was specified. Return bad_request error
        Element pubsubError = DocumentHelper
                .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        return;
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            sendErrorPacket(iq, PacketError.Condition.item_not_found, null);
            return;
        }
    }
    // Get the items to delete
    Iterator itemElements = retractElement.elementIterator("item");
    if (!itemElements.hasNext()) {
        Element pubsubError = DocumentHelper
                .createElement(QName.get("item-required", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        return;
    }

    if (node.isCollectionNode()) {
        // Cannot delete items from a collection node. Return an error.
        Element pubsubError = DocumentHelper
                .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors"));
        pubsubError.addAttribute("feature", "persistent-items");
        sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
        return;
    }
    LeafNode leafNode = (LeafNode) node;

    if (!leafNode.isItemRequired()) {
        // Cannot delete items from a leaf node that doesn't handle itemIDs. Return an error.
        Element pubsubError = DocumentHelper
                .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors"));
        pubsubError.addAttribute("feature", "persistent-items");
        sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
        return;
    }

    List<PublishedItem> items = new ArrayList<PublishedItem>();
    while (itemElements.hasNext()) {
        Element itemElement = (Element) itemElements.next();
        String itemID = itemElement.attributeValue("id");
        if (itemID != null) {
            PublishedItem item = node.getPublishedItem(itemID);
            if (item == null) {
                // ItemID does not exist. Return item-not-found error
                sendErrorPacket(iq, PacketError.Condition.item_not_found, null);
                return;
            } else {
                if (item.canDelete(iq.getFrom())) {
                    items.add(item);
                } else {
                    // Publisher does not have sufficient privileges to delete this item
                    sendErrorPacket(iq, PacketError.Condition.forbidden, null);
                    return;
                }
            }
        } else {
            // No item ID was specified so return a bad_request error
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("item-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
    }
    // Send reply with success
    router.route(IQ.createResultIQ(iq));
    // Delete items and send subscribers a notification
    leafNode.deleteItems(items);
}

From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java

License:Open Source License

private void subscribeNode(PubSubService service, IQ iq, Element childElement, Element subscribeElement) {
    String nodeID = subscribeElement.attributeValue("node");
    Node node;//  ww  w  .  ja  v  a 2 s. c o  m
    if (nodeID == null) {
        if (service.isCollectionNodesSupported()) {
            // Entity subscribes to root collection node
            node = service.getRootCollectionNode();
        } else {
            // Service does not have a root collection node so return a nodeid-required error
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            sendErrorPacket(iq, PacketError.Condition.item_not_found, null);
            return;
        }
    }
    // Check if sender and subscriber JIDs match or if a valid "trusted proxy" is being used
    JID from = iq.getFrom();
    JID subscriberJID = new JID(subscribeElement.attributeValue("jid"));
    if (!from.toBareJID().equals(subscriberJID.toBareJID()) && !service.isServiceAdmin(from)) {
        // JIDs do not match and requestor is not a service admin so return an error
        Element pubsubError = DocumentHelper
                .createElement(QName.get("invalid-jid", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        return;
    }
    // TODO Assumed that the owner of the subscription is the bare JID of the subscription JID. Waiting StPeter answer for explicit field.
    JID owner = subscriberJID.asBareJID();
    // Check if the node's access model allows the subscription to proceed
    AccessModel accessModel = node.getAccessModel();
    if (!accessModel.canSubscribe(node, owner, subscriberJID)) {
        sendErrorPacket(iq, accessModel.getSubsriptionError(), accessModel.getSubsriptionErrorDetail());
        return;
    }
    // Check if the subscriber is an anonymous user
    if (!UserManager.getInstance().isRegisteredUser(subscriberJID)) {
        // Anonymous users cannot subscribe to the node. Return forbidden error
        sendErrorPacket(iq, PacketError.Condition.forbidden, null);
        return;
    }
    // Check if the subscription owner is a user with outcast affiliation
    NodeAffiliate nodeAffiliate = node.getAffiliate(owner);
    if (nodeAffiliate != null && nodeAffiliate.getAffiliation() == NodeAffiliate.Affiliation.outcast) {
        // Subscriber is an outcast. Return forbidden error
        sendErrorPacket(iq, PacketError.Condition.forbidden, null);
        return;
    }
    // Check that subscriptions to the node are enabled
    if (!node.isSubscriptionEnabled() && !service.isServiceAdmin(from)) {
        // Sender is not a sysadmin and subscription is disabled so return an error
        sendErrorPacket(iq, PacketError.Condition.not_allowed, null);
        return;
    }

    // Get any configuration form included in the options element (if any)
    DataForm optionsForm = null;
    Element options = childElement.element("options");
    if (options != null) {
        Element formElement = options.element(QName.get("x", "jabber:x:data"));
        if (formElement != null) {
            optionsForm = new DataForm(formElement);
        }
    }

    // If leaf node does not support multiple subscriptions then check whether subscriber is
    // creating another subscription or not
    if (!node.isCollectionNode() && !node.isMultipleSubscriptionsEnabled()) {
        NodeSubscription existingSubscription = node.getSubscription(subscriberJID);
        if (existingSubscription != null) {
            // User is trying to create another subscription so
            // return current subscription state
            existingSubscription.sendSubscriptionState(iq);
            return;
        }
    }

    // Check if subscribing twice to a collection node using same subscription type
    if (node.isCollectionNode()) {
        // By default assume that new subscription is of type node
        boolean isNodeType = true;
        if (optionsForm != null) {
            FormField field = optionsForm.getField("pubsub#subscription_type");
            if (field != null) {
                if ("items".equals(field.getValues().get(0))) {
                    isNodeType = false;
                }
            }
        }
        if (nodeAffiliate != null) {
            for (NodeSubscription subscription : nodeAffiliate.getSubscriptions()) {
                if (isNodeType) {
                    // User is requesting a subscription of type "nodes"
                    if (NodeSubscription.Type.nodes == subscription.getType()) {
                        // Cannot have 2 subscriptions of the same type. Return conflict error
                        sendErrorPacket(iq, PacketError.Condition.conflict, null);
                        return;
                    }
                } else if (!node.isMultipleSubscriptionsEnabled()) {
                    // User is requesting a subscription of type "items" and
                    // multiple subscriptions is not allowed
                    if (NodeSubscription.Type.items == subscription.getType()) {
                        // User is trying to create another subscription so
                        // return current subscription state
                        subscription.sendSubscriptionState(iq);
                        return;
                    }
                }
            }
        }
    }

    // Create a subscription and an affiliation if the subscriber doesn't have one
    node.createSubscription(iq, owner, subscriberJID, accessModel.isAuthorizationRequired(), optionsForm);
}

From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java

License:Open Source License

private void unsubscribeNode(PubSubService service, IQ iq, Element unsubscribeElement) {
    String nodeID = unsubscribeElement.attributeValue("node");
    String subID = unsubscribeElement.attributeValue("subid");
    String jidAttribute = unsubscribeElement.attributeValue("jid");

    // Check if the specified JID has a subscription with the node
    if (jidAttribute == null) {
        // No JID was specified so return an error indicating that jid is required
        Element pubsubError = DocumentHelper
                .createElement(QName.get("jid-required", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        return;//from   w w w.  j  a  v  a2s . c  om
    }
    Node node;

    if (nodeID == null) {
        if (service.isCollectionNodesSupported()) {
            // Entity unsubscribes from root collection node
            node = service.getRootCollectionNode();
        } else {
            // Service does not have a root collection node so return a nodeid-required error
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            sendErrorPacket(iq, PacketError.Condition.item_not_found, null);
            return;
        }
    }
    NodeSubscription subscription;
    JID owner = new JID(jidAttribute);

    if (node.isMultipleSubscriptionsEnabled() && node.getSubscriptions(owner).size() > 1) {
        if (subID == null) {
            // No subid was specified and the node supports multiple subscriptions
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("subid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        } else {
            // Check if the specified subID belongs to an existing node subscription
            subscription = node.getSubscription(subID);
            if (subscription == null) {
                Element pubsubError = DocumentHelper
                        .createElement(QName.get("invalid-subid", "http://jabber.org/protocol/pubsub#errors"));
                sendErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
                return;
            }
        }
    } else {
        JID subscriberJID = new JID(jidAttribute);
        subscription = node.getSubscription(subscriberJID);
        if (subscription == null) {
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError);
            return;
        }
    }
    JID from = iq.getFrom();
    // Check that unsubscriptions to the node are enabled
    if (!node.isSubscriptionEnabled() && !service.isServiceAdmin(from)) {
        // Sender is not a sysadmin and unsubscription is disabled so return an error
        sendErrorPacket(iq, PacketError.Condition.not_allowed, null);
        return;
    }

    // A subscription was found so check if the user is allowed to cancel the subscription
    if (!subscription.canModify(from) && !subscription.canModify(owner)) {
        // Requestor is prohibited from unsubscribing entity
        sendErrorPacket(iq, PacketError.Condition.forbidden, null);
        return;
    }

    // Cancel subscription
    node.cancelSubscription(subscription);
    // Send reply with success
    router.route(IQ.createResultIQ(iq));
}

From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java

License:Open Source License

private void getSubscriptionConfiguration(PubSubService service, IQ iq, Element childElement,
        Element optionsElement) {
    String nodeID = optionsElement.attributeValue("node");
    String subID = optionsElement.attributeValue("subid");
    Node node;/*from ww  w . j a v  a 2s.c  o  m*/
    if (nodeID == null) {
        if (service.isCollectionNodesSupported()) {
            // Entity requests subscription options of root collection node
            node = service.getRootCollectionNode();
        } else {
            // Service does not have a root collection node so return a nodeid-required error
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            sendErrorPacket(iq, PacketError.Condition.item_not_found, null);
            return;
        }
    }
    NodeSubscription subscription;
    if (node.isMultipleSubscriptionsEnabled()) {
        if (subID == null) {
            // No subid was specified and the node supports multiple subscriptions
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("subid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        } else {
            // Check if the specified subID belongs to an existing node subscription
            subscription = node.getSubscription(subID);
            if (subscription == null) {
                Element pubsubError = DocumentHelper
                        .createElement(QName.get("invalid-subid", "http://jabber.org/protocol/pubsub#errors"));
                sendErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
                return;
            }
        }
    } else {
        // Check if the specified JID has a subscription with the node
        String jidAttribute = optionsElement.attributeValue("jid");
        if (jidAttribute == null) {
            // No JID was specified so return an error indicating that jid is required
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("jid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
        JID subscriberJID = new JID(jidAttribute);
        subscription = node.getSubscription(subscriberJID);
        if (subscription == null) {
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError);
            return;
        }
    }

    // A subscription was found so check if the user is allowed to get the subscription options
    if (!subscription.canModify(iq.getFrom())) {
        // Requestor is prohibited from getting the subscription options
        sendErrorPacket(iq, PacketError.Condition.forbidden, null);
        return;
    }

    // Return data form containing subscription configuration to the subscriber
    IQ reply = IQ.createResultIQ(iq);
    Element replyChildElement = childElement.createCopy();
    reply.setChildElement(replyChildElement);
    replyChildElement.element("options").add(subscription.getConfigurationForm().getElement());
    router.route(reply);
}

From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java

License:Open Source License

private void configureSubscription(PubSubService service, IQ iq, Element optionsElement) {
    String nodeID = optionsElement.attributeValue("node");
    String subID = optionsElement.attributeValue("subid");
    Node node;//from  ww  w  .  jav  a 2 s  .c  om
    if (nodeID == null) {
        if (service.isCollectionNodesSupported()) {
            // Entity submits new subscription options of root collection node
            node = service.getRootCollectionNode();
        } else {
            // Service does not have a root collection node so return a nodeid-required error
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            sendErrorPacket(iq, PacketError.Condition.item_not_found, null);
            return;
        }
    }
    NodeSubscription subscription;
    if (node.isMultipleSubscriptionsEnabled()) {
        if (subID == null) {
            // No subid was specified and the node supports multiple subscriptions
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("subid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        } else {
            // Check if the specified subID belongs to an existing node subscription
            subscription = node.getSubscription(subID);
            if (subscription == null) {
                Element pubsubError = DocumentHelper
                        .createElement(QName.get("invalid-subid", "http://jabber.org/protocol/pubsub#errors"));
                sendErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
                return;
            }
        }
    } else {
        // Check if the specified JID has a subscription with the node
        String jidAttribute = optionsElement.attributeValue("jid");
        if (jidAttribute == null) {
            // No JID was specified so return an error indicating that jid is required
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("jid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        }
        JID subscriberJID = new JID(jidAttribute);
        subscription = node.getSubscription(subscriberJID);
        if (subscription == null) {
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError);
            return;
        }
    }

    // A subscription was found so check if the user is allowed to submits
    // new subscription options
    if (!subscription.canModify(iq.getFrom())) {
        // Requestor is prohibited from setting new subscription options
        sendErrorPacket(iq, PacketError.Condition.forbidden, null);
        return;
    }

    Element formElement = optionsElement.element(QName.get("x", "jabber:x:data"));
    if (formElement != null) {
        // Change the subscription configuration based on the completed form
        subscription.configure(iq, new DataForm(formElement));
    } else {
        // No data form was included so return bad request error
        sendErrorPacket(iq, PacketError.Condition.bad_request, null);
    }
}

From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java

License:Open Source License

private void getPublishedItems(PubSubService service, IQ iq, Element itemsElement) {
    String nodeID = itemsElement.attributeValue("node");
    String subID = itemsElement.attributeValue("subid");
    Node node;/*from   ww w.j  a v a2 s .  co m*/
    if (nodeID == null) {
        // User must specify a leaf node ID so return a nodeid-required error
        Element pubsubError = DocumentHelper
                .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        return;
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            sendErrorPacket(iq, PacketError.Condition.item_not_found, null);
            return;
        }
    }
    if (node.isCollectionNode()) {
        // Node is a collection node. Return feature-not-implemented error
        Element pubsubError = DocumentHelper
                .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors"));
        pubsubError.addAttribute("feature", "retrieve-items");
        sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
        return;
    }
    // Check if sender and subscriber JIDs match or if a valid "trusted proxy" is being used
    JID subscriberJID = iq.getFrom();
    // TODO Assumed that the owner of the subscription is the bare JID of the subscription JID. Waiting StPeter answer for explicit field.
    JID owner = subscriberJID.asBareJID();
    // Check if the node's access model allows the subscription to proceed
    AccessModel accessModel = node.getAccessModel();
    if (!accessModel.canAccessItems(node, owner, subscriberJID)) {
        sendErrorPacket(iq, accessModel.getSubsriptionError(), accessModel.getSubsriptionErrorDetail());
        return;
    }
    // Check that the requester is not an outcast
    NodeAffiliate affiliate = node.getAffiliate(owner);
    if (affiliate != null && affiliate.getAffiliation() == NodeAffiliate.Affiliation.outcast) {
        sendErrorPacket(iq, PacketError.Condition.forbidden, null);
        return;
    }

    // Get the user's subscription
    NodeSubscription subscription = null;
    if (node.isMultipleSubscriptionsEnabled() && (node.getSubscriptions(owner).size() > 1)) {
        if (subID == null) {
            // No subid was specified and the node supports multiple subscriptions and the user
            // has multiple subscriptions
            Element pubsubError = DocumentHelper
                    .createElement(QName.get("subid-required", "http://jabber.org/protocol/pubsub#errors"));
            sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
            return;
        } else {
            // Check if the specified subID belongs to an existing node subscription
            subscription = node.getSubscription(subID);
            if (subscription == null) {
                Element pubsubError = DocumentHelper
                        .createElement(QName.get("invalid-subid", "http://jabber.org/protocol/pubsub#errors"));
                sendErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
                return;
            }
        }
    }

    if (subscription != null && !subscription.isActive()) {
        Element pubsubError = DocumentHelper
                .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors"));
        sendErrorPacket(iq, PacketError.Condition.not_authorized, pubsubError);
        return;
    }

    LeafNode leafNode = (LeafNode) node;
    // Get list of items to send to the user
    boolean forceToIncludePayload = false;
    List<PublishedItem> items;
    String max_items = itemsElement.attributeValue("max_items");
    int recentItems = 0;
    if (max_items != null) {
        try {
            // Parse the recent number of items requested
            recentItems = Integer.parseInt(max_items);
        } catch (NumberFormatException e) {
            // There was an error parsing the number so assume that all items were requested
            Log.warn("Assuming that all items were requested", e);
            max_items = null;
        }
    }
    if (max_items != null) {
        // Get the N most recent published items
        items = new ArrayList<PublishedItem>(leafNode.getPublishedItems(recentItems));
    } else {
        List requestedItems = itemsElement.elements("item");
        if (requestedItems.isEmpty()) {
            // Get all the active items that were published to the node
            items = new ArrayList<PublishedItem>(leafNode.getPublishedItems());
        } else {
            items = new ArrayList<PublishedItem>();
            // Indicate that payload should be included (if exists) no matter
            // the node configuration
            forceToIncludePayload = true;
            // Get the items as requested by the user
            for (Iterator it = requestedItems.iterator(); it.hasNext();) {
                Element element = (Element) it.next();
                String itemID = element.attributeValue("id");
                PublishedItem item = leafNode.getPublishedItem(itemID);
                if (item != null) {
                    items.add(item);
                }
            }
        }
    }

    if (subscription != null && subscription.getKeyword() != null) {
        // Filter items that do not match the subscription keyword
        for (Iterator<PublishedItem> it = items.iterator(); it.hasNext();) {
            PublishedItem item = it.next();
            if (!subscription.isKeywordMatched(item)) {
                // Remove item that does not match keyword
                it.remove();
            }
        }
    }

    // Send items to the user
    leafNode.sendPublishedItems(iq, items, forceToIncludePayload);
}