001    package railo.runtime.net.proxy;
002    
003    
004    
005    import java.util.Properties;
006    
007    import railo.commons.lang.StringUtil;
008    import railo.commons.lang.lock.KeyLock;
009    import railo.commons.lang.lock.KeyLockListener;
010    
011    public final class Proxy {
012            
013            //private static Map map=new HashTable();
014            private static KeyLock kl=new KeyLock();
015            public static void start(ProxyData proxyData) {
016                    start(proxyData.getServer(),proxyData.getPort(),proxyData.getUsername(),proxyData.getPassword());
017            }
018            
019            public static void start(String server, int port, String user, String password) {
020                    String key=StringUtil.toString(server, "")+":"+StringUtil.toString(port+"", "")+":"+StringUtil.toString(user, "")+":"+StringUtil.toString(password, "");
021                    kl.setListener(new ProxyListener(server,port,user,password));
022                    kl.start(key);
023            }
024            
025            public static void end() {
026                    kl.end();
027            }
028            
029            
030            
031    
032            /*public static void main(String[] args) throws Exception {
033            
034                    new ProxyThread(1,"203.144.160.247",8080,null,null).start();
035                    new ProxyThread(2,"203.144.160.247",8080,null,null).start();
036                    new ProxyThread(3,"202.144.160.247",8080,null,null).start();
037                    new ProxyThread(4,"202.144.160.247",8080,null,null).start();
038                    new ProxyThread(5,"204.144.160.247",8080,null,null).start();
039            }*/
040    }
041    
042    class ProxyListener implements KeyLockListener {
043    
044            private String server;
045            private int port;
046            private String user;
047            private String password;
048            
049            public ProxyListener(String server, int port, String user, String password) {
050                    this.server=server;
051                    this.port=port;
052                    this.user=user;
053                    this.password=password;
054            }
055    
056            public void onStart(String key,boolean isFirst) {
057                    //print.ln(" start:"+key+" _ "+isFirst);        
058                    if(!isFirst) return;
059                    
060                    Properties props = System.getProperties();
061                    if(!StringUtil.isEmpty(server)) {
062                            // Server
063                            props.setProperty("socksProxyHost",     server);
064                            props.setProperty("http.proxyHost",     server);
065                            props.setProperty("https.proxyHost",server);
066                            props.setProperty("ftp.proxyHost",      server);
067                            props.setProperty("smtp.proxyHost", server);
068                            
069                            // Port
070                            if(port>0) {
071                                    String strPort= String.valueOf(port);
072                                    props.setProperty("socksProxyPort",strPort);
073                                    props.setProperty("http.proxyPort",strPort);
074                                    props.setProperty("https.proxyPort",strPort);
075                                    props.setProperty("ftp.proxyPort",strPort);
076                                    props.setProperty("smtp.proxyPort",strPort);
077                            }
078                            else removePort(props);
079                            
080                            if(!StringUtil.isEmpty(user)) {
081                                    props.setProperty("socksProxyUser",user);
082                                    props.setProperty("java.net.socks.username",user);
083                                    props.setProperty("http.proxyUser",user);
084                                    props.setProperty("https.proxyUser",user);
085                                    props.setProperty("ftp.proxyUser",user);
086                                    props.setProperty("smtp.proxyUser",user);
087                                    
088                                    if(password==null)password="";
089                                    props.setProperty("socksProxyPassword",user);
090                                    props.setProperty("java.net.socks.password",user);
091                                    props.setProperty("http.proxyPassword",user);
092                                    props.setProperty("https.proxyPassword",user);
093                                    props.setProperty("ftp.proxyPassword",user);
094                                    props.setProperty("smtp.proxyPassword",user);
095                            }
096                            else removeUserPass(props);
097                    }
098                    else {
099                            removeAll(props);
100                    }
101            }
102    
103            public void onEnd(String key,boolean isLast) {
104                    //print.ln(" end:"+key+key+" _ "+isLast);
105                    if(!isLast) return;
106                    removeAll(System.getProperties());
107            }
108    
109            private void removeAll(Properties props) {
110                    removeHost(props);
111                    removePort(props);
112                    removeUserPass(props);
113            
114            }
115            private void removeHost(Properties props) {
116                    remove(props,"socksProxyHost");
117            
118            remove(props,"http.proxyHost");
119            remove(props,"https.proxyHost");
120            remove(props,"ftp.proxyHost");
121            remove(props,"smtp.proxyHost");
122            
123            }
124            private void removePort(Properties props) {
125                    remove(props,"socksProxyPort");
126            remove(props,"http.proxyPort");
127            remove(props,"https.proxyPort");
128            remove(props,"ftp.proxyPort");
129            remove(props,"smtp.proxyPort");
130            }
131            private void removeUserPass(Properties props) {
132                    remove(props,"socksProxyUser");
133            remove(props,"socksProxyPassword");
134            
135            remove(props,"java.net.socks.username");
136            remove(props,"java.net.socks.password");
137            
138            remove(props,"http.proxyUser");
139            remove(props,"http.proxyPassword");
140            
141            remove(props,"https.proxyUser");
142            remove(props,"https.proxyPassword");
143    
144            remove(props,"ftp.proxyUser");
145            remove(props,"ftp.proxyPassword");
146            
147            remove(props,"smtp.proxyUser");
148            remove(props,"smtp.proxyPassword");
149            
150            }
151            
152            private static void remove(Properties props, String key) {
153                    if(props.containsKey(key))
154                            props.remove(key);
155            }
156            
157    }
158    
159    
160    /*class ProxyThread extends Thread {
161            private String s;
162            private int po;
163            private int id;
164            private String u;
165            private String p;
166            
167            public ProxyThread(int id,String s, int po, String u, String p) {
168                    this.s=s;
169                    this.id=id;
170                    this.po=po;
171                    this.u=u;
172                    this.p=p;
173            }
174            public void run() {
175                    try {
176                            _run();
177                    } catch (Exception e) {
178                            
179                    }
180            }
181            public void _run() throws Exception {
182                    //print.ln("start("+Thread.currentThread().getName()+"):"+s+":"+po+":"+u+":"+p);
183                    Proxy.start(id,s, po, u, p);
184                    sleep(1000);
185                    Proxy.end(id);
186            }
187    }*/