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