示例#1
0
    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
示例#2
0
    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 nat settings
        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
示例#3
0
    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
示例#4
0
class BonjourAccount(SettingsObject):
    """
    Object represeting 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 unpickled 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
    """

    implements(IObserver)

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

    id = property(lambda self: self.__id__)
    enabled = BonjourAccountEnabledSetting(type=bool, default=True)
    display_name = Setting(type=unicode, 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 nat settings
        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

    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()
        if self.tls.certificate is not None:
            certificate_data = open(self.tls.certificate.normalized).read()
            certificate = X509Certificate(certificate_data)
            private_key = X509PrivateKey(certificate_data)
        else:
            certificate = None
            private_key = None
        if settings.tls.ca_list is not None:
            # we should read all certificates in the file, rather than just the first -Luci
            trusted = [X509Certificate(open(settings.tls.ca_list.normalized).read())]
        else:
            trusted = []
        credentials = X509Credentials(certificate, private_key, trusted)
        credentials.verify_peer = self.tls.verify_server
        return credentials

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

    def _get_presence_state(self):
        return self._bonjour_services.presence_state

    def _set_presence_state(self, state):
        self._bonjour_services.presence_state = state

    presence_state = property(_get_presence_state, _set_presence_state)
    del _get_presence_state, _set_presence_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 set(['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)
示例#5
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)