1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "edm_command.h"
17
18 #include <iostream>
19 #include <string_ex.h>
20
21 #include "element_name.h"
22
23 namespace OHOS {
24 namespace EDM {
25 constexpr int32_t ARR_INDEX_ZERO = 0;
26 constexpr int32_t ARR_INDEX_ONE = 1;
27 constexpr int32_t ARR_INDEX_TWO = 2;
28
29 constexpr size_t ARGS_SIZE_TWO = 2;
30 constexpr size_t ARGS_SIZE_THREE = 3;
31
32 constexpr int32_t DEFAULT_USER_ID = 100;
33
EdmCommand(int argc,char * argv[])34 EdmCommand::EdmCommand(int argc, char *argv[])
35 : ShellCommand(argc, argv, TOOL_NAME)
36 {}
37
CreateCommandMap()38 ErrCode EdmCommand::CreateCommandMap()
39 {
40 commandMap_ = {
41 { "help", std::bind(&EdmCommand::RunAsHelpCommand, this) },
42 { "enable-admin", std::bind(&EdmCommand::RunAsEnableAdminCommand, this) },
43 { "enable-super-admin",
44 std::bind(&EdmCommand::RunAsEnableSuperAdminCommand, this) },
45 { "disable-admin",
46 std::bind(&EdmCommand::RunDisableNormalAdminCommand, this) },
47 };
48
49 return ERR_OK;
50 }
51
CreateMessageMap()52 ErrCode EdmCommand::CreateMessageMap()
53 {
54 messageMap_ = { // error + message
55 {
56 ERR_EDM_ADD_ADMIN_FAILED,
57 "error: add admin internal error.",
58 },
59 {
60 ERR_EDM_PERMISSION_ERROR,
61 "error: permission check failed.",
62 },
63 {
64 ERR_EDM_BMS_ERROR,
65 "error: get bundle manager or query infos failed.",
66 },
67 {
68 ERR_EDM_DENY_PERMISSION,
69 "error: permission requested by app is not allowed.",
70 },
71 {
72 ERR_EDM_DEL_ADMIN_FAILED,
73 "error: disable admin internal error.",
74 },
75 {
76 ERR_EDM_GET_PLUGIN_MGR_FAILED,
77 "error: get plugin manager internal error.",
78 },
79 {
80 ERR_EDM_PARAM_ERROR,
81 "error: param count or value invalid",
82 }
83 };
84
85 return ERR_OK;
86 }
87
init()88 ErrCode EdmCommand::init()
89 {
90 if (!enterpriseDeviceMgrProxy_) {
91 enterpriseDeviceMgrProxy_ = EnterpriseDeviceMgrProxy::GetInstance();
92 }
93 return ERR_OK;
94 }
95
RunAsHelpCommand()96 ErrCode EdmCommand::RunAsHelpCommand()
97 {
98 resultReceiver_.append(HELP_MSG);
99
100 return ERR_OK;
101 }
102
RunAsEnableAdminCommand()103 ErrCode EdmCommand::RunAsEnableAdminCommand()
104 {
105 return RunAsEnableCommand(AdminType::NORMAL);
106 }
107
RunAsEnableSuperAdminCommand()108 ErrCode EdmCommand::RunAsEnableSuperAdminCommand()
109 {
110 return RunAsEnableCommand(AdminType::ENT);
111 }
112
RunAsEnableCommand(AdminType type)113 ErrCode EdmCommand::RunAsEnableCommand(AdminType type)
114 {
115 std::cout << "argc = " << argc_ << std::endl;
116 if (argc_ != ARGS_SIZE_THREE) {
117 resultReceiver_.append(GetMessageFromCode(ERR_EDM_PARAM_ERROR));
118 return ERR_EDM_PARAM_ERROR;
119 }
120 std::vector<std::string> elementNameStr = split(argv_[ARR_INDEX_TWO], "/");
121 if (elementNameStr.size() != ARGS_SIZE_TWO) {
122 resultReceiver_.append(GetMessageFromCode(ERR_EDM_PARAM_ERROR));
123 return ERR_EDM_PARAM_ERROR;
124 }
125 OHOS::AppExecFwk::ElementName elementName;
126 elementName.SetElementBundleName(&elementName, elementNameStr[ARR_INDEX_ZERO].c_str());
127 elementName.SetElementAbilityName(&elementName, elementNameStr[ARR_INDEX_ONE].c_str());
128 EntInfo info;
129 ErrCode result = enterpriseDeviceMgrProxy_->EnableAdmin(elementName, info, type, DEFAULT_USER_ID);
130 if (result != ERR_OK) {
131 resultReceiver_.append(GetMessageFromCode(result));
132 }
133 return result;
134 }
135
split(const std::string & str,const std::string & pattern)136 std::vector<std::string> EdmCommand::split(const std::string &str, const std::string &pattern)
137 {
138 std::vector<std::string> res;
139 if (str == "") {
140 return res;
141 }
142 std::string strs = str + pattern;
143 size_t pos = strs.find(pattern);
144
145 while (pos != strs.npos) {
146 std::string temp = strs.substr(0, pos);
147 res.push_back(temp);
148 strs = strs.substr(pos + 1, strs.size());
149 pos = strs.find(pattern);
150 }
151 return res;
152 }
153
RunDisableNormalAdminCommand()154 ErrCode EdmCommand::RunDisableNormalAdminCommand()
155 {
156 std::cout << "argc = " << argc_ << std::endl;
157 if (argc_ != ARGS_SIZE_THREE) {
158 resultReceiver_.append(GetMessageFromCode(ERR_EDM_PARAM_ERROR));
159 return ERR_EDM_PARAM_ERROR;
160 }
161 for (int i = 0; i < argc_; ++i) {
162 std::cout << "argv[" << i << "] = " << argv_[i] << std::endl;
163 }
164 std::vector<std::string> elementNameStr = split(argv_[ARR_INDEX_TWO], "/");
165 std::cout << "elementNameStr.size() = " << elementNameStr.size() << std::endl;
166 if (elementNameStr.size() != ARGS_SIZE_TWO) {
167 resultReceiver_.append(GetMessageFromCode(ERR_EDM_PARAM_ERROR));
168 return ERR_EDM_PARAM_ERROR;
169 }
170 OHOS::AppExecFwk::ElementName elementName;
171 elementName.SetElementBundleName(&elementName, elementNameStr[ARR_INDEX_ZERO].c_str());
172 elementName.SetElementAbilityName(&elementName, elementNameStr[ARR_INDEX_ONE].c_str());
173 ErrCode result = enterpriseDeviceMgrProxy_->DisableAdmin(elementName, DEFAULT_USER_ID);
174 if (result != ERR_OK) {
175 resultReceiver_.append(GetMessageFromCode(result));
176 }
177 return result;
178 }
179 } // namespace EDM
180 } // namespace OHOS
181