Support legacy app sessions
This commit is contained in:
parent
ab3a00f29a
commit
9f6ba21a53
@ -3,7 +3,9 @@ import React, { withGlobal } from './lib/teact/teactn';
|
|||||||
|
|
||||||
import { GlobalActions, GlobalState } from './global/types';
|
import { GlobalActions, GlobalState } from './global/types';
|
||||||
|
|
||||||
import { GRAMJS_SESSION_ID_KEY, INACTIVE_MARKER, PAGE_TITLE } from './config';
|
import {
|
||||||
|
GRAMJS_SESSION_ID_KEY, INACTIVE_MARKER, LEGACY_SESSION_KEY, PAGE_TITLE,
|
||||||
|
} from './config';
|
||||||
import { pick } from './util/iteratees';
|
import { pick } from './util/iteratees';
|
||||||
import { updateSizes } from './util/windowSize';
|
import { updateSizes } from './util/windowSize';
|
||||||
import { addActiveTabChangeListener } from './util/activeTabMonitor';
|
import { addActiveTabChangeListener } from './util/activeTabMonitor';
|
||||||
@ -53,7 +55,10 @@ const App: FC<StateProps & DispatchProps> = ({ authState, disconnect }) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return localStorage.getItem(GRAMJS_SESSION_ID_KEY) ? renderMain() : <Auth />;
|
const hasSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);
|
||||||
|
const hasLegacySession = localStorage.getItem(LEGACY_SESSION_KEY);
|
||||||
|
|
||||||
|
return (hasSession || hasLegacySession) ? renderMain() : <Auth />;
|
||||||
};
|
};
|
||||||
|
|
||||||
function renderMain() {
|
function renderMain() {
|
||||||
|
|||||||
@ -27,7 +27,7 @@ let onUpdate: OnApiUpdate;
|
|||||||
let client: TelegramClient;
|
let client: TelegramClient;
|
||||||
let isConnected = false;
|
let isConnected = false;
|
||||||
|
|
||||||
export async function init(sessionId: string, _onUpdate: OnApiUpdate) {
|
export async function init(sessionInfo: string, _onUpdate: OnApiUpdate) {
|
||||||
onUpdate = _onUpdate;
|
onUpdate = _onUpdate;
|
||||||
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
@ -36,8 +36,8 @@ export async function init(sessionId: string, _onUpdate: OnApiUpdate) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const session = IS_TEST
|
const session = IS_TEST
|
||||||
? new sessions.LocalStorageSession(sessionId)
|
? new sessions.LocalStorageSession(sessionInfo)
|
||||||
: new sessions.IdbSession(sessionId);
|
: new sessions.IdbSession(sessionInfo);
|
||||||
|
|
||||||
client = new TelegramClient(
|
client = new TelegramClient(
|
||||||
session,
|
session,
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import * as methods from './methods';
|
|||||||
|
|
||||||
let onUpdate: OnApiUpdate;
|
let onUpdate: OnApiUpdate;
|
||||||
|
|
||||||
export async function initApi(_onUpdate: OnApiUpdate, sessionId = '') {
|
export async function initApi(_onUpdate: OnApiUpdate, sessionInfo = '') {
|
||||||
onUpdate = _onUpdate;
|
onUpdate = _onUpdate;
|
||||||
|
|
||||||
initUpdater(handleUpdate);
|
initUpdater(handleUpdate);
|
||||||
@ -28,7 +28,7 @@ export async function initApi(_onUpdate: OnApiUpdate, sessionId = '') {
|
|||||||
initManagement(handleUpdate);
|
initManagement(handleUpdate);
|
||||||
initTwoFaSettings(handleUpdate);
|
initTwoFaSettings(handleUpdate);
|
||||||
|
|
||||||
await initClient(sessionId, handleUpdate);
|
await initClient(sessionInfo, handleUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function callApi<T extends keyof Methods>(fnName: T, ...args: MethodArgs<T>): MethodResponse<T> {
|
export function callApi<T extends keyof Methods>(fnName: T, ...args: MethodArgs<T>): MethodResponse<T> {
|
||||||
|
|||||||
@ -20,7 +20,7 @@ const requestStatesByCallback = new Map<AnyToVoidFunction, RequestStates>();
|
|||||||
|
|
||||||
// TODO Re-use `util/WorkerConnector.ts`
|
// TODO Re-use `util/WorkerConnector.ts`
|
||||||
|
|
||||||
export function initApi(onUpdate: OnApiUpdate, sessionId = '') {
|
export function initApi(onUpdate: OnApiUpdate, sessionInfo = '') {
|
||||||
if (!worker) {
|
if (!worker) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
@ -33,7 +33,7 @@ export function initApi(onUpdate: OnApiUpdate, sessionId = '') {
|
|||||||
|
|
||||||
return makeRequest({
|
return makeRequest({
|
||||||
type: 'initApi',
|
type: 'initApi',
|
||||||
args: [sessionId],
|
args: [sessionInfo],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,6 +15,7 @@ export const DEBUG_ALERT_MSG = 'Shoot!\nSomething went wrong, please see the err
|
|||||||
export const DEBUG_GRAMJS = false;
|
export const DEBUG_GRAMJS = false;
|
||||||
|
|
||||||
export const GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';
|
export const GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId';
|
||||||
|
export const LEGACY_SESSION_KEY = 'dc';
|
||||||
|
|
||||||
export const GLOBAL_STATE_CACHE_DISABLED = false;
|
export const GLOBAL_STATE_CACHE_DISABLED = false;
|
||||||
export const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';
|
export const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';
|
||||||
|
|||||||
@ -3,12 +3,19 @@ const AuthKey = require('../crypto/AuthKey');
|
|||||||
const utils = require('../Utils');
|
const utils = require('../Utils');
|
||||||
|
|
||||||
const STORAGE_KEY_BASE = 'GramJs-session-';
|
const STORAGE_KEY_BASE = 'GramJs-session-';
|
||||||
|
const SESSION_DATA_PREFIX = 'session:';
|
||||||
|
|
||||||
class StorageSession extends MemorySession {
|
class StorageSession extends MemorySession {
|
||||||
constructor(sessionId) {
|
constructor(sessionInfo) {
|
||||||
super();
|
super();
|
||||||
this._storageKey = sessionId;
|
|
||||||
this._authKeys = {};
|
this._authKeys = {};
|
||||||
|
|
||||||
|
if (sessionInfo && sessionInfo.startsWith(SESSION_DATA_PREFIX)) {
|
||||||
|
void this._initFromSessionData(sessionInfo);
|
||||||
|
} else if (sessionInfo) {
|
||||||
|
this._storageKey = sessionInfo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get authKey() {
|
get authKey() {
|
||||||
@ -87,6 +94,19 @@ class StorageSession extends MemorySession {
|
|||||||
void this._updateStorage();
|
void this._updateStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async _initFromSessionData(sessionData) {
|
||||||
|
const [, mainDcIdStr, mainDcKey] = sessionData.split(':');
|
||||||
|
const mainDcId = Number(mainDcIdStr);
|
||||||
|
const {
|
||||||
|
ipAddress,
|
||||||
|
port,
|
||||||
|
} = utils.getDC(mainDcId);
|
||||||
|
this.setDC(mainDcId, ipAddress, port);
|
||||||
|
const authKey = new AuthKey();
|
||||||
|
await authKey.setKey(Buffer.from(mainDcKey, 'hex'), true);
|
||||||
|
this.setAuthKey(authKey, mainDcId);
|
||||||
|
}
|
||||||
|
|
||||||
async _updateStorage() {
|
async _updateStorage() {
|
||||||
if (!this._storageKey) {
|
if (!this._storageKey) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import {
|
|||||||
MEDIA_CACHE_NAME,
|
MEDIA_CACHE_NAME,
|
||||||
MEDIA_CACHE_NAME_AVATARS,
|
MEDIA_CACHE_NAME_AVATARS,
|
||||||
MEDIA_PROGRESSIVE_CACHE_NAME,
|
MEDIA_PROGRESSIVE_CACHE_NAME,
|
||||||
|
LEGACY_SESSION_KEY,
|
||||||
} from '../../../config';
|
} from '../../../config';
|
||||||
import { initApi, callApi } from '../../../api/gramjs';
|
import { initApi, callApi } from '../../../api/gramjs';
|
||||||
import { unsubscribe } from '../../../util/notifications';
|
import { unsubscribe } from '../../../util/notifications';
|
||||||
@ -18,9 +19,18 @@ import * as cacheApi from '../../../util/cacheApi';
|
|||||||
import { updateAppBadge } from '../../../util/appBadge';
|
import { updateAppBadge } from '../../../util/appBadge';
|
||||||
|
|
||||||
addReducer('initApi', (global: GlobalState, actions) => {
|
addReducer('initApi', (global: GlobalState, actions) => {
|
||||||
const sessionId = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined;
|
let sessionInfo = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined;
|
||||||
|
|
||||||
void initApi(actions.apiUpdate, sessionId);
|
if (!sessionInfo) {
|
||||||
|
const legacySessionMainDc = localStorage.getItem(LEGACY_SESSION_KEY);
|
||||||
|
const legacySessionMainDcKey = localStorage.getItem(`dc${legacySessionMainDc}_auth_key`);
|
||||||
|
|
||||||
|
if (legacySessionMainDc && legacySessionMainDcKey) {
|
||||||
|
sessionInfo = `session:${legacySessionMainDc}:${legacySessionMainDcKey}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initApi(actions.apiUpdate, sessionInfo);
|
||||||
});
|
});
|
||||||
|
|
||||||
addReducer('setAuthPhoneNumber', (global, actions, payload) => {
|
addReducer('setAuthPhoneNumber', (global, actions, payload) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user