示例#1
0
 def new_from_sdp(cls, session, remote_sdp, stream_index):
     remote_stream = remote_sdp.media[stream_index]
     if remote_stream.media != 'message' or 'file-selector' not in remote_stream.attributes:
         raise UnknownStreamError
     expected_transport = 'TCP/TLS/MSRP' if session.account.msrp.transport == 'tls' else 'TCP/MSRP'
     if remote_stream.transport != expected_transport:
         raise InvalidStreamError(
             "expected %s transport in file transfer stream, got %s" %
             (expected_transport, remote_stream.transport))
     if remote_stream.formats != ['*']:
         raise InvalidStreamError("wrong format list specified")
     try:
         file_selector = FileSelector.parse(
             remote_stream.attributes.getfirst('file-selector'))
     except Exception as e:
         raise InvalidStreamError(
             "error parsing file-selector: {}".format(e))
     transfer_id = remote_stream.attributes.getfirst(
         'file-transfer-id', None)
     if remote_stream.direction == 'sendonly':
         stream = cls(file_selector, 'recvonly', transfer_id)
     elif remote_stream.direction == 'recvonly':
         stream = cls(file_selector, 'sendonly', transfer_id)
     else:
         raise InvalidStreamError("wrong stream direction specified")
     stream.remote_role = remote_stream.attributes.getfirst(
         'setup', 'active')
     return stream
示例#2
0
 def new_from_sdp(cls, session, remote_sdp, stream_index):
     remote_stream = remote_sdp.media[stream_index]
     if remote_stream.media != b'application':
         raise UnknownStreamError
     accept_types = remote_stream.attributes.getfirst(b'accept-types', None)
     accept_types = accept_types.decode() if accept_types else None
     if accept_types is None or 'application/x-rfb' not in accept_types.split(
     ):
         raise UnknownStreamError
     expected_transport = 'TCP/TLS/MSRP' if session.account.msrp.transport == 'tls' else 'TCP/MSRP'
     if remote_stream.transport != expected_transport.encode():
         raise InvalidStreamError(
             "expected %s transport in chat stream, got %s" %
             (expected_transport, remote_stream.transport))
     if remote_stream.formats != [b'*']:
         raise InvalidStreamError("wrong format list specified")
     remote_rfbsetup = remote_stream.attributes.getfirst(
         'rfbsetup', 'active')
     remote_rfbsetup = remote_rfbsetup.decode() if remote_rfbsetup else None
     if remote_rfbsetup == 'active':
         stream = cls(mode='server')
     elif remote_rfbsetup == 'passive':
         stream = cls(mode='viewer')
     else:
         raise InvalidStreamError(
             "unknown rfbsetup attribute in the remote screen sharing stream"
         )
     stream.remote_role = remote_stream.attributes.getfirst(
         b'setup', b'active')
     return stream
示例#3
0
    def new_from_sdp(cls, session, remote_sdp, stream_index):
        remote_stream = remote_sdp.media[stream_index]
        if remote_stream.media != b'message':
            raise UnknownStreamError
        expected_transport = 'TCP/TLS/MSRP' if session.account.msrp.transport == 'tls' else 'TCP/MSRP'
        if remote_stream.transport != expected_transport.encode():
            raise InvalidStreamError(
                "expected %s transport in chat stream, got %s" %
                (expected_transport, remote_stream.transport))
        if remote_stream.formats != [b'*']:
            raise InvalidStreamError("wrong format list specified")
        stream = cls()
        stream.remote_role = remote_stream.attributes.getfirst(
            'setup', 'active')

        if remote_stream.direction != b'sendrecv':
            raise InvalidStreamError(
                "Unsupported direction for chat stream: %s" %
                remote_stream.direction)
        remote_accept_types = remote_stream.attributes.getfirst(
            b'accept-types')
        if remote_accept_types is None:
            raise InvalidStreamError(
                "remote SDP media does not have 'accept-types' attribute")
        if not any(
                contains_mime_type(cls.accept_types, mime_type)
                for mime_type in remote_accept_types.decode().split()):
            raise InvalidStreamError("no compatible media types found")
        return stream
