コード例 #1
0
ファイル: presence.py プロジェクト: yejinlei/sylkserver
 def _NH_SIPIncomingSubscriptionNotifyDidFail(self, notification):
     if XMPPGatewayConfig.log_presence:
         log.info(
             'Sending SIP NOTIFY failed from %s to %s for presence flow 0x%x: %s (%s)'
             % (format_uri(self.xmpp_identity.uri, 'xmpp'),
                format_uri(self.sip_identity.uri, 'sip'), id(self),
                notification.data.code, notification.data.reason))
コード例 #2
0
ファイル: presence.py プロジェクト: yejinlei/sylkserver
 def add_sip_subscription(self, subscription):
     # If s subscription is received after the handle has ended but before
     # S2XPresenceHandlerDidEnd has been processed we need to ignore it and wait for a retransmission
     # which we will handle by creating a new S2XPresenceHandler
     if self.ended:
         return
     self._sip_subscriptions.append(subscription)
     NotificationCenter().add_observer(self, sender=subscription)
     if self._xmpp_subscription.state == 'active':
         pidf_doc = self._pidf
         content_type = pidf.PIDFDocument.content_type if pidf_doc is not None else None
         try:
             subscription.accept(content_type, pidf_doc)
         except SIPCoreError as e:
             log.warning('Error accepting SIP subscription: %s' % e)
             subscription.end()
     else:
         try:
             subscription.accept_pending()
         except SIPCoreError as e:
             log.warning('Error accepting SIP subscription: %s' % e)
             subscription.end()
     if XMPPGatewayConfig.log_presence:
         log.info(
             'SIP subscription from %s to %s added to presence flow 0x%x (%d subs)'
             % (format_uri(self.sip_identity.uri, 'sip'),
                format_uri(self.xmpp_identity.uri,
                           'xmpp'), id(self), len(self._sip_subscriptions)))
コード例 #3
0
ファイル: presence.py プロジェクト: yejinlei/sylkserver
 def _NH_SIPIncomingSubscriptionDidTimeout(self, notification):
     if XMPPGatewayConfig.log_presence:
         log.info(
             'SIP subscription from %s to %s timed out for presence flow 0x%x (%d subs)'
             % (format_uri(self.sip_identity.uri, 'sip'),
                format_uri(self.xmpp_identity.uri,
                           'xmpp'), id(self), len(self._sip_subscriptions)))
コード例 #4
0
ファイル: presence.py プロジェクト: yejinlei/sylkserver
 def _NH_SIPIncomingSubscriptionGotUnsubscribe(self, notification):
     if XMPPGatewayConfig.log_presence:
         log.info(
             'SIP subscription from %s to %s was terminated by user for presence flow 1x%x (%d subs)'
             % (format_uri(self.sip_identity.uri, 'sip'),
                format_uri(self.xmpp_identity.uri,
                           'xmpp'), id(self), len(self._sip_subscriptions)))
コード例 #5
0
ファイル: __init__.py プロジェクト: swinsey/sylkserver
 def _NH_X2SMucInvitationHandlerDidStart(self, notification):
     handler = notification.sender
     sender_uri = handler.sender.uri
     muc_uri = handler.recipient.uri
     participant_uri = handler.participant.uri
     log.info('%s invited %s to multiparty chat %s' %
              (format_uri(sender_uri, 'xmpp'), format_uri(participant_uri),
               format_uri(muc_uri, 'sip')))
コード例 #6
0
ファイル: __init__.py プロジェクト: LScarpinati/sylkserver
 def _NH_X2SMucInvitationHandlerDidStart(self, notification):
     handler = notification.sender
     sender_uri = handler.sender.uri
     muc_uri = handler.recipient.uri
     participant_uri = handler.participant.uri
     log.msg(
         "%s invited %s to multiparty chat %s"
         % (format_uri(sender_uri, "xmpp"), format_uri(participant_uri), format_uri(muc_uri, "sip"))
     )
