Search in sources :

Example 1 with PayloadItem

use of org.jivesoftware.smackx.pubsub.PayloadItem in project Smack by igniterealtime.

the class ItemProvider method parse.

@Override
public Item parse(XmlPullParser parser, int initialDepth) throws Exception {
    String id = parser.getAttributeValue(null, "id");
    String node = parser.getAttributeValue(null, "node");
    int tag = parser.next();
    if (tag == XmlPullParser.END_TAG) {
        return new Item(id, node);
    } else {
        String payloadElemName = parser.getName();
        String payloadNS = parser.getNamespace();
        final ExtensionElementProvider<ExtensionElement> extensionProvider = ProviderManager.getExtensionProvider(payloadElemName, payloadNS);
        if (extensionProvider == null) {
            CharSequence payloadText = PacketParserUtils.parseElement(parser, true);
            return new PayloadItem<SimplePayload>(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText));
        } else {
            return new PayloadItem<ExtensionElement>(id, node, extensionProvider.parse(parser));
        }
    }
}
Also used : PayloadItem(org.jivesoftware.smackx.pubsub.PayloadItem) Item(org.jivesoftware.smackx.pubsub.Item) PayloadItem(org.jivesoftware.smackx.pubsub.PayloadItem) ExtensionElement(org.jivesoftware.smack.packet.ExtensionElement) SimplePayload(org.jivesoftware.smackx.pubsub.SimplePayload)

Example 2 with PayloadItem

use of org.jivesoftware.smackx.pubsub.PayloadItem in project ecf by eclipse.

the class ItemProvider method parseExtension.

public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
    String id = parser.getAttributeValue(null, "id");
    String node = parser.getAttributeValue(null, "node");
    String elem = parser.getName();
    int tag = parser.next();
    if (tag == XmlPullParser.END_TAG) {
        return new Item(id, node);
    } else {
        String payloadElemName = parser.getName();
        String payloadNS = parser.getNamespace();
        if (ProviderManager.getInstance().getExtensionProvider(payloadElemName, payloadNS) == null) {
            boolean done = false;
            boolean isEmptyElement = false;
            StringBuilder payloadText = new StringBuilder();
            while (!done) {
                if (tag == XmlPullParser.END_TAG && parser.getName().equals(elem)) {
                    done = true;
                } else if (parser.getEventType() == XmlPullParser.START_TAG) {
                    payloadText.append("<").append(parser.getName());
                    if (parser.getName().equals(payloadElemName) && (payloadNS.length() > 0))
                        payloadText.append(" xmlns=\"").append(payloadNS).append("\"");
                    int n = parser.getAttributeCount();
                    for (int i = 0; i < n; i++) payloadText.append(" ").append(parser.getAttributeName(i)).append("=\"").append(parser.getAttributeValue(i)).append("\"");
                    if (parser.isEmptyElementTag()) {
                        payloadText.append("/>");
                        isEmptyElement = true;
                    } else {
                        payloadText.append(">");
                    }
                } else if (parser.getEventType() == XmlPullParser.END_TAG) {
                    if (isEmptyElement)
                        isEmptyElement = false;
                    else
                        payloadText.append("</").append(parser.getName()).append(">");
                } else if (parser.getEventType() == XmlPullParser.TEXT) {
                    payloadText.append(parser.getText());
                }
                tag = parser.next();
            }
            return new PayloadItem<SimplePayload>(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText.toString()));
        } else {
            return new PayloadItem<PacketExtension>(id, node, PacketParserUtils.parsePacketExtension(payloadElemName, payloadNS, parser));
        }
    }
}
Also used : PayloadItem(org.jivesoftware.smackx.pubsub.PayloadItem) Item(org.jivesoftware.smackx.pubsub.Item) PayloadItem(org.jivesoftware.smackx.pubsub.PayloadItem) SimplePayload(org.jivesoftware.smackx.pubsub.SimplePayload)

Example 3 with PayloadItem

use of org.jivesoftware.smackx.pubsub.PayloadItem in project Smack by igniterealtime.

the class OmemoService method fetchDeviceList.

