Start work on proxies

jh-changes
Jonathan Hodgson 5 years ago
parent 24f893c043
commit 207cdebb2e
  1. 3
      manifest.json
  2. 4
      src/background/controllers/CommandController.ts
  3. 1
      src/background/domains/CommandDocs.ts
  4. 33
      src/background/repositories/BrowserSettingRepository.ts
  5. 9
      src/background/usecases/CommandUseCase.ts
  6. 32
      src/background/usecases/CompletionsUseCase.ts
  7. 6
      src/shared/settings/Settings.ts

@ -34,7 +34,8 @@
"clipboardRead", "clipboardRead",
"notifications", "notifications",
"bookmarks", "bookmarks",
"browserSettings" "browserSettings",
"proxy"
], ],
"web_accessible_resources": [ "web_accessible_resources": [
"build/console.html", "build/console.html",

@ -47,6 +47,8 @@ export default class CommandController {
return this.completionsUseCase.queryBdeleteForce(name, keywords); return this.completionsUseCase.queryBdeleteForce(name, keywords);
case 'set': case 'set':
return this.completionsUseCase.querySet(name, keywords); return this.completionsUseCase.querySet(name, keywords);
case 'proxy':
return this.completionsUseCase.queryProxy(name, keywords);
} }
return Promise.resolve([]); return Promise.resolve([]);
} }
@ -99,6 +101,8 @@ export default class CommandController {
case 'h': case 'h':
case 'help': case 'help':
return this.commandIndicator.help(); return this.commandIndicator.help();
case 'proxy':
return this.commandIndicator.proxy(keywords);
} }
throw new Error(words[0] + ' command is not defined'); throw new Error(words[0] + ' command is not defined');
} }

@ -9,4 +9,5 @@ export default {
quit: 'Close the current tab', quit: 'Close the current tab',
quitall: 'Close all tabs', quitall: 'Close all tabs',
help: 'Open Vim Vixen help in new tab', help: 'Open Vim Vixen help in new tab',
proxy: 'Set a proxy'
} as {[key: string]: string}; } as {[key: string]: string};

@ -17,6 +17,17 @@ declare namespace browser.browserSettings.homepageOverride {
function get(param: object): Promise<BrowserSettings>; function get(param: object): Promise<BrowserSettings>;
} }
declare namespace browser.proxy.settings {
type BrowserSettings = {
value: string;
};
function get(param: object): Promise<BrowserSettings>;
function set(param: object): Promise<any>;
function clear(param: object): Promise<any>;
}
@injectable() @injectable()
export default class BrowserSettingRepository { export default class BrowserSettingRepository {
async getHomepageUrls(): Promise<string[]> { async getHomepageUrls(): Promise<string[]> {
@ -24,3 +35,25 @@ export default class BrowserSettingRepository {
return value.split('|').map(urls.normalizeUrl); return value.split('|').map(urls.normalizeUrl);
} }
} }
export class ProxyRepository {
private clearProxySettings(): Promise<any>{
return browser.proxy.settings.clear({});
}
private setProxySettings(address: string): Promise<any>{
return browser.proxy.settings.set({value: {
proxyType: "manual",
http: address,
httpProxyAll: true
}});
}
set(address: string): Promise<any> {
if( address.toLowerCase() == 'none' ){
return this.clearProxySettings();
}
return this.setProxySettings(address);
}
}

@ -10,6 +10,7 @@ import BookmarkRepository from '../repositories/BookmarkRepository';
import ConsoleClient from '../infrastructures/ConsoleClient'; import ConsoleClient from '../infrastructures/ConsoleClient';
import ContentMessageClient from '../infrastructures/ContentMessageClient'; import ContentMessageClient from '../infrastructures/ContentMessageClient';
import RepeatUseCase from '../usecases/RepeatUseCase'; import RepeatUseCase from '../usecases/RepeatUseCase';
import { ProxyRepository } from '../repositories/BrowserSettingRepository';
@injectable() @injectable()
export default class CommandIndicator { export default class CommandIndicator {
@ -22,6 +23,7 @@ export default class CommandIndicator {
private consoleClient: ConsoleClient, private consoleClient: ConsoleClient,
private contentMessageClient: ContentMessageClient, private contentMessageClient: ContentMessageClient,
private repeatUseCase: RepeatUseCase, private repeatUseCase: RepeatUseCase,
private proxyRepository: ProxyRepository,
) { ) {
} }
@ -142,6 +144,13 @@ export default class CommandIndicator {
return this.helpPresenter.open(); return this.helpPresenter.open();
} }
async proxy(keywords: string): Promise<any> {
if (keywords.length === 0) {
return this.proxyRepository.set('none');
}
return this.proxyRepository.set(keywords);
}
private async urlOrSearch(keywords: string): Promise<any> { private async urlOrSearch(keywords: string): Promise<any> {
let settings = await this.settingRepository.get(); let settings = await this.settingRepository.get();
return urls.searchUrl(keywords, settings.search); return urls.searchUrl(keywords, settings.search);

@ -217,4 +217,36 @@ export default class CompletionsUseCase {
url: page.url url: page.url
})); }));
} }
async queryProxyItems(name: string, keywords: string) {
let proxies = [{
caption: "burp",
url: "127.0.0.1:8080"
},{
caption: "none",
url: "none"
} ].filter(proxy=>{
if( keywords == '' ){ return true; }
if( proxy.caption.startsWith(keywords) ){ return true; }
if( proxy.url.startsWith(keywords) ){ return true; }
return false;
});
return proxies;
return proxies.map(proxy => ({
caption: proxy.caption,
content: name + ' ' + proxy.url,
url: proxy.url
}));
}
async queryProxy(name: string, keywords: string): Promise<CompletionGroup[]> {
let groups: CompletionGroup[] = [];
let items = await this.queryProxyItems( name, keywords );
groups.push({
name: 'Saved Proxies',
items: items
});
return groups;
}
} }

@ -9,6 +9,7 @@ import validate from './validate';
export type SettingsJSON = { export type SettingsJSON = {
keymaps?: KeymapsJSON, keymaps?: KeymapsJSON,
search?: SearchJSON, search?: SearchJSON,
//proxies?: ProxiesJSON,
properties?: PropertiesJSON, properties?: PropertiesJSON,
blacklist?: BlacklistJSON, blacklist?: BlacklistJSON,
}; };
@ -162,5 +163,10 @@ export const DefaultSettingJSONText = `{
] ]
}`; }`;
//"proxies": {
// "burp": "127.0.0.1:8080",
// "none": "none"
//},
export const DefaultSetting: Settings = export const DefaultSetting: Settings =
Settings.fromJSON(JSON.parse(DefaultSettingJSONText)); Settings.fromJSON(JSON.parse(DefaultSettingJSONText));