1 package com
.owncloud
.android
.operations
;
3 import java
.util
.HashMap
;
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
;
11 import com
.owncloud
.android
.authenticator
.oauth2
.OAuth2Context
;
12 import com
.owncloud
.android
.operations
.RemoteOperationResult
.ResultCode
;
14 import android
.util
.Log
;
16 import eu
.alefzero
.webdav
.WebdavClient
;
18 public class OAuth2GetAccessToken
extends RemoteOperation
{
20 private static final String TAG
= OAuth2GetAccessToken
.class.getSimpleName();
22 private String mOAuth2AuthorizationResponse
;
23 private Map
<String
, String
> mOAuth2ParsedAuthorizationResponse
;
24 private Map
<String
, String
> mResultTokenMap
;
27 public OAuth2GetAccessToken(String oAuth2AuthorizationResponse
) {
29 mOAuth2AuthorizationResponse
= oAuth2AuthorizationResponse
;
30 mOAuth2ParsedAuthorizationResponse
= new HashMap
<String
, String
>();
31 mResultTokenMap
= null
;
35 public Map
<String
, String
> getOauth2AutorizationResponse() {
36 return mOAuth2ParsedAuthorizationResponse
;
39 public Map
<String
, String
> getResultTokenMap() {
40 return mResultTokenMap
;
44 protected RemoteOperationResult
run(WebdavClient client
) {
45 RemoteOperationResult result
= null
;
46 PostMethod postMethod
= null
;
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
);
54 result
= new RemoteOperationResult(ResultCode
.OAUTH2_ERROR
);
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
);
66 postMethod
= new PostMethod(client
.getBaseUri().toString());
67 postMethod
.setRequestBody(nameValuePairs
);
68 int status
= client
.executeMethod(postMethod
);
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
);
78 result
= new RemoteOperationResult(true
, status
);
82 client
.exhaustResponse(postMethod
.getResponseBodyAsStream());
83 result
= new RemoteOperationResult(false
, status
);
87 } catch (Exception e
) {
88 result
= new RemoteOperationResult(e
);
91 if (postMethod
!= null
)
92 postMethod
.releaseConnection(); // let the connection available for other methods
94 if (result
.isSuccess()) {
95 Log
.i(TAG
, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse
.get("code") + " to " + client
.getBaseUri() + ": " + result
.getLogMessage());
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());
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"));
104 Log
.e(TAG
, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse
.get("code") + " to " + client
.getBaseUri() + ": " + result
.getLogMessage());
112 private void parseAuthorizationResponse() {
113 String
[] pairs
= mOAuth2AuthorizationResponse
.split("&");
117 StringBuilder sb
= new StringBuilder();
118 while (pairs
.length
> i
) {
120 String
[] part
= pairs
[i
].split("=");
121 while (part
.length
> j
) {
125 sb
.append(key
+ " = ");
128 mOAuth2ParsedAuthorizationResponse
.put(key
, value
);
129 sb
.append(value
+ "\n");
132 Log
.v(TAG
, "[" + i
+ "," + j
+ "] = " + p
);
140 private void parseAccessTokenResult (JSONObject tokenJson
) throws JSONException
{
141 mResultTokenMap
= new HashMap
<String
, String
>();
143 if (tokenJson
.has(OAuth2Context
.KEY_ACCESS_TOKEN
)) {
144 mResultTokenMap
.put(OAuth2Context
.KEY_ACCESS_TOKEN
, tokenJson
.getString(OAuth2Context
.KEY_ACCESS_TOKEN
));
146 if (tokenJson
.has(OAuth2Context
.KEY_TOKEN_TYPE
)) {
147 mResultTokenMap
.put(OAuth2Context
.KEY_TOKEN_TYPE
, tokenJson
.getString(OAuth2Context
.KEY_TOKEN_TYPE
));
149 if (tokenJson
.has(OAuth2Context
.KEY_EXPIRES_IN
)) {
150 mResultTokenMap
.put(OAuth2Context
.KEY_EXPIRES_IN
, tokenJson
.getString(OAuth2Context
.KEY_EXPIRES_IN
));
152 if (tokenJson
.has(OAuth2Context
.KEY_REFRESH_TOKEN
)) {
153 mResultTokenMap
.put(OAuth2Context
.KEY_REFRESH_TOKEN
, tokenJson
.getString(OAuth2Context
.KEY_REFRESH_TOKEN
));
155 if (tokenJson
.has(OAuth2Context
.KEY_SCOPE
)) {
156 mResultTokenMap
.put(OAuth2Context
.KEY_SCOPE
, tokenJson
.getString(OAuth2Context
.KEY_SCOPE
));
158 if (tokenJson
.has(OAuth2Context
.KEY_ERROR
)) {
159 mResultTokenMap
.put(OAuth2Context
.KEY_ERROR
, tokenJson
.getString(OAuth2Context
.KEY_ERROR
));
161 if (tokenJson
.has(OAuth2Context
.KEY_ERROR_DESCRIPTION
)) {
162 mResultTokenMap
.put(OAuth2Context
.KEY_ERROR_DESCRIPTION
, tokenJson
.getString(OAuth2Context
.KEY_ERROR_DESCRIPTION
));
164 if (tokenJson
.has(OAuth2Context
.KEY_ERROR_URI
)) {
165 mResultTokenMap
.put(OAuth2Context
.KEY_ERROR_URI
, tokenJson
.getString(OAuth2Context
.KEY_ERROR_URI
));