Ejemplo n.º 1
0
def extend_ubx_payload(dialect: int, backend: Backend, user: User,
                       ctc_sess: 'BackendSession') -> str:
    response = ''

    ctc_machineguid = ctc_sess.front_data.get('msn_machineguid')
    pop_id_ctc = ctc_sess.front_data.get('msn_pop_id')
    if dialect >= 13 and ctc_machineguid:
        response += '<MachineGuid>{}</MachineGuid>'.format(ctc_machineguid)

    if dialect >= 16:
        response += '{}<SignatureSound>{}</SignatureSound>{}'.format(
            ('<DDP>{}</DDP>'.format(
                encode_xml_he(ctc_sess.front_data.get('msn_msnobj_ddp'),
                              dialect) or '') if dialect >= 18 else ''),
            encode_xml_he(ctc_sess.front_data.get('msn_sigsound'), dialect)
            or '',
            ('<Scene>{}</Scene><ColorScheme>{}</ColorScheme>'.format(
                encode_xml_he(ctc_sess.front_data.get('msn_msnobj_scene'),
                              dialect) or '',
                ctc_sess.front_data.get('msn_colorscheme') or '')
             if dialect >= 18 else ''),
        )
        if pop_id_ctc:
            response += EPDATA_PAYLOAD.format(
                mguid='{' + pop_id_ctc + '}',
                capabilities=encode_capabilities_capabilitiesex(
                    ((ctc_sess.front_data.get('msn_capabilities') or 0)
                     if ctc_sess.front_data.get('msn') is True else
                     MAX_CAPABILITIES_BASIC),
                    ctc_sess.front_data.get('msn_capabilitiesex') or 0))
            for ctc_sess_other in backend.util_get_sessions_by_user(
                    ctc_sess.user):
                pop_id = ctc_sess_other.front_data.get('msn_pop_id') or ''
                if pop_id.lower() == pop_id_ctc.lower(): continue
                response += EPDATA_PAYLOAD.format(
                    mguid='{' + pop_id + '}',
                    capabilities=encode_capabilities_capabilitiesex(
                        ((ctc_sess.front_data.get('msn_capabilities') or 0)
                         if ctc_sess.front_data.get('msn') is True else
                         MAX_CAPABILITIES_BASIC),
                        ctc_sess_other.front_data.get('msn_capabilitiesex')
                        or 0))
            if ctc_sess.user is user:
                for ctc_sess_other in backend.util_get_sessions_by_user(
                        ctc_sess.user):
                    if ctc_sess_other.front_data.get('msn_pop_id') is None:
                        continue

                    response += PRIVATEEPDATA_PAYLOAD.format(
                        mguid='{' +
                        (ctc_sess_other.front_data.get('msn_pop_id') or '') +
                        '}',
                        ped_data=_list_private_endpoint_data(ctc_sess_other))
    return response
