Exemple #1
0
def x07_x07(o, sock, data):
    '''
    SNAC (x7, x7): account confirm response

    reference: U{http://iserverd.khstu.ru/oscar/snac_07_07.html}
    '''
    stat_codes = {
        0x00:
        _('You should receive an email with confirmation instructions shortly.'
          ),
        0x1e:
        _('Your account is already confirmed.'),
        0x23:
        _('There was an unknown server error.'),
    }

    error, data = oscar.unpack((('code', 'H'), ), data)
    if data:
        tlv, data = oscar.unpack((('tlv', 'tlv'), ), data)
        url = tlv.v
    else:
        url = 'This is not an error.'

    assert not data
    status_msg = stat_codes[error]

    o.hub.user_message(
        status_msg,
        _('Confirm Account: {username}').format(username=o.self_buddy.name))
Exemple #2
0
def x09_x09(o, sock, data):
    '''
    SNAC (x9, x9): Service error

    reference: U{http://iserverd.khstu.ru/oscar/snac_09_09.html}
    '''
    errcode, data = oscar.unpack((('_', 'H'), ), data)

    if data:
        fmt = (('tlvs', 'tlv_dict'), )

        tlvs, data = oscar.unpack(fmt, data)
        assert not data

        subcode, tlvs[8] = oscar.unpack((('code', 'H'), ), tlvs[8])
        errmsg = tlvs[4]

        if errcode == 1:
            errmsg = 'Wrong mode'
        else:
            errmsg = None
            errcode = 'Unknown Error'
    else:
        subcode = None
    raise oscar.SnacError((0x09, x09_name), (errcode, errmsg),
                          (subcode, subcodes[subcode]))
Exemple #3
0
def icq_srv_07da_00fa(o, uid, result, data):
    count, data = oscar.unpack((('count','B'),), data, '<')

    orgs = []
    for _ in range(count):
        org, desc, data = oscar.unpack(
                                       (('org','H'),
                                        ('desc','lnts')),
                                       data, '<'
                                       )

        orgs.append((org, desc))
    o.buddies[uid].organizations = orgs


    count, data = oscar.unpack((('count','B'),), data, '<')

    affils = []
    for _ in range(count):
        affil, desc, data = oscar.unpack(
                                         (('affil','H'),
                                          ('desc','lnts')),
                                         data, '<'
                                         )

        affils.append((affil, desc))

    o.buddies[uid].affiliations= affils
Exemple #4
0
def rcv_channel1_message(o, cookie, chan, userinfo, data):
    '''Returns the message from a channel 1 message block.

    The result can be a string or unicode object.'''
    msgtlvs, data = oscar.unpack((('msgtlvs', 'named_tlvs', -1, tlv_types), ),
                                 data)
    assert not data
    assert 'message_data' in msgtlvs

    is_auto_response = 'auto' in msgtlvs
    is_offline = 'offline' in msgtlvs
    timestamp = msgtlvs.get('timestamp', None)

    message_fragments, data = oscar.unpack((('msg', 'message_block'), ),
                                           msgtlvs.message_data)
    assert not data
    assert 1 in message_fragments

    required = map(ord, message_fragments.get(5, ''))

    if any(x in required for x in (2, 6)) or required == [1]:
        # Also observed: [5,1] from eBuddy android client; is_html should be True.
        is_html = True
    else:
        is_html = False

    fmt = (
        ('charset', 'H'),
        ('subset', 'H'),
    )
    for msg in message_fragments[1]:
        charset, subset, msg = oscar.unpack(fmt, msg)

        # multipart SMS messages come in with message-NULL-mysterious_ascii_characters
        # so just grab everything up to null

        # (disabled b/c of #4677 -- ICQ messages get cut off)
        # msg = msg.split('\x00')[0]

        codec = {
            3: 'locale',
            2: 'utf-16-be',
            0: 'utf-8',
            0xd: 'utf-8'
        }.get(charset, 'utf-8')

        log.info('incoming channel1 message:')
        log.info('\tCharset=%d, subset=%d, codec=%s, is_html=%r, msg[:4]=%r',
                 charset, subset, codec, is_html, msg[:4])
        log.info('\tRequired types for message fragments are: %r', required)
        log.info_s('\tdata=%r', msg)

        msg = util.auxencodings.fuzzydecode(msg, [codec, 'utf-8'])

        o.incoming_message(userinfo,
                           msg,
                           is_auto_response,
                           offline=is_offline,
                           timestamp=timestamp,
                           html=is_html)
