2019-10-27 09:22:44 +01:00
|
|
|
import { ProxyConfig } from 'megalodon'
|
2019-10-27 05:29:49 +01:00
|
|
|
import { ProxySource, ManualProxy, ProxyProtocol } from '~/src/types/proxy'
|
|
|
|
import Preferences from './preferences'
|
|
|
|
|
|
|
|
export default class ProxyConfiguration {
|
|
|
|
public preferences: Preferences
|
|
|
|
public systemProxy: string | null = null
|
|
|
|
|
|
|
|
constructor(preferencesDBPath: string) {
|
|
|
|
this.preferences = new Preferences(preferencesDBPath)
|
|
|
|
}
|
|
|
|
|
|
|
|
public setSystemProxy(proxy: string) {
|
|
|
|
this.systemProxy = proxy
|
|
|
|
}
|
|
|
|
|
2019-10-27 09:22:44 +01:00
|
|
|
public async forMastodon(): Promise<false | ProxyConfig> {
|
|
|
|
const proxy = await this.getConfig()
|
|
|
|
if (!proxy) {
|
|
|
|
return false
|
|
|
|
} else {
|
|
|
|
let protocol = ProxyProtocol.http
|
|
|
|
if (proxy.protocol !== '') {
|
|
|
|
protocol = proxy.protocol
|
|
|
|
}
|
|
|
|
if (proxy.username.length > 0) {
|
|
|
|
return {
|
|
|
|
host: proxy.host,
|
|
|
|
port: parseInt(proxy.port, 10),
|
|
|
|
protocol: protocol,
|
|
|
|
auth: {
|
|
|
|
username: proxy.username,
|
|
|
|
password: proxy.password
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return {
|
|
|
|
host: proxy.host,
|
|
|
|
port: parseInt(proxy.port, 10),
|
|
|
|
protocol: protocol
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-27 05:29:49 +01:00
|
|
|
public async getConfig(): Promise<false | ManualProxy> {
|
2019-12-10 16:08:45 +01:00
|
|
|
const conf = await this.preferences.load()
|
2019-10-27 05:29:49 +01:00
|
|
|
const source = conf.proxy.source as ProxySource
|
|
|
|
switch (source) {
|
|
|
|
case ProxySource.no:
|
|
|
|
return false
|
|
|
|
case ProxySource.system:
|
|
|
|
if (this.systemProxy) {
|
|
|
|
return this.parseSystemProxy()
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
case ProxySource.manual:
|
|
|
|
return conf.proxy.manualProxyConfig
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public parseSystemProxy(): ManualProxy | false {
|
|
|
|
if (!this.systemProxy) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if (this.systemProxy === 'DIRECT') {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
const result = this.systemProxy.match(/^([A-Z0-9]+)\s+([a-z0-9-_.]+):([0-9]+)$/)
|
|
|
|
if (!result || result.length !== 4) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
let protocol = ProxyProtocol.http
|
|
|
|
switch (result[1]) {
|
|
|
|
case 'PROXY':
|
|
|
|
protocol = ProxyProtocol.http
|
|
|
|
break
|
|
|
|
case 'SOCKS4':
|
|
|
|
protocol = ProxyProtocol.socks4
|
|
|
|
break
|
|
|
|
case 'SOCKS4A':
|
|
|
|
protocol = ProxyProtocol.socks4a
|
|
|
|
break
|
|
|
|
case 'SOCKS5':
|
|
|
|
protocol = ProxyProtocol.socks5
|
|
|
|
break
|
|
|
|
case 'SOCKS5H':
|
|
|
|
protocol = ProxyProtocol.socks5h
|
|
|
|
break
|
|
|
|
case 'SOCKS':
|
|
|
|
protocol = ProxyProtocol.socks5
|
|
|
|
break
|
|
|
|
}
|
|
|
|
const manual: ManualProxy = {
|
|
|
|
protocol: protocol,
|
|
|
|
host: result[2],
|
|
|
|
port: result[3],
|
|
|
|
username: '',
|
|
|
|
password: ''
|
|
|
|
}
|
|
|
|
return manual
|
|
|
|
}
|
|
|
|
}
|