コード例 #7
0
ファイル: __init__.py プロジェクト: LScarpinati/sylkserver
 def _NH_S2XMucInvitationHandlerDidStart(self, notification):
     handler = notification.sender
     muc_uri = handler.sender.uri
     inviter_uri = handler.inviter.uri
     recipient_uri = handler.recipient.uri
     log.msg(
         "%s invited %s to multiparty chat %s"
         % (format_uri(inviter_uri, "sip"), format_uri(recipient_uri, "xmpp"), format_uri(muc_uri, "sip"))
     )
コード例 #8
0
ファイル: __init__.py プロジェクト: swinsey/sylkserver
 def _NH_S2XMucInvitationHandlerDidStart(self, notification):
     handler = notification.sender
     muc_uri = handler.sender.uri
     inviter_uri = handler.inviter.uri
     recipient_uri = handler.recipient.uri
     log.info(
         "%s invited %s to multiparty chat %s" %
         (format_uri(inviter_uri, 'sip'), format_uri(
             recipient_uri, 'xmpp'), format_uri(muc_uri, 'sip')))
コード例 #9
0
 def _NH_X2SMucInvitationHandlerDidEnd(self, notification):
     handler = notification.sender
     sender_uri = handler.sender.uri
     muc_uri = handler.recipient.uri
     participant_uri = handler.participant.uri
     log.msg('%s added %s to multiparty chat %s' %
             (format_uri(sender_uri, 'xmpp'), format_uri(participant_uri),
              format_uri(muc_uri, 'sip')))
     del self.x2s_muc_add_participant_handlers[(muc_uri, participant_uri)]
     notification.center.remove_observer(self, sender=handler)
コード例 #10
0
ファイル: __init__.py プロジェクト: swinsey/sylkserver
 def _NH_X2SMucInvitationHandlerDidFail(self, notification):
     handler = notification.sender
     sender_uri = handler.sender.uri
     muc_uri = handler.recipient.uri
     participant_uri = handler.participant.uri
     log.info('%s could not add %s to multiparty chat %s: %s' %
              (format_uri(sender_uri, 'xmpp'), format_uri(participant_uri),
               format_uri(muc_uri, 'sip'), notification.data.failure))
     del self.x2s_muc_add_participant_handlers[(muc_uri, participant_uri)]
     notification.center.remove_observer(self, sender=handler)
コード例 #11
0
ファイル: __init__.py プロジェクト: swinsey/sylkserver
 def _NH_S2XPresenceHandlerDidStart(self, notification):
     handler = notification.sender
     if XMPPGatewayConfig.log_presence:
         log.info('Presence flow 0x%x established %s --> %s' %
                  (id(handler), format_uri(handler.sip_identity.uri, 'sip'),
                   format_uri(handler.xmpp_identity.uri, 'xmpp')))
         log.info(
             '%d SIP --> XMPP and %d XMPP --> SIP presence flows are active'
             % (len(self.s2x_presence_subscriptions),
                len(self.x2s_presence_subscriptions)))
コード例 #12
0
ファイル: presence.py プロジェクト: madhawa/sylkserver
 def _NH_SIPIncomingSubscriptionGotUnsubscribe(self, notification):
     if XMPPGatewayConfig.log_presence:
         log.msg(
             "SIP subscription from %s to %s was terminated by user for presence flow 1x%x (%d subs)"
             % (
                 format_uri(self.sip_identity.uri, "sip"),
                 format_uri(self.xmpp_identity.uri, "xmpp"),
                 id(self),
                 len(self._sip_subscriptions),
             )
         )
コード例 #13
0
 def _NH_S2XMucInvitationHandlerDidFail(self, notification):
     handler = notification.sender
     muc_uri = handler.sender.uri
     inviter_uri = handler.inviter.uri
     recipient_uri = handler.recipient.uri
     log.msg(
         '%s could not add %s to multiparty chat %s: %s' %
         (format_uri(inviter_uri, 'sip'), format_uri(recipient_uri, 'xmpp'),
          format_uri(muc_uri, 'sip'), str(notification.data.failure)))
     del self.s2x_muc_add_participant_handlers[(muc_uri, recipient_uri)]
     notification.center.remove_observer(self, sender=handler)
