예제 #1
0
async def handle_login(p, credentials: WorldCredentials):
    tr = p.server.redis.multi_exec()
    tr.get(f'{credentials.username}.lkey')
    tr.get(f'{credentials.username}.ckey')
    tr.delete(f'{credentials.username}.lkey', f'{credentials.username}.ckey')
    login_key, confirmation_hash, _ = await tr.execute()

    if login_key is None or confirmation_hash is None:
        return await p.close()

    login_key = login_key.decode()
    login_hash = Crypto.encrypt_password(
        login_key + config.client['AuthStaticKey']) + login_key

    if credentials.client_key != login_hash:
        return await p.close()

    if login_key != credentials.login_key or confirmation_hash.decode(
    ) != credentials.confirmation_hash:
        return await p.close()

    data = await Penguin.get(credentials.id)

    p.login_key = login_key
    await world_login(p, data)
예제 #2
0
async def handle_login(p, credentials: WorldCredentials):
    async with p.server.redis.pipeline(transaction=True) as tr:
        tr.get(f'{credentials.username}.lkey')
        tr.get(f'{credentials.username}.ckey')
        tr.delete(f'{credentials.username}.lkey',
                  f'{credentials.username}.ckey')
        login_key, confirmation_hash, _ = await tr.execute()

    if login_key is None or confirmation_hash is None:
        return await p.close()

    login_key = login_key.decode()
    login_hash = Crypto.encrypt_password(login_key +
                                         p.server.config.auth_key) + login_key

    if credentials.client_key != login_hash:
        return await p.close()

    if login_key != credentials.login_key or confirmation_hash.decode(
    ) != credentials.confirmation_hash:
        return await p.close()

    data = await Penguin.get(credentials.id)

    p.login_key = login_key
    await world_login(p, data)
예제 #3
0
async def handle_login(p, credentials: WorldCredentials):
    if len(p.server.penguins_by_id) >= p.server.server_config['Capacity']:
        return await p.send_error_and_disconnect(103)

    tr = p.server.redis.multi_exec()
    tr.get('{}.lkey'.format(credentials.username))
    tr.get('{}.ckey'.format(credentials.username))
    tr.delete('{}.lkey'.format(credentials.username),
              '{}.ckey'.format(credentials.username))
    login_key, confirmation_hash, _ = await tr.execute()

    if login_key is None or confirmation_hash is None:
        return await p.close()

    login_key = login_key.decode()
    login_hash = Crypto.encrypt_password(
        login_key + config.client['AuthStaticKey']) + login_key

    if credentials.client_key != login_hash:
        return await p.close()

    if login_key != credentials.login_key or confirmation_hash.decode(
    ) != credentials.confirmation_hash:
        return await p.close()

    data = await Penguin.get(credentials.id)

    if data is None:
        return await p.send_error_and_disconnect(100)

    if not data.active:
        return await p.close()

    if data.permaban:
        return await p.close()

    active_ban = await Ban.query.where((Ban.penguin_id == data.id) & (
        Ban.expires >= datetime.now())).gino.scalar()
    if active_ban is not None:
        return await p.close()

    if data.id in p.server.penguins_by_id:
        await p.server.penguins_by_id[data.id].close()

    p.logger.info('{} logged in successfully'.format(data.username))

    p.data = data
    p.login_key = login_key
    await p.send_xt('l')
예제 #4
0
async def handle_legacy_login(p, credentials: Credentials):
    tr = p.server.redis.multi_exec()
    tr.get(f'{credentials.username}.lkey')
    tr.delete(f'{credentials.username}.lkey', '{credentials.username}.ckey')
    login_key, _ = await tr.execute()

    login_key = login_key.decode()
    login_hash = Crypto.encrypt_password(
        login_key + config.client['AuthStaticKey']) + login_key

    if login_key is None or login_hash != credentials.password:
        return await p.close()

    data = await Penguin.query.where(Penguin.username == credentials.username
                                     ).gino.first()

    p.login_key = login_key
    await world_login(p, data)
예제 #5
0
async def handle_legacy_login(p, credentials: Credentials):
    async with p.server.redis.pipeline(transaction=True) as tr:
        tr.get(f'{credentials.username}.lkey')
        tr.delete(f'{credentials.username}.lkey',
                  f'{credentials.username}.ckey')
        login_key, _ = await tr.execute()

    try:
        login_key = login_key.decode()
    except AttributeError:
        return await p.close()

    login_hash = Crypto.encrypt_password(login_key +
                                         p.server.config.auth_key) + login_key

    if login_key is None or login_hash != credentials.password:
        return await p.close()

    data = await Penguin.query.where(Penguin.username == credentials.username
                                     ).gino.first()

    p.login_key = login_key
    await world_login(p, data)