source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java@ 17271

Last change on this file since 17271 was 17271, checked in by Don-vip, 3 years ago

see #7548 - remove unused variable

  • Property svn:eol-style set to native
File size: 12.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.server;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5import static org.openstreetmap.josm.tools.I18n.trc;
6
7import java.awt.Component;
8import java.awt.Dimension;
9import java.awt.GridBagConstraints;
10import java.awt.GridBagLayout;
11import java.awt.Insets;
12import java.awt.event.ItemEvent;
13import java.awt.event.ItemListener;
14import java.net.Authenticator.RequestorType;
15import java.net.PasswordAuthentication;
16import java.net.ProxySelector;
17import java.util.Arrays;
18import java.util.EnumMap;
19import java.util.Map;
20import java.util.Optional;
21
22import javax.swing.BorderFactory;
23import javax.swing.ButtonGroup;
24import javax.swing.JLabel;
25import javax.swing.JPanel;
26import javax.swing.JRadioButton;
27
28import org.openstreetmap.josm.gui.help.HelpUtil;
29import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
30import org.openstreetmap.josm.gui.widgets.JosmPasswordField;
31import org.openstreetmap.josm.gui.widgets.JosmTextField;
32import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
33import org.openstreetmap.josm.io.DefaultProxySelector;
34import org.openstreetmap.josm.io.ProxyPolicy;
35import org.openstreetmap.josm.io.auth.CredentialsAgent;
36import org.openstreetmap.josm.io.auth.CredentialsAgentException;
37import org.openstreetmap.josm.io.auth.CredentialsManager;
38import org.openstreetmap.josm.spi.preferences.Config;
39import org.openstreetmap.josm.tools.GBC;
40import org.openstreetmap.josm.tools.Logging;
41
42/**
43 * Component allowing input of proxy settings.
44 */
45public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
46
47 static final class AutoSizePanel extends JPanel {
48 AutoSizePanel() {
49 super(new GridBagLayout());
50 }
51
52 @Override
53 public Dimension getMinimumSize() {
54 return getPreferredSize();
55 }
56 }
57
58 private transient Map<ProxyPolicy, JRadioButton> rbProxyPolicy;
59 private final JosmTextField tfProxyHttpHost = new JosmTextField();
60 private final JosmTextField tfProxyHttpPort = new JosmTextField(5);
61 private final JosmTextField tfProxySocksHost = new JosmTextField(20);
62 private final JosmTextField tfProxySocksPort = new JosmTextField(5);
63 private final JosmTextField tfProxyHttpUser = new JosmTextField(20);
64 private final JosmPasswordField tfProxyHttpPassword = new JosmPasswordField(20);
65
66 private JPanel pnlHttpProxyConfigurationPanel;
67 private JPanel pnlSocksProxyConfigurationPanel;
68
69 /**
70 * Builds the panel for the HTTP proxy configuration
71 *
72 * @return panel with HTTP proxy configuration
73 */
74 protected final JPanel buildHttpProxyConfigurationPanel() {
75 JPanel pnl = new AutoSizePanel();
76 GridBagConstraints gc = new GridBagConstraints();
77
78 gc.anchor = GridBagConstraints.WEST;
79 gc.insets = new Insets(5, 5, 0, 0);
80 gc.fill = GridBagConstraints.HORIZONTAL;
81 gc.weightx = 0.0;
82 pnl.add(new JLabel(tr("Host:")), gc);
83
84 gc.gridx = 1;
85 gc.weightx = 1.0;
86 pnl.add(tfProxyHttpHost, gc);
87
88 gc.gridy = 1;
89 gc.gridx = 0;
90 gc.fill = GridBagConstraints.NONE;
91 gc.weightx = 0.0;
92 pnl.add(new JLabel(trc("server", "Port:")), gc);
93
94 gc.gridx = 1;
95 gc.weightx = 1.0;
96 pnl.add(tfProxyHttpPort, gc);
97 tfProxyHttpPort.setMinimumSize(tfProxyHttpPort.getPreferredSize());
98
99 gc.gridy = 2;
100 gc.gridx = 0;
101 gc.gridwidth = 2;
102 gc.fill = GridBagConstraints.HORIZONTAL;
103 gc.weightx = 1.0;
104 pnl.add(new JMultilineLabel(tr("Please enter a username and a password if your proxy requires authentication.")), gc);
105
106 gc.gridy = 3;
107 gc.gridx = 0;
108 gc.gridwidth = 1;
109 gc.fill = GridBagConstraints.NONE;
110 gc.weightx = 0.0;
111 pnl.add(new JLabel(tr("User:")), gc);
112
113 gc.gridy = 3;
114 gc.gridx = 1;
115 gc.weightx = 1.0;
116 pnl.add(tfProxyHttpUser, gc);
117 tfProxyHttpUser.setMinimumSize(tfProxyHttpUser.getPreferredSize());
118
119 gc.gridy = 4;
120 gc.gridx = 0;
121 gc.weightx = 0.0;
122 pnl.add(new JLabel(tr("Password:")), gc);
123
124 gc.gridx = 1;
125 gc.weightx = 1.0;
126 pnl.add(tfProxyHttpPassword, gc);
127 tfProxyHttpPassword.setMinimumSize(tfProxyHttpPassword.getPreferredSize());
128
129 // add an extra spacer, otherwise the layout is broken
130 gc.gridy = 5;
131 gc.gridx = 0;
132 gc.gridwidth = 2;
133 gc.fill = GridBagConstraints.BOTH;
134 gc.weightx = 1.0;
135 gc.weighty = 1.0;
136 pnl.add(new JPanel(), gc);
137 return pnl;
138 }
139
140 /**
141 * Builds the panel for the SOCKS proxy configuration
142 *
143 * @return panel with SOCKS proxy configuration
144 */
145 protected final JPanel buildSocksProxyConfigurationPanel() {
146 JPanel pnl = new AutoSizePanel();
147 GridBagConstraints gc = new GridBagConstraints();
148 gc.anchor = GridBagConstraints.WEST;
149 gc.insets = new Insets(5, 5, 0, 0);
150 gc.fill = GridBagConstraints.HORIZONTAL;
151 gc.weightx = 0.0;
152 pnl.add(new JLabel(tr("Host:")), gc);
153
154 gc.gridx = 1;
155 gc.weightx = 1.0;
156 pnl.add(tfProxySocksHost, gc);
157
158 gc.gridy = 1;
159 gc.gridx = 0;
160 gc.weightx = 0.0;
161 gc.fill = GridBagConstraints.NONE;
162 pnl.add(new JLabel(trc("server", "Port:")), gc);
163
164 gc.gridx = 1;
165 gc.weightx = 1.0;
166 pnl.add(tfProxySocksPort, gc);
167 tfProxySocksPort.setMinimumSize(tfProxySocksPort.getPreferredSize());
168
169 // add an extra spacer, otherwise the layout is broken
170 gc.gridy = 2;
171 gc.gridx = 0;
172 gc.gridwidth = 2;
173 gc.fill = GridBagConstraints.BOTH;
174 gc.weightx = 1.0;
175 gc.weighty = 1.0;
176 pnl.add(new JPanel(), gc);
177 return pnl;
178 }
179
180 protected final JPanel buildProxySettingsPanel() {
181 JPanel pnl = new JPanel(new GridBagLayout());
182
183 ButtonGroup bgProxyPolicy = new ButtonGroup();
184 rbProxyPolicy = new EnumMap<>(ProxyPolicy.class);
185 ProxyPolicyChangeListener policyChangeListener = new ProxyPolicyChangeListener();
186 for (ProxyPolicy pp: ProxyPolicy.values()) {
187 rbProxyPolicy.put(pp, new JRadioButton());
188 bgProxyPolicy.add(rbProxyPolicy.get(pp));
189 rbProxyPolicy.get(pp).addItemListener(policyChangeListener);
190 }
191
192 // radio button "No proxy"
193 rbProxyPolicy.get(ProxyPolicy.NO_PROXY).setText(tr("No proxy"));
194 pnl.add(rbProxyPolicy.get(ProxyPolicy.NO_PROXY), GBC.eop().anchor(GBC.NORTHWEST));
195
196 // radio button "System settings"
197 pnl.add(rbProxyPolicy.get(ProxyPolicy.USE_SYSTEM_SETTINGS), GBC.eol());
198 rbProxyPolicy.get(ProxyPolicy.USE_SYSTEM_SETTINGS).setText(tr("Use standard system settings"));
199 if (!DefaultProxySelector.willJvmRetrieveSystemProxies()) {
200 String msg = tr("Use standard system settings (disabled. Start JOSM with <tt>-Djava.net.useSystemProxies=true</tt> to enable)");
201 pnl.add(new JMultilineLabel("<html>" + msg + "</html>"), GBC.eop());
202 }
203
204 // radio button http proxy
205 rbProxyPolicy.get(ProxyPolicy.USE_HTTP_PROXY).setText(tr("Manually configure a HTTP proxy"));
206 pnl.add(rbProxyPolicy.get(ProxyPolicy.USE_HTTP_PROXY), GBC.eol());
207
208 // the panel with the http proxy configuration parameters
209 pnlHttpProxyConfigurationPanel = buildHttpProxyConfigurationPanel();
210 pnl.add(pnlHttpProxyConfigurationPanel, GBC.eop().fill(GBC.HORIZONTAL));
211
212 // radio button SOCKS proxy
213 pnl.add(rbProxyPolicy.get(ProxyPolicy.USE_SOCKS_PROXY), GBC.eol());
214 rbProxyPolicy.get(ProxyPolicy.USE_SOCKS_PROXY).setText(tr("Use a SOCKS proxy"));
215
216 // the panel with the SOCKS configuration parameters
217 pnlSocksProxyConfigurationPanel = buildSocksProxyConfigurationPanel();
218 pnl.add(pnlSocksProxyConfigurationPanel, GBC.eop().fill(GBC.HORIZONTAL));
219
220 return pnl;
221 }
222
223 /**
224 * Initializes the panel with the values from the preferences
225 */
226 public final void initFromPreferences() {
227 ProxyPolicy pp = Optional.ofNullable(ProxyPolicy.fromName(Config.getPref().get(DefaultProxySelector.PROXY_POLICY, null)))
228 .orElse(ProxyPolicy.NO_PROXY);
229 rbProxyPolicy.get(pp).setSelected(true);
230 tfProxyHttpHost.setText(Config.getPref().get(DefaultProxySelector.PROXY_HTTP_HOST, ""));
231 tfProxyHttpPort.setText(Config.getPref().get(DefaultProxySelector.PROXY_HTTP_PORT, ""));
232 tfProxySocksHost.setText(Config.getPref().get(DefaultProxySelector.PROXY_SOCKS_HOST, ""));
233 tfProxySocksPort.setText(Config.getPref().get(DefaultProxySelector.PROXY_SOCKS_PORT, ""));
234
235 if (pp == ProxyPolicy.USE_SYSTEM_SETTINGS && !DefaultProxySelector.willJvmRetrieveSystemProxies()) {
236 Logging.warn(tr("JOSM is configured to use proxies from the system setting, but the JVM is not configured to retrieve them. " +
237 "Resetting preferences to ''No proxy''"));
238 pp = ProxyPolicy.NO_PROXY;
239 rbProxyPolicy.get(pp).setSelected(true);
240 }
241
242 // save the proxy user and the proxy password to a credentials store managed by
243 // the credentials manager
244 CredentialsAgent cm = CredentialsManager.getInstance();
245 try {
246 PasswordAuthentication pa = cm.lookup(RequestorType.PROXY, tfProxyHttpHost.getText());
247 if (pa == null) {
248 tfProxyHttpUser.setText("");
249 tfProxyHttpPassword.setText("");
250 } else {
251 tfProxyHttpUser.setText(pa.getUserName() == null ? "" : pa.getUserName());
252 tfProxyHttpPassword.setText(pa.getPassword() == null ? "" : String.valueOf(pa.getPassword()));
253 }
254 } catch (CredentialsAgentException e) {
255 Logging.error(e);
256 tfProxyHttpUser.setText("");
257 tfProxyHttpPassword.setText("");
258 }
259 }
260
261 protected final void updateEnabledState() {
262 boolean isHttpProxy = rbProxyPolicy.get(ProxyPolicy.USE_HTTP_PROXY).isSelected();
263 for (Component c: pnlHttpProxyConfigurationPanel.getComponents()) {
264 c.setEnabled(isHttpProxy);
265 }
266
267 boolean isSocksProxy = rbProxyPolicy.get(ProxyPolicy.USE_SOCKS_PROXY).isSelected();
268 for (Component c: pnlSocksProxyConfigurationPanel.getComponents()) {
269 c.setEnabled(isSocksProxy);
270 }
271
272 rbProxyPolicy.get(ProxyPolicy.USE_SYSTEM_SETTINGS).setEnabled(DefaultProxySelector.willJvmRetrieveSystemProxies());
273 }
274
275 class ProxyPolicyChangeListener implements ItemListener {
276 @Override
277 public void itemStateChanged(ItemEvent arg0) {
278 updateEnabledState();
279 }
280 }
281
282 /**
283 * Constructs a new {@code ProxyPreferencesPanel}.
284 */
285 public ProxyPreferencesPanel() {
286 setLayout(new GridBagLayout());
287 setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
288 add(buildProxySettingsPanel(), GBC.eop().anchor(GridBagConstraints.NORTHWEST).fill(GridBagConstraints.BOTH));
289
290 initFromPreferences();
291 updateEnabledState();
292
293 HelpUtil.setHelpContext(this, HelpUtil.ht("/Preferences/Connection#ProxySettings"));
294 }
295
296 /**
297 * Saves the current values to the preferences
298 */
299 public void saveToPreferences() {
300 ProxyPolicy policy = Arrays.stream(ProxyPolicy.values())
301 .filter(pp -> rbProxyPolicy.get(pp).isSelected())
302 .findFirst().orElse(null);
303 Config.getPref().put(DefaultProxySelector.PROXY_POLICY, Optional.ofNullable(policy).orElse(ProxyPolicy.NO_PROXY).getName());
304 Config.getPref().put(DefaultProxySelector.PROXY_HTTP_HOST, tfProxyHttpHost.getText());
305 Config.getPref().put(DefaultProxySelector.PROXY_HTTP_PORT, tfProxyHttpPort.getText());
306 Config.getPref().put(DefaultProxySelector.PROXY_SOCKS_HOST, tfProxySocksHost.getText());
307 Config.getPref().put(DefaultProxySelector.PROXY_SOCKS_PORT, tfProxySocksPort.getText());
308
309 // update the proxy selector
310 ProxySelector selector = ProxySelector.getDefault();
311 if (selector instanceof DefaultProxySelector) {
312 ((DefaultProxySelector) selector).initFromPreferences();
313 }
314
315 CredentialsAgent cm = CredentialsManager.getInstance();
316 try {
317 PasswordAuthentication pa = new PasswordAuthentication(
318 tfProxyHttpUser.getText().trim(),
319 tfProxyHttpPassword.getPassword()
320 );
321 cm.store(RequestorType.PROXY, tfProxyHttpHost.getText(), pa);
322 } catch (CredentialsAgentException e) {
323 Logging.error(e);
324 }
325 }
326}
Note: See TracBrowser for help on using the repository browser.