Search in sources :

Example 16 with IqPacket

use of de.pixart.messenger.xmpp.stanzas.IqPacket in project Pix-Art-Messenger by kriztan.

the class XmppConnectionService method pushBookmarks.

public void pushBookmarks(Account account) {
    Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": pushing bookmarks");
    IqPacket iqPacket = new IqPacket(IqPacket.TYPE.SET);
    Element query = iqPacket.query("jabber:iq:private");
    Element storage = query.addChild("storage", "storage:bookmarks");
    for (Bookmark bookmark : account.getBookmarks()) {
        storage.addChild(bookmark);
    }
    sendIqPacket(account, iqPacket, mDefaultIqHandler);
}
Also used : Bookmark(de.pixart.messenger.entities.Bookmark) Element(de.pixart.messenger.xml.Element) IqPacket(de.pixart.messenger.xmpp.stanzas.IqPacket)

Example 17 with IqPacket

use of de.pixart.messenger.xmpp.stanzas.IqPacket in project Pix-Art-Messenger by kriztan.

the class XmppConnectionService method fetchAvatarVcard.

private void fetchAvatarVcard(final Account account, final Avatar avatar, final UiCallback<Avatar> callback) {
    IqPacket packet = this.mIqGenerator.retrieveVcardAvatar(avatar);
    this.sendIqPacket(account, packet, new OnIqPacketReceived() {

        @Override
        public void onIqPacketReceived(Account account, IqPacket packet) {
            synchronized (mInProgressAvatarFetches) {
                mInProgressAvatarFetches.remove(generateFetchKey(account, avatar));
            }
            if (packet.getType() == IqPacket.TYPE.RESULT) {
                Element vCard = packet.findChild("vCard", "vcard-temp");
                Element photo = vCard != null ? vCard.findChild("PHOTO") : null;
                String image = photo != null ? photo.findChildContent("BINVAL") : null;
                if (image != null) {
                    avatar.image = image;
                    if (getFileBackend().save(avatar)) {
                        Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": successfully fetched vCard avatar for " + avatar.owner);
                        if (avatar.owner.isBareJid()) {
                            if (account.getJid().toBareJid().equals(avatar.owner) && account.getAvatar() == null) {
                                Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": had no avatar. replacing with vcard");
                                account.setAvatar(avatar.getFilename());
                                databaseBackend.updateAccount(account);
                                getAvatarService().clear(account);
                                updateAccountUi();
                            } else {
                                Contact contact = account.getRoster().getContact(avatar.owner);
                                contact.setAvatar(avatar);
                                getAvatarService().clear(contact);
                                updateRosterUi();
                            }
                            updateConversationUi();
                        } else {
                            Conversation conversation = find(account, avatar.owner.toBareJid());
                            if (conversation != null && conversation.getMode() == Conversation.MODE_MULTI) {
                                MucOptions.User user = conversation.getMucOptions().findUserByFullJid(avatar.owner);
                                if (user != null) {
                                    if (user.setAvatar(avatar)) {
                                        getAvatarService().clear(user);
                                        updateConversationUi();
                                        updateMucRosterUi();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    });
}
Also used : Account(de.pixart.messenger.entities.Account) OnIqPacketReceived(de.pixart.messenger.xmpp.OnIqPacketReceived) Element(de.pixart.messenger.xml.Element) Conversation(de.pixart.messenger.entities.Conversation) IqPacket(de.pixart.messenger.xmpp.stanzas.IqPacket) Contact(de.pixart.messenger.entities.Contact)

Example 18 with IqPacket

use of de.pixart.messenger.xmpp.stanzas.IqPacket in project Pix-Art-Messenger by kriztan.

the class HttpUploadConnection method init.

public void init(Message message, boolean delay) {
    this.message = message;
    final Account account = message.getConversation().getAccount();
    this.file = mXmppConnectionService.getFileBackend().getFile(message, false);
    if (message.getEncryption() == Message.ENCRYPTION_PGP || message.getEncryption() == Message.ENCRYPTION_DECRYPTED) {
        this.mime = "application/pgp-encrypted";
    } else {
        this.mime = this.file.getMimeType();
    }
    this.delayed = delay;
    if (Config.ENCRYPT_ON_HTTP_UPLOADED || message.getEncryption() == Message.ENCRYPTION_AXOLOTL || message.getEncryption() == Message.ENCRYPTION_OTR) {
        // todo: change this to 44 for 12-byte IV instead of 16-byte at some point in future
        this.key = new byte[48];
        mXmppConnectionService.getRNG().nextBytes(this.key);
        this.file.setKeyAndIv(this.key);
    }
    Pair<InputStream, Integer> pair;
    try {
        pair = AbstractConnectionManager.createInputStream(file, true);
    } catch (FileNotFoundException e) {
        Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": could not find file to upload - " + e.getMessage());
        fail(e.getMessage());
        return;
    }
    this.file.setExpectedSize(pair.second);
    message.resetFileParams();
    this.mFileInputStream = pair.first;
    Jid host = account.getXmppConnection().findDiscoItemByFeature(Namespace.HTTP_UPLOAD);
    IqPacket request = mXmppConnectionService.getIqGenerator().requestHttpUploadSlot(host, file, mime);
    mXmppConnectionService.sendIqPacket(account, request, (a, packet) -> {
        if (packet.getType() == IqPacket.TYPE.RESULT) {
            Element slot = packet.findChild("slot", Namespace.HTTP_UPLOAD);
            if (slot != null) {
                try {
                    final Element put = slot.findChild("put");
                    final Element get = slot.findChild("get");
                    final String putUrl = put == null ? null : put.getAttribute("url");
                    final String getUrl = get == null ? null : get.getAttribute("url");
                    if (getUrl != null && putUrl != null) {
                        this.mGetUrl = new URL(getUrl);
                        this.mPutUrl = new URL(putUrl);
                        this.mPutHeaders = new HashMap<>();
                        for (Element child : put.getChildren()) {
                            if ("header".equals(child.getName())) {
                                final String name = child.getAttribute("name");
                                final String value = child.getContent();
                                if (WHITE_LISTED_HEADERS.contains(name) && value != null && !value.trim().contains("\n")) {
                                    this.mPutHeaders.put(name, value.trim());
                                }
                            }
                        }
                        if (!canceled) {
                            new Thread(this::upload).start();
                        }
                        return;
                    }
                } catch (MalformedURLException e) {
                // fall through
                }
            }
        }
        Log.d(Config.LOGTAG, account.getJid().toString() + ": invalid response to slot request " + packet);
        fail(IqParser.extractErrorMessage(packet));
    });
    message.setTransferable(this);
    mXmppConnectionService.markMessage(message, Message.STATUS_UNSEND);
}
Also used : Account(de.pixart.messenger.entities.Account) MalformedURLException(java.net.MalformedURLException) Jid(de.pixart.messenger.xmpp.jid.Jid) InputStream(java.io.InputStream) Element(de.pixart.messenger.xml.Element) FileNotFoundException(java.io.FileNotFoundException) URL(java.net.URL) IqPacket(de.pixart.messenger.xmpp.stanzas.IqPacket)

Example 19 with IqPacket

use of de.pixart.messenger.xmpp.stanzas.IqPacket in project Pix-Art-Messenger by kriztan.

the class IqParser method onIqPacketReceived.

@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
    final boolean isGet = packet.getType() == IqPacket.TYPE.GET;
    if (packet.getType() == IqPacket.TYPE.ERROR || packet.getType() == IqPacket.TYPE.TIMEOUT) {
        return;
    } else if (packet.hasChild("query", Namespace.ROSTER) && packet.fromServer(account)) {
        final Element query = packet.findChild("query");
        // If this is in response to a query for the whole roster:
        if (packet.getType() == IqPacket.TYPE.RESULT) {
            account.getRoster().markAllAsNotInRoster();
        }
        this.rosterItems(account, query);
    } else if ((packet.hasChild("block", Namespace.BLOCKING) || packet.hasChild("blocklist", Namespace.BLOCKING)) && packet.fromServer(account)) {
        // Block list or block push.
        Log.d(Config.LOGTAG, "Received blocklist update from server");
        final Element blocklist = packet.findChild("blocklist", Namespace.BLOCKING);
        final Element block = packet.findChild("block", Namespace.BLOCKING);
        final Collection<Element> items = blocklist != null ? blocklist.getChildren() : (block != null ? block.getChildren() : null);
        // Otherwise, just update the existing blocklist.
        if (packet.getType() == IqPacket.TYPE.RESULT) {
            account.clearBlocklist();
            account.getXmppConnection().getFeatures().setBlockListRequested(true);
        }
        if (items != null) {
            final Collection<Jid> jids = new ArrayList<>(items.size());
            // Create a collection of Jids from the packet
            for (final Element item : items) {
                if (item.getName().equals("item")) {
                    final Jid jid = item.getAttributeAsJid("jid");
                    if (jid != null) {
                        jids.add(jid);
                    }
                }
            }
            account.getBlocklist().addAll(jids);
            if (packet.getType() == IqPacket.TYPE.SET) {
                boolean removed = false;
                for (Jid jid : jids) {
                    removed |= mXmppConnectionService.removeBlockedConversations(account, jid);
                }
                if (removed) {
                    mXmppConnectionService.updateConversationUi();
                }
            }
        }
        // Update the UI
        mXmppConnectionService.updateBlocklistUi(OnUpdateBlocklist.Status.BLOCKED);
        if (packet.getType() == IqPacket.TYPE.SET) {
            final IqPacket response = packet.generateResponse(IqPacket.TYPE.RESULT);
            mXmppConnectionService.sendIqPacket(account, response, null);
        }
    } else if (packet.hasChild("unblock", Namespace.BLOCKING) && packet.fromServer(account) && packet.getType() == IqPacket.TYPE.SET) {
        Log.d(Config.LOGTAG, "Received unblock update from server");
        final Collection<Element> items = packet.findChild("unblock", Namespace.BLOCKING).getChildren();
        if (items.size() == 0) {
            // No children to unblock == unblock all
            account.getBlocklist().clear();
        } else {
            final Collection<Jid> jids = new ArrayList<>(items.size());
            for (final Element item : items) {
                if (item.getName().equals("item")) {
                    final Jid jid = item.getAttributeAsJid("jid");
                    if (jid != null) {
                        jids.add(jid);
                    }
                }
            }
            account.getBlocklist().removeAll(jids);
        }
        mXmppConnectionService.updateBlocklistUi(OnUpdateBlocklist.Status.UNBLOCKED);
        final IqPacket response = packet.generateResponse(IqPacket.TYPE.RESULT);
        mXmppConnectionService.sendIqPacket(account, response, null);
    } else if (packet.hasChild("open", "http://jabber.org/protocol/ibb") || packet.hasChild("data", "http://jabber.org/protocol/ibb") || packet.hasChild("close", "http://jabber.org/protocol/ibb")) {
        mXmppConnectionService.getJingleConnectionManager().deliverIbbPacket(account, packet);
    } else if (packet.hasChild("query", "http://jabber.org/protocol/disco#info")) {
        final IqPacket response = mXmppConnectionService.getIqGenerator().discoResponse(packet);
        mXmppConnectionService.sendIqPacket(account, response, null);
    } else if (packet.hasChild("query", "jabber:iq:version") && isGet) {
        final IqPacket response = mXmppConnectionService.getIqGenerator().versionResponse(packet);
        mXmppConnectionService.sendIqPacket(account, response, null);
    } else if (packet.hasChild("ping", "urn:xmpp:ping") && isGet) {
        final IqPacket response = packet.generateResponse(IqPacket.TYPE.RESULT);
        mXmppConnectionService.sendIqPacket(account, response, null);
    } else if (packet.hasChild("time", "urn:xmpp:time") && isGet) {
        final IqPacket response;
        if (mXmppConnectionService.useTorToConnect()) {
            response = packet.generateResponse(IqPacket.TYPE.ERROR);
            final Element error = response.addChild("error");
            error.setAttribute("type", "cancel");
            error.addChild("not-allowed", "urn:ietf:params:xml:ns:xmpp-stanzas");
        } else {
            response = mXmppConnectionService.getIqGenerator().entityTimeResponse(packet);
        }
        mXmppConnectionService.sendIqPacket(account, response, null);
    } else {
        if (packet.getType() == IqPacket.TYPE.GET || packet.getType() == IqPacket.TYPE.SET) {
            final IqPacket response = packet.generateResponse(IqPacket.TYPE.ERROR);
            final Element error = response.addChild("error");
            error.setAttribute("type", "cancel");
            error.addChild("feature-not-implemented", "urn:ietf:params:xml:ns:xmpp-stanzas");
            account.getXmppConnection().sendIqPacket(response, null);
        }
    }
}
Also used : Jid(de.pixart.messenger.xmpp.jid.Jid) Element(de.pixart.messenger.xml.Element) ArrayList(java.util.ArrayList) Collection(java.util.Collection) IqPacket(de.pixart.messenger.xmpp.stanzas.IqPacket)

Example 20 with IqPacket

use of de.pixart.messenger.xmpp.stanzas.IqPacket in project Pix-Art-Messenger by kriztan.

the class IqGenerator method retrieveVerificationForDevice.

public IqPacket retrieveVerificationForDevice(final Jid to, final int deviceid) {
    final IqPacket packet = retrieve(AxolotlService.PEP_VERIFICATION + ":" + deviceid, null);
    packet.setTo(to);
    return packet;
}
Also used : IqPacket(de.pixart.messenger.xmpp.stanzas.IqPacket)

Aggregations

IqPacket (de.pixart.messenger.xmpp.stanzas.IqPacket)81 Element (de.pixart.messenger.xml.Element)48 Account (de.pixart.messenger.entities.Account)39 OnIqPacketReceived (de.pixart.messenger.xmpp.OnIqPacketReceived)31 Jid (de.pixart.messenger.xmpp.jid.Jid)15 ArrayList (java.util.ArrayList)7 Data (de.pixart.messenger.xmpp.forms.Data)6 InvalidJidException (de.pixart.messenger.xmpp.jid.InvalidJidException)6 PreKeyBundle (org.whispersystems.libsignal.state.PreKeyBundle)5 JinglePacket (de.pixart.messenger.xmpp.jingle.stanzas.JinglePacket)4 IOException (java.io.IOException)4 InvalidKeyException (org.whispersystems.libsignal.InvalidKeyException)4 Bundle (android.os.Bundle)3 Pair (android.util.Pair)3 Contact (de.pixart.messenger.entities.Contact)3 Conversation (de.pixart.messenger.entities.Conversation)3 FileNotFoundException (java.io.FileNotFoundException)3 InputStream (java.io.InputStream)3 HashSet (java.util.HashSet)3 List (java.util.List)3