/**
 * Retrieve the OMEMO device list of a contact.
 *
 * @param connection authenticated XMPP connection.
 * @param contact BareJid of the contact of which we want to retrieve the device list from.
 * @return device list
 *
 * @throws InterruptedException if the calling thread was interrupted.
 * @throws PubSubException.NotALeafNodeException if a PubSub leaf node operation was attempted on a non-leaf node.
 * @throws SmackException.NoResponseException if there was no response from the remote entity.
 * @throws SmackException.NotConnectedException if the XMPP connection is not connected.
 * @throws XMPPException.XMPPErrorException if there was an XMPP error returned.
 * @throws PubSubException.NotAPubSubNodeException if a involved node is not a PubSub node.
 */
private static OmemoDeviceListElement fetchDeviceList(XMPPConnection connection, BareJid contact) throws InterruptedException, PubSubException.NotALeafNodeException, SmackException.NoResponseException, SmackException.NotConnectedException, XMPPException.XMPPErrorException, PubSubException.NotAPubSubNodeException {
    PubSubManager pm = PubSubManager.getInstanceFor(connection, contact);
    String nodeName = OmemoConstants.PEP_NODE_DEVICE_LIST;
    LeafNode node = pm.getLeafNode(nodeName);
    if (node == null) {
        return null;
    }
    List<PayloadItem<OmemoDeviceListElement>> items = node.getItems();
    if (items.isEmpty()) {
        return null;
    }
    return items.get(items.size() - 1).getPayload();
}
Also used : PubSubManager(org.jivesoftware.smackx.pubsub.PubSubManager) PayloadItem(org.jivesoftware.smackx.pubsub.PayloadItem) LeafNode(org.jivesoftware.smackx.pubsub.LeafNode)

Example 4 with PayloadItem

use of org.jivesoftware.smackx.pubsub.PayloadItem in project Smack by igniterealtime.

the class OpenPgpPubSubUtil method publishPublicKey.

/**
 * Publish the users OpenPGP public key to the public key node if necessary.
 * Also announce the key to other users by updating the metadata node.
 *
 * @see <a href="https://xmpp.org/extensions/xep-0373.html#announcing-pubkey">XEP-0373 §4.1</a>
 *
 * @param pepManager The PEP manager.
 * @param pubkeyElement {@link PubkeyElement} containing the public key
 * @param fingerprint fingerprint of the public key
 *
 * @throws InterruptedException if the thread gets interrupted.
 * @throws PubSubException.NotALeafNodeException if either the metadata node or the public key node is not a
 *                                               {@link LeafNode}.
 * @throws XMPPException.XMPPErrorException in case of an XMPP protocol error.
 * @throws SmackException.NotConnectedException if we are not connected.
 * @throws SmackException.NoResponseException if the server doesn't respond.
 */
public static void publishPublicKey(PepManager pepManager, PubkeyElement pubkeyElement, OpenPgpV4Fingerprint fingerprint) throws InterruptedException, PubSubException.NotALeafNodeException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, SmackException.NoResponseException {
    String keyNodeName = PEP_NODE_PUBLIC_KEY(fingerprint);
    PubSubManager pm = pepManager.getPepPubSubManager();
    // Check if key available at data node
    // If not, publish key to data node
    LeafNode keyNode = pm.getOrCreateLeafNode(keyNodeName);
    changeAccessModelIfNecessary(keyNode, AccessModel.open);
    List<Item> items = keyNode.getItems(1);
    if (items.isEmpty()) {
        LOGGER.log(Level.FINE, "Node " + keyNodeName + " is empty. Publish.");
        keyNode.publish(new PayloadItem<>(pubkeyElement));
    } else {
        LOGGER.log(Level.FINE, "Node " + keyNodeName + " already contains key. Skip.");
    }
    // Fetch IDs from metadata node
    LeafNode metadataNode = pm.getOrCreateLeafNode(PEP_NODE_PUBLIC_KEYS);
    changeAccessModelIfNecessary(metadataNode, AccessModel.open);
    List<PayloadItem<PublicKeysListElement>> metadataItems = metadataNode.getItems(1);
    PublicKeysListElement.Builder builder = PublicKeysListElement.builder();
    if (!metadataItems.isEmpty() && metadataItems.get(0).getPayload() != null) {
        // Add old entries back to list.
        PublicKeysListElement publishedList = metadataItems.get(0).getPayload();
        for (PublicKeysListElement.PubkeyMetadataElement meta : publishedList.getMetadata().values()) {
            builder.addMetadata(meta);
        }
    }
    builder.addMetadata(new PublicKeysListElement.PubkeyMetadataElement(fingerprint, new Date()));
    // Publish IDs to metadata node
    metadataNode.publish(new PayloadItem<>(builder.build()));
}
Also used : PubSubManager(org.jivesoftware.smackx.pubsub.PubSubManager) PayloadItem(org.jivesoftware.smackx.pubsub.PayloadItem) Item(org.jivesoftware.smackx.pubsub.Item) PayloadItem(org.jivesoftware.smackx.pubsub.PayloadItem) PublicKeysListElement(org.jivesoftware.smackx.ox.element.PublicKeysListElement) LeafNode(org.jivesoftware.smackx.pubsub.LeafNode) Date(java.util.Date)

