public static PubSubEvent getPubSubEvent(Packet packet) {
    if (log.isTraceEnabled()) log.trace("Getting pubsub from " + packet.toXML());

    PacketExtension ext = packet.getExtension("event", PubSubEventProvider.NS);
    if (ext == null) ext = packet.getExtension("x", PubSubEventProvider.NS);

    if (log.isTraceEnabled()) log.trace("Got " + (ext == null ? "nothing" : ext.toXML()));

    return (PubSubEvent) ext;
  }
Beispiel #2
0
    public boolean accept(Packet packet) {
      if (!(packet instanceof Message)) return false;

      EventElement event =
          (EventElement) packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());

      if (event == null) return false;

      NodeExtension embedEvent = event.getEvent();

      if (embedEvent == null) return false;

      if (embedEvent.getElementName().equals(firstElement)) {
        if (!embedEvent.getNode().equals(getId())) return false;

        if (secondElement == null) return true;

        if (embedEvent instanceof EmbeddedPacketExtension) {
          List<PacketExtension> secondLevelList =
              ((EmbeddedPacketExtension) embedEvent).getExtensions();

          if (secondLevelList.size() > 0
              && secondLevelList.get(0).getElementName().equals(secondElement)) return true;
        }
      }
      return false;
    }
Beispiel #3
0
    public void processPacket(Packet packet) {
      EventElement event =
          (EventElement) packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());
      ConfigurationEvent config = (ConfigurationEvent) event.getEvent();

      listener.handleNodeConfiguration(config);
    }
Beispiel #4
0
    /**
     * Handles incoming presence packets and maps jids to node#ver strings.
     *
     * @param packet the incoming presence <tt>Packet</tt> to be handled
     * @see PacketListener#processPacket(Packet)
     */
    public void processPacket(Packet packet) {
      CapsPacketExtension ext =
          (CapsPacketExtension)
              packet.getExtension(CapsPacketExtension.ELEMENT_NAME, CapsPacketExtension.NAMESPACE);

      /*
       * Before Version 1.4 of XEP-0115: Entity Capabilities, the 'ver'
       * attribute was generated differently and the 'hash' attribute was
       * absent. The 'ver' attribute in Version 1.3 represents the
       * specific version of the client and thus does not provide a way to
       * validate the DiscoverInfo sent by the client. If
       * EntityCapsManager receives no 'hash' attribute, it will assume
       * the legacy format and will not cache it because the DiscoverInfo
       * to be received from the client later on will not be trustworthy.
       */
      String hash = ext.getHash();

      /* Google Talk web does not set hash but we need it to be cached */
      if (hash == null) hash = "";

      if (hash != null) {
        // Check it the packet indicates  that the user is online. We
        // will use this information to decide if we're going to send
        // the discover info request.
        boolean online = (packet instanceof Presence) && ((Presence) packet).isAvailable();

        if (online) {
          addUserCapsNode(
              packet.getFrom(), ext.getNode(), hash, ext.getVersion(), ext.getExtensions(), online);
        } else {
          removeUserCapsNode(packet.getFrom());
        }
      }
    }
 /**
  * Gets the subscriptions on the root node.
  *
  * @return List of exceptions
  * @throws XMPPException
  */
 public List<Subscription> getSubscriptions() throws XMPPException {
   Packet reply = sendPubsubPacket(Type.GET, new NodeExtension(PubSubElementType.SUBSCRIPTIONS));
   SubscriptionsExtension subElem =
       (SubscriptionsExtension)
           reply.getExtension(
               PubSubElementType.SUBSCRIPTIONS.getElementName(),
               PubSubElementType.SUBSCRIPTIONS.getNamespace().getXmlns());
   return subElem.getSubscriptions();
 }
