Search in sources :

Example 71 with Jid

use of eu.siacs.conversations.xmpp.Jid in project Conversations by siacs.

the class ListItemAdapter method getView.

@Override
public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = activity.getLayoutInflater();
    ListItem item = getItem(position);
    ViewHolder viewHolder;
    if (view == null) {
        ContactBinding binding = DataBindingUtil.inflate(inflater, R.layout.contact, parent, false);
        viewHolder = ViewHolder.get(binding);
        view = binding.getRoot();
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }
    view.setBackground(StyledAttributes.getDrawable(view.getContext(), R.attr.list_item_background));
    List<ListItem.Tag> tags = item.getTags(activity);
    if (tags.size() == 0 || !this.showDynamicTags) {
        viewHolder.tags.setVisibility(View.GONE);
    } else {
        viewHolder.tags.setVisibility(View.VISIBLE);
        viewHolder.tags.removeAllViewsInLayout();
        for (ListItem.Tag tag : tags) {
            TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, viewHolder.tags, false);
            tv.setText(tag.getName());
            tv.setBackgroundColor(tag.getColor());
            tv.setOnClickListener(this.onTagTvClick);
            viewHolder.tags.addView(tv);
        }
    }
    final Jid jid = item.getJid();
    if (jid != null) {
        viewHolder.jid.setVisibility(View.VISIBLE);
        viewHolder.jid.setText(IrregularUnicodeDetector.style(activity, jid));
    } else {
        viewHolder.jid.setVisibility(View.GONE);
    }
    viewHolder.name.setText(EmojiWrapper.transform(item.getDisplayName()));
    AvatarWorkerTask.loadAvatar(item, viewHolder.avatar, R.dimen.avatar);
    return view;
}
Also used : Jid(eu.siacs.conversations.xmpp.Jid) LayoutInflater(android.view.LayoutInflater) TextView(android.widget.TextView) ListItem(eu.siacs.conversations.entities.ListItem) ContactBinding(eu.siacs.conversations.databinding.ContactBinding)

Example 72 with Jid

use of eu.siacs.conversations.xmpp.Jid in project Conversations by siacs.

the class TrustKeysActivity method reloadFingerprints.

private boolean reloadFingerprints() {
    List<Jid> acceptedTargets = mConversation == null ? new ArrayList<>() : mConversation.getAcceptedCryptoTargets();
    ownKeysToTrust.clear();
    if (this.mAccount == null) {
        return false;
    }
    AxolotlService service = this.mAccount.getAxolotlService();
    Set<IdentityKey> ownKeysSet = service.getKeysWithTrust(FingerprintStatus.createActiveUndecided());
    for (final IdentityKey identityKey : ownKeysSet) {
        final String fingerprint = CryptoHelper.bytesToHex(identityKey.getPublicKey().serialize());
        if (!ownKeysToTrust.containsKey(fingerprint)) {
            ownKeysToTrust.put(fingerprint, false);
        }
    }
    synchronized (this.foreignKeysToTrust) {
        foreignKeysToTrust.clear();
        for (Jid jid : contactJids) {
            Set<IdentityKey> foreignKeysSet = service.getKeysWithTrust(FingerprintStatus.createActiveUndecided(), jid);
            if (hasNoOtherTrustedKeys(jid) && ownKeysSet.size() == 0) {
                foreignKeysSet.addAll(service.getKeysWithTrust(FingerprintStatus.createActive(false), jid));
            }
            Map<String, Boolean> foreignFingerprints = new HashMap<>();
            for (final IdentityKey identityKey : foreignKeysSet) {
                final String fingerprint = CryptoHelper.bytesToHex(identityKey.getPublicKey().serialize());
                if (!foreignFingerprints.containsKey(fingerprint)) {
                    foreignFingerprints.put(fingerprint, false);
                }
            }
            if (foreignFingerprints.size() > 0 || !acceptedTargets.contains(jid)) {
                foreignKeysToTrust.put(jid, foreignFingerprints);
            }
        }
    }
    return ownKeysSet.size() + foreignKeysToTrust.size() > 0;
}
Also used : AxolotlService(eu.siacs.conversations.crypto.axolotl.AxolotlService) IdentityKey(org.whispersystems.libsignal.IdentityKey) Jid(eu.siacs.conversations.xmpp.Jid) HashMap(java.util.HashMap) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean)

Example 73 with Jid

use of eu.siacs.conversations.xmpp.Jid in project Conversations by siacs.

