diff src/net/sourceforge/jsocks/SocksDialog.java @ 349:205ee2873330

update jsocks to 2011-03-19
author Carl Byington <carl@five-ten-sg.com>
date Fri, 01 Aug 2014 11:23:10 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/sourceforge/jsocks/SocksDialog.java	Fri Aug 01 11:23:10 2014 -0700
@@ -0,0 +1,615 @@
+package net.sourceforge.jsocks;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+  Socks configuration dialog.<br>
+  Class which provides GUI means of getting CProxy configuration
+  from the user.
+ */
+public class SocksDialog extends Dialog
+                         implements WindowListener,
+                                    ItemListener,
+                                    ActionListener,
+                                    Runnable{
+
+//GUI components
+   TextField host_text,
+             port_text,
+             user_text,
+             password_text,
+             direct_text;
+   Button add_button,
+          remove_button,
+          cancel_button,
+          ok_button,
+          dismiss_button;
+   List direct_list;
+   Checkbox socks4radio,
+            socks5radio,
+            none_check,
+            up_check,
+            gssapi_check;
+
+   Dialog warning_dialog;
+   Label warning_label;
+
+   String host,user,password;
+   int port;
+   Thread net_thread = null;
+   
+   //CheckboxGroups
+   CheckboxGroup socks_group = new CheckboxGroup();
+
+   CProxy proxy;
+   InetRange ir;
+
+   final static int COMMAND_MODE = 0;
+   final static int OK_MODE = 1;
+
+   int mode;
+
+   /**Wether to resolve addresses in separate thread.
+      <p>
+      Default value is true, however on some JVMs, namely one from
+      the Microsoft, it doesn't want to work properly, separate thread
+      can't close the dialog opened in GUI thread, and everuthing else
+      is then crashes.
+      <p>
+      When setting this variable to false, SocksDialog will block while
+      trying to look up proxy host, and if this takes considerable amount
+      of time it might be annoying to user.
+
+   */
+   public static boolean useThreads = true;
+
+
+// Constructors
+////////////////////////////////////
+   /**
+     Creates SOCKS configuration dialog.<br>
+     Uses default initialisation:<br>
+     CProxy host: socks-proxy <br>
+     CProxy port: 1080 <br>
+     Version: 5<br>
+
+    */
+   public SocksDialog(Frame parent){
+      this(parent,null);
+   }
+   /**
+    Creates SOCKS configuration dialog and initialises it
+    to given proxy.
+    */
+   public SocksDialog(Frame parent,CProxy init_proxy){
+     super(parent,"Proxy Configuration",true);
+     warning_dialog = new Dialog(parent,"Warning",true);
+
+     guiInit();
+     setResizable(false);
+     addWindowListener(this);
+     Component[] comps = getComponents();
+     for(int i=0;i<comps.length;++i){
+        if(comps[i] instanceof Button)
+           ((Button)comps[i]).addActionListener(this);
+        else if(comps[i] instanceof TextField)
+           ((TextField) comps[i]).addActionListener(this);
+        else if(comps[i] instanceof Checkbox){
+           ((Checkbox)comps[i]).addItemListener(this);
+        }
+     }
+     proxy = init_proxy;
+     if(proxy != null) doInit(proxy);
+     else ir = new InetRange();
+
+     dismiss_button.addActionListener(this);
+     warning_dialog.addWindowListener(this);
+   }
+
+//Public Methods
+////////////////
+
+   /**
+     Displays SOCKS configuartion dialog.
+     <p>
+     Returns initialised proxy object, or null if user cancels dialog
+     by either pressing Cancel or closing the dialog window.
+    */
+   public CProxy getProxy(){
+      mode = COMMAND_MODE;
+      pack();
+      show();
+      return proxy;
+   }
+
+   /**
+     Initialises dialog to given proxy and displays SOCKS configuartion dialog.
+     <p>
+     Returns initialised proxy object, or null if user cancels dialog
+     by either pressing Cancel or closing the dialog window.
+    */
+    public CProxy getProxy(CProxy p){
+      if(p != null){
+         doInit(p);
+      }
+      mode = COMMAND_MODE;
+      pack();
+      show();
+      return proxy;
+   }
+
+// WindowListener Interface
+/////////////////////////////////
+   public void windowActivated(java.awt.event.WindowEvent e){
+   }
+   public void windowDeactivated(java.awt.event.WindowEvent e){
+   }
+   public void windowOpened(java.awt.event.WindowEvent e){
+   }
+   public void windowClosing(java.awt.event.WindowEvent e){
+      Window source = e.getWindow();
+      if(source == this){
+         onCancel();
+      }else if(source == warning_dialog){
+         onDismiss();
+      }
+   }
+   public void windowClosed(java.awt.event.WindowEvent e){
+   }
+   public void windowIconified(java.awt.event.WindowEvent e){
+   }
+   public void windowDeiconified(java.awt.event.WindowEvent e){
+   }
+
+//ActionListener interface
+///////////////////////////
+   public void actionPerformed(ActionEvent ae){
+
+      Object source = ae.getSource();
+
+      if(source == cancel_button )
+         onCancel();
+      else if(source == add_button || source == direct_text)
+         onAdd();
+      else if(source == remove_button)
+         onRemove();
+      else if(source == dismiss_button)
+         onDismiss();
+      else if(source == ok_button || source instanceof TextField)
+         onOK();
+   }
+//ItemListener interface
+////////////////////////
+   public void itemStateChanged(ItemEvent ie){
+      Object source = ie.getSource();
+      //System.out.println("ItemEvent:"+source);
+      if(source == socks5radio || source == socks4radio)
+         onSocksChange();
+      else if(source == up_check)
+         onUPChange();
+
+   }
+//Runnable interface
+////////////////////
+   /**
+     Resolves proxy address in other thread, to avoid
+     annoying blocking in GUI thread.
+   */
+   public void run(){
+
+      if(!initProxy()){
+         //Check if we have been aborted
+         if(mode != OK_MODE) return;
+         if(net_thread != Thread.currentThread()) return;
+
+         mode = COMMAND_MODE;
+         warning_label.setText("Look up failed.");
+         warning_label.invalidate();
+         return;
+      }
+
+      //System.out.println("Done!");
+      while(!warning_dialog.isShowing())
+           ; /* do nothing*/;
+
+      warning_dialog.dispose();
+      //dispose(); //End Dialog
+   }
+
+//Private Methods
+///////////////////
+   private void onOK(){
+      host = host_text.getText().trim();
+      user = user_text.getText();
+      password = password_text.getText();
+
+      if(host.length() == 0){
+        warn("Proxy host is not set!");
+        return;
+      }
+      if(socks_group.getSelectedCheckbox() == socks4radio){
+        if(user.length() == 0){
+          warn("User name is not set");
+          return;
+        }
+
+      }else{
+        if(up_check.getState()){
+          if(user.length() == 0){
+            warn("User name is not set.");
+            return;
+          }
+          if(password.length()==0){
+            warn("Password is not set.");
+            return;
+          }
+        }else if(!none_check.getState()){
+          warn("Please select at least one Authentication Method.");
+          return;
+        }
+      }
+
+      try{
+         port = Integer.parseInt(port_text.getText());
+      }catch(NumberFormatException nfe){
+         warn("Proxy port is invalid!");
+         return;
+      }
+
+      mode = OK_MODE;
+
+      if(useThreads){
+         net_thread = new Thread(this);
+         net_thread.start();
+
+         info("Looking up host: "+host);
+         //System.out.println("Info returned.");
+      }else if(!initProxy()){
+           warn("Proxy host is invalid.");
+           mode = COMMAND_MODE;
+         }
+
+      if(mode == OK_MODE) dispose();
+   }
+
+   private void onCancel(){
+      //System.out.println("Cancel");
+      proxy = null;
+      dispose();
+   }
+
+   private void onAdd(){
+      String s = direct_text.getText();
+      s.trim();
+      if(s.length() == 0 ) return;
+      //Check for Duplicate
+      String[] direct_hosts = direct_list.getItems();
+      for(int i=0;i<direct_hosts.length;++i)
+         if(direct_hosts[i].equals(s)) return;
+
+      direct_list.add(s);
+      ir.add(s);
+   }
+   private void onRemove(){
+      int index = direct_list.getSelectedIndex();
+      if(index < 0) return;
+      ir.remove(direct_list.getItem(index));
+      direct_list.remove(index);
+      direct_list.select(index);
+   }
+
+   private void onSocksChange(){
+      Object selected = socks_group.getSelectedCheckbox();
+      if(selected == socks4radio){
+         user_text.setEnabled(true);
+         password_text.setEnabled(false);
+         none_check.setEnabled(false);
+         up_check.setEnabled(false);
+      }else{
+         if(up_check.getState()){
+           user_text.setEnabled(true);
+           password_text.setEnabled(true);
+         }else{
+           user_text.setEnabled(false);
+           password_text.setEnabled(false);
+         }
+         none_check.setEnabled(true);
+         up_check.setEnabled(true);
+      }
+      //System.out.println("onSocksChange:"+selected);
+   }
+   private void onUPChange(){
+      //System.out.println("onUPChange");
+      if(up_check.getState()){
+        user_text.setEnabled(true);
+        password_text.setEnabled(true);
+      }else{
+        user_text.setEnabled(false);
+        password_text.setEnabled(false);
+      }
+   }
+   private void onDismiss(){
+     warning_dialog.dispose();
+     if(mode == OK_MODE){
+       mode = COMMAND_MODE;
+       if(net_thread!=null) net_thread.interrupt();
+     }
+   }
+
+   private void doInit(CProxy p){
+     if(p.version == 5){
+       socks_group.setSelectedCheckbox(socks5radio);
+       onSocksChange();
+       if(((Socks5Proxy)p).getAuthenticationMethod(0)!=null)
+          none_check.setState(true);
+       UserPasswordAuthentication auth = (UserPasswordAuthentication) 
+                                  ((Socks5Proxy)p).getAuthenticationMethod(2);
+       if(auth!=null){
+          user_text.setText(auth.getUser());
+          password_text.setText(auth.getPassword());
+          up_check.setState(true);
+          onUPChange();
+       }
+     }else{
+       socks_group.setSelectedCheckbox(socks4radio);
+       onSocksChange();
+       user_text.setText(((Socks4Proxy)p).user);
+     }
+     ir = (InetRange)(p.directHosts.clone());
+     String[] direct_hosts = ir.getAll();
+     direct_list.removeAll();
+     for(int i=0;i<direct_hosts.length;++i)
+       direct_list.add(direct_hosts[i]);
+
+     host_text.setText(p.proxyIP.getHostName());
+     port_text.setText(""+p.proxyPort);
+
+   }
+
+   private boolean initProxy(){
+      try{
+         if(socks_group.getSelectedCheckbox() == socks5radio){
+            proxy = new Socks5Proxy(host,port);
+            if(up_check.getState())
+              ((Socks5Proxy)proxy).setAuthenticationMethod(2,
+                           new UserPasswordAuthentication(user,password));
+            if(!none_check.getState())
+              ((Socks5Proxy)proxy).setAuthenticationMethod(0,null);
+         }
+         else
+            proxy = new Socks4Proxy(host,port,user);
+      }catch(java.net.UnknownHostException uhe){
+         return false;
+      }
+      proxy.directHosts = ir;
+      return true;
+   }
+   private void info(String s){
+     msgBox("Info",s);
+   }
+
+   private void warn(String s){
+     msgBox("Warning",s);
+   }
+   
+   private void msgBox(String title, String message){
+     warning_label.setText(message);
+     warning_label.invalidate();
+     warning_dialog.setTitle(title);
+     warning_dialog.pack();
+     warning_dialog.show();
+   }
+
+/*======================================================================
+  Form:
+  Table:
+          +---+-------+---+---+
+          |   |       |   |   |
+          +---+-------+---+---+
+          |           |       |
+          +---+-------+-------+
+          |   |       |       |
+          +---+-------+-------+
+          |   |       |       |
+          +---+-------+-------+
+          |           |       |
+          +-----------+-------+
+          |           |       |
+          |           +---+---+
+          |           |   |   |
+          +-----------+---+---+
+          |           |   |   |
+          +---+---+---+---+---+
+          |   |   |   |   |   |
+          +---+---+---+---+---+
+*/
+
+   void guiInit(){
+      //Some default names used
+      Label label;
+      Container container;
+      Font font;
+
+      GridBagConstraints c = new GridBagConstraints();
+
+      font = new Font("Dialog",Font.PLAIN,12);
+      
+      container = this;
+      //container = new Panel();
+      container.setLayout(new GridBagLayout());
+      container.setFont(font);
+      container.setBackground(SystemColor.menu);
+      c.insets = new Insets(3,3,3,3);
+      
+      c.gridx=0; c.gridy=0;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHEAST;
+      label = new Label("Host:");
+      container.add(label,c);
+      
+      c.gridx=1; c.gridy=0;
+      c.gridwidth=2; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      host_text = new TextField("socks-proxy",15);
+      container.add(host_text,c);
+      
+      c.gridx=3; c.gridy=0;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHEAST;
+      label = new Label("Port:");
+      container.add(label,c);
+      
+      c.gridx=4; c.gridy=0;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      port_text = new TextField("1080",5);
+      container.add(port_text,c);
+      
+      c.gridx=0; c.gridy=1;
+      c.gridwidth=3; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTH;
+      socks4radio = new Checkbox("Socks4",socks_group,false);
+      //1.0 compatible code
+      //socks4radio = new Checkbox("Socks4",false);
+      //socks4radio.setCheckboxGroup(socks_group);
+      socks4radio.setFont(new Font(font.getName(),Font.BOLD,14));
+      container.add(socks4radio,c);
+      
+      c.gridx=3; c.gridy=1;
+      c.gridwidth=2; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTH;
+      socks5radio = new Checkbox("Socks5",socks_group,true);
+      //1.0 compatible code
+      //socks5radio = new Checkbox("Socks5",true);
+      //socks5radio.setCheckboxGroup(socks_group);
+      socks5radio.setFont(new Font(font.getName(),Font.BOLD,14));
+      container.add(socks5radio,c);
+      
+      c.gridx=0; c.gridy=2;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.EAST;
+      label = new Label("User Id:");
+      container.add(label,c);
+      
+      c.gridx=1; c.gridy=2;
+      c.gridwidth=2; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      user_text = new TextField("",15);
+      user_text.setEnabled(false);
+      container.add(user_text,c);
+      
+      c.gridx=3; c.gridy=2;
+      c.gridwidth=2; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTH;
+      label = new Label("Authentication");
+      label.setFont(new Font(font.getName(),Font.BOLD,14));
+      container.add(label,c);
+      
+      c.gridx=0; c.gridy=3;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.EAST;
+      label = new Label("Password:");
+      container.add(label,c);
+      
+      c.gridx=1; c.gridy=3;
+      c.gridwidth=2; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      password_text = new TextField("",15);
+      password_text.setEchoChar('*');
+      password_text.setEnabled(false);
+      //password_text.setEchoCharacter('*');//1.0
+      container.add(password_text,c);
+      
+      c.gridx=3; c.gridy=3;
+      c.gridwidth=2; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      none_check = new Checkbox("None",true);
+      container.add(none_check,c);
+      
+      c.gridx=0; c.gridy=4;
+      c.gridwidth=3; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTH;
+      label = new Label("Direct Hosts");
+      label.setFont(new Font(font.getName(),Font.BOLD,14));
+      container.add(label,c);
+      
+      c.gridx=3; c.gridy=4;
+      c.gridwidth=2; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      up_check = new Checkbox("User/Password",false);
+      container.add(up_check,c);
+      
+      c.gridx=0; c.gridy=5;
+      c.gridwidth=3; c.gridheight=2;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      c.fill = GridBagConstraints.BOTH;
+      direct_list = new List(3);
+      container.add(direct_list,c);
+      
+      c.gridx=3; c.gridy=5;
+      c.gridwidth=2; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      gssapi_check = new Checkbox("GSSAPI",false);
+      gssapi_check.setEnabled(false);
+      container.add(gssapi_check,c);
+      
+      c.gridx=0; c.gridy=7;
+      c.gridwidth=3; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      direct_text = new TextField("",25);
+      container.add(direct_text,c);
+      
+      c.gridx=3; c.gridy=7;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTH;
+      add_button = new Button("Add");
+      container.add(add_button,c);
+      
+      c.gridx=3; c.gridy=6;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTH;
+      remove_button = new Button("Remove");
+      container.add(remove_button,c);
+      
+      c.gridx=1; c.gridy=8;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTH;
+      cancel_button = new Button("Cancel");
+      container.add(cancel_button,c);
+      
+      c.gridx=0; c.gridy=8;
+      c.gridwidth=1; c.gridheight=1;
+      c.anchor=GridBagConstraints.NORTHWEST;
+      ok_button = new Button("OK");
+      container.add(ok_button,c);
+
+      //up_check.setEnabled(false);
+
+      //Warning Dialog
+      dismiss_button = new Button("Dismiss");
+      warning_label  = new Label("",Label.CENTER);
+      warning_label.setFont(new Font("Dialog",Font.BOLD,15));
+
+      Panel p = new Panel();
+      p.add(dismiss_button);
+      warning_dialog.add(p,BorderLayout.SOUTH);
+      warning_dialog.add(warning_label,BorderLayout.CENTER);
+      warning_dialog.setResizable(false);
+   }//end guiInit
+
+/*
+// Main 
+////////////////////////////////////
+   public static void main(String[] args) throws Exception{
+      Frame f = new Frame("Test for SocksDialog");
+      f.add("Center", new Label("Fill the Dialog"));
+      SocksDialog socksdialog = new SocksDialog(f);
+      f.pack();
+      f.show();
+      f.addWindowListener(socksdialog);
+      CProxy p = socksdialog.getProxy();
+      System.out.println("Selected: "+p);
+   }
+*/
+
+}//end class