From b4716f321b4ac45ba871ab2de7f5874c26de5e5c Mon Sep 17 00:00:00 2001 From: teidesu Date: Wed, 16 Jun 2021 18:21:54 +0300 Subject: [PATCH] tests(core): added fuzz tests for auth_key --- packages/core/tests/fuzz/fuzz-session.spec.ts | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 packages/core/tests/fuzz/fuzz-session.spec.ts diff --git a/packages/core/tests/fuzz/fuzz-session.spec.ts b/packages/core/tests/fuzz/fuzz-session.spec.ts new file mode 100644 index 00000000..4c32ab4a --- /dev/null +++ b/packages/core/tests/fuzz/fuzz-session.spec.ts @@ -0,0 +1,151 @@ +import { describe, it } from 'mocha' +import { expect } from 'chai' +import { BaseTelegramClient, defaultDcs, randomBytes } from '../../src' +import { sleep } from '../../src/utils/misc-utils' +import { UserMigrateError } from '@mtcute/tl/errors' + +require('dotenv-flow').config() + +describe('fuzz : session', async function () { + if (!process.env.API_ID || !process.env.API_HASH) { + console.warn( + 'Warning: skipping fuzz session tests (no API_ID or API_HASH)' + ) + return + } + + this.timeout(45000) + + it('random auth_key', async () => { + const client = new BaseTelegramClient({ + apiId: process.env.API_ID!, + apiHash: process.env.API_HASH!, + primaryDc: defaultDcs.defaultTestDc, + }) + + // random key + const initKey = randomBytes(256) + await client.storage.setAuthKeyFor(2, initKey) + + // client is supposed to handle this and generate a new key + + + const errors: Error[] = [] + + const errorHandler = (err: Error) => { + errors.push(err) + } + + client.onError(errorHandler) + + await client.connect() + + await sleep(10000) + + await client.close() + + expect(errors.length).eq(0) + + expect((await client.storage.getAuthKeyFor(2))!.toString('hex')).not.eq( + initKey.toString('hex') + ) + }) + + it('random auth_key for other dc', async () => { + const client = new BaseTelegramClient({ + apiId: process.env.API_ID!, + apiHash: process.env.API_HASH!, + primaryDc: defaultDcs.defaultTestDc, + }) + + // random key for dc1 + const initKey = randomBytes(256) + await client.storage.setAuthKeyFor(1, initKey) + + // client is supposed to handle this and generate a new key + + const errors: Error[] = [] + + const errorHandler = (err: Error) => { + errors.push(err) + } + + client.onError(errorHandler) + + await client.connect() + await client.waitUntilUsable() + + const conn = await client.createAdditionalConnection(1) + await conn.sendForResult({ _: 'help.getConfig' }) + + await sleep(10000) + + await client.close() + + expect(errors.length).eq(0) + + expect((await client.storage.getAuthKeyFor(1))!.toString('hex')).not.eq( + initKey.toString('hex') + ) + }) + + if (!process.env.USER_SESSION) { + console.warn('Warning: skipping fuzz session test with auth (no USER_SESSION)') + return + } + + it('random auth_key for other dc with auth', async () => { + const client = new BaseTelegramClient({ + apiId: process.env.API_ID!, + apiHash: process.env.API_HASH!, + primaryDc: defaultDcs.defaultTestDc, + }) + + client.importSession(process.env.USER_SESSION!) + + // random key for dc1 + const initKey = randomBytes(256) + await client.storage.setAuthKeyFor(1, initKey) + + // client is supposed to handle this and generate a new key, + // and then export auth there + + const errors: Error[] = [] + + const errorHandler = (err: Error) => { + errors.push(err) + } + + client.onError(errorHandler) + + await client.connect() + await client.waitUntilUsable() + + const conn = await client.createAdditionalConnection(1) + + let hadError = false + try { + await client.call({ + _: 'users.getUsers', + id: [ + { + _: 'inputUserSelf' + } + ] + }, { connection: conn }) + } catch (e) { + if (e instanceof UserMigrateError) { + hadError = true + } + } + + await client.close() + + expect(errors.length).eq(0) + + expect((await client.storage.getAuthKeyFor(1))!.toString('hex')).not.eq( + initKey.toString('hex') + ) + expect(hadError).true + }) +})