blob: b245e987022d61c8c93fbda6c06a9e1d12bc98d0 [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;
Eugene Suslaa2a80322018-12-12 17:09:38 -080026import android.util.Log;
Jeff Sharkey6260c582018-11-27 13:05:15 -070027
28import java.io.PrintWriter;
29import java.util.concurrent.CompletableFuture;
30import java.util.concurrent.TimeUnit;
31
32class RoleManagerShellCommand extends ShellCommand {
Hai Zhang458cedb2018-12-03 15:41:11 -080033
34 @NonNull
Jeff Sharkey6260c582018-11-27 13:05:15 -070035 private final IRoleManager mRoleManager;
36
Hai Zhang458cedb2018-12-03 15:41:11 -080037 RoleManagerShellCommand(@NonNull IRoleManager roleManager) {
Jeff Sharkey6260c582018-11-27 13:05:15 -070038 mRoleManager = roleManager;
39 }
40
41 private class Callback extends IRoleManagerCallback.Stub {
Hai Zhang458cedb2018-12-03 15:41:11 -080042
43 @NonNull
Jeff Sharkey6260c582018-11-27 13:05:15 -070044 private final CompletableFuture<Void> mResult = new CompletableFuture<>();
45
46 public int waitForResult() {
47 try {
48 mResult.get(5, TimeUnit.SECONDS);
49 return 0;
50 } catch (Exception e) {
Eugene Suslaa2a80322018-12-12 17:09:38 -080051 getErrPrintWriter().println("Error: see logcat for details.\n"
52 + Log.getStackTraceString(e));
Jeff Sharkey6260c582018-11-27 13:05:15 -070053 return -1;
54 }
55 }
56
57 @Override
58 public void onSuccess() {
59 mResult.complete(null);
60 }
61
62 @Override
63 public void onFailure() {
64 mResult.completeExceptionally(new RuntimeException("Failed"));
65 }
66 }
67
68 @Override
Hai Zhang458cedb2018-12-03 15:41:11 -080069 public int onCommand(@Nullable String cmd) {
Jeff Sharkey6260c582018-11-27 13:05:15 -070070 if (cmd == null) {
71 return handleDefaultCommands(cmd);
72 }
73
74 PrintWriter pw = getOutPrintWriter();
75 try {
76 switch (cmd) {
77 case "add-role-holder":
78 return runAddRoleHolder();
79 case "remove-role-holder":
80 return runRemoveRoleHolder();
81 case "clear-role-holders":
82 return runClearRoleHolders();
83 default:
84 return handleDefaultCommands(cmd);
85 }
86 } catch (RemoteException e) {
87 pw.println("Remote exception: " + e);
88 }
89 return -1;
90 }
91
92 private int getUserIdMaybe() {
93 int userId = UserHandle.USER_SYSTEM;
94 String option = getNextOption();
95 if (option != null && option.equals("--user")) {
96 userId = UserHandle.parseUserArg(getNextArgRequired());
97 }
98 return userId;
99 }
100
101 private int runAddRoleHolder() throws RemoteException {
102 int userId = getUserIdMaybe();
103 String roleName = getNextArgRequired();
104 String packageName = getNextArgRequired();
105
106 Callback callback = new Callback();
107 mRoleManager.addRoleHolderAsUser(roleName, packageName, userId, callback);
108 return callback.waitForResult();
109 }
110
111 private int runRemoveRoleHolder() throws RemoteException {
112 int userId = getUserIdMaybe();
113 String roleName = getNextArgRequired();
114 String packageName = getNextArgRequired();
115
116 Callback callback = new Callback();
117 mRoleManager.removeRoleHolderAsUser(roleName, packageName, userId, callback);
118 return callback.waitForResult();
119 }
120
121 private int runClearRoleHolders() throws RemoteException {
122 int userId = getUserIdMaybe();
123 String roleName = getNextArgRequired();
124
125 Callback callback = new Callback();
126 mRoleManager.clearRoleHoldersAsUser(roleName, userId, callback);
127 return callback.waitForResult();
128 }
129
130 @Override
131 public void onHelp() {
132 PrintWriter pw = getOutPrintWriter();
133 pw.println("Role manager (role) commands:");
134 pw.println(" help");
135 pw.println(" Print this help text.");
136 pw.println();
137 pw.println(" add-role-holder [--user USER_ID] ROLE PACKAGE");
138 pw.println(" remove-role-holder [--user USER_ID] ROLE PACKAGE");
139 pw.println(" clear-role-holders [--user USER_ID] ROLE");
140 pw.println();
141 }
142}