示例#4
0
 def new_from_sdp(cls, session, remote_sdp, stream_index):
     # TODO: actually validate the SDP
     settings = SIPSimpleSettings()
     remote_stream = remote_sdp.media[stream_index]
     if remote_stream.media != cls.type:
         raise UnknownStreamError
     if remote_stream.transport not in ('RTP/AVP', 'RTP/SAVP'):
         raise InvalidStreamError(
             "expected RTP/AVP or RTP/SAVP transport in %s stream, got %s" %
             (cls.type, remote_stream.transport))
     local_encryption_policy = session.account.rtp.encryption.key_negotiation if session.account.rtp.encryption.enabled else None
     if local_encryption_policy == "sdes_mandatory" and not "crypto" in remote_stream.attributes:
         raise InvalidStreamError(
             "SRTP/SDES is locally mandatory but it's not remotely enabled")
     if remote_stream.transport == 'RTP/SAVP' and "crypto" in remote_stream.attributes and local_encryption_policy not in (
             "opportunistic", "sdes_optional", "sdes_mandatory"):
         raise InvalidStreamError(
             "SRTP/SDES is remotely mandatory but it's not locally enabled")
     account_preferred_codecs = getattr(session.account.rtp,
                                        '%s_codec_list' % cls.type)
     general_codecs = getattr(settings.rtp, '%s_codec_list' % cls.type)
     supported_codecs = account_preferred_codecs or general_codecs
     if not any(codec for codec in remote_stream.codec_list
                if codec in supported_codecs):
         raise InvalidStreamError("no compatible codecs found")
     stream = cls()
     stream._incoming_remote_sdp = remote_sdp
     stream._incoming_stream_index = stream_index
     return stream
示例#5
0
    def new_from_sdp(cls, session, remote_sdp, stream_index):
        remote_stream = remote_sdp.media[stream_index]
        if remote_stream.media != 'application':
            raise UnknownStreamError

        remote_accept_types = remote_stream.attributes.getfirst('accept-types', None)
        if remote_accept_types is None:
            raise InvalidStreamError("remote SDP media does not have 'accept-types' attribute")
        if 'application/x-webodf-documentsharing' not in remote_accept_types.split(): # TODO: check both needed mimetypes
            raise InvalidStreamError("no compatible media types found")

        expected_transport = 'TCP/TLS/MSRP' if session.account.msrp.transport=='tls' else 'TCP/MSRP'
        if remote_stream.transport != expected_transport:
            raise InvalidStreamError("expected %s transport in chat stream, got %s" % (expected_transport, remote_stream.transport))
        if remote_stream.formats != ['*']:
            raise InvalidStreamError("wrong format list specified")

        document_title = remote_stream.attributes.getfirst('document-title', None)
        session_uuid = remote_stream.attributes.getfirst('docsession-uuid', None)
        continue_session = remote_stream.attributes.getfirst('docsession-continue', None)
        # revert on reception side
        if continue_session == "host":
            continue_session = "guest"
        elif continue_session == "guest":
            continue_session = "host"

        return cls(filename = None, document_title = document_title, session_uuid = session_uuid, continue_session = continue_session)
示例#6
0
 def new_from_sdp(cls, session, remote_sdp, stream_index):
     stream = super(VideoStream, cls).new_from_sdp(session, remote_sdp, stream_index)
     if stream.device.producer is None:
         raise InvalidStreamError("no video support available")
     if not stream.validate_update(remote_sdp, stream_index):
         raise InvalidStreamError("no valid SDP")
     return stream
示例#7
0
 def new_from_sdp(cls, session, remote_sdp, stream_index):
     stream = super(VideoStream, cls).new_from_sdp(session, remote_sdp, stream_index)
     if stream.device.producer is None:
         raise InvalidStreamError("no video support available")
     #  todo -check this later, commentingout for h264 issues for now
     #if not stream.validate_update(remote_sdp, stream_index):
     #    raise InvalidStreamError("no valid SDP")
     return stream
示例#8
0
    def new_from_sdp(cls, session, remote_sdp, stream_index):
        remote_stream = remote_sdp.media[stream_index]

        if remote_stream.media != b'message':
            raise UnknownStreamError

        if b'file-selector' not in remote_stream.attributes:
            raise UnknownStreamError

        expected_transport = 'TCP/TLS/MSRP' if session.account.msrp.transport == 'tls' else 'TCP/MSRP'
        if remote_stream.transport != expected_transport.encode():
            raise InvalidStreamError(
                "expected %s transport in file transfer stream, got %s" %
                (expected_transport, remote_stream.transport))

        if remote_stream.formats != [b'*']:
            raise InvalidStreamError("wrong format list specified")

        file_selector_attr = remote_stream.attributes.getfirst(
            b'file-selector')
        try:
            file_selector = FileSelector.parse(file_selector_attr)
        except Exception as e:
            raise InvalidStreamError(
                "error parsing file-selector: {}".format(e))

        transfer_id = remote_stream.attributes.getfirst(
            b'file-transfer-id', None)
        transfer_id = transfer_id.decode() if transfer_id else None

        try:
            if remote_stream.direction == b'sendonly':
                stream = cls(file_selector, 'recvonly', transfer_id)
            elif remote_stream.direction == b'recvonly':
                stream = cls(file_selector, 'sendonly', transfer_id)
            else:
                raise InvalidStreamError("wrong stream direction specified")
        except Exception as e:
            traceback.print_exc()
            return None
        stream.remote_role = remote_stream.attributes.getfirst(
            b'setup', b'active')
        return stream