the class StartConversationActivity method onActivityResult.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (resultCode == RESULT_OK) {
        if (xmppConnectionServiceBound) {
            this.mPostponedActivityResult = null;
            if (requestCode == REQUEST_CREATE_CONFERENCE) {
                Account account = extractAccount(intent);
                final String name = intent.getStringExtra(ChooseContactActivity.EXTRA_GROUP_CHAT_NAME);
                final List<Jid> jids = ChooseContactActivity.extractJabberIds(intent);
                if (account != null && jids.size() > 0) {
                    if (xmppConnectionService.createAdhocConference(account, name, jids, mAdhocConferenceCallback)) {
                        mToast = Toast.makeText(this, R.string.creating_conference, Toast.LENGTH_LONG);
                        mToast.show();
                    }
                }
            }
        } else {
            this.mPostponedActivityResult = new Pair<>(requestCode, intent);
        }
    }
    super.onActivityResult(requestCode, requestCode, intent);
}
Also used : Account(eu.siacs.conversations.entities.Account) Jid(eu.siacs.conversations.xmpp.Jid)

Example 74 with Jid

use of eu.siacs.conversations.xmpp.Jid in project Conversations by siacs.

the class AxolotlService method verifySessionWithPEP.

private ListenableFuture<XmppAxolotlSession> verifySessionWithPEP(final XmppAxolotlSession session) {
    Log.d(Config.LOGTAG, "trying to verify fresh session (" + session.getRemoteAddress().getName() + ") with pep");
    final SignalProtocolAddress address = session.getRemoteAddress();
    final IdentityKey identityKey = session.getIdentityKey();
    final Jid jid;
    try {
        jid = Jid.of(address.getName());
    } catch (final IllegalArgumentException e) {
        fetchStatusMap.put(address, FetchStatus.SUCCESS);
        finishBuildingSessionsFromPEP(address);
        return Futures.immediateFuture(session);
    }
    final SettableFuture<XmppAxolotlSession> future = SettableFuture.create();
    final IqPacket packet = mXmppConnectionService.getIqGenerator().retrieveVerificationForDevice(jid, address.getDeviceId());
    mXmppConnectionService.sendIqPacket(account, packet, (account, response) -> {
        Pair<X509Certificate[], byte[]> verification = mXmppConnectionService.getIqParser().verification(response);
        if (verification != null) {
            try {
                Signature verifier = Signature.getInstance("sha256WithRSA");
                verifier.initVerify(verification.first[0]);
                verifier.update(identityKey.serialize());
                if (verifier.verify(verification.second)) {
                    try {
                        mXmppConnectionService.getMemorizingTrustManager().getNonInteractive().checkClientTrusted(verification.first, "RSA");
                        String fingerprint = session.getFingerprint();
                        Log.d(Config.LOGTAG, "verified session with x.509 signature. fingerprint was: " + fingerprint);
                        setFingerprintTrust(fingerprint, FingerprintStatus.createActiveVerified(true));
                        axolotlStore.setFingerprintCertificate(fingerprint, verification.first[0]);
                        fetchStatusMap.put(address, FetchStatus.SUCCESS_VERIFIED);
                        Bundle information = CryptoHelper.extractCertificateInformation(verification.first[0]);
                        try {
                            final String cn = information.getString("subject_cn");
                            final Jid jid1 = Jid.of(address.getName());
                            Log.d(Config.LOGTAG, "setting common name for " + jid1 + " to " + cn);
                            account.getRoster().getContact(jid1).setCommonName(cn);
                        } catch (final IllegalArgumentException ignored) {
                        // ignored
                        }
                        finishBuildingSessionsFromPEP(address);
                        future.set(session);
                        return;
                    } catch (Exception e) {
                        Log.d(Config.LOGTAG, "could not verify certificate");
                    }
                }
            } catch (Exception e) {
                Log.d(Config.LOGTAG, "error during verification " + e.getMessage());
            }
        } else {
            Log.d(Config.LOGTAG, "no verification found");
        }
        fetchStatusMap.put(address, FetchStatus.SUCCESS);
        finishBuildingSessionsFromPEP(address);
        future.set(session);
    });
    return future;
}
Also used : IdentityKey(org.whispersystems.libsignal.IdentityKey) Jid(eu.siacs.conversations.xmpp.Jid) Bundle(android.os.Bundle) PreKeyBundle(org.whispersystems.libsignal.state.PreKeyBundle) Signature(java.security.Signature) SignalProtocolAddress(org.whispersystems.libsignal.SignalProtocolAddress) UntrustedIdentityException(org.whispersystems.libsignal.UntrustedIdentityException) InvalidKeyIdException(org.whispersystems.libsignal.InvalidKeyIdException) InvalidKeyException(org.whispersystems.libsignal.InvalidKeyException) IqPacket(eu.siacs.conversations.xmpp.stanzas.IqPacket)

