Exemple #1
0
 def _start_outgoing_sip_session(self, target_uri):
     notification_center = NotificationCenter()
     # self.xmpp_identity is our local identity
     from_uri = self.xmpp_identity.uri.as_sip_uri()
     del from_uri.parameters['gr']    # no GRUU in From header
     contact_uri = self.xmpp_identity.uri.as_sip_uri()
     contact_uri.parameters['gr'] = encode_resource(contact_uri.parameters['gr'].decode('utf-8'))
     to_uri = target_uri.as_sip_uri()
     lookup = DNSLookup()
     settings = SIPSimpleSettings()
     account = DefaultAccount()
     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 = to_uri
     try:
         routes = lookup.lookup_sip_proxy(uri, settings.sip.transport_list).wait()
     except DNSLookupError:
         log.warning('DNS lookup error while looking for %s proxy' % uri)
         notification_center.post_notification('ChatSessionDidFail', sender=self, data=NotificationData(reason='DNS lookup error'))
         return
     self.msrp_stream = MediaStreamRegistry().get('chat')()
     route = routes.pop(0)
     from_header = FromHeader(from_uri)
     to_header = ToHeader(to_uri)
     contact_header = ContactHeader(contact_uri)
     self.sip_session = Session(account)
     notification_center.add_observer(self, sender=self.sip_session)
     notification_center.add_observer(self, sender=self.msrp_stream)
     self.sip_session.connect(from_header, to_header, contact_header=contact_header, route=route, streams=[self.msrp_stream])
Exemple #2
0
 def _start_outgoing_sip_session(self, target_uri):
     notification_center = NotificationCenter()
     # self.xmpp_identity is our local identity
     from_uri = self.xmpp_identity.uri.as_sip_uri()
     del from_uri.parameters['gr']    # no GRUU in From header
     contact_uri = self.xmpp_identity.uri.as_sip_uri()
     contact_uri.parameters['gr'] = encode_resource(contact_uri.parameters['gr'].decode('utf-8'))
     to_uri = target_uri.as_sip_uri()
     lookup = DNSLookup()
     settings = SIPSimpleSettings()
     account = DefaultAccount()
     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 = to_uri
     try:
         routes = lookup.lookup_sip_proxy(uri, settings.sip.transport_list).wait()
     except DNSLookupError:
         log.warning('DNS lookup error while looking for %s proxy' % uri)
         notification_center.post_notification('ChatSessionDidFail', sender=self, data=NotificationData(reason='DNS lookup error'))
         return
     self.msrp_stream = MediaStreamRegistry.get('chat')()
     route = routes.pop(0)
     from_header = FromHeader(from_uri)
     to_header = ToHeader(to_uri)
     contact_header = ContactHeader(contact_uri)
     self.sip_session = Session(account)
     notification_center.add_observer(self, sender=self.sip_session)
     notification_center.add_observer(self, sender=self.msrp_stream)
     self.sip_session.connect(from_header, to_header, contact_header=contact_header, route=route, streams=[self.msrp_stream])
Exemple #3
0
 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:
             status = pidf.Status('open')
             if stanza.show == 'away':
                 status.extended = 'away'
                 if 'away' not in person.activities:
                     person.activities.add('away')
             elif stanza.show == 'xa':
                 status.extended = 'away'
                 if 'away' not in person.activities:
                     person.activities.add('away')
             elif stanza.show == 'dnd':
                 status.extended = 'busy'
                 if 'busy' not in person.activities:
                     person.activities.add('busy')
             else:
                 status.extended = 'available'
         if stanza.sender.uri.resource:
             resource = encode_resource(stanza.sender.uri.resource)
         else:
             # Workaround for clients not sending the resource under certain (unknown) circumstances
             resource = hashlib.md5("%s@%s" %
                                    (uri.user, uri.host)).hexdigest()
         service_id = "SID-%s" % resource
         sip_uri = stanza.sender.uri.as_sip_uri()
         sip_uri.parameters['gr'] = resource
         sip_uri.parameters['xmpp'] = None
         contact = pidf.Contact(str(sip_uri))
         service = pidf.Service(service_id, status=status, contact=contact)
         service.add(pidf.DeviceID(resource))
         service.device_info = pidf.DeviceInfo(
             resource, description=stanza.sender.uri.resource)
         service.timestamp = pidf.ServiceTimestamp(stanza.timestamp)
         service.capabilities = caps.ServiceCapabilities(text=True,
                                                         message=True)
         for lang, note in stanza.statuses.iteritems():
             service.notes.add(pidf.PIDFNote(note, lang=lang))
         pidf_doc.add(service)
     if not person.activities:
         person.activities = None
     self._pidf = pidf_doc.toxml()
     return self._pidf
