diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index d3f1c4dc..aee93b13 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "Unmöglich, das für den Download erforderliche Manifest zu erhalten.", "VERIFY_INTEGRITY_FAILED": "Beim Überprüfen der Dateien ist ein Fehler aufgetreten.", "SOME_FILES_FAILED_TO_DOWNLOAD": "Einige Dateien konnten nicht heruntergeladen werden.", - "OCULUS_LOGIN_TIMED_OUT": "Es hat zu lange gedauert, das Anmelde-Token abzurufen.", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Das Meta-Anmeldefenster wurde geschlossen.", + "META_LOGIN_TIMED_OUT": "Es hat zu lange gedauert, das Anmelde-Token abzurufen.", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "Das Meta-Anmeldefenster wurde geschlossen.", "NO_META_AUTH_TOKEN": "Unmöglich, das für den Download erforderliche Meta-Anmelde-Token zu erhalten.", "UNKNOWN_ERROR": "Ein unbekannter Fehler ist aufgetreten." } diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 0380cc7b..d15075dc 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "Unable to obtain the manifest required for download.", "VERIFY_INTEGRITY_FAILED": "An error occurred during file verification.", "SOME_FILES_FAILED_TO_DOWNLOAD": "Some files failed to download.", - "OCULUS_LOGIN_TIMED_OUT": "The login token took too long to retrieve.", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "The Meta login window was closed.", + "META_LOGIN_TIMED_OUT": "The login token took too long to retrieve.", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "The Meta login window was closed.", "NO_META_AUTH_TOKEN": "Unable to retrieve the Meta login token required for download.", "UNKNOWN_ERROR": "An unknown error occurred." } diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index c78d2959..93786664 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "Imposible obtener el manifiesto necesario para la descarga.", "VERIFY_INTEGRITY_FAILED": "Se produjo un error durante la verificación de archivos.", "SOME_FILES_FAILED_TO_DOWNLOAD": "Algunos archivos no pudieron ser descargados.", - "OCULUS_LOGIN_TIMED_OUT": "El token de inicio de sesión tardó demasiado en recuperarse.", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "La ventana de inicio de sesión de Meta fue cerrada.", + "META_LOGIN_TIMED_OUT": "El token de inicio de sesión tardó demasiado en recuperarse.", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "La ventana de inicio de sesión de Meta fue cerrada.", "NO_META_AUTH_TOKEN": "Imposible recuperar el token de inicio de sesión de Meta necesario para la descarga.", "UNKNOWN_ERROR": "Se produjo un error desconocido." } diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 02852a84..6da64450 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "Impossible d'obtenir le manifest nécessaire au téléchargement.", "VERIFY_INTEGRITY_FAILED": "Une erreur c'est produite lors de la vérification des fichiers.", "SOME_FILES_FAILED_TO_DOWNLOAD": "Certains fichiers n'ont pas pu être téléchargés.", - "OCULUS_LOGIN_TIMED_OUT": "Le Token de connexion à mis trop de temps à être récupéré.", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "La fenêtre de connexion à Meta a été fermée.", + "META_LOGIN_TIMED_OUT": "Le Token de connexion à mis trop de temps à être récupéré.", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "La fenêtre de connexion à Meta a été fermée.", "NO_META_AUTH_TOKEN": "Impossible de récupérer le token de connexion à Meta nécessaire au téléchargement.", "UNKNOWN_ERROR": "Une erreur inconnue s'est produite." } diff --git a/assets/jsons/translations/ja.json b/assets/jsons/translations/ja.json index d87c5772..4f55fb0c 100644 --- a/assets/jsons/translations/ja.json +++ b/assets/jsons/translations/ja.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "ダウンロードに必要なマニフェストを取得できません。", "VERIFY_INTEGRITY_FAILED": "ファイルの検証中にエラーが発生しました。", "SOME_FILES_FAILED_TO_DOWNLOAD": "一部のファイルのダウンロードに失敗しました。", - "OCULUS_LOGIN_TIMED_OUT": "ログイントークンの取得に時間がかかりすぎました。", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "メタ・ログイン・ウィンドウが閉じられた。", + "META_LOGIN_TIMED_OUT": "ログイントークンの取得に時間がかかりすぎました。", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "メタ・ログイン・ウィンドウが閉じられた。", "NO_META_AUTH_TOKEN": "ダウンロードに必要な Meta ログイン トークンを取得できません。", "UNKNOWN_ERROR": "不明なエラーが発生しました。" } diff --git a/assets/jsons/translations/ko.json b/assets/jsons/translations/ko.json index 99b3d2b9..398ef485 100644 --- a/assets/jsons/translations/ko.json +++ b/assets/jsons/translations/ko.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "다운로드에 필요한 매니페스트를 가져올 수 없습니다.", "VERIFY_INTEGRITY_FAILED": "파일 검증 중 오류가 발생했습니다.", "SOME_FILES_FAILED_TO_DOWNLOAD": "일부 파일을 다운로드하지 못했습니다.", - "OCULUS_LOGIN_TIMED_OUT": "로그인 토큰을 얻는 데 시간이 너무 오래 걸렸습니다.", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 로그인 창이 닫혔습니다.", + "META_LOGIN_TIMED_OUT": "로그인 토큰을 얻는 데 시간이 너무 오래 걸렸습니다.", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 로그인 창이 닫혔습니다.", "NO_META_AUTH_TOKEN": "다운로드에 필요한 Meta 로그인 토큰을 얻을 수 없습니다.", "UNKNOWN_ERROR": "알 수 없는 오류가 발생했습니다." } diff --git a/assets/jsons/translations/ru.json b/assets/jsons/translations/ru.json index ab6a3895..8f56e6b2 100644 --- a/assets/jsons/translations/ru.json +++ b/assets/jsons/translations/ru.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "Невозможно получить манифест, необходимый для загрузки.", "VERIFY_INTEGRITY_FAILED": "При проверке файлов произошла ошибка.", "SOME_FILES_FAILED_TO_DOWNLOAD": "Некоторые файлы не удалось загрузить.", - "OCULUS_LOGIN_TIMED_OUT": "Получение токена входа заняло слишком много времени.", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Окно входа в Meta было закрыто.", + "META_LOGIN_TIMED_OUT": "Получение токена входа заняло слишком много времени.", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "Окно входа в Meta было закрыто.", "NO_META_AUTH_TOKEN": "Невозможно получить токен входа в Meta, необходимый для загрузки.", "UNKNOWN_ERROR": "Произошла неизвестная ошибка." } diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index c2881a3d..0eba2cf5 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "無法獲取下載所需的清單。", "VERIFY_INTEGRITY_FAILED": "文件驗證過程中發生錯誤。", "SOME_FILES_FAILED_TO_DOWNLOAD": "一些文件下載失敗。", - "OCULUS_LOGIN_TIMED_OUT": "獲取登錄令牌用時過長。", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 登錄窗口被關閉。", + "META_LOGIN_TIMED_OUT": "獲取登錄令牌用時過長。", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 登錄窗口被關閉。", "NO_META_AUTH_TOKEN": "無法獲取下載所需的 Meta 登錄令牌。", "UNKNOWN_ERROR": "發生未知錯誤。" } diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index f75a3715..944adba9 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -364,8 +364,8 @@ "UNABLE_TO_GET_MANIFEST": "无法获取下载所需的清单。", "VERIFY_INTEGRITY_FAILED": "文件验证过程中发生错误。", "SOME_FILES_FAILED_TO_DOWNLOAD": "一些文件下载失败。", - "OCULUS_LOGIN_TIMED_OUT": "获取登录令牌用时过长。", - "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 登录窗口被关闭。", + "META_LOGIN_TIMED_OUT": "获取登录令牌用时过长。", + "META_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 登录窗口被关闭。", "NO_META_AUTH_TOKEN": "无法获取下载所需的 Meta 登录令牌。", "UNKNOWN_ERROR": "发生未知错误。" } diff --git a/src/main/ipcs/bs-version-download/bs-download-ipcs.ts b/src/main/ipcs/bs-version-download/bs-download-ipcs.ts index dfc4e682..57f25814 100644 --- a/src/main/ipcs/bs-version-download/bs-download-ipcs.ts +++ b/src/main/ipcs/bs-version-download/bs-download-ipcs.ts @@ -1,7 +1,7 @@ import { BsOculusDownloaderService } from "../../services/bs-version-download/bs-oculus-downloader.service"; import { BsSteamDownloaderService } from "../../services/bs-version-download/bs-steam-downloader.service"; import { IpcService } from "../../services/ipc.service"; -import { of } from "rxjs"; +import { from, of } from "rxjs"; import { BSLocalVersionService } from "../../services/bs-local-version.service"; const ipc = IpcService.getInstance(); @@ -42,14 +42,29 @@ ipc.on("send-input-bs-download", (args, reply) => { // #region Oculus -ipc.on("bs-oculus-download", async (args, reply) => { +ipc.on("bs-oculus-download", (args, reply) => { const oculusDownloader = BsOculusDownloaderService.getInstance(); reply(oculusDownloader.downloadVersion(args)); }); -ipc.on("bs-oculus-stop-download", async (_, reply) => { +ipc.on("bs-oculus-stop-download", (_, reply) => { const oculusDownloader = BsOculusDownloaderService.getInstance(); reply(of(oculusDownloader.stopDownload())); }); +ipc.on("login-with-meta", (stay, reply) => { + const oculusDownloader = BsOculusDownloaderService.getInstance(); + reply(from(oculusDownloader.getUserTokenFromMetaAuth(stay))); +}); + +ipc.on("delete-meta-session", (_, reply) => { + const oculusDownloader = BsOculusDownloaderService.getInstance(); + reply(from(oculusDownloader.clearAuthToken())); +}); + +ipc.on("meta-session-exists", (_, reply) => { + const oculusDownloader = BsOculusDownloaderService.getInstance(); + reply(from(oculusDownloader.metaSessionExists())); +}); + // #endregion diff --git a/src/main/main.ts b/src/main/main.ts index 6d6fbf80..14736156 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -264,3 +264,11 @@ function deleteOlestLogs(): void{ } }); } + +export function addFilterStringLog(filter: string): void { + filterStrings.add(filter); +} + +export function addFilterPatternLog(filter: RegExp): void { + filterPatterns.add(filter); +} diff --git a/src/main/services/bs-version-download/bs-oculus-downloader.service.ts b/src/main/services/bs-version-download/bs-oculus-downloader.service.ts index dda1949d..3743188f 100644 --- a/src/main/services/bs-version-download/bs-oculus-downloader.service.ts +++ b/src/main/services/bs-version-download/bs-oculus-downloader.service.ts @@ -8,6 +8,12 @@ import path from "path"; import { DownloadInfo } from "./bs-steam-downloader.service"; import { BsStore } from "../../../shared/models/bs-store.enum"; import { isOculusTokenValid } from "../../../shared/helpers/oculus.helpers"; +import { CustomError } from "shared/models/exceptions/custom-error.class"; +import { minToMs } from "shared/helpers/time.helpers"; +import { session } from "electron"; +import { WindowManagerService } from "../window-manager.service"; +import { addFilterStringLog } from "../../main"; +import { MetaAuthErrorCodes } from "shared/models/bs-version-download/oculus-download.model"; export class BsOculusDownloaderService { @@ -23,13 +29,63 @@ export class BsOculusDownloaderService { private readonly oculusDownloader: OculusDownloader; private readonly versions: BSLocalVersionService; + private readonly windows: WindowManagerService; private constructor() { this.versions = BSLocalVersionService.getInstance(); - + this.windows = WindowManagerService.getInstance(); this.oculusDownloader = new OculusDownloader(); } + public async getUserTokenFromMetaAuth(keepToken: boolean): Promise{ + + const loginUrl = "https://secure.oculus.com"; + const redirectUrl = `${loginUrl}/my/profile`; + const window = await this.windows.openWindow(loginUrl, { frame: true, width: 650, height: 800 }); + + let timout: NodeJS.Timeout; + + return new Promise((resolve, reject) => { + timout = setTimeout(() => { + reject(new CustomError("Trying to get Oculus user token timed out", MetaAuthErrorCodes.META_LOGIN_TIMED_OUT)); + window.close(); + }, minToMs(10)); + + const tryExtractToken = async () => { + log.info("Meta auth window navigated to", new URL(window.webContents.getURL()).origin + new URL(window.webContents.getURL()).pathname); // Dot not log full url for privacy reasons + if(!window.webContents.getURL()?.startsWith(redirectUrl)){ return; } + + const token = (await window.webContents.session.cookies.get({ name: "oc_ac_at" })).at(0)?.value; + + if(!isOculusTokenValid(token, log.info)){ + return; + } + + addFilterStringLog(token); + resolve(token); + } + + window.webContents.on("did-stop-loading", tryExtractToken); + window.webContents.on("did-navigate", tryExtractToken); + window.webContents.on("did-navigate-in-page", tryExtractToken); + + window.on("closed", () => { + reject(new CustomError("Oculus login window closed by user", MetaAuthErrorCodes.META_LOGIN_WINDOW_CLOSED_BY_USER)); + }); + }).finally(() => { + + clearTimeout(timout); + + if(!keepToken){ + this.clearAuthToken(); + } + + if(!window.isDestroyed() && window.isClosable()){ + window.close(); + } + }); + } + private async createDownloadVersion(version: BSVersion): Promise<{version: BSVersion, dest: string}>{ const dest = await ensurePathNotAlreadyExist(await this.versions.getVersionPath(version)); return { @@ -46,7 +102,7 @@ export class BsOculusDownloaderService { this.oculusDownloader.stopDownload(); } - public downloadVersion(downloadInfo: DownloadInfo): Observable>{ + public downloadVersion(downloadInfo: OculusDownloadInfo): Observable>{ let downloadVersion: BSVersion @@ -69,9 +125,16 @@ export class BsOculusDownloaderService { ); } + public clearAuthToken(): Promise{ + return session.defaultSession.clearStorageData({ storages: ["cookies"], origin: ".oculus.com" }) + } + + public metaSessionExists(): Promise{ + return session.defaultSession.cookies.get({ domain: ".oculus.com" }).then(cookies => cookies.length > 0); + } + } -export interface OculusDownloadInfo { - version: BSVersion; - stay?: boolean; +export interface OculusDownloadInfo extends DownloadInfo { + token: string; } diff --git a/src/main/services/bs-version-download/bs-steam-downloader.service.ts b/src/main/services/bs-version-download/bs-steam-downloader.service.ts index 8484f839..c35f2f02 100644 --- a/src/main/services/bs-version-download/bs-steam-downloader.service.ts +++ b/src/main/services/bs-version-download/bs-steam-downloader.service.ts @@ -147,7 +147,6 @@ export interface DownloadInfo { bsVersion: BSVersion; isVerification?: boolean; stay?: boolean; - token?: string; } export interface DownloadSteamInfo extends DownloadInfo { diff --git a/src/renderer/components/modal/modal-types/bs-downgrade/login-to-meta-modal.component.tsx b/src/renderer/components/modal/modal-types/bs-downgrade/login-to-meta-modal.component.tsx index 901dd2ee..161c91dd 100644 --- a/src/renderer/components/modal/modal-types/bs-downgrade/login-to-meta-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/bs-downgrade/login-to-meta-modal.component.tsx @@ -1,25 +1,52 @@ -import { ModalComponent, ModalExitCode } from "../../../../services/modale.service"; -import { useState } from "react"; +import { ModalComponent, ModalExitCode, ModalService } from "../../../../services/modale.service"; +import { MouseEventHandler, useState } from "react"; import { BsmButton } from "renderer/components/shared/bsm-button.component"; -import { useTranslation } from "renderer/hooks/use-translation.hook"; +import { useTranslationV2 } from "renderer/hooks/use-translation.hook"; import { MetaIcon } from "renderer/components/svgs/icons/meta-icon.component"; import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component"; import Tippy from "@tippyjs/react"; +import { useService } from "renderer/hooks/use-service.hook"; +import { IpcService } from "renderer/services/ipc.service"; +import { lastValueFrom } from "rxjs"; +import { EnterMetaTokenModal } from "./enter-meta-token-modal.component"; +import { CustomError } from "shared/models/exceptions/custom-error.class"; +import { MetaAuthErrorCodes } from "shared/models/bs-version-download/oculus-download.model"; +import { NotificationService } from "renderer/services/notification.service"; -type ReturnType = { method: MetaAuthMethod.META, stay: boolean } | { method: MetaAuthMethod.MANUAL }; +export const LoginToMetaModal: ModalComponent = ({ resolver }) => { -export const LoginToMetaModal: ModalComponent = ({ resolver }) => { + const { text: t } = useTranslationV2(); - const t = useTranslation(); + const ipc = useService(IpcService); + const modal = useService(ModalService); + const notifications = useService(NotificationService); - const [stay, setStay] = useState(false); + const [stay, setStay] = useState(true); + const [authWindowOpen, setAuthWindowOpen] = useState(false); - const submit = () => { - resolver({ exitCode: ModalExitCode.COMPLETED, data: { method: MetaAuthMethod.META, stay } }); - }; + const handleLoginWithMeta = () => { + setAuthWindowOpen(() => true); + lastValueFrom(ipc.sendV2("login-with-meta", stay)).then(token => { + resolver({ exitCode: ModalExitCode.COMPLETED, data: token }); + }).catch((e: CustomError) => { + if(e.code === MetaAuthErrorCodes.META_LOGIN_WINDOW_CLOSED_BY_USER){ + return; + } - const enterTokenManually = () => { - resolver({ exitCode: ModalExitCode.COMPLETED, data: { method: MetaAuthMethod.MANUAL } }); + if(e.code){ + notifications.notifyError({title: "notifications.types.error", desc: `notifications.bs-download.oculus-download.errors.msg.${e.code}`}); + } + + resolver({ exitCode: ModalExitCode.CANCELED }); + }).finally(() => { + setAuthWindowOpen(() => false); + }) + } + + const handleEnterTokenManually: MouseEventHandler = async (e) => { + e.preventDefault(); + const res = await modal.openModal(EnterMetaTokenModal); + resolver(res); } return ( @@ -38,17 +65,12 @@ export const LoginToMetaModal: ModalComponent = ({ resolver }) => { {t("modals.connect-to-meta.stay")} - + -

{t("modals.connect-to-meta.body.enter-token-manually")}

+
- + ); }; - -export enum MetaAuthMethod { - MANUAL = "manual", - META = "meta" -} diff --git a/src/renderer/pages/settings-page.component.tsx b/src/renderer/pages/settings-page.component.tsx index 991c4ece..9b05c664 100644 --- a/src/renderer/pages/settings-page.component.tsx +++ b/src/renderer/pages/settings-page.component.tsx @@ -46,6 +46,7 @@ import { StaticConfigurationService } from "renderer/services/static-configurati import { tryit } from "shared/helpers/error.helpers"; import { InstallationLocationService } from "renderer/services/installation-location.service"; import { AutoUpdaterService } from "renderer/services/auto-updater.service"; +import { OculusDownloaderService } from "renderer/services/bs-version-download/oculus-downloader.service"; export function SettingsPage() { @@ -55,6 +56,7 @@ export function SettingsPage() { const modalService = useService(ModalService); const bsDownloader = useService(BsDownloaderService); const steamDownloader = useService(SteamDownloaderService); + const oculusDownloader = useService(OculusDownloaderService); const progressBarService = useService(ProgressBarService); const notificationService = useService(NotificationService); const i18nService = useService(I18nService); @@ -121,16 +123,17 @@ export function SettingsPage() { }); }; - const loadDownloadersSession = () => { - setHasDownloaderSession(steamDownloader.sessionExist()); + const loadDownloadersSession = async () => { + setHasDownloaderSession(steamDownloader.sessionExist() || await oculusDownloader.metaSessionExists()); } - const clearDownloadersSession = () => { + const clearDownloadersSession = async () => { if (!hasDownloaderSession) { return; } steamDownloader.deleteSteamSession(); + await oculusDownloader.deleteMetaSession() notificationService.notifyInfo({ title: "pages.settings.steam-and-oculus.logout-success", }); diff --git a/src/renderer/services/bs-version-download/oculus-downloader.service.ts b/src/renderer/services/bs-version-download/oculus-downloader.service.ts index cd0e5a91..e39f3b88 100644 --- a/src/renderer/services/bs-version-download/oculus-downloader.service.ts +++ b/src/renderer/services/bs-version-download/oculus-downloader.service.ts @@ -8,10 +8,9 @@ import { NotificationService } from "../notification.service"; import { ModalExitCode, ModalService } from "../modale.service"; import { DownloaderServiceInterface } from "./bs-store-downloader.interface"; import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service"; -import { DownloadInfo } from "main/services/bs-version-download/bs-steam-downloader.service"; import { MetaAuthErrorCodes, OculusDownloaderErrorCodes } from "shared/models/bs-version-download/oculus-download.model"; -import { EnterMetaTokenModal } from "renderer/components/modal/modal-types/bs-downgrade/enter-meta-token-modal.component"; -import { addFilterStringLog } from "renderer"; +import { LoginToMetaModal } from "renderer/components/modal/modal-types/bs-downgrade/login-to-meta-modal.component"; +import { OculusDownloadInfo } from "main/services/bs-version-download/bs-oculus-downloader.service"; export class OculusDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{ @@ -69,7 +68,7 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme ); } - private startDownloadBsVersion(downloadInfo: DownloadInfo): Observable>{ + private startDownloadBsVersion(downloadInfo: OculusDownloadInfo): Observable>{ const ignoreCode = [MetaAuthErrorCodes.META_LOGIN_WINDOW_CLOSED_BY_USER, OculusDownloaderErrorCodes.DOWNLOAD_CANCELLED]; return this.handleDownload( this.ipc.sendV2("bs-oculus-download", downloadInfo ), @@ -77,25 +76,16 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme ); } - private async doDownloadBsVersion(bsVersion: BSVersion, isVerification: boolean): Promise { + private async doDownloadBsVersion(bsVersion: BSVersion, isVerification: boolean): Promise { - const autoDownloadFailed = false; + const {exitCode, data: token} = await this.modals.openModal(LoginToMetaModal) - return (async () => { + if(exitCode !== ModalExitCode.COMPLETED){ + return undefined + } - const tokenRes = await this.modals.openModal(EnterMetaTokenModal); - - if(tokenRes.exitCode !== ModalExitCode.COMPLETED){ - return false; - } - - addFilterStringLog(tokenRes.data); - - return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token: tokenRes.data })).then(() => true); - - })().then(res => { - - if(autoDownloadFailed || !res){ + return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token })).then(() => true).then(res => { + if(!res){ return bsVersion; } @@ -121,4 +111,12 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme return lastValueFrom(this.ipc.sendV2("bs-oculus-stop-download")); } + public deleteMetaSession(): Promise{ + return lastValueFrom(this.ipc.sendV2("delete-meta-session")); + } + + public metaSessionExists(): Promise{ + return lastValueFrom(this.ipc.sendV2("meta-session-exists")); + } + } diff --git a/src/shared/helpers/oculus.helpers.ts b/src/shared/helpers/oculus.helpers.ts index 3176867c..c6806d39 100644 --- a/src/shared/helpers/oculus.helpers.ts +++ b/src/shared/helpers/oculus.helpers.ts @@ -12,8 +12,8 @@ export function isOculusTokenValid(token: string, logger?: (...args: unknown[]) logger?.("Token contains %. Token most likely comes from an uri and won't work"); return false; } - if(!token.startsWith("FRL")){ - logger?.("Tokens must start with 'FRL'."); + if(!token.startsWith("FRL") && !token.startsWith("OC") ){ + logger?.("Tokens must start with 'FRL' or 'OC'."); return false; } if(token.includes("|")){ @@ -33,4 +33,4 @@ export function isOculusTokenValid(token: string, logger?: (...args: unknown[]) return true; -} \ No newline at end of file +} diff --git a/src/shared/models/ipc/ipc-routes.ts b/src/shared/models/ipc/ipc-routes.ts index 6eaed08e..950c2495 100644 --- a/src/shared/models/ipc/ipc-routes.ts +++ b/src/shared/models/ipc/ipc-routes.ts @@ -6,7 +6,7 @@ import { BsvMapDetail, SongDetails } from "shared/models/maps"; import { BsmLocalMap, BsmLocalMapsProgress, DeleteMapsProgress } from "shared/models/maps/bsm-local-map.interface"; import { BsvPlaylist, BsvPlaylistPage, PlaylistSearchParams, SearchParams } from "../maps/beat-saver.model"; import { ImportVersionOptions } from "main/services/bs-local-version.service"; -import { DownloadInfo, DownloadSteamInfo } from "main/services/bs-version-download/bs-steam-downloader.service"; +import { DownloadSteamInfo } from "main/services/bs-version-download/bs-steam-downloader.service"; import { DepotDownloaderEvent } from "../bs-version-download/depot-downloader.model"; import { MSGetQuery, MSModel, MSModelType } from "../models/model-saber.model"; import { ModelDownload } from "renderer/services/models-management/models-downloader.service"; @@ -21,6 +21,7 @@ import { AppWindow } from "../window-manager/app-window.model"; import { LocalBPList, LocalBPListsDetails } from "../playlists/local-playlist.models"; import { StaticConfigGetIpcRequestResponse, StaticConfigKeys, StaticConfigSetIpcRequest } from "main/services/static-configuration.service"; import { ExternalMod } from "../mods/mod.interface"; +import { OculusDownloadInfo } from "main/services/bs-version-download/bs-oculus-downloader.service"; export type IpcReplier = (data: Observable) => void; @@ -33,8 +34,11 @@ export interface IpcChannelMapping { "download-bs-version-qr": { request: DownloadSteamInfo, response: DepotDownloaderEvent}; "stop-download-bs-version": { request: void, response: void}; "send-input-bs-download": { request: string, response: boolean}; - "bs-oculus-download": { request: DownloadInfo, response: Progression}; + "bs-oculus-download": { request: OculusDownloadInfo, response: Progression}; "bs-oculus-stop-download": { request: void, response: void}; + "login-with-meta": { request: boolean, response: string }; + "delete-meta-session": { request: void, response: void }; + "meta-session-exists": { request: void, response: boolean }; /* ** beat-saver-ipcs ** */ "bsv-search-map": {request: SearchParams, response: BsvMapDetail[]};