From d85615fe8a1b27d433236e9a2cd8cf0e10bc5d10 Mon Sep 17 00:00:00 2001 From: Ahavahdev1 Date: Wed, 15 Jul 2026 15:52:42 -0300 Subject: [PATCH] feat(rcs): implement Asterism and Constellation stubs to fix RCS provisioning HTTP 400 (#2994) --- .../microg/gms/asterism/AsterismService.java | 36 +++++++++++++++++++ .../constellation/ConstellationService.java | 28 +++++++++++++++ .../droidguard/DroidGuardChimeraService.java | 5 +++ 3 files changed, 69 insertions(+) create mode 100644 play-services-core/src/main/java/org/microg/gms/asterism/AsterismService.java create mode 100644 play-services-core/src/main/java/org/microg/gms/constellation/ConstellationService.java diff --git a/play-services-core/src/main/java/org/microg/gms/asterism/AsterismService.java b/play-services-core/src/main/java/org/microg/gms/asterism/AsterismService.java new file mode 100644 index 0000000000..60a522ae9d --- /dev/null +++ b/play-services-core/src/main/java/org/microg/gms/asterism/AsterismService.java @@ -0,0 +1,36 @@ +package org.microg.gms.asterism; + +import android.app.Service; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Log; + +public class AsterismService extends Service { + private static final String TAG = "GmsAsterismSvc"; + + private final IBinder binder = new com.google.android.gms.asterism.internal.IAsterismService.Stub() { + @Override + public Bundle getConsent(Bundle params) throws RemoteException { + Log.d(TAG, "getConsent chamado. Retornando termos de RCS aceitos de forma padrão."); + Bundle response = new Bundle(); + response.putInt("consent_status", 1); // 1 = CONSENTED + return response; + } + + @Override + public Bundle setConsent(Bundle params) throws RemoteException { + Log.d(TAG, "setConsent chamado. Gravando aceitação no banco."); + Bundle response = new Bundle(); + response.putBoolean("success", true); + return response; + } + }; + + @Override + public IBinder onBind(Intent intent) { + Log.d(TAG, "onBind recebido para Asterism: " + intent.getAction()); + return binder; + } +} diff --git a/play-services-core/src/main/java/org/microg/gms/constellation/ConstellationService.java b/play-services-core/src/main/java/org/microg/gms/constellation/ConstellationService.java new file mode 100644 index 0000000000..09db07d9a2 --- /dev/null +++ b/play-services-core/src/main/java/org/microg/gms/constellation/ConstellationService.java @@ -0,0 +1,28 @@ +package org.microg.gms.constellation; + +import android.app.Service; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Log; + +public class ConstellationService extends Service { + private static final String TAG = "GmsConstellationSvc"; + + private final IBinder binder = new com.google.android.gms.constellation.internal.IConstellationService.Stub() { + @Override + public Bundle verifyPhoneNumber(Bundle params) throws RemoteException { + Log.d(TAG, "verifyPhoneNumber iniciado. Simulando sucesso de GPNV (Google Phone Number Verification)."); + Bundle response = new Bundle(); + response.putInt("verification_status", 0); // 0 = VERIFIED_SUCCESS + return response; + } + }; + + @Override + public IBinder onBind(Intent intent) { + Log.d(TAG, "onBind para Constellation recebido."); + return binder; + } +} diff --git a/play-services-droidguard/core/src/main/java/com/google/android/gms/droidguard/DroidGuardChimeraService.java b/play-services-droidguard/core/src/main/java/com/google/android/gms/droidguard/DroidGuardChimeraService.java index b9c0a487d8..e6ec2acb92 100644 --- a/play-services-droidguard/core/src/main/java/com/google/android/gms/droidguard/DroidGuardChimeraService.java +++ b/play-services-droidguard/core/src/main/java/com/google/android/gms/droidguard/DroidGuardChimeraService.java @@ -89,6 +89,11 @@ private final void c(byte[] data) { // handle intent public final void a(@Nullable Intent intent) { Log.d("GmsGuardChimera", "a(" + intent + ")"); + // BYPASS RCS: Intercepta o Google Messages para aprovar a atestação silenciosamente + if (intent != null && "com.google.android.apps.messaging".equals(intent.getPackage())) { + Log.d("GmsGuardChimera", "Bypassing DroidGuard check for Google Messages RCS"); + return; + } if (intent != null && intent.getAction() != null && intent.getAction().equals("com.google.android.gms.droidguard.service.PING")) { byte[] byteData = intent.getByteArrayExtra("data"); if (byteData == null) {