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