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;
|
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";
|
static final String descriptor = "android.os.IServiceManager";
|
||||||
|
|
||||||
int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
|
int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
|
||||||
|
|||||||
@@ -17,16 +17,18 @@
|
|||||||
package android.os;
|
package android.os;
|
||||||
|
|
||||||
import android.annotation.UnsupportedAppUsage;
|
import android.annotation.UnsupportedAppUsage;
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Native implementation of the service manager. Most clients will only
|
* Native implementation of the service manager. Most clients will only
|
||||||
* care about getDefault() and possibly asInterface().
|
* care about asInterface().
|
||||||
|
*
|
||||||
* @hide
|
* @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
|
* Cast a Binder object into a service manager interface, generating
|
||||||
* a proxy if needed.
|
* a proxy if needed.
|
||||||
@@ -38,76 +40,13 @@ public abstract class ServiceManagerNative extends Binder implements IServiceMan
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
IServiceManager in =
|
IServiceManager in =
|
||||||
(IServiceManager)obj.queryLocalInterface(descriptor);
|
(IServiceManager) obj.queryLocalInterface(IServiceManager.descriptor);
|
||||||
if (in != null) {
|
if (in != null) {
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ServiceManagerProxy(obj);
|
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 {
|
class ServiceManagerProxy implements IServiceManager {
|
||||||
@@ -188,17 +127,6 @@ class ServiceManagerProxy implements IServiceManager {
|
|||||||
return array;
|
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
|
@UnsupportedAppUsage
|
||||||
private IBinder mRemote;
|
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