Exemple #1
0
    def send_composing_indication(self,
                                  session,
                                  state,
                                  refresh=None,
                                  last_active=None):
        if not session.account.sms.enable_iscomposing:
            return

        content = IsComposingDocument.create(
            state=State(state),
            refresh=Refresh(refresh) if refresh is not None else None,
            last_active=LastActive(last_active)
            if last_active is not None else None,
            content_type=ContentType('text'))

        self.send_message(session.account, session.contact, content,
                          IsComposingDocument.content_type)
Exemple #2
0
 def send_composing_indication(self,
                               state,
                               refresh=None,
                               last_active=None,
                               recipients=None):
     content = IsComposingDocument.create(
         state=State(state),
         refresh=Refresh(refresh) if refresh is not None else None,
         last_active=LastActive(last_active)
         if last_active is not None else None,
         content_type=ContentType('text'))
     message = QueuedMessage(content,
                             IsComposingDocument.content_type,
                             recipients=recipients,
                             notify_progress=False)
     self._enqueue_message(message)
     return message.id
Exemple #3
0
    def _handle_SEND(self, chunk):
        if chunk.size == 0:  # keep-alive
            self.msrp_session.send_report(chunk, 200, 'OK')
            return
        content_type = chunk.content_type.lower()
        if not contains_mime_type(self.accept_types, content_type):
            self.msrp_session.send_report(chunk, 413, 'Unwanted Message')
            return
        if chunk.contflag == '#':
            self.incoming_queue.pop(chunk.message_id, None)
            self.msrp_session.send_report(chunk, 200, 'OK')
            return
        elif chunk.contflag == '+':
            self.incoming_queue[chunk.message_id].append(chunk.data)
            self.msrp_session.send_report(chunk, 200, 'OK')
            return
        else:
            data = ''.join(self.incoming_queue.pop(chunk.message_id,
                                                   [])) + chunk.data.decode()

        if content_type == 'message/cpim':
            try:
                payload = CPIMPayload.decode(data)
            except CPIMParserError:
                self.msrp_session.send_report(chunk, 400, 'CPIM Parser Error')
                return
            else:
                message = Message(**{
                    name: getattr(payload, name)
                    for name in Message.__slots__
                })
                if not contains_mime_type(self.accept_wrapped_types,
                                          message.content_type):
                    self.msrp_session.send_report(chunk, 413,
                                                  'Unwanted Message')
                    return
                if message.timestamp is None:
                    message.timestamp = ISOTimestamp.now()
                if message.sender is None:
                    message.sender = self.remote_identity
                private = self.session.remote_focus and len(
                    message.recipients
                ) == 1 and message.recipients[0] != self.remote_identity
        else:
            payload = SimplePayload.decode(data, content_type)
            message = Message(payload.content,
                              payload.content_type,
                              sender=self.remote_identity,
                              recipients=[self.local_identity],
                              timestamp=ISOTimestamp.now())
            private = False

        try:
            message.content = self.encryption.otr_session.handle_input(
                message.content.encode(), message.content_type)
        except IgnoreMessage:
            self.msrp_session.send_report(chunk, 200, 'OK')
            return
        except UnencryptedMessage:
            encrypted = False
            encryption_active = True
        except EncryptedMessageError as e:
            self.msrp_session.send_report(chunk, 400, str(e))
            notification_center = NotificationCenter()
            notification_center.post_notification(
                'ChatStreamOTRError',
                sender=self,
                data=NotificationData(error=str(e)))
            return
        except OTRError as e:
            self.msrp_session.send_report(chunk, 200, 'OK')
            notification_center = NotificationCenter()
            notification_center.post_notification(
                'ChatStreamOTRError',
                sender=self,
                data=NotificationData(error=str(e)))
            return
        else:
            encrypted = encryption_active = self.encryption.active

        if payload.charset is not None:
            message.content = message.content.decode(payload.charset)
        elif payload.content_type.startswith('text/'):
            message.content = message.content.decode('utf8')

        notification_center = NotificationCenter()
        if message.content_type.lower() == IsComposingDocument.content_type:
            try:
                document = IsComposingDocument.parse(message.content)
            except (ParserError, OSError) as e:
                self.msrp_session.send_report(chunk, 400, str(e))
                return
            self.msrp_session.send_report(chunk, 200, 'OK')
            data = NotificationData(
                state=document.state.value,
                refresh=document.refresh.value
                if document.refresh is not None else 120,
                content_type=document.content_type.value
                if document.content_type is not None else None,
                last_active=document.last_active.value
                if document.last_active is not None else None,
                sender=message.sender,
                recipients=message.recipients,
                private=private,
                encrypted=encrypted,
                encryption_active=encryption_active)
            notification_center.post_notification(
                'ChatStreamGotComposingIndication', sender=self, data=data)
        else:
            self.msrp_session.send_report(chunk, 200, 'OK')
            data = NotificationData(message=message,
                                    private=private,
                                    encrypted=encrypted,
                                    encryption_active=encryption_active)
            notification_center.post_notification('ChatStreamGotMessage',
                                                  sender=self,
                                                  data=data)
            self.msrp_session.send_report(chunk, 200, 'OK')
            notification_center = NotificationCenter()
            notification_center.post_notification('ChatStreamOTRError', sender=self, data=NotificationData(error=str(e)))
            return
        else:
            encrypted = encryption_active = self.encryption.active

        if payload.charset is not None:
            message.content = message.content.decode(payload.charset)
        elif payload.content_type.startswith('text/'):
            message.content.decode('utf8')

        notification_center = NotificationCenter()
        if message.content_type.lower() == IsComposingDocument.content_type:
            try:
                document = IsComposingDocument.parse(message.content)
            except ParserError as e:
                self.msrp_session.send_report(chunk, 400, str(e))
                return
            self.msrp_session.send_report(chunk, 200, 'OK')
            data = NotificationData(state=document.state.value,
                                    refresh=document.refresh.value if document.refresh is not None else 120,
                                    content_type=document.content_type.value if document.content_type is not None else None,
                                    last_active=document.last_active.value if document.last_active is not None else None,
                                    sender=message.sender, recipients=message.recipients, private=private,
                                    encrypted=encrypted, encryption_active=encryption_active)
            notification_center.post_notification('ChatStreamGotComposingIndication', sender=self, data=data)
        else:
            self.msrp_session.send_report(chunk, 200, 'OK')
            data = NotificationData(message=message, private=private, encrypted=encrypted, encryption_active=encryption_active)
            notification_center.post_notification('ChatStreamGotMessage', sender=self, data=data)
