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:
343
apk_decompiled/sources/androidx/core/content/FileProvider.java
Normal file
343
apk_decompiled/sources/androidx/core/content/FileProvider.java
Normal file
@@ -0,0 +1,343 @@
|
||||
package androidx.core.content;
|
||||
|
||||
import C.w;
|
||||
import D.h;
|
||||
import D.i;
|
||||
import D.j;
|
||||
import D.k;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.ContentProvider;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ProviderInfo;
|
||||
import android.content.res.XmlResourceParser;
|
||||
import android.database.Cursor;
|
||||
import android.database.MatrixCursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.text.TextUtils;
|
||||
import android.webkit.MimeTypeMap;
|
||||
import com.adif.elcanomovil.widget.DefaultWidgetPayloadHandler;
|
||||
import com.google.firebase.analytics.FirebaseAnalytics;
|
||||
import com.google.firebase.sessions.settings.RemoteSettings;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class FileProvider extends ContentProvider {
|
||||
private static final String ATTR_NAME = "name";
|
||||
private static final String ATTR_PATH = "path";
|
||||
private static final String DISPLAYNAME_FIELD = "displayName";
|
||||
private static final String META_DATA_FILE_PROVIDER_PATHS = "android.support.FILE_PROVIDER_PATHS";
|
||||
private static final String TAG_CACHE_PATH = "cache-path";
|
||||
private static final String TAG_EXTERNAL = "external-path";
|
||||
private static final String TAG_EXTERNAL_CACHE = "external-cache-path";
|
||||
private static final String TAG_EXTERNAL_FILES = "external-files-path";
|
||||
private static final String TAG_EXTERNAL_MEDIA = "external-media-path";
|
||||
private static final String TAG_FILES_PATH = "files-path";
|
||||
private static final String TAG_ROOT_PATH = "root-path";
|
||||
private String mAuthority;
|
||||
private j mLocalPathStrategy;
|
||||
private final Object mLock;
|
||||
private final int mResourceId;
|
||||
private static final String[] COLUMNS = {"_display_name", "_size"};
|
||||
private static final File DEVICE_ROOT = new File(RemoteSettings.FORWARD_SLASH_STRING);
|
||||
private static final HashMap<String, j> sCache = new HashMap<>();
|
||||
|
||||
public FileProvider() {
|
||||
this(0);
|
||||
}
|
||||
|
||||
private static File buildPath(File file, String... strArr) {
|
||||
for (String str : strArr) {
|
||||
if (str != null) {
|
||||
file = new File(file, str);
|
||||
}
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
private static String[] copyOf(String[] strArr, int i) {
|
||||
String[] strArr2 = new String[i];
|
||||
System.arraycopy(strArr, 0, strArr2, 0, i);
|
||||
return strArr2;
|
||||
}
|
||||
|
||||
public static XmlResourceParser getFileProviderPathsMetaData(Context context, String str, ProviderInfo providerInfo, int i) {
|
||||
if (providerInfo == null) {
|
||||
throw new IllegalArgumentException(w.z("Couldn't find meta-data for provider with authority ", str));
|
||||
}
|
||||
if (providerInfo.metaData == null && i != 0) {
|
||||
Bundle bundle = new Bundle(1);
|
||||
providerInfo.metaData = bundle;
|
||||
bundle.putInt(META_DATA_FILE_PROVIDER_PATHS, i);
|
||||
}
|
||||
XmlResourceParser loadXmlMetaData = providerInfo.loadXmlMetaData(context.getPackageManager(), META_DATA_FILE_PROVIDER_PATHS);
|
||||
if (loadXmlMetaData != null) {
|
||||
return loadXmlMetaData;
|
||||
}
|
||||
throw new IllegalArgumentException("Missing android.support.FILE_PROVIDER_PATHS meta-data");
|
||||
}
|
||||
|
||||
private j getLocalPathStrategy() {
|
||||
j jVar;
|
||||
synchronized (this.mLock) {
|
||||
try {
|
||||
if (this.mAuthority == null) {
|
||||
throw new NullPointerException("mAuthority is null. Did you override attachInfo and did not call super.attachInfo()?");
|
||||
}
|
||||
if (this.mLocalPathStrategy == null) {
|
||||
this.mLocalPathStrategy = getPathStrategy(getContext(), this.mAuthority, this.mResourceId);
|
||||
}
|
||||
jVar = this.mLocalPathStrategy;
|
||||
} catch (Throwable th) {
|
||||
throw th;
|
||||
}
|
||||
}
|
||||
return jVar;
|
||||
}
|
||||
|
||||
private static j getPathStrategy(Context context, String str, int i) {
|
||||
j jVar;
|
||||
HashMap<String, j> hashMap = sCache;
|
||||
synchronized (hashMap) {
|
||||
try {
|
||||
jVar = hashMap.get(str);
|
||||
if (jVar == null) {
|
||||
try {
|
||||
try {
|
||||
jVar = parsePathStrategy(context, str, i);
|
||||
hashMap.put(str, jVar);
|
||||
} catch (IOException e4) {
|
||||
throw new IllegalArgumentException("Failed to parse android.support.FILE_PROVIDER_PATHS meta-data", e4);
|
||||
}
|
||||
} catch (XmlPullParserException e5) {
|
||||
throw new IllegalArgumentException("Failed to parse android.support.FILE_PROVIDER_PATHS meta-data", e5);
|
||||
}
|
||||
}
|
||||
} catch (Throwable th) {
|
||||
throw th;
|
||||
}
|
||||
}
|
||||
return jVar;
|
||||
}
|
||||
|
||||
public static Uri getUriForFile(Context context, String str, File file) {
|
||||
String substring;
|
||||
k kVar = (k) getPathStrategy(context, str, 0);
|
||||
kVar.getClass();
|
||||
try {
|
||||
String canonicalPath = file.getCanonicalPath();
|
||||
Map.Entry entry = null;
|
||||
for (Map.Entry entry2 : kVar.f359b.entrySet()) {
|
||||
String path = ((File) entry2.getValue()).getPath();
|
||||
if (k.a(canonicalPath, path) && (entry == null || path.length() > ((File) entry.getValue()).getPath().length())) {
|
||||
entry = entry2;
|
||||
}
|
||||
}
|
||||
if (entry != null) {
|
||||
String path2 = ((File) entry.getValue()).getPath();
|
||||
if (path2.endsWith(RemoteSettings.FORWARD_SLASH_STRING)) {
|
||||
substring = canonicalPath.substring(path2.length());
|
||||
} else {
|
||||
substring = canonicalPath.substring(path2.length() + 1);
|
||||
}
|
||||
return new Uri.Builder().scheme(FirebaseAnalytics.Param.CONTENT).authority(kVar.f358a).encodedPath(Uri.encode((String) entry.getKey()) + '/' + Uri.encode(substring, RemoteSettings.FORWARD_SLASH_STRING)).build();
|
||||
}
|
||||
throw new IllegalArgumentException(w.z("Failed to find configured root that contains ", canonicalPath));
|
||||
} catch (IOException unused) {
|
||||
throw new IllegalArgumentException("Failed to resolve canonical path for " + file);
|
||||
}
|
||||
}
|
||||
|
||||
private static int modeToMode(String str) {
|
||||
if ("r".equals(str)) {
|
||||
return 268435456;
|
||||
}
|
||||
if (DefaultWidgetPayloadHandler.IS_WIDGET_JSON_TYPE.equals(str) || "wt".equals(str)) {
|
||||
return 738197504;
|
||||
}
|
||||
if ("wa".equals(str)) {
|
||||
return 704643072;
|
||||
}
|
||||
if ("rw".equals(str)) {
|
||||
return 939524096;
|
||||
}
|
||||
if ("rwt".equals(str)) {
|
||||
return 1006632960;
|
||||
}
|
||||
throw new IllegalArgumentException(w.z("Invalid mode: ", str));
|
||||
}
|
||||
|
||||
private static j parsePathStrategy(Context context, String str, int i) throws IOException, XmlPullParserException {
|
||||
k kVar = new k(str);
|
||||
XmlResourceParser fileProviderPathsMetaData = getFileProviderPathsMetaData(context, str, context.getPackageManager().resolveContentProvider(str, 128), i);
|
||||
while (true) {
|
||||
int next = fileProviderPathsMetaData.next();
|
||||
if (next == 1) {
|
||||
return kVar;
|
||||
}
|
||||
if (next == 2) {
|
||||
String name = fileProviderPathsMetaData.getName();
|
||||
File file = null;
|
||||
String attributeValue = fileProviderPathsMetaData.getAttributeValue(null, "name");
|
||||
String attributeValue2 = fileProviderPathsMetaData.getAttributeValue(null, "path");
|
||||
if (TAG_ROOT_PATH.equals(name)) {
|
||||
file = DEVICE_ROOT;
|
||||
} else if (TAG_FILES_PATH.equals(name)) {
|
||||
file = context.getFilesDir();
|
||||
} else if (TAG_CACHE_PATH.equals(name)) {
|
||||
file = context.getCacheDir();
|
||||
} else if (TAG_EXTERNAL.equals(name)) {
|
||||
file = Environment.getExternalStorageDirectory();
|
||||
} else if (TAG_EXTERNAL_FILES.equals(name)) {
|
||||
File[] externalFilesDirs = h.getExternalFilesDirs(context, null);
|
||||
if (externalFilesDirs.length > 0) {
|
||||
file = externalFilesDirs[0];
|
||||
}
|
||||
} else if (TAG_EXTERNAL_CACHE.equals(name)) {
|
||||
File[] externalCacheDirs = h.getExternalCacheDirs(context);
|
||||
if (externalCacheDirs.length > 0) {
|
||||
file = externalCacheDirs[0];
|
||||
}
|
||||
} else if (TAG_EXTERNAL_MEDIA.equals(name)) {
|
||||
File[] a2 = i.a(context);
|
||||
if (a2.length > 0) {
|
||||
file = a2[0];
|
||||
}
|
||||
}
|
||||
if (file != null) {
|
||||
File buildPath = buildPath(file, attributeValue2);
|
||||
if (TextUtils.isEmpty(attributeValue)) {
|
||||
throw new IllegalArgumentException("Name must not be empty");
|
||||
}
|
||||
try {
|
||||
kVar.f359b.put(attributeValue, buildPath.getCanonicalFile());
|
||||
} catch (IOException e4) {
|
||||
throw new IllegalArgumentException("Failed to resolve canonical path for " + buildPath, e4);
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* JADX INFO: Access modifiers changed from: private */
|
||||
public static String removeTrailingSlash(String str) {
|
||||
return (str.length() <= 0 || str.charAt(str.length() + (-1)) != '/') ? str : str.substring(0, str.length() - 1);
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
public void attachInfo(Context context, ProviderInfo providerInfo) {
|
||||
super.attachInfo(context, providerInfo);
|
||||
if (providerInfo.exported) {
|
||||
throw new SecurityException("Provider must not be exported");
|
||||
}
|
||||
if (!providerInfo.grantUriPermissions) {
|
||||
throw new SecurityException("Provider must grant uri permissions");
|
||||
}
|
||||
String str = providerInfo.authority.split(";")[0];
|
||||
synchronized (this.mLock) {
|
||||
this.mAuthority = str;
|
||||
}
|
||||
HashMap<String, j> hashMap = sCache;
|
||||
synchronized (hashMap) {
|
||||
hashMap.remove(str);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
public int delete(Uri uri, String str, String[] strArr) {
|
||||
return ((k) getLocalPathStrategy()).b(uri).delete() ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
public String getType(Uri uri) {
|
||||
File b4 = ((k) getLocalPathStrategy()).b(uri);
|
||||
int lastIndexOf = b4.getName().lastIndexOf(46);
|
||||
if (lastIndexOf < 0) {
|
||||
return "application/octet-stream";
|
||||
}
|
||||
String mimeTypeFromExtension = MimeTypeMap.getSingleton().getMimeTypeFromExtension(b4.getName().substring(lastIndexOf + 1));
|
||||
return mimeTypeFromExtension != null ? mimeTypeFromExtension : "application/octet-stream";
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
public String getTypeAnonymous(Uri uri) {
|
||||
return "application/octet-stream";
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
public Uri insert(Uri uri, ContentValues contentValues) {
|
||||
throw new UnsupportedOperationException("No external inserts");
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
public boolean onCreate() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
@SuppressLint({"UnknownNullness"})
|
||||
public ParcelFileDescriptor openFile(Uri uri, String str) throws FileNotFoundException {
|
||||
return ParcelFileDescriptor.open(((k) getLocalPathStrategy()).b(uri), modeToMode(str));
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
public Cursor query(Uri uri, String[] strArr, String str, String[] strArr2, String str2) {
|
||||
int i;
|
||||
File b4 = ((k) getLocalPathStrategy()).b(uri);
|
||||
String queryParameter = uri.getQueryParameter(DISPLAYNAME_FIELD);
|
||||
if (strArr == null) {
|
||||
strArr = COLUMNS;
|
||||
}
|
||||
String[] strArr3 = new String[strArr.length];
|
||||
Object[] objArr = new Object[strArr.length];
|
||||
int i4 = 0;
|
||||
for (String str3 : strArr) {
|
||||
if ("_display_name".equals(str3)) {
|
||||
strArr3[i4] = "_display_name";
|
||||
i = i4 + 1;
|
||||
objArr[i4] = queryParameter == null ? b4.getName() : queryParameter;
|
||||
} else if ("_size".equals(str3)) {
|
||||
strArr3[i4] = "_size";
|
||||
i = i4 + 1;
|
||||
objArr[i4] = Long.valueOf(b4.length());
|
||||
}
|
||||
i4 = i;
|
||||
}
|
||||
String[] copyOf = copyOf(strArr3, i4);
|
||||
Object[] copyOf2 = copyOf(objArr, i4);
|
||||
MatrixCursor matrixCursor = new MatrixCursor(copyOf, 1);
|
||||
matrixCursor.addRow(copyOf2);
|
||||
return matrixCursor;
|
||||
}
|
||||
|
||||
@Override // android.content.ContentProvider
|
||||
public int update(Uri uri, ContentValues contentValues, String str, String[] strArr) {
|
||||
throw new UnsupportedOperationException("No external updates");
|
||||
}
|
||||
|
||||
public FileProvider(int i) {
|
||||
this.mLock = new Object();
|
||||
this.mResourceId = i;
|
||||
}
|
||||
|
||||
private static Object[] copyOf(Object[] objArr, int i) {
|
||||
Object[] objArr2 = new Object[i];
|
||||
System.arraycopy(objArr, 0, objArr2, 0, i);
|
||||
return objArr2;
|
||||
}
|
||||
|
||||
@SuppressLint({"StreamFiles"})
|
||||
public static Uri getUriForFile(Context context, String str, File file, String str2) {
|
||||
return getUriForFile(context, str, file).buildUpon().appendQueryParameter(DISPLAYNAME_FIELD, str2).build();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user