Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3383093
D11212.id37800.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
20 KB
Referenced Files
None
Subscribers
None
D11212.id37800.diff
View Options
diff --git a/lib/components/keyserver-connection-handler.js b/lib/components/keyserver-connection-handler.js
--- a/lib/components/keyserver-connection-handler.js
+++ b/lib/components/keyserver-connection-handler.js
@@ -26,7 +26,7 @@
import type { BaseSocketProps } from '../socket/socket.react.js';
import {
logInActionSources,
- recoveryActionSources,
+ type RecoveryActionSource,
} from '../types/account-types.js';
import { genericCookieInvalidation } from '../types/session-types.js';
import { authoritativeKeyserverID } from '../utils/authoritative-keyserver.js';
@@ -199,10 +199,10 @@
olmSessionCreator,
]);
- const sessionRecoveryInProgress = useSelector(
+ const activeSessionRecovery = useSelector(
state =>
state.keyserverStore.keyserverInfos[keyserverID]?.connection
- .sessionRecoveryInProgress,
+ .activeSessionRecovery,
);
const preRequestUserInfo = useSelector(state => state.currentUserInfo);
@@ -231,77 +231,81 @@
const dispatch = useDispatch();
const urlPrefix = useSelector(urlPrefixSelector(keyserverID));
- const performRecovery = React.useCallback(() => {
- invariant(
- urlPrefix,
- `urlPrefix for ${keyserverID} should be set during performRecovery`,
- );
-
- setAuthInProgress(true);
-
- let cancelled = false;
- const cancel = () => {
- cancelled = true;
- setAuthInProgress(false);
- };
+ const performRecovery = React.useCallback(
+ (recoveryActionSource: RecoveryActionSource) => {
+ invariant(
+ urlPrefix,
+ `urlPrefix for ${keyserverID} should be set during performRecovery`,
+ );
+
+ setAuthInProgress(true);
+
+ let cancelled = false;
+ const cancel = () => {
+ cancelled = true;
+ setAuthInProgress(false);
+ };
+
+ const promise = (async () => {
+ const userStateBeforeRecovery = preRequestUserStateRef.current;
+ try {
+ const recoverySessionChange =
+ await resolveKeyserverSessionInvalidation(
+ dispatch,
+ cookie,
+ urlPrefix,
+ recoveryActionSource,
+ keyserverID,
+ );
+ if (cancelled) {
+ // TODO: cancellation won't work because above call handles Redux
+ // dispatch directly
+ throw new Error(CANCELLED_ERROR);
+ }
+ const sessionChange =
+ recoverySessionChange ?? genericCookieInvalidation;
+ if (
+ sessionChange.cookieInvalidated ||
+ !sessionChange.cookie ||
+ !sessionChange.cookie.startsWith('user=')
+ ) {
+ setNewSession(
+ dispatch,
+ sessionChange,
+ userStateBeforeRecovery,
+ null,
+ recoveryActionSource,
+ keyserverID,
+ );
+ }
+ } catch (e) {
+ if (cancelled) {
+ return;
+ }
+
+ console.log(
+ `Error while recovering session with keyserver id ${keyserverID}`,
+ e,
+ );
- const promise = (async () => {
- const userStateBeforeRecovery = preRequestUserStateRef.current;
- try {
- const recoverySessionChange = await resolveKeyserverSessionInvalidation(
- dispatch,
- cookie,
- urlPrefix,
- recoveryActionSources.cookieInvalidationResolutionAttempt,
- keyserverID,
- );
- if (cancelled) {
- // TODO: cancellation won't work because above call handles Redux
- // dispatch directly
- throw new Error(CANCELLED_ERROR);
- }
- const sessionChange =
- recoverySessionChange ?? genericCookieInvalidation;
- if (
- sessionChange.cookieInvalidated ||
- !sessionChange.cookie ||
- !sessionChange.cookie.startsWith('user=')
- ) {
setNewSession(
dispatch,
- sessionChange,
+ genericCookieInvalidation,
userStateBeforeRecovery,
null,
- recoveryActionSources.cookieInvalidationResolutionAttempt,
+ recoveryActionSource,
keyserverID,
);
+ } finally {
+ if (!cancelled) {
+ setAuthInProgress(false);
+ }
}
- } catch (e) {
- if (cancelled) {
- return;
- }
-
- console.log(
- `Error while recovering session with keyserver id ${keyserverID}`,
- e,
- );
-
- setNewSession(
- dispatch,
- genericCookieInvalidation,
- userStateBeforeRecovery,
- null,
- recoveryActionSources.cookieInvalidationResolutionAttempt,
- keyserverID,
- );
- } finally {
- if (!cancelled) {
- setAuthInProgress(false);
- }
- }
- })();
- return [promise, cancel];
- }, [dispatch, cookie, urlPrefix, keyserverID]);
+ })();
+ return [promise, cancel];
+ },
+ [dispatch, cookie, urlPrefix, keyserverID],
+ );
const cancelPendingAuth = React.useRef<?() => void>(null);
const prevPerformAuth = React.useRef(performAuth);
@@ -312,7 +316,7 @@
const prevPerformRecovery = React.useRef(performRecovery);
React.useEffect(() => {
- if (sessionRecoveryInProgress && isUserAuthenticated) {
+ if (activeSessionRecovery && isUserAuthenticated) {
cancelPendingAuth.current?.();
cancelPendingAuth.current = null;
@@ -323,7 +327,7 @@
}
if (!authInProgress) {
- const [, cancel] = performRecovery();
+ const [, cancel] = performRecovery(activeSessionRecovery);
cancelPendingRecovery.current = cancel;
}
@@ -359,7 +363,7 @@
const [, cancel] = performAuth();
cancelPendingAuth.current = cancel;
}, [
- sessionRecoveryInProgress,
+ activeSessionRecovery,
authInProgress,
performRecovery,
hasAccessToken,
diff --git a/lib/keyserver-conn/call-keyserver-endpoint-provider.react.js b/lib/keyserver-conn/call-keyserver-endpoint-provider.react.js
--- a/lib/keyserver-conn/call-keyserver-endpoint-provider.react.js
+++ b/lib/keyserver-conn/call-keyserver-endpoint-provider.react.js
@@ -13,9 +13,13 @@
setNewSession,
type SingleKeyserverActionFunc,
type ActionFunc,
- setSessionRecoveryInProgressActionType,
+ setActiveSessionRecoveryActionType,
} from './keyserver-conn-types.js';
import { canResolveKeyserverSessionInvalidation } from './recovery-utils.js';
+import {
+ recoveryActionSources,
+ type RecoveryActionSource,
+} from '../types/account-types.js';
import type { PlatformDetails } from '../types/device-types.js';
import type { Endpoint, SocketAPIHandler } from '../types/endpoints.js';
import type { Dispatch } from '../types/redux-types.js';
@@ -75,7 +79,7 @@
+sessionID: ?string,
+currentUserInfo: ?CurrentUserInfo,
+isSocketConnected: boolean,
- +sessionRecoveryInProgress: boolean,
+ +activeSessionRecovery: ?RecoveryActionSource,
+canRecoverSession?: ?boolean,
+lastCommunicatedPlatformDetails: ?PlatformDetails,
};
@@ -114,7 +118,7 @@
sessionID,
currentUserInfo,
isSocketConnected,
- sessionRecoveryInProgress,
+ activeSessionRecovery,
canRecoverSession,
lastCommunicatedPlatformDetails,
keyserverID,
@@ -146,7 +150,7 @@
// just let the caller callSingleKeyserverEndpoint instance continue
return Promise.resolve(null);
}
- if (!sessionRecoveryInProgress) {
+ if (!activeSessionRecovery) {
// Our cookie seems to be valid
return Promise.resolve(null);
}
@@ -191,10 +195,14 @@
keyserverRecoveryAttempts = { waitingCalls: [] };
recoveryAttempts.set(keyserverID, keyserverRecoveryAttempts);
}
- if (!sessionRecoveryInProgress) {
+ if (!activeSessionRecovery) {
dispatch({
- type: setSessionRecoveryInProgressActionType,
- payload: { sessionRecoveryInProgress: true, keyserverID },
+ type: setActiveSessionRecoveryActionType,
+ payload: {
+ activeSessionRecovery:
+ recoveryActionSources.cookieInvalidationResolutionAttempt,
+ keyserverID,
+ },
});
}
const ongoingRecoveryAttempts = keyserverRecoveryAttempts;
@@ -246,7 +254,7 @@
(params: ServerCallSelectorParams) => params.sessionID,
(params: ServerCallSelectorParams) => params.currentUserInfo,
(params: ServerCallSelectorParams) => params.isSocketConnected,
- (params: ServerCallSelectorParams) => params.sessionRecoveryInProgress,
+ (params: ServerCallSelectorParams) => params.activeSessionRecovery,
(params: ServerCallSelectorParams) => params.canRecoverSession,
(params: ServerCallSelectorParams) =>
params.lastCommunicatedPlatformDetails,
@@ -257,7 +265,7 @@
sessionID: ?string,
currentUserInfo: ?CurrentUserInfo,
isSocketConnected: boolean,
- sessionRecoveryInProgress: boolean,
+ activeSessionRecovery: ?RecoveryActionSource,
canRecoverSession: ?boolean,
lastCommunicatedPlatformDetails: ?PlatformDetails,
) =>
@@ -268,7 +276,7 @@
sessionID,
currentUserInfo,
isSocketConnected,
- sessionRecoveryInProgress,
+ activeSessionRecovery,
canRecoverSession,
lastCommunicatedPlatformDetails,
keyserverID,
@@ -317,7 +325,7 @@
],
);
- // SECTION 4: flush waitingCalls when sessionRecoveryInProgress flips to false
+ // SECTION 4: flush waitingCalls when activeSessionRecovery flips to falsy
const prevKeyserverCallInfosRef = React.useRef<{
+[keyserverID: string]: KeyserverCallInfo,
@@ -332,8 +340,8 @@
}
const keyserverCallInfo = keyserverCallInfos[keyserverID];
if (
- !keyserverCallInfo.sessionRecoveryInProgress &&
- prevKeyserverCallInfo.sessionRecoveryInProgress
+ !keyserverCallInfo.activeSessionRecovery &&
+ prevKeyserverCallInfo.activeSessionRecovery
) {
sessionRecoveriesConcluded.add(keyserverID);
}
diff --git a/lib/keyserver-conn/keyserver-call-infos.js b/lib/keyserver-conn/keyserver-call-infos.js
--- a/lib/keyserver-conn/keyserver-call-infos.js
+++ b/lib/keyserver-conn/keyserver-call-infos.js
@@ -3,6 +3,7 @@
import { createSelector } from 'reselect';
import { useDerivedObject } from '../hooks/objects.js';
+import type { RecoveryActionSource } from '../types/account-types.js';
import type { PlatformDetails } from '../types/device-types.js';
import type { KeyserverInfo } from '../types/keyserver-types.js';
@@ -16,7 +17,7 @@
+urlPrefix: string,
+sessionID: ?string,
+isSocketConnected: boolean,
- +sessionRecoveryInProgress: boolean,
+ +activeSessionRecovery: ?RecoveryActionSource,
+lastCommunicatedPlatformDetails: ?PlatformDetails,
};
@@ -29,7 +30,7 @@
(keyserverInfo: KeyserverInfoPartial) =>
keyserverInfo.connection?.status === 'connected',
(keyserverInfo: KeyserverInfoPartial) =>
- !!keyserverInfo.connection?.sessionRecoveryInProgress,
+ keyserverInfo.connection?.activeSessionRecovery,
(keyserverInfo: KeyserverInfoPartial) =>
keyserverInfo.lastCommunicatedPlatformDetails,
(
@@ -37,14 +38,14 @@
urlPrefix: string,
sessionID: ?string,
isSocketConnected: boolean,
- sessionRecoveryInProgress: boolean,
+ activeSessionRecovery: ?RecoveryActionSource,
lastCommunicatedPlatformDetails: ?PlatformDetails,
) => ({
cookie,
urlPrefix,
sessionID,
isSocketConnected,
- sessionRecoveryInProgress,
+ activeSessionRecovery,
lastCommunicatedPlatformDetails,
}),
);
diff --git a/lib/keyserver-conn/keyserver-conn-types.js b/lib/keyserver-conn/keyserver-conn-types.js
--- a/lib/keyserver-conn/keyserver-conn-types.js
+++ b/lib/keyserver-conn/keyserver-conn-types.js
@@ -93,7 +93,6 @@
+keyserverID: string,
};
-export const setSessionRecoveryInProgressActionType =
- 'SET_SESSION_RECOVERY_IN_PROGRESS';
+export const setActiveSessionRecoveryActionType = 'SET_ACTIVE_SESSION_RECOVERY';
export { setNewSessionActionType, setNewSession };
diff --git a/lib/reducers/keyserver-reducer.js b/lib/reducers/keyserver-reducer.js
--- a/lib/reducers/keyserver-reducer.js
+++ b/lib/reducers/keyserver-reducer.js
@@ -30,7 +30,7 @@
setLateResponseActionType,
updateKeyserverReachabilityActionType,
setConnectionIssueActionType,
- setSessionRecoveryInProgressActionType,
+ setActiveSessionRecoveryActionType,
} from '../keyserver-conn/keyserver-conn-types.js';
import {
keyserverStoreOpsHandlers,
@@ -137,7 +137,7 @@
cookie: null,
connection: {
...state.keyserverInfos[keyserverID].connection,
- sessionRecoveryInProgress: false,
+ activeSessionRecovery: null,
},
},
},
@@ -171,7 +171,7 @@
cookie: sessionChange.cookie,
connection: {
...newKeyserverInfo.connection,
- sessionRecoveryInProgress: false,
+ activeSessionRecovery: null,
},
};
}
@@ -235,7 +235,7 @@
connection: {
...state.keyserverInfos[keyserverID].connection,
connectionIssue: null,
- sessionRecoveryInProgress: false,
+ activeSessionRecovery: null,
},
},
},
@@ -485,7 +485,7 @@
connection: {
...oldConnection,
connectionIssue: null,
- sessionRecoveryInProgress: false,
+ activeSessionRecovery: null,
queuedActivityUpdates: [],
lateResponses: [],
},
@@ -520,7 +520,7 @@
connection: {
...oldConnection,
connectionIssue: null,
- sessionRecoveryInProgress: false,
+ activeSessionRecovery: null,
queuedActivityUpdates: [],
lateResponses: [],
},
@@ -619,8 +619,8 @@
keyserverStore: processStoreOps(state, [operation]),
keyserverStoreOperations: [operation],
};
- } else if (action.type === setSessionRecoveryInProgressActionType) {
- const { sessionRecoveryInProgress, keyserverID } = action.payload;
+ } else if (action.type === setActiveSessionRecoveryActionType) {
+ const { activeSessionRecovery, keyserverID } = action.payload;
const operation: ReplaceKeyserverOperation = {
type: 'replace_keyserver',
payload: {
@@ -629,7 +629,7 @@
...state.keyserverInfos[keyserverID],
connection: {
...state.keyserverInfos[keyserverID].connection,
- sessionRecoveryInProgress,
+ activeSessionRecovery,
},
},
},
diff --git a/lib/selectors/server-calls.js b/lib/selectors/server-calls.js
--- a/lib/selectors/server-calls.js
+++ b/lib/selectors/server-calls.js
@@ -10,6 +10,7 @@
connectionSelector,
lastCommunicatedPlatformDetailsSelector,
} from './keyserver-selectors.js';
+import type { RecoveryActionSource } from '../types/account-types.js';
import type { PlatformDetails } from '../types/device-types.js';
import type { AppState } from '../types/redux-types.js';
import type { ConnectionInfo } from '../types/socket-types.js';
@@ -21,7 +22,7 @@
+sessionID: ?string,
+currentUserInfo: ?CurrentUserInfo,
+isSocketConnected: ?boolean,
- +sessionRecoveryInProgress: ?boolean,
+ +activeSessionRecovery: ?RecoveryActionSource,
+lastCommunicatedPlatformDetails: ?PlatformDetails,
};
@@ -51,7 +52,7 @@
connectionInfo?.status !== undefined
? connectionInfo?.status === 'connected'
: undefined,
- sessionRecoveryInProgress: connectionInfo?.sessionRecoveryInProgress,
+ activeSessionRecovery: connectionInfo?.activeSessionRecovery,
lastCommunicatedPlatformDetails,
}),
);
diff --git a/lib/types/redux-types.js b/lib/types/redux-types.js
--- a/lib/types/redux-types.js
+++ b/lib/types/redux-types.js
@@ -104,6 +104,7 @@
ConnectionIssue,
StateSyncFullActionPayload,
StateSyncIncrementalActionPayload,
+ SetActiveSessionRecoveryPayload,
} from './socket-types.js';
import { type ClientStore } from './store-ops-types.js';
import type { SubscriptionUpdateResult } from './subscription-types.js';
@@ -1356,13 +1357,13 @@
+type: 'SET_CONNECTION_ISSUE',
+payload: { +connectionIssue: ?ConnectionIssue, +keyserverID: string },
}
- | {
- +type: 'SET_SESSION_RECOVERY_IN_PROGRESS',
- +payload: { +sessionRecoveryInProgress: boolean, +keyserverID: string },
- }
| {
+type: 'ADD_COMMUNITY',
+payload: AddCommunityPayload,
+ }
+ | {
+ +type: 'SET_ACTIVE_SESSION_RECOVERY',
+ +payload: SetActiveSessionRecoveryPayload,
};
export type ActionPayload = ?(Object | Array<*> | $ReadOnlyArray<*> | string);
diff --git a/lib/types/socket-types.js b/lib/types/socket-types.js
--- a/lib/types/socket-types.js
+++ b/lib/types/socket-types.js
@@ -3,6 +3,10 @@
import invariant from 'invariant';
import t, { type TInterface, type TUnion } from 'tcomb';
+import {
+ type RecoveryActionSource,
+ recoveryActionSources,
+} from './account-types.js';
import {
type ActivityUpdate,
activityUpdateValidator,
@@ -51,6 +55,7 @@
loggedOutUserInfoValidator,
} from './user-types.js';
import { mixedRawThreadInfoValidator } from '../permissions/minimally-encoded-raw-thread-info-validators.js';
+import { values } from '../utils/objects.js';
import { tShape, tNumber, tID } from '../utils/validation-utils.js';
// The types of messages that the client sends across the socket
@@ -498,9 +503,9 @@
+lateResponses: $ReadOnlyArray<number>,
+unreachable: boolean,
+connectionIssue: ?ConnectionIssue,
- // When this is flipped to true, a session recovery is attempted
+ // When this is flipped to truthy, a session recovery is attempted
// This can happen when the keyserver invalidates the session
- +sessionRecoveryInProgress: boolean,
+ +activeSessionRecovery: null | RecoveryActionSource,
};
export const connectionInfoValidator: TInterface<ConnectionInfo> =
tShape<ConnectionInfo>({
@@ -521,7 +526,7 @@
'not_logged_in_error',
]),
),
- sessionRecoveryInProgress: t.Boolean,
+ activeSessionRecovery: t.maybe(t.enums.of(values(recoveryActionSources))),
});
export const defaultConnectionInfo: ConnectionInfo = {
status: 'connecting',
@@ -529,7 +534,12 @@
lateResponses: [],
unreachable: false,
connectionIssue: null,
- sessionRecoveryInProgress: false,
+ activeSessionRecovery: null,
+};
+
+export type SetActiveSessionRecoveryPayload = {
+ +activeSessionRecovery: null | RecoveryActionSource,
+ +keyserverID: string,
};
export type OneTimeKeyGenerator = (inc: number) => string;
diff --git a/lib/utils/action-utils.js b/lib/utils/action-utils.js
--- a/lib/utils/action-utils.js
+++ b/lib/utils/action-utils.js
@@ -41,14 +41,13 @@
return cachedNonOverridenBoundServerCall;
}
- const { urlPrefix, isSocketConnected, sessionRecoveryInProgress } =
+ const { urlPrefix, isSocketConnected, activeSessionRecovery } =
serverCallState;
invariant(
!!urlPrefix &&
isSocketConnected !== undefined &&
isSocketConnected !== null &&
- sessionRecoveryInProgress !== undefined &&
- sessionRecoveryInProgress !== null,
+ activeSessionRecovery !== undefined,
'keyserver missing from keyserverStore',
);
@@ -56,7 +55,7 @@
...serverCallState,
urlPrefix,
isSocketConnected,
- sessionRecoveryInProgress,
+ activeSessionRecovery,
dispatch,
...paramOverride,
});
diff --git a/lib/utils/keyserver-call.js b/lib/utils/keyserver-call.js
--- a/lib/utils/keyserver-call.js
+++ b/lib/utils/keyserver-call.js
@@ -77,7 +77,7 @@
urlPrefix,
sessionID,
isSocketConnected,
- sessionRecoveryInProgress,
+ activeSessionRecovery,
lastCommunicatedPlatformDetails,
} = keyserverCallInfos[keyserverID];
@@ -89,7 +89,7 @@
urlPrefix,
sessionID,
isSocketConnected,
- sessionRecoveryInProgress,
+ activeSessionRecovery,
lastCommunicatedPlatformDetails,
});
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 29, 1:34 PM (21 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2597139
Default Alt Text
D11212.id37800.diff (20 KB)
Attached To
Mode
D11212: [lib] Replace sessionRecoveryInProgress with actionSessionRecovery
Attached
Detach File
Event Timeline
Log In to Comment