/** * Copyright (C) 2016 eBusiness Information * * This file is part of OSM Contributor. * * OSM Contributor is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OSM Contributor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OSM Contributor. If not, see <http://www.gnu.org/licenses/>. */ package io.jawg.osmcontributor.flickr.oauth; import android.util.Log; import com.github.scribejava.core.model.Verb; import com.squareup.okhttp.OkHttpClient; import org.greenrobot.eventbus.EventBus; import java.util.Map; import javax.inject.Inject; import io.jawg.osmcontributor.flickr.event.FlickrUserConnectedEvent; import io.jawg.osmcontributor.flickr.event.PleaseAuthorizeEvent; import io.jawg.osmcontributor.flickr.rest.FlickrOauthClient; import io.jawg.osmcontributor.flickr.util.OAuthParams; import io.jawg.osmcontributor.flickr.util.ResponseConverter; import io.jawg.osmcontributor.rest.utils.MapParams; import io.jawg.osmcontributor.rest.utils.StringConverter; import io.jawg.osmcontributor.utils.ConfigManager; import retrofit.Callback; import retrofit.RestAdapter; import retrofit.RetrofitError; import retrofit.client.OkClient; import retrofit.client.Response; /** * Utils methods for request signing. */ public class FlickrOAuth { /*=========================================*/ /*-------------CONSTANTS-------------------*/ /*=========================================*/ private static final String TAG = "FlickrOAuth"; private static final String OAUTH_URL = "http://www.flickr.com/services/oauth"; private static final String REQUEST_TOKEN_URL = OAUTH_URL + "/request_token"; private static final String AUTHORIZE_URL = OAUTH_URL + "/authorize"; private static final String ACCESS_TOKEN_URL = OAUTH_URL + "/access_token"; private static final String PERMS = "perms"; private static final String WRITE_PERM = "write"; /*=========================================*/ /*------------INJECTIONS-------------------*/ /*=========================================*/ @Inject ConfigManager configManager; @Inject EventBus eventBus; /*=========================================*/ /*------------ATTRIBUTES-------------------*/ /*=========================================*/ private FlickrOauthClient flickrOauthClient; private OAuthRequest oAuthRequest; /*=========================================*/ /*------------CONSTRUCTORS-----------------*/ /*=========================================*/ public FlickrOAuth() { // Init Flickr retrofit client RestAdapter adapter = new RestAdapter.Builder() .setConverter(new StringConverter()) .setEndpoint(OAUTH_URL) .setClient(new OkClient(new OkHttpClient())) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); flickrOauthClient = adapter.create(FlickrOauthClient.class); } /*=========================================*/ /*-------------FLICKR API------------------*/ /*=========================================*/ /** * OAuth with Flickr API. * First step: Request a token. */ public void flickrRequestToken() { // Creation of the request with API_KEY and API_KEY_SECRET. oAuthRequest = new OAuthRequest(configManager.getFlickrApiKey(), configManager.getFlickrApiKeySecret()); oAuthRequest.setRequestUrl(REQUEST_TOKEN_URL); // Creation of request parameters. Callback is set to one by default (no need for callback) oAuthRequest.initParam(OAuthParams.getOAuthParams().put(OAuthParams.OAUTH_CALLBACK, "1").toMap()); // Sign request with HMAC-SHA1 algorithm. oAuthRequest.signRequest(Verb.GET); // Make the request. flickrOauthClient.requestToken(oAuthRequest.getParams(), new Callback<String>() { @Override public void success(String oauthResponse, Response response) { // If request succeed. if (response.getStatus() == 200) { // Response is not JSON. Parse it and get oauth_token and oauth_token_secret. Map<String, String> responseConverted = ResponseConverter.convertOAuthResponse(oauthResponse); String oauthToken = responseConverted.get(OAuthParams.OAUTH_TOKEN); String oauthTokenSecret = responseConverted.get(OAuthParams.OAUTH_TOKEN_SECRET); // Set the request object with values. if (oauthToken != null) { oAuthRequest.setOAuthToken(oauthToken); oAuthRequest.setOAuthTokenSecret(oauthTokenSecret); flickrAuthorize(); return; } } Log.e(TAG, response.getStatus() + " " + response.getReason()); } @Override public void failure(RetrofitError error) { error.printStackTrace(); } }); } /** * OAuth with Flickr API. * Second step: Authorize app with previous token. */ public void flickrAuthorize() { // Request creation. Second step : Ask for user authorization. oAuthRequest.setRequestUrl(AUTHORIZE_URL); // Init request param. oAuthRequest.initParam(new MapParams<String, String>().put(OAuthParams.OAUTH_TOKEN, oAuthRequest.getOAuthToken()).put(PERMS, WRITE_PERM).toMap()); oAuthRequest.signRequest(Verb.GET); // Launch the webview. eventBus.post(new PleaseAuthorizeEvent(oAuthRequest)); } /** * Final step in Flickr OAuth. Get final token. * @param oAuthToken token obtained with authorize method * @param oAuthVerfier verifier token obtained with authorize method */ public void flickrAccessToken(String oAuthToken, String oAuthVerfier) { oAuthRequest.setRequestUrl(ACCESS_TOKEN_URL); oAuthRequest.setOAuthToken(oAuthToken); // Init request params. oAuthRequest.initParam(OAuthParams.getOAuthParams().put(OAuthParams.OAUTH_TOKEN, oAuthToken).put(OAuthParams.OAUTH_VERIFIER, oAuthVerfier).toMap()); oAuthRequest.signRequest(Verb.GET); // Send request. flickrOauthClient.accessToken(oAuthRequest.getParams(), new Callback<String>() { @Override public void success(String oauthResponse, Response response) { if (response.getStatus() == 200) { // Get user informations. eventBus.post(new FlickrUserConnectedEvent(ResponseConverter.convertOAuthResponse(oauthResponse))); } else { Log.e(TAG, response.getStatus() + " " + response.getReason()); } } @Override public void failure(RetrofitError error) { error.printStackTrace(); } }); } /*=========================================*/ /*------------GETTERS/SETTERS--------------*/ /*=========================================*/ public OAuthRequest getOAuthRequest() { return oAuthRequest; } public void setOAuthRequest(OAuthRequest oAuthRequest) { this.oAuthRequest = oAuthRequest; } }