autoproxychanger.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. var PLUGIN_INFO = xml`
  2. <VimperatorPlugin>
  3. <name>autoproxychanger</name>
  4. <description>setting proxy</description>
  5. <description lang="ja">proxyの設定・自動切り替え</description>
  6. <version>0.1.3</version>
  7. <author homepage="http://d.hatena.ne.jp/pekepekesamurai/">pekepeke</author>
  8. <minVersion>2.0pre</minVersion>
  9. <maxVersion>2.0pre</maxVersion>
  10. <updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/autoproxychanger.js</updateURL>
  11. <detail><![CDATA[
  12. == Usage ==
  13. :proxy [setting_name]:
  14. set proxy setting to setting_name
  15. :proxy!:
  16. set proxy setting to default setting
  17. :toggleautoproxy:
  18. proxy autochanger on/off toggle
  19. The proxy_settings is a string variable which can set on
  20. vimperatorrc as following.
  21. >||
  22. let autochanger_proxy_settings = "[{ name:'disable', usage: 'direct connection', proxy:{type:0} }]"
  23. let autochanger_proxy_enabled = "true"
  24. ||<
  25. or your can set it using inline JavaScript.
  26. >||
  27. liberator.globalVariables.autochanger_proxy_enabled = true;
  28. liberator.globalVariables.autochanger_proxy_settings = [{
  29. name : 'disable',
  30. usage : 'direct connection',
  31. proxy :{
  32. type :0,
  33. },
  34. },{
  35. name : 'http',
  36. usage : 'localhost proxy',
  37. proxy :{
  38. type : 1,
  39. http : 'localhost',
  40. http_port : 8080,
  41. },
  42. url : /http:\/\/www.nicovideo.jp/,
  43. run : 'java.exe',
  44. args : ['C:\Personal\Apps\Internet\NicoCacheNl\NicoCache_nl.jar'],
  45. }];
  46. EOM
  47. ||<
  48. ]]></detail>
  49. </VimperatorPlugin>`;
  50. liberator.plugins.AutoProxyChanger = (function() {
  51. var gVar = liberator.globalVariables;
  52. var proxy_settings = gVar.autochanger_proxy_settings;
  53. if (!proxy_settings) {
  54. proxy_settings = [{
  55. name : 'disable',
  56. usage : 'direct connection',
  57. proxy : {
  58. type : 0,
  59. },
  60. }, {
  61. name : 'http',
  62. usage : 'localhost:8080',
  63. proxy : {
  64. type : 1,
  65. http : 'localhost',
  66. http_port : 8080,
  67. },
  68. }];
  69. }
  70. const ENABLE_ICON = 'data:image/png;base64,'
  71. + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA/wAAAIBJekM9AAAB'
  72. + 'mElEQVR4nIWS3StDYRzHv895njOvaWy4WWPJcquE8nIrbSW54mrGjWsppbQtCuXajZd/QDKs'
  73. + 'UNxoLpYbKc1b2zm4mJ2NsGPNOC6OnHXGfO+eb8/neX6fp4e43aNWax3+iCgKK6uW3IZZrXXT'
  74. + '01OEkPzdiqL4fLPja04Al6H97aU3AAwAIcTmmMsHIoFJAIvDfgDja31Y8n8Dapw97cUGSilH'
  75. + 'CUlnshuB41+H1IDMJ5QsMb2cc3LMALha4fXOAPB6KIAKYcfroaIoaMBTKltaSqvlWGElDQgd'
  76. + 'nwBwtf6jxFRUXQDfYxRQYqIo+Hyz+eepSm/y+3MqI6czmvTVdbh/wGFvbBJuI2ZT9dbmbq4S'
  77. + '4w3l5ZTjOA1wOHuNxkrhNsIYLyXiOqX8MADBYFD3Gj9Kuh4AUeDJbUfcd4W/FhtbbEmfrT9+'
  78. + 'lJ0eBSJRl05JSsTNphop8WCrbwiHzw8O92j34EQtiZU1D7XZSpYtF51dHXa7XUrGGeNfUy8c'
  79. + 'x6XkV57xiaRUZawyFPFMTt4no9HHm2X1hvkFvZIuXyp4v/YfvuEoAAAAAElFTkSuQmCC';
  80. const DISABLE_ICON = 'data:image/png;base64,'
  81. + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA/wAAAIBJekM9AAAB'
  82. + 'i0lEQVR4nH2SwUoCURSG/7lzZwJxYWqtRItQwm3LbCkStol8gLAW9QzB4AgW9QIJWc8QgVBI'
  83. + '7RQ3bsOmQGdsY466aCZ1RGwxksNo/rt7uN+55ztcJpk89vsD+CeKIt/e+awV6vcHBOGMYZjZ'
  84. + '2+PxOJ3OZK+9ACqVyk3OB4ACYBgmGo3OAoVCAcDJaRNA9noLueYEMBOLxXieZ1mWEDIYDPL5'
  85. + '/Nwhp8BoNBoOh71er9/vA4hEIqIoAqyYYgGgqYopVlHkKaBpmsPhMAxDEIQFSlOgXC6bjRcr'
  86. + 'URM1DwBEUVysRBVFTqczlkasVUnXdU3TTKsJ8P5R3T+Ih4KbcqPm9aw83D9alSilTqeTEDIF'
  87. + '4nu7Ltey3KhRyqntlk1p/lqLxaJtG39KtjoAZoyUtXqU/Fz8tejFOS9JkmEYpVKpVj+0Kant'
  88. + 'ltezqra/1tc2qtXX55cnNpFIcBwXDoeDwWDO9xbZ2Q6FQmqnRSmn6d+EEP1H4yjX7qhul5tf'
  89. + '4mi3263X65IkmS9cXtmVbPkFaGbHAxyF/18AAAAASUVORK5CYII=';
  90. var acmanager = [];
  91. const prefkeys = ['ftp','gopher','http','ssl', 'socks'];
  92. var prevSetting = null;
  93. var _isEnable = false;
  94. var exec = (function(){
  95. const Cc = Components.classes;
  96. const Ci = Components.interfaces;
  97. var getFile = function(){
  98. if (arguments.length <= 0) return null;
  99. var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
  100. if (!file) return null;
  101. file.initWithPath(arguments[0]);
  102. for (var i=1; i<arguments.length; i++) file.append(arguments[i]);
  103. if (file.exists() && file.isFile) return file;
  104. return null;
  105. };
  106. var getPathSplitChar = function(){
  107. var os = Cc["@mozilla.org/xre/app-info;1"].createInstance(Ci.nsIXULRuntime).OS;
  108. if (os == "WINNT") return ";";
  109. return ":";
  110. };
  111. var run = function(file, arg, async){
  112. arg = arg || [];
  113. var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
  114. process.init(file);
  115. process.run(false, arg, arg.length);
  116. return process.exitValue;
  117. };
  118. const spchar = getPathSplitChar();
  119. return function(cmd, arg, async){
  120. var file;
  121. if ( (cmd.indexOf('/') >= 0 || cmd.indexOf('\\') >= 0) && (file=getFile(cmd)) ) return run(file, arg, async);
  122. var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
  123. var exitValue = null;
  124. env.get('PATH').split(spchar).some(
  125. function(path){
  126. if (file=getFile( path, cmd)){
  127. exitValue = run(file, arg, async);
  128. return true;
  129. }
  130. return false;
  131. }
  132. );
  133. return exitValue;
  134. };
  135. })();
  136. var ProxyChanger = function() this.initialize.apply(this, arguments);
  137. ProxyChanger.prototype = {
  138. initialize: function() {
  139. this.panel = this.createPanel();
  140. },
  141. createPanel: function() {
  142. var self = this;
  143. var panel = document.getElementById('proxychanger-status');
  144. if (panel) {
  145. let parent = panel.parentNode;
  146. parent.removeChild(panel);
  147. }
  148. panel = document.createElement('statusbarpanel');
  149. panel.setAttribute('id', 'proxychanger-status');
  150. panel.setAttribute('class', 'statusbarpanel-iconic');
  151. panel.setAttribute('src', self.isEnable ? ENABLE_ICON : DISABLE_ICON);
  152. panel.addEventListener('click', function(e) { self.isEnable = !self.isEnable; }, false);
  153. var statusbar = document.getElementById('status-bar');
  154. statusbar.insertBefore(
  155. panel, statusbar.firstChild);
  156. return panel;
  157. },
  158. get isEnable() _isEnable,
  159. set isEnable(val) {
  160. this.panel.setAttribute('src', val ? ENABLE_ICON : DISABLE_ICON);
  161. _isEnable = val;
  162. },
  163. autoApplyProxy : checkApplyProxy
  164. };
  165. var manager = new ProxyChanger();
  166. function init() {
  167. if(typeof proxy_settings === 'string')
  168. proxy_settings=eval(proxy_settings)
  169. // initialize manager
  170. proxy_settings.forEach(function(s) {
  171. if (s.url instanceof RegExp && s.name)
  172. acmanager.push( {url: s.url, name: s.name, run: s.run || '', args: s.args || [] } );
  173. });
  174. proxy_settings.splice(0, 0, {name: 'default', usage: 'default setting', proxy: restore() });
  175. if (acmanager.length > 0) {
  176. autocommands.add("LocationChange", '.*', 'js liberator.plugins.AutoProxyChanger.autoApplyProxy()');
  177. window.addEventListener("unload", function() {
  178. if (prevSetting != null) applyProxy(prevSetting)
  179. }, false);
  180. }
  181. manager.isEnable = eval(gVar.autochanger_proxy_enabled) || false;
  182. }
  183. function restore() {
  184. var opt = new Object();
  185. opt['type'] = options.getPref('network.proxy.type', 0);
  186. prefkeys.forEach(function(key) {
  187. opt[key] = options.getPref('network.proxy.' + key, '');
  188. opt[key+'_port'] = options.getPref('network.proxy.' + key + '_port', 0);
  189. });
  190. return opt;
  191. }
  192. function dump(obj) {
  193. var m = '';
  194. for (let key in obj) m+=key+':'+obj[key]+'\n';
  195. return m;
  196. }
  197. function checkApplyProxy() {
  198. if (prevSetting != null) {
  199. applyProxy(prevSetting);
  200. prevSetting = null;
  201. }
  202. if (!_isEnable) return;
  203. acmanager.some( function( manager ) {
  204. if (manager.url.test(content.location.href)) {
  205. prevSetting = restore();
  206. try {
  207. if (manager.run) {
  208. if (exec(manager.run, manager.args, false) == null) throw "run process failed...";
  209. manager.run = null; manager.args = null;
  210. }
  211. applyProxyByName(manager.name);
  212. return true;
  213. } catch(e) {
  214. liberator.echoerr(e);
  215. return true;
  216. }
  217. }
  218. return false;
  219. });
  220. }
  221. function applyProxyByName( name ) {
  222. if (!name) {
  223. liberator.echo( dump(restore())+'usage:proxy [setting name]' );
  224. return;
  225. }
  226. proxy_settings.some( function(setting) {
  227. if (setting.name.toLowerCase() != name.toLowerCase()) return false;
  228. // delete setting
  229. prefkeys.forEach( function(key) {
  230. options.setPref('network.proxy.'+key, '');
  231. options.setPref('network.proxy.'+key+'_port', 0);
  232. });
  233. // apply proxy
  234. applyProxy(setting.proxy);
  235. return true;
  236. });
  237. }
  238. function applyProxy(proxy) {
  239. for (let key in proxy) {
  240. if (typeof proxy[key] != 'undefined')
  241. options.setPref('network.proxy.'+key, proxy[key]);
  242. }
  243. }
  244. commands.addUserCommand(['proxy'], 'Proxy settings',
  245. function(args) {
  246. if (args.bang) applyProxyByName('default');
  247. else applyProxyByName(args.string);
  248. }, {
  249. bang: true,
  250. completer: function(context, arg) {
  251. context.title = ['Name', 'Usage'];
  252. var list = context.filter ?
  253. proxy_settings.filter( function(el) this.test(el.name), new RegExp('^'+context.filter))
  254. : proxy_settings;
  255. context.completions = list.map( function(v) [v.name, v.usage] );
  256. }
  257. });
  258. commands.addUserCommand(['toggleautoproxy','aprxy'], 'Toggle auto proxy changer on/off',
  259. function() {
  260. manager.isEnable = !manager.isEnable
  261. liberator.echo('autoproxy:'+ manager.isEnable ? 'ON' : 'OFF');
  262. }, {}
  263. );
  264. init();
  265. return manager;
  266. })();