コード例 #14
0
ファイル: __init__.py プロジェクト: swinsey/sylkserver
 def _NH_S2XMucInvitationHandlerDidEnd(self, notification):
     handler = notification.sender
     muc_uri = handler.sender.uri
     inviter_uri = handler.inviter.uri
     recipient_uri = handler.recipient.uri
     log.info(
         '%s added %s to multiparty chat %s' %
         (format_uri(inviter_uri, 'sip'), format_uri(
             recipient_uri, 'xmpp'), format_uri(muc_uri, 'sip')))
     del self.s2x_muc_add_participant_handlers[(muc_uri, recipient_uri)]
     notification.center.remove_observer(self, sender=handler)
コード例 #15
0
ファイル: __init__.py プロジェクト: LScarpinati/sylkserver
 def _NH_S2XMucInvitationHandlerDidEnd(self, notification):
     handler = notification.sender
     muc_uri = handler.sender.uri
     inviter_uri = handler.inviter.uri
     recipient_uri = handler.recipient.uri
     log.msg(
         "%s added %s to multiparty chat %s"
         % (format_uri(inviter_uri, "sip"), format_uri(recipient_uri, "xmpp"), format_uri(muc_uri, "sip"))
     )
     del self.s2x_muc_add_participant_handlers[(muc_uri, recipient_uri)]
     notification.center.remove_observer(self, sender=handler)
コード例 #16
0
ファイル: presence.py プロジェクト: madhawa/sylkserver
 def _NH_SIPIncomingSubscriptionDidTimeout(self, notification):
     if XMPPGatewayConfig.log_presence:
         log.msg(
             "SIP subscription from %s to %s timed out for presence flow 0x%x (%d subs)"
             % (
                 format_uri(self.sip_identity.uri, "sip"),
                 format_uri(self.xmpp_identity.uri, "xmpp"),
                 id(self),
                 len(self._sip_subscriptions),
             )
         )
コード例 #17
0
ファイル: presence.py プロジェクト: madhawa/sylkserver
 def _NH_SIPIncomingSubscriptionNotifyDidFail(self, notification):
     if XMPPGatewayConfig.log_presence:
         log.msg(
             "Sending SIP NOTIFY failed from %s to %s for presence flow 0x%x: %s (%s)"
             % (
                 format_uri(self.xmpp_identity.uri, "xmpp"),
                 format_uri(self.sip_identity.uri, "sip"),
                 id(self),
                 notification.data.code,
                 notification.data.reason,
             )
         )
コード例 #18
0
ファイル: presence.py プロジェクト: yejinlei/sylkserver
 def _NH_SIPIncomingSubscriptionDidEnd(self, notification):
     subscription = notification.sender
     notification.center.remove_observer(self, sender=subscription)
     self._sip_subscriptions.remove(subscription)
     if XMPPGatewayConfig.log_presence:
         log.info(
             'SIP subscription from %s to %s removed from presence flow 0x%x (%d subs)'
             % (format_uri(self.sip_identity.uri, 'sip'),
                format_uri(self.xmpp_identity.uri,
                           'xmpp'), id(self), len(self._sip_subscriptions)))
     if not self._sip_subscriptions:
         self.end()
コード例 #19
0
ファイル: __init__.py プロジェクト: swinsey/sylkserver
 def _NH_S2XPresenceHandlerDidEnd(self, notification):
     handler = notification.sender
     self.s2x_presence_subscriptions.pop(
         (handler.sip_identity.uri, handler.xmpp_identity.uri), None)
     notification.center.remove_observer(self, sender=handler)
     if XMPPGatewayConfig.log_presence:
         log.info('Presence flow 0x%x ended %s --> %s' %
                  (id(handler), format_uri(handler.sip_identity.uri, 'sip'),
                   format_uri(handler.xmpp_identity.uri, 'xmpp')))
         log.info(
             '%d SIP --> XMPP and %d XMPP --> SIP presence flows are active'
             % (len(self.s2x_presence_subscriptions),
                len(self.x2s_presence_subscriptions)))
