Update chimera service provider

This commit is contained in:
Marvin W 2020-08-03 18:05:14 +02:00
parent 3c2119ce79
commit af28a78bba
No known key found for this signature in database
GPG Key ID: 072E9235DB996F2A
9 changed files with 182 additions and 75 deletions

View File

@ -1,67 +0,0 @@
/*
* Copyright (C) 2017 microG Project Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.microg.gms;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class ChimeraSpoofProvider extends ContentProvider {
private static final String TAG = "GmsChimeraSpoof";
private static final String[] COLUMNS = new String[]{"version", "apkPath", "loaderPath", "apkDescStr"};
@Override
public boolean onCreate() {
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
MatrixCursor cursor = new MatrixCursor(COLUMNS);
Log.d(TAG, "query: " + uri);
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return "vnd.android.cursor.item/com.google.android.gms.chimera";
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, ContentValues values) {
return null;
}
@Override
public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}

View File

@ -27,6 +27,7 @@ import android.os.RemoteException;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.internal.ConnectionInfo;
import com.google.android.gms.common.internal.GetServiceRequest;
import com.google.android.gms.common.internal.IGmsCallbacks;
import com.google.android.gms.common.internal.IGmsServiceBroker;
@ -177,6 +178,16 @@ public abstract class GmsClient<I extends IInterface> implements ApiClient {
Log.d(TAG, "GmsCallbacks : onPostInitComplete(" + serviceInterface + ")");
callbacks.onConnected(params);
}
@Override
public void onAccountValidationComplete(int statusCode, Bundle params) throws RemoteException {
Log.d(TAG, "GmsCallbacks : onAccountValidationComplete");
}
@Override
public void onPostInitCompleteWithConnectionInfo(int statusCode, IBinder binder, ConnectionInfo info) throws RemoteException {
onPostInitComplete(statusCode, binder, info == null ? null : info.params);
}
}
}

View File

@ -0,0 +1,7 @@
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.common.internal;
parcelable ConnectionInfo;

View File

@ -1,7 +1,15 @@
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.common.internal;
import android.os.Bundle;
import com.google.android.gms.common.internal.ConnectionInfo;
interface IGmsCallbacks {
void onPostInitComplete(int statusCode, IBinder binder, in Bundle params);
void onAccountValidationComplete(int statusCode, in Bundle params);
void onPostInitCompleteWithConnectionInfo(int statusCode, IBinder binder, in ConnectionInfo info);
}

View File

@ -0,0 +1,36 @@
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.common;
import org.microg.safeparcel.AutoSafeParcelable;
public class Feature extends AutoSafeParcelable {
@Field(1)
private String name;
@Field(2)
private int oldVersion;
@Field(3)
private long version = -1;
private Feature() {
}
public Feature(String name, long version) {
this.name = name;
this.version = version;
}
public String getName() {
return name;
}
public long getVersion() {
if (version == -1) return oldVersion;
return version;
}
public static final Creator<Feature> CREATOR = new AutoSafeParcelable.AutoCreator<>(Feature.class);
}

View File

@ -0,0 +1,23 @@
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.common.internal;
import android.os.Bundle;
import com.google.android.gms.common.Feature;
import org.microg.safeparcel.AutoSafeParcelable;
public class ConnectionInfo extends AutoSafeParcelable {
@Field(1)
public Bundle params;
@Field(2)
public Feature[] features;
@Field(3)
public int unknown3;
public static final Creator<ConnectionInfo> CREATOR = new AutoSafeParcelable.AutoCreator<>(ConnectionInfo.class);
}

View File

@ -125,6 +125,15 @@ public enum GmsService {
return UNKNOWN;
}
public static GmsService byAction(String action) {
for (GmsService service : values()) {
for (String serviceAction : service.SECONDARY_ACTIONS) {
if (serviceAction.equals(action)) return service;
}
}
return UNKNOWN;
}
public static String nameFromServiceId(int serviceId) {
return byServiceId(serviceId).toString(serviceId);
}

View File

@ -411,9 +411,9 @@
</intent-filter>
</service>
<!-- Chimera spoof -->
<!-- Chimera -->
<provider
android:name="org.microg.gms.ChimeraSpoofProvider"
android:name="org.microg.gms.chimera.ServiceProvider"
android:authorities="com.google.android.gms.chimera"
android:exported="true" />
@ -476,10 +476,6 @@
android:name="org.microg.gms.ui.GoogleMoreFragment$AsActivity"
android:label="@string/gms_settings_name" />
<activity
android:name="org.microg.gms.ui.SafetyNetFragment$AsActivity"
android:label="@string/service_name_snet" />
<activity
android:name="org.microg.gms.ui.SafetyNetAdvancedFragment$AsActivity"
android:label="@string/service_name_snet" />
@ -625,13 +621,13 @@
<service android:name="org.microg.gms.appinvite.AppInviteService">
<intent-filter>
<action android:name="com.google.android.gms.appinvite.service.START"/>
<action android:name="com.google.android.gms.appinvite.service.START" />
</intent-filter>
</service>
<service android:name="org.microg.gms.firebase.dynamiclinks.DynamicLinksService">
<intent-filter>
<action android:name="com.google.firebase.dynamiclinks.service.START"/>
<action android:name="com.google.firebase.dynamiclinks.service.START" />
</intent-filter>
</service>

View File

@ -0,0 +1,84 @@
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package org.microg.gms.chimera
import android.content.ContentProvider
import android.content.ContentValues
import android.content.Context
import android.content.Intent
import android.database.Cursor
import android.database.MatrixCursor
import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.core.os.bundleOf
import org.microg.gms.DummyService
import org.microg.gms.common.GmsService
import org.microg.gms.common.RemoteListenerProxy
class ServiceProvider : ContentProvider() {
override fun onCreate(): Boolean {
Log.d(TAG, "onCreate")
return true
}
override fun call(method: String, arg: String?, extras: Bundle?): Bundle? {
when (method) {
"serviceIntentCall" -> {
val serviceAction = extras?.getString("serviceActionBundleKey") ?: return null
val ourServiceAction = GmsService.byAction(serviceAction)?.takeIf { it.SERVICE_ID > 0 }?.ACTION
val context = context!!
val intent = Intent(ourServiceAction).apply { `package` = context.packageName }
val resolveInfo = context.packageManager.resolveService(intent, 0)
if (resolveInfo != null) {
intent.setClassName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name)
} else {
intent.setClass(context, DummyService::class.java)
}
Log.d(TAG, "$method: $serviceAction -> $intent")
return bundleOf(
"serviceResponseIntentKey" to intent
)
}
else -> {
Log.d(TAG, "$method: $arg, $extras")
return super.call(method, arg, extras)
}
}
}
override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor? {
val cursor = MatrixCursor(COLUMNS)
Log.d(TAG, "query: $uri")
return cursor
}
override fun insert(uri: Uri, values: ContentValues?): Uri? {
Log.d(TAG, "insert: $uri, $values")
return uri
}
override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int {
Log.d(TAG, "update: $uri, $values, $selection, $selectionArgs")
return 0
}
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
Log.d(TAG, "delete: $uri, $selection, $selectionArgs")
return 0
}
override fun getType(uri: Uri): String {
Log.d(TAG, "getType: $uri")
return "vnd.android.cursor.item/com.google.android.gms.chimera"
}
companion object {
private const val TAG = "ChimeraServiceProvider"
private val COLUMNS = arrayOf("version", "apkPath", "loaderPath", "apkDescStr")
}
}