Exemple #5
0
def x04_x0b(o, sock, data):
    '''
    SNAC (x4, xb): client/server message error (or data!)

    reference: U{http://iserverd.khstu.ru/oscar/snac_04_0b.html}
    '''

    fmt = (('cookie', 'Q'), ('channel', 'H'), ('screenname', 'pstring'),
           ('reason', 'H'))
    reasons = {
        1: 'Unsupported channel',
        2: 'Busted payload',
        3: 'Channel specific'
    }

    cookie, channel, screenname, reason, data = oscar.unpack(fmt, data)

    warn("ch%d message error for cookie %r, screenname %s:", channel, cookie,
         screenname)
    warn('\t\t' + reasons.get(reason, '<UNKNOWN REASON>'))
    warn('\t\t' + repr(data))

    if reason == 3:
        channel, data = oscar.unpack((('channel', 'H'), ), data)
        if channel == 2:
            messagetype, data = oscar.unpack((('msgtype', 'H'), ), data)
            rendezvous.handlech2(o, None, screenname, cookie, messagetype,
                                 data)

            return

    log.error("data not handled: %r", data)
Exemple #6
0
def x09_x09(o, sock, data):
    '''
    SNAC (x9, x9): Service error

    reference: U{http://iserverd.khstu.ru/oscar/snac_09_09.html}
    '''
    errcode, data = oscar.unpack((('_', 'H'),), data)

    if data:
        fmt = (('tlvs', 'tlv_dict'),)

        tlvs, data = oscar.unpack(fmt, data)
        assert not data

        subcode, tlvs[8] = oscar.unpack((('code', 'H'),),tlvs[8])
        errmsg = tlvs[4]

        if errcode == 1:
            errmsg = 'Wrong mode'
        else:
            errmsg = None
            errcode = 'Unknown Error'
    else:
        subcode = None
    raise oscar.SnacError((0x09, x09_name), (errcode, errmsg), (subcode, subcodes[subcode]))
Exemple #7
0
def x04_x0b(o, sock, data):
    '''
    SNAC (x4, xb): client/server message error (or data!)

    reference: U{http://iserverd.khstu.ru/oscar/snac_04_0b.html}
    '''

    fmt = (('cookie', 'Q'),
           ('channel','H'),
           ('screenname','pstring'),
           ('reason', 'H'))
    reasons = {1: 'Unsupported channel',
               2: 'Busted payload',
               3: 'Channel specific'}

    cookie, channel, screenname, reason, data = oscar.unpack(fmt, data)

    warn("ch%d message error for cookie %r, screenname %s:", channel, cookie, screenname)
    warn('\t\t' + reasons.get(reason, '<UNKNOWN REASON>'))
    warn('\t\t' + repr(data))

    if reason == 3:
        channel, data = oscar.unpack((('channel','H'),), data)
        if channel == 2:
            messagetype, data = oscar.unpack((('msgtype','H'),), data)
            rendezvous.handlech2(o, None, screenname, cookie, messagetype, data)

            return

    log.error("data not handled: %r", data)
