Esempio n. 1
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)
Esempio n. 2
0
    def _parse_addr(self, type_addr):
        try:
            type, addr = type_addr
        except (ValueError, TypeError):
            raise TypeError('%r.connect argument must be <type \'tuple\'> (type, addr) not %r (%r)', type(self).__name__, type(type_addr), type_addr)

        bad_addr = False
        port = None
        if len(addr) == 1:
            host, port = addr[0], 80
        elif isinstance(addr, basestring):
            host, port = util.srv_str_to_tuple(addr, 80)
        elif len(addr) == 2:
            host, port = addr
        else:
            bad_addr = True

        try:
            port = int(port)
        except ValueError:
            bad_addr = True

        if bad_addr:
            raise TypeError('%r.connect argument\'s second element must be either string ("srv" or "srv:port") or tuple (("srv", port) or ("srv",)).'\
                            "Got %r instead" % addr)

        return type, host
Esempio n. 3
0
    def recv_rng(self, msg):
        if msg.trid:
            msg.args = [msg.trid,] + msg.args
            msg.trid = 0

        session, server, auth_type, cookie, name, nick = msg.args[:6]
        server = srv_str_to_tuple(server, 1863)

        # The SB servers are mangling the encoding of names, so ignore it. If they ever fix themselves,
        # uncomment the two lines below.
        #nick = nick.decode('url').decode('fuzzy utf8')
        #self.event('contact_alias', name, nick)

        self.switchboard_invite(name, session, server, auth_type, cookie)
Esempio n. 4
0
    def recv_xfr(self, msg):
        type_, new_addr = msg.args[:2]

        server = util.srv_str_to_tuple(new_addr, 1863)

        if type_ == 'NS':
            log.info('Switching NS servers to %r', server)
            self.close_transport(self.socket, switching = True)
            self._server = server
            self.connect()
        else:
            assert type_ == 'SB', msg
            cookie = msg.args[3]

            self.switchboard_request(server, cookie)

        if self.versions and self.versions[0] == 'MSNP21':
            try:
                self._xfrcount = int(email.message_from_string(msg.args[-1].decode('base64')).get('XfrCount'))
            except Exception:
                pass
Esempio n. 5
0
    def recv_xfr(self, msg):
        type_, new_addr = msg.args[:2]

        server = util.srv_str_to_tuple(new_addr, 1863)

        if type_ == 'NS':
            log.info('Switching NS servers to %r', server)
            self.close_transport(self.socket, switching=True)
            self._server = server
            self.connect()
        else:
            assert type_ == 'SB', msg
            cookie = msg.args[3]

            self.switchboard_request(server, cookie)

        if self.versions and self.versions[0] == 'MSNP21':
            try:
                self._xfrcount = int(
                    email.message_from_string(
                        msg.args[-1].decode('base64')).get('XfrCount'))
            except Exception:
                pass