package kc.spark.pixels.android.cloud.login; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import kc.spark.pixels.android.app.AppConfig; import kc.spark.pixels.android.cloud.ApiUrlHelper; import org.apache.http.protocol.HTTP; import org.solemnsilence.util.TLog; import android.net.Uri; import android.util.Base64; import com.google.gson.Gson; import com.squareup.okhttp.OkHttpClient; public class TokenTool { private static final TLog log = new TLog(TokenTool.class); private static final String[] PATH_SEGMENTS = new String[] { "oauth", "token" }; private final Gson gson; private final OkHttpClient okHttpclient; public TokenTool(Gson gson, OkHttpClient okHttpclient) { this.gson = gson; this.okHttpclient = okHttpclient; } public TokenResponse requestToken(TokenRequest tokenRequest) { // URL url = ApiUrlHelper.buildUrlNoVersion(PATH); Uri.Builder uriBuilder = ApiUrlHelper.getBaseUriBuilder(); for (String pathSegment : PATH_SEGMENTS) { uriBuilder.appendPath(pathSegment); } URL url = ApiUrlHelper.convertToURL(uriBuilder); HttpURLConnection urlConnection = null; try { urlConnection = okHttpclient.open(url); return requestTokenPrivate(urlConnection, tokenRequest); } catch (Exception e) { log.e("Error when logging in"); return null; } finally { if (urlConnection != null) { urlConnection.disconnect(); } } } private TokenResponse requestTokenPrivate(HttpURLConnection urlConnection, TokenRequest tokenRequest) { TokenResponse response = new TokenResponse(); int responseCode = -1; urlConnection.setDoOutput(true); urlConnection.setConnectTimeout(5000); urlConnection.setReadTimeout(15000); urlConnection.setRequestProperty("Authorization", getBasicAuthString()); try { OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); out.write(tokenRequest.asFormEncodedData().getBytes(HTTP.UTF_8)); out.close(); responseCode = urlConnection.getResponseCode(); InputStream in = new BufferedInputStream(urlConnection.getInputStream()); String responseStr = readStream(in); in.close(); if (responseStr == null) { log.e("Error logging in, response was null. HTTP response: " + responseCode); return null; } else { response = gson.fromJson(responseStr, TokenResponse.class); } } catch (IOException e) { log.e("Error requesting token"); } response.setStatusCode(responseCode); return response; } private String getBasicAuthString() { try { byte[] asBytes = AppConfig.getSparkTokenCreationCredentials().getBytes(HTTP.UTF_8); return "Basic " + Base64.encodeToString(asBytes, Base64.NO_WRAP); } catch (UnsupportedEncodingException e) { log.e("Error encoding String as UTF-8 bytes: ", e); return ""; } } static String readStream(InputStream in) throws IOException { StringBuilder strBuilder = new StringBuilder(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); for (String line = reader.readLine(); line != null; line = reader.readLine()) { strBuilder.append(line).append("\n"); } return strBuilder.toString(); } finally { in.close(); } } }