Validate state with unique id
This commit is contained in:
parent
a49439a522
commit
ef0ec1c6dc
@ -22,6 +22,7 @@ import { Chat } from '../../layer';
|
|||||||
import { isMobile } from '../../helpers/userAgent';
|
import { isMobile } from '../../helpers/userAgent';
|
||||||
import DATABASE_STATE from '../../config/databases/state';
|
import DATABASE_STATE from '../../config/databases/state';
|
||||||
import sessionStorage from '../sessionStorage';
|
import sessionStorage from '../sessionStorage';
|
||||||
|
import { nextRandomInt } from '../../helpers/random';
|
||||||
|
|
||||||
const REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day
|
const REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day
|
||||||
//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days
|
//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days
|
||||||
@ -89,7 +90,8 @@ export type State = {
|
|||||||
nightTheme?: boolean, // ! DEPRECATED
|
nightTheme?: boolean, // ! DEPRECATED
|
||||||
},
|
},
|
||||||
keepSigned: boolean,
|
keepSigned: boolean,
|
||||||
chatContextMenuHintWasShown: boolean
|
chatContextMenuHintWasShown: boolean,
|
||||||
|
stateId: number
|
||||||
};
|
};
|
||||||
|
|
||||||
export const STATE_INIT: State = {
|
export const STATE_INIT: State = {
|
||||||
@ -153,7 +155,8 @@ export const STATE_INIT: State = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
keepSigned: true,
|
keepSigned: true,
|
||||||
chatContextMenuHintWasShown: false
|
chatContextMenuHintWasShown: false,
|
||||||
|
stateId: nextRandomInt(0xFFFFFFFF)
|
||||||
};
|
};
|
||||||
|
|
||||||
const ALL_KEYS = Object.keys(STATE_INIT) as any as Array<keyof State>;
|
const ALL_KEYS = Object.keys(STATE_INIT) as any as Array<keyof State>;
|
||||||
@ -203,9 +206,9 @@ export class AppStateManager extends EventListenerBase<{
|
|||||||
const storagesKeys = Object.keys(this.storages) as Array<keyof AppStateManager['storages']>;
|
const storagesKeys = Object.keys(this.storages) as Array<keyof AppStateManager['storages']>;
|
||||||
const storagesPromises: Promise<any>[] = storagesKeys.map(key => this.storages[key].getAll());
|
const storagesPromises: Promise<any>[] = storagesKeys.map(key => this.storages[key].getAll());
|
||||||
|
|
||||||
const promises: Promise<any>[] = ALL_KEYS.map(key => stateStorage.get(key))
|
const promises/* : Promise<any>[] */ = ALL_KEYS.map(key => stateStorage.get(key))
|
||||||
.concat(sessionStorage.get('user_auth'))
|
.concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))
|
||||||
.concat(stateStorage.get('user_auth' as any)) // support old webk format
|
.concat(stateStorage.get('user_auth')) // support old webk format
|
||||||
.concat(storagesPromises);
|
.concat(storagesPromises);
|
||||||
|
|
||||||
Promise.all(promises).then(async(arr) => {
|
Promise.all(promises).then(async(arr) => {
|
||||||
@ -258,7 +261,8 @@ export class AppStateManager extends EventListenerBase<{
|
|||||||
|
|
||||||
// * Read auth
|
// * Read auth
|
||||||
let auth = arr.shift() as UserAuth | number;
|
let auth = arr.shift() as UserAuth | number;
|
||||||
let shiftedWebKAuth = arr.shift() as UserAuth | number;
|
const stateId = arr.shift() as number;
|
||||||
|
const shiftedWebKAuth = arr.shift() as UserAuth | number;
|
||||||
if(!auth && shiftedWebKAuth) { // support old webk auth
|
if(!auth && shiftedWebKAuth) { // support old webk auth
|
||||||
auth = shiftedWebKAuth;
|
auth = shiftedWebKAuth;
|
||||||
const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];
|
const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];
|
||||||
@ -316,6 +320,36 @@ export class AppStateManager extends EventListenerBase<{
|
|||||||
|
|
||||||
arr.splice(0, storagesKeys.length);
|
arr.splice(0, storagesKeys.length);
|
||||||
|
|
||||||
|
if(state.stateId !== stateId) {
|
||||||
|
if(stateId !== undefined) {
|
||||||
|
const preserve: Map<keyof State, State[keyof State]> = new Map([
|
||||||
|
['authState', undefined],
|
||||||
|
['stateId', undefined]
|
||||||
|
]);
|
||||||
|
|
||||||
|
preserve.forEach((_, key) => {
|
||||||
|
preserve.set(key, copy(state[key]));
|
||||||
|
});
|
||||||
|
|
||||||
|
state = this.state = copy(STATE_INIT);
|
||||||
|
|
||||||
|
preserve.forEach((value, key) => {
|
||||||
|
// @ts-ignore
|
||||||
|
state[key] = value;
|
||||||
|
});
|
||||||
|
|
||||||
|
for(const key in this.storagesResults) {
|
||||||
|
this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.storage.set(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
await sessionStorage.set({
|
||||||
|
state_id: state.stateId
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const time = Date.now();
|
const time = Date.now();
|
||||||
if((state.stateCreatedTime + REFRESH_EVERY) < time) {
|
if((state.stateCreatedTime + REFRESH_EVERY) < time) {
|
||||||
if(DEBUG) {
|
if(DEBUG) {
|
||||||
|
@ -112,7 +112,7 @@ class LocalStorage<Storage extends Record<string, any>> {
|
|||||||
} */
|
} */
|
||||||
|
|
||||||
public clear() {
|
public clear() {
|
||||||
const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth'];
|
const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];
|
||||||
for(let i = 1; i <= 5; ++i) {
|
for(let i = 1; i <= 5; ++i) {
|
||||||
keys.push(`dc${i}_server_salt`);
|
keys.push(`dc${i}_server_salt`);
|
||||||
keys.push(`dc${i}_auth_key`);
|
keys.push(`dc${i}_auth_key`);
|
||||||
|
@ -13,6 +13,7 @@ import LocalStorageController from './localStorage';
|
|||||||
const sessionStorage = new LocalStorageController<{
|
const sessionStorage = new LocalStorageController<{
|
||||||
dc: DcId,
|
dc: DcId,
|
||||||
user_auth: UserAuth,
|
user_auth: UserAuth,
|
||||||
|
state_id: number,
|
||||||
dc1_auth_key: string,
|
dc1_auth_key: string,
|
||||||
dc2_auth_key: string,
|
dc2_auth_key: string,
|
||||||
dc3_auth_key: string,
|
dc3_auth_key: string,
|
||||||
|
@ -17,7 +17,8 @@ const stateStorage = new AppStorage<{
|
|||||||
[peerId_threadId: string]: ChatSavedPosition
|
[peerId_threadId: string]: ChatSavedPosition
|
||||||
},
|
},
|
||||||
langPack: LangPackDifference,
|
langPack: LangPackDifference,
|
||||||
drafts: AppDraftsManager['drafts']
|
drafts: AppDraftsManager['drafts'],
|
||||||
|
user_auth: any, // support old webk format
|
||||||
} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');
|
} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');
|
||||||
MOUNT_CLASS_TO.stateStorage = stateStorage;
|
MOUNT_CLASS_TO.stateStorage = stateStorage;
|
||||||
export default stateStorage;
|
export default stateStorage;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user