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 }*/