// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.preferences.server;
import static org.openstreetmap.josm.tools.I18n.tr;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.Preferences;
import org.openstreetmap.josm.data.oauth.OAuthToken;
import org.openstreetmap.josm.io.auth.CredentialsAgent;
import org.openstreetmap.josm.io.auth.CredentialsAgentException;
import org.openstreetmap.josm.tools.CheckParameterUtil;
/**
* Class holding OAuth access token key and secret.
*/
public class OAuthAccessTokenHolder {
private static OAuthAccessTokenHolder instance;
/**
* Replies the unique instance.
* @return The unique instance of {@code OAuthAccessTokenHolder}
*/
public static OAuthAccessTokenHolder getInstance() {
if (instance == null) {
instance = new OAuthAccessTokenHolder();
}
return instance;
}
private boolean saveToPreferences;
private String accessTokenKey;
private String accessTokenSecret;
/**
* Replies true if current access token should be saved to the preferences file.
*
* @return true if current access token should be saved to the preferences file.
*/
public boolean isSaveToPreferences() {
return saveToPreferences;
}
/**
* Sets whether the current access token should be saved to the preferences file.
*
* If true, the access token is saved in clear text to the preferences file. The same
* access token can therefore be used in multiple JOSM sessions.
*
* If false, the access token isn't saved to the preferences file. If JOSM is closed,
* the access token is lost and new token has to be generated by the OSM server the
* next time JOSM is used.
*
* @param saveToPreferences
*/
public void setSaveToPreferences(boolean saveToPreferences) {
this.saveToPreferences = saveToPreferences;
}
/**
* Replies the access token key. null, if no access token key is currently set.
*
* @return the access token key
*/
public String getAccessTokenKey() {
return accessTokenKey;
}
/**
* Sets the access token key. Pass in null to remove the current access token key.
*
* @param accessTokenKey the access token key
*/
public void setAccessTokenKey(String accessTokenKey) {
this.accessTokenKey = accessTokenKey;
}
/**
* Replies the access token secret. null, if no access token secret is currently set.
*
* @return the access token secret
*/
public String getAccessTokenSecret() {
return accessTokenSecret;
}
/**
* Sets the access token secret. Pass in null to remove the current access token secret.
*
* @param accessTokenSecret
*/
public void setAccessTokenSecret(String accessTokenSecret) {
this.accessTokenSecret = accessTokenSecret;
}
/**
* Replies the access token.
* @return the access token, can be {@code null}
*/
public OAuthToken getAccessToken() {
if (!containsAccessToken())
return null;
return new OAuthToken(accessTokenKey, accessTokenSecret);
}
/**
* Sets the access token hold by this holder.
*
* @param accessTokenKey the access token key
* @param accessTokenSecret the access token secret
*/
public void setAccessToken(String accessTokenKey, String accessTokenSecret) {
this.accessTokenKey = accessTokenKey;
this.accessTokenSecret = accessTokenSecret;
}
/**
* Sets the access token hold by this holder.
*
* @param token the access token. Can be null to clear the content in this holder.
*/
public void setAccessToken(OAuthToken token) {
if (token == null) {
this.accessTokenKey = null;
this.accessTokenSecret = null;
} else {
this.accessTokenKey = token.getKey();
this.accessTokenSecret = token.getSecret();
}
}
/**
* Replies true if this holder contains an complete access token, consisting of an
* Access Token Key and an Access Token Secret.
*
* @return true if this holder contains an complete access token
*/
public boolean containsAccessToken() {
return accessTokenKey != null && accessTokenSecret != null;
}
/**
* Initializes the content of this holder from the Access Token managed by the
* credential manager.
*
* @param pref the preferences. Must not be null.
* @param cm the credential manager. Must not be null.
* @throws IllegalArgumentException thrown if cm is null
*/
public void init(Preferences pref, CredentialsAgent cm) throws IllegalArgumentException {
CheckParameterUtil.ensureParameterNotNull(pref, "pref");
CheckParameterUtil.ensureParameterNotNull(cm, "cm");
OAuthToken token = null;
try {
token = cm.lookupOAuthAccessToken();
} catch(CredentialsAgentException e) {
Main.error(e);
Main.warn(tr("Failed to retrieve OAuth Access Token from credential manager"));
Main.warn(tr("Current credential manager is of type ''{0}''", cm.getClass().getName()));
}
saveToPreferences = pref.getBoolean("oauth.access-token.save-to-preferences", true);
if (token != null) {
accessTokenKey = token.getKey();
accessTokenSecret = token.getSecret();
}
}
/**
* Saves the content of this holder to the preferences and a credential store managed
* by a credential manager.
*
* @param preferences the preferences. Must not be null.
* @param cm the credentials manager. Must not be null.
* @throws IllegalArgumentException thrown if preferences is null
* @throws IllegalArgumentException thrown if cm is null
*/
public void save(Preferences preferences, CredentialsAgent cm) throws IllegalArgumentException {
CheckParameterUtil.ensureParameterNotNull(preferences, "preferences");
CheckParameterUtil.ensureParameterNotNull(cm, "cm");
preferences.put("oauth.access-token.save-to-preferences", saveToPreferences);
try {
if (!saveToPreferences) {
cm.storeOAuthAccessToken(null);
} else {
cm.storeOAuthAccessToken(new OAuthToken(accessTokenKey, accessTokenSecret));
}
} catch(CredentialsAgentException e){
Main.error(e);
Main.warn(tr("Failed to store OAuth Access Token to credentials manager"));
Main.warn(tr("Current credential manager is of type ''{0}''", cm.getClass().getName()));
}
}
/**
* Clears the content of this holder
*/
public void clear() {
accessTokenKey = null;
accessTokenSecret = null;
}
}