/*
Authorization.java
Copyright (c) 2017 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.manager.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import org.deviceconnect.android.manager.DConnectSettings;
import org.deviceconnect.android.manager.profile.AuthorizationProfile;
import org.deviceconnect.message.DConnectMessage;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Authorizationプロファイルの処理を行うタスク.
*
* @author NTT DOCOMO, INC.
*/
public abstract class Authorization extends AsyncTask<Void, Void, List<ServiceContainer>> {
/**
* Authorizationプロファイルのレスポンスを保存するファイルの名前.
*/
private static final String FILE_NAME = "__authorization__.dat";
/**
* clientIdのキー名.
*/
private static final String KEY_CLIENT_ID = "clientId";
/**
* accessTokenのキー名.
*/
private static final String KEY_ACCESS_TOKEN = "accessToken";
private DConnectSettings mSettings;
private SharedPreferences mSharedPreferences;
private String mClientId;
private String mAccessToken;
public Authorization(final Context context) {
mSettings = DConnectSettings.getInstance();
mSettings.load(context);
load(context);
}
protected String getUri(final String path) {
return getUri(path, null);
}
protected String getUri(final String path, final Map<String, String> params) {
StringBuilder builder = new StringBuilder();
builder.append(mSettings.isSSL() ? "https://" : "http://");
builder.append("localhost:");
builder.append(mSettings.getPort());
builder.append(path);
if (params != null) {
boolean first = true;
for (String key : params.keySet()) {
builder.append(first ? "?" : "&");
builder.append(key);
builder.append("=");
builder.append(params.get(key));
first = false;
}
}
return builder.toString();
}
private String executeGrant() {
String uri = getUri(AuthorizationProfile.PATH_REQUEST_GRANT);
byte[] bytes = HttpUtil.get(uri);
if (bytes != null) {
return new String(bytes);
}
return null;
}
private String parseGrant(final String jsonString) {
if (jsonString == null) {
return null;
}
try {
JSONObject obj = new JSONObject(jsonString);
int result = obj.getInt("result");
if (result == DConnectMessage.RESULT_OK) {
return obj.getString(AuthorizationProfile.PARAM_CLIENT_ID);
} else {
return null;
}
} catch (JSONException e) {
return null;
}
}
private String executeAccessToken(final String clientId) {
if (clientId == null) {
return null;
}
Map<String, String> params = new HashMap<String, String>() {
{put(AuthorizationProfile.PARAM_CLIENT_ID, clientId);}
{put(AuthorizationProfile.PARAM_APPLICATION_NAME, "Manager");}
{put(AuthorizationProfile.PARAM_SCOPE, "serviceDiscovery");}
};
String uri = getUri(AuthorizationProfile.PATH_ACCESS_TOKEN, params);
byte[] bytes = HttpUtil.get(uri);
if (bytes != null) {
return new String(bytes);
}
return null;
}
private String parseAccessToken(final String jsonString) {
if (jsonString == null) {
return null;
}
try {
JSONObject obj = new JSONObject(jsonString);
int result = obj.getInt("result");
if (result == DConnectMessage.RESULT_OK) {
return obj.getString(AuthorizationProfile.PARAM_ACCESS_TOKEN);
} else {
return null;
}
} catch (JSONException e) {
return null;
}
}
protected String getAccessToken() {
if (mAccessToken == null) {
mClientId = parseGrant(executeGrant());
mAccessToken = parseAccessToken(executeAccessToken(mClientId));
save();
}
return mAccessToken;
}
protected void clearAccessToken() {
mAccessToken = null;
mClientId = null;
save();
}
private void load(Context context) {
mSharedPreferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
mClientId = mSharedPreferences.getString(KEY_CLIENT_ID, null);
mAccessToken = mSharedPreferences.getString(KEY_ACCESS_TOKEN, null);
}
private void save() {
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString(KEY_CLIENT_ID, mClientId);
editor.putString(KEY_ACCESS_TOKEN, mAccessToken);
editor.commit();
}
}