@Override
  public void processPacket(Stanza packet) {
    PublicKeyPublish p = (PublicKeyPublish) packet;

    if (p.getType() == IQ.Type.result) {
      byte[] _publicKey = p.getPublicKey();

      if (_publicKey != null) {
        String from = XmppStringUtils.parseBareJid(p.getFrom());
        boolean selfJid = Authenticator.isSelfJID(getContext(), from);

        // is this our key?
        if (selfJid) {
          byte[] bridgeCertData;
          try {
            PersonalKey key = getApplication().getPersonalKey();

            bridgeCertData =
                X509Bridge.createCertificate(_publicKey, key.getAuthKeyPair().getPrivateKey())
                    .getEncoded();
          } catch (Exception e) {
            Log.e(MessageCenterService.TAG, "error decoding key data", e);
            bridgeCertData = null;
          }

          if (bridgeCertData != null) {
            // store key data in AccountManager
            Authenticator.setDefaultPersonalKey(
                getContext(), _publicKey, null, bridgeCertData, null);
            // invalidate cached personal key
            getApplication().invalidatePersonalKey();

            Log.v(MessageCenterService.TAG, "personal key updated.");
          }
        }

        String id = p.getStanzaId();

        // broadcast key update
        Intent i = new Intent(ACTION_PUBLICKEY);
        i.putExtra(EXTRA_PACKET_ID, id);
        i.putExtra(EXTRA_FROM, p.getFrom());
        i.putExtra(EXTRA_TO, p.getTo());
        i.putExtra(EXTRA_PUBLIC_KEY, _publicKey);
        sendBroadcast(i);

        // if we are not syncing and this is not a response for the Syncer
        // save the key immediately
        if (!SyncAdapter.getIQPacketId().equals(id) || !SyncAdapter.isActive(getContext())) {

          // updating server key
          if (XmppStringUtils.parseDomain(from).equals(from)) {
            Log.v("pubkey", "Updating server key for " + from);
            try {
              Keyring.setKey(getContext(), from, _publicKey);
            } catch (Exception e) {
              // TODO warn user
              Log.e(MessageCenterService.TAG, "unable to update user key", e);
            }
          } else {
            try {
              Log.v("pubkey", "Updating key for " + from);
              Keyring.setKey(
                  getContext(), from, _publicKey, selfJid ? MyUsers.Keys.TRUST_VERIFIED : -1);

              // update display name with uid (if empty)
              PGPUserID keyUid = PGP.parseUserId(_publicKey, getConnection().getServiceName());
              if (keyUid != null && keyUid.getName() != null)
                UsersProvider.updateDisplayNameIfEmpty(getContext(), from, keyUid.getName());

              // invalidate cache for this user
              Contact.invalidate(from);
            } catch (Exception e) {
              // TODO warn user
              Log.e(MessageCenterService.TAG, "unable to update user key", e);
            }
          }
        }
      }
    }
  }