supports manual grant core for macos

This commit is contained in:
pompurin404 2024-08-14 13:39:17 +08:00
parent 7e30114ef2
commit a3c129f9e1
No known key found for this signature in database
4 changed files with 43 additions and 4 deletions

View File

@ -19,7 +19,7 @@ let retry = 10
export async function startCore(): Promise<void> { export async function startCore(): Promise<void> {
const { core = 'mihomo' } = await getAppConfig() const { core = 'mihomo' } = await getAppConfig()
const corePath = mihomoCorePath(core) const corePath = mihomoCorePath(core)
await grantCorePermition(corePath) await autoGrantCorePermition(corePath)
await generateProfile() await generateProfile()
await checkProfile() await checkProfile()
stopCore() stopCore()
@ -90,7 +90,7 @@ async function checkProfile(): Promise<void> {
} }
} }
export async function grantCorePermition(corePath: string): Promise<void> { export async function autoGrantCorePermition(corePath: string): Promise<void> {
const { encryptedPassword } = await getAppConfig() const { encryptedPassword } = await getAppConfig()
const execPromise = promisify(exec) const execPromise = promisify(exec)
if (encryptedPassword && isEncryptionAvailable()) { if (encryptedPassword && isEncryptionAvailable()) {
@ -117,6 +117,17 @@ export async function grantCorePermition(corePath: string): Promise<void> {
} }
} }
export async function manualGrantCorePermition(): Promise<void> {
const { core = 'mihomo' } = await getAppConfig()
const corePath = mihomoCorePath(core)
const execPromise = promisify(exec)
if (process.platform === 'darwin') {
const shell = `chown root:admin ${corePath}\nchmod +sx ${corePath}`
const command = `do shell script "${shell}" with administrator privileges`
await execPromise(`osascript -e '${command}'`)
}
}
export function isEncryptionAvailable(): boolean { export function isEncryptionAvailable(): boolean {
return safeStorage.isEncryptionAvailable() return safeStorage.isEncryptionAvailable()
} }

View File

@ -44,7 +44,7 @@ import {
setOverride, setOverride,
updateOverrideItem updateOverrideItem
} from '../config' } from '../config'
import { isEncryptionAvailable, restartCore } from '../core/manager' import { isEncryptionAvailable, manualGrantCorePermition, restartCore } from '../core/manager'
import { triggerSysProxy } from '../resolve/sysproxy' import { triggerSysProxy } from '../resolve/sysproxy'
import { checkUpdate } from '../resolve/autoUpdater' import { checkUpdate } from '../resolve/autoUpdater'
import { exePath, mihomoCorePath, mihomoWorkConfigPath, resourcesDir } from './dirs' import { exePath, mihomoCorePath, mihomoWorkConfigPath, resourcesDir } from './dirs'
@ -128,6 +128,7 @@ export function registerIpcMainHandlers(): void {
ipcMain.handle('triggerSysProxy', (_e, enable) => ipcErrorWrapper(triggerSysProxy)(enable)) ipcMain.handle('triggerSysProxy', (_e, enable) => ipcErrorWrapper(triggerSysProxy)(enable))
ipcMain.handle('isEncryptionAvailable', isEncryptionAvailable) ipcMain.handle('isEncryptionAvailable', isEncryptionAvailable)
ipcMain.handle('encryptString', (_e, str) => safeStorage.encryptString(str)) ipcMain.handle('encryptString', (_e, str) => safeStorage.encryptString(str))
ipcMain.handle('manualGrantCorePermition', ipcErrorWrapper(manualGrantCorePermition))
ipcMain.handle('getFilePath', (_e, ext) => getFilePath(ext)) ipcMain.handle('getFilePath', (_e, ext) => getFilePath(ext))
ipcMain.handle('readTextFile', (_e, filePath) => ipcErrorWrapper(readTextFile)(filePath)) ipcMain.handle('readTextFile', (_e, filePath) => ipcErrorWrapper(readTextFile)(filePath))
ipcMain.handle('getRuntimeConfigStr', ipcErrorWrapper(getRuntimeConfigStr)) ipcMain.handle('getRuntimeConfigStr', ipcErrorWrapper(getRuntimeConfigStr))

View File

@ -3,7 +3,7 @@ import BasePage from '@renderer/components/base/base-page'
import SettingCard from '@renderer/components/base/base-setting-card' import SettingCard from '@renderer/components/base/base-setting-card'
import SettingItem from '@renderer/components/base/base-setting-item' import SettingItem from '@renderer/components/base/base-setting-item'
import { useControledMihomoConfig } from '@renderer/hooks/use-controled-mihomo-config' import { useControledMihomoConfig } from '@renderer/hooks/use-controled-mihomo-config'
import { restartCore, setupFirewall } from '@renderer/utils/ipc' import { manualGrantCorePermition, restartCore, setupFirewall } from '@renderer/utils/ipc'
import { platform } from '@renderer/utils/init' import { platform } from '@renderer/utils/init'
import React, { Key, useState } from 'react' import React, { Key, useState } from 'react'
@ -88,6 +88,29 @@ const Tun: React.FC = () => {
</Button> </Button>
</SettingItem> </SettingItem>
)} )}
{platform === 'darwin' && (
<SettingItem title="手动授权内核" divider>
<Button
size="sm"
color="primary"
isLoading={loading}
onPress={async () => {
setLoading(true)
try {
await manualGrantCorePermition()
new Notification('内核授权成功')
await restartCore()
} catch (e) {
alert(e)
} finally {
setLoading(false)
}
}}
>
</Button>
</SettingItem>
)}
<SettingItem title="Tun 模式堆栈" divider> <SettingItem title="Tun 模式堆栈" divider>
<Tabs <Tabs
size="sm" size="sm"

View File

@ -205,6 +205,10 @@ export async function encryptString(str: string): Promise<Buffer> {
return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('encryptString', str)) return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('encryptString', str))
} }
export async function manualGrantCorePermition(): Promise<void> {
return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('manualGrantCorePermition'))
}
export async function getFilePath(ext: string[]): Promise<string[] | undefined> { export async function getFilePath(ext: string[]): Promise<string[] | undefined> {
return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('getFilePath', ext)) return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('getFilePath', ext))
} }