001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.data.oauth; 003 004 import java.net.MalformedURLException; 005 import java.net.URL; 006 007 import oauth.signpost.OAuthConsumer; 008 import oauth.signpost.OAuthProvider; 009 import oauth.signpost.basic.DefaultOAuthConsumer; 010 import oauth.signpost.basic.DefaultOAuthProvider; 011 012 import org.openstreetmap.josm.data.Preferences; 013 import org.openstreetmap.josm.io.OsmApi; 014 import org.openstreetmap.josm.tools.CheckParameterUtil; 015 016 /** 017 * This class manages a set of OAuth parameters. 018 * @since 2747 019 */ 020 public class OAuthParameters { 021 022 /** 023 * The default JOSM OAuth consumer key. 024 */ 025 static public final String DEFAULT_JOSM_CONSUMER_KEY = "AdCRxTpvnbmfV8aPqrTLyA"; 026 /** 027 * The default JOSM OAuth consumer secret. 028 */ 029 static public final String DEFAULT_JOSM_CONSUMER_SECRET = "XmYOiGY9hApytcBC3xCec3e28QBqOWz5g6DSb5UpE"; 030 /** 031 * The default OSM OAuth request token URL. 032 */ 033 static public final String DEFAULT_REQUEST_TOKEN_URL = "http://www.openstreetmap.org/oauth/request_token"; 034 /** 035 * The default OSM OAuth access token URL. 036 */ 037 static public final String DEFAULT_ACCESS_TOKEN_URL = "http://www.openstreetmap.org/oauth/access_token"; 038 /** 039 * The default OSM OAuth authorize URL. 040 */ 041 static public final String DEFAULT_AUTHORISE_URL = "http://www.openstreetmap.org/oauth/authorize"; 042 043 044 /** 045 * Replies a set of default parameters for a consumer accessing the standard OSM server 046 * at {@link OsmApi#DEFAULT_API_URL}. 047 * 048 * @return a set of default parameters 049 */ 050 static public OAuthParameters createDefault() { 051 return createDefault(null); 052 } 053 054 /** 055 * Replies a set of default parameters for a consumer accessing an OSM server 056 * at the given API url. URL parameters are only set if the URL equals {@link OsmApi#DEFAULT_API_URL} 057 * or references the domain "dev.openstreetmap.org", otherwise they may be <code>null</code>. 058 * 059 * @param apiUrl The API URL for which the OAuth default parameters are created. If null or empty, the default OSM API url is used. 060 * @return a set of default parameters for the given {@code apiUrl} 061 * @since 5422 062 */ 063 static public OAuthParameters createDefault(String apiUrl) { 064 OAuthParameters parameters = new OAuthParameters(); 065 parameters.setConsumerKey(DEFAULT_JOSM_CONSUMER_KEY); 066 parameters.setConsumerSecret(DEFAULT_JOSM_CONSUMER_SECRET); 067 if (apiUrl == null || apiUrl.isEmpty() || apiUrl.equals(OsmApi.DEFAULT_API_URL)) { 068 parameters.setRequestTokenUrl(DEFAULT_REQUEST_TOKEN_URL); 069 parameters.setAccessTokenUrl(DEFAULT_ACCESS_TOKEN_URL); 070 parameters.setAuthoriseUrl(DEFAULT_AUTHORISE_URL); 071 } else { 072 try { 073 String host = new URL(apiUrl).getHost(); 074 if (host.endsWith("dev.openstreetmap.org")) { 075 parameters.setRequestTokenUrl(DEFAULT_REQUEST_TOKEN_URL.replace("www.openstreetmap.org", host)); 076 parameters.setAccessTokenUrl(DEFAULT_ACCESS_TOKEN_URL.replace("www.openstreetmap.org", host)); 077 parameters.setAuthoriseUrl(DEFAULT_AUTHORISE_URL.replace("www.openstreetmap.org", host)); 078 } 079 } catch (MalformedURLException e) { 080 // Ignored 081 } 082 } 083 return parameters; 084 } 085 086 /** 087 * Replies a set of parameters as defined in the preferences. 088 * 089 * @param pref the preferences 090 * @return the parameters 091 */ 092 static public OAuthParameters createFromPreferences(Preferences pref) { 093 boolean useDefault = pref.getBoolean("oauth.settings.use-default", true ); 094 if (useDefault) 095 return createDefault(pref.get("osm-server.url")); 096 OAuthParameters parameters = new OAuthParameters(); 097 parameters.setConsumerKey(pref.get("oauth.settings.consumer-key", "")); 098 parameters.setConsumerSecret(pref.get("oauth.settings.consumer-secret", "")); 099 parameters.setRequestTokenUrl(pref.get("oauth.settings.request-token-url", "")); 100 parameters.setAccessTokenUrl(pref.get("oauth.settings.access-token-url", "")); 101 parameters.setAuthoriseUrl(pref.get("oauth.settings.authorise-url", "")); 102 return parameters; 103 } 104 105 /** 106 * Clears the preferences for OAuth parameters 107 * 108 * @param pref the preferences in which keys related to OAuth parameters are 109 * removed 110 */ 111 static public void clearPreferences(Preferences pref) { 112 pref.put("oauth.settings.consumer-key", null); 113 pref.put("oauth.settings.consumer-secret", null); 114 pref.put("oauth.settings.request-token-url", null); 115 pref.put("oauth.settings.access-token-url", null); 116 pref.put("oauth.settings.authorise-url", null); 117 } 118 119 private String consumerKey; 120 private String consumerSecret; 121 private String requestTokenUrl; 122 private String accessTokenUrl; 123 private String authoriseUrl; 124 125 /** 126 * Constructs a new, unitialized, {@code OAuthParameters}. 127 * 128 * @see #createDefault 129 * @see #createFromPreferences 130 */ 131 public OAuthParameters() { 132 } 133 134 /** 135 * Creates a clone of the parameters in <code>other</code>. 136 * 137 * @param other the other parameters. Must not be null. 138 * @throws IllegalArgumentException thrown if other is null 139 */ 140 public OAuthParameters(OAuthParameters other) throws IllegalArgumentException{ 141 CheckParameterUtil.ensureParameterNotNull(other, "other"); 142 this.consumerKey = other.consumerKey; 143 this.consumerSecret = other.consumerSecret; 144 this.accessTokenUrl = other.accessTokenUrl; 145 this.requestTokenUrl = other.requestTokenUrl; 146 this.authoriseUrl = other.authoriseUrl; 147 } 148 149 /** 150 * Gets the consumer key. 151 * @return The consumer key 152 */ 153 public String getConsumerKey() { 154 return consumerKey; 155 } 156 157 /** 158 * Sets the consumer key. 159 * @param consumerKey The consumer key 160 */ 161 public void setConsumerKey(String consumerKey) { 162 this.consumerKey = consumerKey; 163 } 164 165 /** 166 * Gets the consumer secret. 167 * @return The consumer secret 168 */ 169 public String getConsumerSecret() { 170 return consumerSecret; 171 } 172 173 /** 174 * Sets the consumer secret. 175 * @param consumerSecret The consumer secret 176 */ 177 public void setConsumerSecret(String consumerSecret) { 178 this.consumerSecret = consumerSecret; 179 } 180 181 /** 182 * Gets the request token URL. 183 * @return The request token URL 184 */ 185 public String getRequestTokenUrl() { 186 return requestTokenUrl; 187 } 188 189 /** 190 * Sets the request token URL. 191 * @param requestTokenUrl the request token URL 192 */ 193 public void setRequestTokenUrl(String requestTokenUrl) { 194 this.requestTokenUrl = requestTokenUrl; 195 } 196 197 /** 198 * Gets the access token URL. 199 * @return The access token URL 200 */ 201 public String getAccessTokenUrl() { 202 return accessTokenUrl; 203 } 204 205 /** 206 * Sets the access token URL. 207 * @param accessTokenUrl The access token URL 208 */ 209 public void setAccessTokenUrl(String accessTokenUrl) { 210 this.accessTokenUrl = accessTokenUrl; 211 } 212 213 /** 214 * Gets the authorise URL. 215 * @return The authorise URL 216 */ 217 public String getAuthoriseUrl() { 218 return authoriseUrl; 219 } 220 221 /** 222 * Sets the authorise URL. 223 * @param authoriseUrl The authorise URL 224 */ 225 public void setAuthoriseUrl(String authoriseUrl) { 226 this.authoriseUrl = authoriseUrl; 227 } 228 229 /** 230 * Builds an {@link OAuthConsumer} based on these parameters. 231 * 232 * @return the consumer 233 */ 234 public OAuthConsumer buildConsumer() { 235 return new DefaultOAuthConsumer(consumerKey, consumerSecret); 236 } 237 238 /** 239 * Builds an {@link OAuthProvider} based on these parameters and a OAuth consumer <code>consumer</code>. 240 * 241 * @param consumer the consumer. Must not be null. 242 * @return the provider 243 * @throws IllegalArgumentException if consumer is null 244 */ 245 public OAuthProvider buildProvider(OAuthConsumer consumer) throws IllegalArgumentException { 246 CheckParameterUtil.ensureParameterNotNull(consumer, "consumer"); 247 return new DefaultOAuthProvider( 248 requestTokenUrl, 249 accessTokenUrl, 250 authoriseUrl 251 ); 252 } 253 254 /** 255 * Saves these OAuth parameters to the given {@code Preferences}. 256 * @param pref The Preferences into which are saved these OAuth parameters with the prefix "oauth.settings" 257 */ 258 public void saveToPreferences(Preferences pref) { 259 if (this.equals(createDefault(pref.get("osm-server.url")))) { 260 pref.put("oauth.settings.use-default", true ); 261 clearPreferences(pref); 262 return; 263 } 264 pref.put("oauth.settings.use-default", false); 265 pref.put("oauth.settings.consumer-key", consumerKey); 266 pref.put("oauth.settings.consumer-secret", consumerSecret); 267 pref.put("oauth.settings.request-token-url", requestTokenUrl); 268 pref.put("oauth.settings.access-token-url", accessTokenUrl); 269 pref.put("oauth.settings.authorise-url", authoriseUrl); 270 } 271 272 @Override 273 public int hashCode() { 274 final int prime = 31; 275 int result = 1; 276 result = prime * result + ((accessTokenUrl == null) ? 0 : accessTokenUrl.hashCode()); 277 result = prime * result + ((authoriseUrl == null) ? 0 : authoriseUrl.hashCode()); 278 result = prime * result + ((consumerKey == null) ? 0 : consumerKey.hashCode()); 279 result = prime * result + ((consumerSecret == null) ? 0 : consumerSecret.hashCode()); 280 result = prime * result + ((requestTokenUrl == null) ? 0 : requestTokenUrl.hashCode()); 281 return result; 282 } 283 284 @Override 285 public boolean equals(Object obj) { 286 if (this == obj) 287 return true; 288 if (obj == null) 289 return false; 290 if (getClass() != obj.getClass()) 291 return false; 292 OAuthParameters other = (OAuthParameters) obj; 293 if (accessTokenUrl == null) { 294 if (other.accessTokenUrl != null) 295 return false; 296 } else if (!accessTokenUrl.equals(other.accessTokenUrl)) 297 return false; 298 if (authoriseUrl == null) { 299 if (other.authoriseUrl != null) 300 return false; 301 } else if (!authoriseUrl.equals(other.authoriseUrl)) 302 return false; 303 if (consumerKey == null) { 304 if (other.consumerKey != null) 305 return false; 306 } else if (!consumerKey.equals(other.consumerKey)) 307 return false; 308 if (consumerSecret == null) { 309 if (other.consumerSecret != null) 310 return false; 311 } else if (!consumerSecret.equals(other.consumerSecret)) 312 return false; 313 if (requestTokenUrl == null) { 314 if (other.requestTokenUrl != null) 315 return false; 316 } else if (!requestTokenUrl.equals(other.requestTokenUrl)) 317 return false; 318 return true; 319 } 320 }