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