Exemple #8
0
def rcv_extended_message(o, userinfo, cookie, msg_type, data):
    log.info('Got fancy message from %s', userinfo.name)

    fmt = (('tlvs', 'tlv_dict'), )
    tlvs, data = oscar.unpack(fmt, data)

    log.info('Fancy message TLVS: %r', tlvs)
    assert not data

    if 0x2711 not in tlvs:
        log.warning('  Not sure what to do with those fancy tlvs.')
        return

    data = tlvs[0x2711]

    fmt = (('length1', 'H'), ('chunk1', 's', 'length1'), ('length2', 'H'),
           ('chunk2', 's', 'length2'))

    # chunk1 and 2 don't seem to have any useful information.
    # XXX: Not sure if the number of chunks is always the same or not
    length1, chunk1, length2, chunk2, data = oscar.unpack(fmt,
                                                          data,
                                                          byte_order='<')

    # data now holds the message block
    fmt = (
        ('type', 'B'),
        ('flags', 'B'),
        ('status', 'H'),
        ('priority', 'H'),
        ('length', 'H'),
        ('message', 's', 'length'),
    )

    type, flags, status, priority, length, message, data = oscar.unpack(
        fmt, data, byte_order='<')

    log.info(
        'type=%r,flags=%r,status=%r,priority=%r,length=%r,message=%r,data=%r',
        type, flags, status, priority, length, message, data)

    if message:
        assert message[-1] == '\0'
        message = message[:-1]

        # this is wrong...seems to always be true
        auto = (flags & 0x2) == 0x2

        if message:
            o.incoming_rtf_message(
                userinfo,
                message,
            )  #auto)
    else:
        # Possibly a 'TZer' ?

        log.error("message not handled, unknown type")
        '''
Exemple #9
0
    def _set_avail_msg(self, newval, notify=True):

        old = self._avail_msg
        tflvs = {}        # type, flag, length, value
        try:
            tflvs_list, newval = oscar.unpack((('values', 'tflv_list'),), newval)
        except Exception:
            return

        for tflv in tflvs_list:
            tflvs[tflv.t] = tflv.v

        if 1 in tflvs:
            self.setnotifyif('icon_hash', tflvs[1])
        if 2 in tflvs:

            if len(tflvs[2]) > 0:
                fmt = (
                    ('msglen','H'),
                    ('msg', 's', 'msglen'),
                    ('numtlvs', 'H'),
                    ('tlvs', 'tlv_list', 'numtlvs'),
                    )

                try:
                    __, msg, __, tlvs, tflvs[2] = oscar.unpack(fmt, tflvs[2])
                except Exception, e:
                    log.error('Error unpacking available message. (exc=%r, data=%r)', e, tflvs[2])
                    msg = None

                if self is self.protocol.self_buddy:
                    # Much like capabilities, we don't want to allow this to be
                    # set from the network. we know what our status message is,
                    # thank you very much.

                    # Of course this doesn't really work when signed in from another location.
                    # Keep that a secret, 'kay?
                    return

                if msg is None:
                    self._avail_msg = None
                    self._cached_status_message = None
                    return

                codecs = ['fuzzy', 'utf-8']

                if tlvs:
                    log.info('Got extra tlvs for availmsg: %r', tlvs)
                    codecs[1:1] = [tlv.v for tlv in tlvs]

                self._avail_msg = msg.decode(' '.join(codecs))
                self._cached_status_message = None
            else:
                self._avail_msg = None
Exemple #10
0
def rcv_extended_message(o, userinfo, cookie, msg_type, data):
    log.info('Got fancy message from %s', userinfo.name)

    fmt = (('tlvs','tlv_dict'),)
    tlvs, data = oscar.unpack(fmt, data)

    log.info('Fancy message TLVS: %r', tlvs)
    assert not data

    if 0x2711 not in tlvs:
        log.warning('  Not sure what to do with those fancy tlvs.')
        return

    data = tlvs[0x2711]

    fmt = ( ('length1', 'H'),
            ('chunk1',  's',   'length1'),
            ('length2', 'H'),
            ('chunk2',  's',   'length2')
          )

    # chunk1 and 2 don't seem to have any useful information.
    # XXX: Not sure if the number of chunks is always the same or not
    length1, chunk1, length2, chunk2, data = oscar.unpack(fmt, data, byte_order='<')

    # data now holds the message block
    fmt = ( ('type',     'B'),
            ('flags',    'B'),
            ('status',   'H'),
            ('priority', 'H'),
            ('length',   'H'),
            ('message',  's',    'length'),
          )

    type,flags,status,priority,length,message,data = oscar.unpack(fmt, data, byte_order='<')

    log.info('type=%r,flags=%r,status=%r,priority=%r,length=%r,message=%r,data=%r',
             type,flags,status,priority,length,message,data)

    if message:
        assert message[-1] == '\0'
        message = message[:-1]

        # this is wrong...seems to always be true
        auto = (flags & 0x2) == 0x2

        if message:
            o.incoming_rtf_message(userinfo, message, )#auto)
    else:
        # Possibly a 'TZer' ?

        log.error("message not handled, unknown type")
        '''
Exemple #11
0
def icq_srv_07da_00eb(o, uid, result, data):
    count, data = oscar.unpack((('count','B'),), data, '<')

    emails = []
    for _ in range(count):
        flags, email, data = oscar.unpack(
                                          (('flags','B'),
                                          ('email','lnts')),
                                          data, '<'
                                          )

        emails.append((flags, email))

    o.buddies[uid].emails = emails
Exemple #12
0
def icq_srv_07da_00f0(o, uid, result, data):
    count, data = oscar.unpack((('count','B'),), data, '<')

    interests = []
    for _ in range(count):
        interest, desc, data = oscar.unpack(
                                          (('interest','H'),
                                          ('desc','lnts')),
                                          data, '<'
                                          )

        interests.append((interest, desc))

    o.buddies[uid].interests = interests
