source: branches/2.2/jabberit_messenger/java_source/src/nu/fw/jeti/plugins/filetransfer/socks5/Socks5Send.java @ 3451

Revision 3451, 9.7 KB checked in by emmanuel.ferro, 13 years ago (diff)

Ticket #1382 - [SERPRO] Erro transf de arq IM em maq c/ mais de 1 plc de rede

  • Property svn:executable set to *
Line 
1/*
2 *      Jeti, a Java Jabber client, Copyright (C) 2004 E.S. de Boer 
3 *
4 *  This program is free software; you can redistribute it and/or modify
5 *  it under the terms of the GNU General Public License as published by
6 *  the Free Software Foundation; either version 2 of the License, or
7 *  (at your option) any later version.
8 *
9 *  This program is distributed in the hope that it will be useful,
10 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
11 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 *      GNU General Public License for more details.
13 *
14 *  You should have received a copy of the GNU General Public License
15 *  along with this program; if not, write to the Free Software
16 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 *
18 *      For questions, comments etc,
19 *      use the website at http://jeti.jabberstudio.org
20 *  or mail me at jeti@jabber.org
21 */
22package nu.fw.jeti.plugins.filetransfer.socks5;
23
24import java.io.*;
25import java.net.*;
26import java.util.Iterator;
27import java.util.LinkedList;
28import java.util.List;
29
30import nu.fw.jeti.events.IQResultListener;
31import nu.fw.jeti.events.StatusChangeListener;
32import nu.fw.jeti.jabber.Backend;
33import nu.fw.jeti.jabber.JID;
34import nu.fw.jeti.jabber.elements.IQExtension;
35import nu.fw.jeti.jabber.elements.InfoQuery;
36import nu.fw.jeti.plugins.filetransfer.Plugin;
37import nu.fw.jeti.plugins.filetransfer.SendFileProgress;
38import nu.fw.jeti.plugins.filetransfer.StreamSend;
39import nu.fw.jeti.plugins.filetransfer.socks5.StreamHost;
40import nu.fw.jeti.plugins.filetransfer.socks5.jsocks.ProxyServer;
41import nu.fw.jeti.plugins.filetransfer.socks5.jsocks.ServerAuthenticatorNone;
42import nu.fw.jeti.plugins.filetransfer.socks5.jsocks.Socks5Proxy;
43import nu.fw.jeti.plugins.filetransfer.socks5.jsocks.SocksSocket;
44import nu.fw.jeti.util.I18N;
45import nu.fw.jeti.util.Popups;
46import nu.fw.jeti.util.Preferences;
47
48
49
50//31-okt-2004
51public class Socks5Send implements StreamSend
52{
53        private Backend backend;
54        private String sid;
55        private static List proxies = new LinkedList();
56        private List streamHosts;
57        private File file;
58        private long bytes;
59        private SendFileProgress window;
60        private ProxyServer proxyServer;
61        private Thread proxyServerThread;
62        private Thread sendThread;
63        private int port = 7777;
64               
65        public Socks5Send(File file,final Backend backend,SendFileProgress f,JID jid,String id)
66        {
67                window = f;
68                sid = id;
69        streamHosts = new LinkedList();
70        streamHosts.addAll(proxies);
71        this.backend = backend;
72        this.file = file;
73         
74        /*
75         * Esta alteração visa recupera a inteface de rede local, usada para transferir arquivo.
76         * Previne erro no caso do cliente ter múltiplas interface de rede.
77         *
78         * emmanuel.ferro@serpro.gov.br em 08/10/2010
79         *
80         */     
81//      if(Preferences.getBoolean("filetransfer", "useLocalIP", true))
82//      {
83                String ip;// =Preferences.getString("filetransfer","ip",null);
84//              if (ip!=null)
85//              {
86                        //if(ip.equals("automatic"))ip = Plugin.getIP();
87                        ip = backend.getLocalIP().getHostAddress();
88                        System.out.println("getLocalIP = " + ip);
89//                      streamHosts.add(new StreamHost(backend.getMyJID(),ip, Preferences.getInteger("filetransfer","port",7777),null));
90                        streamHosts.add(new StreamHost(backend.getMyJID(),ip,7777,null));
91                                startSocksServer(file, backend, jid);
92//              }
93//      }
94       
95        if( Preferences.getBoolean("filetransfer", "useLocalIP", true) )
96        {
97                String ip = Plugin.getIP();
98
99                if ( ip != null )
100                {
101                        streamHosts.add(new StreamHost(backend.getMyJID(),ip, Preferences.getInteger("filetransfer","port",7777),null));
102                                startSocksServer(file, backend, jid);
103                }
104        }
105
106        backend.send(new InfoQuery(jid,"set",backend.getIdentifier(),new Socks5Extension(sid,streamHosts)),
107                new IQResultListener()
108                {
109                public void iqResult(InfoQuery iq)
110                        {
111                        if(iq.getType().equals("result"))
112                                {
113                                        IQExtension e = iq.getIQExtension();
114                                        if(e instanceof Socks5Extension)
115                                        {
116                                                JID streamHostJID = ((Socks5Extension)e).getStreamHostUsed();
117                                                if(streamHostJID!=null)
118                                                {
119                                                        if(!streamHostJID.equals(backend.getMyJID()))
120                                                        {
121                                                                if(proxyServerThread!=null)proxyServerThread.interrupt();
122                                                                doProxy(streamHostJID,iq.getFrom());
123                                                        }
124                                                }
125                                        }
126                                }
127                                else
128                                {  //TODO add refuse error
129                                        Popups.messagePopup(I18N.gettext("filetransfer.Problem_during_file_transfer,_transfer_aborted"),I18N.gettext("filetransfer.File_Transfer"));
130                                }
131                        }
132                },0);
133
134        }
135       
136        public static void initProxies(final Backend backend)
137        {
138                backend.addListener(StatusChangeListener.class,new StatusChangeListener()
139                {
140                        public void connectionChanged(boolean online)
141                        {
142                                String proxy = Preferences.getString("filetransfer", "proxy", null);
143                               
144                                if( proxy != null )
145                                        getProxyInfo(backend,new JID(proxy));
146
147                                //getProxyInfo(backend,new JID("proxy.jabber.org"));
148                                //getProxyInfo(backend,new JID("proxy65.jabber.ccc.de"));
149                                //getProxyInfo(backend,new JID("proxy65.jabber.autocom.pl"));
150                        //getProxyInfo(backend,new JID("proxy.netlab.cz"));
151                                //getProxyInfo(backend,new JID("proxy.jabber.cd.chalmers.se"));
152                                //getProxyInfo(backend,new JID("proxy65.jaim.at"));
153                        }
154
155                        public void ownPresenceChanged(int show, String status) {}
156
157                        public void exit(){}
158                });
159        }
160       
161        public static boolean isProxyAvailable()
162        {
163                System.out.println(proxies);
164                System.out.println(!proxies.isEmpty());
165                return !proxies.isEmpty();
166        }
167       
168        private static void getProxyInfo(final Backend backend,JID jid)
169        {
170                backend.send(new InfoQuery(jid,"get",new Socks5Extension((JID)null,null)), new IQResultListener()
171                {
172                        public void iqResult(InfoQuery iq)
173                        {
174                                Socks5Extension s = (Socks5Extension)iq.getIQExtension();
175                                if(s!=null && s.hasStreamHosts())
176                                {
177                                        for(Iterator i= s.getStreamHosts();i.hasNext();)
178                                        {
179                                                StreamHost h = (StreamHost)i.next();
180                                                proxies.add(h);
181                                        }
182                                }
183                        }
184                }, 100);
185        }
186       
187        private void startSocksServer(final File file,final Backend backend, final JID jid)
188        {
189                proxyServerThread = new Thread(new Runnable()
190                  {
191                        public void run()
192                        {
193//                      set socks5 server
194                                String digest =Plugin.sha(sid,backend.getMyJID(),jid);
195                                ServerSocket ss=null;                   
196                                try{
197                                         ss = new ServerSocket(port);
198                                // while(true){
199                                  Socket s = ss.accept();
200                                  System.out.println("Accepted from:"+s.getInetAddress().getHostName()+":"
201                                                      +s.getPort());
202                                  proxyServer = new ProxyServer(new ServerAuthenticatorNone(),s,file,digest,Socks5Send.this);
203                                //}
204                              }catch(IOException ioe){
205                                ioe.printStackTrace();
206                              }
207                              finally
208                                  {
209                                try {
210                                                if(ss!=null)ss.close();
211                                        } catch (IOException e) {
212                                                // TODO Auto-generated catch block
213                                                e.printStackTrace();
214                                        }
215                                  }
216                        }
217                  });
218                proxyServerThread.setPriority(Thread.NORM_PRIORITY);
219                proxyServerThread.start();
220        }
221
222        private void doProxy(final JID streamHostID,final JID targetJID)
223        {
224                new Thread(new Runnable()
225                {
226                        public void run()
227                        {
228                                StreamHost streamHost=null;
229                                for(Iterator i= streamHosts.iterator();i.hasNext();)
230                                {
231                                        StreamHost s = (StreamHost)i.next();
232                                        if(streamHostID.equals(s.getJID()))
233                                        {
234                                                streamHost =s;
235                                                break;
236                                        }
237                                }
238                                //if(streamHost==null) sendError();
239                               
240                                 
241                                try{
242                                        //TODO stringprep
243                                       
244                                        String digest =Plugin.sha(sid,backend.getMyJID(),targetJID);
245                                                                       
246                                       
247                                        final SocksSocket s = new SocksSocket(new Socks5Proxy(streamHost.getHost(),streamHost.getPort()),digest,0);
248                //                      TODO get sid?
249                                        final StreamHost chosenStreamHost = streamHost;
250                                        backend.send(new InfoQuery(streamHostID,"set",backend.getIdentifier(),
251                                        new Socks5Extension(sid,targetJID)),new IQResultListener()
252                                        {
253                                                public void iqResult(InfoQuery iq)
254                                                {
255                                                        if(iq.getType().equals("result"))sendFile(s);
256                                                        else if(iq.getType().equals("error"))
257                                                        {//try different streamhost and remove faulty one
258                                                                proxies.remove(chosenStreamHost);
259                                                                streamHosts.remove(chosenStreamHost);
260                                                                Popups.errorPopup("file could not be send, try again","File transfer");
261                                                                cancel();
262                                                                return;
263                                                        }
264                                                }
265                                        },0);
266                                }
267                                catch (IOException e2)
268                                {
269                                        e2.printStackTrace();
270                                        proxies.remove(streamHost);
271                                        streamHosts.remove(streamHost);
272                                        //sendError();
273                                        Popups.errorPopup("file could not be downloaded","File transfer");
274                                        cancel();
275                                        return;
276                                }
277                        }
278                }).start();
279        }
280       
281        private void sendFile(final SocksSocket s)
282        {
283                sendThread = new Thread(new Runnable()
284                {
285                        public void run()
286                        {
287                                try
288                                {
289                                        InputStream is = new FileInputStream(file.getAbsolutePath());
290                                        OutputStream out = s.getOutputStream();
291                                        //OutputStream out = (OutputStream) ps;
292                                        byte[] buf = new byte[4096];
293                                        try
294                                        {
295                                                int n;
296                                                while ((n = is.read(buf)) > 0)
297                                                {
298                                                        out.write(buf, 0, n);
299                                                        out.flush();
300                                                        bytes+=n;
301                                                        if (Thread.interrupted())
302                                                        {
303                                                                is.close();
304                                                                s.close();
305                                                                return;
306                                                        }
307                                                        //if(ps.checkError()) throw new IOException("I/O Error");
308                                                }
309                                        } finally
310                                        {
311                                                is.close();
312                                                s.close();
313                                        }
314                                        window.done();
315                                } catch (IOException e)
316                                {
317                                        e.printStackTrace();
318                                }
319                        }
320                });
321                sendThread.setPriority(Thread.NORM_PRIORITY);
322                sendThread.start();
323        }
324               
325        public void finished()
326        {
327                window.stop();
328        }
329
330        public void addBytes(int bytes)
331        {
332                this.bytes+=bytes;
333        }
334       
335        public long getBytes()
336        {
337                return bytes;
338        }
339       
340        public void cancel()
341        {
342                if(proxyServer!=null)proxyServer.stop();
343                if(sendThread!=null)sendThread.interrupt();
344        }
345}
346
347/*
348 * Overrides for emacs
349 * Local variables:
350 * tab-width: 4
351 * End:
352 */
Note: See TracBrowser for help on using the repository browser.