Example #1
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'
            try:
                interval = composing_indication.interval
            except AttributeError:
                interval = 60

            body = IsComposingMessage(
                state=State(state),
                refresh=Refresh(interval),
                last_active=LastActive(ISOTimestamp.now()),
                content_type=ContentType('text')).toxml()
            message = NormalMessage(sender, recipient, body)
            sip_message_sender = SIPMessageSender(
                message,
                content_type=IsComposingDocument.content_type,
                use_cpim=XMPPGatewayConfig.use_cpim)
            if XMPPGatewayConfig.log_iscomposing:
                log.info('xmpp:%s to sip:%s chat is %s' %
                         (sender, recipient, composing_indication.state))

            try:
                sip_message_sender.send().wait()
            except SIPMessageError as e:
                if XMPPGatewayConfig.log_iscomposing:
                    log.error('SIP Message from %s to %s failed: %s (%s)' %
                              (sender, recipient, e.reason, e.code))
Example #2
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)
Example #3
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)
Example #4
0
    def start(self):
        self.stopped = False
        # noinspection PyUnresolvedReferences
        interface = XMPPGatewayConfig.local_ip
        port = XMPPGatewayConfig.local_port
        cert_path = XMPPGatewayConfig.certificate.normalized if XMPPGatewayConfig.certificate else None
        cert_chain_path = XMPPGatewayConfig.ca_file.normalized if XMPPGatewayConfig.ca_file else None

        if XMPPGatewayConfig.transport == 'tls':
            if cert_path is not None:
                if not os.path.isfile(cert_path):
                    log.error('Certificate file %s could not be found' %
                              cert_path)
                    return
                try:
                    ssl_ctx_factory = ssl.DefaultOpenSSLContextFactory(
                        cert_path, cert_path)
                except Exception:
                    log.exception('Creating TLS context')
                    return
                if cert_chain_path is not None:
                    if not os.path.isfile(cert_chain_path):
                        log.error(
                            'Certificate chain file %s could not be found' %
                            cert_chain_path)
                        return
                    ssl_ctx = ssl_ctx_factory.getContext()
                    try:
                        ssl_ctx.use_certificate_chain_file(cert_chain_path)
                    except Exception:
                        log.exception('Setting TLS certificate chain file')
                        return
                self._s2s_listener = reactor.listenSSL(port,
                                                       self._s2s_factory,
                                                       ssl_ctx_factory,
                                                       interface=interface)
        else:
            self._s2s_listener = reactor.listenTCP(port,
                                                   self._s2s_factory,
                                                   interface=interface)

        port = self._s2s_listener.getHost().port
        listen_address = self._s2s_listener.getHost()
        log.info("XMPP S2S component listening on %s:%d (%s)" %
                 (listen_address.host, listen_address.port,
                  XMPPGatewayConfig.transport.upper()))
        self.chat_session_manager.start()
        self.muc_session_manager.start()
        self.subscription_manager.start()
        self.jingle_session_manager.start()
        notification_center = NotificationCenter()
        notification_center.add_observer(self, sender=self._internal_component)
        notification_center.add_observer(self, sender=self._muc_component)
        self._internal_component.startService()
        self._muc_component.startService()
Example #5
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))
Example #6
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)
Example #7
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)
Example #8
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)
Example #9
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)