コード例 #20
0
ファイル: __init__.py プロジェクト: swinsey/sylkserver
    def incoming_subscription(self, subscribe_request, data):
        from_header = data.headers.get('From', Null)
        to_header = data.headers.get('To', Null)
        if Null in (from_header, to_header):
            subscribe_request.reject(400)
            return

        if XMPPGatewayConfig.log_presence:
            log.info('SIP subscription from %s to %s' % (format_uri(
                from_header.uri, 'sip'), format_uri(to_header.uri, 'xmpp')))

        if subscribe_request.event != 'presence':
            if XMPPGatewayConfig.log_presence:
                log.info(
                    'SIP subscription rejected: only presence event is supported'
                )
            subscribe_request.reject(489)
            return

        # Check domain
        remote_identity_uri = data.headers['From'].uri
        if remote_identity_uri.host not in XMPPGatewayConfig.domains:
            if XMPPGatewayConfig.log_presence:
                log.info(
                    'SIP subscription rejected: From domain is not a local XMPP domain'
                )
            subscribe_request.reject(606)
            return

        # Get URI representing the SIP side
        sip_leg_uri = FrozenURI(remote_identity_uri.user,
                                remote_identity_uri.host)

        # Get URI representing the XMPP side
        request_uri = data.request_uri
        xmpp_leg_uri = FrozenURI(request_uri.user, request_uri.host)

        try:
            handler = self.s2x_presence_subscriptions[(sip_leg_uri,
                                                       xmpp_leg_uri)]
        except KeyError:
            sip_identity = Identity(sip_leg_uri,
                                    data.headers['From'].display_name)
            xmpp_identity = Identity(xmpp_leg_uri)
            handler = S2XPresenceHandler(sip_identity, xmpp_identity)
            self.s2x_presence_subscriptions[(sip_leg_uri,
                                             xmpp_leg_uri)] = handler
            NotificationCenter().add_observer(self, sender=handler)
            handler.start()

        handler.add_sip_subscription(subscribe_request)
コード例 #21
0
ファイル: __init__.py プロジェクト: LScarpinati/sylkserver
 def _NH_X2SPresenceHandlerDidStart(self, notification):
     handler = notification.sender
     if XMPPGatewayConfig.log_presence:
         log.msg(
             "Presence flow 0x%x established %s --> %s"
             % (
                 id(handler),
                 format_uri(handler.xmpp_identity.uri, "xmpp"),
                 format_uri(handler.sip_identity.uri, "sip"),
             )
         )
         log.msg(
             "%d SIP --> XMPP and %d XMPP --> SIP presence flows are active"
             % (len(self.s2x_presence_subscriptions.keys()), len(self.x2s_presence_subscriptions.keys()))
         )
コード例 #22
0
ファイル: __init__.py プロジェクト: LScarpinati/sylkserver
 def _NH_X2SMucInvitationHandlerDidFail(self, notification):
     handler = notification.sender
     sender_uri = handler.sender.uri
     muc_uri = handler.recipient.uri
     participant_uri = handler.participant.uri
     log.msg(
         "%s could not add %s to multiparty chat %s: %s"
         % (
             format_uri(sender_uri, "xmpp"),
             format_uri(participant_uri),
             format_uri(muc_uri, "sip"),
             notification.data.failure,
         )
     )
     del self.x2s_muc_add_participant_handlers[(muc_uri, participant_uri)]
     notification.center.remove_observer(self, sender=handler)
コード例 #23
0
 def _NH_XMPPSubscriptionGotNotify(self, notification):
     stanza = notification.data.presence
     self._stanza_cache[stanza.sender.uri] = stanza
     stanza.timestamp = ISOTimestamp.now()    # TODO: mirror the one in the stanza, if present
     pidf_doc = self._build_pidf()
     if XMPPGatewayConfig.log_presence:
         log.msg('XMPP notification from %s to %s for presence flow 0x%x' % (format_uri(self.xmpp_identity.uri, 'xmpp'), format_uri(self.sip_identity.uri, 'sip'), id(self)))
     for subscription in self._sip_subscriptions:
         try:
             subscription.push_content(pidf.PIDFDocument.content_type, pidf_doc)
         except SIPCoreError, e:
             if XMPPGatewayConfig.log_presence:
                 log.msg('Failed to send SIP NOTIFY from %s to %s for presence flow 0x%x: %s' % (format_uri(self.xmpp_identity.uri, 'xmpp'), format_uri(self.sip_identity.uri, 'sip'), id(self), e))
