Verified Commit 3d2c7e95 authored by Marvin W.'s avatar Marvin W. 🐿
Browse files

Add DroidGuard service API and client

parent 2fbe0a09
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
apply plugin: 'signing'
android {
compileSdkVersion androidCompileSdk
buildToolsVersion "$androidBuildVersionTools"
defaultConfig {
versionName version
minSdkVersion androidMinSdk
targetSdkVersion androidTargetSdk
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
apply from: '../gradle/publish-android.gradle'
description = 'microG API for play-services-droidguard'
dependencies {
api project(':play-services-basement')
api project(':play-services-base-api')
implementation "androidx.annotation:annotation:$annotationVersion"
}
<?xml version="1.0" encoding="utf-8"?>
<!--
~ SPDX-FileCopyrightText: 2020, microG Project Team
~ SPDX-License-Identifier: Apache-2.0
-->
<manifest package="org.microg.gms.droidguard.api"/>
package com.google.android.gms.droidguard.internal;
parcelable DroidGuardInitReply;
package com.google.android.gms.droidguard.internal;
parcelable DroidGuardResultsRequest;
package com.google.android.gms.droidguard.internal;
interface IDroidGuardCallbacks {
void onResult(in byte[] res);
}
package com.google.android.gms.droidguard.internal;
import com.google.android.gms.droidguard.internal.DroidGuardInitReply;
import com.google.android.gms.droidguard.internal.DroidGuardResultsRequest;
interface IDroidGuardHandle {
void init(String flow) = 0;
DroidGuardInitReply initWithRequest(String flow, in DroidGuardResultsRequest request) = 4;
byte[] guard(in Map map) = 1;
void close() = 2;
}
package com.google.android.gms.droidguard.internal;
import com.google.android.gms.droidguard.internal.IDroidGuardCallbacks;
import com.google.android.gms.droidguard.internal.IDroidGuardHandle;
import com.google.android.gms.droidguard.internal.DroidGuardResultsRequest;
interface IDroidGuardService {
void guard(IDroidGuardCallbacks callbacks, String flow, in Map map) = 0;
void guardWithRequest(IDroidGuardCallbacks callbacks, String flow, in Map map, in DroidGuardResultsRequest request) = 3;
IDroidGuardHandle getHandle() = 1;
int getClientTimeoutMillis() = 2;
}
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.droidguard.internal;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
public class DroidGuardInitReply implements Parcelable {
public ParcelFileDescriptor pfd;
public Parcelable object;
public DroidGuardInitReply(ParcelFileDescriptor pfd, Parcelable object) {
this.pfd = pfd;
this.object = object;
}
@Override
public int describeContents() {
return (pfd != null ? Parcelable.CONTENTS_FILE_DESCRIPTOR : 0) | (object != null ? object.describeContents() : 0);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(pfd, flags);
dest.writeParcelable(object, flags);
}
public final static Creator<DroidGuardInitReply> CREATOR = new Creator<DroidGuardInitReply>() {
@Override
public DroidGuardInitReply createFromParcel(Parcel source) {
ParcelFileDescriptor pfd = source.readParcelable(ParcelFileDescriptor.class.getClassLoader());
Parcelable object = source.readParcelable(getClass().getClassLoader());
if (pfd != null && object != null) {
return new DroidGuardInitReply(pfd, object);
}
return null;
}
@Override
public DroidGuardInitReply[] newArray(int size) {
return new DroidGuardInitReply[size];
}
};
}
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.droidguard.internal;
import android.net.Network;
import android.os.Build;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import androidx.annotation.RequiresApi;
import org.microg.gms.common.Constants;
import org.microg.safeparcel.AutoSafeParcelable;
public class DroidGuardResultsRequest extends AutoSafeParcelable {
private static final String KEY_APP_ARCHITECTURE = "appArchitecture";
private static final String KEY_CLIENT_VERSION = "clientVersion";
private static final String KEY_FD = "fd";
private static final String KEY_NETWORK_TO_USE = "networkToUse";
private static final String KEY_TIMEOUT_MS = "timeoutMs";
public static final String KEY_OPEN_HANDLES = "openHandles";
@Field(2)
public Bundle bundle;
public DroidGuardResultsRequest() {
bundle = new Bundle();
String arch;
try {
arch = System.getProperty("os.arch");
} catch (Exception ignored) {
arch = "?";
}
bundle.putString(KEY_APP_ARCHITECTURE, arch);
setClientVersion(Constants.GMS_VERSION_CODE);
}
public String getAppArchitecture() {
return bundle.getString(KEY_APP_ARCHITECTURE);
}
public int getTimeoutMillis() {
return bundle.getInt(KEY_TIMEOUT_MS, 60000);
}
public DroidGuardResultsRequest setTimeoutMillis(int millis) {
bundle.putInt(KEY_TIMEOUT_MS, millis);
return this;
}
public int getClientVersion() {
return bundle.getInt(KEY_CLIENT_VERSION);
}
public DroidGuardResultsRequest setClientVersion(int clientVersion) {
bundle.putInt(KEY_CLIENT_VERSION, clientVersion);
return this;
}
public ParcelFileDescriptor getFd() {
return bundle.getParcelable(KEY_FD);
}
public DroidGuardResultsRequest setFd(ParcelFileDescriptor fd) {
bundle.putParcelable(KEY_FD, fd);
return this;
}
public int getOpenHandles() {
return bundle.getInt(KEY_OPEN_HANDLES);
}
public DroidGuardResultsRequest setOpenHandles(int openHandles) {
bundle.putInt(KEY_OPEN_HANDLES, openHandles);
return this;
}
@RequiresApi(api = 21)
public Network getNetworkToUse() {
return bundle.getParcelable(KEY_NETWORK_TO_USE);
}
@RequiresApi(api = 21)
public DroidGuardResultsRequest setNetworkToUse(Network networkToUse) {
bundle.putParcelable(KEY_NETWORK_TO_USE, networkToUse);
return this;
}
public static final Creator<DroidGuardResultsRequest> CREATOR = new AutoCreator<>(DroidGuardResultsRequest.class);
}
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'maven-publish'
apply plugin: 'signing'
android {
compileSdkVersion androidCompileSdk
buildToolsVersion "$androidBuildVersionTools"
defaultConfig {
versionName version
minSdkVersion androidMinSdk
targetSdkVersion androidTargetSdk
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
apply from: '../gradle/publish-android.gradle'
description = 'microG implementation of play-services-droidguard'
dependencies {
api project(':play-services-base')
api project(':play-services-droidguard-api')
implementation "androidx.annotation:annotation:$annotationVersion"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
}
<?xml version="1.0" encoding="utf-8"?>
<!--
~ SPDX-FileCopyrightText: 2020, microG Project Team
~ SPDX-License-Identifier: Apache-2.0
-->
<manifest package="org.microg.gms.droidguard"/>
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package org.microg.gms.droidguard
import android.content.Context
import android.os.IBinder
import com.google.android.gms.droidguard.internal.IDroidGuardHandle
import com.google.android.gms.droidguard.internal.IDroidGuardService
import org.microg.gms.common.GmsClient
import org.microg.gms.common.GmsService
import org.microg.gms.common.api.ConnectionCallbacks
import org.microg.gms.common.api.OnConnectionFailedListener
class DroidGuardApiClient(context: Context, connectionCallbacks: ConnectionCallbacks, onConnectionFailedListener: OnConnectionFailedListener) : GmsClient<IDroidGuardService>(context, connectionCallbacks, onConnectionFailedListener, GmsService.DROIDGUARD.ACTION) {
init {
serviceId = GmsService.DROIDGUARD.SERVICE_ID
}
override fun interfaceFromBinder(binder: IBinder): IDroidGuardService = IDroidGuardService.Stub.asInterface(binder)
fun getHandle() = serviceInterface.handle
}
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package org.microg.gms.droidguard
import com.google.android.gms.droidguard.internal.IDroidGuardHandle
import com.google.android.gms.tasks.Task
interface DroidGuardClient {
fun getHandle(): Task<DroidGuardHandle>
}
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package org.microg.gms.droidguard
import android.content.Context
import android.os.Looper
import com.google.android.gms.common.api.Api
import com.google.android.gms.common.api.Api.ApiOptions.NoOptions
import com.google.android.gms.common.api.GoogleApi
import com.google.android.gms.tasks.Task
import org.microg.gms.common.api.ApiClientBuilder
import org.microg.gms.common.api.ApiClientSettings
import org.microg.gms.common.api.ConnectionCallbacks
import org.microg.gms.common.api.OnConnectionFailedListener
class DroidGuardClientImpl(context: Context) : GoogleApi<NoOptions>(context, API), DroidGuardClient {
companion object {
private val API = Api(ApiClientBuilder { _: NoOptions?, context: Context, _: Looper?, _: ApiClientSettings?, callbacks: ConnectionCallbacks, connectionFailedListener: OnConnectionFailedListener -> DroidGuardApiClient(context, callbacks, connectionFailedListener) })
}
override fun getHandle(): Task<DroidGuardHandle> {
return scheduleTask { client: DroidGuardApiClient, completionSource ->
try {
completionSource.setResult(DroidGuardHandle(client.getHandle()))
} catch (e: Exception) {
completionSource.setException(e)
}
}
}
}
/*
* SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package org.microg.gms.droidguard
import com.google.android.gms.droidguard.internal.DroidGuardResultsRequest
import com.google.android.gms.droidguard.internal.IDroidGuardHandle
class DroidGuardHandle(private val handle: IDroidGuardHandle) {
private var state = 0
fun init(flow: String) {
if (state != 0) throw IllegalStateException("init() already called")
try {
handle.initWithRequest(flow, DroidGuardResultsRequest().setOpenHandles(openHandles++))
state = 1
} catch (e: Exception) {
state = -1
throw e
}
}
fun guard(map: Map<String, String>): ByteArray {
if (state != 1) throw IllegalStateException("init() must be called before guard()")
try {
return handle.guard(map)
} catch (e: Exception) {
state = -1
throw e
}
}
fun close() {
if (state != 1) throw IllegalStateException("init() must be called before close()")
try {
handle.close()
openHandles--
state = 2
} catch (e: Exception) {
state = -1
throw e
}
}
fun finalize() {
if (state == 1) close()
}
companion object {
private var openHandles = 0
}
}
......@@ -6,6 +6,7 @@ include ':play-services-appinvite-api'
include ':play-services-base-api'
include ':play-services-cast-api'
include ':play-services-cast-framework-api'
include ':play-services-droidguard-api'
include ':play-services-iid-api'
include ':play-services-location-api'
include ':play-services-nearby-api'
......@@ -41,6 +42,7 @@ include ':play-services-core'
include ':play-services-base'
include ':play-services-cast'
include ':play-services-droidguard'
include ':play-services-gcm'
include ':play-services-iid'
include ':play-services-location'
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment