Merge changes Ic2e27f56,Ie19e0995 am: 95f507f80d
am: 6245e7efe6
Change-Id: Ic44dfe2b3defa6f60bee6062c049ff189223cb50
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user