blob: 9137a3bcbf2b718406bf6929fd87dd35d924526f [file] [log] [blame]
/*
* Copyright (C) 2018 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.server.slice;
import android.app.slice.SliceProvider;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Process;
import android.os.ShellCommand;
import android.util.ArraySet;
import java.io.PrintWriter;
import java.util.List;
import java.util.Set;
public class SliceShellCommand extends ShellCommand {
private final SliceManagerService mService;
public SliceShellCommand(SliceManagerService service) {
mService = service;
}
@Override
public int onCommand(String cmd) {
if (cmd == null) {
return handleDefaultCommands(cmd);
}
switch (cmd) {
case "get-permissions":
return runGetPermissions(getNextArgRequired());
}
return 0;
}
@Override
public void onHelp() {
final PrintWriter pw = getOutPrintWriter();
pw.println("Status bar commands:");
pw.println(" help");
pw.println(" Print this help text.");
pw.println("");
pw.println(" get-permissions <authority>");
pw.println(" List the pkgs that have permission to an authority.");
pw.println("");
}
private int runGetPermissions(String authority) {
if (Binder.getCallingUid() != Process.SHELL_UID
&& Binder.getCallingUid() != Process.ROOT_UID) {
getOutPrintWriter().println("Only shell can get permissions");
return -1;
}
Context context = mService.getContext();
long ident = Binder.clearCallingIdentity();
try {
Uri uri = new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(authority)
.build();
if (!SliceProvider.SLICE_TYPE.equals(context.getContentResolver().getType(uri))) {
getOutPrintWriter().println(authority + " is not a slice provider");
return -1;
}
Bundle b = context.getContentResolver().call(uri, SliceProvider.METHOD_GET_PERMISSIONS,
null, null);
if (b == null) {
getOutPrintWriter().println("An error occurred getting permissions");
return -1;
}
String[] permissions = b.getStringArray(SliceProvider.EXTRA_RESULT);
final PrintWriter pw = getOutPrintWriter();
Set<String> listedPackages = new ArraySet<>();
if (permissions != null && permissions.length != 0) {
List<PackageInfo> apps =
context.getPackageManager().getPackagesHoldingPermissions(permissions, 0);
for (PackageInfo app : apps) {
pw.println(app.packageName);
listedPackages.add(app.packageName);
}
}
for (String pkg : mService.getAllPackagesGranted(authority)) {
if (!listedPackages.contains(pkg)) {
pw.println(pkg);
listedPackages.add(pkg);
}
}
} finally {
Binder.restoreCallingIdentity(ident);
}
return 0;
}
}