Merge changes Ic2e27f56,Ie19e0995 am: 95f507f80d

am: 6245e7efe6

Change-Id: Ic44dfe2b3defa6f60bee6062c049ff189223cb50
This commit is contained in:
Steven Moreland
2019-06-24 14:46:25 -07:00
committed by android-build-merger
3 changed files with 7 additions and 174 deletions

View File

@@ -57,13 +57,6 @@ public interface IServiceManager extends IInterface
*/
String[] listServices(int dumpFlags) throws RemoteException;
/**
* Assign a permission controller to the service manager. After set, this
* interface is checked before any services are added.
*/
void setPermissionController(IPermissionController controller)
throws RemoteException;
static final String descriptor = "android.os.IServiceManager";
int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;

View File

@@ -17,16 +17,18 @@
package android.os;
import android.annotation.UnsupportedAppUsage;
import java.util.ArrayList;
import java.util.ArrayList;
/**
* Native implementation of the service manager. Most clients will only
* care about getDefault() and possibly asInterface().
* care about asInterface().
*
* @hide
*/
public abstract class ServiceManagerNative extends Binder implements IServiceManager
{
public final class ServiceManagerNative {
private ServiceManagerNative() {}
/**
* Cast a Binder object into a service manager interface, generating
* a proxy if needed.
@@ -38,76 +40,13 @@ public abstract class ServiceManagerNative extends Binder implements IServiceMan
return null;
}
IServiceManager in =
(IServiceManager)obj.queryLocalInterface(descriptor);
(IServiceManager) obj.queryLocalInterface(IServiceManager.descriptor);
if (in != null) {
return in;
}
return new ServiceManagerProxy(obj);
}
public ServiceManagerNative()
{
attachInterface(this, descriptor);
}
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
{
try {
switch (code) {
case IServiceManager.GET_SERVICE_TRANSACTION: {
data.enforceInterface(IServiceManager.descriptor);
String name = data.readString();
IBinder service = getService(name);
reply.writeStrongBinder(service);
return true;
}
case IServiceManager.CHECK_SERVICE_TRANSACTION: {
data.enforceInterface(IServiceManager.descriptor);
String name = data.readString();
IBinder service = checkService(name);
reply.writeStrongBinder(service);
return true;
}
case IServiceManager.ADD_SERVICE_TRANSACTION: {
data.enforceInterface(IServiceManager.descriptor);
String name = data.readString();
IBinder service = data.readStrongBinder();
boolean allowIsolated = data.readInt() != 0;
int dumpPriority = data.readInt();
addService(name, service, allowIsolated, dumpPriority);
return true;
}
case IServiceManager.LIST_SERVICES_TRANSACTION: {
data.enforceInterface(IServiceManager.descriptor);
int dumpPriority = data.readInt();
String[] list = listServices(dumpPriority);
reply.writeStringArray(list);
return true;
}
case IServiceManager.SET_PERMISSION_CONTROLLER_TRANSACTION: {
data.enforceInterface(IServiceManager.descriptor);
IPermissionController controller =
IPermissionController.Stub.asInterface(
data.readStrongBinder());
setPermissionController(controller);
return true;
}
}
} catch (RemoteException e) {
}
return false;
}
public IBinder asBinder()
{
return this;
}
}
class ServiceManagerProxy implements IServiceManager {
@@ -188,17 +127,6 @@ class ServiceManagerProxy implements IServiceManager {
return array;
}
public void setPermissionController(IPermissionController controller)
throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IServiceManager.descriptor);
data.writeStrongBinder(controller.asBinder());
mRemote.transact(SET_PERMISSION_CONTROLLER_TRANSACTION, data, reply, 0);
reply.recycle();
data.recycle();
}
@UnsupportedAppUsage
private IBinder mRemote;
}

View File

@@ -1,88 +0,0 @@
/*
* Copyright (C) 2009 The Android Open Source Project
*
* 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 com.android.framework.permission.tests;
import com.android.internal.os.BinderInternal;
import android.app.AppOpsManager;
import android.os.Binder;
import android.os.IPermissionController;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManagerNative;
import android.test.suitebuilder.annotation.SmallTest;
import junit.framework.TestCase;
/**
* TODO: Remove this. This is only a placeholder, need to implement this.
*/
public class ServiceManagerPermissionTests extends TestCase {
@SmallTest
public void testAddService() {
try {
// The security in the service manager is that you can't replace
// a service that is already published.
Binder binder = new Binder();
ServiceManager.addService("activity", binder);
fail("ServiceManager.addService did not throw SecurityException as"
+ " expected");
} catch (SecurityException e) {
// expected
}
}
@SmallTest
public void testSetPermissionController() {
try {
IPermissionController pc = new IPermissionController.Stub() {
@Override
public boolean checkPermission(java.lang.String permission, int pid, int uid) {
return true;
}
@Override
public int noteOp(String op, int uid, String packageName) {
return AppOpsManager.MODE_ALLOWED;
}
@Override
public String[] getPackagesForUid(int uid) {
return new String[0];
}
@Override
public boolean isRuntimePermission(String permission) {
return false;
}
@Override
public int getPackageUid(String packageName, int flags) {
return -1;
}
};
ServiceManagerNative.asInterface(BinderInternal.getContextObject())
.setPermissionController(pc);
fail("IServiceManager.setPermissionController did not throw SecurityException as"
+ " expected");
} catch (SecurityException e) {
// expected
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
}
}