This commit is contained in:
Michal Kepkowski 2016-03-04 11:22:14 +01:00
parent 4b3d584d1e
commit 78a30ed207
4 changed files with 82 additions and 83 deletions

View file

@ -2,12 +2,10 @@ package org.sufficientlysecure.keychain.linked;
import android.content.Context; import android.content.Context;
import org.apache.http.HttpEntity; import com.squareup.okhttp.CertificatePinner;
import org.apache.http.HttpResponse; import com.squareup.okhttp.OkHttpClient;
import org.apache.http.client.HttpClient; import com.squareup.okhttp.Request;
import org.apache.http.client.methods.HttpRequestBase; import com.squareup.okhttp.Response;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.json.JSONException; import org.json.JSONException;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.linked.resources.GenericHttpsResource; import org.sufficientlysecure.keychain.linked.resources.GenericHttpsResource;
@ -18,12 +16,8 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult.LogTyp
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
import org.thoughtcrime.ssl.pinning.util.PinningHelper;
import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URI; import java.net.URI;
import java.util.HashMap; import java.util.HashMap;
@ -233,46 +227,35 @@ public abstract class LinkedTokenResource extends LinkedResource {
} }
@SuppressWarnings("deprecation") // HttpRequestBase is deprecated
public static String getResponseBody(Context context, HttpRequestBase request) private static CertificatePinner getCertificatePinner(String hostname, String[] pins){
throws IOException, HttpStatusException { CertificatePinner.Builder builder = new CertificatePinner.Builder();
return getResponseBody(context, request, null); for(String pin : pins){
builder.add(hostname,pin);
}
return builder.build();
} }
@SuppressWarnings("deprecation") // HttpRequestBase is deprecated public static String getResponseBody(Request request, String... pins)
public static String getResponseBody(Context context, HttpRequestBase request, String[] pins) throws IOException, HttpStatusException {
throws IOException, HttpStatusException {
StringBuilder sb = new StringBuilder();
request.setHeader("User-Agent", "Open Keychain"); Log.d("Connection to: "+request.url().getHost(),"");
OkHttpClient client = new OkHttpClient();
if(pins !=null){
HttpClient httpClient; client.setCertificatePinner(getCertificatePinner(request.url().getHost(),pins));
if (pins == null) {
httpClient = new DefaultHttpClient(new BasicHttpParams());
} else {
httpClient = PinningHelper.getPinnedHttpClient(context, pins);
} }
HttpResponse response = httpClient.execute(request); Response response = client.newCall(request).execute();
int statusCode = response.getStatusLine().getStatusCode();
String reason = response.getStatusLine().getReasonPhrase();
int statusCode = response.code();
String reason = response.message();
if (statusCode != 200) { if (statusCode != 200) {
throw new HttpStatusException(statusCode, reason); throw new HttpStatusException(statusCode, reason);
} }
HttpEntity entity = response.getEntity(); return response.body().string();
InputStream inputStream = entity.getContent();
BufferedReader bReader = new BufferedReader(
new InputStreamReader(inputStream, "UTF-8"), 8);
String line;
while ((line = bReader.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} }
public static class HttpStatusException extends Throwable { public static class HttpStatusException extends Throwable {

View file

@ -6,7 +6,7 @@ import android.net.Uri;
import android.support.annotation.DrawableRes; import android.support.annotation.DrawableRes;
import android.support.annotation.StringRes; import android.support.annotation.StringRes;
import org.apache.http.client.methods.HttpGet; import com.squareup.okhttp.Request;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
@ -32,14 +32,16 @@ public class GenericHttpsResource extends LinkedTokenResource {
token, "0x" + KeyFormattingUtils.convertFingerprintToHex(fingerprint).substring(24)); token, "0x" + KeyFormattingUtils.convertFingerprintToHex(fingerprint).substring(24));
} }
@SuppressWarnings("deprecation") // HttpGet is deprecated
@Override @Override
protected String fetchResource (Context context, OperationLog log, int indent) protected String fetchResource (Context context, OperationLog log, int indent)
throws HttpStatusException, IOException { throws HttpStatusException, IOException {
log.add(LogType.MSG_LV_FETCH, indent, mSubUri.toString()); log.add(LogType.MSG_LV_FETCH, indent, mSubUri.toString());
HttpGet httpGet = new HttpGet(mSubUri); Request request = new Request.Builder()
return getResponseBody(context, httpGet); .url(mSubUri.toURL())
.addHeader("User-Agent", "OpenKeychain")
.build();
return getResponseBody(request);
} }

View file

@ -6,7 +6,7 @@ import android.net.Uri;
import android.support.annotation.DrawableRes; import android.support.annotation.DrawableRes;
import android.support.annotation.StringRes; import android.support.annotation.StringRes;
import org.apache.http.client.methods.HttpGet; import com.squareup.okhttp.Request;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -47,7 +47,7 @@ public class GithubResource extends LinkedTokenResource {
return String.format(context.getResources().getString(R.string.linked_id_github_text), token); return String.format(context.getResources().getString(R.string.linked_id_github_text), token);
} }
@SuppressWarnings("deprecation") // HttpGet is deprecated
@Override @Override
protected String fetchResource (Context context, OperationLog log, int indent) protected String fetchResource (Context context, OperationLog log, int indent)
throws HttpStatusException, IOException, JSONException { throws HttpStatusException, IOException, JSONException {
@ -55,8 +55,11 @@ public class GithubResource extends LinkedTokenResource {
log.add(LogType.MSG_LV_FETCH, indent, mSubUri.toString()); log.add(LogType.MSG_LV_FETCH, indent, mSubUri.toString());
indent += 1; indent += 1;
HttpGet httpGet = new HttpGet("https://api.github.com/gists/" + mGistId); Request request = new Request.Builder()
String response = getResponseBody(context, httpGet); .url("https://api.github.com/gists/" + mGistId)
.addHeader("User-Agent", "OpenKeychain")
.build();
String response = getResponseBody(request);
JSONObject obj = new JSONObject(response); JSONObject obj = new JSONObject(response);
@ -79,7 +82,7 @@ public class GithubResource extends LinkedTokenResource {
} }
@Deprecated // not used for now, but could be used to pick up earlier posted gist if already present?
@SuppressWarnings({ "deprecation", "unused" }) @SuppressWarnings({ "deprecation", "unused" })
public static GithubResource searchInGithubStream( public static GithubResource searchInGithubStream(
Context context, String screenName, String needle, OperationLog log) { Context context, String screenName, String needle, OperationLog log) {
@ -94,12 +97,12 @@ public class GithubResource extends LinkedTokenResource {
try { try {
JSONArray array; { JSONArray array; {
HttpGet httpGet = Request request = new Request.Builder()
new HttpGet("https://api.github.com/users/" + screenName + "/gists"); .url("https://api.github.com/users/" + screenName + "/gists")
httpGet.setHeader("Content-Type", "application/json"); .addHeader("Content-Type", "application/json")
httpGet.setHeader("User-Agent", "OpenKeychain"); .addHeader("User-Agent", "OpenKeychain")
.build();
String response = getResponseBody(context, httpGet); String response = getResponseBody(request);
array = new JSONArray(response); array = new JSONArray(response);
} }
@ -116,10 +119,13 @@ public class GithubResource extends LinkedTokenResource {
continue; continue;
} }
String id = obj.getString("id"); String id = obj.getString("id");
HttpGet httpGet = new HttpGet("https://api.github.com/gists/" + id);
httpGet.setHeader("User-Agent", "OpenKeychain");
JSONObject gistObj = new JSONObject(getResponseBody(context, httpGet)); Request request = new Request.Builder()
.url("https://api.github.com/gists/" + id)
.addHeader("User-Agent", "OpenKeychain")
.build();
JSONObject gistObj = new JSONObject(getResponseBody(request));
JSONObject gistFiles = gistObj.getJSONObject("files"); JSONObject gistFiles = gistObj.getJSONObject("files");
Iterator<String> gistIt = gistFiles.keys(); Iterator<String> gistIt = gistFiles.keys();
if (!gistIt.hasNext()) { if (!gistIt.hasNext()) {

View file

@ -7,11 +7,11 @@ import android.support.annotation.DrawableRes;
import android.support.annotation.StringRes; import android.support.annotation.StringRes;
import android.util.Log; import android.util.Log;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.textuality.keybase.lib.JWalk; import com.textuality.keybase.lib.JWalk;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -84,18 +84,19 @@ public class TwitterResource extends LinkedTokenResource {
return null; return null;
} }
HttpGet httpGet =
new HttpGet("https://api.twitter.com/1.1/statuses/show.json"
+ "?id=" + mTweetId
+ "&include_entities=false");
// construct a normal HTTPS request and include an Authorization // construct a normal HTTPS request and include an Authorization
// header with the value of Bearer <> // header with the value of Bearer <>
httpGet.setHeader("Authorization", "Bearer " + authToken); Request request = new Request.Builder()
httpGet.setHeader("Content-Type", "application/json"); .url("https://api.twitter.com/1.1/statuses/show.json"
+ "?id=" + mTweetId
+ "&include_entities=false")
.addHeader("Authorization", "Bearer " + authToken)
.addHeader("Content-Type", "application/json")
.addHeader("User-Agent", "OpenKeychain")
.build();
try { try {
String response = getResponseBody(context, httpGet, CERT_PINS); String response = getResponseBody(request, CERT_PINS);
JSONObject obj = new JSONObject(response); JSONObject obj = new JSONObject(response);
JSONObject user = obj.getJSONObject("user"); JSONObject user = obj.getJSONObject("user");
if (!mHandle.equalsIgnoreCase(user.getString("screen_name"))) { if (!mHandle.equalsIgnoreCase(user.getString("screen_name"))) {
@ -157,21 +158,20 @@ public class TwitterResource extends LinkedTokenResource {
return null; return null;
} }
HttpGet httpGet = Request request = new Request.Builder()
new HttpGet("https://api.twitter.com/1.1/statuses/user_timeline.json" .url("https://api.twitter.com/1.1/statuses/user_timeline.json"
+ "?screen_name=" + screenName + "?screen_name=" + screenName
+ "&count=15" + "&count=15"
+ "&include_rts=false" + "&include_rts=false"
+ "&trim_user=true" + "&trim_user=true"
+ "&exclude_replies=true"); + "&exclude_replies=true")
.addHeader("Authorization", "Bearer " + authToken)
// construct a normal HTTPS request and include an Authorization .addHeader("Content-Type", "application/json")
// header with the value of Bearer <> .addHeader("User-Agent", "OpenKeychain")
httpGet.setHeader("Authorization", "Bearer " + authToken); .build();
httpGet.setHeader("Content-Type", "application/json");
try { try {
String response = getResponseBody(context, httpGet, CERT_PINS); String response = getResponseBody(request, CERT_PINS);
JSONArray array = new JSONArray(response); JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++) { for (int i = 0; i < array.length(); i++) {
@ -216,12 +216,20 @@ public class TwitterResource extends LinkedTokenResource {
String base64Encoded = rot13("D293FQqanH0jH29KIaWJER5DomqSGRE2Ewc1LJACn3cbD1c" String base64Encoded = rot13("D293FQqanH0jH29KIaWJER5DomqSGRE2Ewc1LJACn3cbD1c"
+ "Fq1bmqSAQAz5MI2cIHKOuo3cPoRAQI1OyqmIVFJS6LHMXq2g6MRLkIj") + "=="; + "Fq1bmqSAQAz5MI2cIHKOuo3cPoRAQI1OyqmIVFJS6LHMXq2g6MRLkIj") + "==";
RequestBody requestBody = RequestBody.create(
MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"),
"grant_type=client_credentials");
// Step 2: Obtain a bearer token // Step 2: Obtain a bearer token
HttpPost httpPost = new HttpPost("https://api.twitter.com/oauth2/token"); Request request = new Request.Builder()
httpPost.setHeader("Authorization", "Basic " + base64Encoded); .url("https://api.twitter.com/oauth2/token")
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); .addHeader("Authorization", "Basic " + base64Encoded)
httpPost.setEntity(new StringEntity("grant_type=client_credentials")); .addHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
JSONObject rawAuthorization = new JSONObject(getResponseBody(context, httpPost, CERT_PINS)); .addHeader("User-Agent", "OpenKeychain")
.post(requestBody)
.build();
JSONObject rawAuthorization = new JSONObject(getResponseBody(request, CERT_PINS));
// Applications should verify that the value associated with the // Applications should verify that the value associated with the
// token_type key of the returned object is bearer // token_type key of the returned object is bearer