security: don't let renderer know custom vencord path
It's best not to let the renderer know about the system's file structure. In case of a vulnerability allowing arbitrary file writes, this would make it considerably easier to overwrite critical files
This commit is contained in:
+10
-5
@@ -19,7 +19,7 @@ import {
|
|||||||
shell
|
shell
|
||||||
} from "electron";
|
} from "electron";
|
||||||
import { readFileSync, watch } from "fs";
|
import { readFileSync, watch } from "fs";
|
||||||
import { readFile } from "fs/promises";
|
import { readFile, stat } from "fs/promises";
|
||||||
import { enableHardwareAcceleration } from "main";
|
import { enableHardwareAcceleration } from "main";
|
||||||
import { release } from "os";
|
import { release } from "os";
|
||||||
import { join } from "path";
|
import { join } from "path";
|
||||||
@@ -91,8 +91,15 @@ handle(IpcEvents.RELAUNCH, async () => {
|
|||||||
app.exit();
|
app.exit();
|
||||||
});
|
});
|
||||||
|
|
||||||
handle(IpcEvents.SHOW_ITEM_IN_FOLDER, (_, path) => {
|
handleSync(IpcEvents.IS_USING_CUSTOM_VENCORD_DIR, () => !!State.store.vencordDir);
|
||||||
shell.showItemInFolder(path);
|
handle(IpcEvents.SHOW_CUSTOM_VENCORD_DIR, async () => {
|
||||||
|
const { vencordDir } = State.store;
|
||||||
|
if (!vencordDir) return;
|
||||||
|
|
||||||
|
const stats = await stat(vencordDir);
|
||||||
|
if (!stats.isDirectory()) return;
|
||||||
|
|
||||||
|
shell.openPath(vencordDir);
|
||||||
});
|
});
|
||||||
|
|
||||||
function getWindow(e: IpcMainInvokeEvent, key?: string) {
|
function getWindow(e: IpcMainInvokeEvent, key?: string) {
|
||||||
@@ -133,8 +140,6 @@ handle(IpcEvents.SPELLCHECK_ADD_TO_DICTIONARY, (e, word: string) => {
|
|||||||
e.sender.session.addWordToSpellCheckerDictionary(word);
|
e.sender.session.addWordToSpellCheckerDictionary(word);
|
||||||
});
|
});
|
||||||
|
|
||||||
handleSync(IpcEvents.GET_VENCORD_DIR, e => (e.returnValue = State.store.vencordDir));
|
|
||||||
|
|
||||||
handle(IpcEvents.SELECT_VENCORD_DIR, async (_e, value?: null) => {
|
handle(IpcEvents.SELECT_VENCORD_DIR, async (_e, value?: null) => {
|
||||||
if (value === null) {
|
if (value === null) {
|
||||||
delete State.store.vencordDir;
|
delete State.store.vencordDir;
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ export const VesktopNative = {
|
|||||||
disable: () => invoke<void>(IpcEvents.DISABLE_AUTOSTART)
|
disable: () => invoke<void>(IpcEvents.DISABLE_AUTOSTART)
|
||||||
},
|
},
|
||||||
fileManager: {
|
fileManager: {
|
||||||
showItemInFolder: (path: string) => invoke<void>(IpcEvents.SHOW_ITEM_IN_FOLDER, path),
|
isUsingCustomVencordDir: () => sendSync<boolean>(IpcEvents.IS_USING_CUSTOM_VENCORD_DIR),
|
||||||
getVencordDir: () => sendSync<string | undefined>(IpcEvents.GET_VENCORD_DIR),
|
showCustomVencordDir: () => invoke<void>(IpcEvents.SHOW_CUSTOM_VENCORD_DIR),
|
||||||
selectVencordDir: (value?: null) => invoke<"cancelled" | "invalid" | "ok">(IpcEvents.SELECT_VENCORD_DIR, value),
|
selectVencordDir: (value?: null) => invoke<"cancelled" | "invalid" | "ok">(IpcEvents.SELECT_VENCORD_DIR, value),
|
||||||
chooseUserAsset: (asset: string, value?: null) =>
|
chooseUserAsset: (asset: string, value?: null) =>
|
||||||
invoke<"cancelled" | "invalid" | "ok" | "failed">(IpcEvents.CHOOSE_USER_ASSET, asset, value)
|
invoke<"cancelled" | "invalid" | "ok" | "failed">(IpcEvents.CHOOSE_USER_ASSET, asset, value)
|
||||||
|
|||||||
@@ -56,21 +56,21 @@ function openDeveloperOptionsModal(settings: Settings) {
|
|||||||
|
|
||||||
const VencordLocationPicker: SettingsComponent = ({ settings }) => {
|
const VencordLocationPicker: SettingsComponent = ({ settings }) => {
|
||||||
const forceUpdate = useForceUpdater();
|
const forceUpdate = useForceUpdater();
|
||||||
const vencordDir = VesktopNative.fileManager.getVencordDir();
|
const usingCustomVencordDir = VesktopNative.fileManager.isUsingCustomVencordDir();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Paragraph>
|
<Paragraph>
|
||||||
Vencord files are loaded from{" "}
|
Vencord files are loaded from{" "}
|
||||||
{vencordDir ? (
|
{usingCustomVencordDir ? (
|
||||||
<TextButton
|
<TextButton
|
||||||
variant="link"
|
variant="link"
|
||||||
onClick={e => {
|
onClick={e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
VesktopNative.fileManager.showItemInFolder(vencordDir!);
|
VesktopNative.fileManager.showCustomVencordDir();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{vencordDir}
|
a custom location
|
||||||
</TextButton>
|
</TextButton>
|
||||||
) : (
|
) : (
|
||||||
"the default location"
|
"the default location"
|
||||||
|
|||||||
@@ -23,11 +23,11 @@ export const enum IpcEvents {
|
|||||||
MINIMIZE = "VCD_MINIMIZE",
|
MINIMIZE = "VCD_MINIMIZE",
|
||||||
MAXIMIZE = "VCD_MAXIMIZE",
|
MAXIMIZE = "VCD_MAXIMIZE",
|
||||||
|
|
||||||
SHOW_ITEM_IN_FOLDER = "VCD_SHOW_ITEM_IN_FOLDER",
|
|
||||||
GET_SETTINGS = "VCD_GET_SETTINGS",
|
GET_SETTINGS = "VCD_GET_SETTINGS",
|
||||||
SET_SETTINGS = "VCD_SET_SETTINGS",
|
SET_SETTINGS = "VCD_SET_SETTINGS",
|
||||||
|
|
||||||
GET_VENCORD_DIR = "VCD_GET_VENCORD_DIR",
|
IS_USING_CUSTOM_VENCORD_DIR = "VCD_IS_USING_CUSTOM_VENCORD_DIR",
|
||||||
|
SHOW_CUSTOM_VENCORD_DIR = "VCD_SHOW_CUSTOM_VENCORD_DIR",
|
||||||
SELECT_VENCORD_DIR = "VCD_SELECT_VENCORD_DIR",
|
SELECT_VENCORD_DIR = "VCD_SELECT_VENCORD_DIR",
|
||||||
|
|
||||||
UPDATER_IS_OUTDATED = "VCD_UPDATER_IS_OUTDATED",
|
UPDATER_IS_OUTDATED = "VCD_UPDATER_IS_OUTDATED",
|
||||||
|
|||||||
Reference in New Issue
Block a user