372 lines
16 KiB
Java
372 lines
16 KiB
Java
package com.adjust.sdk;
|
|
|
|
import android.net.Uri;
|
|
import c.d.b.a.a;
|
|
import java.io.BufferedReader;
|
|
import java.io.DataOutputStream;
|
|
import java.io.InputStreamReader;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.net.MalformedURLException;
|
|
import java.net.URL;
|
|
import java.net.URLEncoder;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
import javax.net.ssl.HttpsURLConnection;
|
|
import org.json.JSONException;
|
|
import org.json.JSONObject;
|
|
public class UtilNetworking {
|
|
private static String userAgent;
|
|
|
|
public static class ConnectionOptions implements IConnectionOptions {
|
|
@Override // com.adjust.sdk.UtilNetworking.IConnectionOptions
|
|
public void applyConnectionOptions(HttpsURLConnection httpsURLConnection, String str) {
|
|
httpsURLConnection.setRequestProperty("Client-SDK", str);
|
|
httpsURLConnection.setConnectTimeout(60000);
|
|
httpsURLConnection.setReadTimeout(60000);
|
|
if (UtilNetworking.access$000() != null) {
|
|
httpsURLConnection.setRequestProperty("User-Agent", UtilNetworking.access$000());
|
|
}
|
|
}
|
|
}
|
|
|
|
public interface IConnectionOptions {
|
|
void applyConnectionOptions(HttpsURLConnection httpsURLConnection, String str);
|
|
}
|
|
|
|
public static /* synthetic */ String access$000() {
|
|
return userAgent;
|
|
}
|
|
|
|
private static String buildAuthorizationHeader(Map<String, String> map, String str) {
|
|
String extractSecretId = extractSecretId(map);
|
|
String buildAuthorizationHeaderV2 = buildAuthorizationHeaderV2(extractSignature(map), extractSecretId, extractHeadersId(map), extractAlgorithm(map), extractNativeVersion(map));
|
|
return buildAuthorizationHeaderV2 != null ? buildAuthorizationHeaderV2 : buildAuthorizationHeaderV1(map, extractAppSecret(map), extractSecretId, str);
|
|
}
|
|
|
|
private static String buildAuthorizationHeaderV1(Map<String, String> map, String str, String str2, String str3) {
|
|
if (str == null || str.length() == 0) {
|
|
return null;
|
|
}
|
|
Map<String, String> signature = getSignature(map, str3, str);
|
|
String formatString = Util.formatString("Signature %s,%s,%s,%s", Util.formatString("secret_id=\"%s\"", str2), Util.formatString("signature=\"%s\"", Util.sha256(signature.get("clear_signature"))), Util.formatString("algorithm=\"%s\"", "sha256"), Util.formatString("headers=\"%s\"", signature.get("fields")));
|
|
getLogger().verbose("authorizationHeader: %s", formatString);
|
|
return formatString;
|
|
}
|
|
|
|
/* JADX DEBUG: Can't convert new array creation: APUT found in different block: 0x0030: APUT (r1v3 java.lang.Object[]), (0 ??[int, short, byte, char]), (r6v1 java.lang.String) */
|
|
/* JADX DEBUG: Can't convert new array creation: APUT found in different block: 0x003f: APUT (r1v4 java.lang.Object[]), (0 ??[int, short, byte, char]), (r7v1 java.lang.String) */
|
|
private static String buildAuthorizationHeaderV2(String str, String str2, String str3, String str4, String str5) {
|
|
if (str2 == null || str == null || str3 == null) {
|
|
return null;
|
|
}
|
|
String formatString = Util.formatString("signature=\"%s\"", str);
|
|
String formatString2 = Util.formatString("secret_id=\"%s\"", str2);
|
|
String formatString3 = Util.formatString("headers_id=\"%s\"", str3);
|
|
Object[] objArr = new Object[1];
|
|
if (str4 == null) {
|
|
str4 = "adj1";
|
|
}
|
|
objArr[0] = str4;
|
|
String formatString4 = Util.formatString("algorithm=\"%s\"", objArr);
|
|
Object[] objArr2 = new Object[1];
|
|
if (str5 == null) {
|
|
str5 = "";
|
|
}
|
|
objArr2[0] = str5;
|
|
String formatString5 = Util.formatString("Signature %s,%s,%s,%s,%s", formatString, formatString2, formatString4, formatString3, Util.formatString("native_version=\"%s\"", objArr2));
|
|
getLogger().verbose("authorizationHeader: %s", formatString5);
|
|
return formatString5;
|
|
}
|
|
|
|
private static Uri buildUri(String str, Map<String, String> map, String str2) {
|
|
String str3;
|
|
Uri.Builder builder = new Uri.Builder();
|
|
String str4 = "https";
|
|
String str5 = "app.adjust.com";
|
|
try {
|
|
String baseUrl = AdjustFactory.getBaseUrl();
|
|
if (str2 != null) {
|
|
baseUrl = baseUrl + str2;
|
|
}
|
|
URL url = new URL(baseUrl);
|
|
str4 = url.getProtocol();
|
|
str5 = url.getAuthority();
|
|
str3 = url.getPath();
|
|
} catch (MalformedURLException e) {
|
|
getLogger().error("Unable to parse endpoint (%s)", e.getMessage());
|
|
str3 = "";
|
|
}
|
|
builder.scheme(str4);
|
|
builder.encodedAuthority(str5);
|
|
builder.path(str3);
|
|
builder.appendPath(str);
|
|
for (Map.Entry<String, String> entry : map.entrySet()) {
|
|
builder.appendQueryParameter(entry.getKey(), entry.getValue());
|
|
}
|
|
builder.appendQueryParameter("sent_at", Util.dateFormatter.format(Long.valueOf(System.currentTimeMillis())));
|
|
return builder.build();
|
|
}
|
|
|
|
public static ResponseData createGETHttpsURLConnection(ActivityPackage activityPackage, String str) throws Exception {
|
|
try {
|
|
HashMap hashMap = new HashMap(activityPackage.getParameters());
|
|
extractEventCallbackId(hashMap);
|
|
HttpsURLConnection httpsURLConnection = AdjustFactory.getHttpsURLConnection(new URL(buildUri(activityPackage.getPath(), hashMap, str).toString()));
|
|
AdjustFactory.getConnectionOptions().applyConnectionOptions(httpsURLConnection, activityPackage.getClientSdk());
|
|
String buildAuthorizationHeader = buildAuthorizationHeader(hashMap, activityPackage.getActivityKind().toString());
|
|
if (buildAuthorizationHeader != null) {
|
|
httpsURLConnection.setRequestProperty("Authorization", buildAuthorizationHeader);
|
|
}
|
|
httpsURLConnection.setRequestMethod("GET");
|
|
return readHttpResponse(httpsURLConnection, activityPackage);
|
|
} catch (Exception e) {
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
public static ResponseData createPOSTHttpsURLConnection(String str, ActivityPackage activityPackage, int i) throws Exception {
|
|
Throwable th;
|
|
Exception e;
|
|
DataOutputStream dataOutputStream = null;
|
|
try {
|
|
HttpsURLConnection httpsURLConnection = AdjustFactory.getHttpsURLConnection(new URL(str));
|
|
HashMap hashMap = new HashMap(activityPackage.getParameters());
|
|
AdjustFactory.getConnectionOptions().applyConnectionOptions(httpsURLConnection, activityPackage.getClientSdk());
|
|
extractEventCallbackId(hashMap);
|
|
String buildAuthorizationHeader = buildAuthorizationHeader(hashMap, activityPackage.getActivityKind().toString());
|
|
if (buildAuthorizationHeader != null) {
|
|
httpsURLConnection.setRequestProperty("Authorization", buildAuthorizationHeader);
|
|
}
|
|
httpsURLConnection.setRequestMethod("POST");
|
|
httpsURLConnection.setUseCaches(false);
|
|
httpsURLConnection.setDoInput(true);
|
|
httpsURLConnection.setDoOutput(true);
|
|
DataOutputStream dataOutputStream2 = new DataOutputStream(httpsURLConnection.getOutputStream());
|
|
try {
|
|
dataOutputStream2.writeBytes(getPostDataString(hashMap, i));
|
|
ResponseData readHttpResponse = readHttpResponse(httpsURLConnection, activityPackage);
|
|
try {
|
|
dataOutputStream2.flush();
|
|
dataOutputStream2.close();
|
|
} catch (Exception unused) {
|
|
}
|
|
return readHttpResponse;
|
|
} catch (Exception e2) {
|
|
e = e2;
|
|
dataOutputStream = dataOutputStream2;
|
|
try {
|
|
throw e;
|
|
} catch (Throwable th2) {
|
|
th = th2;
|
|
}
|
|
} catch (Throwable th3) {
|
|
th = th3;
|
|
dataOutputStream = dataOutputStream2;
|
|
if (dataOutputStream != null) {
|
|
try {
|
|
dataOutputStream.flush();
|
|
dataOutputStream.close();
|
|
} catch (Exception unused2) {
|
|
}
|
|
}
|
|
throw th;
|
|
}
|
|
} catch (Exception e3) {
|
|
e = e3;
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
private static String extractAlgorithm(Map<String, String> map) {
|
|
return map.remove("algorithm");
|
|
}
|
|
|
|
private static String extractAppSecret(Map<String, String> map) {
|
|
return map.remove("app_secret");
|
|
}
|
|
|
|
private static void extractEventCallbackId(Map<String, String> map) {
|
|
map.remove("event_callback_id");
|
|
}
|
|
|
|
private static String extractHeadersId(Map<String, String> map) {
|
|
return map.remove("headers_id");
|
|
}
|
|
|
|
private static String extractNativeVersion(Map<String, String> map) {
|
|
return map.remove("native_version");
|
|
}
|
|
|
|
private static String extractSecretId(Map<String, String> map) {
|
|
return map.remove("secret_id");
|
|
}
|
|
|
|
private static String extractSignature(Map<String, String> map) {
|
|
return map.remove("signature");
|
|
}
|
|
|
|
private static ILogger getLogger() {
|
|
return AdjustFactory.getLogger();
|
|
}
|
|
|
|
private static String getPostDataString(Map<String, String> map, int i) throws UnsupportedEncodingException {
|
|
String str;
|
|
StringBuilder sb = new StringBuilder();
|
|
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
|
|
while (true) {
|
|
str = "";
|
|
if (!it.hasNext()) {
|
|
break;
|
|
}
|
|
Map.Entry<String, String> next = it.next();
|
|
String encode = URLEncoder.encode(next.getKey(), "UTF-8");
|
|
String value = next.getValue();
|
|
if (value != null) {
|
|
str = URLEncoder.encode(value, "UTF-8");
|
|
}
|
|
if (sb.length() > 0) {
|
|
sb.append("&");
|
|
}
|
|
sb.append(encode);
|
|
sb.append("=");
|
|
sb.append(str);
|
|
}
|
|
String format = Util.dateFormatter.format(Long.valueOf(System.currentTimeMillis()));
|
|
sb.append("&");
|
|
sb.append(URLEncoder.encode("sent_at", "UTF-8"));
|
|
sb.append("=");
|
|
sb.append(URLEncoder.encode(format, "UTF-8"));
|
|
if (i > 0) {
|
|
sb.append("&");
|
|
sb.append(URLEncoder.encode("queue_size", "UTF-8"));
|
|
sb.append("=");
|
|
sb.append(URLEncoder.encode(str + i, "UTF-8"));
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
private static Map<String, String> getSignature(Map<String, String> map, String str, String str2) {
|
|
String validIdentifier = getValidIdentifier(map);
|
|
String str3 = map.get("source");
|
|
String str4 = map.get("payload");
|
|
HashMap hashMap = new HashMap();
|
|
hashMap.put("app_secret", str2);
|
|
hashMap.put("created_at", map.get("created_at"));
|
|
hashMap.put("activity_kind", str);
|
|
hashMap.put(validIdentifier, map.get(validIdentifier));
|
|
if (str3 != null) {
|
|
hashMap.put("source", str3);
|
|
}
|
|
if (str4 != null) {
|
|
hashMap.put("payload", str4);
|
|
}
|
|
String str5 = "";
|
|
String str6 = str5;
|
|
for (Map.Entry entry : hashMap.entrySet()) {
|
|
if (entry.getValue() != null) {
|
|
str5 = a.D(a.L(str5), (String) entry.getKey(), " ");
|
|
StringBuilder L = a.L(str6);
|
|
L.append((String) entry.getValue());
|
|
str6 = L.toString();
|
|
}
|
|
}
|
|
String substring = str5.substring(0, str5.length() - 1);
|
|
HashMap hashMap2 = new HashMap();
|
|
hashMap2.put("clear_signature", str6);
|
|
hashMap2.put("fields", substring);
|
|
return hashMap2;
|
|
}
|
|
|
|
private static String getValidIdentifier(Map<String, String> map) {
|
|
if (map.get("gps_adid") != null) {
|
|
return "gps_adid";
|
|
}
|
|
if (map.get("fire_adid") != null) {
|
|
return "fire_adid";
|
|
}
|
|
if (map.get("android_id") != null) {
|
|
return "android_id";
|
|
}
|
|
if (map.get("mac_sha1") != null) {
|
|
return "mac_sha1";
|
|
}
|
|
if (map.get("mac_md5") != null) {
|
|
return "mac_md5";
|
|
}
|
|
if (map.get("android_uuid") != null) {
|
|
return "android_uuid";
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static ResponseData readHttpResponse(HttpsURLConnection httpsURLConnection, ActivityPackage activityPackage) throws Exception {
|
|
JSONObject jSONObject;
|
|
StringBuffer stringBuffer = new StringBuffer();
|
|
ILogger logger = getLogger();
|
|
ResponseData buildResponseData = ResponseData.buildResponseData(activityPackage);
|
|
try {
|
|
httpsURLConnection.connect();
|
|
Integer valueOf = Integer.valueOf(httpsURLConnection.getResponseCode());
|
|
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(valueOf.intValue() >= 400 ? httpsURLConnection.getErrorStream() : httpsURLConnection.getInputStream()));
|
|
while (true) {
|
|
String readLine = bufferedReader.readLine();
|
|
if (readLine == null) {
|
|
break;
|
|
}
|
|
stringBuffer.append(readLine);
|
|
}
|
|
httpsURLConnection.disconnect();
|
|
String stringBuffer2 = stringBuffer.toString();
|
|
logger.verbose("Response: %s", stringBuffer2);
|
|
if (valueOf.intValue() == 429) {
|
|
logger.error("Too frequent requests to the endpoint (429)", new Object[0]);
|
|
return buildResponseData;
|
|
}
|
|
if (!(stringBuffer2 == null || stringBuffer2.length() == 0)) {
|
|
try {
|
|
jSONObject = new JSONObject(stringBuffer2);
|
|
} catch (JSONException e) {
|
|
String formatString = Util.formatString("Failed to parse json response. (%s)", e.getMessage());
|
|
logger.error(formatString, new Object[0]);
|
|
buildResponseData.message = formatString;
|
|
jSONObject = null;
|
|
}
|
|
if (jSONObject == null) {
|
|
return buildResponseData;
|
|
}
|
|
buildResponseData.jsonResponse = jSONObject;
|
|
String optString = jSONObject.optString("message", null);
|
|
buildResponseData.message = optString;
|
|
buildResponseData.timestamp = jSONObject.optString("timestamp", null);
|
|
buildResponseData.adid = jSONObject.optString("adid", null);
|
|
String optString2 = jSONObject.optString("tracking_state", null);
|
|
if (optString2 != null && optString2.equals("opted_out")) {
|
|
buildResponseData.trackingState = TrackingState.OPTED_OUT;
|
|
}
|
|
if (optString == null) {
|
|
optString = "No message found";
|
|
}
|
|
if (valueOf.intValue() == 200) {
|
|
logger.info("%s", optString);
|
|
buildResponseData.success = true;
|
|
} else {
|
|
logger.error("%s", optString);
|
|
}
|
|
}
|
|
return buildResponseData;
|
|
} catch (Exception e2) {
|
|
logger.error("Failed to read response. (%s)", e2.getMessage());
|
|
throw e2;
|
|
} catch (Throwable th) {
|
|
if (httpsURLConnection != null) {
|
|
httpsURLConnection.disconnect();
|
|
}
|
|
throw th;
|
|
}
|
|
}
|
|
|
|
public static void setUserAgent(String str) {
|
|
userAgent = str;
|
|
}
|
|
}
|