Exemple #4
0
 def _send_queued_messages(self):
     sender = None
     while self._xmpp_message_queue:
         message = self._xmpp_message_queue.popleft()
         if message.body is None:
             continue
         sender_uri = message.sender.uri.as_sip_uri()
         sender_uri.parameters['gr'] = encode_resource(sender_uri.parameters['gr'].decode('utf-8'))
         sender = ChatIdentity(sender_uri)
         self.msrp_stream.send_message(message.body, 'text/plain', sender=sender, message_id=str(message.id), notify_progress=message.use_receipt)
     if sender:
         self.msrp_stream.send_composing_indication('idle', 30, sender=sender)
Exemple #5
0
 def _send_queued_messages(self):
     if self._xmpp_message_queue:
         while self._xmpp_message_queue:
             message = self._xmpp_message_queue.popleft()
             if message.body is None:
                 continue
             notify_progress = message.use_receipt
             sender_uri = message.sender.uri.as_sip_uri()
             sender_uri.parameters['gr'] = encode_resource(sender_uri.parameters['gr'].decode('utf-8'))
             sender = ChatIdentity(sender_uri)
             self.msrp_stream.send_message(message.body, 'text/plain', sender=sender, message_id=message.id, notify_progress=message.use_receipt)
         self.msrp_stream.send_composing_indication('idle', 30, sender=sender)
Exemple #6
0
 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:
             status = pidf.Status("open")
             if stanza.show == "away":
                 status.extended = "away"
                 if "away" not in person.activities:
                     person.activities.add("away")
             elif stanza.show == "xa":
                 status.extended = "away"
                 if "away" not in person.activities:
                     person.activities.add("away")
             elif stanza.show == "dnd":
                 status.extended = "busy"
                 if "busy" not in person.activities:
                     person.activities.add("busy")
             else:
                 status.extended = "available"
         if stanza.sender.uri.resource:
             resource = encode_resource(stanza.sender.uri.resource)
         else:
             # Workaround for clients not sending the resource under certain (unknown) circumstances
             resource = hashlib.md5("%s@%s" % (uri.user, uri.host)).hexdigest()
         service_id = "SID-%s" % resource
         sip_uri = stanza.sender.uri.as_sip_uri()
         sip_uri.parameters["gr"] = resource
         sip_uri.parameters["xmpp"] = None
         contact = pidf.Contact(str(sip_uri))
         service = pidf.Service(service_id, status=status, contact=contact)
         service.add(pidf.DeviceID(resource))
         service.device_info = pidf.DeviceInfo(resource, description=stanza.sender.uri.resource)
         service.timestamp = pidf.ServiceTimestamp(stanza.timestamp)
         service.capabilities = caps.ServiceCapabilities(text=True, message=True)
         for lang, note in stanza.statuses.iteritems():
             service.notes.add(pidf.PIDFNote(note, lang=lang))
         pidf_doc.add(service)
     if not person.activities:
         person.activities = None
     self._pidf = pidf_doc.toxml()
     return self._pidf
Exemple #7
0
 def _send_queued_messages(self):
     if self._xmpp_message_queue:
         while self._xmpp_message_queue:
             message = self._xmpp_message_queue.popleft()
             if message.body is None:
                 continue
             if not message.use_receipt:
                 success_report = 'no'
                 failure_report = 'no'
             else:
                 success_report = 'yes'
                 failure_report = 'yes'
             sender_uri = message.sender.uri.as_sip_uri()
             sender_uri.parameters['gr'] = encode_resource(sender_uri.parameters['gr'].decode('utf-8'))
             sender = CPIMIdentity(sender_uri)
             self.msrp_stream.send_message(message.body, 'text/plain', sender=sender, message_id=message.id, notify_progress=True, success_report=success_report, failure_report=failure_report)
         self.msrp_stream.send_composing_indication('idle', 30, sender=sender)