コード例 #24
0
ファイル: __init__.py プロジェクト: swinsey/sylkserver
    def incoming_chat_session(self, session):
        # Check if this session is really an invitation to add a participant to a conference room / muc
        if session.remote_identity.uri.host in self.xmpp_manager.muc_domains and 'isfocus' in session._invitation.remote_contact_header.parameters:
            try:
                referred_by_uri = SIPURI.parse(
                    session.transfer_info.referred_by)
            except SIPCoreError:
                log.info(
                    "SIP multiparty session invitation %s failed: invalid Referred-By header"
                    % session.call_id)
                session.reject(488)
                return
            muc_uri = FrozenURI(session.remote_identity.uri.user,
                                session.remote_identity.uri.host)
            inviter_uri = FrozenURI(referred_by_uri.user, referred_by_uri.host)
            recipient_uri = FrozenURI(session.local_identity.uri.user,
                                      session.local_identity.uri.host)
            sender = Identity(muc_uri)
            recipient = Identity(recipient_uri)
            inviter = Identity(inviter_uri)
            try:
                handler = self.s2x_muc_add_participant_handlers[(
                    muc_uri, recipient_uri)]
            except KeyError:
                handler = S2XMucInvitationHandler(session, sender, recipient,
                                                  inviter)
                self.s2x_muc_add_participant_handlers[(
                    muc_uri, recipient_uri)] = handler
                NotificationCenter().add_observer(self, sender=handler)
                handler.start()
            else:
                log.info(
                    "SIP multiparty session invitation %s failed: there is another invitation in progress from %s to %s"
                    % (session.call_id, format_uri(inviter_uri, 'sip'),
                       format_uri(recipient_uri, 'xmpp')))
                session.reject(480)
            return

        # Check domain
        if session.remote_identity.uri.host not in XMPPGatewayConfig.domains:
            log.info(
                'Session rejected: From domain is not a local XMPP domain')
            session.reject(606, 'Not Acceptable')
            return

        # Get URI representing the SIP side
        contact_uri = session._invitation.remote_contact_header.uri
        if contact_uri.parameters.get('gr') is not None:
            sip_leg_uri = FrozenURI(contact_uri.user, contact_uri.host,
                                    contact_uri.parameters.get('gr'))
        else:
            tmp = session.remote_identity.uri
            sip_leg_uri = FrozenURI(tmp.user, tmp.host,
                                    generate_sylk_resource())

        # Get URI representing the XMPP side
        request_uri = session.request_uri
        remote_resource = request_uri.parameters.get('gr', None)
        if remote_resource is not None:
            try:
                remote_resource = decode_resource(remote_resource)
            except (TypeError, UnicodeError):
                remote_resource = None
        xmpp_leg_uri = FrozenURI(request_uri.user, request_uri.host,
                                 remote_resource)

        try:
            handler = self.pending_sessions[(sip_leg_uri, xmpp_leg_uri)]
        except KeyError:
            pass
        else:
            # There is another pending session with same identifiers, can't accept this one
            log.info(
                'Session rejected: other session with same identifiers in progress'
            )
            session.reject(488)
            return

        sip_identity = Identity(sip_leg_uri,
                                session.remote_identity.display_name)
        handler = ChatSessionHandler.new_from_sip_session(
            sip_identity, session)
        NotificationCenter().add_observer(self, sender=handler)
        key = (sip_leg_uri, xmpp_leg_uri)
        self.pending_sessions[key] = handler

        if xmpp_leg_uri.resource is not None:
            # Incoming session target contained GRUU, so create XMPPChatSession immediately
            xmpp_session = XMPPChatSession(
                local_identity=handler.sip_identity,
                remote_identity=Identity(xmpp_leg_uri))
            handler.xmpp_identity = xmpp_session.remote_identity
            handler.xmpp_session = xmpp_session
