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

Unverified Commit 0f04df65 authored by Marvin W.'s avatar Marvin W. 🐿️
Browse files

Use fake-signature module

This is the same as in fake-store. Soon we'll have to move FakeStore/Companion
to this repository anyway (so that it can access certain parts from core needed
to support IAP and PI), until then it's probably fine to have this code
duplicated.
parent a35d3817
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
/*
 * SPDX-FileCopyrightText: 2023 microG Project Team
 * SPDX-License-Identifier: Apache-2.0
 */

apply plugin: 'com.android.library'

android {
    namespace 'org.microg.signature.fake'
    compileSdk androidCompileSdk

    defaultConfig {
        minSdk androidMinSdk
        targetSdk androidTargetSdk
    }

    buildFeatures {
        aidl = true
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
}
 No newline at end of file
+1190 −0

File added.

Preview size limit exceeded, changes collapsed.

+14 −0
Original line number Diff line number Diff line
/*
 * SPDX-FileCopyrightText: 2023 microG Project Team
 * SPDX-License-Identifier: Apache-2.0
 */

package com.huawei.signature.diff;

/**
 * Interface for Huawei Differentiated Signature Capability
 * See https://forums.developer.huawei.com/forumPortal/en/topic/0202128603315033024
 */
interface ISignatureService {
    String[] querySignature(String packageName, boolean suggested);
}
 No newline at end of file
+73 −0
Original line number Diff line number Diff line
/*
 * SPDX-FileCopyrightText: 2023 microG Project Team
 * SPDX-License-Identifier: Apache-2.0
 */

package com.huawei.signature.diff;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import org.microg.signature.fake.R;

public class AppListDatabaseOpenHelper extends SQLiteOpenHelper {
    private static final String TAG = AppListDatabaseOpenHelper.class.getSimpleName();
    private static final String DATABASE_NAME = "app_list.db";
    public static final String TABLE_APPLIST = "applist";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_FAKE = "fake";
    private static final int DATABASE_VERSION = 2;
    private static final String DROP_APP_LIST_TABLE = "DROP TABLE IF EXISTS " + TABLE_APPLIST;
    private static final String CREATE_APP_LIST_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_APPLIST + "(" +
            COLUMN_NAME + " VARCHAR(255) PRIMARY KEY, " +
            COLUMN_FAKE + " INTEGER CHECK(" + COLUMN_FAKE + " >= 0 and " + COLUMN_FAKE + " <= 1)" +
            ")";
    private final Context context;

    public AppListDatabaseOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d(TAG, "onCreate");
        db.execSQL(DROP_APP_LIST_TABLE);
        db.execSQL(CREATE_APP_LIST_TABLE);
        initData(db);
    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        initData(db);
    }

    private void initData(SQLiteDatabase db) {
        String[] wantFakeApps = context.getResources().getStringArray(R.array.signature_want_fake);
        String[] neverFakeApps = context.getResources().getStringArray(R.array.signature_never_fake);
        if (wantFakeApps.length == 0 && neverFakeApps.length == 0) {
            return;
        }
        for (String app : wantFakeApps) {
            db.insertWithOnConflict(TABLE_APPLIST, null, generateValues(app, true), SQLiteDatabase.CONFLICT_IGNORE);
        }
        for (String app : neverFakeApps) {
            db.insertWithOnConflict(TABLE_APPLIST, null, generateValues(app, false), SQLiteDatabase.CONFLICT_IGNORE);
        }
    }

    private ContentValues generateValues(String packageName, boolean fake) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_NAME, packageName);
        contentValues.put(COLUMN_FAKE, fake ? 1 : 0);
        return contentValues;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onCreate(db);
    }
}
 No newline at end of file
+69 −0
Original line number Diff line number Diff line
/*
 * SPDX-FileCopyrightText: 2023 microG Project Team
 * SPDX-License-Identifier: Apache-2.0
 */

package com.huawei.signature.diff;

import android.app.ActivityManager;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import java.util.List;

public class InitProvider extends ContentProvider {
    private static final String TAG = InitProvider.class.getSimpleName();

    @Override
    public boolean onCreate() {
        Log.d(TAG, "onCreate");
        if (!isServiceRunning(getContext(), getContext().getPackageName(), SignatureService.class.getName())) {
            Intent intent = new Intent(getContext(), SignatureService.class);
            getContext().startService(intent);
        }
        return false;
    }

    private boolean isServiceRunning(Context context, String packageName, String serviceName) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningServiceInfo> serviceInfoList = manager.getRunningServices(Integer.MAX_VALUE);
        if (serviceInfoList == null) {
            return false;
        }
        for (ActivityManager.RunningServiceInfo info : serviceInfoList) {
            if (info.service.getPackageName().equals(packageName) && info.service.getClassName().equals(serviceName)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}
 No newline at end of file
Loading