From b76610576a94420663321ec05e790012240d3d47 Mon Sep 17 00:00:00 2001
From: OttoMao <ottomao@gmail.com>
Date: Tue, 5 Apr 2016 22:09:07 +0800
Subject: [PATCH] optimized tips for global proxy

---
 README.md                                  |  3 +-
 bin.js                                     |  4 +--
 lib/{proxyManager.js => systemProxyMgr.js} |  6 ++--
 proxy.js                                   | 32 ++++++++++++----------
 4 files changed, 24 insertions(+), 21 deletions(-)
 rename lib/{proxyManager.js => systemProxyMgr.js} (96%)

diff --git a/README.md b/README.md
index 3c247ba..fe914cf 100644
--- a/README.md
+++ b/README.md
@@ -79,7 +79,7 @@ Https features
 ----------------
 After configuring rootCA, AnyProxy could help to decrypt https requests, whose approach is also called Man-In-The-Middle(MITM).
 
-A guide about configuring https features is here : [https://github.com/alibaba/anyproxy/wiki/How-to-config-https-proxy](https://github.com/alibaba/anyproxy/wiki/How-to-config-https-proxy) 
+A guide about configuring https features is here : [https://github.com/alibaba/anyproxy/wiki/How-to-config-https-proxy](https://github.com/alibaba/anyproxy/wiki/How-to-config-https-proxy)
 
 HTTPS配置中文教程 : [https://github.com/alibaba/anyproxy/wiki/HTTPS%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B](https://github.com/alibaba/anyproxy/wiki/HTTPS%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B)
 
@@ -120,6 +120,7 @@ var options = {
     socketPort    : 8003,  // optional, internal port for web socket, replace this when it is conflict with your own service
     throttle      : 10,    // optional, speed limit in kb/s
     disableWebInterface : false, //optional, set it when you don't want to use the web interface
+    setAsGlobalProxy : false, //set anyproxy as your system proxy
     silent        : false //optional, do not print anything into terminal. do not set it when you are still debugging.
 };
 new proxy.proxyServer(options);
diff --git a/bin.js b/bin.js
index d79aaac..df8c747 100755
--- a/bin.js
+++ b/bin.js
@@ -22,7 +22,7 @@ program
     .option('-i, --intercept', 'intercept(decrypt) https requests when root CA exists')
     .option('-s, --silent', 'do not print anything into terminal')
     .option('-c, --clear', 'clear all the tmp certificates')
-    .option('-o, --global', 'set as global proxy')
+    .option('-o, --global', 'set as global proxy for system')
     .option('install', '[alpha] install node modules')
     .parse(process.argv);
 
@@ -92,7 +92,7 @@ if(program.clear){
         webPort             : program.web,
         rule                : ruleModule,
         disableWebInterface : false,
-        globalProxy         : program.global,
+        setAsGlobalProxy    : program.global,
         interceptHttps      : program.intercept,
         silent              : program.silent
     });
diff --git a/lib/proxyManager.js b/lib/systemProxyMgr.js
similarity index 96%
rename from lib/proxyManager.js
rename to lib/systemProxyMgr.js
index a7766f7..f593680 100644
--- a/lib/proxyManager.js
+++ b/lib/systemProxyMgr.js
@@ -18,7 +18,6 @@ function execSync(cmd) {
    };
 }
 
-
 /**
  * proxy for CentOs
  * ------------------------------------------------------------------------
@@ -72,7 +71,7 @@ macProxyManager.getNetworkType = function() {
 macProxyManager.enableGlobalProxy = function(ip, port, proxyType) {
 
    if (!ip || !port) {
-      console.log('proxy server\'s ip and port are required');
+      console.log('failed to set global proxy server.\n ip and port are required.');
       return;
    };
 
@@ -137,12 +136,11 @@ var winProxyManager = {};
 winProxyManager.enableGlobalProxy = function(ip, port) {
 
    if (!ip && !port) {
-      console.log('proxy server\'s ip and port are required');
+     console.log('failed to set global proxy server.\n ip and port are required.');
       return;
    };
 
    return execSync(
-
          // set proxy
          'reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" /v ProxyServer /t REG_SZ /d ${ip}:${port} /f & '
             .replace("${ip}", ip)
diff --git a/proxy.js b/proxy.js
index a407c22..93d995f 100644
--- a/proxy.js
+++ b/proxy.js
@@ -16,6 +16,7 @@ var http = require('http'),
     logUtil         = require("./lib/log"),
     wsServer        = require("./lib/wsServer"),
     webInterface    = require("./lib/webInterface"),
+    SystemProxyMgr  = require('./lib/systemProxyMgr'),
     inherits        = require("util").inherits,
     util            = require("./lib/util"),
     path            = require("path"),
@@ -69,8 +70,6 @@ function proxyServer(option){
         logUtil.setPrintStatus(false);
     }
 
-
-
     if(!!option.interceptHttps){
         default_rule.setInterceptFlag(true);
 
@@ -158,37 +157,42 @@ function proxyServer(option){
                 callback(null);
             },
 
-
+            //set global proxy
             function(callback) {
-
-                if (option.globalProxy) {
-                    var result = require('./lib/proxyManager').enableGlobalProxy(ip.address(), proxyPort, proxyType == T_TYPE_HTTP ? "Http" : "Https");
-
+                if (option.setAsGlobalProxy) {
+                    console.log('setting global proxy for you...');
+                    if(!/^win/.test(process.platform) && !process.env.SUDO_UID){
+                        console.log('sudo password may be required.');
+                    }
+                    var result = SystemProxyMgr.enableGlobalProxy(ip.address(), proxyPort, proxyType == T_TYPE_HTTP ? "Http" : "Https");
                     if (result.status) {
                         callback(result.stdout);
                     } else {
+                        if(/^win/.test(process.platform)){
+                            console.log('AnyProxy is now the default proxy for your system. It may take up to 1min to take effect.');
+                        } else{
+                            console.log('AnyProxy is now the default proxy for your system.');
+                        }
                         callback(null);
                     }
-
                 } else {
                     callback(null);
                 }
-
-
             },
 
             //server status manager
             function(callback){
-
                 process.on("exit",function(code){
                     logUtil.printLog('AnyProxy is about to exit with code: ' + code, logUtil.T_ERR);
 
-                    if (option.globalProxy) {
-                        var result = require('./lib/proxyManager').disableGlobalProxy(proxyType == T_TYPE_HTTP ? "Http" : "Https");
+                    if (option.setAsGlobalProxy) {
+                        console.log('resigning global proxy...');
+                        var result = SystemProxyMgr.disableGlobalProxy(proxyType == T_TYPE_HTTP ? "Http" : "Https");
 
-                        //error occur
                         if (result.status) {
                             console.log(color.red(result.stdout));
+                        } else{
+                            console.log('global proxy resigned.');
                         }
                     }