Example 75 with Jid

use of eu.siacs.conversations.xmpp.Jid in project Conversations by siacs.

the class AxolotlService method findDevicesWithoutSession.

public Set<SignalProtocolAddress> findDevicesWithoutSession(final Conversation conversation) {
    Set<SignalProtocolAddress> addresses = new HashSet<>();
    for (Jid jid : getCryptoTargets(conversation)) {
        Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Finding devices without session for " + jid);
        final Set<Integer> ids = deviceIds.get(jid);
        if (ids != null && !ids.isEmpty()) {
            for (Integer foreignId : ids) {
                SignalProtocolAddress address = new SignalProtocolAddress(jid.toString(), foreignId);
                if (sessions.get(address) == null) {
                    IdentityKey identityKey = axolotlStore.loadSession(address).getSessionState().getRemoteIdentityKey();
                    if (identityKey != null) {
                        Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Already have session for " + address.toString() + ", adding to cache...");
                        XmppAxolotlSession session = new XmppAxolotlSession(account, axolotlStore, address, identityKey);
                        sessions.put(address, session);
                    } else {
                        Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Found device " + jid + ":" + foreignId);
                        if (fetchStatusMap.get(address) != FetchStatus.ERROR) {
                            addresses.add(address);
                        } else {
                            Log.d(Config.LOGTAG, getLogprefix(account) + "skipping over " + address + " because it's broken");
                        }
                    }
                }
            }
        } else {
            mXmppConnectionService.keyStatusUpdated(FetchStatus.ERROR);
            Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Have no target devices in PEP!");
        }
    }
    Set<Integer> ownIds = this.deviceIds.get(account.getJid().asBareJid());
    for (Integer ownId : (ownIds != null ? ownIds : new HashSet<Integer>())) {
        SignalProtocolAddress address = new SignalProtocolAddress(account.getJid().asBareJid().toString(), ownId);
        if (sessions.get(address) == null) {
            IdentityKey identityKey = axolotlStore.loadSession(address).getSessionState().getRemoteIdentityKey();
            if (identityKey != null) {
                Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Already have session for " + address.toString() + ", adding to cache...");
                XmppAxolotlSession session = new XmppAxolotlSession(account, axolotlStore, address, identityKey);
                sessions.put(address, session);
            } else {
                Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Found device " + account.getJid().asBareJid() + ":" + ownId);
                if (fetchStatusMap.get(address) != FetchStatus.ERROR) {
                    addresses.add(address);
                } else {
                    Log.d(Config.LOGTAG, getLogprefix(account) + "skipping over " + address + " because it's broken");
                }
            }
        }
    }
    return addresses;
}
Also used : IdentityKey(org.whispersystems.libsignal.IdentityKey) Jid(eu.siacs.conversations.xmpp.Jid) SignalProtocolAddress(org.whispersystems.libsignal.SignalProtocolAddress) HashSet(java.util.HashSet)

Aggregations

Jid (eu.siacs.conversations.xmpp.Jid)106 Account (eu.siacs.conversations.entities.Account)35 Element (eu.siacs.conversations.xml.Element)24 Conversation (eu.siacs.conversations.entities.Conversation)22 Contact (eu.siacs.conversations.entities.Contact)17 InvalidJid (eu.siacs.conversations.xmpp.InvalidJid)16 IqPacket (eu.siacs.conversations.xmpp.stanzas.IqPacket)16 Intent (android.content.Intent)15 ArrayList (java.util.ArrayList)13 MucOptions (eu.siacs.conversations.entities.MucOptions)12 Bookmark (eu.siacs.conversations.entities.Bookmark)10 AxolotlService (eu.siacs.conversations.crypto.axolotl.AxolotlService)7 Message (eu.siacs.conversations.entities.Message)7 OnIqPacketReceived (eu.siacs.conversations.xmpp.OnIqPacketReceived)6 MessagePacket (eu.siacs.conversations.xmpp.stanzas.MessagePacket)6 Map (java.util.Map)6 XmppUri (eu.siacs.conversations.utils.XmppUri)5 XmppConnectionService (eu.siacs.conversations.services.XmppConnectionService)4 Avatar (eu.siacs.conversations.xmpp.pep.Avatar)4 HashMap (java.util.HashMap)4