Пример #1
0
 def _NH_XMPPGotNormalMessage(self, notification):
     message = notification.data.message
     sip_message_sender = SIPMessageSender(message)
     try:
         sip_message_sender.send().wait()
     except SIPMessageError as e:
         # TODO report back an error stanza
         log.error("Error sending SIP Message: %s" % e)
Пример #2
0
 def _NH_XMPPGotNormalMessage(self, notification):
     message = notification.data.message
     sip_message_sender = SIPMessageSender(
         message, use_cpim=XMPPGatewayConfig.use_cpim)
     try:
         sip_message_sender.send().wait()
     except SIPMessageError as e:
         # TODO report back an error stanza
         if XMPPGatewayConfig.log_messages:
             log.error('SIP message from %s to %s failed: %s (%s)' %
                       (xmpp_leg_uri, sip_leg_uri, e.reason, e.code))
Пример #3
0
 def _NH_XMPPGotComposingIndication(self, notification):
     composing_indication = notification.data.composing_indication
     sender = composing_indication.sender
     recipient = composing_indication.recipient
     if not XMPPGatewayConfig.use_msrp_for_chat:
         state = "active" if composing_indication.state == "composing" else "idle"
         body = IsComposingMessage(state=state, refresh=composing_indication.interval or 30).toxml()
         message = NormalMessage(sender, recipient, body, IsComposingDocument.content_type)
         sip_message_sender = SIPMessageSender(message)
         try:
             sip_message_sender.send().wait()
         except SIPMessageError as e:
             # TODO report back an error stanza
             log.error("Error sending SIP Message: %s" % e)
Пример #4
0
 def _NH_XMPPGotChatMessage(self, notification):
     # This notification is only processed here untill the ChatSessionHandler
     # has both (SIP and XMPP) sessions established
     message = notification.data.message
     sender = message.sender
     recipient = message.recipient
     if XMPPGatewayConfig.use_msrp_for_chat:
         if recipient.uri.resource is None:
             # If recipient resource is not set the session is started from
             # the XMPP side
             sip_leg_uri = FrozenURI.new(recipient.uri)
             xmpp_leg_uri = FrozenURI.new(sender.uri)
             try:
                 handler = self.pending_sessions[(sip_leg_uri, xmpp_leg_uri)]
                 handler.enqueue_xmpp_message(message)
             except KeyError:
                 # Check if we have any already open chat session and dispatch it there
                 try:
                     handler = next(
                         h
                         for h in self.chat_sessions
                         if h.xmpp_identity.uri.user == xmpp_leg_uri.user
                         and h.xmpp_identity.uri.host == xmpp_leg_uri.host
                         and h.sip_identity.uri.user == sip_leg_uri.user
                         and h.sip_identity.uri.host == sip_leg_uri.host
                     )
                 except StopIteration:
                     # Not found, need to create a new handler and a outgoing SIP session
                     xmpp_identity = Identity(xmpp_leg_uri)
                     handler = ChatSessionHandler.new_from_xmpp_stanza(xmpp_identity, sip_leg_uri)
                     key = (sip_leg_uri, xmpp_leg_uri)
                     self.pending_sessions[key] = handler
                     NotificationCenter().add_observer(self, sender=handler)
                 handler.enqueue_xmpp_message(message)
         else:
             # Find handler pending XMPP confirmation
             sip_leg_uri = FrozenURI.new(recipient.uri)
             xmpp_leg_uri = FrozenURI(sender.uri.user, sender.uri.host)
             try:
                 handler = self.pending_sessions[(sip_leg_uri, xmpp_leg_uri)]
             except KeyError:
                 # Find handler pending XMPP confirmation
                 sip_leg_uri = FrozenURI(recipient.uri.user, recipient.uri.host)
                 xmpp_leg_uri = FrozenURI.new(sender.uri)
                 try:
                     handler = self.pending_sessions[(sip_leg_uri, xmpp_leg_uri)]
                 except KeyError:
                     # Try harder, maybe the XMPP client changed his from
                     try:
                         handler = next(
                             h
                             for h in self.chat_sessions
                             if h.xmpp_identity.uri.user == xmpp_leg_uri.user
                             and h.xmpp_identity.uri.host == xmpp_leg_uri.host
                             and h.sip_identity.uri.user == sip_leg_uri.user
                             and h.sip_identity.uri.host == sip_leg_uri.host
                         )
                     except StopIteration:
                         # It's a new XMPP session to a full JID, disregard the full JID and start a new SIP session to the bare JID
                         xmpp_identity = Identity(xmpp_leg_uri)
                         handler = ChatSessionHandler.new_from_xmpp_stanza(xmpp_identity, sip_leg_uri)
                         key = (sip_leg_uri, xmpp_leg_uri)
                         self.pending_sessions[key] = handler
                         NotificationCenter().add_observer(self, sender=handler)
                 handler.enqueue_xmpp_message(message)
             else:
                 # Found handle, create XMPP session and establish session
                 session = XMPPChatSession(local_identity=recipient, remote_identity=sender)
                 handler.enqueue_xmpp_message(message)
                 handler.xmpp_identity = session.remote_identity
                 handler.xmpp_session = session
     else:
         sip_message_sender = SIPMessageSender(message)
         try:
             sip_message_sender.send().wait()
         except SIPMessageError as e:
             # TODO report back an error stanza
             log.error("Error sending SIP Message: %s" % e)