Example 5 with PayloadItem

use of org.jivesoftware.smackx.pubsub.PayloadItem in project Smack by igniterealtime.

the class OpenPgpPubSubUtil method fetchPubkey.

/**
 * Fetch the OpenPGP public key of a {@code contact}, identified by its OpenPGP {@code v4_fingerprint}.
 *
 * @see <a href="https://xmpp.org/extensions/xep-0373.html#discover-pubkey">XEP-0373 §4.3</a>
 *
 * @param connection XMPP connection
 * @param contact {@link BareJid} of the contact we want to fetch a key from.
 * @param v4_fingerprint upper case, hex encoded v4 fingerprint of the contacts key.
 * @return {@link PubkeyElement} containing the requested public key.
 *
 * @throws InterruptedException if the thread gets interrupted.A
 * @throws XMPPException.XMPPErrorException in case of an XMPP protocol error.
 * @throws PubSubException.NotAPubSubNodeException in case the targeted entity is not a PubSub node.
 * @throws PubSubException.NotALeafNodeException in case the fetched node is not a {@link LeafNode}.
 * @throws SmackException.NotConnectedException in case we are not connected.
 * @throws SmackException.NoResponseException if the server doesn't respond.
 */
public static PubkeyElement fetchPubkey(XMPPConnection connection, BareJid contact, OpenPgpV4Fingerprint v4_fingerprint) throws InterruptedException, XMPPException.XMPPErrorException, PubSubException.NotAPubSubNodeException, PubSubException.NotALeafNodeException, SmackException.NotConnectedException, SmackException.NoResponseException {
    PubSubManager pm = PubSubManager.getInstanceFor(connection, contact);
    String nodeName = PEP_NODE_PUBLIC_KEY(v4_fingerprint);
    LeafNode node = getLeafNode(pm, nodeName);
    List<PayloadItem<PubkeyElement>> list = node.getItems(1);
    if (list.isEmpty()) {
        return null;
    }
    return list.get(0).getPayload();
}
Also used : PubSubManager(org.jivesoftware.smackx.pubsub.PubSubManager) PayloadItem(org.jivesoftware.smackx.pubsub.PayloadItem) LeafNode(org.jivesoftware.smackx.pubsub.LeafNode)

Aggregations

PayloadItem (org.jivesoftware.smackx.pubsub.PayloadItem)9 LeafNode (org.jivesoftware.smackx.pubsub.LeafNode)6 PubSubManager (org.jivesoftware.smackx.pubsub.PubSubManager)6 Item (org.jivesoftware.smackx.pubsub.Item)4 SimplePayload (org.jivesoftware.smackx.pubsub.SimplePayload)3 ExtensionElement (org.jivesoftware.smack.packet.ExtensionElement)2 Date (java.util.Date)1 XmlPullParser (org.jivesoftware.smack.xml.XmlPullParser)1 PublicKeysListElement (org.jivesoftware.smackx.ox.element.PublicKeysListElement)1 SecretkeyElement (org.jivesoftware.smackx.ox.element.SecretkeyElement)1 ItemNamespace (org.jivesoftware.smackx.pubsub.Item.ItemNamespace)1