1c2b37d2cSopenharmony_ci/*
2c2b37d2cSopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3c2b37d2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c2b37d2cSopenharmony_ci * you may not use this file except in compliance with the License.
5c2b37d2cSopenharmony_ci * You may obtain a copy of the License at
6c2b37d2cSopenharmony_ci *
7c2b37d2cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c2b37d2cSopenharmony_ci *
9c2b37d2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c2b37d2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c2b37d2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c2b37d2cSopenharmony_ci * See the License for the specific language governing permissions and
13c2b37d2cSopenharmony_ci * limitations under the License.
14c2b37d2cSopenharmony_ci */
15c2b37d2cSopenharmony_ci#include "account_command.h"
16c2b37d2cSopenharmony_ci#include <fstream>
17c2b37d2cSopenharmony_ci#include <getopt.h>
18c2b37d2cSopenharmony_ci#include <sys/stat.h>
19c2b37d2cSopenharmony_ci#include "account_log_wrapper.h"
20c2b37d2cSopenharmony_ci#include "singleton.h"
21c2b37d2cSopenharmony_ci#include "string_ex.h"
22c2b37d2cSopenharmony_ci
23c2b37d2cSopenharmony_ciusing namespace OHOS::AAFwk;
24c2b37d2cSopenharmony_ci
25c2b37d2cSopenharmony_cinamespace OHOS {
26c2b37d2cSopenharmony_cinamespace AccountSA {
27c2b37d2cSopenharmony_cinamespace {
28c2b37d2cSopenharmony_ciconst std::string SHORT_OPTIONS = "hn:t:i:s:l:c:ea";
29c2b37d2cSopenharmony_ciconst struct option LONG_OPTIONS[] = {
30c2b37d2cSopenharmony_ci    {"help", no_argument, nullptr, 'h'},
31c2b37d2cSopenharmony_ci    {"name", required_argument, nullptr, 'n'},
32c2b37d2cSopenharmony_ci    {"type", required_argument, nullptr, 't'},
33c2b37d2cSopenharmony_ci    {"id", required_argument, nullptr, 'i'},
34c2b37d2cSopenharmony_ci    {"shortName", optional_argument, nullptr, 's'},
35c2b37d2cSopenharmony_ci    {"disallowedlist", optional_argument, nullptr, 'l'},
36c2b37d2cSopenharmony_ci    {"constraint", required_argument, nullptr, 'c'},
37c2b37d2cSopenharmony_ci    {"enable", no_argument, nullptr, 'e'},
38c2b37d2cSopenharmony_ci    {"all", no_argument, nullptr, 'a'},
39c2b37d2cSopenharmony_ci    {nullptr, no_argument, nullptr, no_argument}
40c2b37d2cSopenharmony_ci};
41c2b37d2cSopenharmony_ci
42c2b37d2cSopenharmony_cistatic const std::string DEACTIVATE_COMMAND = "deactivate";
43c2b37d2cSopenharmony_cistatic const std::string DELETE_COMMAND = "delete";
44c2b37d2cSopenharmony_cistatic const std::string SWITCH_COMMAND = "switch";
45c2b37d2cSopenharmony_cistatic const std::string DUMP_COMMAND = "dump";
46c2b37d2cSopenharmony_cistatic const std::string SET_COMMAND = "set";
47c2b37d2cSopenharmony_cistatic const std::string CREATE_COMMAND = "create";
48c2b37d2cSopenharmony_cistatic constexpr int MIN_ARGUMENT_NUMBER = 2;
49c2b37d2cSopenharmony_cistatic constexpr int MAX_ARGUMENT_NUMBER = 4096;
50c2b37d2cSopenharmony_ci}  // namespace
51c2b37d2cSopenharmony_ci
52c2b37d2cSopenharmony_ciAccountCommand::AccountCommand(int argc, char *argv[])
53c2b37d2cSopenharmony_ci{
54c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("enter");
55c2b37d2cSopenharmony_ci    opterr = 0;
56c2b37d2cSopenharmony_ci    argc_ = argc;
57c2b37d2cSopenharmony_ci    argv_ = argv;
58c2b37d2cSopenharmony_ci    name_ = TOOL_NAME;
59c2b37d2cSopenharmony_ci
60c2b37d2cSopenharmony_ci    if (argc < MIN_ARGUMENT_NUMBER || argc > MAX_ARGUMENT_NUMBER) {
61c2b37d2cSopenharmony_ci        cmd_ = "help";
62c2b37d2cSopenharmony_ci        return;
63c2b37d2cSopenharmony_ci    }
64c2b37d2cSopenharmony_ci    cmd_ = argv[1];
65c2b37d2cSopenharmony_ci    for (int i = MIN_ARGUMENT_NUMBER; i < argc; i++) {
66c2b37d2cSopenharmony_ci        argList_.push_back(argv[i]);
67c2b37d2cSopenharmony_ci    }
68c2b37d2cSopenharmony_ci    for (int i = 0; i < argc_; i++) {
69c2b37d2cSopenharmony_ci        ACCOUNT_LOGD("argv_[%{public}d]: %{public}s", i, argv_[i]);
70c2b37d2cSopenharmony_ci    }
71c2b37d2cSopenharmony_ci}
72c2b37d2cSopenharmony_ci
73c2b37d2cSopenharmony_civoid AccountCommand::CreateCommandMap()
74c2b37d2cSopenharmony_ci{
75c2b37d2cSopenharmony_ci    commandMap_ = {
76c2b37d2cSopenharmony_ci        {"help", [this] { return this->RunAsHelpCommand(); }},
77c2b37d2cSopenharmony_ci        {"create", [this] { return this->RunAsCreateCommand(); }},
78c2b37d2cSopenharmony_ci        {"delete", [this] { return this->RunAsDeleteCommand(); }},
79c2b37d2cSopenharmony_ci        {"dump", [this] { return this->RunAsDumpCommand(); }},
80c2b37d2cSopenharmony_ci        {"set", [this] { return this->RunAsSetCommand(); }},
81c2b37d2cSopenharmony_ci        {"switch", [this] { return this->RunAsSwitchCommand(); }},
82c2b37d2cSopenharmony_ci        {"deactivate", [this] { return this->RunAsDeactivateCommand(); }},
83c2b37d2cSopenharmony_ci    };
84c2b37d2cSopenharmony_ci}
85c2b37d2cSopenharmony_ci
86c2b37d2cSopenharmony_cistd::string AccountCommand::GetCommandErrorMsg() const
87c2b37d2cSopenharmony_ci{
88c2b37d2cSopenharmony_ci    std::string commandErrorMsg =
89c2b37d2cSopenharmony_ci        name_ + ": '" + cmd_ + "' is not a valid " + name_ + " command. See '" + name_ + " help'.\n";
90c2b37d2cSopenharmony_ci
91c2b37d2cSopenharmony_ci    return commandErrorMsg;
92c2b37d2cSopenharmony_ci}
93c2b37d2cSopenharmony_ci
94c2b37d2cSopenharmony_cistd::string AccountCommand::GetUnknownOptionMsg(std::string& unknownOption) const
95c2b37d2cSopenharmony_ci{
96c2b37d2cSopenharmony_ci    std::string result = "";
97c2b37d2cSopenharmony_ci
98c2b37d2cSopenharmony_ci    if (optind < 0 || optind > argc_) {
99c2b37d2cSopenharmony_ci        return result;
100c2b37d2cSopenharmony_ci    }
101c2b37d2cSopenharmony_ci
102c2b37d2cSopenharmony_ci    result.append("fail: unknown option");
103c2b37d2cSopenharmony_ci    result.append(".\n");
104c2b37d2cSopenharmony_ci
105c2b37d2cSopenharmony_ci    return result;
106c2b37d2cSopenharmony_ci}
107c2b37d2cSopenharmony_ci
108c2b37d2cSopenharmony_civoid AccountCommand::OnCommand()
109c2b37d2cSopenharmony_ci{
110c2b37d2cSopenharmony_ci    auto respond = commandMap_[cmd_];
111c2b37d2cSopenharmony_ci    if (respond == nullptr) {
112c2b37d2cSopenharmony_ci        resultReceiver_.append(GetCommandErrorMsg());
113c2b37d2cSopenharmony_ci        respond = commandMap_["help"];
114c2b37d2cSopenharmony_ci    }
115c2b37d2cSopenharmony_ci
116c2b37d2cSopenharmony_ci    respond();
117c2b37d2cSopenharmony_ci}
118c2b37d2cSopenharmony_ci
119c2b37d2cSopenharmony_cistd::string AccountCommand::ExecCommand()
120c2b37d2cSopenharmony_ci{
121c2b37d2cSopenharmony_ci    CreateCommandMap();
122c2b37d2cSopenharmony_ci    OnCommand();
123c2b37d2cSopenharmony_ci    return resultReceiver_;
124c2b37d2cSopenharmony_ci}
125c2b37d2cSopenharmony_ci
126c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsHelpCommand(void)
127c2b37d2cSopenharmony_ci{
128c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("enter");
129c2b37d2cSopenharmony_ci    resultReceiver_.append(HELP_MSG);
130c2b37d2cSopenharmony_ci    return ERR_OK;
131c2b37d2cSopenharmony_ci}
132c2b37d2cSopenharmony_ci
133c2b37d2cSopenharmony_ciErrCode AccountCommand::ParseCreateCommandOpt(std::string &name,
134c2b37d2cSopenharmony_ci    std::string &shortName, OsAccountType &osAccountType, std::vector<std::string> &disallowedList)
135c2b37d2cSopenharmony_ci{
136c2b37d2cSopenharmony_ci    int counter = 0;
137c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
138c2b37d2cSopenharmony_ci    while (true) {
139c2b37d2cSopenharmony_ci        counter++;
140c2b37d2cSopenharmony_ci
141c2b37d2cSopenharmony_ci        int option = getopt_long(argc_, argv_, SHORT_OPTIONS.c_str(), LONG_OPTIONS, nullptr);
142c2b37d2cSopenharmony_ci        ACCOUNT_LOGD("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);
143c2b37d2cSopenharmony_ci
144c2b37d2cSopenharmony_ci        if (option == -1) {
145c2b37d2cSopenharmony_ci            if (counter == 1) {
146c2b37d2cSopenharmony_ci                result = RunCommandError(CREATE_COMMAND);
147c2b37d2cSopenharmony_ci            }
148c2b37d2cSopenharmony_ci            break;
149c2b37d2cSopenharmony_ci        }
150c2b37d2cSopenharmony_ci
151c2b37d2cSopenharmony_ci        if (option == '?') {
152c2b37d2cSopenharmony_ci            result = RunAsCreateCommandMissingOptionArgument();
153c2b37d2cSopenharmony_ci            break;
154c2b37d2cSopenharmony_ci        }
155c2b37d2cSopenharmony_ci
156c2b37d2cSopenharmony_ci        result = RunAsCreateCommandExistentOptionArgument(option, name, shortName, osAccountType, disallowedList);
157c2b37d2cSopenharmony_ci    }
158c2b37d2cSopenharmony_ci    return result;
159c2b37d2cSopenharmony_ci}
160c2b37d2cSopenharmony_ci
161c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsCreateCommand(void)
162c2b37d2cSopenharmony_ci{
163c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("enter");
164c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
165c2b37d2cSopenharmony_ci    std::string name = "";
166c2b37d2cSopenharmony_ci    std::string shortName = "";
167c2b37d2cSopenharmony_ci    OsAccountType osAccountType = END;
168c2b37d2cSopenharmony_ci    CreateOsAccountOptions options;
169c2b37d2cSopenharmony_ci    result = ParseCreateCommandOpt(name, shortName, osAccountType, options.disallowedHapList);
170c2b37d2cSopenharmony_ci    if (result == ERR_OK) {
171c2b37d2cSopenharmony_ci        if (name.size() == 0 || osAccountType == END) {
172c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm create' without enough options");
173c2b37d2cSopenharmony_ci
174c2b37d2cSopenharmony_ci            if (name.size() == 0) {
175c2b37d2cSopenharmony_ci                resultReceiver_.append(HELP_MSG_NO_NAME_OPTION + "\n");
176c2b37d2cSopenharmony_ci            }
177c2b37d2cSopenharmony_ci
178c2b37d2cSopenharmony_ci            if (osAccountType == END) {
179c2b37d2cSopenharmony_ci                resultReceiver_.append(HELP_MSG_NO_TYPE_OPTION + "\n");
180c2b37d2cSopenharmony_ci            }
181c2b37d2cSopenharmony_ci
182c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
183c2b37d2cSopenharmony_ci        }
184c2b37d2cSopenharmony_ci    }
185c2b37d2cSopenharmony_ci
186c2b37d2cSopenharmony_ci    if (result != ERR_OK && result != ERR_ACCOUNT_COMMON_FILE_OPEN_FAILED) {
187c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_CREATE);
188c2b37d2cSopenharmony_ci    } else {
189c2b37d2cSopenharmony_ci        /* create */
190c2b37d2cSopenharmony_ci
191c2b37d2cSopenharmony_ci        // make os account info
192c2b37d2cSopenharmony_ci        OsAccountInfo osAccountInfo;
193c2b37d2cSopenharmony_ci        if (shortName.empty()) {
194c2b37d2cSopenharmony_ci            shortName = name;
195c2b37d2cSopenharmony_ci        }
196c2b37d2cSopenharmony_ci        // create an os account
197c2b37d2cSopenharmony_ci        result = OsAccount::GetInstance().CreateOsAccount(name, shortName, osAccountType, osAccountInfo, options);
198c2b37d2cSopenharmony_ci        switch (result) {
199c2b37d2cSopenharmony_ci            case ERR_OK:
200c2b37d2cSopenharmony_ci                resultReceiver_ = STRING_CREATE_OS_ACCOUNT_OK + "\n";
201c2b37d2cSopenharmony_ci                break;
202c2b37d2cSopenharmony_ci            case ERR_OSACCOUNT_SERVICE_MANAGER_NOT_ENABLE_MULTI_ERROR:
203c2b37d2cSopenharmony_ci                resultReceiver_ = "create failed, reason: multiple-os-account feature not enabled\n";
204c2b37d2cSopenharmony_ci                break;
205c2b37d2cSopenharmony_ci            default:
206c2b37d2cSopenharmony_ci                resultReceiver_ = STRING_CREATE_OS_ACCOUNT_NG + "\n";
207c2b37d2cSopenharmony_ci        }
208c2b37d2cSopenharmony_ci    }
209c2b37d2cSopenharmony_ci
210c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("result = %{public}d, name = %{public}s, type = %{public}d", result, name.c_str(), osAccountType);
211c2b37d2cSopenharmony_ci    return result;
212c2b37d2cSopenharmony_ci}
213c2b37d2cSopenharmony_ci
214c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsDeleteCommand(void)
215c2b37d2cSopenharmony_ci{
216c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
217c2b37d2cSopenharmony_ci    int id = -1;
218c2b37d2cSopenharmony_ci
219c2b37d2cSopenharmony_ci    ParseCommandOpt(DELETE_COMMAND, result, id);
220c2b37d2cSopenharmony_ci
221c2b37d2cSopenharmony_ci    if (result != ERR_OK) {
222c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_DELETE);
223c2b37d2cSopenharmony_ci    } else {
224c2b37d2cSopenharmony_ci        /* delete */
225c2b37d2cSopenharmony_ci
226c2b37d2cSopenharmony_ci        // delete an os account
227c2b37d2cSopenharmony_ci        result = OsAccount::GetInstance().RemoveOsAccount(id);
228c2b37d2cSopenharmony_ci        if (result == ERR_OK) {
229c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_DELETE_OS_ACCOUNT_OK + "\n";
230c2b37d2cSopenharmony_ci        } else {
231c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_DELETE_OS_ACCOUNT_NG + "\n";
232c2b37d2cSopenharmony_ci        }
233c2b37d2cSopenharmony_ci    }
234c2b37d2cSopenharmony_ci
235c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("result = %{public}d, id = %{public}d", result, id);
236c2b37d2cSopenharmony_ci    return result;
237c2b37d2cSopenharmony_ci}
238c2b37d2cSopenharmony_ci
239c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsDumpCommand(void)
240c2b37d2cSopenharmony_ci{
241c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
242c2b37d2cSopenharmony_ci    int id = -1;
243c2b37d2cSopenharmony_ci
244c2b37d2cSopenharmony_ci    ParseCommandOpt(DUMP_COMMAND, result, id);
245c2b37d2cSopenharmony_ci
246c2b37d2cSopenharmony_ci    if (result != ERR_OK) {
247c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_DUMP);
248c2b37d2cSopenharmony_ci    } else {
249c2b37d2cSopenharmony_ci        /* dump */
250c2b37d2cSopenharmony_ci
251c2b37d2cSopenharmony_ci        // dump state
252c2b37d2cSopenharmony_ci        std::vector<std::string> state;
253c2b37d2cSopenharmony_ci        result = OsAccount::GetInstance().DumpState(id, state);
254c2b37d2cSopenharmony_ci        if (result == ERR_OK) {
255c2b37d2cSopenharmony_ci            for (auto info : state) {
256c2b37d2cSopenharmony_ci                resultReceiver_ += info + "\n";
257c2b37d2cSopenharmony_ci            }
258c2b37d2cSopenharmony_ci        } else {
259c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_DUMP_OS_ACCOUNT_NG + "\n";
260c2b37d2cSopenharmony_ci        }
261c2b37d2cSopenharmony_ci    }
262c2b37d2cSopenharmony_ci
263c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("result = %{public}d, id = %{public}d", result, id);
264c2b37d2cSopenharmony_ci    return result;
265c2b37d2cSopenharmony_ci}
266c2b37d2cSopenharmony_ci
267c2b37d2cSopenharmony_civoid AccountCommand::RunCommand(
268c2b37d2cSopenharmony_ci    int &counter, ErrCode &result, bool &enable, int &id, std::vector<std::string> &constraints)
269c2b37d2cSopenharmony_ci{
270c2b37d2cSopenharmony_ci    while (true) {
271c2b37d2cSopenharmony_ci        counter++;
272c2b37d2cSopenharmony_ci
273c2b37d2cSopenharmony_ci        int option = getopt_long(argc_, argv_, SHORT_OPTIONS.c_str(), LONG_OPTIONS, nullptr);
274c2b37d2cSopenharmony_ci        ACCOUNT_LOGD("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);
275c2b37d2cSopenharmony_ci
276c2b37d2cSopenharmony_ci        if (option == -1) {
277c2b37d2cSopenharmony_ci            if (counter == 1) {
278c2b37d2cSopenharmony_ci                result = RunCommandError(SET_COMMAND);
279c2b37d2cSopenharmony_ci            }
280c2b37d2cSopenharmony_ci            break;
281c2b37d2cSopenharmony_ci        }
282c2b37d2cSopenharmony_ci
283c2b37d2cSopenharmony_ci        if (option == '?') {
284c2b37d2cSopenharmony_ci            result = RunAsSetCommandMissingOptionArgument();
285c2b37d2cSopenharmony_ci            break;
286c2b37d2cSopenharmony_ci        }
287c2b37d2cSopenharmony_ci
288c2b37d2cSopenharmony_ci        result = RunAsSetCommandExistentOptionArgument(option, id, constraints, enable);
289c2b37d2cSopenharmony_ci    }
290c2b37d2cSopenharmony_ci}
291c2b37d2cSopenharmony_ci
292c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsSetCommand(void)
293c2b37d2cSopenharmony_ci{
294c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
295c2b37d2cSopenharmony_ci    int counter = 0;
296c2b37d2cSopenharmony_ci    int id = -1;
297c2b37d2cSopenharmony_ci    std::vector<std::string> constraints;
298c2b37d2cSopenharmony_ci    bool enable = false;
299c2b37d2cSopenharmony_ci
300c2b37d2cSopenharmony_ci    RunCommand(counter, result, enable, id, constraints);
301c2b37d2cSopenharmony_ci
302c2b37d2cSopenharmony_ci    if (result == ERR_OK) {
303c2b37d2cSopenharmony_ci        if (id == -1 || constraints.size() == 0) {
304c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm set' without enough options");
305c2b37d2cSopenharmony_ci
306c2b37d2cSopenharmony_ci            if (id == -1) {
307c2b37d2cSopenharmony_ci                resultReceiver_.append(HELP_MSG_NO_ID_OPTION + "\n");
308c2b37d2cSopenharmony_ci            }
309c2b37d2cSopenharmony_ci
310c2b37d2cSopenharmony_ci            if (constraints.size() == 0) {
311c2b37d2cSopenharmony_ci                resultReceiver_.append(HELP_MSG_NO_CONSTRAINTS_OPTION + "\n");
312c2b37d2cSopenharmony_ci            }
313c2b37d2cSopenharmony_ci
314c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
315c2b37d2cSopenharmony_ci        }
316c2b37d2cSopenharmony_ci    }
317c2b37d2cSopenharmony_ci
318c2b37d2cSopenharmony_ci    if (result != ERR_OK) {
319c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_SET);
320c2b37d2cSopenharmony_ci    } else {
321c2b37d2cSopenharmony_ci        /* set */
322c2b37d2cSopenharmony_ci
323c2b37d2cSopenharmony_ci        // set os account constraints
324c2b37d2cSopenharmony_ci        result = OsAccount::GetInstance().SetOsAccountConstraints(id, constraints, enable);
325c2b37d2cSopenharmony_ci        if (result == ERR_OK) {
326c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_SET_OS_ACCOUNT_CONSTRAINTS_OK + "\n";
327c2b37d2cSopenharmony_ci        } else {
328c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_SET_OS_ACCOUNT_CONSTRAINTS_NG + "\n";
329c2b37d2cSopenharmony_ci        }
330c2b37d2cSopenharmony_ci    }
331c2b37d2cSopenharmony_ci
332c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("result = %{public}d, id = %{public}d, enable = %{public}d", result, id, enable);
333c2b37d2cSopenharmony_ci    for (auto constraint : constraints) {
334c2b37d2cSopenharmony_ci        ACCOUNT_LOGD("constraint = %{public}s", constraint.c_str());
335c2b37d2cSopenharmony_ci    }
336c2b37d2cSopenharmony_ci
337c2b37d2cSopenharmony_ci    return result;
338c2b37d2cSopenharmony_ci}
339c2b37d2cSopenharmony_ci
340c2b37d2cSopenharmony_civoid AccountCommand::ParseCommandOpt(const std::string &command, ErrCode &result, int &id)
341c2b37d2cSopenharmony_ci{
342c2b37d2cSopenharmony_ci    int counter = 0;
343c2b37d2cSopenharmony_ci    while (true) {
344c2b37d2cSopenharmony_ci        counter++;
345c2b37d2cSopenharmony_ci
346c2b37d2cSopenharmony_ci        int option = getopt_long(argc_, argv_, SHORT_OPTIONS.c_str(), LONG_OPTIONS, nullptr);
347c2b37d2cSopenharmony_ci        ACCOUNT_LOGD("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);
348c2b37d2cSopenharmony_ci
349c2b37d2cSopenharmony_ci        if (option == -1) {
350c2b37d2cSopenharmony_ci            if (counter == 1) {
351c2b37d2cSopenharmony_ci                result = RunCommandError(command);
352c2b37d2cSopenharmony_ci            }
353c2b37d2cSopenharmony_ci            break;
354c2b37d2cSopenharmony_ci        }
355c2b37d2cSopenharmony_ci
356c2b37d2cSopenharmony_ci        if (option == '?') {
357c2b37d2cSopenharmony_ci            result = RunAsCommonCommandMissingOptionArgument(command);
358c2b37d2cSopenharmony_ci            break;
359c2b37d2cSopenharmony_ci        }
360c2b37d2cSopenharmony_ci
361c2b37d2cSopenharmony_ci        result = RunAsCommonCommandExistentOptionArgument(option, id);
362c2b37d2cSopenharmony_ci    }
363c2b37d2cSopenharmony_ci}
364c2b37d2cSopenharmony_ci
365c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsSwitchCommand(void)
366c2b37d2cSopenharmony_ci{
367c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
368c2b37d2cSopenharmony_ci    int id = -1;
369c2b37d2cSopenharmony_ci    ParseCommandOpt(SWITCH_COMMAND, result, id);
370c2b37d2cSopenharmony_ci
371c2b37d2cSopenharmony_ci    if (result != ERR_OK) {
372c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_SWITCH);
373c2b37d2cSopenharmony_ci    } else {
374c2b37d2cSopenharmony_ci        /* switch */
375c2b37d2cSopenharmony_ci
376c2b37d2cSopenharmony_ci        // switch an os account
377c2b37d2cSopenharmony_ci        result = OsAccount::GetInstance().ActivateOsAccount(id);
378c2b37d2cSopenharmony_ci        if (result == ERR_OK) {
379c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_SWITCH_OS_ACCOUNT_OK + "\n";
380c2b37d2cSopenharmony_ci        } else {
381c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_SWITCH_OS_ACCOUNT_NG + "\n";
382c2b37d2cSopenharmony_ci        }
383c2b37d2cSopenharmony_ci    }
384c2b37d2cSopenharmony_ci
385c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("result = %{public}d, id = %{public}d", result, id);
386c2b37d2cSopenharmony_ci    return result;
387c2b37d2cSopenharmony_ci}
388c2b37d2cSopenharmony_ci
389c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsDeactivateCommand(void)
390c2b37d2cSopenharmony_ci{
391c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
392c2b37d2cSopenharmony_ci    int id = -1;
393c2b37d2cSopenharmony_ci
394c2b37d2cSopenharmony_ci    ParseCommandOpt(DEACTIVATE_COMMAND, result, id);
395c2b37d2cSopenharmony_ci
396c2b37d2cSopenharmony_ci    if (result != ERR_OK) {
397c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_DEACTIVATE);
398c2b37d2cSopenharmony_ci    } else if (id != -1) {
399c2b37d2cSopenharmony_ci        /* deactivate */
400c2b37d2cSopenharmony_ci
401c2b37d2cSopenharmony_ci        // deactivate an os account
402c2b37d2cSopenharmony_ci        result = OsAccount::GetInstance().DeactivateOsAccount(id);
403c2b37d2cSopenharmony_ci        if (result == ERR_OK) {
404c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_DEACTIVATE_OS_ACCOUNT_OK + "\n";
405c2b37d2cSopenharmony_ci        } else {
406c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_DEACTIVATE_OS_ACCOUNT_NG + "\n";
407c2b37d2cSopenharmony_ci        }
408c2b37d2cSopenharmony_ci    } else {
409c2b37d2cSopenharmony_ci        result = OsAccount::GetInstance().DeactivateAllOsAccounts();
410c2b37d2cSopenharmony_ci        if (result == ERR_OK) {
411c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_DEACTIVATE_ALL_OS_ACCOUNTS_OK + "\n";
412c2b37d2cSopenharmony_ci        } else {
413c2b37d2cSopenharmony_ci            resultReceiver_ = STRING_DEACTIVATE_ALL_OS_ACCOUNTS_NG + "\n";
414c2b37d2cSopenharmony_ci        }
415c2b37d2cSopenharmony_ci    }
416c2b37d2cSopenharmony_ci
417c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("result = %{public}d, id = %{public}d", result, id);
418c2b37d2cSopenharmony_ci
419c2b37d2cSopenharmony_ci    return result;
420c2b37d2cSopenharmony_ci}
421c2b37d2cSopenharmony_ci
422c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsCreateCommandMissingOptionArgument(void)
423c2b37d2cSopenharmony_ci{
424c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
425c2b37d2cSopenharmony_ci
426c2b37d2cSopenharmony_ci    switch (optopt) {
427c2b37d2cSopenharmony_ci        case 'n': {
428c2b37d2cSopenharmony_ci            // 'acm create -n <name>' with no argument: acm create -n
429c2b37d2cSopenharmony_ci            // 'acm create --name <name>' with no argument: acm create --name
430c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm create -n' with no argument.");
431c2b37d2cSopenharmony_ci
432c2b37d2cSopenharmony_ci            resultReceiver_.append(HELP_MSG_OPTION_REQUIRES_AN_ARGUMENT + "\n");
433c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
434c2b37d2cSopenharmony_ci            break;
435c2b37d2cSopenharmony_ci        }
436c2b37d2cSopenharmony_ci        case 't': {
437c2b37d2cSopenharmony_ci            // 'acm create -t <type>' with no argument: acm create -t
438c2b37d2cSopenharmony_ci            // 'acm create --type <type>' with no argument: acm create --type
439c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm create -t' with no argument.");
440c2b37d2cSopenharmony_ci
441c2b37d2cSopenharmony_ci            resultReceiver_.append(HELP_MSG_OPTION_REQUIRES_AN_ARGUMENT + "\n");
442c2b37d2cSopenharmony_ci
443c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
444c2b37d2cSopenharmony_ci            break;
445c2b37d2cSopenharmony_ci        }
446c2b37d2cSopenharmony_ci        default: {
447c2b37d2cSopenharmony_ci            // 'acm create' with an unknown option: acm create -x
448c2b37d2cSopenharmony_ci            // 'acm create' with an unknown option: acm create -xxx
449c2b37d2cSopenharmony_ci            std::string unknownOption = "";
450c2b37d2cSopenharmony_ci            std::string unknownOptionMsg = GetUnknownOptionMsg(unknownOption);
451c2b37d2cSopenharmony_ci
452c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm create' with an unknown option.");
453c2b37d2cSopenharmony_ci
454c2b37d2cSopenharmony_ci            resultReceiver_.append(unknownOptionMsg);
455c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
456c2b37d2cSopenharmony_ci            break;
457c2b37d2cSopenharmony_ci        }
458c2b37d2cSopenharmony_ci    }
459c2b37d2cSopenharmony_ci
460c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("end, result = %{public}d", result);
461c2b37d2cSopenharmony_ci    return result;
462c2b37d2cSopenharmony_ci}
463c2b37d2cSopenharmony_ci
464c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsCreateCommandExistentOptionArgument(const int &option, std::string &name,
465c2b37d2cSopenharmony_ci    std::string &shortName, OsAccountType &type, std::vector<std::string> &disallowedList)
466c2b37d2cSopenharmony_ci{
467c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
468c2b37d2cSopenharmony_ci
469c2b37d2cSopenharmony_ci    switch (option) {
470c2b37d2cSopenharmony_ci        case 'h': {
471c2b37d2cSopenharmony_ci            // 'acm create -h'
472c2b37d2cSopenharmony_ci            // 'acm create --help'
473c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
474c2b37d2cSopenharmony_ci            break;
475c2b37d2cSopenharmony_ci        }
476c2b37d2cSopenharmony_ci        case 'n': {
477c2b37d2cSopenharmony_ci            // 'acm create -n <name>'
478c2b37d2cSopenharmony_ci            // 'acm create --name <name>'
479c2b37d2cSopenharmony_ci            name = optarg;
480c2b37d2cSopenharmony_ci            break;
481c2b37d2cSopenharmony_ci        }
482c2b37d2cSopenharmony_ci        case 't': {
483c2b37d2cSopenharmony_ci            // 'acm create -t <type>'
484c2b37d2cSopenharmony_ci            // 'acm create --type <type>'
485c2b37d2cSopenharmony_ci            result = AnalyzeTypeArgument(type);
486c2b37d2cSopenharmony_ci            break;
487c2b37d2cSopenharmony_ci        }
488c2b37d2cSopenharmony_ci        case 's': {
489c2b37d2cSopenharmony_ci            // 'acm create -s <shortName>'
490c2b37d2cSopenharmony_ci            // 'acm create --shortName <shortName>'
491c2b37d2cSopenharmony_ci            shortName = optarg;
492c2b37d2cSopenharmony_ci            break;
493c2b37d2cSopenharmony_ci        }
494c2b37d2cSopenharmony_ci        case 'l': {
495c2b37d2cSopenharmony_ci            // 'acm create -l <disallowedlist>'
496c2b37d2cSopenharmony_ci            // 'acm create --disallowedlist <disallowedlist>'
497c2b37d2cSopenharmony_ci            result = AnalyzeDisallowedListArgument(disallowedList);
498c2b37d2cSopenharmony_ci            break;
499c2b37d2cSopenharmony_ci        }
500c2b37d2cSopenharmony_ci        default: {
501c2b37d2cSopenharmony_ci            break;
502c2b37d2cSopenharmony_ci        }
503c2b37d2cSopenharmony_ci    }
504c2b37d2cSopenharmony_ci
505c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("end, result = %{public}d", result);
506c2b37d2cSopenharmony_ci    return result;
507c2b37d2cSopenharmony_ci}
508c2b37d2cSopenharmony_ci
509c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsCommonCommandMissingOptionArgument(const std::string &command)
510c2b37d2cSopenharmony_ci{
511c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
512c2b37d2cSopenharmony_ci
513c2b37d2cSopenharmony_ci    switch (optopt) {
514c2b37d2cSopenharmony_ci        case 'i': {
515c2b37d2cSopenharmony_ci            // 'acm command -i <id>' with no argument: acm command -i
516c2b37d2cSopenharmony_ci            // 'acm command --id <id>' with no argument: acm command --id
517c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm %{public}s -i' with no argument.", command.c_str());
518c2b37d2cSopenharmony_ci
519c2b37d2cSopenharmony_ci            resultReceiver_.append(HELP_MSG_OPTION_REQUIRES_AN_ARGUMENT + "\n");
520c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
521c2b37d2cSopenharmony_ci            break;
522c2b37d2cSopenharmony_ci        }
523c2b37d2cSopenharmony_ci        default: {
524c2b37d2cSopenharmony_ci            // 'acm delete' with an unknown option: acm delete -x
525c2b37d2cSopenharmony_ci            // 'acm delete' with an unknown option: acm delete -xxx
526c2b37d2cSopenharmony_ci            std::string unknownOption = "";
527c2b37d2cSopenharmony_ci            std::string unknownOptionMsg = GetUnknownOptionMsg(unknownOption);
528c2b37d2cSopenharmony_ci
529c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm %{public}s' with an unknown option.",  command.c_str());
530c2b37d2cSopenharmony_ci
531c2b37d2cSopenharmony_ci            resultReceiver_.append(unknownOptionMsg);
532c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
533c2b37d2cSopenharmony_ci            break;
534c2b37d2cSopenharmony_ci        }
535c2b37d2cSopenharmony_ci    }
536c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("end, result = %{public}d", result);
537c2b37d2cSopenharmony_ci    return result;
538c2b37d2cSopenharmony_ci}
539c2b37d2cSopenharmony_ci
540c2b37d2cSopenharmony_ciErrCode AccountCommand::RunCommandError(const std::string &command)
541c2b37d2cSopenharmony_ci{
542c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
543c2b37d2cSopenharmony_ci
544c2b37d2cSopenharmony_ci    if (optind < 0 || optind >= argc_) {
545c2b37d2cSopenharmony_ci        ACCOUNT_LOGD("optind %{public}d invalid", optind);
546c2b37d2cSopenharmony_ci        return ERR_INVALID_VALUE;
547c2b37d2cSopenharmony_ci    }
548c2b37d2cSopenharmony_ci
549c2b37d2cSopenharmony_ci    // When scanning the first argument
550c2b37d2cSopenharmony_ci    if (strcmp(argv_[optind], cmd_.c_str()) == 0) {
551c2b37d2cSopenharmony_ci        // 'acm command' with no option: acm command
552c2b37d2cSopenharmony_ci        // 'acm command' with a wrong argument: acm command xxx
553c2b37d2cSopenharmony_ci        ACCOUNT_LOGD("'acm %{public}s' with no option.", command.c_str());
554c2b37d2cSopenharmony_ci
555c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_NO_OPTION + "\n");
556c2b37d2cSopenharmony_ci        result = ERR_INVALID_VALUE;
557c2b37d2cSopenharmony_ci    }
558c2b37d2cSopenharmony_ci
559c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("end, result = %{public}d", result);
560c2b37d2cSopenharmony_ci
561c2b37d2cSopenharmony_ci    return result;
562c2b37d2cSopenharmony_ci}
563c2b37d2cSopenharmony_ci
564c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsSetCommandMissingOptionArgument(void)
565c2b37d2cSopenharmony_ci{
566c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
567c2b37d2cSopenharmony_ci
568c2b37d2cSopenharmony_ci    switch (optopt) {
569c2b37d2cSopenharmony_ci        case 'i': {
570c2b37d2cSopenharmony_ci            // 'acm set -i <id>' with no argument: acm set -i
571c2b37d2cSopenharmony_ci            // 'acm set --id <id>' with no argument: acm set --id
572c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm set -i' with no argument.");
573c2b37d2cSopenharmony_ci
574c2b37d2cSopenharmony_ci            resultReceiver_.append(HELP_MSG_OPTION_REQUIRES_AN_ARGUMENT + "\n");
575c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
576c2b37d2cSopenharmony_ci            break;
577c2b37d2cSopenharmony_ci        }
578c2b37d2cSopenharmony_ci        case 'c': {
579c2b37d2cSopenharmony_ci            // 'acm set -c <constraints>' with no argument: acm set -c
580c2b37d2cSopenharmony_ci            // 'acm set --constraint <constraints>' with no argument: acm set --constraint
581c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'acm set -c' with no argument.");
582c2b37d2cSopenharmony_ci
583c2b37d2cSopenharmony_ci            resultReceiver_.append(HELP_MSG_OPTION_REQUIRES_AN_ARGUMENT + "\n");
584c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
585c2b37d2cSopenharmony_ci            break;
586c2b37d2cSopenharmony_ci        }
587c2b37d2cSopenharmony_ci        default: {
588c2b37d2cSopenharmony_ci            // 'acm set' with an unknown option: acm set -x
589c2b37d2cSopenharmony_ci            // 'acm set' with an unknown option: acm set -xxx
590c2b37d2cSopenharmony_ci            std::string unknownOption = "";
591c2b37d2cSopenharmony_ci            std::string unknownOptionMsg = GetUnknownOptionMsg(unknownOption);
592c2b37d2cSopenharmony_ci
593c2b37d2cSopenharmony_ci            ACCOUNT_LOGD("'set dump' with an unknown option.");
594c2b37d2cSopenharmony_ci
595c2b37d2cSopenharmony_ci            resultReceiver_.append(unknownOptionMsg);
596c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
597c2b37d2cSopenharmony_ci            break;
598c2b37d2cSopenharmony_ci        }
599c2b37d2cSopenharmony_ci    }
600c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("end, result = %{public}d", result);
601c2b37d2cSopenharmony_ci    return result;
602c2b37d2cSopenharmony_ci}
603c2b37d2cSopenharmony_ci
604c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsSetCommandExistentOptionArgument(
605c2b37d2cSopenharmony_ci    const int &option, int &id, std::vector<std::string> &constraints, bool &enable)
606c2b37d2cSopenharmony_ci{
607c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
608c2b37d2cSopenharmony_ci
609c2b37d2cSopenharmony_ci    switch (option) {
610c2b37d2cSopenharmony_ci        case 'h': {
611c2b37d2cSopenharmony_ci            // 'acm set -h'
612c2b37d2cSopenharmony_ci            // 'acm set --help'
613c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
614c2b37d2cSopenharmony_ci            break;
615c2b37d2cSopenharmony_ci        }
616c2b37d2cSopenharmony_ci        case 'i': {
617c2b37d2cSopenharmony_ci            // 'acm set -i <id>'
618c2b37d2cSopenharmony_ci            // 'acm set --id <id>'
619c2b37d2cSopenharmony_ci            result = AnalyzeLocalIdArgument(id);
620c2b37d2cSopenharmony_ci            break;
621c2b37d2cSopenharmony_ci        }
622c2b37d2cSopenharmony_ci        case 'c': {
623c2b37d2cSopenharmony_ci            // 'acm set -c <constraints>'
624c2b37d2cSopenharmony_ci            // 'acm set --constraint <constraints>'
625c2b37d2cSopenharmony_ci            result = AnalyzeConstraintArgument(constraints);
626c2b37d2cSopenharmony_ci            break;
627c2b37d2cSopenharmony_ci        }
628c2b37d2cSopenharmony_ci        case 'e': {
629c2b37d2cSopenharmony_ci            // 'acm set -e'
630c2b37d2cSopenharmony_ci            // 'acm set --enable'
631c2b37d2cSopenharmony_ci            enable = true;
632c2b37d2cSopenharmony_ci            break;
633c2b37d2cSopenharmony_ci        }
634c2b37d2cSopenharmony_ci        default: {
635c2b37d2cSopenharmony_ci            break;
636c2b37d2cSopenharmony_ci        }
637c2b37d2cSopenharmony_ci    }
638c2b37d2cSopenharmony_ci
639c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("end, result = %{public}d, id = %{public}d", result, id);
640c2b37d2cSopenharmony_ci    return result;
641c2b37d2cSopenharmony_ci}
642c2b37d2cSopenharmony_ci
643c2b37d2cSopenharmony_ciErrCode AccountCommand::RunAsCommonCommandExistentOptionArgument(const int &option, int &id)
644c2b37d2cSopenharmony_ci{
645c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
646c2b37d2cSopenharmony_ci
647c2b37d2cSopenharmony_ci    switch (option) {
648c2b37d2cSopenharmony_ci        case 'h': {
649c2b37d2cSopenharmony_ci            // 'acm command -h'
650c2b37d2cSopenharmony_ci            // 'acm command --help'
651c2b37d2cSopenharmony_ci            // command includes stop, switch, deactivate, dump, delete
652c2b37d2cSopenharmony_ci            result = ERR_INVALID_VALUE;
653c2b37d2cSopenharmony_ci            break;
654c2b37d2cSopenharmony_ci        }
655c2b37d2cSopenharmony_ci        case 'i': {
656c2b37d2cSopenharmony_ci            // 'acm command -i <id>'
657c2b37d2cSopenharmony_ci            // 'acm command --id <id>
658c2b37d2cSopenharmony_ci            // command includes stop, switch, deactivate, dump, delete
659c2b37d2cSopenharmony_ci            result = AnalyzeLocalIdArgument(id);
660c2b37d2cSopenharmony_ci            break;
661c2b37d2cSopenharmony_ci        }
662c2b37d2cSopenharmony_ci        default: {
663c2b37d2cSopenharmony_ci            break;
664c2b37d2cSopenharmony_ci        }
665c2b37d2cSopenharmony_ci    }
666c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("end, result = %{public}d, id = %{public}d", result, id);
667c2b37d2cSopenharmony_ci    return result;
668c2b37d2cSopenharmony_ci}
669c2b37d2cSopenharmony_ci
670c2b37d2cSopenharmony_ciErrCode AccountCommand::AnalyzeTypeArgument(OsAccountType &type)
671c2b37d2cSopenharmony_ci{
672c2b37d2cSopenharmony_ci    ErrCode result = ERR_OK;
673c2b37d2cSopenharmony_ci    std::string typeByUser = optarg;
674c2b37d2cSopenharmony_ci
675c2b37d2cSopenharmony_ci    if (typeByUser == "admin") {
676c2b37d2cSopenharmony_ci        type = OsAccountType::ADMIN;
677c2b37d2cSopenharmony_ci    } else if (typeByUser == "normal") {
678c2b37d2cSopenharmony_ci        type = OsAccountType::NORMAL;
679c2b37d2cSopenharmony_ci    } else if (typeByUser == "guest") {
680c2b37d2cSopenharmony_ci        type = OsAccountType::GUEST;
681c2b37d2cSopenharmony_ci    } else if (typeByUser == "private") {
682c2b37d2cSopenharmony_ci        type = OsAccountType::PRIVATE;
683c2b37d2cSopenharmony_ci    } else {
684c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_INVALID_TYPE_ARGUMENT + "\n");
685c2b37d2cSopenharmony_ci        result = ERR_INVALID_VALUE;
686c2b37d2cSopenharmony_ci    }
687c2b37d2cSopenharmony_ci
688c2b37d2cSopenharmony_ci    return result;
689c2b37d2cSopenharmony_ci}
690c2b37d2cSopenharmony_ci
691c2b37d2cSopenharmony_cistatic bool IsExistFile(const std::string &path)
692c2b37d2cSopenharmony_ci{
693c2b37d2cSopenharmony_ci    if (path.empty()) {
694c2b37d2cSopenharmony_ci        return false;
695c2b37d2cSopenharmony_ci    }
696c2b37d2cSopenharmony_ci
697c2b37d2cSopenharmony_ci    struct stat buf = {};
698c2b37d2cSopenharmony_ci    if (stat(path.c_str(), &buf) != 0) {
699c2b37d2cSopenharmony_ci        return false;
700c2b37d2cSopenharmony_ci    }
701c2b37d2cSopenharmony_ci
702c2b37d2cSopenharmony_ci    return S_ISREG(buf.st_mode);
703c2b37d2cSopenharmony_ci}
704c2b37d2cSopenharmony_ci
705c2b37d2cSopenharmony_cistatic ErrCode GetDisallowedListByPath(const std::string &path, std::vector<std::string> &disallowedList)
706c2b37d2cSopenharmony_ci{
707c2b37d2cSopenharmony_ci    if (!IsExistFile(path)) {
708c2b37d2cSopenharmony_ci        ACCOUNT_LOGE("cannot find file, path = %{public}s", path.c_str());
709c2b37d2cSopenharmony_ci        return ERR_ACCOUNT_COMMON_FILE_OPEN_FAILED;
710c2b37d2cSopenharmony_ci    }
711c2b37d2cSopenharmony_ci    std::ifstream readFile;
712c2b37d2cSopenharmony_ci    readFile.open(path.c_str(), std::ios::in);
713c2b37d2cSopenharmony_ci    if (!readFile.is_open()) {
714c2b37d2cSopenharmony_ci        ACCOUNT_LOGE("cannot open file, path = %{public}s", path.c_str());
715c2b37d2cSopenharmony_ci        return ERR_ACCOUNT_COMMON_FILE_OPEN_FAILED;
716c2b37d2cSopenharmony_ci    }
717c2b37d2cSopenharmony_ci    std::string str;
718c2b37d2cSopenharmony_ci    while (getline(readFile, str)) {
719c2b37d2cSopenharmony_ci        ACCOUNT_LOGI("read file, str = %{public}s", str.c_str());
720c2b37d2cSopenharmony_ci        disallowedList.emplace_back(str);
721c2b37d2cSopenharmony_ci    }
722c2b37d2cSopenharmony_ci    readFile.close();
723c2b37d2cSopenharmony_ci    return ERR_OK;
724c2b37d2cSopenharmony_ci}
725c2b37d2cSopenharmony_ci
726c2b37d2cSopenharmony_ciErrCode AccountCommand::AnalyzeDisallowedListArgument(std::vector<std::string> &disallowedList)
727c2b37d2cSopenharmony_ci{
728c2b37d2cSopenharmony_ci    std::string listPath = optarg;
729c2b37d2cSopenharmony_ci    return GetDisallowedListByPath(listPath, disallowedList);
730c2b37d2cSopenharmony_ci}
731c2b37d2cSopenharmony_ci
732c2b37d2cSopenharmony_ciErrCode AccountCommand::AnalyzeLocalIdArgument(int &id)
733c2b37d2cSopenharmony_ci{
734c2b37d2cSopenharmony_ci    std::string idByUser = optarg;
735c2b37d2cSopenharmony_ci    if (!StrToInt(idByUser, id)) {
736c2b37d2cSopenharmony_ci        resultReceiver_.append(HELP_MSG_INVALID_ID_ARGUMENT + "\n");
737c2b37d2cSopenharmony_ci        return ERR_INVALID_VALUE;
738c2b37d2cSopenharmony_ci    }
739c2b37d2cSopenharmony_ci
740c2b37d2cSopenharmony_ci    return ERR_OK;
741c2b37d2cSopenharmony_ci}
742c2b37d2cSopenharmony_ci
743c2b37d2cSopenharmony_ciErrCode AccountCommand::AnalyzeConstraintArgument(std::vector<std::string> &constraints)
744c2b37d2cSopenharmony_ci{
745c2b37d2cSopenharmony_ci    std::string constraintsByUser = optarg;
746c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("constraintsByUser = %{public}s", constraintsByUser.c_str());
747c2b37d2cSopenharmony_ci
748c2b37d2cSopenharmony_ci    constraints.clear();
749c2b37d2cSopenharmony_ci    std::string constraint = "";
750c2b37d2cSopenharmony_ci    std::string delimiter = ",";
751c2b37d2cSopenharmony_ci    size_t last = 0;
752c2b37d2cSopenharmony_ci    size_t next = 0;
753c2b37d2cSopenharmony_ci
754c2b37d2cSopenharmony_ci    while ((next = constraintsByUser.find(delimiter, last)) != std::string::npos) {
755c2b37d2cSopenharmony_ci        constraint = constraintsByUser.substr(last, next - last);
756c2b37d2cSopenharmony_ci        ACCOUNT_LOGD("constraint = %{public}s", constraint.c_str());
757c2b37d2cSopenharmony_ci
758c2b37d2cSopenharmony_ci        constraints.emplace_back(constraint);
759c2b37d2cSopenharmony_ci        last = next + 1;
760c2b37d2cSopenharmony_ci    }
761c2b37d2cSopenharmony_ci    constraint = constraintsByUser.substr(last);
762c2b37d2cSopenharmony_ci    ACCOUNT_LOGD("constraint = %{public}s", constraint.c_str());
763c2b37d2cSopenharmony_ci    constraints.emplace_back(constraint);
764c2b37d2cSopenharmony_ci
765c2b37d2cSopenharmony_ci    return ERR_OK;
766c2b37d2cSopenharmony_ci}
767c2b37d2cSopenharmony_ci}  // namespace AccountSA
768c2b37d2cSopenharmony_ci}  // namespace OHOS