Exemple #13
0
def x01_x10(o, sock, data):
    '''
    SNAC (x1, x10): 0x1, 0x10: You've been eviled!

    reference: U{http://iserverd.khstu.ru/oscar/snac_01_10.html}
    '''
    warn_level, data = oscar.unpack((('warn', 'H'),), data)

    user_infos = []
    while data:
        uinfo, data = oscar.unpack((('info', 'userinfo'),), data)
        user_infos.append(uinfo)

    return warn_level, user_infos
Exemple #14
0
def rcv_channel1_message(o, cookie, chan, userinfo, data):
    '''Returns the message from a channel 1 message block.

    The result can be a string or unicode object.'''
    msgtlvs, data = oscar.unpack((('msgtlvs','named_tlvs', -1, tlv_types),),
                                 data)
    assert not data
    assert 'message_data' in msgtlvs

    is_auto_response = 'auto' in msgtlvs
    is_offline = 'offline' in msgtlvs
    timestamp = msgtlvs.get('timestamp', None)

    message_fragments, data = oscar.unpack((('msg', 'message_block'),),
                                           msgtlvs.message_data)
    assert not data
    assert 1 in message_fragments

    required = map(ord, message_fragments.get(5, ''))

    if any(x in required for x in (2,6)) or required == [1]:
        # Also observed: [5,1] from eBuddy android client; is_html should be True.
        is_html = True
    else:
        is_html = False

    fmt = (('charset', 'H'),('subset', 'H'),)
    for msg in message_fragments[1]:
        charset, subset, msg = oscar.unpack(fmt, msg)

        # multipart SMS messages come in with message-NULL-mysterious_ascii_characters
        # so just grab everything up to null

        # (disabled b/c of #4677 -- ICQ messages get cut off)
        # msg = msg.split('\x00')[0]

        codec = {3   : 'locale',
                 2   : 'utf-16-be',
                 0   : 'utf-8',
                 0xd : 'utf-8'}.get(charset, 'utf-8')

        log.info('incoming channel1 message:')
        log.info('\tCharset=%d, subset=%d, codec=%s, is_html=%r, msg[:4]=%r', charset, subset, codec, is_html, msg[:4])
        log.info('\tRequired types for message fragments are: %r', required)
        log.info_s('\tdata=%r', msg)

        msg = util.auxencodings.fuzzydecode(msg, [codec, 'utf-8'])

        o.incoming_message(userinfo, msg, is_auto_response, offline=is_offline, timestamp=timestamp, html=is_html)
Exemple #15
0
def x07_x03(o, sock, data):
    '''
    SNAC (x7, x3): Requested account info

    reference: U{http://iserverd.khstu.ru/oscar/snac_07_03.html}
    '''
    fmt = (
           ('flags', 'H'),
           ('num_tlvs', 'H'),
           ('tlvs', 'tlv_dict', 'num_tlvs')
           )

    #TODO: this may not be correct, docs say 1 and 2 are both read
    read = 1
    write = 2

    flags, __, tlvs, data = oscar.unpack(fmt, data)

    assert not data

    can_read = flags & read
    can_write = flags & read

    if 8 in tlvs:
        subcode = struct.unpack('!H', tlvs[8])[0]
        errmsg = tlvs[4]

        raise oscar.SnacError(0x07, (subcode, errmsg), (subcode, subcodes.get(subcode, 'unknown')))

    return tlvs
Exemple #16
0
    def _set_capabilities(self, newval):
        if self is self.protocol.self_buddy:
            #
            # incoming family_x01_x0f packets were calling self_buddy.update and setting this
            # value to None, I think...clearing the list.
            #
            # TODO: can the server ever set our capabilities for us?
            #
            return

        caps = []
        while newval:
            caphi, caplo, newval = oscar.unpack((('caphi', 'Q'),
                                                 ('caplo', 'Q')),
                                                newval)
            caps.append(struct.pack('!QQ', caphi, caplo))


        if (self._capabilities) and (len(caps) == 1) and (caps[0] == oscar.capabilities.by_name['chat_service']):
            log.info('Received dummy capabilities for %r, not setting them', self.name)
            return

        self._capabilities = caps

        log.debug('%r\'s guessed client is %r. caps are: %r', self, self.guess_client(), self.pretty_caps)