Beispiel #6
0
    @SuppressWarnings({"rawtypes", "unchecked"})
    public void processPacket(Packet packet) {
      EventElement event =
          (EventElement) packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());
      ItemsExtension itemsElem = (ItemsExtension) event.getEvent();
      DelayInformation delay = (DelayInformation) packet.getExtension("delay", "urn:xmpp:delay");

      // If there was no delay based on XEP-0203, then try XEP-0091 for backward compatibility
      if (delay == null) {
        delay = (DelayInformation) packet.getExtension("x", "jabber:x:delay");
      }
      ItemPublishEvent eventItems =
          new ItemPublishEvent(
              itemsElem.getNode(),
              (List<Item>) itemsElem.getItems(),
              getSubscriptionIds(packet),
              (delay == null ? null : delay.getStamp()));
      listener.handlePublishedItems(eventItems);
    }
 /**
  * Returns a new ReportedData if the packet is used for gathering data and includes an extension
  * that matches the elementName and namespace "x","jabber:x:data".
  *
  * @param packet the packet used for gathering data.
  * @return the data form parsed from the packet or <tt>null</tt> if there was not a form in the
  *     packet.
  */
 public static Form getFormFrom(Packet packet) {
   // Check if the packet includes the DataForm extension
   final PacketExtension packetExtension = packet.getExtension("x", "jabber:x:data");
   if (packetExtension != null) {
     // Check if the existing DataForm is not a result of a search
     final DataForm dataForm = (DataForm) packetExtension;
     if (dataForm.getReportedData() == null) {
       return new Form(dataForm);
     }
   }
   // Otherwise return null
   return null;
 }
Beispiel #8
0
  private static List<String> getSubscriptionIds(Packet packet) {
    HeadersExtension headers =
        (HeadersExtension) packet.getExtension("headers", "http://jabber.org/protocol/shim");
    List<String> values = null;

    if (headers != null) {
      values = new ArrayList<String>(headers.getHeaders().size());

      for (Header header : headers.getHeaders()) {
        values.add(header.getValue());
      }
    }
    return values;
  }
Beispiel #9
0
    public void processPacket(Packet packet) {
      EventElement event =
          (EventElement) packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());

      List<PacketExtension> extList = event.getExtensions();

      if (extList.get(0).getElementName().equals(PubSubElementType.PURGE_EVENT.getElementName())) {
        listener.handlePurge();
      } else {
        ItemsExtension itemsElem = (ItemsExtension) event.getEvent();
        @SuppressWarnings("unchecked")
        Collection<RetractItem> pubItems = (Collection<RetractItem>) itemsElem.getItems();
        List<String> items = new ArrayList<String>(pubItems.size());

        for (RetractItem item : pubItems) {
          items.add(item.getId());
        }

        ItemDeleteEvent eventItems =
            new ItemDeleteEvent(itemsElem.getNode(), items, getSubscriptionIds(packet));
        listener.handleDeletedItems(eventItems);
      }
    }
