blob: b26a070f3978f7d87656c6314c57fd71e6a92256 [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;
Hai Zhangf5e8ccd2019-03-06 20:12:24 -080022import android.os.RemoteCallback;
Jeff Sharkey6260c582018-11-27 13:05:15 -070023import 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
Hai Zhangf5e8ccd2019-03-06 20:12:24 -080041 private class CallbackFuture extends CompletableFuture<Void> {
Hai Zhang458cedb2018-12-03 15:41:11 -080042
43 @NonNull
Hai Zhangf5e8ccd2019-03-06 20:12:24 -080044 public RemoteCallback createCallback() {
45 return new RemoteCallback(result -> {
46 boolean successful = result != null;
47 if (successful) {
48 complete(null);
49 } else {
50 completeExceptionally(new RuntimeException("Failed"));
51 }
52 });
53 }
Jeff Sharkey6260c582018-11-27 13:05:15 -070054
55 public int waitForResult() {
56 try {
Hai Zhangf5e8ccd2019-03-06 20:12:24 -080057 get(5, TimeUnit.SECONDS);
Jeff Sharkey6260c582018-11-27 13:05:15 -070058 return 0;
59 } catch (Exception e) {
Eugene Suslaa2a80322018-12-12 17:09:38 -080060 getErrPrintWriter().println("Error: see logcat for details.\n"
61 + Log.getStackTraceString(e));
Jeff Sharkey6260c582018-11-27 13:05:15 -070062 return -1;
63 }
64 }
Jeff Sharkey6260c582018-11-27 13:05:15 -070065 }
66
67 @Override
Hai Zhang458cedb2018-12-03 15:41:11 -080068 public int onCommand(@Nullable String cmd) {
Jeff Sharkey6260c582018-11-27 13:05:15 -070069 if (cmd == null) {
70 return handleDefaultCommands(cmd);
71 }
72
73 PrintWriter pw = getOutPrintWriter();
74 try {
75 switch (cmd) {
76 case "add-role-holder":
77 return runAddRoleHolder();
78 case "remove-role-holder":
79 return runRemoveRoleHolder();
80 case "clear-role-holders":
81 return runClearRoleHolders();
82 default:
83 return handleDefaultCommands(cmd);
84 }
85 } catch (RemoteException e) {
86 pw.println("Remote exception: " + e);
87 }
88 return -1;
89 }
90
91 private int getUserIdMaybe() {
92 int userId = UserHandle.USER_SYSTEM;
93 String option = getNextOption();
94 if (option != null && option.equals("--user")) {
95 userId = UserHandle.parseUserArg(getNextArgRequired());
96 }
97 return userId;
98 }
99
Hai Zhang71d70362019-02-04 16:17:38 -0800100 private int getFlagsMaybe() {
101 String flags = getNextArg();
102 if (flags == null) {
103 return 0;
104 }
105 return Integer.parseInt(flags);
106 }
107
Jeff Sharkey6260c582018-11-27 13:05:15 -0700108 private int runAddRoleHolder() throws RemoteException {
109 int userId = getUserIdMaybe();
110 String roleName = getNextArgRequired();
111 String packageName = getNextArgRequired();
Hai Zhang71d70362019-02-04 16:17:38 -0800112 int flags = getFlagsMaybe();
Jeff Sharkey6260c582018-11-27 13:05:15 -0700113
Hai Zhangf5e8ccd2019-03-06 20:12:24 -0800114 CallbackFuture future = new CallbackFuture();
115 mRoleManager.addRoleHolderAsUser(roleName, packageName, flags, userId,
116 future.createCallback());
117 return future.waitForResult();
Jeff Sharkey6260c582018-11-27 13:05:15 -0700118 }
119
120 private int runRemoveRoleHolder() throws RemoteException {
121 int userId = getUserIdMaybe();
122 String roleName = getNextArgRequired();
123 String packageName = getNextArgRequired();
Hai Zhang71d70362019-02-04 16:17:38 -0800124 int flags = getFlagsMaybe();
Jeff Sharkey6260c582018-11-27 13:05:15 -0700125
Hai Zhangf5e8ccd2019-03-06 20:12:24 -0800126 CallbackFuture future = new CallbackFuture();
127 mRoleManager.removeRoleHolderAsUser(roleName, packageName, flags, userId,
128 future.createCallback());
129 return future.waitForResult();
Jeff Sharkey6260c582018-11-27 13:05:15 -0700130 }
131
132 private int runClearRoleHolders() throws RemoteException {
133 int userId = getUserIdMaybe();
134 String roleName = getNextArgRequired();
Hai Zhang71d70362019-02-04 16:17:38 -0800135 int flags = getFlagsMaybe();
Jeff Sharkey6260c582018-11-27 13:05:15 -0700136
Hai Zhangf5e8ccd2019-03-06 20:12:24 -0800137 CallbackFuture future = new CallbackFuture();
138 mRoleManager.clearRoleHoldersAsUser(roleName, flags, userId, future.createCallback());
139 return future.waitForResult();
Jeff Sharkey6260c582018-11-27 13:05:15 -0700140 }
141
142 @Override
143 public void onHelp() {
144 PrintWriter pw = getOutPrintWriter();
145 pw.println("Role manager (role) commands:");
146 pw.println(" help");
147 pw.println(" Print this help text.");
148 pw.println();
Hai Zhang71d70362019-02-04 16:17:38 -0800149 pw.println(" add-role-holder [--user USER_ID] ROLE PACKAGE [FLAGS]");
150 pw.println(" remove-role-holder [--user USER_ID] ROLE PACKAGE [FLAGS]");
151 pw.println(" clear-role-holders [--user USER_ID] ROLE [FLAGS]");
Jeff Sharkey6260c582018-11-27 13:05:15 -0700152 pw.println();
153 }
154}