001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.preferences.server; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.awt.BorderLayout; 007 import java.awt.GridBagConstraints; 008 import java.awt.GridBagLayout; 009 import java.awt.Insets; 010 import java.awt.event.ItemEvent; 011 import java.awt.event.ItemListener; 012 import java.beans.PropertyChangeEvent; 013 import java.beans.PropertyChangeListener; 014 015 import javax.swing.ButtonGroup; 016 import javax.swing.JPanel; 017 import javax.swing.JRadioButton; 018 019 import org.openstreetmap.josm.Main; 020 import org.openstreetmap.josm.gui.help.HelpUtil; 021 import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel; 022 import org.openstreetmap.josm.io.auth.CredentialsManager; 023 024 /** 025 * This is the preference panel for the authentication method and the authentication 026 * parameters. 027 * 028 */ 029 public class AuthenticationPreferencesPanel extends VerticallyScrollablePanel implements PropertyChangeListener{ 030 031 /** indicates whether we use basic authentication */ 032 private JRadioButton rbBasicAuthentication; 033 /** indicates whether we use OAuth as authentication scheme */ 034 private JRadioButton rbOAuth; 035 /** the panel which contains the authentication parameters for the respective 036 * authentication scheme 037 */ 038 private JPanel pnlAuthenticationParameteters; 039 /** the panel for the basic authentication parameters */ 040 private BasicAuthenticationPreferencesPanel pnlBasicAuthPreferences; 041 /** the panel for the OAuth authentication parameters */ 042 private OAuthAuthenticationPreferencesPanel pnlOAuthPreferences; 043 044 /** 045 * builds the UI 046 */ 047 protected void build() { 048 setLayout(new GridBagLayout()); 049 GridBagConstraints gc = new GridBagConstraints(); 050 051 AuthenticationMethodChangeListener authChangeListener = new AuthenticationMethodChangeListener(); 052 053 // -- radio button for basic authentication 054 gc.anchor = GridBagConstraints.NORTHWEST; 055 gc.fill = GridBagConstraints.HORIZONTAL; 056 gc.weightx = 0.0; 057 gc.insets = new Insets(0,0,0, 3); 058 add(rbBasicAuthentication = new JRadioButton(), gc); 059 rbBasicAuthentication.setText(tr("Use Basic Authentication")); 060 rbBasicAuthentication.setToolTipText(tr("Select to use HTTP basic authentication with your OSM username and password")); 061 rbBasicAuthentication.addItemListener(authChangeListener); 062 063 //-- radio button for OAuth 064 gc.gridx = 1; 065 gc.weightx = 1.0; 066 add(rbOAuth = new JRadioButton(), gc); 067 rbOAuth.setText(tr("Use OAuth")); 068 rbOAuth.setToolTipText(tr("Select to use OAuth as authentication mechanism")); 069 rbOAuth.addItemListener(authChangeListener); 070 071 //-- radio button for OAuth 072 ButtonGroup bg = new ButtonGroup(); 073 bg.add(rbBasicAuthentication); 074 bg.add(rbOAuth); 075 076 //-- add the panel which will hld the authentication parameters 077 gc.gridx = 0; 078 gc.gridy = 1; 079 gc.gridwidth = 2; 080 gc.fill = GridBagConstraints.BOTH; 081 gc.weightx = 1.0; 082 gc.weighty = 1.0; 083 add(pnlAuthenticationParameteters = new JPanel(), gc); 084 pnlAuthenticationParameteters.setLayout(new BorderLayout()); 085 086 //-- the two panel for authentication parameters 087 pnlBasicAuthPreferences = new BasicAuthenticationPreferencesPanel(); 088 pnlOAuthPreferences = new OAuthAuthenticationPreferencesPanel(); 089 090 rbBasicAuthentication.setSelected(true); 091 pnlAuthenticationParameteters.add(pnlBasicAuthPreferences, BorderLayout.CENTER); 092 } 093 094 public AuthenticationPreferencesPanel() { 095 build(); 096 HelpUtil.setHelpContext(this, HelpUtil.ht("/Preferences/Connection#AuthenticationSettings")); 097 } 098 099 public void initFromPreferences() { 100 String authMethod = Main.pref.get("osm-server.auth-method", "basic"); 101 if (authMethod.equals("basic")) { 102 rbBasicAuthentication.setSelected(true); 103 } else if (authMethod.equals("oauth")) { 104 rbOAuth.setSelected(true); 105 } else { 106 System.err.println(tr("Warning: Unsupported value in preference ''{0}'', got ''{1}''. Using authentication method ''Basic Authentication''.", "osm-server.auth-method", authMethod)); 107 rbBasicAuthentication.setSelected(true); 108 } 109 pnlBasicAuthPreferences.initFromPreferences(); 110 pnlOAuthPreferences.initFromPreferences(); 111 } 112 113 public void saveToPreferences() { 114 // save the authentication method 115 String authMethod; 116 if (rbBasicAuthentication.isSelected()) { 117 authMethod = "basic"; 118 } else { 119 authMethod = "oauth"; 120 } 121 Main.pref.put("osm-server.auth-method", authMethod); 122 if (authMethod.equals("basic")) { 123 // save username and password and clear the OAuth token 124 pnlBasicAuthPreferences.saveToPreferences(); 125 OAuthAccessTokenHolder.getInstance().clear(); 126 OAuthAccessTokenHolder.getInstance().save(Main.pref, CredentialsManager.getInstance()); 127 } else if (authMethod.equals("oauth")) { 128 // clear the password in the preferences 129 pnlBasicAuthPreferences.clearPassword(); 130 pnlBasicAuthPreferences.saveToPreferences(); 131 pnlOAuthPreferences.saveToPreferences(); 132 } 133 } 134 135 /** 136 * Listens to changes in the authentication method 137 */ 138 class AuthenticationMethodChangeListener implements ItemListener { 139 public void itemStateChanged(ItemEvent e) { 140 if (rbBasicAuthentication.isSelected()) { 141 pnlAuthenticationParameteters.removeAll(); 142 pnlAuthenticationParameteters.add(pnlBasicAuthPreferences, BorderLayout.CENTER); 143 pnlBasicAuthPreferences.revalidate(); 144 } else { 145 pnlAuthenticationParameteters.removeAll(); 146 pnlAuthenticationParameteters.add(pnlOAuthPreferences, BorderLayout.CENTER); 147 pnlOAuthPreferences.revalidate(); 148 } 149 repaint(); 150 } 151 } 152 153 public void propertyChange(PropertyChangeEvent evt) { 154 if (pnlOAuthPreferences != null) { 155 pnlOAuthPreferences.propertyChange(evt); 156 } 157 } 158 }