blob: 336b311723a94fec757a2a34b83aee8da957e5b8 [file] [log] [blame]
Jeff Sharkey6260c582018-11-27 13:05:15 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.role;
18
Hai Zhang458cedb2018-12-03 15:41:11 -080019import android.annotation.NonNull;
20import android.annotation.Nullable;
Jeff Sharkey6260c582018-11-27 13:05:15 -070021import android.app.role.IRoleManager;
22import android.app.role.IRoleManagerCallback;
23import android.os.RemoteException;
24import android.os.ShellCommand;
25import android.os.UserHandle;
26
27import java.io.PrintWriter;
28import java.util.concurrent.CompletableFuture;
29import java.util.concurrent.TimeUnit;
30
31class RoleManagerShellCommand extends ShellCommand {
Hai Zhang458cedb2018-12-03 15:41:11 -080032
33 @NonNull
Jeff Sharkey6260c582018-11-27 13:05:15 -070034 private final IRoleManager mRoleManager;
35
Hai Zhang458cedb2018-12-03 15:41:11 -080036 RoleManagerShellCommand(@NonNull IRoleManager roleManager) {
Jeff Sharkey6260c582018-11-27 13:05:15 -070037 mRoleManager = roleManager;
38 }
39
40 private class Callback extends IRoleManagerCallback.Stub {
Hai Zhang458cedb2018-12-03 15:41:11 -080041
42 @NonNull
Jeff Sharkey6260c582018-11-27 13:05:15 -070043 private final CompletableFuture<Void> mResult = new CompletableFuture<>();
44
45 public int waitForResult() {
46 try {
47 mResult.get(5, TimeUnit.SECONDS);
48 return 0;
49 } catch (Exception e) {
50 getErrPrintWriter().println("Error: " + e.toString());
51 return -1;
52 }
53 }
54
55 @Override
56 public void onSuccess() {
57 mResult.complete(null);
58 }
59
60 @Override
61 public void onFailure() {
62 mResult.completeExceptionally(new RuntimeException("Failed"));
63 }
64 }
65
66 @Override
Hai Zhang458cedb2018-12-03 15:41:11 -080067 public int onCommand(@Nullable String cmd) {
Jeff Sharkey6260c582018-11-27 13:05:15 -070068 if (cmd == null) {
69 return handleDefaultCommands(cmd);
70 }
71
72 PrintWriter pw = getOutPrintWriter();
73 try {
74 switch (cmd) {
75 case "add-role-holder":
76 return runAddRoleHolder();
77 case "remove-role-holder":
78 return runRemoveRoleHolder();
79 case "clear-role-holders":
80 return runClearRoleHolders();
81 default:
82 return handleDefaultCommands(cmd);
83 }
84 } catch (RemoteException e) {
85 pw.println("Remote exception: " + e);
86 }
87 return -1;
88 }
89
90 private int getUserIdMaybe() {
91 int userId = UserHandle.USER_SYSTEM;
92 String option = getNextOption();
93 if (option != null && option.equals("--user")) {
94 userId = UserHandle.parseUserArg(getNextArgRequired());
95 }
96 return userId;
97 }
98
99 private int runAddRoleHolder() throws RemoteException {
100 int userId = getUserIdMaybe();
101 String roleName = getNextArgRequired();
102 String packageName = getNextArgRequired();
103
104 Callback callback = new Callback();
105 mRoleManager.addRoleHolderAsUser(roleName, packageName, userId, callback);
106 return callback.waitForResult();
107 }
108
109 private int runRemoveRoleHolder() throws RemoteException {
110 int userId = getUserIdMaybe();
111 String roleName = getNextArgRequired();
112 String packageName = getNextArgRequired();
113
114 Callback callback = new Callback();
115 mRoleManager.removeRoleHolderAsUser(roleName, packageName, userId, callback);
116 return callback.waitForResult();
117 }
118
119 private int runClearRoleHolders() throws RemoteException {
120 int userId = getUserIdMaybe();
121 String roleName = getNextArgRequired();
122
123 Callback callback = new Callback();
124 mRoleManager.clearRoleHoldersAsUser(roleName, userId, callback);
125 return callback.waitForResult();
126 }
127
128 @Override
129 public void onHelp() {
130 PrintWriter pw = getOutPrintWriter();
131 pw.println("Role manager (role) commands:");
132 pw.println(" help");
133 pw.println(" Print this help text.");
134 pw.println();
135 pw.println(" add-role-holder [--user USER_ID] ROLE PACKAGE");
136 pw.println(" remove-role-holder [--user USER_ID] ROLE PACKAGE");
137 pw.println(" clear-role-holders [--user USER_ID] ROLE");
138 pw.println();
139 }
140}