Compare commits

...

9 Commits

Author SHA1 Message Date
MathieuG-P 499956d3b3 update to 1.4.8 2024-08-01 00:23:32 +02:00
MathieuG-P c313685f6f [chore] filter potential oculus token in logs 2024-08-01 00:20:02 +02:00
MathieuG-P 88a1691d4b bumb to 1.4.7 2024-03-13 15:04:45 +01:00
MathieuG-P cdd25b458c Merge pull request #436 from Zagrios/bugfix/downloading-models-with-bsm-no-longer-works
[bugfix] fix downloading models not working
2024-03-13 14:55:42 +01:00
MathieuG-P 30a53c013f [bugfix] fix downloading models not working
Add useragent to requests to not being rejected
2024-03-13 14:51:51 +01:00
MathieuG-P 1db3db7bdd Merge branch 'master' of https://github.com/Zagrios/bs-manager 2024-03-07 18:09:18 +01:00
MathieuG-P e0e647b22a add version 1.35.0 2024-03-07 18:08:15 +01:00
MathieuG-P 69914e3063 Merge pull request #435 from fllppi/bugfix/fixed-typo-in-german-translation/434
fixed typo in german translation for map installation
2024-03-07 05:59:44 +01:00
Flippi 0c2624ed37 fixed typo in german translation for map installation 2024-03-06 21:58:06 +01:00
10 changed files with 199 additions and 32 deletions
+9
View File
@@ -699,5 +699,14 @@
"ReleaseImg": "https://clan.cloudflare.steamstatic.com/images/32055887/e7c75bdfc76d00713adc3fbdf221c9ce8ab3620d.png", "ReleaseImg": "https://clan.cloudflare.steamstatic.com/images/32055887/e7c75bdfc76d00713adc3fbdf221c9ce8ab3620d.png",
"ReleaseDate": "1708091473", "ReleaseDate": "1708091473",
"year": "2024" "year": "2024"
},
{
"BSVersion": "1.35.0",
"BSManifest": "1490986193481243578",
"OculusBinaryId": "6720809361352119",
"ReleaseURL": "https://store.steampowered.com/news/app/620980/view/4142820264819707009",
"ReleaseImg": "https://clan.cloudflare.steamstatic.com/images//32055887/9a141be5c44ca6fc81551a2c7e7f28407df413ed.png",
"ReleaseDate": "1709831174",
"year": "2024"
} }
] ]
+1 -1
View File
@@ -459,7 +459,7 @@
}, },
"maps": { "maps": {
"one-click-install": { "one-click-install": {
"success": "Map installation abegschlossen", "success": "Map installation abgeschlossen",
"error": "Ein Fehler ist aufgetreten während der installation der Map" "error": "Ein Fehler ist aufgetreten während der installation der Map"
} }
}, },
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "bs-manager", "name": "bs-manager",
"version": "1.4.4", "version": "1.4.6",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "bs-manager", "name": "bs-manager",
"version": "1.4.4", "version": "1.4.6",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "bs-manager", "name": "bs-manager",
"version": "1.4.6", "version": "1.4.8",
"description": "BSManager", "description": "BSManager",
"main": "./dist/main/main.js", "main": "./dist/main/main.js",
"author": { "author": {
+129 -6
View File
@@ -21,16 +21,20 @@ import { BSLauncherService } from "./services/bs-launcher/bs-launcher.service";
import { IpcRequest } from "shared/models/ipc"; import { IpcRequest } from "shared/models/ipc";
import { LivShortcut } from "./services/liv/liv-shortcut.service"; import { LivShortcut } from "./services/liv/liv-shortcut.service";
import { SteamLauncherService } from "./services/bs-launcher/steam-launcher.service"; import { SteamLauncherService } from "./services/bs-launcher/steam-launcher.service";
import { readdirSync, statSync, unlinkSync } from "fs-extra";
export const filterStrings = new Set<string>();
export const filterPatterns = new Set<RegExp>();
const isDebug = process.env.NODE_ENV === "development" || process.env.DEBUG_PROD === "true"; const isDebug = process.env.NODE_ENV === "development" || process.env.DEBUG_PROD === "true";
log.transports.file.level = "info"; // Filter all occulus tokens
log.transports.file.resolvePath = () => { filterPatterns.add(/FRL\S{10,}/g);
const now = new Date();
return path.join(app.getPath("logs"), `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}-v${app.getVersion()}.log`); initLogger();
}; deleteOlestLogs();
deleteOldLogs();
log.catchErrors();
if (process.env.NODE_ENV === "production") { if (process.env.NODE_ENV === "production") {
const sourceMapSupport = require("source-map-support"); const sourceMapSupport = require("source-map-support");
@@ -110,5 +114,124 @@ if (!gotTheLock) {
log.error(args?.args); log.error(args?.args);
}); });
ipcMain.on("add-filter-string", (_, args: IpcRequest<string>) => {
filterStrings.add(args?.args);
});
ipcMain.on("add-filter-pattern", (_, args: IpcRequest<string>) => {
filterPatterns.add(new RegExp(args?.args));
});
}).catch(log.error); }).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);
}
});
}
+26 -7
View File
@@ -1,9 +1,11 @@
import { Agent, get } from "https"; import { Agent, RequestOptions, get } from "https";
import { createWriteStream, unlink } from "fs"; import { createWriteStream, unlink } from "fs";
import { Progression } from "main/helpers/fs.helpers"; import { Progression } from "main/helpers/fs.helpers";
import { Observable, shareReplay, tap } from "rxjs"; import { Observable, shareReplay, tap } from "rxjs";
import log from "electron-log"; import log from "electron-log";
import fetch, { RequestInfo, RequestInit } from "node-fetch"; import fetch, { RequestInfo, RequestInit } from "node-fetch";
import { app } from "electron";
import os from "os";
export class RequestService { export class RequestService {
private static instance: RequestService; private static instance: RequestService;
@@ -15,16 +17,33 @@ export class RequestService {
return RequestService.instance; return RequestService.instance;
} }
private constructor() {} private readonly defaultRequestInit: RequestInit;
private get ipv4Agent(){ private constructor() {
return new Agent({ family: 4 });
this.defaultRequestInit = {
headers: {
"User-Agent": `BSManager/${app.getVersion()} (${os.type()} ${os.release()})`
},
agent: new Agent({ family: 4 }),
};
}
private getInitWithOptions(options?: RequestInit): RequestInit {
return { ...this.defaultRequestInit, ...(options || {}) };
}
private requestOptionsFromDefaultInit(): RequestOptions {
return {
headers: this.defaultRequestInit.headers as Record<string, string>,
agent: this.defaultRequestInit.agent as Agent,
};
} }
public async getJSON<T = unknown>(url: RequestInfo, options?: RequestInit): Promise<T> { public async getJSON<T = unknown>(url: RequestInfo, options?: RequestInit): Promise<T> {
try { try {
const response = await fetch(url, {...options, agent: this.ipv4Agent}); const response = await fetch(url, this.getInitWithOptions(options));
if (!response.ok) { if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status} ${url}`); throw new Error(`HTTP error! status: ${response.status} ${url}`);
@@ -50,7 +69,7 @@ export class RequestService {
}); });
file.on("error", err => unlink(dest, () => subscriber.error(err))); file.on("error", err => unlink(dest, () => subscriber.error(err)));
const req = get(url, { agent: this.ipv4Agent }, res => { const req = get(url, this.requestOptionsFromDefaultInit(), res => {
progress.total = parseInt(res.headers?.["content-length"] || "0", 10); progress.total = parseInt(res.headers?.["content-length"] || "0", 10);
res.on("data", chunk => { res.on("data", chunk => {
@@ -77,7 +96,7 @@ export class RequestService {
const allChunks: Buffer[] = []; const allChunks: Buffer[] = [];
const req = get(url, { agent: this.ipv4Agent }, res => { const req = get(url, this.requestOptionsFromDefaultInit(), res => {
progress.total = parseInt(res.headers?.["content-length"] || "0", 10); progress.total = parseInt(res.headers?.["content-length"] || "0", 10);
res.on("data", chunk => { res.on("data", chunk => {
+8
View File
@@ -62,4 +62,12 @@ export function logRenderError(...params: unknown[]){
ipc.sendLazy("log-error", { args: params }); 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 });
}
@@ -11,6 +11,7 @@ import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service";
import { DownloadInfo } from "main/services/bs-version-download/bs-steam-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 { 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 { 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{ export class OculusDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{
@@ -88,6 +89,8 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme
return false; return false;
} }
addFilterStringLog(tokenRes.data);
return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token: tokenRes.data })).then(() => true); return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token: tokenRes.data })).then(() => true);
})().then(res => { })().then(res => {
@@ -13,6 +13,7 @@ import { DepotDownloaderErrorEvent, DepotDownloaderEvent, DepotDownloaderEventTy
import { SteamMobileApproveModal } from "renderer/components/modal/modal-types/bs-downgrade/steam-mobile-approve-modal.component"; import { SteamMobileApproveModal } from "renderer/components/modal/modal-types/bs-downgrade/steam-mobile-approve-modal.component";
import { DownloaderServiceInterface } from "./bs-store-downloader.interface"; import { DownloaderServiceInterface } from "./bs-store-downloader.interface";
import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service"; import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service";
import { addFilterStringLog } from "renderer";
export class SteamDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{ export class SteamDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{
@@ -242,6 +243,10 @@ export class SteamDownloaderService extends AbstractBsDownloaderService implemen
return Promise.resolve(); return Promise.resolve();
} }
if(loginRes?.data?.password){
addFilterStringLog(loginRes.data.password);
}
if(loginRes.data.stay){ if(loginRes.data.stay){
this.setSteamSession(loginRes.data.username); this.setSteamSession(loginRes.data.username);
} }