Merge branch 'text_file_preview_pr_707_with_develop' of github.com:owncloud/android...
[pub/Android/ownCloud.git] / src / com / owncloud / android / operations / OAuth2GetAccessToken.java
1 /**
2 * ownCloud Android client application
3 *
4 * Copyright (C) 2015 ownCloud Inc.
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2,
8 * as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 */
19
20 package com.owncloud.android.operations;
21
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.Map;
25
26 import org.apache.commons.httpclient.methods.PostMethod;
27 import org.apache.commons.httpclient.NameValuePair;
28 import org.json.JSONException;
29 import org.json.JSONObject;
30
31 import com.owncloud.android.authentication.OAuth2Constants;
32 import com.owncloud.android.lib.common.OwnCloudClient;
33 import com.owncloud.android.lib.common.operations.RemoteOperation;
34 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
35 import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
36 import com.owncloud.android.lib.common.utils.Log_OC;
37
38
39 public class OAuth2GetAccessToken extends RemoteOperation {
40
41 private static final String TAG = OAuth2GetAccessToken.class.getSimpleName();
42
43 private String mClientId;
44 private String mRedirectUri;
45 private String mGrantType;
46
47 private String mOAuth2AuthorizationResponse;
48 private Map<String, String> mOAuth2ParsedAuthorizationResponse;
49 private Map<String, String> mResultTokenMap;
50
51
52 public OAuth2GetAccessToken(String clientId, String redirectUri, String grantType, String oAuth2AuthorizationResponse) {
53 mClientId = clientId;
54 mRedirectUri = redirectUri;
55 mGrantType = grantType;
56 mOAuth2AuthorizationResponse = oAuth2AuthorizationResponse;
57 mOAuth2ParsedAuthorizationResponse = new HashMap<String, String>();
58 mResultTokenMap = null;
59 }
60
61 /*
62 public Map<String, String> getResultTokenMap() {
63 return mResultTokenMap;
64 }
65 */
66
67 @Override
68 protected RemoteOperationResult run(OwnCloudClient client) {
69 RemoteOperationResult result = null;
70 PostMethod postMethod = null;
71
72 try {
73 parseAuthorizationResponse();
74 if (mOAuth2ParsedAuthorizationResponse.keySet().contains(OAuth2Constants.KEY_ERROR)) {
75 if (OAuth2Constants.VALUE_ERROR_ACCESS_DENIED.equals(mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_ERROR))) {
76 result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR_ACCESS_DENIED);
77 } else {
78 result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR);
79 }
80 }
81
82 if (result == null) {
83 NameValuePair[] nameValuePairs = new NameValuePair[4];
84 nameValuePairs[0] = new NameValuePair(OAuth2Constants.KEY_GRANT_TYPE, mGrantType);
85 nameValuePairs[1] = new NameValuePair(OAuth2Constants.KEY_CODE, mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_CODE));
86 nameValuePairs[2] = new NameValuePair(OAuth2Constants.KEY_REDIRECT_URI, mRedirectUri);
87 nameValuePairs[3] = new NameValuePair(OAuth2Constants.KEY_CLIENT_ID, mClientId);
88 //nameValuePairs[4] = new NameValuePair(OAuth2Constants.KEY_SCOPE, mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_SCOPE));
89
90 postMethod = new PostMethod(client.getWebdavUri().toString());
91 postMethod.setRequestBody(nameValuePairs);
92 int status = client.executeMethod(postMethod);
93
94 String response = postMethod.getResponseBodyAsString();
95 if (response != null && response.length() > 0) {
96 JSONObject tokenJson = new JSONObject(response);
97 parseAccessTokenResult(tokenJson);
98 if (mResultTokenMap.get(OAuth2Constants.KEY_ERROR) != null || mResultTokenMap.get(OAuth2Constants.KEY_ACCESS_TOKEN) == null) {
99 result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR);
100
101 } else {
102 result = new RemoteOperationResult(true, status, postMethod.getResponseHeaders());
103 ArrayList<Object> data = new ArrayList<Object>();
104 data.add(mResultTokenMap);
105 result.setData(data);
106 }
107
108 } else {
109 client.exhaustResponse(postMethod.getResponseBodyAsStream());
110 result = new RemoteOperationResult(false, status, postMethod.getResponseHeaders());
111 }
112 }
113
114 } catch (Exception e) {
115 result = new RemoteOperationResult(e);
116
117 } finally {
118 if (postMethod != null)
119 postMethod.releaseConnection(); // let the connection available for other methods
120
121 if (result.isSuccess()) {
122 Log_OC.i(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage());
123
124 } else if (result.getException() != null) {
125 Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage(), result.getException());
126
127 } else if (result.getCode() == ResultCode.OAUTH2_ERROR) {
128 Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + ((mResultTokenMap != null) ? mResultTokenMap.get(OAuth2Constants.KEY_ERROR) : "NULL"));
129
130 } else {
131 Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage());
132 }
133 }
134
135 return result;
136 }
137
138
139 private void parseAuthorizationResponse() {
140 String[] pairs = mOAuth2AuthorizationResponse.split("&");
141 int i = 0;
142 String key = "";
143 String value = "";
144 StringBuilder sb = new StringBuilder();
145 while (pairs.length > i) {
146 int j = 0;
147 String[] part = pairs[i].split("=");
148 while (part.length > j) {
149 String p = part[j];
150 if (j == 0) {
151 key = p;
152 sb.append(key + " = ");
153 } else if (j == 1) {
154 value = p;
155 mOAuth2ParsedAuthorizationResponse.put(key, value);
156 sb.append(value + "\n");
157 }
158
159 Log_OC.v(TAG, "[" + i + "," + j + "] = " + p);
160 j++;
161 }
162 i++;
163 }
164 }
165
166
167 private void parseAccessTokenResult (JSONObject tokenJson) throws JSONException {
168 mResultTokenMap = new HashMap<String, String>();
169
170 if (tokenJson.has(OAuth2Constants.KEY_ACCESS_TOKEN)) {
171 mResultTokenMap.put(OAuth2Constants.KEY_ACCESS_TOKEN, tokenJson.getString(OAuth2Constants.KEY_ACCESS_TOKEN));
172 }
173 if (tokenJson.has(OAuth2Constants.KEY_TOKEN_TYPE)) {
174 mResultTokenMap.put(OAuth2Constants.KEY_TOKEN_TYPE, tokenJson.getString(OAuth2Constants.KEY_TOKEN_TYPE));
175 }
176 if (tokenJson.has(OAuth2Constants.KEY_EXPIRES_IN)) {
177 mResultTokenMap.put(OAuth2Constants.KEY_EXPIRES_IN, tokenJson.getString(OAuth2Constants.KEY_EXPIRES_IN));
178 }
179 if (tokenJson.has(OAuth2Constants.KEY_REFRESH_TOKEN)) {
180 mResultTokenMap.put(OAuth2Constants.KEY_REFRESH_TOKEN, tokenJson.getString(OAuth2Constants.KEY_REFRESH_TOKEN));
181 }
182 if (tokenJson.has(OAuth2Constants.KEY_SCOPE)) {
183 mResultTokenMap.put(OAuth2Constants.KEY_SCOPE, tokenJson.getString(OAuth2Constants.KEY_SCOPE));
184 }
185 if (tokenJson.has(OAuth2Constants.KEY_ERROR)) {
186 mResultTokenMap.put(OAuth2Constants.KEY_ERROR, tokenJson.getString(OAuth2Constants.KEY_ERROR));
187 }
188 if (tokenJson.has(OAuth2Constants.KEY_ERROR_DESCRIPTION)) {
189 mResultTokenMap.put(OAuth2Constants.KEY_ERROR_DESCRIPTION, tokenJson.getString(OAuth2Constants.KEY_ERROR_DESCRIPTION));
190 }
191 if (tokenJson.has(OAuth2Constants.KEY_ERROR_URI)) {
192 mResultTokenMap.put(OAuth2Constants.KEY_ERROR_URI, tokenJson.getString(OAuth2Constants.KEY_ERROR_URI));
193 }
194 }
195
196 }