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.net.PasswordAuthentication;
011    import java.net.Authenticator.RequestorType;
012    
013    import javax.swing.BorderFactory;
014    import javax.swing.JLabel;
015    import javax.swing.JPanel;
016    import javax.swing.JPasswordField;
017    import javax.swing.JTextField;
018    
019    import org.openstreetmap.josm.Main;
020    import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
021    import org.openstreetmap.josm.io.auth.CredentialsAgent;
022    import org.openstreetmap.josm.io.auth.CredentialsAgentException;
023    import org.openstreetmap.josm.io.auth.CredentialsManager;
024    import org.openstreetmap.josm.io.auth.JosmPreferencesCredentialAgent;
025    import org.openstreetmap.josm.io.OsmApi;
026    
027    /**
028     * The preferences panel for parameters necessary for the Basic Authentication
029     * Scheme.
030     *
031     */
032    public class BasicAuthenticationPreferencesPanel extends JPanel {
033    
034        /** the OSM user name */
035        private JTextField tfOsmUserName;
036        private UserNameValidator valUserName;
037        /** the OSM password */
038        private JPasswordField tfOsmPassword;
039        /** a panel with further information, e.g. some warnings */
040        private JPanel decorationPanel;
041    
042        /**
043         * builds the UI
044         */
045        protected void build() {
046            setLayout(new GridBagLayout());
047            setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
048            GridBagConstraints gc = new GridBagConstraints();
049    
050            // -- OSM user name
051            gc.fill = GridBagConstraints.HORIZONTAL;
052            gc.anchor = GridBagConstraints.NORTHWEST;
053            gc.weightx = 0.0;
054            gc.insets = new Insets(0,0,3,3);
055            add(new JLabel(tr("OSM username:")), gc);
056    
057            gc.gridx = 1;
058            gc.weightx = 1.0;
059            add(tfOsmUserName = new JTextField(), gc);
060            SelectAllOnFocusGainedDecorator.decorate(tfOsmUserName);
061            valUserName = new UserNameValidator(tfOsmUserName);
062            valUserName.validate();
063    
064            // -- OSM password
065            gc.gridx = 0;
066            gc.gridy = 1;
067            gc.weightx = 0.0;
068            add(new JLabel(tr("OSM password:")), gc);
069    
070            gc.gridx = 1;
071            gc.weightx = 1.0;
072            add(tfOsmPassword = new JPasswordField(), gc);
073            SelectAllOnFocusGainedDecorator.decorate(tfOsmPassword);
074            tfOsmPassword.setToolTipText(tr("Please enter your OSM password"));
075    
076            // -- an info panel with a warning message
077            gc.gridx = 0;
078            gc.gridy = 2;
079            gc.gridwidth = 2;
080            gc.weightx = 1.0;
081            gc.weighty = 1.0;
082            gc.insets = new Insets(5,0,0,0);
083            gc.fill = GridBagConstraints.BOTH;
084            decorationPanel = new JPanel(new BorderLayout());
085            add(decorationPanel, gc);
086        }
087    
088        public BasicAuthenticationPreferencesPanel() {
089            build();
090        }
091    
092        public void initFromPreferences() {
093            CredentialsAgent cm = CredentialsManager.getInstance();
094            try {
095                decorationPanel.removeAll();
096                decorationPanel.add(cm.getPreferencesDecorationPanel(), BorderLayout.CENTER);
097                PasswordAuthentication pa = cm.lookup(RequestorType.SERVER, OsmApi.getOsmApi().getHost());
098                if (pa == null) {
099                    tfOsmUserName.setText("");
100                    tfOsmPassword.setText("");
101                } else {
102                    tfOsmUserName.setText(pa.getUserName() == null? "" : pa.getUserName());
103                    tfOsmPassword.setText(pa.getPassword() == null ? "" : String.valueOf(pa.getPassword()));
104                }
105            } catch(CredentialsAgentException e) {
106                e.printStackTrace();
107                System.err.println(tr("Warning: failed to retrieve OSM credentials from credential manager."));
108                System.err.println(tr("Current credential manager is of type ''{0}''", cm.getClass().getName()));
109                tfOsmUserName.setText("");
110                tfOsmPassword.setText("");
111            }
112        }
113    
114        public void saveToPreferences() {
115            CredentialsAgent cm = CredentialsManager.getInstance();
116            try {
117                PasswordAuthentication pa = new PasswordAuthentication(
118                        tfOsmUserName.getText().trim(),
119                        tfOsmPassword.getPassword()
120                );
121                cm.store(RequestorType.SERVER, OsmApi.getOsmApi().getHost(), pa);
122            } catch(CredentialsAgentException e) {
123                e.printStackTrace();
124                System.err.println(tr("Warning: failed to save OSM credentials to credential manager."));
125                System.err.println(tr("Current credential manager is of type ''{0}''", cm.getClass().getName()));
126            }
127        }
128    
129        public void clearPassword() {
130            tfOsmPassword.setText("");
131        }
132    }