package com.xiaomi.infra.galaxy.fds.android.auth;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import com.google.gson.Gson;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.DefaultHttpClient;
import com.xiaomi.infra.galaxy.fds.android.exception.GalaxyFDSClientException;
import com.xiaomi.infra.galaxy.fds.android.model.HttpHeaders;
import com.xiaomi.infra.galaxy.fds.android.model.StorageAccessToken;
public class OAuthCredential implements GalaxyFDSCredential {
private static final String STORAGE_ACCESS_TOKEN = "storageAccessToken";
private static final String APP_ID = "appId";
private static final String OAUTH_APPID = "oauthAppId";
private static final String OAUTH_ACCESS_TOKEN = "oauthAccessToken";
private static final String OAUTH_PROVIDER = "oauthProvider";
private static final String OAUTH_MAC_KEY = "oauthMacKey";
private static final String OAUTH_MAC_ALGORITHM = "oauthMacAlgorithm";
private final String HEADER_VALUE = "OAuth";
private final String appId;
private final StorageAccessToken storageAccessToken;
public OAuthCredential(String fdsServiceBaseUri, String appId,
String oauthAppId, String oauthAccessToken, String oauthProvider,
String macKey, String macAlgorithm) throws GalaxyFDSClientException {
this.appId = appId;
this.storageAccessToken = getStorageAccessToken(fdsServiceBaseUri, appId,
oauthAppId, oauthAccessToken, oauthProvider, macKey, macAlgorithm);
}
private StorageAccessToken getStorageAccessToken(String serviceBaseUri,
String appId, String oauthAppId, String oauthAccessToken,
String oauthProvider, String macKey, String macAlgorithm)
throws GalaxyFDSClientException {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(serviceBaseUri + "/?" + STORAGE_ACCESS_TOKEN
+ "&" + APP_ID + "=" + appId
+ "&" + OAUTH_APPID + "=" + oauthAppId
+ "&" + OAUTH_ACCESS_TOKEN + "=" + oauthAccessToken
+ "&" + OAUTH_PROVIDER + "=" + oauthProvider
+ "&" + OAUTH_MAC_ALGORITHM + "=" + macAlgorithm
+ "&" + OAUTH_MAC_KEY + "=" + macKey);
get.setHeader(HttpHeaders.AUTHORIZATION, HEADER_VALUE);
HttpResponse response = httpClient.execute(get);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
throw new GalaxyFDSClientException("Failed to get the storage access "
+ "token from FDS server. URI:" + get.getURI().toString()
+ ".Reason:" + response.getStatusLine().toString());
}
InputStream in = response.getEntity().getContent();
Reader reader = new InputStreamReader(in);
StorageAccessToken token = new Gson().fromJson(reader,
StorageAccessToken.class);
in.close();
return token;
} catch (IOException e) {
throw new GalaxyFDSClientException("Failed to get the storage access "
+ "token", e);
}
}
@Override
public void addHeader(HttpRequestBase request) {
request.setHeader(HttpHeaders.AUTHORIZATION, HEADER_VALUE);
}
@Override
public String addParam(String uri) {
StringBuilder builder = new StringBuilder(uri);
if (uri.indexOf('?') == -1) {
builder.append('?');
} else {
builder.append('&');
}
builder.append(APP_ID);
builder.append('=');
builder.append(this.appId);
builder.append('&');
builder.append(STORAGE_ACCESS_TOKEN);
builder.append('=');
builder.append(this.storageAccessToken.getToken());
return builder.toString();
}
}