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,190 @@
|
||||
package com.google.firebase.remoteconfig.internal;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import com.google.firebase.remoteconfig.FirebaseRemoteConfigInfo;
|
||||
import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings;
|
||||
import java.util.Date;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public class ConfigMetadataClient {
|
||||
private static final String BACKOFF_END_TIME_IN_MILLIS_KEY = "backoff_end_time_in_millis";
|
||||
private static final String FETCH_TIMEOUT_IN_SECONDS_KEY = "fetch_timeout_in_seconds";
|
||||
private static final String LAST_FETCH_ETAG_KEY = "last_fetch_etag";
|
||||
private static final String LAST_FETCH_STATUS_KEY = "last_fetch_status";
|
||||
public static final long LAST_FETCH_TIME_IN_MILLIS_NO_FETCH_YET = -1;
|
||||
private static final String LAST_SUCCESSFUL_FETCH_TIME_IN_MILLIS_KEY = "last_fetch_time_in_millis";
|
||||
private static final String LAST_TEMPLATE_VERSION = "last_template_version";
|
||||
private static final String MINIMUM_FETCH_INTERVAL_IN_SECONDS_KEY = "minimum_fetch_interval_in_seconds";
|
||||
private static final long NO_BACKOFF_TIME_IN_MILLIS = -1;
|
||||
static final int NO_FAILED_FETCHES = 0;
|
||||
static final int NO_FAILED_REALTIME_STREAMS = 0;
|
||||
private static final String NUM_FAILED_FETCHES_KEY = "num_failed_fetches";
|
||||
private static final String NUM_FAILED_REALTIME_STREAMS_KEY = "num_failed_realtime_streams";
|
||||
private static final String REALTIME_BACKOFF_END_TIME_IN_MILLIS_KEY = "realtime_backoff_end_time_in_millis";
|
||||
private final SharedPreferences frcMetadata;
|
||||
static final Date LAST_FETCH_TIME_NO_FETCH_YET = new Date(-1);
|
||||
static final Date NO_BACKOFF_TIME = new Date(-1);
|
||||
private final Object frcInfoLock = new Object();
|
||||
private final Object backoffMetadataLock = new Object();
|
||||
private final Object realtimeBackoffMetadataLock = new Object();
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public static class BackoffMetadata {
|
||||
private Date backoffEndTime;
|
||||
private int numFailedFetches;
|
||||
|
||||
public BackoffMetadata(int i, Date date) {
|
||||
this.numFailedFetches = i;
|
||||
this.backoffEndTime = date;
|
||||
}
|
||||
|
||||
public Date getBackoffEndTime() {
|
||||
return this.backoffEndTime;
|
||||
}
|
||||
|
||||
public int getNumFailedFetches() {
|
||||
return this.numFailedFetches;
|
||||
}
|
||||
}
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public static class RealtimeBackoffMetadata {
|
||||
private Date backoffEndTime;
|
||||
private int numFailedStreams;
|
||||
|
||||
public RealtimeBackoffMetadata(int i, Date date) {
|
||||
this.numFailedStreams = i;
|
||||
this.backoffEndTime = date;
|
||||
}
|
||||
|
||||
public Date getBackoffEndTime() {
|
||||
return this.backoffEndTime;
|
||||
}
|
||||
|
||||
public int getNumFailedStreams() {
|
||||
return this.numFailedStreams;
|
||||
}
|
||||
}
|
||||
|
||||
public ConfigMetadataClient(SharedPreferences sharedPreferences) {
|
||||
this.frcMetadata = sharedPreferences;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
synchronized (this.frcInfoLock) {
|
||||
this.frcMetadata.edit().clear().commit();
|
||||
}
|
||||
}
|
||||
|
||||
public BackoffMetadata getBackoffMetadata() {
|
||||
BackoffMetadata backoffMetadata;
|
||||
synchronized (this.backoffMetadataLock) {
|
||||
backoffMetadata = new BackoffMetadata(this.frcMetadata.getInt(NUM_FAILED_FETCHES_KEY, 0), new Date(this.frcMetadata.getLong(BACKOFF_END_TIME_IN_MILLIS_KEY, -1L)));
|
||||
}
|
||||
return backoffMetadata;
|
||||
}
|
||||
|
||||
public long getFetchTimeoutInSeconds() {
|
||||
return this.frcMetadata.getLong(FETCH_TIMEOUT_IN_SECONDS_KEY, 60L);
|
||||
}
|
||||
|
||||
public FirebaseRemoteConfigInfo getInfo() {
|
||||
FirebaseRemoteConfigInfoImpl build;
|
||||
synchronized (this.frcInfoLock) {
|
||||
long j4 = this.frcMetadata.getLong(LAST_SUCCESSFUL_FETCH_TIME_IN_MILLIS_KEY, -1L);
|
||||
int i = this.frcMetadata.getInt(LAST_FETCH_STATUS_KEY, 0);
|
||||
build = FirebaseRemoteConfigInfoImpl.newBuilder().withLastFetchStatus(i).withLastSuccessfulFetchTimeInMillis(j4).withConfigSettings(new FirebaseRemoteConfigSettings.Builder().setFetchTimeoutInSeconds(this.frcMetadata.getLong(FETCH_TIMEOUT_IN_SECONDS_KEY, 60L)).setMinimumFetchIntervalInSeconds(this.frcMetadata.getLong(MINIMUM_FETCH_INTERVAL_IN_SECONDS_KEY, ConfigFetchHandler.DEFAULT_MINIMUM_FETCH_INTERVAL_IN_SECONDS)).build()).build();
|
||||
}
|
||||
return build;
|
||||
}
|
||||
|
||||
public String getLastFetchETag() {
|
||||
return this.frcMetadata.getString(LAST_FETCH_ETAG_KEY, null);
|
||||
}
|
||||
|
||||
public int getLastFetchStatus() {
|
||||
return this.frcMetadata.getInt(LAST_FETCH_STATUS_KEY, 0);
|
||||
}
|
||||
|
||||
public Date getLastSuccessfulFetchTime() {
|
||||
return new Date(this.frcMetadata.getLong(LAST_SUCCESSFUL_FETCH_TIME_IN_MILLIS_KEY, -1L));
|
||||
}
|
||||
|
||||
public long getLastTemplateVersion() {
|
||||
return this.frcMetadata.getLong(LAST_TEMPLATE_VERSION, 0L);
|
||||
}
|
||||
|
||||
public long getMinimumFetchIntervalInSeconds() {
|
||||
return this.frcMetadata.getLong(MINIMUM_FETCH_INTERVAL_IN_SECONDS_KEY, ConfigFetchHandler.DEFAULT_MINIMUM_FETCH_INTERVAL_IN_SECONDS);
|
||||
}
|
||||
|
||||
public RealtimeBackoffMetadata getRealtimeBackoffMetadata() {
|
||||
RealtimeBackoffMetadata realtimeBackoffMetadata;
|
||||
synchronized (this.realtimeBackoffMetadataLock) {
|
||||
realtimeBackoffMetadata = new RealtimeBackoffMetadata(this.frcMetadata.getInt(NUM_FAILED_REALTIME_STREAMS_KEY, 0), new Date(this.frcMetadata.getLong(REALTIME_BACKOFF_END_TIME_IN_MILLIS_KEY, -1L)));
|
||||
}
|
||||
return realtimeBackoffMetadata;
|
||||
}
|
||||
|
||||
public void resetBackoff() {
|
||||
setBackoffMetadata(0, NO_BACKOFF_TIME);
|
||||
}
|
||||
|
||||
public void resetRealtimeBackoff() {
|
||||
setRealtimeBackoffMetadata(0, NO_BACKOFF_TIME);
|
||||
}
|
||||
|
||||
public void setBackoffMetadata(int i, Date date) {
|
||||
synchronized (this.backoffMetadataLock) {
|
||||
this.frcMetadata.edit().putInt(NUM_FAILED_FETCHES_KEY, i).putLong(BACKOFF_END_TIME_IN_MILLIS_KEY, date.getTime()).apply();
|
||||
}
|
||||
}
|
||||
|
||||
public void setConfigSettings(FirebaseRemoteConfigSettings firebaseRemoteConfigSettings) {
|
||||
synchronized (this.frcInfoLock) {
|
||||
this.frcMetadata.edit().putLong(FETCH_TIMEOUT_IN_SECONDS_KEY, firebaseRemoteConfigSettings.getFetchTimeoutInSeconds()).putLong(MINIMUM_FETCH_INTERVAL_IN_SECONDS_KEY, firebaseRemoteConfigSettings.getMinimumFetchIntervalInSeconds()).commit();
|
||||
}
|
||||
}
|
||||
|
||||
public void setConfigSettingsWithoutWaitingOnDiskWrite(FirebaseRemoteConfigSettings firebaseRemoteConfigSettings) {
|
||||
synchronized (this.frcInfoLock) {
|
||||
this.frcMetadata.edit().putLong(FETCH_TIMEOUT_IN_SECONDS_KEY, firebaseRemoteConfigSettings.getFetchTimeoutInSeconds()).putLong(MINIMUM_FETCH_INTERVAL_IN_SECONDS_KEY, firebaseRemoteConfigSettings.getMinimumFetchIntervalInSeconds()).apply();
|
||||
}
|
||||
}
|
||||
|
||||
public void setLastFetchETag(String str) {
|
||||
synchronized (this.frcInfoLock) {
|
||||
this.frcMetadata.edit().putString(LAST_FETCH_ETAG_KEY, str).apply();
|
||||
}
|
||||
}
|
||||
|
||||
public void setLastTemplateVersion(long j4) {
|
||||
synchronized (this.frcInfoLock) {
|
||||
this.frcMetadata.edit().putLong(LAST_TEMPLATE_VERSION, j4).apply();
|
||||
}
|
||||
}
|
||||
|
||||
public void setRealtimeBackoffMetadata(int i, Date date) {
|
||||
synchronized (this.realtimeBackoffMetadataLock) {
|
||||
this.frcMetadata.edit().putInt(NUM_FAILED_REALTIME_STREAMS_KEY, i).putLong(REALTIME_BACKOFF_END_TIME_IN_MILLIS_KEY, date.getTime()).apply();
|
||||
}
|
||||
}
|
||||
|
||||
public void updateLastFetchAsFailed() {
|
||||
synchronized (this.frcInfoLock) {
|
||||
this.frcMetadata.edit().putInt(LAST_FETCH_STATUS_KEY, 1).apply();
|
||||
}
|
||||
}
|
||||
|
||||
public void updateLastFetchAsSuccessfulAt(Date date) {
|
||||
synchronized (this.frcInfoLock) {
|
||||
this.frcMetadata.edit().putInt(LAST_FETCH_STATUS_KEY, -1).putLong(LAST_SUCCESSFUL_FETCH_TIME_IN_MILLIS_KEY, date.getTime()).apply();
|
||||
}
|
||||
}
|
||||
|
||||
public void updateLastFetchAsThrottled() {
|
||||
synchronized (this.frcInfoLock) {
|
||||
this.frcMetadata.edit().putInt(LAST_FETCH_STATUS_KEY, 2).apply();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user