diff --git a/lib/actions/user-actions.js b/lib/actions/user-actions.js --- a/lib/actions/user-actions.js +++ b/lib/actions/user-actions.js @@ -114,14 +114,29 @@ function useLogOut(): ( keyserverIDs?: $ReadOnlyArray, -) => Promise { +) => Promise { const preRequestUserState = useSelector(preRequestUserStateSelector); const callKeyserverLogOut = useKeyserverCall(logOut); + const commServicesAccessToken = useSelector( + state => state.commServicesAccessToken, + ); + return React.useCallback( - (keyserverIDs?: $ReadOnlyArray) => - callKeyserverLogOut({ preRequestUserState, keyserverIDs }), - [callKeyserverLogOut, preRequestUserState], + async (keyserverIDs?: $ReadOnlyArray) => { + const { keyserverIDs: _, ...result } = await callKeyserverLogOut({ + preRequestUserState, + keyserverIDs, + }); + return { + ...result, + preRequestUserState: { + ...result.preRequestUserState, + commServicesAccessToken, + }, + }; + }, + [callKeyserverLogOut, commServicesAccessToken, preRequestUserState], ); } @@ -203,6 +218,10 @@ const preRequestUserState = useSelector(preRequestUserStateSelector); const callKeyserverDeleteAccount = useKeyserverCall(deleteKeyserverAccount); + const commServicesAccessToken = useSelector( + state => state.commServicesAccessToken, + ); + return React.useCallback(async () => { const identityPromise = (async () => { if (!usingCommServicesAccessToken) { @@ -220,8 +239,19 @@ identityPromise, ]); const { keyserverIDs: _, ...result } = keyserverResult; - return result; - }, [callKeyserverDeleteAccount, identityClient, preRequestUserState]); + return { + ...result, + preRequestUserState: { + ...result.preRequestUserState, + commServicesAccessToken, + }, + }; + }, [ + callKeyserverDeleteAccount, + commServicesAccessToken, + identityClient, + preRequestUserState, + ]); } const keyserverRegisterActionTypes = Object.freeze({ diff --git a/lib/shared/session-utils.js b/lib/shared/session-utils.js --- a/lib/shared/session-utils.js +++ b/lib/shared/session-utils.js @@ -16,11 +16,13 @@ IdentityCallPreRequestUserState, } from '../types/session-types.js'; import type { CurrentUserInfo } from '../types/user-types.js'; +import { usingCommServicesAccessToken } from '../utils/services-utils.js'; +import { ashoatKeyserverID } from '../utils/validation-utils.js'; function invalidSessionDowngrade( currentReduxState: AppState, actionCurrentUserInfo: ?CurrentUserInfo, - preRequestUserState: ?PreRequestUserState, + preRequestUserState: ?(PreRequestUserState | IdentityCallPreRequestUserState), keyserverID: string, ): boolean { // If this action represents a session downgrade - oldState has a loggedIn @@ -52,6 +54,14 @@ actionCurrentUserInfo: ?CurrentUserInfo, preRequestUserState: ?IdentityCallPreRequestUserState, ): boolean { + if (!usingCommServicesAccessToken) { + return invalidSessionDowngrade( + currentReduxState, + actionCurrentUserInfo, + preRequestUserState, + ashoatKeyserverID, + ); + } // If this action represents a session downgrade - oldState has a loggedIn // currentUserInfo, but the action has an anonymous one - then it is only // valid if the currentUserInfo used for the request matches what oldState diff --git a/lib/types/account-types.js b/lib/types/account-types.js --- a/lib/types/account-types.js +++ b/lib/types/account-types.js @@ -14,7 +14,10 @@ type MessageTruncationStatuses, type GenericMessagesResult, } from './message-types.js'; -import type { PreRequestUserState } from './session-types.js'; +import type { + PreRequestUserState, + IdentityCallPreRequestUserState, +} from './session-types.js'; import { type MixedRawThreadInfos, type RawThreadInfos, @@ -35,11 +38,12 @@ export type LogOutResult = { +currentUserInfo: ?LoggedOutUserInfo, - +preRequestUserState: PreRequestUserState, + +preRequestUserState: IdentityCallPreRequestUserState, }; export type KeyserverLogOutResult = $ReadOnly<{ - ...LogOutResult, + +currentUserInfo: ?LoggedOutUserInfo, + +preRequestUserState: PreRequestUserState, +keyserverIDs: $ReadOnlyArray, }>; 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 @@ -230,7 +230,7 @@ } | { +type: 'LOG_OUT_SUCCESS', - +payload: KeyserverLogOutResult, + +payload: LogOutResult, +loadingInfo: LoadingInfo, } | { diff --git a/native/crash.react.js b/native/crash.react.js --- a/native/crash.react.js +++ b/native/crash.react.js @@ -19,7 +19,7 @@ sendReport, } from 'lib/actions/report-actions.js'; import { logOutActionTypes, useLogOut } from 'lib/actions/user-actions.js'; -import type { KeyserverLogOutResult } from 'lib/types/account-types.js'; +import type { LogOutResult } from 'lib/types/account-types.js'; import { type ErrorData, reportTypes } from 'lib/types/report-types.js'; import { actionLogger } from 'lib/utils/action-logger.js'; import { @@ -52,7 +52,7 @@ // Redux dispatch functions +dispatchActionPromise: DispatchActionPromise, // async functions that hit server APIs - +logOut: () => Promise, + +logOut: () => Promise, +crashReportingEnabled: boolean, }; type State = { diff --git a/native/profile/profile-screen.react.js b/native/profile/profile-screen.react.js --- a/native/profile/profile-screen.react.js +++ b/native/profile/profile-screen.react.js @@ -7,7 +7,7 @@ import { useStringForUser } from 'lib/hooks/ens-cache.js'; import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js'; import { accountHasPassword } from 'lib/shared/account-utils.js'; -import type { KeyserverLogOutResult } from 'lib/types/account-types.js'; +import type { LogOutResult } from 'lib/types/account-types.js'; import { type CurrentUserInfo } from 'lib/types/user-types.js'; import { useDispatchActionPromise, @@ -152,7 +152,7 @@ +colors: Colors, +styles: $ReadOnly, +dispatchActionPromise: DispatchActionPromise, - +logOut: () => Promise, + +logOut: () => Promise, +staffCanSee: boolean, +stringForUser: ?string, +isAccountWithPassword: boolean, diff --git a/native/redux/redux-setup.js b/native/redux/redux-setup.js --- a/native/redux/redux-setup.js +++ b/native/redux/redux-setup.js @@ -23,6 +23,7 @@ import { invalidSessionDowngrade, invalidSessionRecovery, + identityInvalidSessionDowngrade, } from 'lib/shared/session-utils.js'; import { isStaff } from 'lib/shared/staff-utils.js'; import type { Dispatch, BaseAction } from 'lib/types/redux-types.js'; @@ -30,7 +31,6 @@ import type { SetSessionPayload } from 'lib/types/session-types.js'; import { reduxLoggerMiddleware } from 'lib/utils/action-logger.js'; import { resetUserSpecificStateOnIdentityActions } from 'lib/utils/reducers-utils.js'; -import { ashoatKeyserverID } from 'lib/utils/validation-utils.js'; import { updateDimensionsActiveType, @@ -159,12 +159,12 @@ action.type === logOutActionTypes.success || action.type === deleteAccountActionTypes.success ) { + const { currentUserInfo, preRequestUserState } = action.payload; if ( - invalidSessionDowngrade( + identityInvalidSessionDowngrade( state, - action.payload.currentUserInfo, - action.payload.preRequestUserState, - ashoatKeyserverID, + currentUserInfo, + preRequestUserState, ) ) { return { diff --git a/web/redux/redux-setup.js b/web/redux/redux-setup.js --- a/web/redux/redux-setup.js +++ b/web/redux/redux-setup.js @@ -22,7 +22,10 @@ import baseReducer from 'lib/reducers/master-reducer.js'; import { mostRecentlyReadThreadSelector } from 'lib/selectors/thread-selectors.js'; import { isLoggedIn } from 'lib/selectors/user-selectors.js'; -import { invalidSessionDowngrade } from 'lib/shared/session-utils.js'; +import { + invalidSessionDowngrade, + identityInvalidSessionDowngrade, +} from 'lib/shared/session-utils.js'; import type { CryptoStore } from 'lib/types/crypto-types.js'; import type { DraftStore } from 'lib/types/draft-types.js'; import type { EnabledApps } from 'lib/types/enabled-apps.js'; @@ -45,7 +48,6 @@ import type { CurrentUserInfo, UserStore } from 'lib/types/user-types.js'; import type { NotifPermissionAlertInfo } from 'lib/utils/push-alerts.js'; import { resetUserSpecificStateOnIdentityActions } from 'lib/utils/reducers-utils.js'; -import { ashoatKeyserverID } from 'lib/utils/validation-utils.js'; import { updateWindowActiveActionType, @@ -272,12 +274,12 @@ action.type === logOutActionTypes.success || action.type === deleteAccountActionTypes.success ) { + const { currentUserInfo, preRequestUserState } = action.payload; if ( - invalidSessionDowngrade( + identityInvalidSessionDowngrade( oldState, - action.payload.currentUserInfo, - action.payload.preRequestUserState, - ashoatKeyserverID, + currentUserInfo, + preRequestUserState, ) ) { return {