From c313685f6fdc46a4dbaf8a349f42736cb2bf26af Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Thu, 1 Aug 2024 00:20:02 +0200 Subject: [PATCH 1/2] [chore] filter potential oculus token in logs --- src/main/main.ts | 145 ++++++++++++++++-- .../enter-meta-token-modal.component.tsx | 4 +- src/renderer/index.tsx | 8 + .../oculus-downloader.service.ts | 5 +- .../steam-downloader.service.ts | 17 +- 5 files changed, 159 insertions(+), 20 deletions(-) diff --git a/src/main/main.ts b/src/main/main.ts index 6cf82c74..daf9a21b 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -21,16 +21,20 @@ import { BSLauncherService } from "./services/bs-launcher/bs-launcher.service"; import { IpcRequest } from "shared/models/ipc"; import { LivShortcut } from "./services/liv/liv-shortcut.service"; import { SteamLauncherService } from "./services/bs-launcher/steam-launcher.service"; +import { readdirSync, statSync, unlinkSync } from "fs-extra"; + +export const filterStrings = new Set(); +export const filterPatterns = new Set(); const isDebug = process.env.NODE_ENV === "development" || process.env.DEBUG_PROD === "true"; -log.transports.file.level = "info"; -log.transports.file.resolvePath = () => { - const now = new Date(); - return path.join(app.getPath("logs"), `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}-v${app.getVersion()}.log`); -}; +// Filter all occulus tokens +filterPatterns.add(/FRL\S{10,}/g); + +initLogger(); +deleteOlestLogs(); +deleteOldLogs(); -log.catchErrors(); if (process.env.NODE_ENV === "production") { const sourceMapSupport = require("source-map-support"); @@ -90,11 +94,11 @@ if (!gotTheLock) { }) app.whenReady().then(() => { - + app.setAppUserModelId(APP_NAME); initServicesMustBeInitialized(); - + const deepLink = process.argv.find(arg => DeepLinkService.getInstance().isDeepLink(arg)); if (!deepLink) { @@ -102,13 +106,132 @@ if (!gotTheLock) { } else { DeepLinkService.getInstance().dispatchLinkOpened(deepLink); } - + SteamLauncherService.getInstance().restoreSteamVR(); - + // Log renderer errors ipcMain.on("log-error", (_, args: IpcRequest) => { log.error(args?.args); }); - + + ipcMain.on("add-filter-string", (_, args: IpcRequest) => { + filterStrings.add(args?.args); + }); + + ipcMain.on("add-filter-pattern", (_, args: IpcRequest) => { + filterPatterns.add(new RegExp(args?.args)); + }); + }).catch(log.error); } + +function initLogger(){ + log.transports.file.level = "info"; + log.transports.file.resolvePath = () => { + const now = new Date(); + return path.join(app.getPath("logs"), `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}-v${app.getVersion()}.log`); + }; + + log.hooks.push((message) => { + + const filterMessage = (filter: string|RegExp, ...param: unknown[]): unknown[] => { + return param.map(data => { + + if(typeof data === "string"){ + return data.replaceAll(filter, "****"); + } + + if(data instanceof Error){ + data.message = data.message?.replaceAll(filter, "****"); + data.stack = data.stack?.replaceAll(filter, "****"); + } + + if(data instanceof Array){ + return filterMessage(filter, ...data); + } + + return data; + }); + } + + filterStrings.forEach(filter => { + if(filter && message.data.length){ + message.data = filterMessage(filter, ...message.data); + } + }); + + filterPatterns.forEach(filter => { + if(filter && message.data.length){ + message.data = filterMessage(filter, ...message.data); + } + }); + + return message; + }); + + log.catchErrors(); +} + +function getLogFilesEntries() { + try { + const logsFolder = app.getPath("logs"); + let logs = readdirSync(logsFolder, { withFileTypes: true }); + + logs = logs.filter(file => file.isFile() && path.extname(file.name) === ".log"); + + logs.sort((a, b) => { + const aStat = statSync(path.join(logsFolder, a.name)); + const bStat = statSync(path.join(logsFolder, b.name)); + return bStat.mtime.getTime() - aStat.mtime.getTime(); + }); + + return logs.map(file => { + const filePath = path.join(logsFolder, file.name); + const stat = statSync(filePath); + return { + path: filePath, + name: file.name, + stats: stat + }; + }); + } catch (err) { + log.error('Error while retrieving log files entries:', err); + return []; + } +} + +// keep only the last 5 logs +function deleteOldLogs(): void{ + try { + let logs = getLogFilesEntries(); + + logs = logs.slice(5); + + logs.forEach(file => { + try { + unlinkSync(file.path); + log.info(`Deleted log file: ${file.path}`); + } catch (err) { + log.error(`Error deleting file ${file.path}:`, err); + } + }); + } catch (err) { + log.error("Error while deleting old logs:", err); + } +} + +// Temporary function to delete logs before 2024-07-31 +function deleteOlestLogs(): void{ + // delete all logs before 2024-07-31 + const date = new Date(2024, 6, 31); // month is 0-based + const logs = getLogFilesEntries().filter(file => file.stats.mtime.getTime() < date.getTime()); + + logs.forEach(file => { + try { + unlinkSync(file.path); + log.info(`Deleted log file: ${file.path}`); + } catch (err) { + log.error(`Error deleting file ${file.path}:`, err); + } + }); +} diff --git a/src/renderer/components/modal/modal-types/bs-downgrade/enter-meta-token-modal.component.tsx b/src/renderer/components/modal/modal-types/bs-downgrade/enter-meta-token-modal.component.tsx index d18a694c..f2e2cbf7 100644 --- a/src/renderer/components/modal/modal-types/bs-downgrade/enter-meta-token-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/bs-downgrade/enter-meta-token-modal.component.tsx @@ -30,7 +30,7 @@ export const EnterMetaTokenModal: ModalComponent = ({resolver}) => { const cancel = () => { resolver({exitCode: ModalExitCode.CANCELED}); } - + return (

