package net.londatiga.android.twitter.oauth; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import net.londatiga.android.twitter.http.HttpParams; import net.londatiga.android.twitter.http.HttpValues; import net.londatiga.android.twitter.util.Debug; import net.londatiga.android.twitter.util.StringUtil; /** * Oauth provider. * * @author Lorensius W. L. T <lorenz@londatiga.net> * */ public class OauthProvider { private OauthConsumer mOauthConsumer; private OauthToken mOauthToken; private OauthAccessToken mAccessToken; private String mRequestTokenUrl; private String mAccessTokenUrl; private String mAuthorizationUrl; private String mScreenName = ""; private String mUserId = ""; public OauthProvider(OauthConsumer oauthConsumer, String requestTokenUrl, String authorizationUrl, String accessTokenUrl) { mOauthConsumer = oauthConsumer; mRequestTokenUrl = requestTokenUrl; mAuthorizationUrl = authorizationUrl; mAccessTokenUrl = accessTokenUrl; } public String getAuthorizationUrl() throws Exception { String url = ""; HttpParams httpParams = new HttpParams(); OauthSignature reqSignature = new OauthSignature(); String nonce = OauthUtil.createNonce(); String timestamp = OauthUtil.getTimeStamp(); httpParams.put("oauth_callback", new HttpValues(mOauthConsumer.getCallbackUrl())); httpParams.put("oauth_consumer_key", new HttpValues(mOauthConsumer.getConsumerKey())); httpParams.put("oauth_nonce", new HttpValues(nonce)); httpParams.put("oauth_signature_method", new HttpValues(OauthUtil.SIGNATURE_METHOD)); httpParams.put("oauth_timestamp", new HttpValues(timestamp)); httpParams.put("oauth_version", new HttpValues(OauthUtil.OAUTH_VERSION)); InputStream stream = null; try { String sigBase = reqSignature.createSignatureBase("POST", mRequestTokenUrl, httpParams.getQueryString()); String signature = reqSignature.createRequestSignature(sigBase, mOauthConsumer.getConsumerSecret(), ""); String authHeader = OauthHeader.buildRequestTokenHeader( mOauthConsumer.getCallbackUrl(), mOauthConsumer.getConsumerKey(), nonce, signature, OauthUtil.SIGNATURE_METHOD, timestamp, OauthUtil.OAUTH_VERSION); Debug.i("Signature base " + sigBase); Debug.i("Signature " + signature); Debug.i("POST " + mRequestTokenUrl); Debug.i("Authorization " + authHeader); HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(mRequestTokenUrl); List<NameValuePair> params = new ArrayList<NameValuePair>(1); params.add(new BasicNameValuePair("oauth_callback", mOauthConsumer.getCallbackUrl())); httpPost.addHeader("Authorization", "OAuth " + authHeader); httpPost.setEntity(new UrlEncodedFormEntity(params)); HttpResponse httpResponse = httpClient.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == 200) { HttpEntity httpEntity = httpResponse.getEntity(); if (httpEntity == null) { throw new Exception("Return value is empty"); } stream = httpEntity.getContent(); String response = StringUtil.streamToString(stream); Debug.i("Response " + response); processRequestToken(response); if (mOauthToken == null) { throw new Exception("Failed to get request token"); } else { url = mAuthorizationUrl + "?oauth_token=" + mOauthToken.getToken(); } stream.close(); } else { throw new Exception(httpResponse.getStatusLine().getReasonPhrase()); } } catch (Exception e) { throw e; } finally { if (stream != null) { stream.close(); } } return url; } public OauthAccessToken retreiveAccessToken(String oauthVerifier) throws Exception { if (mOauthToken == null) { throw new Exception("Request token is empty, please call getAuthorizationUrl before calling this method"); } HttpParams httpParams = new HttpParams(); OauthSignature reqSignature = new OauthSignature(); String nonce = OauthUtil.createNonce(); String timestamp = OauthUtil.getTimeStamp(); httpParams.put("oauth_verifier", new HttpValues(oauthVerifier)); httpParams.put("oauth_consumer_key", new HttpValues(mOauthConsumer.getConsumerKey())); httpParams.put("oauth_nonce", new HttpValues(nonce)); httpParams.put("oauth_signature_method", new HttpValues(OauthUtil.SIGNATURE_METHOD)); httpParams.put("oauth_timestamp", new HttpValues(timestamp)); httpParams.put("oauth_token", new HttpValues(mOauthToken.getToken())); httpParams.put("oauth_version", new HttpValues(OauthUtil.OAUTH_VERSION)); InputStream stream = null; try { String sigBase = reqSignature.createSignatureBase("POST", mAccessTokenUrl, httpParams.getQueryString()); String signature = reqSignature.createRequestSignature(sigBase, mOauthConsumer.getConsumerSecret(), mOauthToken.getSecret()); String authHeader = OauthHeader.buildRequestHeader( mOauthConsumer.getConsumerKey(), nonce, signature, OauthUtil.SIGNATURE_METHOD, timestamp, mOauthToken.getToken(), oauthVerifier, OauthUtil.OAUTH_VERSION); Debug.i("Signature base " + sigBase); Debug.i("Signature " + signature); Debug.i("POST " + mAccessTokenUrl); Debug.i("Authorization " + authHeader); HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(mAccessTokenUrl); List<NameValuePair> params = new ArrayList<NameValuePair>(1); params.add(new BasicNameValuePair("oauth_verifier", oauthVerifier)); httpPost.addHeader("Authorization", "OAuth " + authHeader); httpPost.setEntity(new UrlEncodedFormEntity(params)); HttpResponse httpResponse = httpClient.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == 200) { HttpEntity httpEntity = httpResponse.getEntity(); if (httpEntity == null) { throw new Exception("Return value is empty"); } stream = httpEntity.getContent(); String response = StringUtil.streamToString(stream); Debug.i("Response " + response); processAccessToken(response); if (mAccessToken == null) { throw new Exception("Failed to get access token"); } } else { throw new Exception(httpResponse.getStatusLine().getReasonPhrase()); } } catch (Exception e) { throw e; } finally { if (stream != null) { stream.close(); } } return mAccessToken; } public OauthToken getToken() { return mOauthToken; } public String getScreenName() { return mScreenName; } public String getUserId() { return mUserId; } private void processRequestToken(String response) { if (response.contains("&")) { String arrs[] = response.split("&"); int length = arrs.length; String token = ""; String secret = ""; boolean confr = true; for (int i = 0; i < length; i++) { String[] temp = arrs[i].split("="); if (temp[0].equals(OauthUtil.OAUTH_TOKEN)) { token = temp[1]; } if (temp[0].equals(OauthUtil.OAUTH_TOKEN_SECRET)) { secret = temp[1]; } if (temp[0].equals(OauthUtil.OAUTH_CALLBACK_CONFIRMED)) { confr = (temp[1].equals("true")) ? true : false; } } if (!token.equals("") && !secret.equals("")) { mOauthToken = new OauthToken(token, secret, confr); } } } private void processAccessToken(String response) { if (response.contains("&")) { String arrs[] = response.split("&"); int length = arrs.length; String token = ""; String secret = ""; for (int i = 0; i < length; i++) { String[] temp = arrs[i].split("="); if (temp[0].equals(OauthUtil.OAUTH_TOKEN)) { token = temp[1]; } if (temp[0].equals(OauthUtil.OAUTH_TOKEN_SECRET)) { secret = temp[1]; } if (temp[0].equals(OauthUtil.USER_ID)) { mUserId = temp[1]; } if (temp[0].equals(OauthUtil.SCREEN_NAME)) { mScreenName = temp[1]; } } if (!token.equals("") && !secret.equals("")) { mAccessToken = new OauthAccessToken(token, secret); } } } }