Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Verified Commit ebc270c3 authored by Marvin W.'s avatar Marvin W. 🐿️
Browse files

Add initial implementation for Fido and GmsCompliance APIs

parent b042407e
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
/*
 * SPDX-FileCopyrightText: 2022 microG Project Team
 * SPDX-License-Identifier: Apache-2.0
 */

package org.microg.gms.utils

import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.content.pm.PackageManager.NameNotFoundException
import android.content.pm.Signature
import android.util.Base64
import java.security.MessageDigest

fun PackageManager.getSignatures(packageName: String): Array<Signature> = try {
    getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures
} catch (e: NameNotFoundException) {
    emptyArray()
}

fun PackageManager.getApplicationLabel(packageName: String): CharSequence = try {
    getApplicationLabel(getApplicationInfo(packageName, 0))
} catch (e: Exception) {
    packageName
}

fun ByteArray.toBase64(vararg flags: Int): String = Base64.encodeToString(this, flags.fold(0) { a, b -> a or b })

fun PackageManager.getFirstSignatureDigest(packageName: String, md: String): ByteArray? =
    getSignatures(packageName).firstOrNull()?.digest(md)

fun Signature.digest(md: String): ByteArray = MessageDigest.getInstance(md).digest(toByteArray())
+15 −8
Original line number Diff line number Diff line
@@ -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.api.CommonStatusCodes;
import com.google.android.gms.common.internal.ConnectionInfo;
import com.google.android.gms.common.internal.GetServiceRequest;
import com.google.android.gms.common.internal.IGmsCallbacks;
@@ -166,6 +167,11 @@ public abstract class GmsClient<I extends IInterface> implements ApiClient {
        @Override
        public void onPostInitComplete(int statusCode, IBinder binder, Bundle params)
                throws RemoteException {
            if (statusCode != CommonStatusCodes.SUCCESS) {
                state = ConnectionState.CONNECTED;
                disconnect();
                connectionFailedListener.onConnectionFailed(new ConnectionResult(statusCode));
            } else {
                synchronized (GmsClient.this) {
                    if (state == ConnectionState.DISCONNECTING) {
                        state = ConnectionState.CONNECTED;
@@ -178,6 +184,7 @@ 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 {
+119 −0
Original line number Diff line number Diff line
/*
 * SPDX-FileCopyrightText: 2022 microG Project Team
 * SPDX-License-Identifier: Apache-2.0
 */

package org.microg.gms.utils;

import android.util.Base64;

public class ToStringHelper {
    private StringBuilder sb;
    private boolean hasField;
    private boolean hasValue;
    private boolean hasEnd;

    public ToStringHelper(String name) {
        this.sb = new StringBuilder(name).append("[");
    }

    public static ToStringHelper name(String name) {
        return new ToStringHelper(name);
    }

    public ToStringHelper value(String val) {
        if (!hasField) {
            if (hasValue) sb.append(',');
            sb.append(val);
            hasValue = true;
        }
        return this;
    }

    public ToStringHelper value(long val) {
        return value(Long.toString(val));
    }

    public ToStringHelper value(double val) {
        return value(Double.toString(val));
    }

    public ToStringHelper value(Object val) {
        if (val instanceof Long) value((long) val);
        if (val instanceof Double) value((double) val);
        return value(val, false);
    }

    public ToStringHelper value(Object val, boolean forceNull) {
        if (val == null && !forceNull) return this;
        return value(val == null ? "null" : val.toString());
    }

    public ToStringHelper value(byte[] val) {
        return value(val, false);
    }

    public ToStringHelper value(byte[] val, boolean forceNull) {
        if (val == null && !forceNull) return this;
        return value(val == null ? "null" : Base64.encodeToString(val, Base64.NO_WRAP | Base64.NO_PADDING | Base64.URL_SAFE));
    }

    private ToStringHelper fieldUnquoted(String name, String val) {
        if (hasValue || hasField) sb.append(", ");
        sb.append(name).append('=').append(val);
        hasField = true;
        return this;
    }

    public ToStringHelper field(String name, String val) {
        return field(name, val, false);
    }

    public ToStringHelper field(String name, String val, boolean forceNull) {
        if (val == null && !forceNull) return this;
        if (val == null) return fieldUnquoted(name, "null");
        if (hasValue || hasField) sb.append(", ");
        sb.append(name).append("=\"").append(val.replace("\"", "\\\"")).append('"');
        hasField = true;
        return this;
    }

    public ToStringHelper field(String name, long val) {
        return fieldUnquoted(name, Long.toString(val));
    }

    public ToStringHelper field(String name, double val) {
        return fieldUnquoted(name, Double.toString(val));
    }

    public ToStringHelper field(String name, boolean val) {
        return fieldUnquoted(name, Boolean.toString(val));
    }

    public ToStringHelper field(String name, Object val) {
        if (val instanceof Long) return field(name, (long) val);
        if (val instanceof Double) return field(name, (double) val);
        if (val instanceof Boolean) return field(name, (boolean) val);
        return field(name, val, false);
    }

    public ToStringHelper field(String name, Object val, boolean forceNull) {
        if (val == null && !forceNull) return this;
        return fieldUnquoted(name, val == null ? "null" : val.toString());
    }

    public ToStringHelper field(String name, byte[] val) {
        return field(name, val, false);
    }

    public ToStringHelper field(String name, byte[] val, boolean forceNull) {
        if (val == null && !forceNull) return this;
        return fieldUnquoted(name, val == null ? "null" : Base64.encodeToString(val, Base64.NO_WRAP | Base64.NO_PADDING | Base64.URL_SAFE));
    }

    public String end() {
        if (!hasEnd) sb.append(']');
        hasEnd = true;
        return sb.toString();
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ dependencies {
    implementation project(':play-services-cronet-core')
    implementation project(':play-services-droidguard-core')
    implementation project(':play-services-droidguard-core-ui')
    implementation project(':play-services-fido-core')
    implementation project(':play-services-gmscompliance-core')
    implementation project(':play-services-location-core')
    withNearbyImplementation project(':play-services-nearby-core')
    withNearbyImplementation project(':play-services-nearby-core-ui')
@@ -77,7 +79,7 @@ dependencies {
}

android {
    compileSdkVersion androidCompileSdk()
    compileSdkVersion androidCompileSdk
    buildToolsVersion "$androidBuildVersionTools"

    defaultConfig {
+0 −8
Original line number Diff line number Diff line
@@ -530,12 +530,6 @@
            android:process=":ui"
            android:theme="@style/Theme.AppCompat.DayNight.Dialog.Alert.NoActionBar" />

        <activity
            android:name="org.microg.gms.ui.AboutFragment$AsActivity"
            android:label="@string/pref_about_title"
            android:process=":ui"
            android:taskAffinity="org.microg.gms.settings" />

        <activity
            android:name="org.microg.gms.ui.GoogleMoreFragment$AsActivity"
            android:label="@string/gms_settings_name"
@@ -760,7 +754,6 @@
                <action android:name="com.google.android.gms.enterprise.loader.service.START" />
                <action android:name="com.google.android.gms.facs.internal.service.START" />
                <action android:name="com.google.android.gms.fido.credentialstore.internal_service.START" />
                <action android:name="com.google.android.gms.fido.fido2.privileged.START" />
                <action android:name="com.google.android.gms.fido.fido2.regular.START" />
                <action android:name="com.google.android.gms.fido.fido2.zeroparty.START" />
                <action android:name="com.google.android.gms.fido.sourcedevice.service.START" />
@@ -781,7 +774,6 @@
                <action android:name="com.google.android.gms.freighter.service.START" />
                <action android:name="com.google.android.gms.gass.START" />
                <action android:name="com.google.android.gms.growth.service.START" />
                <action android:name="com.google.android.gms.gmscompliance.service.START" />
                <action android:name="com.google.android.gms.googlehelp.service.GoogleHelpService.START" />
                <action android:name="com.google.android.gms.herrevad.services.LightweightNetworkQualityAndroidService.START" />
                <action android:name="com.google.android.gms.identity.service.BIND" />
Loading