Beispiel #10
0
 /**
  * @param packet
  * @return the DelayInformation or null
  */
 public static DelayInformation from(Packet packet) {
   return packet.getExtension(ELEMENT, NAMESPACE);
 }
    /**
     * Handles incoming messages and dispatches whatever events are necessary.
     *
     * @param packet the packet that we need to handle (if it is a message).
     */
    public void processPacket(Packet packet) {
      if (!(packet instanceof org.jivesoftware.smack.packet.Message)) return;

      org.jivesoftware.smack.packet.Message msg = (org.jivesoftware.smack.packet.Message) packet;

      boolean isForwardedSentMessage = false;
      if (msg.getBody() == null) {

        CarbonPacketExtension carbonExt =
            (CarbonPacketExtension) msg.getExtension(CarbonPacketExtension.NAMESPACE);
        if (carbonExt == null) return;

        isForwardedSentMessage =
            (carbonExt.getElementName() == CarbonPacketExtension.SENT_ELEMENT_NAME);
        List<ForwardedPacketExtension> extensions =
            carbonExt.getChildExtensionsOfType(ForwardedPacketExtension.class);
        if (extensions.isEmpty()) return;
        ForwardedPacketExtension forwardedExt = extensions.get(0);
        msg = forwardedExt.getMessage();
        if (msg == null || msg.getBody() == null) return;
      }

      Object multiChatExtension = msg.getExtension("x", "http://jabber.org/protocol/muc#user");

      // its not for us
      if (multiChatExtension != null) return;

      String userFullId = isForwardedSentMessage ? msg.getTo() : msg.getFrom();

      String userBareID = StringUtils.parseBareAddress(userFullId);

      boolean isPrivateMessaging = false;
      ChatRoom privateContactRoom = null;
      OperationSetMultiUserChatJabberImpl mucOpSet =
          (OperationSetMultiUserChatJabberImpl)
              jabberProvider.getOperationSet(OperationSetMultiUserChat.class);
      if (mucOpSet != null) privateContactRoom = mucOpSet.getChatRoom(userBareID);

      if (privateContactRoom != null) {
        isPrivateMessaging = true;
      }

      if (logger.isDebugEnabled()) {
        if (logger.isDebugEnabled())
          logger.debug("Received from " + userBareID + " the message " + msg.toXML());
      }

      Message newMessage = createMessage(msg.getBody(), DEFAULT_MIME_TYPE, msg.getPacketID());

      // check if the message is available in xhtml
      PacketExtension ext = msg.getExtension("http://jabber.org/protocol/xhtml-im");

      if (ext != null) {
        XHTMLExtension xhtmlExt = (XHTMLExtension) ext;

        // parse all bodies
        Iterator<String> bodies = xhtmlExt.getBodies();
        StringBuffer messageBuff = new StringBuffer();
        while (bodies.hasNext()) {
          String body = bodies.next();
          messageBuff.append(body);
        }

        if (messageBuff.length() > 0) {
          // we remove body tags around message cause their
          // end body tag is breaking
          // the visualization as html in the UI
          String receivedMessage =
              messageBuff
                  .toString()
                  // removes body start tag
                  .replaceAll("\\<[bB][oO][dD][yY].*?>", "")
                  // removes body end tag
                  .replaceAll("\\</[bB][oO][dD][yY].*?>", "");

          // for some reason &apos; is not rendered correctly
          // from our ui, lets use its equivalent. Other
          // similar chars(< > & ") seem ok.
          receivedMessage = receivedMessage.replaceAll("&apos;", "&#39;");

          newMessage = createMessage(receivedMessage, HTML_MIME_TYPE, msg.getPacketID());
        }
      }

      PacketExtension correctionExtension = msg.getExtension(MessageCorrectionExtension.NAMESPACE);
      String correctedMessageUID = null;
      if (correctionExtension != null) {
        correctedMessageUID =
            ((MessageCorrectionExtension) correctionExtension).getCorrectedMessageUID();
      }

      Contact sourceContact =
          opSetPersPresence.findContactByID((isPrivateMessaging ? userFullId : userBareID));
      if (msg.getType() == org.jivesoftware.smack.packet.Message.Type.error) {
        // error which is multichat and we don't know about the contact
        // is a muc message error which is missing muc extension
        // and is coming from the room, when we try to send message to
        // room which was deleted or offline on the server
        if (isPrivateMessaging && sourceContact == null) {
          if (privateContactRoom != null) {
            XMPPError error = packet.getError();
            int errorResultCode = ChatRoomMessageDeliveryFailedEvent.UNKNOWN_ERROR;

            if (error != null && error.getCode() == 403) {
              errorResultCode = ChatRoomMessageDeliveryFailedEvent.FORBIDDEN;
            }

            String errorReason = error.getMessage();

            ChatRoomMessageDeliveryFailedEvent evt =
                new ChatRoomMessageDeliveryFailedEvent(
                    privateContactRoom, null, errorResultCode, errorReason, new Date(), newMessage);
            ((ChatRoomJabberImpl) privateContactRoom).fireMessageEvent(evt);
          }

          return;
        }

        if (logger.isInfoEnabled()) logger.info("Message error received from " + userBareID);

        int errorResultCode = MessageDeliveryFailedEvent.UNKNOWN_ERROR;
        if (packet.getError() != null) {
          int errorCode = packet.getError().getCode();

          if (errorCode == 503) {
            org.jivesoftware.smackx.packet.MessageEvent msgEvent =
                (org.jivesoftware.smackx.packet.MessageEvent)
                    packet.getExtension("x", "jabber:x:event");
            if (msgEvent != null && msgEvent.isOffline()) {
              errorResultCode = MessageDeliveryFailedEvent.OFFLINE_MESSAGES_NOT_SUPPORTED;
            }
          }
        }

        if (sourceContact == null) {
          sourceContact = opSetPersPresence.createVolatileContact(userFullId, isPrivateMessaging);
        }

        MessageDeliveryFailedEvent ev =
            new MessageDeliveryFailedEvent(
                newMessage, sourceContact, correctedMessageUID, errorResultCode);

        // ev = messageDeliveryFailedTransform(ev);

        if (ev != null) fireMessageEvent(ev);
        return;
      }
      putJidForAddress(userFullId, msg.getThread());

      // In the second condition we filter all group chat messages,
      // because they are managed by the multi user chat operation set.
      if (sourceContact == null) {
        if (logger.isDebugEnabled())
          logger.debug("received a message from an unknown contact: " + userBareID);
        // create the volatile contact
        sourceContact = opSetPersPresence.createVolatileContact(userFullId, isPrivateMessaging);
      }

      Date timestamp = new Date();
      // Check for XEP-0091 timestamp (deprecated)
      PacketExtension delay = msg.getExtension("x", "jabber:x:delay");
      if (delay != null && delay instanceof DelayInformation) {
        timestamp = ((DelayInformation) delay).getStamp();
      }
      // check for XEP-0203 timestamp
      delay = msg.getExtension("delay", "urn:xmpp:delay");
      if (delay != null && delay instanceof DelayInfo) {
        timestamp = ((DelayInfo) delay).getStamp();
      }

      ContactResource resource = ((ContactJabberImpl) sourceContact).getResourceFromJid(userFullId);

      EventObject msgEvt = null;
      if (!isForwardedSentMessage)
        msgEvt =
            new MessageReceivedEvent(
                newMessage,
                sourceContact,
                resource,
                timestamp,
                correctedMessageUID,
                isPrivateMessaging,
                privateContactRoom);
      else msgEvt = new MessageDeliveredEvent(newMessage, sourceContact, timestamp);
      // msgReceivedEvt = messageReceivedTransform(msgReceivedEvt);
      if (msgEvt != null) fireMessageEvent(msgEvt);
    }
Beispiel #12
0
 /**
  * Retrieve the MUCInitialPresence PacketExtension from packet, if any.
  *
  * @param packet
  * @return the MUCInitialPresence PacketExtension or {@code null}
  */
 public static MUCInitialPresence from(Packet packet) {
   return packet.getExtension(ELEMENT, NAMESPACE);
 }
 /**
  * Returns the {@link MultipleRecipientInfo} contained in the specified packet or <tt>null</tt> if
  * none was found. Only packets sent to multiple recipients will contain such information.
  *
  * @param packet the packet to check.
  * @return the MultipleRecipientInfo contained in the specified packet or <tt>null</tt> if none
  *     was found.
  */
 public static MultipleRecipientInfo getMultipleRecipientInfo(Packet packet) {
   MultipleAddresses extension =
       (MultipleAddresses) packet.getExtension("addresses", "http://jabber.org/protocol/address");
   return extension == null ? null : new MultipleRecipientInfo(extension);
 }