1f7a47986Sopenharmony_ci/* 2f7a47986Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3f7a47986Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4f7a47986Sopenharmony_ci * you may not use this file except in compliance with the License. 5f7a47986Sopenharmony_ci * You may obtain a copy of the License at 6f7a47986Sopenharmony_ci * 7f7a47986Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8f7a47986Sopenharmony_ci * 9f7a47986Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10f7a47986Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11f7a47986Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f7a47986Sopenharmony_ci * See the License for the specific language governing permissions and 13f7a47986Sopenharmony_ci * limitations under the License. 14f7a47986Sopenharmony_ci */ 15f7a47986Sopenharmony_ci 16f7a47986Sopenharmony_ci#include "edm_command.h" 17f7a47986Sopenharmony_ci 18f7a47986Sopenharmony_ci#include <getopt.h> 19f7a47986Sopenharmony_ci#include <iostream> 20f7a47986Sopenharmony_ci#include <string> 21f7a47986Sopenharmony_ci 22f7a47986Sopenharmony_ci#include "admin_type.h" 23f7a47986Sopenharmony_ci#include "element_name.h" 24f7a47986Sopenharmony_ci 25f7a47986Sopenharmony_cinamespace OHOS { 26f7a47986Sopenharmony_cinamespace EDM { 27f7a47986Sopenharmony_ciconst std::string SHORT_OPTIONS = "hn:a:"; 28f7a47986Sopenharmony_ciconstexpr int32_t OPTION_NUM = 3; 29f7a47986Sopenharmony_ci 30f7a47986Sopenharmony_ciconst struct option LONG_OPTIONS[] = { 31f7a47986Sopenharmony_ci {"help", no_argument, nullptr, 'h'}, 32f7a47986Sopenharmony_ci {"bundle-name", required_argument, nullptr, 'n'}, 33f7a47986Sopenharmony_ci {"ability-name", required_argument, nullptr, 'a'} 34f7a47986Sopenharmony_ci}; 35f7a47986Sopenharmony_ci 36f7a47986Sopenharmony_ciEdmCommand::EdmCommand(int argc, char *argv[]) : ShellCommand(argc, argv, TOOL_NAME) {} 37f7a47986Sopenharmony_ci 38f7a47986Sopenharmony_ciErrCode EdmCommand::CreateCommandMap() 39f7a47986Sopenharmony_ci{ 40f7a47986Sopenharmony_ci commandMap_ = { 41f7a47986Sopenharmony_ci { "help", [this]{return this->RunAsHelpCommand();} }, 42f7a47986Sopenharmony_ci { "enable-admin", [this]{return this->RunAsEnableCommand();} }, 43f7a47986Sopenharmony_ci { "disable-admin", [this]{return this->RunAsDisableAdminCommand();} } 44f7a47986Sopenharmony_ci }; 45f7a47986Sopenharmony_ci return ERR_OK; 46f7a47986Sopenharmony_ci} 47f7a47986Sopenharmony_ci 48f7a47986Sopenharmony_ciErrCode EdmCommand::CreateMessageMap() 49f7a47986Sopenharmony_ci{ 50f7a47986Sopenharmony_ci messageMap_ = { // error + message 51f7a47986Sopenharmony_ci {ERR_EDM_TOOLS_COMMAND_NO_OPTION, "error: command requires option."}, 52f7a47986Sopenharmony_ci {ERR_EDM_TOOLS_COMMAND_N_OPTION_REQUIRES_AN_ARGUMENT, "error: -n, --bundle-name option requires an argument."}, 53f7a47986Sopenharmony_ci {ERR_EDM_TOOLS_COMMAND_A_OPTION_REQUIRES_AN_ARGUMENT, "error: -a, --ability-name option requires an argument."}, 54f7a47986Sopenharmony_ci {ERR_EDM_TOOLS_COMMAND_UNKNOWN_OPTION, "error: unknown option."}, 55f7a47986Sopenharmony_ci {ERR_EDM_TOOLS_COMMAND_NO_BUNDLE_NAME_OPTION, "error: -n <bundle-name> is expected."}, 56f7a47986Sopenharmony_ci {ERR_EDM_TOOLS_COMMAND_NO_ABILITY_NAME_OPTION, "error: -a <ability-name> is expected."}, 57f7a47986Sopenharmony_ci {EdmReturnErrCode::COMPONENT_INVALID, "error: the administrator ability component is invalid."}, 58f7a47986Sopenharmony_ci {EdmReturnErrCode::ENABLE_ADMIN_FAILED, "error: failed to enable the administrator application of the device."}, 59f7a47986Sopenharmony_ci {EdmReturnErrCode::DISABLE_ADMIN_FAILED, 60f7a47986Sopenharmony_ci "error: failed to disable the administrator application of the device."} 61f7a47986Sopenharmony_ci }; 62f7a47986Sopenharmony_ci return ERR_OK; 63f7a47986Sopenharmony_ci} 64f7a47986Sopenharmony_ci 65f7a47986Sopenharmony_ciErrCode EdmCommand::Init() 66f7a47986Sopenharmony_ci{ 67f7a47986Sopenharmony_ci if (!enterpriseDeviceMgrProxy_) { 68f7a47986Sopenharmony_ci enterpriseDeviceMgrProxy_ = EnterpriseDeviceMgrProxy::GetInstance(); 69f7a47986Sopenharmony_ci } 70f7a47986Sopenharmony_ci return ERR_OK; 71f7a47986Sopenharmony_ci} 72f7a47986Sopenharmony_ci 73f7a47986Sopenharmony_ciErrCode EdmCommand::RunAsHelpCommand() 74f7a47986Sopenharmony_ci{ 75f7a47986Sopenharmony_ci resultReceiver_.append(HELP_MSG); 76f7a47986Sopenharmony_ci return ERR_OK; 77f7a47986Sopenharmony_ci} 78f7a47986Sopenharmony_ci 79f7a47986Sopenharmony_ciErrCode EdmCommand::RunAsEnableCommand() 80f7a47986Sopenharmony_ci{ 81f7a47986Sopenharmony_ci std::string bundleName; 82f7a47986Sopenharmony_ci std::string abilityName; 83f7a47986Sopenharmony_ci ErrCode result = ParseEnableAdminCommandOption(bundleName, abilityName); 84f7a47986Sopenharmony_ci if (result == ERR_EDM_TOOLS_COMMAND_HELP && bundleName.empty() && abilityName.empty()) { 85f7a47986Sopenharmony_ci return ReportMessage(ERR_EDM_TOOLS_COMMAND_HELP, true); 86f7a47986Sopenharmony_ci } 87f7a47986Sopenharmony_ci if (result != ERR_EDM_TOOLS_COMMAND_HELP && result != ERR_OK) { 88f7a47986Sopenharmony_ci return ReportMessage(result, true); 89f7a47986Sopenharmony_ci } 90f7a47986Sopenharmony_ci if (bundleName.empty()) { 91f7a47986Sopenharmony_ci return ReportMessage(ERR_EDM_TOOLS_COMMAND_NO_BUNDLE_NAME_OPTION, true); 92f7a47986Sopenharmony_ci } 93f7a47986Sopenharmony_ci if (abilityName.empty()) { 94f7a47986Sopenharmony_ci return ReportMessage(ERR_EDM_TOOLS_COMMAND_NO_ABILITY_NAME_OPTION, true); 95f7a47986Sopenharmony_ci } 96f7a47986Sopenharmony_ci OHOS::AppExecFwk::ElementName elementName; 97f7a47986Sopenharmony_ci elementName.SetElementBundleName(&elementName, bundleName.c_str()); 98f7a47986Sopenharmony_ci elementName.SetElementAbilityName(&elementName, abilityName.c_str()); 99f7a47986Sopenharmony_ci EntInfo info; 100f7a47986Sopenharmony_ci result = enterpriseDeviceMgrProxy_->EnableAdmin(elementName, info, AdminType::ENT, DEFAULT_USER_ID); 101f7a47986Sopenharmony_ci return ReportMessage(result, true); 102f7a47986Sopenharmony_ci} 103f7a47986Sopenharmony_ci 104f7a47986Sopenharmony_ciErrCode EdmCommand::RunAsDisableAdminCommand() 105f7a47986Sopenharmony_ci{ 106f7a47986Sopenharmony_ci std::string bundleName; 107f7a47986Sopenharmony_ci std::string abilityName; 108f7a47986Sopenharmony_ci ErrCode result = ParseEnableAdminCommandOption(bundleName, abilityName); 109f7a47986Sopenharmony_ci if (result == ERR_EDM_TOOLS_COMMAND_HELP && bundleName.empty()) { 110f7a47986Sopenharmony_ci return ReportMessage(ERR_EDM_TOOLS_COMMAND_HELP, false); 111f7a47986Sopenharmony_ci } 112f7a47986Sopenharmony_ci if (result != ERR_EDM_TOOLS_COMMAND_HELP && result != ERR_OK) { 113f7a47986Sopenharmony_ci return ReportMessage(result, false); 114f7a47986Sopenharmony_ci } 115f7a47986Sopenharmony_ci if (bundleName.empty()) { 116f7a47986Sopenharmony_ci return ReportMessage(ERR_EDM_TOOLS_COMMAND_NO_BUNDLE_NAME_OPTION, false); 117f7a47986Sopenharmony_ci } 118f7a47986Sopenharmony_ci result = enterpriseDeviceMgrProxy_->DisableSuperAdmin(bundleName); 119f7a47986Sopenharmony_ci return ReportMessage(result, false); 120f7a47986Sopenharmony_ci} 121f7a47986Sopenharmony_ci 122f7a47986Sopenharmony_ciErrCode EdmCommand::ParseEnableAdminCommandOption(std::string &bundleName, std::string &abilityName) 123f7a47986Sopenharmony_ci{ 124f7a47986Sopenharmony_ci int count = 0; 125f7a47986Sopenharmony_ci ErrCode ret = ERR_INVALID_VALUE; 126f7a47986Sopenharmony_ci while (count < OPTION_NUM) { 127f7a47986Sopenharmony_ci count++; 128f7a47986Sopenharmony_ci int32_t option = getopt_long(argc_, argv_, SHORT_OPTIONS.c_str(), LONG_OPTIONS, nullptr); 129f7a47986Sopenharmony_ci if (option == -1) { 130f7a47986Sopenharmony_ci if (count == 1) { 131f7a47986Sopenharmony_ci ret = ERR_EDM_TOOLS_COMMAND_NO_OPTION; 132f7a47986Sopenharmony_ci } 133f7a47986Sopenharmony_ci break; 134f7a47986Sopenharmony_ci } 135f7a47986Sopenharmony_ci if (option == '?') { 136f7a47986Sopenharmony_ci ret = RunAsEnableCommandMissingOptionArgument(); 137f7a47986Sopenharmony_ci break; 138f7a47986Sopenharmony_ci } 139f7a47986Sopenharmony_ci ret = RunAsEnableCommandParseOptionArgument(option, bundleName, abilityName); 140f7a47986Sopenharmony_ci } 141f7a47986Sopenharmony_ci return ret; 142f7a47986Sopenharmony_ci} 143f7a47986Sopenharmony_ci 144f7a47986Sopenharmony_ciErrCode EdmCommand::RunAsEnableCommandMissingOptionArgument() 145f7a47986Sopenharmony_ci{ 146f7a47986Sopenharmony_ci switch (optopt) { 147f7a47986Sopenharmony_ci case 'n': 148f7a47986Sopenharmony_ci return ERR_EDM_TOOLS_COMMAND_N_OPTION_REQUIRES_AN_ARGUMENT; 149f7a47986Sopenharmony_ci case 'a': 150f7a47986Sopenharmony_ci return ERR_EDM_TOOLS_COMMAND_A_OPTION_REQUIRES_AN_ARGUMENT; 151f7a47986Sopenharmony_ci default: 152f7a47986Sopenharmony_ci return ERR_EDM_TOOLS_COMMAND_UNKNOWN_OPTION; 153f7a47986Sopenharmony_ci } 154f7a47986Sopenharmony_ci} 155f7a47986Sopenharmony_ci 156f7a47986Sopenharmony_ciErrCode EdmCommand::RunAsEnableCommandParseOptionArgument(int option, std::string &bundleName, std::string &abilityName) 157f7a47986Sopenharmony_ci{ 158f7a47986Sopenharmony_ci ErrCode ret = ERR_OK; 159f7a47986Sopenharmony_ci switch (option) { 160f7a47986Sopenharmony_ci case 'h': 161f7a47986Sopenharmony_ci ret = ERR_EDM_TOOLS_COMMAND_HELP; 162f7a47986Sopenharmony_ci break; 163f7a47986Sopenharmony_ci case 'n': 164f7a47986Sopenharmony_ci bundleName = optarg; 165f7a47986Sopenharmony_ci break; 166f7a47986Sopenharmony_ci case 'a': 167f7a47986Sopenharmony_ci abilityName = optarg; 168f7a47986Sopenharmony_ci break; 169f7a47986Sopenharmony_ci default: 170f7a47986Sopenharmony_ci break; 171f7a47986Sopenharmony_ci } 172f7a47986Sopenharmony_ci return ret; 173f7a47986Sopenharmony_ci} 174f7a47986Sopenharmony_ci 175f7a47986Sopenharmony_ciErrCode EdmCommand::ReportMessage(int32_t code, bool isEnable) 176f7a47986Sopenharmony_ci{ 177f7a47986Sopenharmony_ci if (code == ERR_OK) { 178f7a47986Sopenharmony_ci resultReceiver_.append(cmd_ + " success.\n"); 179f7a47986Sopenharmony_ci return ERR_OK; 180f7a47986Sopenharmony_ci } 181f7a47986Sopenharmony_ci if (code != ERR_EDM_TOOLS_COMMAND_HELP) { 182f7a47986Sopenharmony_ci resultReceiver_.append(GetMessageFromCode(code)); 183f7a47986Sopenharmony_ci } 184f7a47986Sopenharmony_ci if (code == EdmReturnErrCode::COMPONENT_INVALID || code == EdmReturnErrCode::ENABLE_ADMIN_FAILED || 185f7a47986Sopenharmony_ci code == EdmReturnErrCode::DISABLE_ADMIN_FAILED) { 186f7a47986Sopenharmony_ci return code; 187f7a47986Sopenharmony_ci } 188f7a47986Sopenharmony_ci if (isEnable) { 189f7a47986Sopenharmony_ci resultReceiver_.append(HELP_MSG_ENABLE_ADMIN); 190f7a47986Sopenharmony_ci } else { 191f7a47986Sopenharmony_ci resultReceiver_.append(HELP_MSG_DISABLE_ADMIN); 192f7a47986Sopenharmony_ci } 193f7a47986Sopenharmony_ci if (code == ERR_EDM_TOOLS_COMMAND_HELP) { 194f7a47986Sopenharmony_ci return ERR_OK; 195f7a47986Sopenharmony_ci } 196f7a47986Sopenharmony_ci return code; 197f7a47986Sopenharmony_ci} 198f7a47986Sopenharmony_ci} // namespace EDM 199f7a47986Sopenharmony_ci} // namespace OHOS 200