Merge branch 'master' into develop
[pub/Android/ownCloud.git] / src / com / owncloud / android / operations / OAuth2GetAccessToken.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.authentication.OAuth2Constants;
12 import com.owncloud.android.lib.common.OwnCloudClient;
13 import com.owncloud.android.lib.common.operations.RemoteOperation;
14 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
15 import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
16 import com.owncloud.android.utils.Log_OC;
17
18
19 public class OAuth2GetAccessToken extends RemoteOperation {
20
21 private static final String TAG = OAuth2GetAccessToken.class.getSimpleName();
22
23 private String mClientId;
24 private String mRedirectUri;
25 private String mGrantType;
26
27 private String mOAuth2AuthorizationResponse;
28 private Map<String, String> mOAuth2ParsedAuthorizationResponse;
29 private Map<String, String> mResultTokenMap;
30
31
32 public OAuth2GetAccessToken(String clientId, String redirectUri, String grantType, String oAuth2AuthorizationResponse) {
33 mClientId = clientId;
34 mRedirectUri = redirectUri;
35 mGrantType = grantType;
36 mOAuth2AuthorizationResponse = oAuth2AuthorizationResponse;
37 mOAuth2ParsedAuthorizationResponse = new HashMap<String, String>();
38 mResultTokenMap = null;
39 }
40
41
42 public Map<String, String> getOauth2AutorizationResponse() {
43 return mOAuth2ParsedAuthorizationResponse;
44 }
45
46 public Map<String, String> getResultTokenMap() {
47 return mResultTokenMap;
48 }
49
50 @Override
51 protected RemoteOperationResult run(OwnCloudClient client) {
52 RemoteOperationResult result = null;
53 PostMethod postMethod = null;
54
55 try {
56 parseAuthorizationResponse();
57 if (mOAuth2ParsedAuthorizationResponse.keySet().contains(OAuth2Constants.KEY_ERROR)) {
58 if (OAuth2Constants.VALUE_ERROR_ACCESS_DENIED.equals(mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_ERROR))) {
59 result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR_ACCESS_DENIED);
60 } else {
61 result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR);
62 }
63 }
64
65 if (result == null) {
66 NameValuePair[] nameValuePairs = new NameValuePair[4];
67 nameValuePairs[0] = new NameValuePair(OAuth2Constants.KEY_GRANT_TYPE, mGrantType);
68 nameValuePairs[1] = new NameValuePair(OAuth2Constants.KEY_CODE, mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_CODE));
69 nameValuePairs[2] = new NameValuePair(OAuth2Constants.KEY_REDIRECT_URI, mRedirectUri);
70 nameValuePairs[3] = new NameValuePair(OAuth2Constants.KEY_CLIENT_ID, mClientId);
71 //nameValuePairs[4] = new NameValuePair(OAuth2Constants.KEY_SCOPE, mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_SCOPE));
72
73 postMethod = new PostMethod(client.getWebdavUri().toString());
74 postMethod.setRequestBody(nameValuePairs);
75 int status = client.executeMethod(postMethod);
76
77 String response = postMethod.getResponseBodyAsString();
78 if (response != null && response.length() > 0) {
79 JSONObject tokenJson = new JSONObject(response);
80 parseAccessTokenResult(tokenJson);
81 if (mResultTokenMap.get(OAuth2Constants.KEY_ERROR) != null || mResultTokenMap.get(OAuth2Constants.KEY_ACCESS_TOKEN) == null) {
82 result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR);
83
84 } else {
85 result = new RemoteOperationResult(true, status, postMethod.getResponseHeaders());
86 }
87
88 } else {
89 client.exhaustResponse(postMethod.getResponseBodyAsStream());
90 result = new RemoteOperationResult(false, status, postMethod.getResponseHeaders());
91 }
92 }
93
94 } catch (Exception e) {
95 result = new RemoteOperationResult(e);
96
97 } finally {
98 if (postMethod != null)
99 postMethod.releaseConnection(); // let the connection available for other methods
100
101 if (result.isSuccess()) {
102 Log_OC.i(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage());
103
104 } else if (result.getException() != null) {
105 Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage(), result.getException());
106
107 } else if (result.getCode() == ResultCode.OAUTH2_ERROR) {
108 Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + ((mResultTokenMap != null) ? mResultTokenMap.get(OAuth2Constants.KEY_ERROR) : "NULL"));
109
110 } else {
111 Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage());
112 }
113 }
114
115 return result;
116 }
117
118
119 private void parseAuthorizationResponse() {
120 String[] pairs = mOAuth2AuthorizationResponse.split("&");
121 int i = 0;
122 String key = "";
123 String value = "";
124 StringBuilder sb = new StringBuilder();
125 while (pairs.length > i) {
126 int j = 0;
127 String[] part = pairs[i].split("=");
128 while (part.length > j) {
129 String p = part[j];
130 if (j == 0) {
131 key = p;
132 sb.append(key + " = ");
133 } else if (j == 1) {
134 value = p;
135 mOAuth2ParsedAuthorizationResponse.put(key, value);
136 sb.append(value + "\n");
137 }
138
139 Log_OC.v(TAG, "[" + i + "," + j + "] = " + p);
140 j++;
141 }
142 i++;
143 }
144 }
145
146
147 private void parseAccessTokenResult (JSONObject tokenJson) throws JSONException {
148 mResultTokenMap = new HashMap<String, String>();
149
150 if (tokenJson.has(OAuth2Constants.KEY_ACCESS_TOKEN)) {
151 mResultTokenMap.put(OAuth2Constants.KEY_ACCESS_TOKEN, tokenJson.getString(OAuth2Constants.KEY_ACCESS_TOKEN));
152 }
153 if (tokenJson.has(OAuth2Constants.KEY_TOKEN_TYPE)) {
154 mResultTokenMap.put(OAuth2Constants.KEY_TOKEN_TYPE, tokenJson.getString(OAuth2Constants.KEY_TOKEN_TYPE));
155 }
156 if (tokenJson.has(OAuth2Constants.KEY_EXPIRES_IN)) {
157 mResultTokenMap.put(OAuth2Constants.KEY_EXPIRES_IN, tokenJson.getString(OAuth2Constants.KEY_EXPIRES_IN));
158 }
159 if (tokenJson.has(OAuth2Constants.KEY_REFRESH_TOKEN)) {
160 mResultTokenMap.put(OAuth2Constants.KEY_REFRESH_TOKEN, tokenJson.getString(OAuth2Constants.KEY_REFRESH_TOKEN));
161 }
162 if (tokenJson.has(OAuth2Constants.KEY_SCOPE)) {
163 mResultTokenMap.put(OAuth2Constants.KEY_SCOPE, tokenJson.getString(OAuth2Constants.KEY_SCOPE));
164 }
165 if (tokenJson.has(OAuth2Constants.KEY_ERROR)) {
166 mResultTokenMap.put(OAuth2Constants.KEY_ERROR, tokenJson.getString(OAuth2Constants.KEY_ERROR));
167 }
168 if (tokenJson.has(OAuth2Constants.KEY_ERROR_DESCRIPTION)) {
169 mResultTokenMap.put(OAuth2Constants.KEY_ERROR_DESCRIPTION, tokenJson.getString(OAuth2Constants.KEY_ERROR_DESCRIPTION));
170 }
171 if (tokenJson.has(OAuth2Constants.KEY_ERROR_URI)) {
172 mResultTokenMap.put(OAuth2Constants.KEY_ERROR_URI, tokenJson.getString(OAuth2Constants.KEY_ERROR_URI));
173 }
174 }
175
176 }