コード例 #25
0
ファイル: presence.py プロジェクト: yejinlei/sylkserver
    def _sip_subscription_handler(self, command):
        notification_center = NotificationCenter()
        settings = SIPSimpleSettings()

        account = DefaultAccount()
        refresh_interval = getattr(command, 'refresh_interval',
                                   None) or account.sip.subscribe_interval

        try:
            # Lookup routes
            if account.sip.outbound_proxy is not None:
                uri = SIPURI(host=account.sip.outbound_proxy.host,
                             port=account.sip.outbound_proxy.port,
                             parameters={
                                 'transport':
                                 account.sip.outbound_proxy.transport
                             })
            else:
                uri = SIPURI(host=self.sip_identity.uri.as_sip_uri().host)
            lookup = DNSLookup()
            try:
                routes = lookup.lookup_sip_proxy(
                    uri, settings.sip.transport_list).wait()
            except DNSLookupError as e:
                timeout = random.uniform(15, 30)
                raise SubscriptionError(error='DNS lookup failed: %s' % e,
                                        timeout=timeout)

            timeout = time() + 30
            for route in routes:
                remaining_time = timeout - time()
                if remaining_time > 0:
                    transport = route.transport
                    parameters = {} if transport == 'udp' else {
                        'transport': transport
                    }
                    contact_uri = SIPURI(user=account.contact.username,
                                         host=SIPConfig.local_ip.normalized,
                                         port=getattr(Engine(),
                                                      '%s_port' % transport),
                                         parameters=parameters)
                    subscription_uri = self.sip_identity.uri.as_sip_uri()
                    subscription = Subscription(
                        subscription_uri,
                        FromHeader(self.xmpp_identity.uri.as_sip_uri()),
                        ToHeader(subscription_uri),
                        ContactHeader(contact_uri),
                        'presence',
                        RouteHeader(route.uri),
                        refresh=refresh_interval)
                    notification_center.add_observer(self, sender=subscription)
                    try:
                        subscription.subscribe(
                            timeout=limit(remaining_time, min=1, max=5))
                    except SIPCoreError:
                        notification_center.remove_observer(
                            self, sender=subscription)
                        raise SubscriptionError(error='Internal error',
                                                timeout=5)
                    self._sip_subscription = subscription
                    try:
                        while True:
                            notification = self._data_channel.wait()
                            if notification.sender is subscription and notification.name == 'SIPSubscriptionDidStart':
                                break
                    except SIPSubscriptionDidFail as e:
                        notification_center.remove_observer(
                            self, sender=subscription)
                        self._sip_subscription = None
                        if e.data.code == 407:
                            # Authentication failed, so retry the subscription in some time
                            raise SubscriptionError(
                                error='Authentication failed',
                                timeout=random.uniform(60, 120))
                        elif e.data.code == 403:
                            # Forbidden
                            raise SubscriptionError(error='Forbidden',
                                                    timeout=None,
                                                    fatal=True)
                        elif e.data.code == 423:
                            # Get the value of the Min-Expires header
                            if e.data.min_expires is not None and e.data.min_expires > refresh_interval:
                                interval = e.data.min_expires
                            else:
                                interval = None
                            raise SubscriptionError(error='Interval too short',
                                                    timeout=random.uniform(
                                                        60, 120),
                                                    refresh_interval=interval)
                        elif e.data.code in (405, 406, 489):
                            raise SubscriptionError(
                                error='Method or event not supported',
                                timeout=None,
                                fatal=True)
                        elif e.data.code == 1400:
                            raise SubscriptionError(error=e.data.reason,
                                                    timeout=None,
                                                    fatal=True)
                        else:
                            # Otherwise just try the next route
                            continue
                    else:
                        self.subscribed = True
                        command.signal()
                        break
            else:
                # There are no more routes to try, give up
                raise SubscriptionError(error='No more routes to try',
                                        timeout=None,
                                        fatal=True)
            # At this point it is subscribed. Handle notifications and ending/failures.
            try:
                while True:
                    notification = self._data_channel.wait()
                    if notification.sender is not self._sip_subscription:
                        continue
                    if self._xmpp_subscription is None:
                        continue
                    if notification.name == 'SIPSubscriptionGotNotify':
                        if notification.data.event == 'presence':
                            subscription_state = notification.data.headers.get(
                                'Subscription-State').state
                            if subscription_state == 'active' and self._xmpp_subscription.state != 'active':
                                self._xmpp_subscription.accept()
                            elif subscription_state == 'pending' and self._xmpp_subscription.state == 'active':
                                # The state went from active to pending, hide the presence state?
                                pass
                            if notification.data.body:
                                if XMPPGatewayConfig.log_presence:
                                    log.info(
                                        'SIP NOTIFY from %s to %s' %
                                        (format_uri(self.sip_identity.uri,
                                                    'sip'),
                                         format_uri(self.xmpp_identity.uri,
                                                    'xmpp')))
                                self._process_pidf(notification.data.body)
                    elif notification.name == 'SIPSubscriptionDidEnd':
                        break
            except SIPSubscriptionDidFail as e:
                if e.data.code == 0 and e.data.reason == 'rejected':
                    self._xmpp_subscription.reject()
                else:
                    self._command_channel.send(Command('subscribe'))
            notification_center.remove_observer(self,
                                                sender=self._sip_subscription)
        except InterruptSubscription as e:
            if not self.subscribed:
                command.signal(e)
            if self._sip_subscription is not None:
                notification_center.remove_observer(
                    self, sender=self._sip_subscription)
                try:
                    self._sip_subscription.end(timeout=2)
                except SIPCoreError:
                    pass
        except TerminateSubscription as e:
            if not self.subscribed:
                command.signal(e)
            if self._sip_subscription is not None:
                try:
                    self._sip_subscription.end(timeout=2)
                except SIPCoreError:
                    pass
                else:
                    try:
                        while True:
                            notification = self._data_channel.wait()
                            if notification.sender is self._sip_subscription and notification.name == 'SIPSubscriptionDidEnd':
                                break
                    except SIPSubscriptionDidFail:
                        pass
                finally:
                    notification_center.remove_observer(
                        self, sender=self._sip_subscription)
        except SubscriptionError as e:
            if not e.fatal:
                self._sip_subscription_timer = reactor.callLater(
                    e.timeout, self._command_channel.send,
                    Command('subscribe',
                            command.event,
                            refresh_interval=e.refresh_interval))
        finally:
            self.subscribed = False
            self._sip_subscription = None
            self._sip_subscription_proc = None
            reactor.callLater(0, self.end)
