Cleaning-up AuthenticatorActivty code
[pub/Android/ownCloud.git] / src / com / owncloud / android / operations / GetOAuth2AccessToken.java
1 package com.owncloud.android.operations;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import org.apache.commons.httpclient.methods.PostMethod;
7 import org.apache.commons.httpclient.NameValuePair;
8 import org.json.JSONException;
9 import org.json.JSONObject;
10
11 import com.owncloud.android.authenticator.oauth2.OAuth2Context;
12 import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
13
14 import android.util.Log;
15
16 import eu.alefzero.webdav.WebdavClient;
17
18 public class GetOAuth2AccessToken extends RemoteOperation {
19
20 private static final String TAG = GetOAuth2AccessToken.class.getSimpleName();
21
22 private Map<String, String> mOAuth2AuthorizationResponse;
23 private Map<String, String> mResultTokenMap;
24
25
26 public GetOAuth2AccessToken(Map<String, String> oAuth2AuthorizationResponse) {
27 mOAuth2AuthorizationResponse = oAuth2AuthorizationResponse;
28 mResultTokenMap = null;
29 }
30
31
32 public Map<String, String> getOauth2AutorizationResponse() {
33 return mOAuth2AuthorizationResponse;
34 }
35
36 public Map<String, String> getResultTokenMap() {
37 return mResultTokenMap;
38 }
39
40 @Override
41 protected RemoteOperationResult run(WebdavClient client) {
42 RemoteOperationResult result = null;
43 PostMethod postMethod = null;
44
45 try {
46 NameValuePair[] nameValuePairs = new NameValuePair[5];
47 nameValuePairs[0] = new NameValuePair(OAuth2Context.KEY_CLIENT_ID, OAuth2Context.OAUTH2_F_CLIENT_ID);
48 nameValuePairs[1] = new NameValuePair(OAuth2Context.KEY_CODE, mOAuth2AuthorizationResponse.get(OAuth2Context.KEY_CODE));
49 nameValuePairs[2] = new NameValuePair(OAuth2Context.KEY_SCOPE, mOAuth2AuthorizationResponse.get(OAuth2Context.KEY_SCOPE));
50 nameValuePairs[3] = new NameValuePair(OAuth2Context.KEY_REDIRECT_URI, OAuth2Context.MY_REDIRECT_URI);
51 nameValuePairs[4] = new NameValuePair(OAuth2Context.KEY_GRANT_TYPE, OAuth2Context.OAUTH2_AUTH_CODE_GRANT_TYPE);
52
53 postMethod = new PostMethod(client.getBaseUri().toString());
54 postMethod.setRequestBody(nameValuePairs);
55 int status = client.executeMethod(postMethod);
56 if (status >= 300) {
57 client.exhaustResponse(postMethod.getResponseBodyAsStream());
58 result = new RemoteOperationResult(false, status);
59
60 } else {
61 JSONObject tokenJson = new JSONObject(postMethod.getResponseBodyAsString());
62 parseResult(tokenJson);
63 if (mResultTokenMap.get(OAuth2Context.OAUTH2_TOKEN_RECEIVED_ERROR) != null) {
64 result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR);
65
66 } else {
67 result = new RemoteOperationResult(true, status);
68 }
69 }
70
71 } catch (Exception e) {
72 result = new RemoteOperationResult(e);
73
74 } finally {
75 if (postMethod != null)
76 postMethod.releaseConnection(); // let the connection available for other methods
77
78 if (result.isSuccess()) {
79 Log.i(TAG, "OAuth2 TOKEN REQUEST with code " + mOAuth2AuthorizationResponse.get("code") + " to " + client.getBaseUri() + ": " + result.getLogMessage());
80
81 } else if (result.getException() != null) {
82 Log.e(TAG, "OAuth2 TOKEN REQUEST with code " + mOAuth2AuthorizationResponse.get("code") + " to " + client.getBaseUri() + ": " + result.getLogMessage(), result.getException());
83
84 } else if (result.getCode() == ResultCode.OAUTH2_ERROR) {
85 Log.e(TAG, "OAuth2 TOKEN REQUEST with code " + mOAuth2AuthorizationResponse.get("code") + " to " + client.getBaseUri() + ": " + mResultTokenMap.get(OAuth2Context.OAUTH2_TOKEN_RECEIVED_ERROR));
86
87 } else {
88 Log.e(TAG, "OAuth2 TOKEN REQUEST with code " + mOAuth2AuthorizationResponse.get("code") + " to " + client.getBaseUri() + ": " + result.getLogMessage());
89 }
90 }
91
92 return result;
93 }
94
95
96 private void parseResult (JSONObject tokenJson) throws JSONException {
97 mResultTokenMap = new HashMap<String, String>();
98
99 if (tokenJson.has(OAuth2Context.KEY_ACCESS_TOKEN)) {
100 mResultTokenMap.put(OAuth2Context.KEY_ACCESS_TOKEN, tokenJson.getString(OAuth2Context.KEY_ACCESS_TOKEN));
101 }
102 if (tokenJson.has(OAuth2Context.KEY_TOKEN_TYPE)) {
103 mResultTokenMap.put(OAuth2Context.KEY_TOKEN_TYPE, tokenJson.getString(OAuth2Context.KEY_TOKEN_TYPE));
104 }
105 if (tokenJson.has(OAuth2Context.KEY_EXPIRES_IN)) {
106 mResultTokenMap.put(OAuth2Context.KEY_EXPIRES_IN, tokenJson.getString(OAuth2Context.KEY_EXPIRES_IN));
107 }
108 if (tokenJson.has(OAuth2Context.KEY_REFRESH_TOKEN)) {
109 mResultTokenMap.put(OAuth2Context.KEY_REFRESH_TOKEN, tokenJson.getString(OAuth2Context.KEY_REFRESH_TOKEN));
110 }
111 if (tokenJson.has(OAuth2Context.KEY_SCOPE)) {
112 mResultTokenMap.put(OAuth2Context.KEY_SCOPE, tokenJson.getString(OAuth2Context.KEY_SCOPE));
113 }
114 if (tokenJson.has(OAuth2Context.KEY_ERROR)) {
115 mResultTokenMap.put(OAuth2Context.KEY_ERROR, tokenJson.getString(OAuth2Context.KEY_ERROR));
116 }
117 if (tokenJson.has(OAuth2Context.KEY_ERROR_DESCRIPTION)) {
118 mResultTokenMap.put(OAuth2Context.KEY_ERROR_DESCRIPTION, tokenJson.getString(OAuth2Context.KEY_ERROR_DESCRIPTION));
119 }
120 if (tokenJson.has(OAuth2Context.KEY_ERROR_URI)) {
121 mResultTokenMap.put(OAuth2Context.KEY_ERROR_URI, tokenJson.getString(OAuth2Context.KEY_ERROR_URI));
122 }
123 }
124
125 }