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