コード例 #26
0
        if self._xmpp_subscription.state == 'active':
            pidf_doc = self._pidf
            content_type = pidf.PIDFDocument.content_type if pidf_doc is not None else None
            try:
                subscription.accept(content_type, pidf_doc)
            except SIPCoreError, e:
                log.warning('Error accepting SIP subscription: %s' % e)
                subscription.end()
        else:
            try:
                subscription.accept_pending()
            except SIPCoreError, e:
                log.warning('Error accepting SIP subscription: %s' % e)
                subscription.end()
        if XMPPGatewayConfig.log_presence:
            log.msg('SIP subscription from %s to %s added to presence flow 0x%x (%d subs)' % (format_uri(self.sip_identity.uri, 'sip'), format_uri(self.xmpp_identity.uri, 'xmpp'), id(self), len(self._sip_subscriptions)))

    def _build_pidf(self):
        if not self._stanza_cache:
            self._pidf = None
            return None
        pidf_doc = pidf.PIDF(str(self.xmpp_identity))
        uri = next(self._stanza_cache.iterkeys())
        person = pidf.Person("PID-%s" % hashlib.md5("%s@%s" % (uri.user, uri.host)).hexdigest())
        person.activities = rpid.Activities()
        pidf_doc.add(person)
        for stanza in self._stanza_cache.itervalues():
            if not stanza.available:
                status = pidf.Status('closed')
                status.extended = 'offline'
            else:
コード例 #27
0
 def _NH_SIPIncomingSubscriptionGotRefreshingSubscribe(self, notification):
     if XMPPGatewayConfig.log_presence:
         log.msg('SIP subscription from %s to %s was refreshed for presence flow 0x%x (%d subs)' % (format_uri(self.sip_identity.uri, 'sip'), format_uri(self.xmpp_identity.uri, 'xmpp'), id(self), len(self._sip_subscriptions)))