set sysproxy bypass

This commit is contained in:
pompurin404 2024-08-07 17:36:47 +08:00
parent 95ae550216
commit ddcb73016e
No known key found for this signature in database
2 changed files with 114 additions and 7 deletions

View File

@ -3,6 +3,7 @@ import { getAppConfig, getControledMihomoConfig } from '../config'
import { pacPort } from './server' import { pacPort } from './server'
let defaultBypass: string[] let defaultBypass: string[]
if (process.platform === 'linux') if (process.platform === 'linux')
defaultBypass = ['localhost', '127.0.0.1', '192.168.0.0/16', '10.0.0.0/8', '172.16.0.0/12', '::1'] defaultBypass = ['localhost', '127.0.0.1', '192.168.0.0/16', '10.0.0.0/8', '172.16.0.0/12', '::1']
if (process.platform === 'darwin') if (process.platform === 'darwin')

View File

@ -4,9 +4,49 @@ 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 PacEditorViewer from '@renderer/components/sysproxy/pac-editor-modal' import PacEditorViewer from '@renderer/components/sysproxy/pac-editor-modal'
import { useAppConfig } from '@renderer/hooks/use-app-config' import { useAppConfig } from '@renderer/hooks/use-app-config'
import { platform } from '@renderer/utils/init'
import { triggerSysProxy } from '@renderer/utils/ipc' import { triggerSysProxy } from '@renderer/utils/ipc'
import { Key, useState } from 'react' import { Key, useState } from 'react'
import React from 'react' import React from 'react'
import { MdDeleteForever } from 'react-icons/md'
const defaultBypass: string[] =
platform === 'linux'
? ['localhost', '127.0.0.1', '192.168.0.0/16', '10.0.0.0/8', '172.16.0.0/12', '::1']
: platform === 'darwin'
? [
'127.0.0.1',
'192.168.0.0/16',
'10.0.0.0/8',
'172.16.0.0/12',
'localhost',
'*.local',
'*.crashlytics.com',
'<local>'
]
: [
'localhost',
'127.*',
'192.168.*',
'10.*',
'172.16.*',
'172.17.*',
'172.18.*',
'172.19.*',
'172.20.*',
'172.21.*',
'172.22.*',
'172.23.*',
'172.24.*',
'172.25.*',
'172.26.*',
'172.27.*',
'172.28.*',
'172.29.*',
'172.30.*',
'172.31.*',
'<local>'
]
const defaultPacScript = ` const defaultPacScript = `
function FindProxyForURL(url, host) { function FindProxyForURL(url, host) {
@ -16,10 +56,34 @@ function FindProxyForURL(url, host) {
const Sysproxy: React.FC = () => { const Sysproxy: React.FC = () => {
const { appConfig, patchAppConfig } = useAppConfig() const { appConfig, patchAppConfig } = useAppConfig()
const { sysProxy } = appConfig || { sysProxy: { enable: false } } const { sysProxy } = appConfig || ({ sysProxy: { enable: false } } as IAppConfig)
const [values, setValues] = useState({
enable: sysProxy.enable,
host: sysProxy.host ?? '',
bypass: sysProxy.bypass ?? defaultBypass,
mode: sysProxy.mode ?? 'manual',
pacScript: sysProxy.pacScript ?? defaultPacScript
})
const [values, setValues] = useState<ISysProxyConfig>(sysProxy)
const [openPacEditor, setOpenPacEditor] = useState(false) const [openPacEditor, setOpenPacEditor] = useState(false)
const handleBypassChange = (value: string, index: number): void => {
const newBypass = [...values.bypass]
if (index === newBypass.length) {
if (value.trim() !== '') {
newBypass.push(value)
}
} else {
if (value.trim() === '') {
newBypass.splice(index, 1)
} else {
newBypass[index] = value
}
}
setValues({ ...values, bypass: newBypass })
}
const onSave = async (): Promise<void> => { const onSave = async (): Promise<void> => {
// check valid TODO // check valid TODO
await patchAppConfig({ sysProxy: values }) await patchAppConfig({ sysProxy: values })
@ -74,11 +138,53 @@ const Sysproxy: React.FC = () => {
<Tab className="select-none" key="auto" title="PAC" /> <Tab className="select-none" key="auto" title="PAC" />
</Tabs> </Tabs>
</SettingItem> </SettingItem>
<SettingItem title="代理模式">
<Button size="sm" onPress={() => setOpenPacEditor(true)} variant="bordered"> {values.mode === 'auto' && (
PAC脚本 <SettingItem title="代理模式">
</Button> <Button size="sm" onPress={() => setOpenPacEditor(true)} variant="bordered">
</SettingItem> PAC脚本
</Button>
</SettingItem>
)}
{values.mode === 'manual' && (
<>
<SettingItem title="添加默认代理绕过" divider>
<Button
size="sm"
onPress={() => {
setValues({ ...values, bypass: defaultBypass.concat(values.bypass) })
}}
>
</Button>
</SettingItem>
<div className="flex flex-col items-stretch">
<h3 className="select-none mb-2"></h3>
{[...values.bypass, ''].map((domain, index) => (
<div key={index} className="mb-2 flex">
<Input
fullWidth
size="sm"
placeholder="例: *.baidu.com"
value={domain}
onValueChange={(v) => handleBypassChange(v, index)}
/>
{index < values.bypass.length && (
<Button
className="ml-2"
size="sm"
variant="flat"
color="warning"
onClick={() => handleBypassChange('', index)}
>
<MdDeleteForever className="text-lg" />
</Button>
)}
</div>
))}
</div>
</>
)}
</SettingCard> </SettingCard>
</BasePage> </BasePage>
) )