Пример #1
0
class DefaultAccount(Account):
    """
    Subclass of Account which doesn't start any subsystem. SylkServer just
    uses it as the default account for all applications as a settings object.
    """

    __id__ = SIPAddress('default@sylkserver')

    id = property(lambda self: self.__id__)
    enabled = True

    def __new__(cls):
        with AccountManager.load.lock:
            if not AccountManager.load.called:
                raise RuntimeError("cannot instantiate %s before calling AccountManager.load" % cls.__name__)
            return SettingsObject.__new__(cls)

    def __init__(self):
        super(DefaultAccount, self).__init__('default@sylkserver')
        self.contact = DefaultContactURIFactory()

    @property
    def uri(self):
        return SIPURI(user='******', host=SIPConfig.local_ip.normalized)

    def _activate(self):
        pass

    def _deactivate(self):
        pass
Пример #2
0
 def _NH_MWISubscriptionGotNotify(self, notification):
     if notification.data.body and notification.data.content_type == MessageSummary.content_type:
         try:
             message_summary = MessageSummary.parse(notification.data.body)
         except ParserError:
             pass
         else:
             self._mwi_voicemail_uri = message_summary.message_account and SIPAddress(
                 message_summary.message_account.replace('sip:', '',
                                                         1)) or None
             notification.center.post_notification(
                 'SIPAccountGotMessageSummary',
                 sender=self,
                 data=NotificationData(message_summary=message_summary))
Пример #3
0
class BonjourAccount(SettingsObject):
    """
    Object representing a bonjour account. Contains configuration settings and
    attributes for accessing bonjour related options.

    When the account is active, it will send broadcast its contact address on
    the LAN.

    If the object is un-pickled and its enabled flag was set, it will
    automatically activate.

    When the save method is called, depending on the value of the enabled flag,
    the account will activate/deactivate.

    Notifications sent by instances of Account:
     * CFGSettingsObjectWasCreated
     * CFGSettingsObjectWasActivated
     * CFGSettingsObjectWasDeleted
     * CFGSettingsObjectDidChange
     * SIPAccountWillActivate
     * SIPAccountDidActivate
     * SIPAccountWillDeactivate
     * SIPAccountDidDeactivate
    """

    __group__ = 'Accounts'
    __id__ = SIPAddress('bonjour@local')

    id = property(lambda self: self.__id__)
    enabled = BonjourAccountEnabledSetting(type=bool, default=True)
    display_name = Setting(type=str,
                           default=user_info.fullname,
                           nillable=False)

    msrp = BonjourMSRPSettings
    presence = PresenceSettings
    rtp = RTPSettings
    tls = TLSSettings

    def __new__(cls):
        #        with AccountManager.load.lock:
        #            if not AccountManager.load.called:
        #                raise RuntimeError("cannot instantiate %s before calling AccountManager.load" % cls.__name__)
        return SettingsObject.__new__(cls)

    def __init__(self):
        self.contact = ContactURIFactory()
        self.credentials = None
        self._started = False
        self._active = False
        self._activation_lock = coros.Semaphore(1)
        self._bonjour_services = BonjourServices(self)

        # initialize fake settings (these are here to make the bonjour account quack like a duck)

        self.nat_traversal = NATTraversalSettings()
        self.nat_traversal.use_ice = False
        self.nat_traversal.msrp_relay = None
        self.nat_traversal.use_msrp_relay_for_outbound = False

        self.xcap = XCAPSettings()
        self.xcap.enabled = False
        self.xcap.discovered = False
        self.xcap.xcap_root = None

    def __repr__(self):
        return '%s()' % self.__class__.__name__

    def start(self):
        if self._started:
            return
        self._started = True

        notification_center = NotificationCenter()
        notification_center.add_observer(self,
                                         name='CFGSettingsObjectDidChange',
                                         sender=self)
        notification_center.add_observer(self,
                                         name='CFGSettingsObjectDidChange',
                                         sender=SIPSimpleSettings())

        self._bonjour_services.start()
        if self.enabled:
            self._activate()

    def stop(self):
        if not self._started:
            return
        self._started = False

        self._deactivate()
        self._bonjour_services.stop()

        notification_center = NotificationCenter()
        notification_center.remove_observer(self,
                                            name='CFGSettingsObjectDidChange',
                                            sender=self)
        notification_center.remove_observer(self,
                                            name='CFGSettingsObjectDidChange',
                                            sender=SIPSimpleSettings())

    @classproperty
    def mdns_available(cls):
        return _bonjour.available

    @property
    def registered(self):
        return False

    @property
    def tls_credentials(self):
        # This property can be optimized to cache the credentials it loads from disk,
        # however this is not a time consuming operation (~ 3000 req/sec). -Luci
        settings = SIPSimpleSettings()
        tls_certificate = self.tls.certificate or settings.tls.certificate
        if tls_certificate is not None:
            certificate_data = open(tls_certificate.normalized).read()
            certificate = X509Certificate(certificate_data)
            private_key = X509PrivateKey(certificate_data)
        else:
            certificate = None
            private_key = None

        credentials = X509Credentials(certificate, private_key, [])
        credentials.verify_peer = False
        return credentials

    @property
    def uri(self):
        return SIPURI(user=self.contact.username,
                      host=Host.default_ip or '127.0.0.1')

    @property
    def presence_state(self):
        return self._bonjour_services.presence_state

    @presence_state.setter
    def presence_state(self, state):
        self._bonjour_services.presence_state = state

    def handle_notification(self, notification):
        handler = getattr(self, '_NH_%s' % notification.name, Null)
        handler(notification)

    @run_in_green_thread
    def _NH_CFGSettingsObjectDidChange(self, notification):
        if self._started:
            if 'enabled' in notification.data.modified:
                if self.enabled:
                    self._activate()
                else:
                    self._deactivate()
            elif self.enabled:
                if 'display_name' in notification.data.modified:
                    self._bonjour_services.update_registrations()
                if {'sip.transport_list', 'tls.certificate'
                    }.intersection(notification.data.modified):
                    self._bonjour_services.update_registrations()
                    self._bonjour_services.restart_discovery()

    def _activate(self):
        with self._activation_lock:
            if self._active:
                return
            notification_center = NotificationCenter()
            notification_center.post_notification('SIPAccountWillActivate',
                                                  sender=self)
            self._active = True
            self._bonjour_services.activate()
            notification_center.post_notification('SIPAccountDidActivate',
                                                  sender=self)

    def _deactivate(self):
        with self._activation_lock:
            if not self._active:
                return
            notification_center = NotificationCenter()
            notification_center.post_notification('SIPAccountWillDeactivate',
                                                  sender=self)
            self._active = False
            self._bonjour_services.deactivate()
            notification_center.post_notification('SIPAccountDidDeactivate',
                                                  sender=self)