{t("modals.enter-meta-token.title")}

@@ -205,7 +205,7 @@ const PasswordInput = ({onChange, value}: {onChange: (value : {password: string, onChange({password: e.target.value, valid: isPasswordValid(e.target.value)})} value={value} type={showPassword ? "text" : "password"} name="password" id="password" placeholder={t("modals.enter-meta-token.body.password")} /> setShowPassword(prev => !prev)} /> - + ) } diff --git a/src/renderer/index.tsx b/src/renderer/index.tsx index befd5df7..d1bc3754 100644 --- a/src/renderer/index.tsx +++ b/src/renderer/index.tsx @@ -62,4 +62,12 @@ export function logRenderError(...params: unknown[]){ ipc.sendLazy("log-error", { args: params }); } +export function addFilterStringLog(str: string){ + ipc.sendLazy("add-filter-string", { args: str }); +} + +export function addFilterPatternLog(pattern: string){ + ipc.sendLazy("add-filter-pattern", { args: pattern }); +} + 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 6bc8bca2..704db8dc 100644 --- a/src/renderer/services/bs-version-download/oculus-downloader.service.ts +++ b/src/renderer/services/bs-version-download/oculus-downloader.service.ts @@ -11,6 +11,7 @@ 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"; export class OculusDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{ @@ -88,6 +89,8 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme return false; } + addFilterStringLog(tokenRes.data); + return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token: tokenRes.data })).then(() => true); })().then(res => { @@ -126,4 +129,4 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme return lastValueFrom(this.ipc.sendV2("bs-oculus-clear-auth-token")); } -} \ No newline at end of file +} diff --git a/src/renderer/services/bs-version-download/steam-downloader.service.ts b/src/renderer/services/bs-version-download/steam-downloader.service.ts index e679d0ca..5ef92526 100644 --- a/src/renderer/services/bs-version-download/steam-downloader.service.ts +++ b/src/renderer/services/bs-version-download/steam-downloader.service.ts @@ -13,9 +13,10 @@ import { DepotDownloaderErrorEvent, DepotDownloaderEvent, DepotDownloaderEventTy import { SteamMobileApproveModal } from "renderer/components/modal/modal-types/bs-downgrade/steam-mobile-approve-modal.component"; import { DownloaderServiceInterface } from "./bs-store-downloader.interface"; import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service"; +import { addFilterStringLog } from "renderer"; export class SteamDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{ - + private static instance: SteamDownloaderService; public static getInstance(): SteamDownloaderService { @@ -128,7 +129,7 @@ export class SteamDownloaderService extends AbstractBsDownloaderService implemen return this.notificationService.notifySuccess({title: "notifications.bs-download.success.titles.verification-finished"}); } return this.notificationService.notifySuccess({title: "notifications.bs-download.success.titles.download-success"}); - })); + })); return subs; } @@ -182,7 +183,7 @@ export class SteamDownloaderService extends AbstractBsDownloaderService implemen }), share({connector: () => new ReplaySubject(1)}) ); - + } private tryAutoDownloadBsVersion(downloadInfo: DownloadSteamInfo){ @@ -217,7 +218,7 @@ export class SteamDownloaderService extends AbstractBsDownloaderService implemen } this.progressBarService.show(this.downloadProgress$, true); - + const downloadPromise = (async () => { const haveDotNet = await this.isDotNet6Installed().catch(() => false); @@ -227,9 +228,9 @@ export class SteamDownloaderService extends AbstractBsDownloaderService implemen } const downloadInfo: DownloadSteamInfo = {bsVersion, isVerification} - + const autoDownload = await lastValueFrom(this.tryAutoDownloadBsVersion(downloadInfo)).then(() => true).catch(() => false); - + if(autoDownload){ return Promise.resolve(); } const qrCodeDownload$ = this.startQrCodeDownload(downloadInfo); @@ -242,6 +243,10 @@ export class SteamDownloaderService extends AbstractBsDownloaderService implemen return Promise.resolve(); } + if(loginRes?.data?.password){ + addFilterStringLog(loginRes.data.password); + } + if(loginRes.data.stay){ this.setSteamSession(loginRes.data.username); } From 499956d3b369033a1adb391590f3f5c3d6702197 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Thu, 1 Aug 2024 00:23:32 +0200 Subject: [PATCH 2/2] update to 1.4.8 --- release/app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/app/package.json b/release/app/package.json index 8cc11a8c..c63d66d2 100644 --- a/release/app/package.json +++ b/release/app/package.json @@ -1,6 +1,6 @@ { "name": "bs-manager", - "version": "1.4.7", + "version": "1.4.8", "description": "BSManager", "main": "./dist/main/main.js", "author": {