Files
discord-decomp/actions/AuthenticationActionCreators.tsx
T
2026-11-01 12:12:55 +02:00

820 lines
23 KiB
TypeScript

// Metro module 5641 (f5642).
import { setPromoEmailConsentState } from "../modules/auth/PromoEmailConsentStore";
import AuthenticationStore from "../stores/AuthenticationStore";
import ConsentStore from "../stores/ConsentStore";
import { AbortCodes, DEVICE_TOKEN, DEVICE_VOIP_TOKEN, Endpoints, Routes } from "../Constants";
import { DEVICE_PUSH_VOIP_PROVIDER, getDevicePushProvider } from "../modules/push_notifications/PushNotificationConstants";
import Logger from "../modules/debug/Logger";
import CrossPlatformNativeUtils_native from "../utils/CrossPlatformNativeUtils.native";
import Dispatcher from "../Dispatcher";
import { getRootNavigationRef } from "../modules/main_tabs_v2/RootNavigationRef.native";
import { transitionTo } from "../modules/routing/router_utils";
import ModalActionCreators from "./ModalActionCreators";
import TrackedHTTPUtils from "../utils/TrackedHTTPUtils";
import { NetworkActionNames } from "../_bundle/Module503";
import { rejectWithMigratedError, HTTPResponseError, HTTP } from "../_bundle/sendRequest";
import { V6OrEarlierAPIError, APIError } from "../errors/index";
import { fetchWebAuthnPasswordlessChallenge } from "../modules/webauthn/WebAuthnActionCreators";
import SignalHelpers_native from "../modules/webauthn/SignalHelpers.native";
import { Storage } from "../_bundle/Module595";
import { getToken } from "../_bundle/setSecondaryToken";
import { HermesBuiltin } from "../_hermes/prelude";
let c3481_4, c3481_16, c3481_17, c3481_18, $mk76574 = function() {
return (a0) => {
c3481_16.error("Error while dispatching LOGOUT", a0);
const DiscordErrors = window.DiscordErrors;
if (DiscordErrors != null) {
DiscordErrors.softCrash(a0);
}
throw a0;
};
};
const handleLogout = function handleLogout(a0, r8 = Routes.DEFAULT_LOGGED_OUT) {
CrossPlatformNativeUtils_native.clearNavigationHistory();
Dispatcher.dispatch({
type: "LOGOUT",
...void 0
}).catch($mk76574());
if (r8 != null) {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
ModalActionCreators.popAll();
rootNavigationRef.reset({
index: 0,
routes: [{
name: "auth"
}]
});
} else {
transitionTo(r8, {
source: a0
});
}
}
};
c3481_16 = new Logger("AuthenticationActionCreators");
c3481_17 = null;
c3481_18 = {
MFA: "MFA",
SUCCESS: "SUCCESS"
};
const r48 = {
startSession: (token) => {
Dispatcher.wait(() => {
Dispatcher.dispatch({
type: "START_SESSION",
token
});
});
},
login: function login({ login: login2, password, undelete, source: source4, giftCodeSKUId: giftCodeSKUId2, invite, isMultiAccount }) {
Dispatcher.dispatch({
type: "LOGIN",
isPasswordAttempt: true
});
return TrackedHTTPUtils.post({
url: Endpoints.LOGIN,
body: {
login: login2,
password,
undelete,
login_source: source4,
gift_code_sku_id: giftCodeSKUId2
},
retries: 2,
oldFormErrors: true,
trackedActionData: {
event: NetworkActionNames.USER_LOGIN,
properties: {
invite_code: invite?.code,
is_multi_account: isMultiAccount
}
},
...isMultiAccount ? {
headers: {
authorization: ""
}
} : {},
rejectWithError: rejectWithMigratedError()
}).then(({ body }) => {
const { mfa, sms, webauthn, ticket: ticket3, token: token6, backup, user_id, required_actions, totp, login_instance_id } = body;
Dispatcher.dispatch({
type: "LOGIN_ATTEMPTED",
user_id,
required_actions
});
if (mfa) {
Dispatcher.dispatch({
type: "LOGIN_MFA_STEP",
ticket: ticket3,
sms,
webauthn,
totp,
backup,
loginInstanceId: login_instance_id
});
} else if (isMultiAccount) {
this.switchAccountToken(token6);
} else {
Dispatcher.dispatch({
type: "LOGIN_SUCCESS",
token: token6
});
}
}, (a0) => {
const v6OrEarlierAPIError = new V6OrEarlierAPIError(a0);
if (a0.body != null) {
if (a0.body?.suspended_user_token != null) {
Dispatcher.dispatch({
type: "LOGIN_SUSPENDED_USER",
suspendedUserToken: a0.body?.suspended_user_token
});
throw v6OrEarlierAPIError;
}
}
const code2 = a0.body?.code;
if (code2 === AbortCodes.ACCOUNT_SCHEDULED_FOR_DELETION && (password != null && password !== "")) {
Dispatcher.dispatch({
type: "LOGIN_ACCOUNT_SCHEDULED_FOR_DELETION",
credentials: {
login: login2,
password
}
});
} else if (code2 === AbortCodes.ACCOUNT_DISABLED && (password != null && password !== "")) {
Dispatcher.dispatch({
type: "LOGIN_ACCOUNT_DISABLED",
credentials: {
login: login2,
password
}
});
} else if (code2 === AbortCodes.PHONE_VERIFICATION_REQUIRED) {
Dispatcher.dispatch({
type: "LOGIN_PHONE_IP_AUTHORIZATION_REQUIRED",
credentials: {
login: login2,
password
}
});
} else {
Dispatcher.dispatch({
type: "LOGIN_FAILURE",
error: v6OrEarlierAPIError
});
}
throw v6OrEarlierAPIError;
});
},
loginMFAv2: function loginMFAv2(a0) {
const { code: code2, ticket: ticket3, source: source4, giftCodeSKUId: giftCodeSKUId2, isMultiAccount: isMultiAccount2, mfaType } = a0;
let loginInstanceId = a0.loginInstanceId;
const r21 = {
url: Endpoints.LOGIN_MFA(mfaType),
body: null,
retries: 2,
oldFormErrors: true,
trackedActionData: null,
rejectWithError: true
};
if (loginInstanceId == null) {
loginInstanceId = AuthenticationStore.getLoginInstanceId();
}
r21.body = {
code: code2,
ticket: ticket3,
login_source: source4,
gift_code_sku_id: giftCodeSKUId2,
login_instance_id: loginInstanceId
};
r21.trackedActionData = {
event: NetworkActionNames.USER_LOGIN_MFA
};
return TrackedHTTPUtils.post(r21).then((result) => {
if (isMultiAccount2) {
this.switchAccountToken(result.body.token);
} else {
Dispatcher.dispatch({
type: "LOGIN_SUCCESS",
token: result.body.token
});
}
}).catch((error) => {
if (error.body != null && error.body.suspended_user_token != null) {
Dispatcher.dispatch({
type: "LOGIN_SUSPENDED_USER",
suspendedUserToken: error.body.suspended_user_token
});
return void 0;
}
if (error.body?.code === AbortCodes.MFA_INVALID_CODE) {
throw new Error(error.body.message);
}
throw error;
});
},
authenticatePasswordless: async function authenticatePasswordless({ authenticateFunc, conditionalMediationAbortController, source, giftCodeSKUId, isMultiAccount: isMultiAccount3 }) {
const _this = this;
let c25514_2;
let c25514_3 = 0;
let c29535_0, c29535_1, c29535_2, c29535_3, c29535_5, c29535_4;
try {
c29535_0 = void 0;
c29535_1 = void 0;
c29535_2 = void 0;
c29535_3 = void 0;
if (conditionalMediationAbortController != null) {
conditionalMediationAbortController.abort("Starting non-conditional mediation");
}
Dispatcher.dispatch({
type: "PASSWORDLESS_START"
});
c25514_3 = 1;
c29535_0 = await fetchWebAuthnPasswordlessChallenge();
c29535_1 = c29535_0.challenge;
c29535_2 = c29535_0.ticket;
c29535_3 = await (0, authenticateFunc)(c29535_1);
c25514_3 = 2;
await _this.loginWebAuthn({
ticket: c29535_2,
credential: c29535_3,
source,
giftCodeSKUId,
isMultiAccount: isMultiAccount3
});
c25514_3 = 0;
} catch ($e) {
const r38 = $e;
let r8 = r38;
c25514_2 = r38;
let r39 = c25514_3;
if (r39 !== 0) {
while (true) {
if (r39 === 1) {
try {
const r204 = c25514_2;
c25514_3 = 0;
c29535_5 = r204;
Dispatcher.dispatch({
type: "PASSWORDLESS_FAILURE",
error: c29535_5
});
throw c29535_5;
} catch (r201) {
r8 = r201;
c25514_2 = r201;
r39 = c25514_3;
if (r39 === 0) {
break;
}
}
} else {
try {
const r146 = c25514_2;
c25514_3 = 1;
c29535_4 = r146;
if (c29535_4 instanceof APIError && c29535_4.status != null && c29535_4.status >= 400 && c29535_4.status < 500) {
await SignalHelpers_native.signalUnknownCredential(c29535_3);
}
throw c29535_4;
} catch (r143) {
r8 = r143;
c25514_2 = r143;
r39 = c25514_3;
if (r39 === 0) {
break;
}
}
}
}
}
throw r8;
}
},
loginWebAuthn: function loginWebAuthn({ ticket: ticket3, credential, source: source4, giftCodeSKUId: giftCodeSKUId2, isMultiAccount: isMultiAccount4 }) {
return TrackedHTTPUtils.post({
url: Endpoints.WEBAUTHN_CONDITIONAL_UI_LOGIN,
body: {
credential,
ticket: ticket3,
source: source4,
giftCodeSKUId: giftCodeSKUId2
},
retries: 1,
trackedActionData: {
event: NetworkActionNames.USER_LOGIN_PASSWORDLESS
},
rejectWithError: true
}).then(({ body }) => {
const token6 = body.token;
Dispatcher.dispatch({
type: "LOGIN_ATTEMPTED",
user_id: body.user_id,
required_actions: body.required_actions
});
if (isMultiAccount4) {
this.switchAccountToken(token6);
} else {
Dispatcher.dispatch({
type: "LOGIN_SUCCESS",
token: token6
});
}
}).catch((error) => {
const r1 = error instanceof HTTPResponseError;
let r12 = error;
if (r1) {
if (error.body.suspended_user_token != null) {
Dispatcher.dispatch({
type: "LOGIN_SUSPENDED_USER",
suspendedUserToken: error.body.suspended_user_token
});
return void 0;
}
r12 = new APIError(error);
}
throw r12;
});
},
loginToken: function loginToken(token2, r4 = true) {
let c14964_0 = r4;
Dispatcher.dispatch({
type: "LOGIN"
});
return new Promise((c25515_0) => {
setImmediate(() => {
Dispatcher.dispatch({
type: "LOGIN_SUCCESS",
token: token2
});
if (c14964_0) {
this.startSession(token2);
}
c25515_0();
});
});
},
oneTimeLogin: async function oneTimeLogin(ticket) {
let r110;
const _this2 = this;
let c25516_2;
let c25516_3 = 0;
let c29536_0, c29536_1;
try {
c29536_0 = void 0;
Dispatcher.dispatch({
type: "LOGIN"
});
c25516_3 = 1;
c29536_0 = (await TrackedHTTPUtils.post({
url: Endpoints.ONE_TIME_LOGIN,
body: {
ticket
},
oldFormErrors: true,
trackedActionData: {
event: NetworkActionNames.USER_ONE_TIME_LOGIN
},
rejectWithError: true
})).body.token;
if (!c29536_0) {
throw new Error("No token in response");
}
await _this2.loginToken(c29536_0, false);
r110 = c29536_0;
c25516_3 = 0;
} catch ($e) {
const r34 = $e;
let r8 = r34;
c25516_2 = r34;
if (c25516_3 !== 0) {
while (true) {
try {
const r119 = c25516_2;
c25516_3 = 0;
c29536_1 = r119;
Dispatcher.dispatch({
type: "LOGIN_FAILURE",
error: new V6OrEarlierAPIError(c29536_1)
});
throw c29536_1;
} catch (r115) {
r8 = r115;
c25516_2 = r115;
if (c25516_3 === 0) {
break;
}
}
}
}
throw r8;
}
return r110;
},
loginReset: (a0) => {
Dispatcher.dispatch({
type: "LOGIN_RESET",
isMultiAccount: a0
});
},
loginStatusReset: () => {
Dispatcher.dispatch({
type: "LOGIN_STATUS_RESET"
});
},
logoutInternal: (a0) => {
CrossPlatformNativeUtils_native.clearNavigationHistory();
Dispatcher.dispatch({
type: "LOGOUT",
...a0
}).catch($mk76574());
},
logout: function logout(a0) {
let r3 = arguments[1];
if (r3 === void 0) {
r3 = Routes.DEFAULT_LOGGED_OUT;
}
const DEFAULT_LOGGED_OUT = r3;
const r11 = arguments[2];
let c14966_2 = r11;
const r21 = {
url: Endpoints.LOGOUT,
body: {
provider: getDevicePushProvider(),
token: Storage.get(DEVICE_TOKEN),
voip_provider: DEVICE_PUSH_VOIP_PROVIDER,
voip_token: Storage.get(DEVICE_VOIP_TOKEN)
},
oldFormErrors: true,
trackedActionData: {
event: NetworkActionNames.USER_LOGOUT,
properties: {
logout_source: a0
}
}
};
let r41 = r11 != null;
if (r41) {
let authorization = getToken(r11);
if (authorization == null) {
authorization = "";
}
r41 = {
headers: {
authorization
}
};
}
HermesBuiltin.copyDataProperties(r21, r41);
r21.rejectWithError = rejectWithMigratedError();
return TrackedHTTPUtils.post(r21).finally(() => {
if (!(c14966_2 != null && c14966_2 !== AuthenticationStore.getId())) {
handleLogout(a0, DEFAULT_LOGGED_OUT);
}
});
},
switchAccountToken: function switchAccountToken(a0) {
let goHomeAfterSwitching = arguments[1];
if (goHomeAfterSwitching === void 0) {
goHomeAfterSwitching = true;
}
const token6 = AuthenticationStore.getToken();
c3481_16.log("Switching accounts", {
wasLoggedIn: token6 != null,
tokenHasChanged: a0 !== token6
});
const r19 = {
isSwitchingAccount: true,
goHomeAfterSwitching
};
CrossPlatformNativeUtils_native.clearNavigationHistory();
Dispatcher.dispatch({
type: "LOGOUT",
...r19
}).catch($mk76574());
return this.loginToken(a0, true).then(() => {
const isCorrectToken = a0 === AuthenticationStore.getToken();
c3481_16.log("Switched accounts finished", {
isCorrectToken
});
return isCorrectToken;
});
},
verifySSOToken: function verifySSOToken(c14968_0, r6 = Routes.DEFAULT_LOGGED_OUT) {
const DEFAULT_LOGGED_OUT2 = r6;
return HTTP.get({
url: Endpoints.ME,
oldFormErrors: true,
rejectWithError: true
}).catch(() => {
handleLogout(c14968_0, DEFAULT_LOGGED_OUT2);
});
},
verify: async (token3) => {
let c25517_1;
c25517_1 = void 0;
let c29537_0 = await TrackedHTTPUtils.post({
url: Endpoints.VERIFY,
body: {
token: token3
},
trackedActionData: {
event: NetworkActionNames.USER_VERIFY
},
rejectWithError: rejectWithMigratedError()
});
Dispatcher.dispatch({
type: "LOGIN_SUCCESS",
token: c29537_0.body.token
});
return c29537_0.body.user_id;
},
authorizePayment: (a0) => TrackedHTTPUtils.post({
url: Endpoints.AUTHORIZE_PAYMENT,
body: {
token: a0
},
trackedActionData: {
event: NetworkActionNames.AUTHORIZE_PAYMENT
},
rejectWithError: true
}),
authorizeIPAddress: (a0) => TrackedHTTPUtils.post({
url: Endpoints.AUTHORIZE_IP,
body: {
token: a0
},
trackedActionData: {
event: NetworkActionNames.AUTHORIZE_IP
},
rejectWithError: true
}),
verifyResend: () => TrackedHTTPUtils.post({
url: Endpoints.VERIFY_RESEND,
oldFormErrors: true,
trackedActionData: {
event: NetworkActionNames.USER_VERIFY_RESEND
},
rejectWithError: rejectWithMigratedError()
}),
resetPassword: async (token4, password2, source2) => {
let r119;
let c25518_2;
let c25518_3 = 0;
let c29538_0, c29538_1, c29538_2, c29538_3, c29538_4, c29538_5, c29538_6, c29538_7, c29538_8, c29538_9;
try {
c29538_0 = void 0;
c29538_1 = void 0;
c29538_2 = void 0;
c29538_3 = void 0;
c29538_4 = void 0;
c29538_5 = void 0;
c29538_6 = void 0;
c29538_7 = void 0;
c29538_8 = void 0;
Dispatcher.dispatch({
type: "LOGIN"
});
const body = {
token: token4,
password: password2,
source: source2
};
const push_token = Storage.get(DEVICE_TOKEN);
const devicePushProvider = getDevicePushProvider();
if (devicePushProvider != null && push_token != null) {
body.push_provider = devicePushProvider;
body.push_token = push_token;
}
const push_voip_token = Storage.get(DEVICE_VOIP_TOKEN);
if (DEVICE_PUSH_VOIP_PROVIDER != null && push_voip_token != null) {
body.push_voip_provider = DEVICE_PUSH_VOIP_PROVIDER;
body.push_voip_token = push_voip_token;
}
c25518_3 = 1;
c29538_0 = (await TrackedHTTPUtils.post({
url: Endpoints.RESET_PASSWORD,
body,
oldFormErrors: true,
trackedActionData: {
event: NetworkActionNames.USER_RESET_PASSWORD
},
rejectWithError: rejectWithMigratedError()
})).body;
c29538_1 = c29538_0.mfa;
c29538_2 = c29538_0.sms;
c29538_3 = c29538_0.webauthn;
c29538_4 = c29538_0.ticket;
c29538_5 = c29538_0.token;
c29538_6 = c29538_0.backup;
c29538_7 = c29538_0.totp;
const r113 = c29538_1;
r119 = {
result: r113 ? c3481_18.MFA : c3481_18.SUCCESS,
sms: c29538_2,
webauthn: c29538_3,
ticket: c29538_4,
token: c29538_5,
backup: c29538_6,
totp: c29538_7
};
c25518_3 = 0;
} catch ($e) {
const r28 = $e;
let r8 = r28;
c25518_2 = r28;
if (c25518_3 !== 0) {
while (true) {
try {
const r134 = c25518_2;
c25518_3 = 0;
c29538_9 = r134;
c29538_8 = new V6OrEarlierAPIError(c29538_9);
Dispatcher.dispatch({
type: "LOGIN_FAILURE",
error: c29538_8
});
throw c29538_8;
} catch (r130) {
r8 = r130;
c25518_2 = r130;
if (c25518_3 === 0) {
break;
}
}
}
}
throw r8;
}
return r119;
},
resetPasswordMFAv2: async ({ method, code, ticket: ticket2, password: password3, token: token5, source: source3 }) => {
Dispatcher.dispatch({
type: "LOGIN_MFA"
});
return (await TrackedHTTPUtils.post({
url: Endpoints.RESET_PASSWORD,
body: {
code,
ticket: ticket2,
password: password3,
token: token5,
source: source3,
method
},
oldFormErrors: true,
trackedActionData: {
event: NetworkActionNames.USER_RESET_PASSWORD,
properties: {
mfa: true
}
},
rejectWithError: true
})).body.token;
},
forgotPassword: async (login3) => {
let method2;
let c25520_2;
let c25520_3 = 0;
let c29539_0, c29539_1, c29539_2;
try {
c29539_0 = void 0;
c29539_1 = void 0;
Dispatcher.dispatch({
type: "FORGOT_PASSWORD_REQUEST"
});
c25520_3 = 1;
c29539_0 = await TrackedHTTPUtils.post({
url: Endpoints.FORGOT_PASSWORD,
body: {
login: login3
},
oldFormErrors: true,
trackedActionData: {
event: NetworkActionNames.FORGOT_PASSWORD
},
rejectWithError: rejectWithMigratedError()
});
Dispatcher.dispatch({
type: "FORGOT_PASSWORD_SENT"
});
method2 = c29539_0.body.method;
c25520_3 = 0;
} catch ($e) {
const r27 = $e;
let r8 = r27;
c25520_2 = r27;
if (c25520_3 !== 0) {
while (true) {
try {
const r93 = c25520_2;
c25520_3 = 0;
c29539_2 = r93;
c29539_1 = new V6OrEarlierAPIError(c29539_2);
if (c29539_1.code !== AbortCodes.PHONE_VERIFICATION_REQUIRED) {
Dispatcher.dispatch({
type: "LOGIN_FAILURE",
error: c29539_1
});
throw c29539_1;
}
Dispatcher.dispatch({
type: "LOGIN_PASSWORD_RECOVERY_PHONE_VERIFICATION",
credentials: {
login: login3
}
});
} catch (r89) {
r8 = r89;
c25520_2 = r89;
if (c25520_3 === 0) {
break;
}
continue;
}
return false;
}
}
throw r8;
}
return method2;
},
setFingerprint: (a0) => {
Dispatcher.dispatch({
type: "FINGERPRINT",
fingerprint: a0
});
},
getExperiments: (a0) => {
Dispatcher.dispatch({
type: "EXPERIMENTS_FETCH",
withGuildExperiments: a0
});
},
getLocationMetadata: () => {
let r25;
if (c3481_17 != null) {
r25 = c3481_17;
} else {
clearTimeout(c3481_4);
c3481_4 = setTimeout(() => {
Dispatcher.dispatch({
type: "SET_CONSENT_REQUIRED",
consentRequired: true
});
}, 5000);
r25 = HTTP.get({
url: Endpoints.AUTH_LOCATION_METADATA,
retries: 2,
oldFormErrors: true,
rejectWithError: true
}).then((result) => {
clearTimeout(c3481_4);
if (ConsentStore.getAuthenticationConsentRequired() == null) {
let consentRequired = result == null ? void 0 : result.body?.consent_required;
if (consentRequired == null) {
consentRequired = true;
}
Dispatcher.dispatch({
type: "SET_CONSENT_REQUIRED",
consentRequired
});
}
let countryCode = result == null ? void 0 : result.body?.country_code;
if (countryCode == null) {
countryCode = void 0;
}
Dispatcher.dispatch({
type: "SET_LOCATION_METADATA",
countryCode
});
c3481_17 = null;
if ((result == null ? void 0 : result.body?.promotional_email_opt_in) != null) {
const promotional_email_opt_in = result.body.promotional_email_opt_in;
setPromoEmailConsentState({
required: promotional_email_opt_in.required,
checked: promotional_email_opt_in.pre_checked,
preChecked: promotional_email_opt_in.pre_checked
});
}
}, () => {
clearTimeout(c3481_4);
Dispatcher.dispatch({
type: "SET_CONSENT_REQUIRED",
consentRequired: true
});
c3481_17 = null;
});
c3481_17 = r25;
}
return r25;
},
closeSuspendedUser: () => {
Dispatcher.dispatch({
type: "CLOSE_SUSPENDED_USER"
});
}
};
export default r48;
export { c3481_18 as PasswordResetResult };