KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > socks > SocksDialog


1 package socks;
2 import java.awt.*;
3 import java.awt.event.*;
4
5 /**
6   Socks configuration dialog.<br>
7   Class which provides GUI means of getting Proxy configuration
8   from the user.
9  */

10 public class SocksDialog extends Dialog
11                          implements WindowListener,
12                                     ItemListener,
13                                     ActionListener,
14                                     Runnable JavaDoc{
15
16 //GUI components
17
TextField host_text,
18              port_text,
19              user_text,
20              password_text,
21              direct_text;
22    Button add_button,
23           remove_button,
24           cancel_button,
25           ok_button,
26           dismiss_button;
27    List direct_list;
28    Checkbox socks4radio,
29             socks5radio,
30             none_check,
31             up_check,
32             gssapi_check;
33
34    Dialog warning_dialog;
35    Label warning_label;
36
37    String JavaDoc host,user,password;
38    int port;
39    Thread JavaDoc net_thread = null;
40    
41    //CheckboxGroups
42
CheckboxGroup socks_group = new CheckboxGroup();
43
44    Proxy proxy;
45    InetRange ir;
46
47    final static int COMMAND_MODE = 0;
48    final static int OK_MODE = 1;
49
50    int mode;
51
52    /**Wether to resolve addresses in separate thread.
53       <p>
54       Default value is true, however on some JVMs, namely one from
55       the Microsoft, it doesn't want to work properly, separate thread
56       can't close the dialog opened in GUI thread, and everuthing else
57       is then crashes.
58       <p>
59       When setting this variable to false, SocksDialog will block while
60       trying to look up proxy host, and if this takes considerable amount
61       of time it might be annoying to user.
62
63    */

64    public static boolean useThreads = true;
65
66
67 // Constructors
68
////////////////////////////////////
69
/**
70      Creates SOCKS configuration dialog.<br>
71      Uses default initialisation:<br>
72      Proxy host: socks-proxy <br>
73      Proxy port: 1080 <br>
74      Version: 5<br>
75
76     */

77    public SocksDialog(Frame parent){
78       this(parent,null);
79    }
80    /**
81     Creates SOCKS configuration dialog and initialises it
82     to given proxy.
83     */

84    public SocksDialog(Frame parent,Proxy init_proxy){
85      super(parent,"Proxy Configuration",true);
86      warning_dialog = new Dialog(parent,"Warning",true);
87
88      guiInit();
89      setResizable(false);
90      addWindowListener(this);
91      Component[] comps = getComponents();
92      for(int i=0;i<comps.length;++i){
93         if(comps[i] instanceof Button)
94            ((Button)comps[i]).addActionListener(this);
95         else if(comps[i] instanceof TextField)
96            ((TextField) comps[i]).addActionListener(this);
97         else if(comps[i] instanceof Checkbox){
98            ((Checkbox)comps[i]).addItemListener(this);
99         }
100      }
101      proxy = init_proxy;
102      if(proxy != null) doInit(proxy);
103      else ir = new InetRange();
104
105      dismiss_button.addActionListener(this);
106      warning_dialog.addWindowListener(this);
107    }
108
109 //Public Methods
110
////////////////
111

112    /**
113      Displays SOCKS configuartion dialog.
114      <p>
115      Returns initialised proxy object, or null if user cancels dialog
116      by either pressing Cancel or closing the dialog window.
117     */

118    public Proxy getProxy(){
119       mode = COMMAND_MODE;
120       pack();
121       show();
122       return proxy;
123    }
124
125    /**
126      Initialises dialog to given proxy and displays SOCKS configuartion dialog.
127      <p>
128      Returns initialised proxy object, or null if user cancels dialog
129      by either pressing Cancel or closing the dialog window.
130     */

131     public Proxy getProxy(Proxy p){
132       if(p != null){
133          doInit(p);
134       }
135       mode = COMMAND_MODE;
136       pack();
137       show();
138       return proxy;
139    }
140
141 // WindowListener Interface
142
/////////////////////////////////
143
public void windowActivated(java.awt.event.WindowEvent JavaDoc e){
144    }
145    public void windowDeactivated(java.awt.event.WindowEvent JavaDoc e){
146    }
147    public void windowOpened(java.awt.event.WindowEvent JavaDoc e){
148    }
149    public void windowClosing(java.awt.event.WindowEvent JavaDoc e){
150       Window source = e.getWindow();
151       if(source == this){
152          onCancel();
153       }else if(source == warning_dialog){
154          onDismiss();
155       }
156    }
157    public void windowClosed(java.awt.event.WindowEvent JavaDoc e){
158    }
159    public void windowIconified(java.awt.event.WindowEvent JavaDoc e){
160    }
161    public void windowDeiconified(java.awt.event.WindowEvent JavaDoc e){
162    }
163
164 //ActionListener interface
165
///////////////////////////
166
public void actionPerformed(ActionEvent ae){
167
168       Object JavaDoc source = ae.getSource();
169
170       if(source == cancel_button )
171          onCancel();
172       else if(source == add_button || source == direct_text)
173          onAdd();
174       else if(source == remove_button)
175          onRemove();
176       else if(source == dismiss_button)
177          onDismiss();
178       else if(source == ok_button || source instanceof TextField)
179          onOK();
180    }
181 //ItemListener interface
182
////////////////////////
183
public void itemStateChanged(ItemEvent ie){
184       Object JavaDoc source = ie.getSource();
185       //System.out.println("ItemEvent:"+source);
186
if(source == socks5radio || source == socks4radio)
187          onSocksChange();
188       else if(source == up_check)
189          onUPChange();
190
191    }
192 //Runnable interface
193
////////////////////
194
/**
195      Resolves proxy address in other thread, to avoid
196      annoying blocking in GUI thread.
197    */

198    public void run(){
199
200       if(!initProxy()){
201          //Check if we have been aborted
202
if(mode != OK_MODE) return;
203          if(net_thread != Thread.currentThread()) return;
204
205          mode = COMMAND_MODE;
206          warning_label.setText("Look up failed.");
207          warning_label.invalidate();
208          return;
209       }
210
211       //System.out.println("Done!");
212
while(!warning_dialog.isShowing())
213            ; /* do nothing*/;
214
215       warning_dialog.dispose();
216       //dispose(); //End Dialog
217
}
218
219 //Private Methods
220
///////////////////
221
private void onOK(){
222       host = host_text.getText().trim();
223       user = user_text.getText();
224       password = password_text.getText();
225
226       if(host.length() == 0){
227         warn("Proxy host is not set!");
228         return;
229       }
230       if(socks_group.getSelectedCheckbox() == socks4radio){
231         if(user.length() == 0){
232           warn("User name is not set");
233           return;
234         }
235
236       }else{
237         if(up_check.getState()){
238           if(user.length() == 0){
239             warn("User name is not set.");
240             return;
241           }
242           if(password.length()==0){
243             warn("Password is not set.");
244             return;
245           }
246         }else if(!none_check.getState()){
247           warn("Please select at least one Authentication Method.");
248           return;
249         }
250       }
251
252       try{
253          port = Integer.parseInt(port_text.getText());
254       }catch(NumberFormatException JavaDoc nfe){
255          warn("Proxy port is invalid!");
256          return;
257       }
258
259       mode = OK_MODE;
260
261       if(useThreads){
262          net_thread = new Thread JavaDoc(this);
263          net_thread.start();
264
265          info("Looking up host: "+host);
266          //System.out.println("Info returned.");
267
}else if(!initProxy()){
268            warn("Proxy host is invalid.");
269            mode = COMMAND_MODE;
270          }
271
272       if(mode == OK_MODE) dispose();
273    }
274
275    private void onCancel(){
276       //System.out.println("Cancel");
277
proxy = null;
278       dispose();
279    }
280
281    private void onAdd(){
282       String JavaDoc s = direct_text.getText();
283       s.trim();
284       if(s.length() == 0 ) return;
285       //Check for Duplicate
286
String JavaDoc[] direct_hosts = direct_list.getItems();
287       for(int i=0;i<direct_hosts.length;++i)
288          if(direct_hosts[i].equals(s)) return;
289
290       direct_list.add(s);
291       ir.add(s);
292    }
293    private void onRemove(){
294       int index = direct_list.getSelectedIndex();
295       if(index < 0) return;
296       ir.remove(direct_list.getItem(index));
297       direct_list.remove(index);
298       direct_list.select(index);
299    }
300
301    private void onSocksChange(){
302       Object JavaDoc selected = socks_group.getSelectedCheckbox();
303       if(selected == socks4radio){
304          user_text.setEnabled(true);
305          password_text.setEnabled(false);
306          none_check.setEnabled(false);
307          up_check.setEnabled(false);
308       }else{
309          if(up_check.getState()){
310            user_text.setEnabled(true);
311            password_text.setEnabled(true);
312          }else{
313            user_text.setEnabled(false);
314            password_text.setEnabled(false);
315          }
316          none_check.setEnabled(true);
317          up_check.setEnabled(true);
318       }
319       //System.out.println("onSocksChange:"+selected);
320
}
321    private void onUPChange(){
322       //System.out.println("onUPChange");
323
if(up_check.getState()){
324         user_text.setEnabled(true);
325         password_text.setEnabled(true);
326       }else{
327         user_text.setEnabled(false);
328         password_text.setEnabled(false);
329       }
330    }
331    private void onDismiss(){
332      warning_dialog.dispose();
333      if(mode == OK_MODE){
334        mode = COMMAND_MODE;
335        if(net_thread!=null) net_thread.interrupt();
336      }
337    }
338
339    private void doInit(Proxy p){
340      if(p.version == 5){
341        socks_group.setSelectedCheckbox(socks5radio);
342        onSocksChange();
343        if(((Socks5Proxy)p).getAuthenticationMethod(0)!=null)
344           none_check.setState(true);
345        UserPasswordAuthentication auth = (UserPasswordAuthentication)
346                                   ((Socks5Proxy)p).getAuthenticationMethod(2);
347        if(auth!=null){
348           user_text.setText(auth.getUser());
349           password_text.setText(auth.getPassword());
350           up_check.setState(true);
351           onUPChange();
352        }
353      }else{
354        socks_group.setSelectedCheckbox(socks4radio);
355        onSocksChange();
356        user_text.setText(((Socks4Proxy)p).user);
357      }
358      ir = (InetRange)(p.directHosts.clone());
359      String JavaDoc[] direct_hosts = ir.getAll();
360      direct_list.removeAll();
361      for(int i=0;i<direct_hosts.length;++i)
362        direct_list.add(direct_hosts[i]);
363
364      host_text.setText(p.proxyIP.getHostName());
365      port_text.setText(""+p.proxyPort);
366
367    }
368
369    private boolean initProxy(){
370       try{
371          if(socks_group.getSelectedCheckbox() == socks5radio){
372             proxy = new Socks5Proxy(host,port);
373             if(up_check.getState())
374               ((Socks5Proxy)proxy).setAuthenticationMethod(2,
375                            new UserPasswordAuthentication(user,password));
376             if(!none_check.getState())
377               ((Socks5Proxy)proxy).setAuthenticationMethod(0,null);
378          }
379          else
380             proxy = new Socks4Proxy(host,port,user);
381       }catch(java.net.UnknownHostException JavaDoc uhe){
382          return false;
383       }
384       proxy.directHosts = ir;
385       return true;
386    }
387    private void info(String JavaDoc s){
388      msgBox("Info",s);
389    }
390
391    private void warn(String JavaDoc s){
392      msgBox("Warning",s);
393    }
394    
395    private void msgBox(String JavaDoc title, String JavaDoc message){
396      warning_label.setText(message);
397      warning_label.invalidate();
398      warning_dialog.setTitle(title);
399      warning_dialog.pack();
400      warning_dialog.show();
401    }
402
403 /*======================================================================
404   Form:
405   Table:
406           +---+-------+---+---+
407           | | | | |
408           +---+-------+---+---+
409           | | |
410           +---+-------+-------+
411           | | | |
412           +---+-------+-------+
413           | | | |
414           +---+-------+-------+
415           | | |
416           +-----------+-------+
417           | | |
418           | +---+---+
419           | | | |
420           +-----------+---+---+
421           | | | |
422           +---+---+---+---+---+
423           | | | | | |
424           +---+---+---+---+---+
425 */

426
427    void guiInit(){
428       //Some default names used
429
Label label;
430       Container container;
431       Font font;
432
433       GridBagConstraints c = new GridBagConstraints();
434
435       font = new Font("Dialog",Font.PLAIN,12);
436       
437       container = this;
438       //container = new Panel();
439
container.setLayout(new GridBagLayout());
440       container.setFont(font);
441       container.setBackground(SystemColor.menu);
442       c.insets = new Insets(3,3,3,3);
443       
444       c.gridx=0; c.gridy=0;
445       c.gridwidth=1; c.gridheight=1;
446       c.anchor=GridBagConstraints.NORTHEAST;
447       label = new Label("Host:");
448       container.add(label,c);
449       
450       c.gridx=1; c.gridy=0;
451       c.gridwidth=2; c.gridheight=1;
452       c.anchor=GridBagConstraints.NORTHWEST;
453       host_text = new TextField("socks-proxy",15);
454       container.add(host_text,c);
455       
456       c.gridx=3; c.gridy=0;
457       c.gridwidth=1; c.gridheight=1;
458       c.anchor=GridBagConstraints.NORTHEAST;
459       label = new Label("Port:");
460       container.add(label,c);
461       
462       c.gridx=4; c.gridy=0;
463       c.gridwidth=1; c.gridheight=1;
464       c.anchor=GridBagConstraints.NORTHWEST;
465       port_text = new TextField("1080",5);
466       container.add(port_text,c);
467       
468       c.gridx=0; c.gridy=1;
469       c.gridwidth=3; c.gridheight=1;
470       c.anchor=GridBagConstraints.NORTH;
471       socks4radio = new Checkbox("Socks4",socks_group,false);
472       //1.0 compatible code
473
//socks4radio = new Checkbox("Socks4",false);
474
//socks4radio.setCheckboxGroup(socks_group);
475
socks4radio.setFont(new Font(font.getName(),Font.BOLD,14));
476       container.add(socks4radio,c);
477       
478       c.gridx=3; c.gridy=1;
479       c.gridwidth=2; c.gridheight=1;
480       c.anchor=GridBagConstraints.NORTH;
481       socks5radio = new Checkbox("Socks5",socks_group,true);
482       //1.0 compatible code
483
//socks5radio = new Checkbox("Socks5",true);
484
//socks5radio.setCheckboxGroup(socks_group);
485
socks5radio.setFont(new Font(font.getName(),Font.BOLD,14));
486       container.add(socks5radio,c);
487       
488       c.gridx=0; c.gridy=2;
489       c.gridwidth=1; c.gridheight=1;
490       c.anchor=GridBagConstraints.EAST;
491       label = new Label("User Id:");
492       container.add(label,c);
493       
494       c.gridx=1; c.gridy=2;
495       c.gridwidth=2; c.gridheight=1;
496       c.anchor=GridBagConstraints.NORTHWEST;
497       user_text = new TextField("",15);
498       user_text.setEnabled(false);
499       container.add(user_text,c);
500       
501       c.gridx=3; c.gridy=2;
502       c.gridwidth=2; c.gridheight=1;
503       c.anchor=GridBagConstraints.NORTH;
504       label = new Label("Authentication");
505       label.setFont(new Font(font.getName(),Font.BOLD,14));
506       container.add(label,c);
507       
508       c.gridx=0; c.gridy=3;
509       c.gridwidth=1; c.gridheight=1;
510       c.anchor=GridBagConstraints.EAST;
511       label = new Label("Password:");
512       container.add(label,c);
513       
514       c.gridx=1; c.gridy=3;
515       c.gridwidth=2; c.gridheight=1;
516       c.anchor=GridBagConstraints.NORTHWEST;
517       password_text = new TextField("",15);
518       password_text.setEchoChar('*');
519       password_text.setEnabled(false);
520       //password_text.setEchoCharacter('*');//1.0
521
container.add(password_text,c);
522       
523       c.gridx=3; c.gridy=3;
524       c.gridwidth=2; c.gridheight=1;
525       c.anchor=GridBagConstraints.NORTHWEST;
526       none_check = new Checkbox("None",true);
527       container.add(none_check,c);
528       
529       c.gridx=0; c.gridy=4;
530       c.gridwidth=3; c.gridheight=1;
531       c.anchor=GridBagConstraints.NORTH;
532       label = new Label("Direct Hosts");
533       label.setFont(new Font(font.getName(),Font.BOLD,14));
534       container.add(label,c);
535       
536       c.gridx=3; c.gridy=4;
537       c.gridwidth=2; c.gridheight=1;
538       c.anchor=GridBagConstraints.NORTHWEST;
539       up_check = new Checkbox("User/Password",false);
540       container.add(up_check,c);
541       
542       c.gridx=0; c.gridy=5;
543       c.gridwidth=3; c.gridheight=2;
544       c.anchor=GridBagConstraints.NORTHWEST;
545       c.fill = GridBagConstraints.BOTH;
546       direct_list = new List(3);
547       container.add(direct_list,c);
548       
549       c.gridx=3; c.gridy=5;
550       c.gridwidth=2; c.gridheight=1;
551       c.anchor=GridBagConstraints.NORTHWEST;
552       gssapi_check = new Checkbox("GSSAPI",false);
553       gssapi_check.setEnabled(false);
554       container.add(gssapi_check,c);
555       
556       c.gridx=0; c.gridy=7;
557       c.gridwidth=3; c.gridheight=1;
558       c.anchor=GridBagConstraints.NORTHWEST;
559       direct_text = new TextField("",25);
560       container.add(direct_text,c);
561       
562       c.gridx=3; c.gridy=7;
563       c.gridwidth=1; c.gridheight=1;
564       c.anchor=GridBagConstraints.NORTH;
565       add_button = new Button("Add");
566       container.add(add_button,c);
567       
568       c.gridx=3; c.gridy=6;
569       c.gridwidth=1; c.gridheight=1;
570       c.anchor=GridBagConstraints.NORTH;
571       remove_button = new Button("Remove");
572       container.add(remove_button,c);
573       
574       c.gridx=1; c.gridy=8;
575       c.gridwidth=1; c.gridheight=1;
576       c.anchor=GridBagConstraints.NORTH;
577       cancel_button = new Button("Cancel");
578       container.add(cancel_button,c);
579       
580       c.gridx=0; c.gridy=8;
581       c.gridwidth=1; c.gridheight=1;
582       c.anchor=GridBagConstraints.NORTHWEST;
583       ok_button = new Button("OK");
584       container.add(ok_button,c);
585
586       //up_check.setEnabled(false);
587

588       //Warning Dialog
589
dismiss_button = new Button("Dismiss");
590       warning_label = new Label("",Label.CENTER);
591       warning_label.setFont(new Font("Dialog",Font.BOLD,15));
592
593       Panel p = new Panel();
594       p.add(dismiss_button);
595       warning_dialog.add(p,BorderLayout.SOUTH);
596       warning_dialog.add(warning_label,BorderLayout.CENTER);
597       warning_dialog.setResizable(false);
598    }//end guiInit
599

600 /*
601 // Main
602 ////////////////////////////////////
603    public static void main(String[] args) throws Exception{
604       Frame f = new Frame("Test for SocksDialog");
605       f.add("Center", new Label("Fill the Dialog"));
606       SocksDialog socksdialog = new SocksDialog(f);
607       f.pack();
608       f.show();
609       f.addWindowListener(socksdialog);
610       Proxy p = socksdialog.getProxy();
611       System.out.println("Selected: "+p);
612    }
613 */

614
615 }//end class
616
Popular Tags