/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.plugin.globalproxyconfig; import java.awt.*; import java.awt.event.*; import javax.swing.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.protocol.*; import org.jitsi.service.configuration.*; /** * Implementation of the configuration form. * * @author Damian Minkov */ public class GlobalProxyConfigForm extends TransparentPanel implements ActionListener, KeyListener { /** * Serial version UID. */ private static final long serialVersionUID = 0L; /** * Hold the available proxy types. */ private JComboBox typeCombo; /** * The proxy server address. */ private JTextField serverAddressField = new JTextField(); /** * The proxy server port. */ private JTextField portField = new JTextField(); /** * The username if any. */ private JTextField usernameField = new JTextField(); /** * The password for accessing proxy, if any. */ private JPasswordField passwordField = new JPasswordField(); /** * The dns forward global checkbox, hides/shows the panel with values. */ private JCheckBox dnsForwardCheck = new SIPCommCheckBox(); /** * Dns server address initially filled with the value of the proxy. */ private JTextField dnsForwardServerAddressField = new JTextField(); /** * Dns server port, initially filled with the value of the proxy. */ private JTextField dnsForwardPortField = new JTextField(); /** * Tha panel containing address and port for dns forwarding. */ private TransparentPanel dnsAddressPane; /** * Creates the form. */ public GlobalProxyConfigForm() { super(new BorderLayout()); init(); } /** * Creating the configuration form */ private void init() { TransparentPanel centerPanel = new TransparentPanel(new GridBagLayout()); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.NORTHWEST; constraints.insets = new Insets(5,10,0,0); constraints.gridx = 0; constraints.weightx = 0; constraints.weighty = 0; constraints.gridy = 0; centerPanel.add(new JLabel( Resources.getString("plugin.globalproxy.PROXY_TYPE")), constraints); constraints.gridy = 1; centerPanel.add(new JLabel( Resources.getString("plugin.globalproxy.PROXY_ADDRESS")), constraints); constraints.gridy = 2; centerPanel.add(new JLabel( Resources.getString("plugin.globalproxy.PROXY_USERNAME")), constraints); constraints.gridy = 3; centerPanel.add(new JLabel( Resources.getString("plugin.globalproxy.PROXY_PASSWORD")), constraints); constraints.weightx = 1; constraints.gridx = 1; constraints.gridy = 0; constraints.gridwidth = 3; typeCombo = new JComboBox(ProxyInfo.ProxyType.values()); typeCombo.setEditable(false); centerPanel.add(typeCombo, constraints); constraints.gridy = 1; constraints.gridwidth = 1; centerPanel.add(serverAddressField, constraints); constraints.gridx = 2; constraints.weightx = 0; centerPanel.add( new JLabel( Resources.getString("plugin.globalproxy.PROXY_PORT")), constraints); constraints.gridx = 3; constraints.weightx = 1; centerPanel.add(portField, constraints); constraints.gridx = 1; constraints.gridwidth = 3; constraints.gridy = 2; centerPanel.add(usernameField, constraints); constraints.gridy = 3; centerPanel.add(passwordField, constraints); constraints.gridx = 0; constraints.gridy = 4; constraints.gridwidth = 4; constraints.gridheight = 2; constraints.insets = new Insets(15,15,0,15); JTextPane pane = new JTextPane(); pane.setEditable(false); pane.setOpaque(false); pane.setText(Resources.getResources().getI18NString( "plugin.globalproxy.DESCRIPTION", new String[]{Resources.getResources().getSettingsString( "service.gui.APPLICATION_NAME")})); centerPanel.add( pane, constraints); constraints.gridx = 0; constraints.gridy = 6; constraints.gridwidth = 4; constraints.gridheight = 2; constraints.insets = new Insets(0, 20, 0, 20); JEditorPane table = new JEditorPane(); table.setContentType("text/html"); table.setEditable(false); table.setOpaque(false); table.putClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); table.setText(Resources.getString( "plugin.globalproxy.PROTOCOL_SUPPORT")); centerPanel.add( table, constraints); constraints.weightx = 0; constraints.gridx = 0; constraints.gridy = 9; constraints.gridwidth = 4; constraints.gridheight = 1; constraints.insets = new Insets(5,10,0,0); dnsForwardCheck.setText(Resources.getResources() .getI18NString("plugin.globalproxy.FWD_DNS")); centerPanel.add(dnsForwardCheck, constraints); constraints.gridy = 10; constraints.insets = new Insets(0, 38, 0, 0); String dnsForwardLabelText = Resources.getResources() .getI18NString("plugin.globalproxy.FWD_DNS_NOTE"); JTextPane dnspane = new JTextPane(); dnspane.setEditable(false); dnspane.setOpaque(false); dnspane.setText(dnsForwardLabelText); dnspane.setForeground(Color.GRAY); dnspane.setFont(dnspane.getFont().deriveFont(8)); centerPanel.add(dnspane, constraints); constraints.gridy = 11; constraints.gridwidth = 4; constraints.gridheight = 2; dnsAddressPane = new TransparentPanel(new GridLayout(2, 2)); dnsAddressPane.add(new JLabel(Resources.getResources() .getI18NString("plugin.globalproxy.FWD_DNS_ADDR"))); dnsAddressPane.add(dnsForwardServerAddressField); dnsAddressPane.add(new JLabel(Resources.getResources() .getI18NString("plugin.globalproxy.FWD_DNS_PORT"))); dnsAddressPane.add(dnsForwardPortField); dnsAddressPane.setVisible(false); centerPanel.add(dnsAddressPane, constraints); add(centerPanel, BorderLayout.NORTH); loadValues(); // now after loading has finished we can add all the listeners // so we can get further changes serverAddressField.addKeyListener(this); portField.addKeyListener(this); usernameField.addKeyListener(this); passwordField.addKeyListener(this); typeCombo.addActionListener(this); dnsForwardServerAddressField.addKeyListener(this); dnsForwardPortField.addKeyListener(this); dnsForwardCheck.addActionListener(this); } /** * Loading the values stored onto configuration form */ private void loadValues() { ConfigurationService configService = GlobalProxyPluginActivator.getConfigurationService(); String serverAddress = configService.getString( ProxyInfo.CONNECTION_PROXY_ADDRESS_PROPERTY_NAME); if(serverAddress != null) serverAddressField.setText(serverAddress); String port = configService.getString( ProxyInfo.CONNECTION_PROXY_PORT_PROPERTY_NAME); if(port != null) portField.setText(port); String username = configService.getString( ProxyInfo.CONNECTION_PROXY_USERNAME_PROPERTY_NAME); if(username != null) usernameField.setText(username); String password = configService.getString( ProxyInfo.CONNECTION_PROXY_PASSWORD_PROPERTY_NAME); if(password != null) passwordField.setText(password); // we load the types at the end cause a event will ne trigered // when selecting the configured value, which will eventually // trigger a save operation try { String type = configService.getString( ProxyInfo.CONNECTION_PROXY_TYPE_PROPERTY_NAME); if(type != null) typeCombo.setSelectedItem(ProxyInfo.ProxyType.valueOf(type)); } catch (IllegalArgumentException e) { // wrong proxy type stored in configuration } if(typeCombo.getSelectedItem().equals(ProxyInfo.ProxyType.NONE)) { serverAddressField.setEnabled(false); portField.setEnabled(false); usernameField.setEnabled(false); passwordField.setEnabled(false); } // load dns forward values if(configService.getBoolean( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_PROPERTY_NAME, false)) { dnsForwardCheck.setSelected(true); dnsForwardServerAddressField.setText( (String)configService.getProperty( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_ADDRESS_PROPERTY_NAME)); dnsForwardPortField.setText( (String)configService.getProperty( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_PORT_PROPERTY_NAME)); dnsAddressPane.setVisible(true); } } /** * Function which save values onto configuration file after save button is * clicked */ private void saveValues() { ConfigurationService configService = GlobalProxyPluginActivator.getConfigurationService(); if(typeCombo.getSelectedItem().equals(ProxyInfo.ProxyType.NONE)) { configService.setProperty( ProxyInfo.CONNECTION_PROXY_TYPE_PROPERTY_NAME, ProxyInfo.ProxyType.NONE.name()); configService.removeProperty( ProxyInfo.CONNECTION_PROXY_ADDRESS_PROPERTY_NAME); configService.removeProperty( ProxyInfo.CONNECTION_PROXY_PORT_PROPERTY_NAME); configService.removeProperty( ProxyInfo.CONNECTION_PROXY_USERNAME_PROPERTY_NAME); configService.removeProperty( ProxyInfo.CONNECTION_PROXY_PASSWORD_PROPERTY_NAME); } else { // If there is no proxy server address or port entered skip the // configuration, otherwise it can lead to unusable state of the // providers with only proxy type setting and no server // or port String serverAddress = serverAddressField.getText(); String port = portField.getText(); if(serverAddress == null || serverAddress.length() == 0 || port == null || port.length() == 0) { return; } configService.setProperty( ProxyInfo.CONNECTION_PROXY_TYPE_PROPERTY_NAME, ((ProxyInfo.ProxyType)typeCombo.getSelectedItem()).name()); if(serverAddress != null && serverAddress.length() > 0) configService.setProperty( ProxyInfo.CONNECTION_PROXY_ADDRESS_PROPERTY_NAME, serverAddress); if(port != null && port.length() > 0) configService.setProperty( ProxyInfo.CONNECTION_PROXY_PORT_PROPERTY_NAME, port); String username = usernameField.getText(); if(username != null && username.length() > 0) { configService.setProperty( ProxyInfo.CONNECTION_PROXY_USERNAME_PROPERTY_NAME, username); } else { configService.removeProperty( ProxyInfo.CONNECTION_PROXY_USERNAME_PROPERTY_NAME); } char[] password = passwordField.getPassword(); if(password.length > 0) { configService.setProperty( ProxyInfo.CONNECTION_PROXY_PASSWORD_PROPERTY_NAME, new String(password)); } else { configService.removeProperty( ProxyInfo.CONNECTION_PROXY_PASSWORD_PROPERTY_NAME); } } // save dns forward values if(dnsForwardCheck.isSelected()) { configService.setProperty( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_PROPERTY_NAME, Boolean.TRUE); configService.setProperty( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_ADDRESS_PROPERTY_NAME, dnsForwardServerAddressField.getText().trim()); configService.setProperty( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_PORT_PROPERTY_NAME, dnsForwardPortField.getText().trim()); } else { configService.removeProperty( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_PROPERTY_NAME); configService.removeProperty( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_ADDRESS_PROPERTY_NAME); configService.removeProperty( ProxyInfo.CONNECTION_PROXY_FORWARD_DNS_PORT_PROPERTY_NAME); } GlobalProxyPluginActivator.initProperties(); } /** * A new type was selected in the type combo box. * @param e the event */ public void actionPerformed(ActionEvent e) { if(e.getSource().equals(dnsForwardCheck)) { // lets show or hide the fields dnsAddressPane.setVisible(dnsForwardCheck.isSelected()); if(dnsForwardCheck.isSelected()) { if(dnsForwardServerAddressField.getText().length() == 0) dnsForwardServerAddressField.setText( serverAddressField.getText()); if(dnsForwardPortField.getText().length() == 0) dnsForwardPortField.setText("53"); } revalidate(); repaint(); // and save initial values saveValues(); return; } // else this is the typeCombo action if(typeCombo.getSelectedItem().equals(ProxyInfo.ProxyType.NONE)) { serverAddressField.setEnabled(false); portField.setEnabled(false); usernameField.setEnabled(false); passwordField.setEnabled(false); } else { serverAddressField.setEnabled(true); portField.setEnabled(true); usernameField.setEnabled(true); passwordField.setEnabled(true); } saveValues(); } /** * Not used. * @param e */ public void keyTyped(KeyEvent e) {} /** * Not used. * @param e */ public void keyPressed(KeyEvent e) {} /** * Used to listen for changes and saving on every change. * @param e */ public void keyReleased(KeyEvent e) { saveValues(); } }