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))
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]))
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
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)
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)
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]))
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)
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") '''
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
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") '''
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
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
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
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)
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
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)
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)
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]))
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)
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
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
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)
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
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)
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
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)
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
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
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]
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]
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
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)
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]
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)
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)
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)
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)
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]))
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]
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)
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)
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
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())
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)
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
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
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)
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
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)