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,78 @@
|
||||
package com.google.firebase.messaging;
|
||||
|
||||
import C.w;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.google.android.gms.common.internal.Objects;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
final class TopicOperation {
|
||||
private static final String OLD_TOPIC_PREFIX = "/topics/";
|
||||
static final String OPERATION_PAIR_DIVIDER = "!";
|
||||
private static final String TOPIC_NAME_PATTERN = "[a-zA-Z0-9-_.~%]{1,900}";
|
||||
private static final Pattern TOPIC_NAME_REGEXP = Pattern.compile(TOPIC_NAME_PATTERN);
|
||||
private final String operation;
|
||||
private final String serializedString;
|
||||
private final String topic;
|
||||
|
||||
private TopicOperation(String str, String str2) {
|
||||
this.topic = normalizeTopicOrThrow(str2, str);
|
||||
this.operation = str;
|
||||
this.serializedString = str + OPERATION_PAIR_DIVIDER + str2;
|
||||
}
|
||||
|
||||
public static TopicOperation from(String str) {
|
||||
if (TextUtils.isEmpty(str)) {
|
||||
return null;
|
||||
}
|
||||
String[] split = str.split(OPERATION_PAIR_DIVIDER, -1);
|
||||
if (split.length != 2) {
|
||||
return null;
|
||||
}
|
||||
return new TopicOperation(split[0], split[1]);
|
||||
}
|
||||
|
||||
private static String normalizeTopicOrThrow(String str, String str2) {
|
||||
if (str != null && str.startsWith(OLD_TOPIC_PREFIX)) {
|
||||
Log.w(Constants.TAG, "Format /topics/topic-name is deprecated. Only 'topic-name' should be used in " + str2 + ".");
|
||||
str = str.substring(8);
|
||||
}
|
||||
if (str == null || !TOPIC_NAME_REGEXP.matcher(str).matches()) {
|
||||
throw new IllegalArgumentException(w.o("Invalid topic name: ", str, " does not match the allowed format [a-zA-Z0-9-_.~%]{1,900}."));
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
public static TopicOperation subscribe(String str) {
|
||||
return new TopicOperation("S", str);
|
||||
}
|
||||
|
||||
public static TopicOperation unsubscribe(String str) {
|
||||
return new TopicOperation("U", str);
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof TopicOperation)) {
|
||||
return false;
|
||||
}
|
||||
TopicOperation topicOperation = (TopicOperation) obj;
|
||||
return this.topic.equals(topicOperation.topic) && this.operation.equals(topicOperation.operation);
|
||||
}
|
||||
|
||||
public String getOperation() {
|
||||
return this.operation;
|
||||
}
|
||||
|
||||
public String getTopic() {
|
||||
return this.topic;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.operation, this.topic);
|
||||
}
|
||||
|
||||
public String serialize() {
|
||||
return this.serializedString;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user