chore(core)!: dropped pre-v3 string sessions
This commit is contained in:
parent
b13d23326a
commit
cc4cf35611
2 changed files with 11 additions and 172 deletions
|
@ -5,28 +5,6 @@ import { defaultProductionDc } from '../../utils/dcs.js'
|
||||||
import { readStringSession, writeStringSession } from './string-session.js'
|
import { readStringSession, writeStringSession } from './string-session.js'
|
||||||
|
|
||||||
const stubAuthKey = new Uint8Array(32)
|
const stubAuthKey = new Uint8Array(32)
|
||||||
const stubDcs = {
|
|
||||||
main: {
|
|
||||||
...defaultProductionDc.main,
|
|
||||||
ipv6: false,
|
|
||||||
mediaOnly: false,
|
|
||||||
},
|
|
||||||
media: {
|
|
||||||
...defaultProductionDc.media,
|
|
||||||
ipv6: false,
|
|
||||||
mediaOnly: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
const stubDcsTest = {
|
|
||||||
main: {
|
|
||||||
...stubDcs.main,
|
|
||||||
testMode: true,
|
|
||||||
},
|
|
||||||
media: {
|
|
||||||
...stubDcs.media,
|
|
||||||
testMode: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
const stubDcsBasic = {
|
const stubDcsBasic = {
|
||||||
main: {
|
main: {
|
||||||
id: 2,
|
id: 2,
|
||||||
|
@ -55,10 +33,6 @@ const stubDcsBasicTest = {
|
||||||
testMode: true,
|
testMode: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
const stubDcsSameMedia = {
|
|
||||||
main: stubDcs.main,
|
|
||||||
media: stubDcs.main,
|
|
||||||
}
|
|
||||||
const stubDcsBasicSameMedia = {
|
const stubDcsBasicSameMedia = {
|
||||||
main: stubDcsBasic.main,
|
main: stubDcsBasic.main,
|
||||||
media: stubDcsBasic.main,
|
media: stubDcsBasic.main,
|
||||||
|
@ -189,89 +163,4 @@ describe('readStringSession', () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('v2', () => {
|
|
||||||
it('should read production string session without user', () => {
|
|
||||||
expect(
|
|
||||||
readStringSession(
|
|
||||||
'AgQAAAANobcYAAAAAAIAAAAOMTQ5LjE1NC4xNjcuNTAAuwEAAA2htxgCAAAAAgAAAA8xNDkuMTU0LjE2Ny4yMjK7AQAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
||||||
),
|
|
||||||
).toEqual({
|
|
||||||
version: 2,
|
|
||||||
primaryDcs: stubDcs,
|
|
||||||
authKey: stubAuthKey,
|
|
||||||
self: null,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should read production string session without user with same dc for media', () => {
|
|
||||||
expect(
|
|
||||||
readStringSession(
|
|
||||||
'AgAAAAANobcYAAAAAAIAAAAOMTQ5LjE1NC4xNjcuNTAAuwEAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
||||||
),
|
|
||||||
).toEqual({
|
|
||||||
version: 2,
|
|
||||||
primaryDcs: stubDcsSameMedia,
|
|
||||||
authKey: stubAuthKey,
|
|
||||||
self: null,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should read production string session with user', () => {
|
|
||||||
expect(
|
|
||||||
readStringSession(
|
|
||||||
'AgUAAAANobcYAAAAAAIAAAAOMTQ5LjE1NC4xNjcuNTAAuwEAAA2htxgCAAAAAgAAAA8xNDkuMTU0LjE2Ny4yMjK7AQAAOTAAAAAAAAA3l3m8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
||||||
),
|
|
||||||
).toEqual({
|
|
||||||
version: 2,
|
|
||||||
primaryDcs: stubDcs,
|
|
||||||
authKey: stubAuthKey,
|
|
||||||
self: {
|
|
||||||
userId: 12345,
|
|
||||||
isBot: false,
|
|
||||||
isPremium: false,
|
|
||||||
usernames: [],
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should read test dc string session with user', () => {
|
|
||||||
expect(
|
|
||||||
readStringSession(
|
|
||||||
'AgcAAAANobcYAAAAAAIAAAAOMTQ5LjE1NC4xNjcuNTAAuwEAAA2htxgCAAAAAgAAAA8xNDkuMTU0LjE2Ny4yMjK7AQAAOTAAAAAAAAA3l3m8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
||||||
),
|
|
||||||
).toEqual({
|
|
||||||
version: 2,
|
|
||||||
primaryDcs: stubDcsTest,
|
|
||||||
authKey: stubAuthKey,
|
|
||||||
self: {
|
|
||||||
userId: 12345,
|
|
||||||
isBot: false,
|
|
||||||
isPremium: false,
|
|
||||||
usernames: [],
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('v1', () => {
|
|
||||||
it('should read string session with user', () => {
|
|
||||||
expect(
|
|
||||||
readStringSession(
|
|
||||||
'AQEAAAANobcYAAAAAAIAAAAOMTQ5LjE1NC4xNjcuNTAAuwEAADkwAAAAAAAAN5d5vCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
||||||
),
|
|
||||||
).toEqual({
|
|
||||||
version: 1,
|
|
||||||
// v1 didn't have separate media dc
|
|
||||||
primaryDcs: stubDcsSameMedia,
|
|
||||||
authKey: stubAuthKey,
|
|
||||||
self: {
|
|
||||||
userId: 12345,
|
|
||||||
isBot: false,
|
|
||||||
isPremium: false,
|
|
||||||
usernames: [],
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import type { BasicDcOption, DcOptions } from '../../utils/dcs.js'
|
import type { DcOptions } from '../../utils/dcs.js'
|
||||||
import type { CurrentUserInfo } from '../storage/service/current-user.js'
|
import type { CurrentUserInfo } from '../storage/service/current-user.js'
|
||||||
|
|
||||||
import { base64 } from '@fuman/utils'
|
import { base64 } from '@fuman/utils'
|
||||||
|
@ -20,31 +20,6 @@ export interface StringSessionData {
|
||||||
authKey: Uint8Array
|
authKey: Uint8Array
|
||||||
}
|
}
|
||||||
|
|
||||||
function readTlDcOption(reader: TlBinaryReader): BasicDcOption {
|
|
||||||
const ctorId = reader.uint()
|
|
||||||
|
|
||||||
if (ctorId !== 414687501) {
|
|
||||||
throw new MtArgumentError(`Invalid dcOption constructor id: ${ctorId}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const flags = reader.uint()
|
|
||||||
const id = reader.int()
|
|
||||||
const ipAddress = reader.string()
|
|
||||||
const port = reader.int()
|
|
||||||
|
|
||||||
if (flags & 1024) {
|
|
||||||
reader.bytes() // skip secret
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
id,
|
|
||||||
ipAddress,
|
|
||||||
port,
|
|
||||||
ipv6: Boolean(flags & 1),
|
|
||||||
mediaOnly: Boolean(flags & 2),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function writeStringSession(data: StringSessionData): string {
|
export function writeStringSession(data: StringSessionData): string {
|
||||||
const writer = TlBinaryWriter.manual(512)
|
const writer = TlBinaryWriter.manual(512)
|
||||||
|
|
||||||
|
@ -63,14 +38,14 @@ export function writeStringSession(data: StringSessionData): string {
|
||||||
writer.uint8View[0] = version
|
writer.uint8View[0] = version
|
||||||
writer.pos += 1
|
writer.pos += 1
|
||||||
|
|
||||||
if (version >= 2 && data.primaryDcs.media !== data.primaryDcs.main) {
|
if (data.primaryDcs.media !== data.primaryDcs.main) {
|
||||||
flags |= 4
|
flags |= 4
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.int(flags)
|
writer.int(flags)
|
||||||
writer.bytes(serializeBasicDcOption(data.primaryDcs.main))
|
writer.bytes(serializeBasicDcOption(data.primaryDcs.main))
|
||||||
|
|
||||||
if (version >= 2 && data.primaryDcs.media !== data.primaryDcs.main) {
|
if (data.primaryDcs.media !== data.primaryDcs.main) {
|
||||||
writer.bytes(serializeBasicDcOption(data.primaryDcs.media))
|
writer.bytes(serializeBasicDcOption(data.primaryDcs.media))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,19 +73,10 @@ export function readStringSession(data: string | InputStringSessionData): String
|
||||||
|
|
||||||
const version = buf[0]
|
const version = buf[0]
|
||||||
|
|
||||||
if (version !== 1 && version !== 2 && version !== 3) {
|
if (version !== 3) {
|
||||||
throw new Error(`Invalid session string (version = ${version})`)
|
throw new Error(`Invalid session string (version = ${version})`)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version < 3) {
|
|
||||||
console.warn(
|
|
||||||
`You are using a deprecated session string (${data.slice(
|
|
||||||
0,
|
|
||||||
10,
|
|
||||||
)}...). Please update your session string, as it will stop working in the future.`,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const reader = TlBinaryReader.manual(buf, 1)
|
const reader = TlBinaryReader.manual(buf, 1)
|
||||||
|
|
||||||
const flags = reader.int()
|
const flags = reader.int()
|
||||||
|
@ -118,32 +84,16 @@ export function readStringSession(data: string | InputStringSessionData): String
|
||||||
const testModeOld = Boolean(flags & 2)
|
const testModeOld = Boolean(flags & 2)
|
||||||
const hasMedia = version >= 2 && Boolean(flags & 4)
|
const hasMedia = version >= 2 && Boolean(flags & 4)
|
||||||
|
|
||||||
let primaryDc: BasicDcOption
|
const primaryDc = parseBasicDcOption(reader.bytes())
|
||||||
let primaryMediaDc: BasicDcOption
|
|
||||||
|
|
||||||
if (version <= 2) {
|
if (primaryDc === null) {
|
||||||
const primaryDc_ = readTlDcOption(reader)
|
throw new MtArgumentError('Invalid session string (failed to parse primaryDc)')
|
||||||
const primaryMediaDc_ = hasMedia ? readTlDcOption(reader) : primaryDc_
|
}
|
||||||
|
|
||||||
primaryDc = primaryDc_
|
const primaryMediaDc = hasMedia ? parseBasicDcOption(reader.bytes()) : primaryDc
|
||||||
primaryMediaDc = primaryMediaDc_
|
|
||||||
} else if (version === 3) {
|
|
||||||
const primaryDc_ = parseBasicDcOption(reader.bytes())
|
|
||||||
|
|
||||||
if (primaryDc_ === null) {
|
if (primaryMediaDc === null) {
|
||||||
throw new MtArgumentError('Invalid session string (failed to parse primaryDc)')
|
throw new MtArgumentError('Invalid session string (failed to parse primaryMediaDc)')
|
||||||
}
|
|
||||||
|
|
||||||
const primaryMediaDc_ = hasMedia ? parseBasicDcOption(reader.bytes()) : primaryDc_
|
|
||||||
|
|
||||||
if (primaryMediaDc_ === null) {
|
|
||||||
throw new MtArgumentError('Invalid session string (failed to parse primaryMediaDc)')
|
|
||||||
}
|
|
||||||
|
|
||||||
primaryDc = primaryDc_
|
|
||||||
primaryMediaDc = primaryMediaDc_
|
|
||||||
} else {
|
|
||||||
throw new Error('unreachable')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (testModeOld) {
|
if (testModeOld) {
|
||||||
|
|
Loading…
Reference in a new issue