import { ProxyConfig } from 'megalodon' ; 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 ) { this . preferences = new Preferences ( preferencesDBPath ) ; } public setSystemProxy ( proxy ) { this . systemProxy = proxy ; } public async forMastodon ( ) { 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 } ; } } } public async getConfig ( ) { const conf = await this . preferences . load ( ) ; 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 ( ) { 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 = { protocol : protocol , host : result [ 2 ] , port : result [ 3 ] , username : '' , password : '' } ; return manual ; } }