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
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
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
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
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)
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
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
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