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 GetOAuth2AccessToken
extends RemoteOperation
{
20 private static final String TAG
= GetOAuth2AccessToken
.class.getSimpleName();
22 private Map
<String
, String
> mOAuth2AuthorizationResponse
;
23 private Map
<String
, String
> mResultTokenMap
;
26 public GetOAuth2AccessToken(Map
<String
, String
> oAuth2AuthorizationResponse
) {
27 mOAuth2AuthorizationResponse
= oAuth2AuthorizationResponse
;
28 mResultTokenMap
= null
;
32 public Map
<String
, String
> getOauth2AutorizationResponse() {
33 return mOAuth2AuthorizationResponse
;
36 public Map
<String
, String
> getResultTokenMap() {
37 return mResultTokenMap
;
41 protected RemoteOperationResult
run(WebdavClient client
) {
42 RemoteOperationResult result
= null
;
43 PostMethod postMethod
= null
;
46 NameValuePair
[] nameValuePairs
= new NameValuePair
[5];
47 nameValuePairs
[0] = new NameValuePair(OAuth2Context
.KEY_CLIENT_ID
, OAuth2Context
.OAUTH2_F_CLIENT_ID
);
48 nameValuePairs
[1] = new NameValuePair(OAuth2Context
.KEY_CODE
, mOAuth2AuthorizationResponse
.get(OAuth2Context
.KEY_CODE
));
49 nameValuePairs
[2] = new NameValuePair(OAuth2Context
.KEY_SCOPE
, mOAuth2AuthorizationResponse
.get(OAuth2Context
.KEY_SCOPE
));
50 nameValuePairs
[3] = new NameValuePair(OAuth2Context
.KEY_REDIRECT_URI
, OAuth2Context
.MY_REDIRECT_URI
);
51 nameValuePairs
[4] = new NameValuePair(OAuth2Context
.KEY_GRANT_TYPE
, OAuth2Context
.OAUTH2_AUTH_CODE_GRANT_TYPE
);
53 postMethod
= new PostMethod(client
.getBaseUri().toString());
54 postMethod
.setRequestBody(nameValuePairs
);
55 int status
= client
.executeMethod(postMethod
);
57 client
.exhaustResponse(postMethod
.getResponseBodyAsStream());
58 result
= new RemoteOperationResult(false
, status
);
61 JSONObject tokenJson
= new JSONObject(postMethod
.getResponseBodyAsString());
62 parseResult(tokenJson
);
63 if (mResultTokenMap
.get(OAuth2Context
.OAUTH2_TOKEN_RECEIVED_ERROR
) != null
) {
64 result
= new RemoteOperationResult(ResultCode
.OAUTH2_ERROR
);
67 result
= new RemoteOperationResult(true
, status
);
71 } catch (Exception e
) {
72 result
= new RemoteOperationResult(e
);
75 if (postMethod
!= null
)
76 postMethod
.releaseConnection(); // let the connection available for other methods
78 if (result
.isSuccess()) {
79 Log
.i(TAG
, "OAuth2 TOKEN REQUEST with code " + mOAuth2AuthorizationResponse
.get("code") + " to " + client
.getBaseUri() + ": " + result
.getLogMessage());
81 } else if (result
.getException() != null
) {
82 Log
.e(TAG
, "OAuth2 TOKEN REQUEST with code " + mOAuth2AuthorizationResponse
.get("code") + " to " + client
.getBaseUri() + ": " + result
.getLogMessage(), result
.getException());
84 } else if (result
.getCode() == ResultCode
.OAUTH2_ERROR
) {
85 Log
.e(TAG
, "OAuth2 TOKEN REQUEST with code " + mOAuth2AuthorizationResponse
.get("code") + " to " + client
.getBaseUri() + ": " + mResultTokenMap
.get(OAuth2Context
.OAUTH2_TOKEN_RECEIVED_ERROR
));
88 Log
.e(TAG
, "OAuth2 TOKEN REQUEST with code " + mOAuth2AuthorizationResponse
.get("code") + " to " + client
.getBaseUri() + ": " + result
.getLogMessage());
96 private void parseResult (JSONObject tokenJson
) throws JSONException
{
97 mResultTokenMap
= new HashMap
<String
, String
>();
99 if (tokenJson
.has(OAuth2Context
.KEY_ACCESS_TOKEN
)) {
100 mResultTokenMap
.put(OAuth2Context
.KEY_ACCESS_TOKEN
, tokenJson
.getString(OAuth2Context
.KEY_ACCESS_TOKEN
));
102 if (tokenJson
.has(OAuth2Context
.KEY_TOKEN_TYPE
)) {
103 mResultTokenMap
.put(OAuth2Context
.KEY_TOKEN_TYPE
, tokenJson
.getString(OAuth2Context
.KEY_TOKEN_TYPE
));
105 if (tokenJson
.has(OAuth2Context
.KEY_EXPIRES_IN
)) {
106 mResultTokenMap
.put(OAuth2Context
.KEY_EXPIRES_IN
, tokenJson
.getString(OAuth2Context
.KEY_EXPIRES_IN
));
108 if (tokenJson
.has(OAuth2Context
.KEY_REFRESH_TOKEN
)) {
109 mResultTokenMap
.put(OAuth2Context
.KEY_REFRESH_TOKEN
, tokenJson
.getString(OAuth2Context
.KEY_REFRESH_TOKEN
));
111 if (tokenJson
.has(OAuth2Context
.KEY_SCOPE
)) {
112 mResultTokenMap
.put(OAuth2Context
.KEY_SCOPE
, tokenJson
.getString(OAuth2Context
.KEY_SCOPE
));
114 if (tokenJson
.has(OAuth2Context
.KEY_ERROR
)) {
115 mResultTokenMap
.put(OAuth2Context
.KEY_ERROR
, tokenJson
.getString(OAuth2Context
.KEY_ERROR
));
117 if (tokenJson
.has(OAuth2Context
.KEY_ERROR_DESCRIPTION
)) {
118 mResultTokenMap
.put(OAuth2Context
.KEY_ERROR_DESCRIPTION
, tokenJson
.getString(OAuth2Context
.KEY_ERROR_DESCRIPTION
));
120 if (tokenJson
.has(OAuth2Context
.KEY_ERROR_URI
)) {
121 mResultTokenMap
.put(OAuth2Context
.KEY_ERROR_URI
, tokenJson
.getString(OAuth2Context
.KEY_ERROR_URI
));