Exemple #17
0
def request_buddy_list(o, sock, parent):
    me = (yield None)

    ssis = {}

    sock.send_snac(*oscar.snac.x13_x05(), req=True, cb=me.send)
    while True:
        ssis_, data = o.gen_incoming((yield 'waiting for x13, x06'))
        if not ssis_: break
        ssis.update(ssis_)

        # if there is data left, it must be last change time, signaling the end
        # of this packet
        if data:
            last_change, data = oscar.unpack((('last_change', 'I'),), data)
            # if last_change is not 0, then we have the whole list.
            if last_change: break
        assert not data
    o.ssimanager.ssis.update(ssis)
    try:
        grouped = sorted(funcs.groupby(ssis.values(), key = lambda s: s.type))

        log.info('SSI report:\nTotal ssis: %d\nBy type:\n%s',
                 len(ssis),'\n'.join('%r = %r items' % (id, len(items)) for (id, items) in grouped))
    except Exception, e:
        log.error("Error generating SSI report: %r", e)
Exemple #18
0
def x07_x09(o, sock, data):
    '''
    SNAC (x7, x9): Account delete ack

    reference: U{http://iserverd.khstu.ru/oscar/snac_07_09.html}
    '''
    if data:
        fmt = (('tlvs', 'tlv_dict'),)

        tlvs, data = oscar.unpack(fmt, data)
        assert not data

        subcode, tlvs[8] = oscar.unpack((('code', 'H'),),tlvs[8])
        errmsg = tlvs[4]

        raise oscar.SnacError((0x07, x07_name), (None, errmsg), (subcode, subcodes[subcode]))
Exemple #19
0
def x02_x06(o, sock, data):
    '''
    SNAC (x2, x6): Requested User information

    reference: U{http://iserverd.khstu.ru/oscar/snac_02_06.html}
    '''

    tlv_types = { 1:'prof_enc',
                  2:'profile',
                  3:'away_enc',
                  4:'away_msg',
                  5:'capabilities', }
    fmt = (('_1', 'userinfo'),
           ('_2', 'named_tlvs', -1, tlv_types))

    userinfo, tlvs, data = oscar.unpack(fmt, data)

    # Decode profile and away message.
    if 'profile' in tlvs:
        tlvs['profile'] = oscar.decode(tlvs['profile'], tlvs['prof_enc'])

    if 'away_msg' in tlvs and tlvs['away_msg']:
        tlvs['away_msg'] = oscar.decode(tlvs['away_msg'], tlvs['away_enc'])

    userinfo.update(tlvs)
    buddy = o.buddies[userinfo.name]
    log.debug('Got userinfo: %r', userinfo)
    buddy.update(userinfo)
Exemple #20
0
def _extract_address_info(data, tlv_names):
    fmt = (('tlvs', 'named_tlvs', -1, tlv_names),)
    tlvs, data = oscar.unpack(fmt, data)

    for k in tlvs:
        tlvs[k] = tlvs[k].decode('fuzzy utf-8') # this is supposed to be utf-8 but using fuzzy just in case
    return tlvs
Exemple #21
0
def x07_x03(o, sock, data):
    '''
    SNAC (x7, x3): Requested account info

    reference: U{http://iserverd.khstu.ru/oscar/snac_07_03.html}
    '''
    fmt = (('flags', 'H'), ('num_tlvs', 'H'), ('tlvs', 'tlv_dict', 'num_tlvs'))

    #TODO: this may not be correct, docs say 1 and 2 are both read
    read = 1
    write = 2

    flags, __, tlvs, data = oscar.unpack(fmt, data)

    assert not data

    can_read = flags & read
    can_write = flags & read

    if 8 in tlvs:
        subcode = struct.unpack('!H', tlvs[8])[0]
        errmsg = tlvs[4]

        raise oscar.SnacError(0x07, (subcode, errmsg),
                              (subcode, subcodes.get(subcode, 'unknown')))

    return tlvs
Exemple #22
0
def x15_x03(o, sock, data):
    '''
    SNAC (x15, x3): From Server

    reference: U{http://iserverd.khstu.ru/oscar/snac_15_03.html}
    '''
    tlv, data = oscar.util.s_tlv(data)
    assert not data
    data = tlv.v

    fmt = '''
          size    H
          uid     I
          reqtype H
          reqid   H
          '''.split()

    fmt = zip(fmt[::2],fmt[1::2])

    sz, uid, reqtype, reqid, data = oscar.unpack(fmt, data, '<')
    assert len(data) == (sz - 8)

    try:
        f = getattr(oscar.snac, 'icq_srv_%04x'%reqtype)
    except AttributeError:
        print 'received ICQ response: %d %04x reqid=%d / %s' % (uid, reqtype, reqid,util.to_hex(data))
        return

    uid = o.icq_req_cbs.get(reqid, (lambda: None, (), {}))
    f(o, uid, data)