Exemple #5
0
 def send_composing_indication(self, state, refresh=None, last_active=None, recipients=None):
     content = IsComposingDocument.create(state=State(state), refresh=Refresh(refresh) if refresh is not None else None, last_active=LastActive(last_active) if last_active is not None else None, content_type=ContentType('text'))
     message = QueuedMessage(content, IsComposingDocument.content_type, recipients=recipients, notify_progress=False)
     self._enqueue_message(message)
     return message.id
Exemple #6
0
            self.msrp_session.send_report(chunk, 200, 'OK')
            notification_center = NotificationCenter()
            notification_center.post_notification('ChatStreamOTRError', sender=self, data=NotificationData(error=str(e)))
            return
        else:
            encrypted = encryption_active = self.encryption.active

        if payload.charset is not None:
            message.content = message.content.decode(payload.charset)
        elif payload.content_type.startswith('text/'):
            message.content.decode('utf8')

        notification_center = NotificationCenter()
        if message.content_type.lower() == IsComposingDocument.content_type:
            try:
                document = IsComposingDocument.parse(message.content)
            except ParserError as e:
                self.msrp_session.send_report(chunk, 400, str(e))
                return
            self.msrp_session.send_report(chunk, 200, 'OK')
            data = NotificationData(state=document.state.value,
                                    refresh=document.refresh.value if document.refresh is not None else 120,
                                    content_type=document.content_type.value if document.content_type is not None else None,
                                    last_active=document.last_active.value if document.last_active is not None else None,
                                    sender=message.sender, recipients=message.recipients, private=private,
                                    encrypted=encrypted, encryption_active=encryption_active)
            notification_center.post_notification('ChatStreamGotComposingIndication', sender=self, data=data)
        else:
            self.msrp_session.send_report(chunk, 200, 'OK')
            data = NotificationData(message=message, private=private, encrypted=encrypted, encryption_active=encryption_active)
            notification_center.post_notification('ChatStreamGotMessage', sender=self, data=data)