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