Exemple #23
0
def x0d_x09(o, sock, data):
    '''
    SNAC (xd, x9): Chat navigation info

    reference: U{http://iserverd.khstu.ru/oscar/snac_0d_09.html}
    '''
    tlv_names = {
        0x01: 'redirect',
        0x02: 'max_concurrent',
        0x03: 'exchange',
        0x04: 'room',
    }

    fmt = (('tlvs', 'named_tlvs', -1, tlv_names), )
    tlvs, data = oscar.unpack(fmt, data)
    assert not data

    redirect = max_concurrent = exchange = room = None
    if 'redirect' in tlvs:
        redirect = x0d_x09_redirect(o, sock, tlvs.redirect)
    if 'max_concurrent' in tlvs:
        max_concurrent = x0d_x09_max_concurrent(o, sock, tlvs.max_concurrent)
    if 'exchange' in tlvs:
        exchange = x0d_x09_exchange(o, sock, tlvs.exchange)
    if 'room' in tlvs:
        room = x0d_x09_room(o, sock, tlvs.room)
    return redirect, max_concurrent, exchange, room
Exemple #24
0
def x01_x12(o, sock, data):
    '''
    SNAC (x1, x12): Server migration notice and information

    reference: U{http://iserverd.khstu.ru/oscar/snac_01_12.html}
    '''
    format = (('num_fams', 'H'),
              ('families', 'H', 'num_fams'),
              ('tlvs', 'tlv_dict'))

    __, families, tlvs, data = oscar.unpack(format, data)
    server_addr, cookie = tlvs[5], tlvs[6]

    assert not any(o.sockets[fam]
                   for fam in families
                   if fam in o.sockets and
                   isinstance(o.sockets[fam], oscar.SnacQueue))

    sock_ids = set(list(families) + [s_id for (s_id, s) in o.sockets.items() if s is sock])

    server = util.srv_str_to_tuple(server_addr, o.server[-1])
    bos, sock.bos = sock.bos, False # If our old socket was the BOS socket, it isn't anymore.

    if bos:
        sock_ids.add('bos')

    o.connect_socket(server, cookie, sock_ids, bos = bos)
Exemple #25
0
def x0d_x09(o, sock, data):
    '''
    SNAC (xd, x9): Chat navigation info

    reference: U{http://iserverd.khstu.ru/oscar/snac_0d_09.html}
    '''
    tlv_names = {
                 0x01:'redirect',
                 0x02:'max_concurrent',
                 0x03:'exchange',
                 0x04:'room',
                 }

    fmt = (('tlvs', 'named_tlvs', -1, tlv_names),)
    tlvs, data = oscar.unpack(fmt, data)
    assert not data

    redirect = max_concurrent = exchange = room = None
    if 'redirect' in tlvs:
        redirect = x0d_x09_redirect(o, sock, tlvs.redirect)
    if 'max_concurrent' in tlvs:
        max_concurrent = x0d_x09_max_concurrent(o, sock, tlvs.max_concurrent)
    if 'exchange' in tlvs:
        exchange = x0d_x09_exchange(o, sock, tlvs.exchange)
    if 'room' in tlvs:
        room = x0d_x09_room(o, sock, tlvs.room)
    return redirect, max_concurrent, exchange, room
Exemple #26
0
def request_buddy_list(o, sock, parent):
    me = (yield None)

    ssis = {}

    sock.send_snac(*oscar.snac.x13_x05(), req=True, cb=me.send)
    while True:
        ssis_, data = o.gen_incoming((yield 'waiting for x13, x06'))
        if not ssis_: break
        ssis.update(ssis_)

        # if there is data left, it must be last change time, signaling the end
        # of this packet
        if data:
            last_change, data = oscar.unpack((('last_change', 'I'), ), data)
            # if last_change is not 0, then we have the whole list.
            if last_change: break
        assert not data
    o.ssimanager.ssis.update(ssis)
    try:
        grouped = sorted(funcs.groupby(ssis.values(), key=lambda s: s.type))

        log.info(
            'SSI report:\nTotal ssis: %d\nBy type:\n%s', len(ssis),
            '\n'.join('%r = %r items' % (id, len(items))
                      for (id, items) in grouped))
    except Exception, e:
        log.error("Error generating SSI report: %r", e)
