001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.io.auth;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.awt.Component;
007    import java.net.PasswordAuthentication;
008    import java.net.Authenticator.RequestorType;
009    
010    import javax.swing.text.html.HTMLEditorKit;
011    
012    import org.openstreetmap.josm.Main;
013    import org.openstreetmap.josm.data.oauth.OAuthToken;
014    import org.openstreetmap.josm.gui.preferences.server.ProxyPreferencesPanel;
015    import org.openstreetmap.josm.gui.widgets.HtmlPanel;
016    import org.openstreetmap.josm.io.OsmApi;
017    import org.openstreetmap.josm.tools.Utils;
018    
019    /**
020     * This is the default credentials agent in JOSM. It keeps username and password for both
021     * the OSM API and an optional HTTP proxy in the JOSM preferences file.
022     *
023     */
024    public class JosmPreferencesCredentialAgent extends AbstractCredentialsAgent {
025    
026        /**
027         * @see CredentialsAgent#lookup(RequestorType)
028         */
029        @Override
030        public PasswordAuthentication lookup(RequestorType requestorType, String host) throws CredentialsAgentException{
031            if (requestorType == null)
032                return null;
033            String user;
034            String password;
035            switch(requestorType) {
036            case SERVER:
037                if (Utils.equal(OsmApi.getOsmApi().getHost(), host)) {
038                    user = Main.pref.get("osm-server.username", null);
039                    password = Main.pref.get("osm-server.password", null);
040                } else if(host != null) {
041                    user = Main.pref.get("server.username."+host, null);
042                    password = Main.pref.get("server.password."+host, null);
043                } else {
044                    user = null;
045                    password = null;
046                }
047                if (user == null)
048                    return null;
049                return new PasswordAuthentication(user, password == null ? new char[0] : password.toCharArray());
050            case PROXY:
051                user = Main.pref.get(ProxyPreferencesPanel.PROXY_USER, null);
052                password = Main.pref.get(ProxyPreferencesPanel.PROXY_PASS, null);
053                if (user == null)
054                    return null;
055                return new PasswordAuthentication(user, password == null ? new char[0] : password.toCharArray());
056            }
057            return null;
058        }
059    
060        /**
061         * @see CredentialsAgent#store(RequestorType, PasswordAuthentication)
062         */
063        @Override
064        public void store(RequestorType requestorType, String host, PasswordAuthentication credentials) throws CredentialsAgentException {
065            if (requestorType == null)
066                return;
067            switch(requestorType) {
068            case SERVER:
069                if (Utils.equal(OsmApi.getOsmApi().getHost(), host)) {
070                    Main.pref.put("osm-server.username", credentials.getUserName());
071                    if (credentials.getPassword() == null) {
072                        Main.pref.put("osm-server.password", null);
073                    } else {
074                        Main.pref.put("osm-server.password", String.valueOf(credentials.getPassword()));
075                    }
076                } else if(host != null) {
077                    Main.pref.put("server.username."+host, credentials.getUserName());
078                    if (credentials.getPassword() == null) {
079                        Main.pref.put("server.password."+host, null);
080                    } else {
081                        Main.pref.put("server.password."+host, String.valueOf(credentials.getPassword()));
082                    }
083                }
084                break;
085            case PROXY:
086                Main.pref.put(ProxyPreferencesPanel.PROXY_USER, credentials.getUserName());
087                if (credentials.getPassword() == null) {
088                    Main.pref.put(ProxyPreferencesPanel.PROXY_PASS, null);
089                } else {
090                    Main.pref.put(ProxyPreferencesPanel.PROXY_PASS, String.valueOf(credentials.getPassword()));
091                }
092                break;
093            }
094        }
095    
096        /**
097         * Lookup the current OAuth Access Token to access the OSM server. Replies null, if no
098         * Access Token is currently managed by this CredentialManager.
099         *
100         * @return the current OAuth Access Token to access the OSM server.
101         * @throws CredentialsAgentException thrown if something goes wrong
102         */
103        @Override
104        public OAuthToken lookupOAuthAccessToken() throws CredentialsAgentException {
105            String accessTokenKey = Main.pref.get("oauth.access-token.key", null);
106            String accessTokenSecret = Main.pref.get("oauth.access-token.secret", null);
107            if (accessTokenKey == null && accessTokenSecret == null)
108                return null;
109            return new OAuthToken(accessTokenKey, accessTokenSecret);
110        }
111    
112        /**
113         * Stores the OAuth Access Token <code>accessToken</code>.
114         *
115         * @param accessToken the access Token. null, to remove the Access Token.
116         * @throws CredentialsAgentException thrown if something goes wrong
117         */
118        @Override
119        public void storeOAuthAccessToken(OAuthToken accessToken) throws CredentialsAgentException {
120            if (accessToken == null) {
121                Main.pref.put("oauth.access-token.key", null);
122                Main.pref.put("oauth.access-token.secret", null);
123            } else {
124                Main.pref.put("oauth.access-token.key", accessToken.getKey());
125                Main.pref.put("oauth.access-token.secret", accessToken.getSecret());
126            }
127        }
128    
129        @Override
130        public Component getPreferencesDecorationPanel() {
131            HtmlPanel pnlMessage = new HtmlPanel();
132            HTMLEditorKit kit = (HTMLEditorKit)pnlMessage.getEditorPane().getEditorKit();
133            kit.getStyleSheet().addRule(".warning-body {background-color:rgb(253,255,221);padding: 10pt; border-color:rgb(128,128,128);border-style: solid;border-width: 1px;}");
134            pnlMessage.setText(
135                    tr(
136                            "<html><body>"
137                            + "<p class=\"warning-body\">"
138                            + "<strong>Warning:</strong> The password is stored in plain text in the JOSM preferences file. "
139                            + "Furthermore, it is transferred <strong>unencrypted</strong> in every request sent to the OSM server. "
140                            + "<strong>Do not use a valuable password.</strong>"
141                            + "</p>"
142                            + "</body></html>"
143                    )
144            );
145            return pnlMessage;
146        }
147        
148        @Override
149        public String getSaveUsernameAndPasswordCheckboxText() {
150            return tr("Save user and password (unencrypted)");
151        }
152        
153    }