1c2b37d2cSopenharmony_ci/* 2c2b37d2cSopenharmony_ci * Copyright (c) 2021-2022 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 16c2b37d2cSopenharmony_ci#include "account_dump_helper.h" 17c2b37d2cSopenharmony_ci#include <regex> 18c2b37d2cSopenharmony_ci#include "account_error_no.h" 19c2b37d2cSopenharmony_ci#include "account_info.h" 20c2b37d2cSopenharmony_ci#include "account_log_wrapper.h" 21c2b37d2cSopenharmony_ci#include "perf_stat.h" 22c2b37d2cSopenharmony_ci#include "string_ex.h" 23c2b37d2cSopenharmony_ci 24c2b37d2cSopenharmony_cinamespace OHOS { 25c2b37d2cSopenharmony_cinamespace AccountSA { 26c2b37d2cSopenharmony_cinamespace { 27c2b37d2cSopenharmony_ciconst std::int32_t ARGS_SIZE_ONE = 1; 28c2b37d2cSopenharmony_ciconst std::int32_t ARGS_SIZE_TWO = 2; 29c2b37d2cSopenharmony_ciconst std::int32_t FIRST_PARAMETER = 0; 30c2b37d2cSopenharmony_ciconst std::int32_t SECOND_PARAMETER = 1; 31c2b37d2cSopenharmony_ciconst std::string ARGS_HELP = "-h"; 32c2b37d2cSopenharmony_ciconst std::string ARGS_OHOS_ACCOUNT_INFOS = "-ohos_account_infos"; 33c2b37d2cSopenharmony_ciconst std::string ARGS_OS_ACCOUNT_INFOS = "-os_account_infos"; 34c2b37d2cSopenharmony_ciconst std::string ARGS_SHOW_LOG_LEVEL = "-show_log_level"; 35c2b37d2cSopenharmony_ciconst std::string ARGS_SET_LOG_LEVEL = "-set_log_level"; 36c2b37d2cSopenharmony_ciconst std::string ARGS_DUMP_TIME_INFO = "-time_info_dump"; 37c2b37d2cSopenharmony_ciconst std::string ILLEGAL_INFORMATION = "Account Manager service, enter '-h' for usage.\n"; 38c2b37d2cSopenharmony_ciconst std::string SYSTEM_ERROR = "System error: "; 39c2b37d2cSopenharmony_ciconst double ANONYMIZE_RATIO = 0.8; 40c2b37d2cSopenharmony_ciconst size_t MIN_ANONYMIZE_PART_LEN = 10; 41c2b37d2cSopenharmony_ciconst size_t MAX_INTERCEPT_PART_LEN = 4; 42c2b37d2cSopenharmony_ciconst size_t INTERCEPT_HEAD_PART_LEN_FOR_NAME = 1; 43c2b37d2cSopenharmony_ciconst std::string DEFAULT_ANON_STR = "**********"; 44c2b37d2cSopenharmony_ci} // namespace 45c2b37d2cSopenharmony_ci 46c2b37d2cSopenharmony_cistd::string AccountDumpHelper::AnonymizeNameStr(const std::string& nameStr) const 47c2b37d2cSopenharmony_ci{ 48c2b37d2cSopenharmony_ci if (nameStr == DEFAULT_OHOS_ACCOUNT_NAME || nameStr.empty()) { 49c2b37d2cSopenharmony_ci return nameStr; 50c2b37d2cSopenharmony_ci } 51c2b37d2cSopenharmony_ci std::string retStr = nameStr.substr(0, INTERCEPT_HEAD_PART_LEN_FOR_NAME) + DEFAULT_ANON_STR; 52c2b37d2cSopenharmony_ci return retStr; 53c2b37d2cSopenharmony_ci} 54c2b37d2cSopenharmony_ci 55c2b37d2cSopenharmony_cistd::string AccountDumpHelper::AnonymizeUidStr(const std::string& uidStr) const 56c2b37d2cSopenharmony_ci{ 57c2b37d2cSopenharmony_ci if (uidStr == DEFAULT_OHOS_ACCOUNT_UID || uidStr.empty()) { 58c2b37d2cSopenharmony_ci return uidStr; 59c2b37d2cSopenharmony_ci } 60c2b37d2cSopenharmony_ci 61c2b37d2cSopenharmony_ci size_t anonymizeLen = static_cast<size_t>(static_cast<double>(uidStr.length()) * ANONYMIZE_RATIO); 62c2b37d2cSopenharmony_ci size_t interceptLen = (uidStr.length() - anonymizeLen) / 2; // Half head and half tail 63c2b37d2cSopenharmony_ci if (anonymizeLen < MIN_ANONYMIZE_PART_LEN || interceptLen == 0) { 64c2b37d2cSopenharmony_ci return DEFAULT_ANON_STR; 65c2b37d2cSopenharmony_ci } 66c2b37d2cSopenharmony_ci interceptLen = (interceptLen > MAX_INTERCEPT_PART_LEN ? MAX_INTERCEPT_PART_LEN : interceptLen); 67c2b37d2cSopenharmony_ci 68c2b37d2cSopenharmony_ci std::string retStr = uidStr.substr(0, interceptLen); 69c2b37d2cSopenharmony_ci retStr += DEFAULT_ANON_STR; 70c2b37d2cSopenharmony_ci retStr += uidStr.substr(uidStr.length() - interceptLen); 71c2b37d2cSopenharmony_ci return retStr; 72c2b37d2cSopenharmony_ci} 73c2b37d2cSopenharmony_ci 74c2b37d2cSopenharmony_ciAccountDumpHelper::AccountDumpHelper(OsAccountManagerService* osAccountMgrService) 75c2b37d2cSopenharmony_ci{ 76c2b37d2cSopenharmony_ci osAccountMgrService_ = osAccountMgrService; 77c2b37d2cSopenharmony_ci} 78c2b37d2cSopenharmony_ci 79c2b37d2cSopenharmony_civoid AccountDumpHelper::Dump(const std::vector<std::string>& args, std::string& result) const 80c2b37d2cSopenharmony_ci{ 81c2b37d2cSopenharmony_ci result.clear(); 82c2b37d2cSopenharmony_ci auto argsSize = args.size(); 83c2b37d2cSopenharmony_ci if (argsSize == ARGS_SIZE_ONE) { 84c2b37d2cSopenharmony_ci ProcessOneParameter(args[FIRST_PARAMETER], result); 85c2b37d2cSopenharmony_ci } else if (argsSize == ARGS_SIZE_TWO) { 86c2b37d2cSopenharmony_ci ProcessTwoParameter(args[FIRST_PARAMETER], args[SECOND_PARAMETER], result); 87c2b37d2cSopenharmony_ci } else { 88c2b37d2cSopenharmony_ci ShowIllegalInformation(result); 89c2b37d2cSopenharmony_ci } 90c2b37d2cSopenharmony_ci} 91c2b37d2cSopenharmony_ci 92c2b37d2cSopenharmony_civoid AccountDumpHelper::ShowHelp(std::string& result) const 93c2b37d2cSopenharmony_ci{ 94c2b37d2cSopenharmony_ci result.append("Usage:dump <command> [options]\n") 95c2b37d2cSopenharmony_ci .append("Description:\n") 96c2b37d2cSopenharmony_ci .append("-ohos_account_infos :") 97c2b37d2cSopenharmony_ci .append("dump all distributed account information in the system\n") 98c2b37d2cSopenharmony_ci .append("-os_account_infos :") 99c2b37d2cSopenharmony_ci .append("dump all os account information in the system\n") 100c2b37d2cSopenharmony_ci .append("-show_log_level :") 101c2b37d2cSopenharmony_ci .append("show account SA's log level\n") 102c2b37d2cSopenharmony_ci .append("-set_log_level <level> :") 103c2b37d2cSopenharmony_ci .append("set account SA's log level\n") 104c2b37d2cSopenharmony_ci .append("-time_info_dump :") 105c2b37d2cSopenharmony_ci .append("dump some important time points\n"); 106c2b37d2cSopenharmony_ci} 107c2b37d2cSopenharmony_ci 108c2b37d2cSopenharmony_civoid AccountDumpHelper::ShowIllegalInformation(std::string& result) const 109c2b37d2cSopenharmony_ci{ 110c2b37d2cSopenharmony_ci result.append(ILLEGAL_INFORMATION); 111c2b37d2cSopenharmony_ci} 112c2b37d2cSopenharmony_ci 113c2b37d2cSopenharmony_civoid AccountDumpHelper::ShowOhosAccountInfo(std::string& result) const 114c2b37d2cSopenharmony_ci{ 115c2b37d2cSopenharmony_ci // check os account list 116c2b37d2cSopenharmony_ci std::vector<OsAccountInfo> osAccountInfos; 117c2b37d2cSopenharmony_ci ErrCode ret = IInnerOsAccountManager::GetInstance().QueryAllCreatedOsAccounts(osAccountInfos); 118c2b37d2cSopenharmony_ci if (ret != ERR_OK) { 119c2b37d2cSopenharmony_ci result.append("Cannot query os account list, error code "); 120c2b37d2cSopenharmony_ci result.append(std::to_string(ret)); 121c2b37d2cSopenharmony_ci return; 122c2b37d2cSopenharmony_ci } 123c2b37d2cSopenharmony_ci 124c2b37d2cSopenharmony_ci if (osAccountInfos.empty()) { 125c2b37d2cSopenharmony_ci result.append(SYSTEM_ERROR + "os account list empty.\n"); 126c2b37d2cSopenharmony_ci return; 127c2b37d2cSopenharmony_ci } 128c2b37d2cSopenharmony_ci 129c2b37d2cSopenharmony_ci result.append("OhosAccount info:\n"); 130c2b37d2cSopenharmony_ci for (size_t i = 0; i < osAccountInfos.size(); ++i) { 131c2b37d2cSopenharmony_ci AccountInfo accountInfo; 132c2b37d2cSopenharmony_ci (void)OhosAccountManager::GetInstance().GetAccountInfoByUserId(osAccountInfos[i].GetLocalId(), accountInfo); 133c2b37d2cSopenharmony_ci result.append(" Bind local user id: "); 134c2b37d2cSopenharmony_ci result.append(std::to_string(accountInfo.userId_) + "\n"); 135c2b37d2cSopenharmony_ci result.append(" OhosAccount name : "); 136c2b37d2cSopenharmony_ci result.append(AnonymizeNameStr(accountInfo.ohosAccountInfo_.name_) + "\n"); 137c2b37d2cSopenharmony_ci result.append(" OhosAccount uid : "); 138c2b37d2cSopenharmony_ci result.append(AnonymizeUidStr(accountInfo.ohosAccountInfo_.uid_) + "\n"); 139c2b37d2cSopenharmony_ci result.append(" OhosAccount status : "); 140c2b37d2cSopenharmony_ci result.append(std::to_string(accountInfo.ohosAccountInfo_.status_) + "\n"); 141c2b37d2cSopenharmony_ci result.append(" OhosAccount bind time: "); 142c2b37d2cSopenharmony_ci result.append(std::to_string(accountInfo.bindTime_) + "\n"); 143c2b37d2cSopenharmony_ci } 144c2b37d2cSopenharmony_ci} 145c2b37d2cSopenharmony_ci 146c2b37d2cSopenharmony_civoid AccountDumpHelper::ShowOsAccountInfo(std::string& result) const 147c2b37d2cSopenharmony_ci{ 148c2b37d2cSopenharmony_ci if (osAccountMgrService_ == nullptr) { 149c2b37d2cSopenharmony_ci result.append(SYSTEM_ERROR + "service ptr is null!\n"); 150c2b37d2cSopenharmony_ci ACCOUNT_LOGE("service ptr is null!"); 151c2b37d2cSopenharmony_ci return; 152c2b37d2cSopenharmony_ci } 153c2b37d2cSopenharmony_ci 154c2b37d2cSopenharmony_ci std::vector<std::string> states; 155c2b37d2cSopenharmony_ci ErrCode ret = osAccountMgrService_->DumpOsAccountInfo(states); 156c2b37d2cSopenharmony_ci if (ret != ERR_OK) { 157c2b37d2cSopenharmony_ci result.append("Cannot query os account list, error code "); 158c2b37d2cSopenharmony_ci result.append(std::to_string(ret)); 159c2b37d2cSopenharmony_ci return; 160c2b37d2cSopenharmony_ci } 161c2b37d2cSopenharmony_ci 162c2b37d2cSopenharmony_ci if (states.empty()) { 163c2b37d2cSopenharmony_ci result.append(SYSTEM_ERROR + "os account list empty.\n"); 164c2b37d2cSopenharmony_ci return; 165c2b37d2cSopenharmony_ci } 166c2b37d2cSopenharmony_ci 167c2b37d2cSopenharmony_ci result.append("OsAccount info:\n"); 168c2b37d2cSopenharmony_ci for (size_t i = 0; i < states.size(); ++i) { 169c2b37d2cSopenharmony_ci result.append(" " + states[i] + "\n"); 170c2b37d2cSopenharmony_ci } 171c2b37d2cSopenharmony_ci} 172c2b37d2cSopenharmony_ci 173c2b37d2cSopenharmony_civoid AccountDumpHelper::ProcessOneParameter(const std::string& arg, std::string& result) const 174c2b37d2cSopenharmony_ci{ 175c2b37d2cSopenharmony_ci if (arg == ARGS_HELP) { 176c2b37d2cSopenharmony_ci ShowHelp(result); 177c2b37d2cSopenharmony_ci } else if (arg == ARGS_OHOS_ACCOUNT_INFOS) { 178c2b37d2cSopenharmony_ci ShowOhosAccountInfo(result); 179c2b37d2cSopenharmony_ci } else if (arg == ARGS_OS_ACCOUNT_INFOS) { 180c2b37d2cSopenharmony_ci ShowOsAccountInfo(result); 181c2b37d2cSopenharmony_ci } else if (arg == ARGS_SHOW_LOG_LEVEL) { 182c2b37d2cSopenharmony_ci auto logLevel = static_cast<std::int32_t>(AccountLogWrapper::GetLogLevel()); 183c2b37d2cSopenharmony_ci result.append("Current Log Level: " + std::to_string(logLevel) + "\n"); 184c2b37d2cSopenharmony_ci } else if (arg == ARGS_DUMP_TIME_INFO) { 185c2b37d2cSopenharmony_ci PerfStat::GetInstance().Dump(result); 186c2b37d2cSopenharmony_ci } else { 187c2b37d2cSopenharmony_ci ShowHelp(result); 188c2b37d2cSopenharmony_ci } 189c2b37d2cSopenharmony_ci} 190c2b37d2cSopenharmony_ci 191c2b37d2cSopenharmony_civoid AccountDumpHelper::SetLogLevel(const std::string& levelStr, std::string& result) const 192c2b37d2cSopenharmony_ci{ 193c2b37d2cSopenharmony_ci if (!regex_match(levelStr, std::regex("^\\-?\\d+$"))) { 194c2b37d2cSopenharmony_ci ACCOUNT_LOGE("Invalid format of log level"); 195c2b37d2cSopenharmony_ci result.append("Invalid format of log level\n"); 196c2b37d2cSopenharmony_ci return; 197c2b37d2cSopenharmony_ci } 198c2b37d2cSopenharmony_ci int32_t level = 0; 199c2b37d2cSopenharmony_ci if (!StrToInt(levelStr, level)) { 200c2b37d2cSopenharmony_ci result.append("Invalid logLevel\n"); 201c2b37d2cSopenharmony_ci } 202c2b37d2cSopenharmony_ci if ((level < static_cast<std::int32_t>(AccountLogLevel::DEBUG)) || 203c2b37d2cSopenharmony_ci (level > static_cast<std::int32_t>(AccountLogLevel::FATAL))) { 204c2b37d2cSopenharmony_ci result.append("Invalid logLevel\n"); 205c2b37d2cSopenharmony_ci } else { 206c2b37d2cSopenharmony_ci AccountLogLevel logLevel = static_cast<AccountLogLevel>(level); 207c2b37d2cSopenharmony_ci AccountLogWrapper::SetLogLevel(logLevel); 208c2b37d2cSopenharmony_ci result.append("Set logLevel success\n"); 209c2b37d2cSopenharmony_ci } 210c2b37d2cSopenharmony_ci} 211c2b37d2cSopenharmony_ci 212c2b37d2cSopenharmony_civoid AccountDumpHelper::ProcessTwoParameter(const std::string& arg1, const std::string& arg2, std::string& result) const 213c2b37d2cSopenharmony_ci{ 214c2b37d2cSopenharmony_ci if (arg1 == ARGS_SET_LOG_LEVEL) { 215c2b37d2cSopenharmony_ci SetLogLevel(arg2, result); 216c2b37d2cSopenharmony_ci } else { 217c2b37d2cSopenharmony_ci ShowHelp(result); 218c2b37d2cSopenharmony_ci } 219c2b37d2cSopenharmony_ci} 220c2b37d2cSopenharmony_ci} // namespace AccountSA 221c2b37d2cSopenharmony_ci} // namespace OHOS 222