Exemple #27
0
def x0d_x09_room(o, sock, data):
    fmt = (('exchange', 'H'), ('cookie', 'pstring'), ('instance', 'H'),
           ('detail', 'B'), ('num_tlvs', 'H'), ('tlvs', 'named_tlvs',
                                                'num_tlvs', x0d_tlv_names))
    exchange, cookie, instance, detail, __, tlvs, data = oscar.unpack(
        fmt, data)
    assert not data
    return exchange, cookie, instance, detail, tlvs
Exemple #28
0
def x0d_x09_exchange(o, sock, data):
    fmt = (('id', 'H'), ('num_tlvs', 'H'), ('tlvs', 'named_tlvs', 'num_tlvs',
                                            x0d_tlv_names))

    id, __, tlvs, data = oscar.unpack(fmt, data)
    assert not data
    #TODO: something with this info
    return id, tlvs
Exemple #29
0
def x13_x03(o, sock, data):
    '''
    SNAC (x13, x3): SSI Limitations

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_03.html}
    '''
    tlvs, data = oscar.unpack((('tlvs', 'tlv_dict'), ), data)
    return tlvs[0x04]
Exemple #30
0
def x13_x03(o, sock, data):
    '''
    SNAC (x13, x3): SSI Limitations

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_03.html}
    '''
    tlvs, data = oscar.unpack((('tlvs','tlv_dict'),), data)
    return tlvs[0x04]
Exemple #31
0
def unpack_icq_reason_string(o, sock, data):
    name, __, reason, __, data = oscar.unpack((
        ("name", "pstring"),
        ("reason_len", "H"),
        ("reason", "s", "reason_len"),
        ("zero", "H"),
    ), data)
    return name, reason
Exemple #32
0
def x13_x12(o, sock, data):
    '''
    SNAC (x13, x12): Contact edit end

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_12.html}
    '''
    d, data = oscar.unpack((('ssis', 'ssi_dict'), ), data)
    o.ssimanager.ssis.update(d)
Exemple #33
0
def x13_x0a(o, sock, data):
    '''
    SNAC (x13, xa): SSI delete item

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_0a.html}
    '''
    d, data = oscar.unpack((('ssis', 'ssi_dict'), ), data)
    [o.ssimanager.ssis.pop(k) for k in d if k in o.ssimanager.ssis]
Exemple #34
0
def x13_x09(o, sock, data):
    '''
    SNAC (x13, x9): SSI modify item

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_09.html}
    '''
    ssis, data = oscar.unpack((('ssis', 'ssi_dict'), ), data)
    o.ssimanager.ssis.update(ssis, modify=True)
Exemple #35
0
def x13_x08(o, sock, data):
    '''
    SNAC (x13, x8): SSI add item

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_08.html}
    '''
    ssis, data = oscar.unpack((('ssis', 'ssi_dict'), ), data)
    o.ssimanager.ssis.update(ssis)
Exemple #36
0
def x13_x09(o, sock, data):
    '''
    SNAC (x13, x9): SSI modify item

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_09.html}
    '''
    ssis, data = oscar.unpack((('ssis', 'ssi_dict'),), data)
    o.ssimanager.ssis.update(ssis, modify=True)
Exemple #37
0
def x13_x08(o, sock, data):
    '''
    SNAC (x13, x8): SSI add item

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_08.html}
    '''
    ssis, data = oscar.unpack((('ssis', 'ssi_dict'),), data)
    o.ssimanager.ssis.update(ssis)
Exemple #38
0
def x07_x09(o, sock, data):
    '''
    SNAC (x7, x9): Account delete ack

    reference: U{http://iserverd.khstu.ru/oscar/snac_07_09.html}
    '''
    if data:
        fmt = (('tlvs', 'tlv_dict'), )

        tlvs, data = oscar.unpack(fmt, data)
        assert not data

        subcode, tlvs[8] = oscar.unpack((('code', 'H'), ), tlvs[8])
        errmsg = tlvs[4]

        raise oscar.SnacError((0x07, x07_name), (None, errmsg),
                              (subcode, subcodes[subcode]))
Exemple #39
0
def x13_x0a(o, sock, data):
    '''
    SNAC (x13, xa): SSI delete item

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_0a.html}
    '''
    d, data = oscar.unpack((('ssis', 'ssi_dict'),), data)
    [o.ssimanager.ssis.pop(k) for k in d if k in o.ssimanager.ssis]
