Primer paso de la investigacion. Se aportan el .apk, las carpetas con el apk extraido y el apk descompilado. El archivo API_DOCUMENTATION.md es un archivo donde se anotaran los descubrimientos del funcionamiento de la API, y los .py son scripts para probar la funcionalidad de la API con los métodos que vayamos encontrando. Finalmente, los archivos .js son scripts de Frida para extraer informacion de la APP durante la ejecucion.
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
package com.google.firebase.abt;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import com.google.firebase.analytics.connector.AnalyticsConnector;
|
||||
import java.text.DateFormat;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public class AbtExperimentInfo {
|
||||
static final String EXPERIMENT_ID_KEY = "experimentId";
|
||||
static final String TRIGGER_EVENT_KEY = "triggerEvent";
|
||||
static final String VARIANT_ID_KEY = "variantId";
|
||||
private final String experimentId;
|
||||
private final Date experimentStartTime;
|
||||
private final long timeToLiveInMillis;
|
||||
private final String triggerEventName;
|
||||
private final long triggerTimeoutInMillis;
|
||||
private final String variantId;
|
||||
static final String EXPERIMENT_START_TIME_KEY = "experimentStartTime";
|
||||
static final String TIME_TO_LIVE_KEY = "timeToLiveMillis";
|
||||
static final String TRIGGER_TIMEOUT_KEY = "triggerTimeoutMillis";
|
||||
private static final String[] ALL_REQUIRED_KEYS = {"experimentId", EXPERIMENT_START_TIME_KEY, TIME_TO_LIVE_KEY, TRIGGER_TIMEOUT_KEY, "variantId"};
|
||||
static final DateFormat protoTimestampStringParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
|
||||
|
||||
public AbtExperimentInfo(String str, String str2, String str3, Date date, long j4, long j5) {
|
||||
this.experimentId = str;
|
||||
this.variantId = str2;
|
||||
this.triggerEventName = str3;
|
||||
this.experimentStartTime = date;
|
||||
this.triggerTimeoutInMillis = j4;
|
||||
this.timeToLiveInMillis = j5;
|
||||
}
|
||||
|
||||
public static AbtExperimentInfo fromConditionalUserProperty(AnalyticsConnector.ConditionalUserProperty conditionalUserProperty) {
|
||||
String str = conditionalUserProperty.triggerEventName;
|
||||
if (str == null) {
|
||||
str = "";
|
||||
}
|
||||
return new AbtExperimentInfo(conditionalUserProperty.name, String.valueOf(conditionalUserProperty.value), str, new Date(conditionalUserProperty.creationTimestamp), conditionalUserProperty.triggerTimeout, conditionalUserProperty.timeToLive);
|
||||
}
|
||||
|
||||
public static AbtExperimentInfo fromMap(Map<String, String> map) throws AbtException {
|
||||
validateExperimentInfoMap(map);
|
||||
try {
|
||||
return new AbtExperimentInfo(map.get("experimentId"), map.get("variantId"), map.containsKey(TRIGGER_EVENT_KEY) ? map.get(TRIGGER_EVENT_KEY) : "", protoTimestampStringParser.parse(map.get(EXPERIMENT_START_TIME_KEY)), Long.parseLong(map.get(TRIGGER_TIMEOUT_KEY)), Long.parseLong(map.get(TIME_TO_LIVE_KEY)));
|
||||
} catch (NumberFormatException e4) {
|
||||
throw new AbtException("Could not process experiment: one of the durations could not be converted into a long.", e4);
|
||||
} catch (ParseException e5) {
|
||||
throw new AbtException("Could not process experiment: parsing experiment start time failed.", e5);
|
||||
}
|
||||
}
|
||||
|
||||
public static void validateAbtExperimentInfo(AbtExperimentInfo abtExperimentInfo) throws AbtException {
|
||||
validateExperimentInfoMap(abtExperimentInfo.toStringMap());
|
||||
}
|
||||
|
||||
private static void validateExperimentInfoMap(Map<String, String> map) throws AbtException {
|
||||
ArrayList arrayList = new ArrayList();
|
||||
for (String str : ALL_REQUIRED_KEYS) {
|
||||
if (!map.containsKey(str)) {
|
||||
arrayList.add(str);
|
||||
}
|
||||
}
|
||||
if (!arrayList.isEmpty()) {
|
||||
throw new AbtException(String.format("The following keys are missing from the experiment info map: %s", arrayList));
|
||||
}
|
||||
}
|
||||
|
||||
public String getExperimentId() {
|
||||
return this.experimentId;
|
||||
}
|
||||
|
||||
public long getStartTimeInMillisSinceEpoch() {
|
||||
return this.experimentStartTime.getTime();
|
||||
}
|
||||
|
||||
public long getTimeToLiveInMillis() {
|
||||
return this.timeToLiveInMillis;
|
||||
}
|
||||
|
||||
public String getTriggerEventName() {
|
||||
return this.triggerEventName;
|
||||
}
|
||||
|
||||
public long getTriggerTimeoutInMillis() {
|
||||
return this.triggerTimeoutInMillis;
|
||||
}
|
||||
|
||||
public String getVariantId() {
|
||||
return this.variantId;
|
||||
}
|
||||
|
||||
public AnalyticsConnector.ConditionalUserProperty toConditionalUserProperty(String str) {
|
||||
AnalyticsConnector.ConditionalUserProperty conditionalUserProperty = new AnalyticsConnector.ConditionalUserProperty();
|
||||
conditionalUserProperty.origin = str;
|
||||
conditionalUserProperty.creationTimestamp = getStartTimeInMillisSinceEpoch();
|
||||
conditionalUserProperty.name = this.experimentId;
|
||||
conditionalUserProperty.value = this.variantId;
|
||||
conditionalUserProperty.triggerEventName = TextUtils.isEmpty(this.triggerEventName) ? null : this.triggerEventName;
|
||||
conditionalUserProperty.triggerTimeout = this.triggerTimeoutInMillis;
|
||||
conditionalUserProperty.timeToLive = this.timeToLiveInMillis;
|
||||
return conditionalUserProperty;
|
||||
}
|
||||
|
||||
public Map<String, String> toStringMap() {
|
||||
HashMap hashMap = new HashMap();
|
||||
hashMap.put("experimentId", this.experimentId);
|
||||
hashMap.put("variantId", this.variantId);
|
||||
hashMap.put(TRIGGER_EVENT_KEY, this.triggerEventName);
|
||||
hashMap.put(EXPERIMENT_START_TIME_KEY, protoTimestampStringParser.format(this.experimentStartTime));
|
||||
hashMap.put(TRIGGER_TIMEOUT_KEY, Long.toString(this.triggerTimeoutInMillis));
|
||||
hashMap.put(TIME_TO_LIVE_KEY, Long.toString(this.timeToLiveInMillis));
|
||||
return hashMap;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user