List of usage examples for org.dom4j QName get
public static QName get(String qualifiedName, String uri)
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); }