Ejemplo n.º 2
0
def build_presence_notif(
        trid: Optional[str],
        ctc_head: User,
        user_me: User,
        dialect: int,
        backend: Backend,
        iln_sent: bool,
        *,
        self_presence: bool = False,
        bs_other: Optional['BackendSession'] = None,
        groupchat: Optional['GroupChat'] = None) -> Iterable[Tuple[Any, ...]]:
    detail = user_me.detail
    assert detail is not None

    if not iln_sent: return

    nfy_rst = ''

    if not groupchat:
        if not self_presence and ctc_head is not user_me:
            ctc = detail.contacts.get(ctc_head.uuid)
            assert ctc is not None
            status = ctc.status
            head = ctc.head
        else:
            head = user_me
            status = head.status
    else:
        head = ctc_head
        status = head.status
    is_offlineish = status.is_offlineish()
    if is_offlineish and trid is not None:
        return
    ctc_sess = None  # type: Optional['BackendSession']

    ctc_sess = first_in_iterable(backend.util_get_sessions_by_user(head))

    #if dialect == 21:
    #	cm = None # type: Optional[str]
    #	pop_id_ctc = None # type: Optional[str]
    #
    #	substatus = status.substatus
    #
    #	if is_offlineish and head is not user_me:
    #		# In case `ctc` is going `HDN`; make sure other people don't receive `HDN` as status
    #		substatus = Substatus.Offline
    #
    #	if not substatus is Substatus.Offline:
    #		assert ctc_sess is not None
    #
    #		cm = NFY_PUT_PRESENCE_USER_S_CM.format(cm = encode_xml_he(status.media or '', dialect))
    #		nfy_rst += NFY_PUT_PRESENCE_USER_S_PE.format(
    #			msnobj = encode_xml_he(ctc_sess.front_data.get('msn_msnobj') or '', dialect),
    #			name = status.name or head.email, message = status.message,
    #			ddp = encode_xml_he(ctc_sess.front_data.get('msn_msnobj_ddp') or '', dialect), colorscheme = encode_xml_he(ctc_sess.front_data.get('msn_colorscheme') or '', dialect), scene = encode_xml_he(ctc_sess.front_data.get('msn_msnobj_scene') or '', dialect), sigsound = encode_xml_he(ctc_sess.front_data.get('msn_sigsound') or '', dialect),
    #		)
    #		if ctc_sess.front_data.get('msn_pop_id') is not None:
    #			pop_id_ctc = '{' + ctc_sess.front_data['msn_pop_id'] + '}'
    #		nfy_rst += NFY_PUT_PRESENCE_USER_SEP_IM.format(
    #			epid_attrib = (NFY_PUT_PRESENCE_USER_SEP_EPID.format(mguid = pop_id_ctc or '') if pop_id_ctc is not None else ''), capabilities = encode_capabilities_capabilitiesex(((ctc_sess.front_data.get('msn_capabilities') or 0) if ctc_sess.front_data.get('msn') is True else MAX_CAPABILITIES_BASIC), ctc_sess.front_data.get('msn_capabilitiesex') or 0),
    #		)
    #		if ctc_sess.front_data.get('msn_PE'):
    #			pe_data = ''
    #			pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_VER.format(ver = ctc_sess.front_data.get('msn_PE_VER') or '')
    #			pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_TYP.format(typ = ctc_sess.front_data.get('msn_PE_TYP') or '')
    #			pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_CAP.format(pe_capabilities = encode_capabilities_capabilitiesex(ctc_sess.front_data.get('msn_PE_capabilities') or 0, ctc_sess.front_data.get('msn_PE_capabilitiesex') or 0))
    #			nfy_rst += NFY_PUT_PRESENCE_USER_SEP_PE.format(
    #				epid_attrib = (NFY_PUT_PRESENCE_USER_SEP_EPID.format(mguid = pop_id_ctc or '') if pop_id_ctc is not None else ''), pe_data = pe_data,
    #			)
    #		if pop_id_ctc is not None:
    #			nfy_rst += NFY_PUT_PRESENCE_USER_SEP_PD.format(
    #				mguid = pop_id_ctc, ped_data = _list_private_endpoint_data(ctc_sess),
    #			)
    #
    #		for ctc_sess_other in backend.util_get_sessions_by_user(ctc_sess.user):
    #			if ctc_sess_other is ctc_sess: continue
    #			if ctc_sess_other.front_data.get('msn_pop_id') is None: continue
    #
    #			nfy_rst += NFY_PUT_PRESENCE_USER_SEP_IM.format(
    #				epid_attrib = NFY_PUT_PRESENCE_USER_SEP_EPID.format(mguid = '{' + ctc_sess_other.front_data['msn_pop_id'] + '}'), capabilities = encode_capabilities_capabilitiesex(((ctc_sess_other.front_data.get('msn_capabilities') or 0) if ctc_sess_other.front_data.get('msn') is True else MAX_CAPABILITIES_BASIC), ctc_sess_other.front_data.get('msn_capabilitiesex') or 0),
    #			)
    #			if ctc_sess_other.front_data.get('msn_PE'):
    #				pe_data = ''
    #				pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_VER.format(ver = ctc_sess_other.front_data.get('msn_PE_VER') or '')
    #				pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_TYP.format(typ = ctc_sess_other.front_data.get('msn_PE_TYP') or '')
    #				pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_CAP.format(capabilities = encode_capabilities_capabilitiesex(ctc_sess_other.front_data.get('msn_PE_capabilities') or 0, ctc_sess_other.front_data.get('msn_PE_capabilitiesex') or 0))
    #				nfy_rst += NFY_PUT_PRESENCE_USER_SEP_PE.format(
    #					epid_attrib = NFY_PUT_PRESENCE_USER_SEP_EPID.format(mguid = '{' + ctc_sess_other.front_data['msn_pop_id'] + '}'), pe_data = pe_data,
    #				)
    #			nfy_rst += NFY_PUT_PRESENCE_USER_SEP_PD.format(
    #				mguid = '{' + ctc_sess_other.front_data['msn_pop_id'] + '}', ped_data = _list_private_endpoint_data(ctc_sess_other)
    #			)
    #
    #	msn_status = MSNStatus.FromSubstatus(substatus)
    #
    #	nfy_presence_body = NFY_PUT_PRESENCE_USER.format(
    #		substatus = msn_status.name, cm = cm or '', rst = nfy_rst,
    #	)
    #
    #	nfy_payload = encode_payload(NFY_PUT_PRESENCE,
    #		to = user_me.email, from_email = head.email, cl = len(nfy_presence_body), payload = nfy_presence_body,
    #	)
    #
    #	yield ('NFY', 'PUT', nfy_payload)
    #	return

    if is_offlineish and not head is user_me:
        if dialect >= 18:
            reply = ('FLN',
                     encode_email_networkid(head.email,
                                            None,
                                            groupchat=groupchat)
                     )  # type: Tuple[Any, ...]
        else:
            reply = ('FLN', head.email)

        if 13 <= dialect <= 17:
            # Mypy incorrectly gives a type error here. Must be a bug.
            reply += (int(NetworkID.WINDOWS_LIVE), )  # type: ignore
        if 13 <= dialect <= 15:
            reply += ('0', )
        elif dialect >= 16:
            reply += ('0:0', )
        yield reply
        return

    assert ctc_sess is not None

    msn_status = MSNStatus.FromSubstatus(status.substatus)

    if trid and dialect < 18: frst = ('ILN', trid)  # type: Tuple[Any, ...]
    else: frst = ('NLN', )
    rst = []

    if 8 <= dialect <= 15:
        rst.append(((ctc_sess.front_data.get('msn_capabilities') or 0)
                    if ctc_sess.front_data.get('msn') is True else
                    MAX_CAPABILITIES_BASIC))
    elif dialect >= 16:
        rst.append(
            ('0:0' if groupchat is not None and head.uuid == user_me.uuid else
             encode_capabilities_capabilitiesex(
                 ((ctc_sess.front_data.get('msn_capabilities') or 0)
                  if ctc_sess.front_data.get('msn') is True else
                  MAX_CAPABILITIES_BASIC),
                 ctc_sess.front_data.get('msn_capabilitiesex') or 0)))
    if dialect >= 9:
        rst.append(
            encode_msnobj(
                ctc_sess.front_data.get('msn_msnobj') or '<msnobj/>'))

    if dialect >= 18:
        yield (*frst, msn_status.name,
               encode_email_networkid(head.email, None,
                                      groupchat=groupchat), status.name, *rst)
    else:
        yield (*frst, msn_status.name, head.email,
               (int(NetworkID.WINDOWS_LIVE) if 14 <= dialect <= 17 else None),
               status.name, *rst)

    if dialect < 11:
        return

    if dialect >= 18 and (groupchat is not None and head.uuid == user_me.uuid):
        return

    ubx_payload = '<Data><PSM>{}</PSM><CurrentMedia>{}</CurrentMedia>{}</Data>'.format(
        (encode_xml_he(status.message, dialect)
         if dialect >= 13 else encode_xml_ne(status.message)) or '',
        (encode_xml_he(status.media, dialect)
         if dialect >= 13 else encode_xml_ne(status.media)) or '',
        extend_ubx_payload(dialect, backend, user_me,
                           ctc_sess)).encode('utf-8')

    if dialect >= 18:
        yield ('UBX',
               encode_email_networkid(head.email, None,
                                      groupchat=groupchat), ubx_payload)
    else:
        yield ('UBX', head.email,
               (int(NetworkID.WINDOWS_LIVE) if 14 <= dialect <= 17 else None),
               ubx_payload)