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 org.openstreetmap.josm.data.Preferences; 007 import org.openstreetmap.josm.data.oauth.OAuthToken; 008 import org.openstreetmap.josm.io.auth.CredentialsAgent; 009 import org.openstreetmap.josm.io.auth.CredentialsAgentException; 010 import org.openstreetmap.josm.tools.CheckParameterUtil; 011 012 013 public class OAuthAccessTokenHolder { 014 private static OAuthAccessTokenHolder instance; 015 016 public static OAuthAccessTokenHolder getInstance() { 017 if (instance == null) { 018 instance = new OAuthAccessTokenHolder(); 019 } 020 return instance; 021 } 022 023 private boolean saveToPreferences; 024 private String accessTokenKey; 025 private String accessTokenSecret; 026 027 /** 028 * Replies true if current access token should be saved to the preferences file. 029 * 030 * @return true if current access token should be saved to the preferences file. 031 */ 032 public boolean isSaveToPreferences() { 033 return saveToPreferences; 034 } 035 036 /** 037 * Sets whether the current access token should be saved to the preferences file. 038 * 039 * If true, the access token is saved in clear text to the preferences file. The same 040 * access token can therefore be used in multiple JOSM sessions. 041 * 042 * If false, the access token isn't saved to the preferences file. If JOSM is closed, 043 * the access token is lost and new token has to be generated by the OSM server the 044 * next time JOSM is used. 045 * 046 * @param saveToPreferences 047 */ 048 public void setSaveToPreferences(boolean saveToPreferences) { 049 this.saveToPreferences = saveToPreferences; 050 } 051 052 /** 053 * Replies the access token key. null, if no access token key is currently set. 054 * 055 * @return the access token key 056 */ 057 public String getAccessTokenKey() { 058 return accessTokenKey; 059 } 060 061 /** 062 * Sets the access token key. Pass in null to remove the current access token key. 063 * 064 * @param accessTokenKey the access token key 065 */ 066 public void setAccessTokenKey(String accessTokenKey) { 067 this.accessTokenKey = accessTokenKey; 068 } 069 070 /** 071 * Replies the access token secret. null, if no access token secret is currently set. 072 * 073 * @return the access token secret 074 */ 075 public String getAccessTokenSecret() { 076 return accessTokenSecret; 077 } 078 079 /** 080 * Sets the access token secret. Pass in null to remove the current access token secret. 081 * 082 * @param accessTokenSecret 083 */ 084 public void setAccessTokenSecret(String accessTokenSecret) { 085 this.accessTokenSecret = accessTokenSecret; 086 } 087 088 public OAuthToken getAccessToken() { 089 if (!containsAccessToken()) 090 return null; 091 return new OAuthToken(accessTokenKey, accessTokenSecret); 092 } 093 094 /** 095 * Sets the access token hold by this holder. 096 * 097 * @param accessTokenKey the access token key 098 * @param accessTokenSecret the access token secret 099 */ 100 public void setAccessToken(String accessTokenKey, String accessTokenSecret) { 101 this.accessTokenKey = accessTokenKey; 102 this.accessTokenSecret = accessTokenSecret; 103 } 104 105 /** 106 * Sets the access token hold by this holder. 107 * 108 * @param token the access token. Can be null to clear the content in this holder. 109 */ 110 public void setAccessToken(OAuthToken token) { 111 if (token == null) { 112 this.accessTokenKey = null; 113 this.accessTokenSecret = null; 114 } else { 115 this.accessTokenKey = token.getKey(); 116 this.accessTokenSecret = token.getSecret(); 117 } 118 } 119 120 /** 121 * Replies true if this holder contains an complete access token, consisting of an 122 * Access Token Key and an Access Token Secret. 123 * 124 * @return true if this holder contains an complete access token 125 */ 126 public boolean containsAccessToken() { 127 return accessTokenKey != null && accessTokenSecret != null; 128 } 129 130 /** 131 * Initializes the content of this holder from the Access Token managed by the 132 * credential manager. 133 * 134 * @param pref the preferences. Must not be null. 135 * @param cm the credential manager. Must not be null. 136 * @throws IllegalArgumentException thrown if cm is null 137 */ 138 public void init(Preferences pref, CredentialsAgent cm) throws IllegalArgumentException { 139 CheckParameterUtil.ensureParameterNotNull(pref, "pref"); 140 CheckParameterUtil.ensureParameterNotNull(cm, "cm"); 141 OAuthToken token = null; 142 try { 143 token = cm.lookupOAuthAccessToken(); 144 } catch(CredentialsAgentException e) { 145 e.printStackTrace(); 146 System.err.println(tr("Warning: Failed to retrieve OAuth Access Token from credential manager")); 147 System.err.println(tr("Current credential manager is of type ''{0}''", cm.getClass().getName())); 148 } 149 saveToPreferences = pref.getBoolean("oauth.access-token.save-to-preferences", true); 150 if (token != null) { 151 accessTokenKey = token.getKey(); 152 accessTokenSecret = token.getSecret(); 153 } 154 } 155 156 /** 157 * Saves the content of this holder to the preferences and a credential store managed 158 * by a credential manager. 159 * 160 * @param preferences the preferences. Must not be null. 161 * @param cm the credentials manager. Must not be null. 162 * @throws IllegalArgumentException thrown if preferences is null 163 * @throws IllegalArgumentException thrown if cm is null 164 */ 165 public void save(Preferences preferences, CredentialsAgent cm) throws IllegalArgumentException { 166 CheckParameterUtil.ensureParameterNotNull(preferences, "preferences"); 167 CheckParameterUtil.ensureParameterNotNull(cm, "cm"); 168 preferences.put("oauth.access-token.save-to-preferences", saveToPreferences); 169 try { 170 if (!saveToPreferences) { 171 cm.storeOAuthAccessToken(null); 172 } else { 173 cm.storeOAuthAccessToken(new OAuthToken(accessTokenKey, accessTokenSecret)); 174 } 175 } catch(CredentialsAgentException e){ 176 e.printStackTrace(); 177 System.err.println(tr("Warning: Failed to store OAuth Access Token to credentials manager")); 178 System.err.println(tr("Current credential manager is of type ''{0}''", cm.getClass().getName())); 179 } 180 } 181 182 /** 183 * Clears the content of this holder 184 */ 185 public void clear() { 186 accessTokenKey = null; 187 accessTokenSecret = null; 188 } 189 }