001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.io.auth;
003    
004    import java.net.Authenticator;
005    import java.net.PasswordAuthentication;
006    import java.util.HashMap;
007    import java.util.Map;
008    
009    import org.openstreetmap.josm.Main;
010    
011    /**
012     * This is the default authenticator used in JOSM. It delegates lookup of credentials
013     * for the OSM API and an optional proxy server to the currently configured
014     * {@link CredentialsManager}.
015     *
016     */
017    public  class DefaultAuthenticator extends Authenticator {
018        private static DefaultAuthenticator instance;
019    
020        public static DefaultAuthenticator getInstance() {
021            return instance;
022        }
023    
024        public static void createInstance() {
025            instance = new DefaultAuthenticator();
026        }
027    
028        private final Map<RequestorType, Boolean> credentialsTried = new HashMap<RequestorType, Boolean>();
029        private boolean enabled = true;
030    
031        private DefaultAuthenticator() {
032        }
033    
034        /**
035         * Called by the Java http stack when either the OSM API server or a proxy requires
036         * authentication.
037         *
038         */
039        @Override protected PasswordAuthentication getPasswordAuthentication() {
040            if (!enabled)
041                return null;
042            try {
043                if (getRequestorType().equals(Authenticator.RequestorType.SERVER)) {
044                    // if we are working with OAuth we don't prompt for a password
045                    //
046                    String authMethod = Main.pref.get("osm-server.auth-method", "basic");
047                    if (authMethod.equals("oauth"))
048                        return null;
049                }
050                boolean tried = credentialsTried.get(getRequestorType()) != null;
051                CredentialsAgentResponse response = CredentialsManager.getInstance().getCredentials(getRequestorType(), getRequestingHost(), tried);
052                if (response == null || response.isCanceled())
053                    return null;
054                credentialsTried.put(getRequestorType(), true);
055                return new PasswordAuthentication(response.getUsername(), response.getPassword());
056            } catch(CredentialsAgentException e) {
057                e.printStackTrace();
058                return null;
059            }
060        }
061    
062        public boolean isEnabled() {
063            return enabled;
064        }
065    
066        public void setEnabled(boolean enabled) {
067            this.enabled = enabled;
068        }
069    }