Exemple #40
0
def x13_x12(o, sock, data):
    '''
    SNAC (x13, x12): Contact edit end

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_12.html}
    '''
    d, data = oscar.unpack((('ssis', 'ssi_dict'),), data)
    o.ssimanager.ssis.update(d)
Exemple #41
0
def x13_x1c(o, sock, data):
    '''
    SNAC (x13, x1c): "You were added" message

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_1c.html}
    '''
    name, data = oscar.unpack((("name", "pstring"),), data)
    assert not data
    log.info("You were added by", name)
Exemple #42
0
def x0d_x09_exchange(o, sock, data):
    fmt = (('id', 'H'),
           ('num_tlvs','H'),
           ('tlvs','named_tlvs', 'num_tlvs', x0d_tlv_names))

    id, __, tlvs, data = oscar.unpack(fmt, data)
    assert not data
    #TODO: something with this info
    return id, tlvs
Exemple #43
0
    def testSSI_clone1(self):
        testdata1 = pack("!H", 5) + "hello" + \
                    pack("!HH", 23, 0) + pack("!H", 0) + pack("!H", 8) + \
                    pack("!HH", 0xc8, 4) + pack("!H", 30) + pack("!H", 15)
        testSSI1 = oscar.unpack((('ssi','ssi'),),testdata1)[0]
        testSSI2 = testSSI1.clone()

        self.assertNotEquals(testSSI1, testSSI2)
        self.assertEquals(testSSI1.to_bytes(), testSSI2.to_bytes())
Exemple #44
0
def icq_srv_07da(o, uid, data):
    kind, result, data = oscar.unpack((('kind','H'),('result','B')), data, '<')
    try:
        f = getattr(oscar.snac, 'icq_srv_07da_%04x' % kind)
    except Exception:
        log.info('Unknown ICQ 07DA response: uid = %r, kind = %r, result = %r, data = %r',
                 uid, hex(kind), result, data.encode('hex'))
        return
    f(o, uid, result, data)
Exemple #45
0
def unpack_chat_invite(data):
    fmt = (('rendtlvs', 'named_tlvs', -1, rdv_tlvs),)
    rendtlvs, data = oscar.unpack(fmt, data)
    invite_msg = oscar.decode(rendtlvs.user_message, getattr(rendtlvs, 'encoding', 'ascii'))
    xdata = rendtlvs.extended_data

    cfmt = (('four', 'H'), ('cookie', 'pstring'))
    _four, chatcookie, _extra = oscar.util.apply_format(cfmt, xdata)
    return invite_msg, chatcookie
Exemple #46
0
def x03_x07(o, sock, data):
    '''
    SNAC (x3, x7): watcher list response

    reference: U{http://iserverd.khstu.ru/oscar/snac_03_07.html}
    '''
    rlist_fmt = (('rlist', 'list', 'pstring'),)
    rlist, data = oscar.unpack(rlist_fmt, data)
    assert not data
Exemple #47
0
def x13_x1c(o, sock, data):
    '''
    SNAC (x13, x1c): "You were added" message

    reference: U{http://iserverd.khstu.ru/oscar/snac_13_1c.html}
    '''
    name, data = oscar.unpack((("name", "pstring"), ), data)
    assert not data
    log.info("You were added by", name)
Exemple #48
0
def x03_x07(o, sock, data):
    '''
    SNAC (x3, x7): watcher list response

    reference: U{http://iserverd.khstu.ru/oscar/snac_03_07.html}
    '''
    rlist_fmt = (('rlist', 'list', 'pstring'), )
    rlist, data = oscar.unpack(rlist_fmt, data)
    assert not data
Exemple #49
0
def x01_x0a(o, sock, data):
    '''
    SNAC (x1, xa): Rate info change

    reference: U{http://iserverd.khstu.ru/oscar/snac_01_0a.html}
    '''
    rate_codes = {0x0001: 'Rate limits parameters changed',
                  0x0002: 'Rate limits warning (current level < alert level)',
                  0x0003: 'Rate limit hit (current level < limit level)',
                  0x0004: 'Rate limit clear (current level become > clear level)',}

    msg, data = oscar.unpack((('msg','H'),), data)
    log.warning(rate_codes.get(msg, 'Unknown rate message %r' % msg))
    
    rates, data = oscar.unpack((('rate_info', 'rate_class_list', -1),), data)
    sock.apply_rates(rates, {})


    assert not data, repr(data)