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:
2025-12-04 13:59:54 +01:00
parent f2fd1c3bf5
commit e0133d2ca2
10432 changed files with 1019085 additions and 1 deletions

View File

@@ -0,0 +1,103 @@
package com.adif.elcanomovil.repositories.searches;
import com.adif.elcanomovil.domain.entities.StorableData;
import com.adif.elcanomovil.domain.entities.StorableTrain;
import com.adif.elcanomovil.domain.repositories.searches.SearchesRepository;
import com.adif.elcanomovil.serviceStorage.model.StationStored;
import com.adif.elcanomovil.serviceStorage.model.StationStoredEntity;
import com.adif.elcanomovil.serviceStorage.model.TrainStored;
import com.adif.elcanomovil.serviceStorage.model.TrainStoredEntity;
import com.adif.elcanomovil.serviceStorage.preferences.PreferenceStorage;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import kotlin.Metadata;
import kotlin.Unit;
import kotlin.collections.CollectionsKt;
import kotlin.collections.CollectionsKt__MutableCollectionsKt;
import kotlin.coroutines.Continuation;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.SourceDebugExtension;
import w1.C0650a;
@Metadata(d1 = {"\u00002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0010\u0002\n\u0002\b\b\u0018\u00002\u00020\u0001B\u001d\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005\u0012\u0006\u0010\u0006\u001a\u00020\u0007¢\u0006\u0002\u0010\bJ\u0014\u0010\t\u001a\b\u0012\u0004\u0012\u00020\u000b0\nH\u0096@¢\u0006\u0002\u0010\fJ\u0014\u0010\r\u001a\b\u0012\u0004\u0012\u00020\u000b0\nH\u0096@¢\u0006\u0002\u0010\fJ\u0010\u0010\u000e\u001a\u00020\u000f2\u0006\u0010\u0010\u001a\u00020\u000bH\u0002J\u001c\u0010\u0011\u001a\u00020\u000f2\f\u0010\u0012\u001a\b\u0012\u0004\u0012\u00020\u000b0\nH\u0096@¢\u0006\u0002\u0010\u0013J\u0016\u0010\u0014\u001a\u00020\u000f2\u0006\u0010\u0015\u001a\u00020\u000bH\u0096@¢\u0006\u0002\u0010\u0016R\u000e\u0010\u0004\u001a\u00020\u0005X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u0002\u001a\u00020\u0003X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u0006\u001a\u00020\u0007X\u0082\u0004¢\u0006\u0002\n\u0000¨\u0006\u0017"}, d2 = {"Lcom/adif/elcanomovil/repositories/searches/DefaultSearchesRepository;", "Lcom/adif/elcanomovil/domain/repositories/searches/SearchesRepository;", "storage", "Lcom/adif/elcanomovil/serviceStorage/preferences/PreferenceStorage;", "searchesMapper", "Lcom/adif/elcanomovil/repositories/searches/SearchesMapper;", "trainSearchesMapper", "Lcom/adif/elcanomovil/repositories/searches/TrainSearchesMapper;", "(Lcom/adif/elcanomovil/serviceStorage/preferences/PreferenceStorage;Lcom/adif/elcanomovil/repositories/searches/SearchesMapper;Lcom/adif/elcanomovil/repositories/searches/TrainSearchesMapper;)V", "fetchStations", "", "Lcom/adif/elcanomovil/domain/entities/StorableData;", "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "fetchTrainsSelected", "insert", "", "storableStation", "saveSearch", "stations", "(Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "saveTrainSelected", "storableTrain", "(Lcom/adif/elcanomovil/domain/entities/StorableData;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "repositories_proNon_corporateRelease"}, k = 1, mv = {1, 9, 0}, xi = 48)
@SourceDebugExtension({"SMAP\nDefaultSearchesRepository.kt\nKotlin\n*S Kotlin\n*F\n+ 1 DefaultSearchesRepository.kt\ncom/adif/elcanomovil/repositories/searches/DefaultSearchesRepository\n+ 2 _Collections.kt\nkotlin/collections/CollectionsKt___CollectionsKt\n*L\n1#1,59:1\n1855#2,2:60\n*S KotlinDebug\n*F\n+ 1 DefaultSearchesRepository.kt\ncom/adif/elcanomovil/repositories/searches/DefaultSearchesRepository\n*L\n22#1:60,2\n*E\n"})
/* loaded from: classes.dex */
public final class DefaultSearchesRepository implements SearchesRepository {
private final SearchesMapper searchesMapper;
private final PreferenceStorage storage;
private final TrainSearchesMapper trainSearchesMapper;
public DefaultSearchesRepository(PreferenceStorage storage, SearchesMapper searchesMapper, TrainSearchesMapper trainSearchesMapper) {
Intrinsics.checkNotNullParameter(storage, "storage");
Intrinsics.checkNotNullParameter(searchesMapper, "searchesMapper");
Intrinsics.checkNotNullParameter(trainSearchesMapper, "trainSearchesMapper");
this.storage = storage;
this.searchesMapper = searchesMapper;
this.trainSearchesMapper = trainSearchesMapper;
}
private final void insert(StorableData storableStation) {
List<? extends StationStored> mutableList;
StationStoredEntity domainToEntity = this.searchesMapper.domainToEntity(storableStation);
List<StationStored> lastStationsSearched = this.storage.getLastStationsSearched();
if (lastStationsSearched == null || (mutableList = CollectionsKt.toMutableList((Collection) lastStationsSearched)) == null) {
return;
}
CollectionsKt__MutableCollectionsKt.removeAll((List) mutableList, (Function1) new C0650a(storableStation, 0));
if (mutableList.size() >= 10) {
mutableList.remove(0);
}
mutableList.add(domainToEntity);
this.storage.setLastStationsSearched(mutableList);
}
@Override // com.adif.elcanomovil.domain.repositories.searches.SearchesRepository
public Object fetchStations(Continuation<? super List<? extends StorableData>> continuation) {
SearchesMapper searchesMapper = this.searchesMapper;
List<StationStored> lastStationsSearched = this.storage.getLastStationsSearched();
if (lastStationsSearched == null) {
lastStationsSearched = CollectionsKt.emptyList();
}
return searchesMapper.entitiesToDomain(lastStationsSearched);
}
@Override // com.adif.elcanomovil.domain.repositories.searches.SearchesRepository
public Object fetchTrainsSelected(Continuation<? super List<? extends StorableData>> continuation) {
TrainSearchesMapper trainSearchesMapper = this.trainSearchesMapper;
List<TrainStored> lastTrainsSearched = this.storage.getLastTrainsSearched();
if (lastTrainsSearched == null) {
lastTrainsSearched = CollectionsKt.emptyList();
}
return trainSearchesMapper.entitiesToDomain(lastTrainsSearched);
}
@Override // com.adif.elcanomovil.domain.repositories.searches.SearchesRepository
public Object saveSearch(List<? extends StorableData> list, Continuation<? super Unit> continuation) {
Iterator<T> it = list.iterator();
while (it.hasNext()) {
insert((StorableData) it.next());
}
return Unit.INSTANCE;
}
@Override // com.adif.elcanomovil.domain.repositories.searches.SearchesRepository
public Object saveTrainSelected(StorableData storableData, Continuation<? super Unit> continuation) {
List<? extends TrainStored> mutableList;
TrainSearchesMapper trainSearchesMapper = this.trainSearchesMapper;
Intrinsics.checkNotNull(storableData, "null cannot be cast to non-null type com.adif.elcanomovil.domain.entities.StorableTrain");
TrainStoredEntity domainToEntity = trainSearchesMapper.domainToEntity((StorableTrain) storableData);
List<TrainStored> lastTrainsSearched = this.storage.getLastTrainsSearched();
if (lastTrainsSearched == null || (mutableList = CollectionsKt.toMutableList((Collection) lastTrainsSearched)) == null) {
return Unit.INSTANCE;
}
CollectionsKt__MutableCollectionsKt.removeAll((List) mutableList, (Function1) new C0650a(storableData, 1));
if (mutableList.size() >= 10) {
mutableList.remove(0);
}
mutableList.add(domainToEntity);
this.storage.setLastTrainsSearched(mutableList);
return Unit.INSTANCE;
}
}

View File

@@ -0,0 +1,10 @@
package com.adif.elcanomovil.repositories.searches;
import kotlin.Metadata;
@Metadata(d1 = {"\u0000\n\n\u0000\n\u0002\u0010\b\n\u0002\b\u0002\"\u000e\u0010\u0000\u001a\u00020\u0001X\u0082T¢\u0006\u0002\n\u0000\"\u000e\u0010\u0002\u001a\u00020\u0001X\u0082T¢\u0006\u0002\n\u0000¨\u0006\u0003"}, d2 = {"MAX_SEARCHES_SAVED", "", "MAX_TRAINS_SAVED", "repositories_proNon_corporateRelease"}, k = 2, mv = {1, 9, 0}, xi = 48)
/* loaded from: classes.dex */
public final class DefaultSearchesRepositoryKt {
private static final int MAX_SEARCHES_SAVED = 10;
private static final int MAX_TRAINS_SAVED = 10;
}

View File

@@ -0,0 +1,39 @@
package com.adif.elcanomovil.repositories.searches;
import com.adif.elcanomovil.domain.entities.StorableData;
import com.adif.elcanomovil.domain.entities.StorableStation;
import com.adif.elcanomovil.serviceStorage.model.StationStored;
import com.adif.elcanomovil.serviceStorage.model.StationStoredEntity;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import kotlin.Metadata;
import kotlin.collections.CollectionsKt;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.SourceDebugExtension;
@Metadata(d1 = {"\u0000(\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\u000e\u0010\u0003\u001a\u00020\u00042\u0006\u0010\u0005\u001a\u00020\u0006J\u001a\u0010\u0007\u001a\b\u0012\u0004\u0012\u00020\t0\b2\f\u0010\u0005\u001a\b\u0012\u0004\u0012\u00020\n0\bJ\u000e\u0010\u000b\u001a\u00020\t2\u0006\u0010\u0005\u001a\u00020\\u0006\f"}, d2 = {"Lcom/adif/elcanomovil/repositories/searches/SearchesMapper;", "", "()V", "domainToEntity", "Lcom/adif/elcanomovil/serviceStorage/model/StationStoredEntity;", "source", "Lcom/adif/elcanomovil/domain/entities/StorableData;", "entitiesToDomain", "", "Lcom/adif/elcanomovil/domain/entities/StorableStation;", "Lcom/adif/elcanomovil/serviceStorage/model/StationStored;", "entityToDomain", "repositories_proNon_corporateRelease"}, k = 1, mv = {1, 9, 0}, xi = 48)
@SourceDebugExtension({"SMAP\nSearchesMapper.kt\nKotlin\n*S Kotlin\n*F\n+ 1 SearchesMapper.kt\ncom/adif/elcanomovil/repositories/searches/SearchesMapper\n+ 2 _Collections.kt\nkotlin/collections/CollectionsKt___CollectionsKt\n*L\n1#1,15:1\n1549#2:16\n1620#2,3:17\n*S KotlinDebug\n*F\n+ 1 SearchesMapper.kt\ncom/adif/elcanomovil/repositories/searches/SearchesMapper\n*L\n11#1:16\n11#1:17,3\n*E\n"})
/* loaded from: classes.dex */
public final class SearchesMapper {
public final StationStoredEntity domainToEntity(StorableData source) {
Intrinsics.checkNotNullParameter(source, "source");
return new StationStoredEntity(source.getIdentifier());
}
public final List<StorableStation> entitiesToDomain(List<? extends StationStored> source) {
Intrinsics.checkNotNullParameter(source, "source");
List<? extends StationStored> list = source;
ArrayList arrayList = new ArrayList(CollectionsKt.g(list));
Iterator<T> it = list.iterator();
while (it.hasNext()) {
arrayList.add(entityToDomain((StationStored) it.next()));
}
return arrayList;
}
public final StorableStation entityToDomain(StationStored source) {
Intrinsics.checkNotNullParameter(source, "source");
return new StorableStation(source.getIdentifier());
}
}

View File

@@ -0,0 +1,38 @@
package com.adif.elcanomovil.repositories.searches;
import com.adif.elcanomovil.domain.entities.StorableTrain;
import com.adif.elcanomovil.serviceStorage.model.TrainStored;
import com.adif.elcanomovil.serviceStorage.model.TrainStoredEntity;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import kotlin.Metadata;
import kotlin.collections.CollectionsKt;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.SourceDebugExtension;
@Metadata(d1 = {"\u0000$\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\u000e\u0010\u0003\u001a\u00020\u00042\u0006\u0010\u0005\u001a\u00020\u0006J\u001a\u0010\u0007\u001a\b\u0012\u0004\u0012\u00020\u00060\b2\f\u0010\u0005\u001a\b\u0012\u0004\u0012\u00020\t0\bJ\u000e\u0010\n\u001a\u00020\u00062\u0006\u0010\u0005\u001a\u00020\\u0006\u000b"}, d2 = {"Lcom/adif/elcanomovil/repositories/searches/TrainSearchesMapper;", "", "()V", "domainToEntity", "Lcom/adif/elcanomovil/serviceStorage/model/TrainStoredEntity;", "source", "Lcom/adif/elcanomovil/domain/entities/StorableTrain;", "entitiesToDomain", "", "Lcom/adif/elcanomovil/serviceStorage/model/TrainStored;", "entityToDomain", "repositories_proNon_corporateRelease"}, k = 1, mv = {1, 9, 0}, xi = 48)
@SourceDebugExtension({"SMAP\nTrainSearchesMapper.kt\nKotlin\n*S Kotlin\n*F\n+ 1 TrainSearchesMapper.kt\ncom/adif/elcanomovil/repositories/searches/TrainSearchesMapper\n+ 2 _Collections.kt\nkotlin/collections/CollectionsKt___CollectionsKt\n*L\n1#1,33:1\n1549#2:34\n1620#2,3:35\n*S KotlinDebug\n*F\n+ 1 TrainSearchesMapper.kt\ncom/adif/elcanomovil/repositories/searches/TrainSearchesMapper\n*L\n20#1:34\n20#1:35,3\n*E\n"})
/* loaded from: classes.dex */
public final class TrainSearchesMapper {
public final TrainStoredEntity domainToEntity(StorableTrain source) {
Intrinsics.checkNotNullParameter(source, "source");
return new TrainStoredEntity(source.getOperator(), source.getCommercialProduct(), source.getCommercialNumber(), source.getOriginStationCode(), source.getDestinationStationCode(), source.getDate(), source.getLaunchingDate(), source.getObservation());
}
public final List<StorableTrain> entitiesToDomain(List<? extends TrainStored> source) {
Intrinsics.checkNotNullParameter(source, "source");
List<? extends TrainStored> list = source;
ArrayList arrayList = new ArrayList(CollectionsKt.g(list));
Iterator<T> it = list.iterator();
while (it.hasNext()) {
arrayList.add(entityToDomain((TrainStored) it.next()));
}
return arrayList;
}
public final StorableTrain entityToDomain(TrainStored source) {
Intrinsics.checkNotNullParameter(source, "source");
return new StorableTrain(source.getOperator(), source.getCommercialProduct(), source.getCommercialNumber(), source.getOriginStationCode(), source.getDestinationStationCode(), source.getDate(), source.getLaunchingDate(), source.getObservation());
}
}