1 /*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "iinner_os_account_manager.h"
16 #include "account_event_provider.h"
17 #include <chrono>
18 #include <dlfcn.h>
19 #include <unistd.h>
20 #include "account_constants.h"
21 #include "account_info.h"
22 #include "account_info_report.h"
23 #include "account_log_wrapper.h"
24 #include "os_account_info.h"
25 #ifdef HAS_CES_PART
26 #include "common_event_support.h"
27 #endif // HAS_CES_PART
28 #include "domain_account_callback_service.h"
29 #include "hitrace_adapter.h"
30 #include "account_hisysevent_adapter.h"
31 #include "app_account_control_manager.h"
32 #include "ohos_account_kits.h"
33 #include "os_account_constants.h"
34 #include "os_account_control_file_manager.h"
35 #include "os_account_domain_account_callback.h"
36 #include "os_account_subscribe_manager.h"
37 #include "parameter.h"
38 #include "parcel.h"
39 #include <pthread.h>
40 #include <thread>
41 #include <unordered_set>
42 #ifdef HICOLLIE_ENABLE
43 #include "account_timer.h"
44 #include "xcollie/xcollie.h"
45 #endif // HICOLLIE_ENABLE
46
47 namespace OHOS {
48 namespace AccountSA {
49 namespace {
50 const std::string CONSTRAINT_CREATE_ACCOUNT_DIRECTLY = "constraint.os.account.create.directly";
51 const std::string ACCOUNT_READY_EVENT = "bootevent.account.ready";
52 const std::string PARAM_LOGIN_NAME_MAX = "persist.account.login_name_max";
53 const std::string SPECIAL_CHARACTER_ARRAY = "<>|\":*?/\\";
54 const std::vector<std::string> SHORT_NAME_CANNOT_BE_NAME_ARRAY = {".", ".."};
55 constexpr int32_t DELAY_FOR_EXCEPTION = 50;
56 constexpr int32_t MAX_RETRY_TIMES = 50;
57 constexpr int32_t MAX_PRIVATE_TYPE_NUMBER = 1;
58 constexpr int32_t DELAY_FOR_REMOVING_FOREGROUND_OS_ACCOUNT = 1500;
59 }
60
GetDomainAccountStatus(OsAccountInfo & osAccountInfo)61 static ErrCode GetDomainAccountStatus(OsAccountInfo &osAccountInfo)
62 {
63 DomainAccountInfo domainAccountInfo;
64 osAccountInfo.GetDomainInfo(domainAccountInfo);
65 DomainAccountInfo resultInfo;
66 ErrCode errCode = InnerDomainAccountManager::GetInstance().GetDomainAccountInfo(domainAccountInfo, resultInfo);
67 if (errCode != ERR_OK) {
68 return errCode;
69 }
70 if (!resultInfo.isAuthenticated) {
71 domainAccountInfo.status_ = DomainAccountStatus::LOGOUT;
72 } else {
73 bool isActivated = false;
74 (void)IInnerOsAccountManager::GetInstance().IsOsAccountActived(osAccountInfo.GetLocalId(), isActivated);
75 domainAccountInfo.status_ = isActivated ? DomainAccountStatus::LOGIN : DomainAccountStatus::LOGIN_BACKGROUND;
76 }
77 osAccountInfo.SetDomainInfo(domainAccountInfo);
78 return ERR_OK;
79 }
80
IInnerOsAccountManager()81 IInnerOsAccountManager::IInnerOsAccountManager() : subscribeManager_(OsAccountSubscribeManager::GetInstance()),
82 pluginManager_(OsAccountPluginManager::GetInstance())
83 {
84 activeAccountId_.clear();
85 operatingId_.clear();
86 osAccountControl_ = std::make_shared<OsAccountControlFileManager>();
87 osAccountControl_->Init();
88 osAccountControl_->GetDeviceOwnerId(deviceOwnerId_);
89 osAccountControl_->GetDefaultActivatedOsAccount(defaultActivatedId_);
90 osAccountControl_->GetOsAccountConfig(config_);
91 ACCOUNT_LOGI("Init end, maxOsAccountNum: %{public}d, maxLoggedInOsAccountNum: %{public}d",
92 config_.maxOsAccountNum, config_.maxLoggedInOsAccountNum);
93 }
94
GetInstance()95 IInnerOsAccountManager &IInnerOsAccountManager::GetInstance()
96 {
97 static IInnerOsAccountManager *instance = new (std::nothrow) IInnerOsAccountManager();
98 return *instance;
99 }
100
SetOsAccountControl(std::shared_ptr<IOsAccountControl> ptr)101 void IInnerOsAccountManager::SetOsAccountControl(std::shared_ptr<IOsAccountControl> ptr)
102 {
103 osAccountControl_ = ptr;
104 }
105
CreateBaseAdminAccount()106 void IInnerOsAccountManager::CreateBaseAdminAccount()
107 {
108 ACCOUNT_LOGI("start to create admin account");
109 bool isExistsAccount = false;
110 osAccountControl_->IsOsAccountExists(Constants::ADMIN_LOCAL_ID, isExistsAccount);
111 if (!isExistsAccount) {
112 int64_t serialNumber =
113 Constants::CARRY_NUM * Constants::SERIAL_NUMBER_NUM_START_FOR_ADMIN + Constants::ADMIN_LOCAL_ID;
114 OsAccountInfo osAccountInfo(
115 Constants::ADMIN_LOCAL_ID, Constants::ADMIN_LOCAL_NAME, OsAccountType::ADMIN, serialNumber);
116 int64_t time =
117 std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch())
118 .count();
119 osAccountInfo.SetCreateTime(time);
120 osAccountInfo.SetIsCreateCompleted(true);
121 osAccountInfo.SetIsActived(true); // admin local account is always active
122 osAccountControl_->InsertOsAccount(osAccountInfo);
123 ReportOsAccountLifeCycle(osAccountInfo.GetLocalId(), Constants::OPERATION_CREATE);
124 ACCOUNT_LOGI("OsAccountAccountMgr created admin account end");
125 } else {
126 ACCOUNT_LOGI("OsAccountAccountMgr admin account already exists");
127 }
128 }
129
CreateBaseStandardAccount()130 void IInnerOsAccountManager::CreateBaseStandardAccount()
131 {
132 ACCOUNT_LOGI("start to create base account");
133 int64_t serialNumber = 0;
134 osAccountControl_->GetSerialNumber(serialNumber);
135 #ifdef ENABLE_DEFAULT_ADMIN_NAME
136 OsAccountInfo osAccountInfo(Constants::START_USER_ID, Constants::STANDARD_LOCAL_NAME,
137 OsAccountType::ADMIN, serialNumber);
138 #else
139 OsAccountInfo osAccountInfo(Constants::START_USER_ID, "", OsAccountType::ADMIN, serialNumber);
140 #endif //ENABLE_DEFAULT_ADMIN_NAME
141 std::vector<std::string> constraints;
142 ErrCode errCode = osAccountControl_->GetConstraintsByType(OsAccountType::ADMIN, constraints);
143 if (errCode != ERR_OK) {
144 ACCOUNT_LOGE("Fail to get constraints by type for the system OS account, errCode %{public}d.", errCode);
145 return;
146 }
147 osAccountInfo.SetConstraints(constraints);
148 int64_t time =
149 std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch())
150 .count();
151 osAccountInfo.SetCreateTime(time);
152 osAccountInfo.SetIsCreateCompleted(false);
153 osAccountInfo.SetIsDataRemovable(false);
154 osAccountControl_->InsertOsAccount(osAccountInfo);
155 if (SendMsgForAccountCreate(osAccountInfo) != ERR_OK) {
156 ACCOUNT_LOGE("First OS account not created completely");
157 return;
158 }
159 SetDefaultActivatedOsAccount(Constants::START_USER_ID);
160 ACCOUNT_LOGI("OsAccountAccountMgr created base account end");
161 }
162
RetryToGetAccount(OsAccountInfo & osAccountInfo)163 void IInnerOsAccountManager::RetryToGetAccount(OsAccountInfo &osAccountInfo)
164 {
165 int32_t retryTimes = 0;
166 while (retryTimes < MAX_RETRY_TIMES) {
167 std::vector<OsAccountInfo> osAccountInfos;
168 QueryAllCreatedOsAccounts(osAccountInfos);
169 if (!osAccountInfos.empty() && (IsValidOsAccount(osAccountInfos[0]) == ERR_OK)) {
170 osAccountInfo = osAccountInfos[0];
171 return;
172 }
173 ACCOUNT_LOGE("fail to query accounts");
174 retryTimes++;
175 std::this_thread::sleep_for(std::chrono::milliseconds(DELAY_FOR_EXCEPTION));
176 }
177
178 #ifdef ENABLE_DEFAULT_ADMIN_NAME
179 while (CreateOsAccount(Constants::STANDARD_LOCAL_NAME, ADMIN, osAccountInfo) != ERR_OK) {
180 #else
181 while (CreateOsAccount("", ADMIN, osAccountInfo) != ERR_OK) {
182 #endif
183 ACCOUNT_LOGE("fail to create account");
184 std::this_thread::sleep_for(std::chrono::milliseconds(DELAY_FOR_EXCEPTION));
185 }
186 }
187
188 ErrCode IInnerOsAccountManager::GetRealOsAccountInfoById(const int id, OsAccountInfo &osAccountInfo)
189 {
190 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
191 if (errCode != ERR_OK) {
192 return errCode;
193 }
194
195 bool isVerified = false;
196 verifiedAccounts_.Find(id, isVerified);
197 osAccountInfo.SetIsVerified(isVerified);
198
199 bool isLoggedIn = false;
200 loggedInAccounts_.Find(id, isLoggedIn);
201 osAccountInfo.SetIsLoggedIn(isLoggedIn);
202
203 bool isActivated = IsOsAccountIDInActiveList(id);
204 osAccountInfo.SetIsActived(isActivated);
205
206 int32_t foregroundId = -1;
207 foregroundAccountMap_.Find(Constants::DEFAULT_DISPALY_ID, foregroundId);
208 osAccountInfo.SetIsForeground(foregroundId == id);
209
210 return ERR_OK;
211 }
212
213 ErrCode IInnerOsAccountManager::ActivateDefaultOsAccount()
214 {
215 #ifdef HICOLLIE_ENABLE
216 int timerId =
217 HiviewDFX::XCollie::GetInstance().SetTimer(TIMER_NAME, TIMEOUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
218 #endif // HICOLLIE_ENABLE
219 ACCOUNT_LOGI("start to activate default account");
220 OsAccountInfo osAccountInfo;
221 ErrCode errCode = GetRealOsAccountInfoById(defaultActivatedId_, osAccountInfo);
222 if ((errCode != ERR_OK) || (IsValidOsAccount(osAccountInfo) != ERR_OK)) {
223 ACCOUNT_LOGE("account not found, localId: %{public}d, error: %{public}d", defaultActivatedId_, errCode);
224 ReportOsAccountOperationFail(defaultActivatedId_, Constants::OPERATION_ACTIVATE, errCode,
225 "Account not found or to be removed");
226 RetryToGetAccount(osAccountInfo);
227 ReportOsAccountOperationFail(osAccountInfo.GetLocalId(), Constants::OPERATION_ACTIVATE, errCode,
228 "Retry to get account");
229 SetDefaultActivatedOsAccount(osAccountInfo.GetLocalId());
230 }
231 // activate
232 errCode = SendMsgForAccountActivate(osAccountInfo);
233 if (errCode == ERR_OK) {
234 SetParameter(ACCOUNT_READY_EVENT.c_str(), "true");
235 }
236 #ifdef HICOLLIE_ENABLE
237 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
238 #endif // HICOLLIE_ENABLE
239 return errCode;
240 }
241
242 void IInnerOsAccountManager::RestartActiveAccount()
243 {
244 // query active account to restart and refresh into list
245 std::vector<OsAccountInfo> osAccountInfos;
246 if (QueryAllCreatedOsAccounts(osAccountInfos) != ERR_OK) {
247 return;
248 }
249 for (size_t i = 0; i < osAccountInfos.size(); ++i) {
250 OsAccountInfo osAccountInfo = osAccountInfos[i];
251 std::int32_t id = osAccountInfo.GetLocalId();
252 if (osAccountInfo.GetIsActived() && id != Constants::START_USER_ID) {
253 // reactivate account state
254 if (ActivateOsAccount(id) != ERR_OK) {
255 ACCOUNT_LOGE("active base account failed");
256 return;
257 }
258 }
259 }
260 }
261
262 void IInnerOsAccountManager::ResetAccountStatus(void)
263 {
264 std::vector<int32_t> idList;
265 (void) osAccountControl_->GetOsAccountIdList(idList);
266 for (const auto id : idList) {
267 DeactivateOsAccountById(id);
268 }
269 }
270
271 ErrCode IInnerOsAccountManager::PrepareOsAccountInfo(const std::string &name, const OsAccountType &type,
272 const DomainAccountInfo &domainInfo, OsAccountInfo &osAccountInfo)
273 {
274 return PrepareOsAccountInfo(name, "", type, domainInfo, osAccountInfo);
275 }
276
277 ErrCode IInnerOsAccountManager::PrepareOsAccountInfo(const std::string &localName, const std::string &shortName,
278 const OsAccountType &type, const DomainAccountInfo &domainInfo, OsAccountInfo &osAccountInfo)
279 {
280 ErrCode errCode = FillOsAccountInfo(localName, shortName, type, domainInfo, osAccountInfo);
281 if (errCode != ERR_OK) {
282 return errCode;
283 }
284 errCode = ValidateOsAccount(osAccountInfo);
285 if (errCode != ERR_OK) {
286 ACCOUNT_LOGE("account name already exist, errCode %{public}d.", errCode);
287 return errCode;
288 }
289 errCode = CheckTypeNumber(type);
290 if (errCode != ERR_OK) {
291 ACCOUNT_LOGE("Check type number failed.");
292 return errCode;
293 }
294 if (!CheckAndAddLocalIdOperating(osAccountInfo.GetLocalId())) {
295 ACCOUNT_LOGW("Account id = %{public}d already in operating", osAccountInfo.GetLocalId());
296 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_OPERATING_ERROR;
297 }
298 errCode = osAccountControl_->InsertOsAccount(osAccountInfo);
299 if (errCode != ERR_OK) {
300 ACCOUNT_LOGE("insert os account info err, errCode %{public}d.", errCode);
301 return errCode;
302 }
303 osAccountControl_->UpdateAccountIndex(osAccountInfo, false);
304
305 errCode = osAccountControl_->UpdateBaseOAConstraints(std::to_string(osAccountInfo.GetLocalId()),
306 osAccountInfo.GetConstraints(), true);
307 if (errCode != ERR_OK) {
308 ACCOUNT_LOGE("UpdateBaseOAConstraints err");
309 return errCode;
310 }
311 return ERR_OK;
312 }
313
314 ErrCode IInnerOsAccountManager::FillOsAccountInfo(const std::string &localName, const std::string &shortName,
315 const OsAccountType &type, const DomainAccountInfo &domainInfo, OsAccountInfo &osAccountInfo)
316 {
317 int64_t serialNumber;
318 ErrCode errCode = osAccountControl_->GetSerialNumber(serialNumber);
319 if (errCode != ERR_OK) {
320 ACCOUNT_LOGE("failed to GetSerialNumber, errCode %{public}d.", errCode);
321 return errCode;
322 }
323 int id = 0;
324 errCode = osAccountControl_->GetAllowCreateId(id);
325 if (errCode != ERR_OK) {
326 ACCOUNT_LOGE("failed to GetAllowCreateId, errCode %{public}d.", errCode);
327 return errCode;
328 }
329 std::vector<std::string> constraints;
330 constraints.clear();
331 errCode = osAccountControl_->GetConstraintsByType(type, constraints);
332 if (errCode != ERR_OK) {
333 ACCOUNT_LOGE("Failed to GetConstraintsByType, errCode %{public}d.", errCode);
334 return errCode;
335 }
336
337 osAccountInfo = OsAccountInfo(id, localName, shortName, type, serialNumber);
338 osAccountInfo.SetConstraints(constraints);
339 int64_t time =
340 std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count();
341 osAccountInfo.SetCreateTime(time);
342 if (!osAccountInfo.SetDomainInfo(domainInfo)) {
343 ACCOUNT_LOGE("failed to SetDomainInfo");
344 return ERR_OSACCOUNT_KIT_CREATE_OS_ACCOUNT_FOR_DOMAIN_ERROR;
345 }
346 return ERR_OK;
347 }
348
349 ErrCode IInnerOsAccountManager::PrepareOsAccountInfoWithFullInfo(OsAccountInfo &osAccountInfo)
350 {
351 int64_t serialNumber;
352 ErrCode errCode = osAccountControl_->GetSerialNumber(serialNumber);
353 if (errCode != ERR_OK) {
354 ACCOUNT_LOGE("Failed to GetSerialNumber, errCode %{public}d.", errCode);
355 return errCode;
356 }
357 osAccountInfo.SetSerialNumber(serialNumber);
358 osAccountInfo.SetIsDataRemovable(false);
359 errCode = osAccountControl_->SetNextLocalId(osAccountInfo.GetLocalId() + 1);
360 if (errCode != ERR_OK) {
361 ACCOUNT_LOGE("Failed to SetNextLocalId, errCode %{public}d.", errCode);
362 return errCode;
363 }
364 errCode = osAccountControl_->InsertOsAccount(osAccountInfo);
365 if ((errCode != ERR_OK) && (errCode != ERR_OSACCOUNT_SERVICE_CONTROL_INSERT_FILE_EXISTS_ERROR)) {
366 ACCOUNT_LOGE("Insert os account info err, errCode %{public}d.", errCode);
367 return errCode;
368 }
369
370 osAccountControl_->UpdateAccountIndex(osAccountInfo, false);
371
372 std::vector<std::string> constraints;
373 constraints.clear();
374 OsAccountType type = static_cast<OsAccountType>(osAccountInfo.GetType());
375 errCode = osAccountControl_->GetConstraintsByType(type, constraints);
376 if (errCode != ERR_OK) {
377 ACCOUNT_LOGE("Failed to GetConstraintsByType, errCode %{public}d.", errCode);
378 return errCode;
379 }
380 std::vector<std::string> constraintsExists = osAccountInfo.GetConstraints();
381 std::vector<std::string> constraintsResult;
382 std::merge(constraints.begin(), constraints.end(), constraintsExists.begin(), constraintsExists.end(),
383 std::back_inserter(constraintsResult));
384 osAccountInfo.SetConstraints(constraintsResult);
385 errCode = osAccountControl_->UpdateBaseOAConstraints(
386 std::to_string(osAccountInfo.GetLocalId()), constraintsResult, true);
387 if (errCode != ERR_OK) {
388 ACCOUNT_LOGE("UpdateBaseOAConstraints err");
389 return errCode;
390 }
391 return ERR_OK;
392 }
393
394 bool IInnerOsAccountManager::CheckAndCleanOsAccounts()
395 {
396 unsigned int osAccountNum = 0;
397 GetCreatedOsAccountsCount(osAccountNum);
398
399 if (osAccountNum < config_.maxOsAccountNum) {
400 return true;
401 }
402
403 ACCOUNT_LOGI("The number of OS accounts has oversize, attempting to clean garbage accounts.");
404 if (CleanGarbageOsAccounts() <= 0) {
405 ACCOUNT_LOGE("The number of OS accounts still oversize after cleaning, max num: %{public}d",
406 config_.maxOsAccountNum);
407 return false;
408 }
409 return true;
410 }
411
412 ErrCode IInnerOsAccountManager::SendMsgForAccountCreate(
413 OsAccountInfo &osAccountInfo, const CreateOsAccountOptions &options)
414 {
415 ErrCode errCode = OsAccountInterface::SendToStorageAccountCreate(osAccountInfo);
416 if (errCode != ERR_OK) {
417 ACCOUNT_LOGE("create os account SendToStorageAccountCreate failed, errCode %{public}d.", errCode);
418 return ERR_ACCOUNT_COMMON_GET_SYSTEM_ABILITY_MANAGER;
419 }
420 int32_t localId = osAccountInfo.GetLocalId();
421 #ifdef HAS_THEME_SERVICE_PART
422 auto task = [localId] { OsAccountInterface::InitThemeResource(localId); };
423 std::thread theme_thread(task);
424 pthread_setname_np(theme_thread.native_handle(), "InitTheme");
425 #endif
426 errCode = OsAccountInterface::SendToBMSAccountCreate(osAccountInfo, options.disallowedHapList);
427 if (errCode != ERR_OK) {
428 ACCOUNT_LOGE("create os account SendToBMSAccountCreate failed, errCode %{public}d.", errCode);
429 if (osAccountInfo.GetIsDataRemovable()) {
430 (void)OsAccountInterface::SendToStorageAccountRemove(osAccountInfo);
431 }
432 #ifdef HAS_THEME_SERVICE_PART
433 if (theme_thread.joinable()) {
434 theme_thread.join();
435 }
436 #endif
437 return errCode;
438 }
439 #ifdef HAS_THEME_SERVICE_PART
440 if (theme_thread.joinable()) {
441 theme_thread.join();
442 }
443 #endif
444 AppAccountControlManager::GetInstance().SetOsAccountRemoved(osAccountInfo.GetLocalId(), false);
445 osAccountInfo.SetIsCreateCompleted(true);
446 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
447 if (errCode != ERR_OK) {
448 ACCOUNT_LOGE("create os account when update isCreateCompleted");
449 ReportOsAccountOperationFail(localId, Constants::OPERATION_CREATE, errCode, "Failed to update OS account");
450 if (osAccountInfo.GetIsDataRemovable()) {
451 (void)OsAccountInterface::SendToBMSAccountDelete(osAccountInfo);
452 (void)OsAccountInterface::SendToStorageAccountRemove(osAccountInfo);
453 }
454 return ERR_OSACCOUNT_SERVICE_INNER_UPDATE_ACCOUNT_ERROR;
455 }
456 (void)OsAccountInterface::SendToStorageAccountCreateComplete(localId);
457 ReportOsAccountLifeCycle(localId, Constants::OPERATION_CREATE);
458 OsAccountInterface::SendToCESAccountCreate(osAccountInfo);
459 subscribeManager_.Publish(localId, OS_ACCOUNT_SUBSCRIBE_TYPE::CREATED);
460 ACCOUNT_LOGI("OsAccountAccountMgr send to storage and bm for start success");
461 return ERR_OK;
462 }
463
464 ErrCode IInnerOsAccountManager::CreateOsAccount(
465 const std::string &name, const OsAccountType &type, OsAccountInfo &osAccountInfo)
466 {
467 if (!pluginManager_.IsCreationAllowed()) {
468 ACCOUNT_LOGI("Not allow creation account.");
469 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_PLUGIN_NOT_ALLOWED_CREATION_ERROR;
470 }
471 #ifdef HICOLLIE_ENABLE
472 AccountTimer timer;
473 #endif // HICOLLIE_ENABLE
474 if (!CheckAndCleanOsAccounts()) {
475 return ERR_OSACCOUNT_SERVICE_CONTROL_MAX_CAN_CREATE_ERROR;
476 }
477 DomainAccountInfo domainInfo; // default empty domain info
478 ErrCode errCode = PrepareOsAccountInfo(name, type, domainInfo, osAccountInfo);
479 if (errCode != ERR_OK) {
480 RemoveLocalIdToOperating(osAccountInfo.GetLocalId());
481 return errCode;
482 }
483 errCode = SendMsgForAccountCreate(osAccountInfo);
484 RemoveLocalIdToOperating(osAccountInfo.GetLocalId());
485 if (errCode != ERR_OK) {
486 (void)osAccountControl_->DelOsAccount(osAccountInfo.GetLocalId());
487 }
488 return errCode;
489 }
490
491 ErrCode IInnerOsAccountManager::CreateOsAccount(const std::string &localName, const std::string &shortName,
492 const OsAccountType &type, OsAccountInfo &osAccountInfo, const CreateOsAccountOptions &options)
493 {
494 if (!pluginManager_.IsCreationAllowed()) {
495 ACCOUNT_LOGI("Not allow creation account.");
496 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_PLUGIN_NOT_ALLOWED_CREATION_ERROR;
497 }
498 #ifdef HICOLLIE_ENABLE
499 AccountTimer timer;
500 #endif // HICOLLIE_ENABLE
501 osAccountInfo.SetLocalName(localName);
502 #ifdef ENABLE_ACCOUNT_SHORT_NAME
503 OsAccountInfo accountInfoOld;
504 ErrCode code = QueryOsAccountById(Constants::START_USER_ID, accountInfoOld);
505 if (code != ERR_OK) {
506 ACCOUNT_LOGE("QueryOsAccountById error, errCode %{public}d.", code);
507 return code;
508 }
509 if (accountInfoOld.GetShortName().empty()) {
510 accountInfoOld.SetType(type);
511 accountInfoOld.SetLocalName(localName);
512 accountInfoOld.SetShortName(shortName);
513 code = osAccountControl_->UpdateOsAccount(accountInfoOld);
514 if (code != ERR_OK) {
515 ReportOsAccountOperationFail(Constants::START_USER_ID, Constants::OPERATION_CREATE, code,
516 "Failed to update OS account");
517 }
518 osAccountControl_->UpdateAccountIndex(accountInfoOld, false);
519 osAccountInfo = accountInfoOld;
520 return code;
521 }
522 #endif // ENABLE_ACCOUNT_SHORT_NAME
523 if (!CheckAndCleanOsAccounts()) {
524 return ERR_OSACCOUNT_SERVICE_CONTROL_MAX_CAN_CREATE_ERROR;
525 }
526 DomainAccountInfo domainInfo; // default empty domain info
527 ErrCode errCode = PrepareOsAccountInfo(localName, shortName, type, domainInfo, osAccountInfo);
528 if (errCode != ERR_OK) {
529 RemoveLocalIdToOperating(osAccountInfo.GetLocalId());
530 return errCode;
531 }
532 errCode = SendMsgForAccountCreate(osAccountInfo, options);
533 RemoveLocalIdToOperating(osAccountInfo.GetLocalId());
534 if (errCode != ERR_OK) {
535 (void)osAccountControl_->DelOsAccount(osAccountInfo.GetLocalId());
536 }
537 return errCode;
538 }
539
540 ErrCode IInnerOsAccountManager::ValidateShortName(const std::string &shortName)
541 {
542 size_t shortNameSize = shortName.size();
543 if (shortNameSize == 0 || shortNameSize > Constants::SHORT_NAME_MAX_SIZE) {
544 ACCOUNT_LOGE("CreateOsAccount short name length %{public}zu is invalid!", shortNameSize);
545 return ERR_ACCOUNT_COMMON_INVALID_PARAMETER;
546 }
547
548 if (shortName.find_first_of(SPECIAL_CHARACTER_ARRAY) != std::string::npos) {
549 ACCOUNT_LOGE("CreateOsAccount short name is invalidate, short name is %{public}s !", shortName.c_str());
550 return ERR_ACCOUNT_COMMON_INVALID_PARAMETER;
551 }
552
553 for (size_t i = 0; i < SHORT_NAME_CANNOT_BE_NAME_ARRAY.size(); i++) {
554 if (shortName == SHORT_NAME_CANNOT_BE_NAME_ARRAY[i]) {
555 ACCOUNT_LOGE("CreateOsAccount short name is invalidate, short name is %{public}s !", shortName.c_str());
556 return ERR_ACCOUNT_COMMON_INVALID_PARAMETER;
557 }
558 }
559 return ERR_OK;
560 }
561
562 ErrCode IInnerOsAccountManager::CreateOsAccountWithFullInfo(OsAccountInfo &osAccountInfo,
563 const CreateOsAccountOptions &options)
564 {
565 if (!pluginManager_.IsCreationAllowed()) {
566 ACCOUNT_LOGI("Not allow creation account.");
567 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_PLUGIN_NOT_ALLOWED_CREATION_ERROR;
568 }
569 #ifdef HICOLLIE_ENABLE
570 AccountTimer timer;
571 #endif // HICOLLIE_ENABLE
572 if (!CheckAndAddLocalIdOperating(osAccountInfo.GetLocalId())) {
573 ACCOUNT_LOGW("Account id = %{public}d already in operating", osAccountInfo.GetLocalId());
574 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_OPERATING_ERROR;
575 }
576 ErrCode errCode = PrepareOsAccountInfoWithFullInfo(osAccountInfo);
577 if (errCode != ERR_OK) {
578 RemoveLocalIdToOperating(osAccountInfo.GetLocalId());
579 return errCode;
580 }
581 errCode = SendMsgForAccountCreate(osAccountInfo, options);
582 RemoveLocalIdToOperating(osAccountInfo.GetLocalId());
583 if (errCode != ERR_OK) {
584 (void)osAccountControl_->DelOsAccount(osAccountInfo.GetLocalId());
585 }
586 return errCode;
587 }
588
589 ErrCode IInnerOsAccountManager::UpdateAccountStatusForDomain(const int id, DomainAccountStatus status)
590 {
591 OsAccountInfo accountInfo;
592 DomainAccountInfo domainInfo;
593 ErrCode errCode = GetOsAccountInfoById(id, accountInfo);
594 if (errCode != ERR_OK) {
595 return errCode;
596 }
597 accountInfo.GetDomainInfo(domainInfo);
598 domainInfo.status_ = status;
599 accountInfo.SetDomainInfo(domainInfo);
600
601 errCode = osAccountControl_->UpdateOsAccount(accountInfo);
602 if (errCode != ERR_OK) {
603 ACCOUNT_LOGE("update osaccount info error %{public}d, id: %{public}d", errCode, accountInfo.GetLocalId());
604 return errCode;
605 }
606 return ERR_OK;
607 }
608
609 ErrCode IInnerOsAccountManager::UpdateOsAccountWithFullInfo(OsAccountInfo &newInfo)
610 {
611 int32_t localId = newInfo.GetLocalId();
612 if (!CheckAndAddLocalIdOperating(localId)) {
613 ACCOUNT_LOGE("the %{public}d already in operating", localId);
614 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_OPERATING_ERROR;
615 }
616 OsAccountInfo oldInfo;
617 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(localId, oldInfo);
618 if (errCode != ERR_OK) {
619 RemoveLocalIdToOperating(localId);
620 return errCode;
621 }
622 oldInfo.SetLocalName(newInfo.GetLocalName());
623 oldInfo.SetType(newInfo.GetType());
624 oldInfo.SetPhoto(newInfo.GetPhoto());
625 oldInfo.SetConstraints(newInfo.GetConstraints());
626 errCode = osAccountControl_->UpdateOsAccount(oldInfo);
627 osAccountControl_->UpdateAccountIndex(oldInfo, false);
628 newInfo = oldInfo;
629 if (errCode != ERR_OK) {
630 ReportOsAccountOperationFail(localId, Constants::OPERATION_UPDATE, errCode, "UpdateOsAccount failed!");
631 } else {
632 OsAccountInterface::PublishCommonEvent(oldInfo,
633 OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_INFO_UPDATED, Constants::OPERATION_UPDATE);
634 }
635 RemoveLocalIdToOperating(localId);
636 return errCode;
637 }
638
639 bool IInnerOsAccountManager::CheckDomainAccountBound(
640 const std::vector<OsAccountInfo> &osAccountInfos, const DomainAccountInfo &info)
641 {
642 for (size_t i = 0; i < osAccountInfos.size(); ++i) {
643 DomainAccountInfo curInfo;
644 osAccountInfos[i].GetDomainInfo(curInfo);
645 if ((!info.accountId_.empty() && curInfo.accountId_ == info.accountId_) ||
646 ((curInfo.accountName_ == info.accountName_) && (curInfo.domain_ == info.domain_))) {
647 return true;
648 }
649 }
650 return false;
651 }
652
653 ErrCode IInnerOsAccountManager::BindDomainAccount(const OsAccountType &type,
654 const DomainAccountInfo &domainAccountInfo, OsAccountInfo &osAccountInfo,
655 const CreateOsAccountForDomainOptions &options)
656 {
657 std::vector<OsAccountInfo> osAccountInfos;
658 (void)QueryAllCreatedOsAccounts(osAccountInfos);
659 if (CheckDomainAccountBound(osAccountInfos, domainAccountInfo)) {
660 ACCOUNT_LOGE("the domain account is already bound");
661 return ERR_OSACCOUNT_SERVICE_INNER_DOMAIN_ALREADY_BIND_ERROR;
662 }
663 #ifdef ENABLE_MULTIPLE_OS_ACCOUNTS
664 bool isEnabled = false;
665 (void)IsOsAccountConstraintEnable(Constants::START_USER_ID, CONSTRAINT_CREATE_ACCOUNT_DIRECTLY, isEnabled);
666 #else
667 bool isEnabled = true;
668 #endif // ENABLE_MULTIPLE_OS_ACCOUNTS
669 if (isEnabled && (osAccountInfos.size() == 1) && (osAccountInfos[0].GetLocalId() == Constants::START_USER_ID)) {
670 DomainAccountInfo curDomainInfo;
671 osAccountInfos[0].GetDomainInfo(curDomainInfo);
672 if (curDomainInfo.domain_.empty()) {
673 osAccountInfos[0].SetLocalName(domainAccountInfo.accountName_);
674 osAccountInfos[0].SetShortName(options.shortName);
675 osAccountInfos[0].SetDomainInfo(domainAccountInfo);
676 osAccountInfo = osAccountInfos[0];
677 }
678 }
679 if (osAccountInfo.GetLocalId() != Constants::START_USER_ID) {
680 #ifdef ENABLE_MULTIPLE_OS_ACCOUNTS
681 ErrCode errCode = PrepareOsAccountInfo(domainAccountInfo.accountName_, options.shortName,
682 type, domainAccountInfo, osAccountInfo);
683 if (errCode != ERR_OK) {
684 RemoveLocalIdToOperating(osAccountInfo.GetLocalId());
685 return errCode;
686 }
687 RemoveLocalIdToOperating(osAccountInfo.GetLocalId());
688 #else
689 ACCOUNT_LOGW("multiple os accounts feature not enabled");
690 return ERR_OSACCOUNT_SERVICE_MANAGER_NOT_ENABLE_MULTI_ERROR;
691 #endif // ENABLE_MULTIPLE_OS_ACCOUNTS
692 }
693 ErrCode errCode = osAccountControl_->UpdateAccountIndex(osAccountInfo, false);
694 if (errCode != ERR_OK) {
695 ACCOUNT_LOGE("Failed to update account index.");
696 return errCode;
697 }
698 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
699 if (errCode != ERR_OK) {
700 ACCOUNT_LOGE("Failed to update osaccount.");
701 }
702 return errCode;
703 }
704
705 ErrCode IInnerOsAccountManager::CreateOsAccountForDomain(
706 const OsAccountType &type, const DomainAccountInfo &domainInfo, const sptr<IDomainAccountCallback> &callback,
707 const CreateOsAccountForDomainOptions &options)
708 {
709 if (!pluginManager_.IsCreationAllowed()) {
710 ACCOUNT_LOGI("Not allow creation account.");
711 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_PLUGIN_NOT_ALLOWED_CREATION_ERROR;
712 }
713 #ifdef HICOLLIE_ENABLE
714 AccountTimer timer;
715 #endif // HICOLLIE_ENABLE
716 std::vector<OsAccountInfo> osAccountInfos;
717 (void)QueryAllCreatedOsAccounts(osAccountInfos);
718 if (CheckDomainAccountBound(osAccountInfos, domainInfo)) {
719 ACCOUNT_LOGE("the domain account is already bound");
720 return ERR_OSACCOUNT_SERVICE_INNER_DOMAIN_ALREADY_BIND_ERROR;
721 }
722 if (osAccountInfos.size() >= config_.maxOsAccountNum) {
723 ACCOUNT_LOGE("The number of OS accounts has oversize, max num: %{public}d", config_.maxOsAccountNum);
724 return ERR_OSACCOUNT_SERVICE_CONTROL_MAX_CAN_CREATE_ERROR;
725 }
726 if (!InnerDomainAccountManager::GetInstance().IsPluginAvailable()) {
727 ACCOUNT_LOGE("plugin is not available");
728 return ERR_DOMAIN_ACCOUNT_SERVICE_PLUGIN_NOT_EXIST;
729 }
730 sptr<CheckAndCreateDomainAccountCallback> callbackWrapper =
731 new (std::nothrow) CheckAndCreateDomainAccountCallback(osAccountControl_, type, callback, options);
732 if (callbackWrapper == nullptr) {
733 ACCOUNT_LOGE("new DomainCreateDomainCallback failed");
734 return ERR_ACCOUNT_COMMON_INSUFFICIENT_MEMORY_ERROR;
735 }
736 return InnerDomainAccountManager::GetInstance().GetDomainAccountInfo(domainInfo, callbackWrapper);
737 }
738
739 void IInnerOsAccountManager::CheckAndRefreshLocalIdRecord(const int id)
740 {
741 if (id == defaultActivatedId_) {
742 ACCOUNT_LOGI("remove default activated id %{public}d", id);
743 osAccountControl_->SetDefaultActivatedOsAccount(Constants::START_USER_ID);
744 defaultActivatedId_ = Constants::START_USER_ID;
745 }
746 if (id == deviceOwnerId_) {
747 osAccountControl_->UpdateDeviceOwnerId(-1);
748 }
749 return;
750 }
751
752 ErrCode IInnerOsAccountManager::PrepareRemoveOsAccount(OsAccountInfo &osAccountInfo, bool isCleanGarbage)
753 {
754 int32_t id = osAccountInfo.GetLocalId();
755 ErrCode errCode = ERR_OK;
756 #ifdef HAS_USER_IDM_PART
757 errCode = OsAccountInterface::SendToIDMAccountDelete(osAccountInfo);
758 if (errCode != ERR_OK) {
759 ACCOUNT_LOGE("SendToIDMAccountDelete failed, id %{public}d, errCode %{public}d",
760 osAccountInfo.GetLocalId(), errCode);
761 return errCode;
762 }
763 #endif // HAS_USER_IDM_PART
764 DomainAccountInfo curDomainInfo;
765 osAccountInfo.GetDomainInfo(curDomainInfo);
766 if (!curDomainInfo.accountId_.empty()) {
767 InnerDomainAccountManager::GetInstance().OnAccountUnBound(curDomainInfo, nullptr);
768 InnerDomainAccountManager::GetInstance().RemoveTokenFromMap(id);
769 }
770 if (isCleanGarbage) {
771 ACCOUNT_LOGI("Clean garbage account data, no need to deal foreground status.");
772 return ERR_OK;
773 }
774 if (osAccountInfo.GetIsForeground()) {
775 ACCOUNT_LOGI("Remove foreground account id=%{public}d.", id);
776 if (ActivateOsAccount(Constants::START_USER_ID) != ERR_OK) {
777 ACCOUNT_LOGE("RemoveOsAccount active base account failed");
778 return ERR_OSACCOUNT_SERVICE_INNER_REMOVE_ACCOUNT_ACTIVED_ERROR;
779 }
780 std::this_thread::sleep_for(std::chrono::milliseconds(DELAY_FOR_REMOVING_FOREGROUND_OS_ACCOUNT));
781 }
782 loggedInAccounts_.Erase(id);
783 verifiedAccounts_.Erase(id);
784 // stop account
785 errCode = SendMsgForAccountStop(osAccountInfo);
786 if (errCode != ERR_OK) {
787 ReportOsAccountOperationFail(id, "stop", errCode, "stop os account failed");
788 return errCode;
789 }
790 return errCode;
791 }
792
793 ErrCode IInnerOsAccountManager::RemoveOsAccountOperate(const int id, OsAccountInfo &osAccountInfo, bool isCleanGarbage)
794 {
795 if (isCleanGarbage && (!osAccountInfo.GetIsCreateCompleted()) && (!osAccountInfo.GetIsDataRemovable())) {
796 ACCOUNT_LOGI("Account cannot be removed id=%{public}d.", id);
797 return ERR_OK;
798 }
799 ErrCode errCode = PrepareRemoveOsAccount(osAccountInfo, isCleanGarbage);
800 if (errCode != ERR_OK) {
801 ACCOUNT_LOGE("PrepareRemoveOsAccount failed, errCode %{public}d.", errCode);
802 return errCode;
803 }
804 DomainAccountInfo domainAccountInfo;
805 osAccountInfo.GetDomainInfo(domainAccountInfo);
806 if (!domainAccountInfo.accountId_.empty()) {
807 InnerDomainAccountManager::GetInstance().NotifyDomainAccountEvent(
808 id, DomainAccountEvent::LOG_OUT, DomainAccountStatus::LOGOUT, domainAccountInfo);
809 }
810 AccountInfo ohosInfo;
811 (void)OhosAccountManager::GetInstance().GetAccountInfoByUserId(id, ohosInfo);
812 if (ohosInfo.ohosAccountInfo_.name_ != DEFAULT_OHOS_ACCOUNT_NAME) {
813 #ifdef HAS_CES_PART
814 AccountEventProvider::EventPublishAsUser(
815 EventFwk::CommonEventSupport::COMMON_EVENT_HWID_LOGOUT, id);
816 AccountEventProvider::EventPublishAsUser(
817 EventFwk::CommonEventSupport::COMMON_EVENT_DISTRIBUTED_ACCOUNT_LOGOUT, id);
818 #else // HAS_CES_PART
819 ACCOUNT_LOGI("No common event part! Publish nothing!");
820 #endif // HAS_CES_PART
821 }
822 errCode = SendMsgForAccountRemove(osAccountInfo);
823 if (errCode != ERR_OK) {
824 return errCode;
825 }
826
827 errCode = osAccountControl_->RemoveOAConstraintsInfo(id);
828 if (errCode != ERR_OK) {
829 ACCOUNT_LOGE("RemoveOsAccount failed to remove os account constraints info");
830 return errCode;
831 }
832 CheckAndRefreshLocalIdRecord(id);
833 subscribeManager_.Publish(id, OS_ACCOUNT_SUBSCRIBE_TYPE::REMOVED);
834 return errCode;
835 }
836
837 ErrCode IInnerOsAccountManager::RemoveOsAccount(const int id)
838 {
839 ACCOUNT_LOGI("RemoveOsAccount delete id is %{public}d", id);
840 if (!CheckAndAddLocalIdOperating(id)) {
841 ACCOUNT_LOGE("the %{public}d already in operating", id);
842 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_OPERATING_ERROR;
843 }
844
845 OsAccountInfo osAccountInfo;
846 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
847 if (errCode != ERR_OK) {
848 RemoveLocalIdToOperating(id);
849 ACCOUNT_LOGE("RemoveOsAccount cannot find os account info, errCode %{public}d.", errCode);
850 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
851 }
852 errCode = OsAccountInterface::SendToStorageAccountCreateComplete(id);
853 if (errCode != ERR_OK) {
854 RemoveLocalIdToOperating(id);
855 ACCOUNT_LOGE("SendToStorageAccountCreateComplete failed, errCode=%{public}d, id=%{public}d", errCode, id);
856 return errCode;
857 }
858 // set remove flag first
859 osAccountInfo.SetToBeRemoved(true);
860 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
861 if (errCode != ERR_OK) {
862 ACCOUNT_LOGE("Failed to update ToBeRemoved status, errCode=%{public}d.", errCode);
863 ReportOsAccountOperationFail(id, Constants::OPERATION_REMOVE, errCode, "Failed to update ToBeRemoved status");
864 return errCode;
865 }
866
867 // then remove account
868 errCode = RemoveOsAccountOperate(id, osAccountInfo);
869 RemoveLocalIdToOperating(id);
870 return errCode;
871 }
872
873 ErrCode IInnerOsAccountManager::SendMsgForAccountStop(OsAccountInfo &osAccountInfo)
874 {
875 ErrCode errCode = OsAccountInterface::SendToAMSAccountStop(osAccountInfo);
876 if (errCode != ERR_OK) {
877 ACCOUNT_LOGE("SendToAMSAccountStop failed, id %{public}d, errCode %{public}d",
878 osAccountInfo.GetLocalId(), errCode);
879 return errCode;
880 }
881 errCode = OsAccountInterface::SendToStorageAccountStop(osAccountInfo);
882 if (errCode != ERR_OK) {
883 ACCOUNT_LOGE("SendToStorageAccountStop failed, id %{public}d, errCode %{public}d",
884 osAccountInfo.GetLocalId(), errCode);
885 return ERR_ACCOUNT_COMMON_GET_SYSTEM_ABILITY_MANAGER;
886 }
887 return DeactivateOsAccountByInfo(osAccountInfo);
888 }
889
890 ErrCode IInnerOsAccountManager::SendMsgForAccountDeactivate(OsAccountInfo &osAccountInfo, bool isStopStorage)
891 {
892 ErrCode errCode = OsAccountInterface::SendToAMSAccountDeactivate(osAccountInfo);
893 if (errCode != ERR_OK) {
894 ACCOUNT_LOGE("SendToAMSAccountDeactivate failed, id %{public}d, errCode %{public}d",
895 osAccountInfo.GetLocalId(), errCode);
896 return errCode;
897 }
898 if (isStopStorage) {
899 errCode = OsAccountInterface::SendToStorageAccountStop(osAccountInfo);
900 if (errCode != ERR_OK) {
901 ACCOUNT_LOGE("SendToStorageAccountStop failed, id %{public}d, errCode %{public}d",
902 osAccountInfo.GetLocalId(), errCode);
903 return ERR_ACCOUNT_COMMON_GET_SYSTEM_ABILITY_MANAGER;
904 }
905 }
906
907 return DeactivateOsAccountByInfo(osAccountInfo);
908 }
909
910 bool IInnerOsAccountManager::IsToBeRemoved(int32_t localId)
911 {
912 OsAccountInfo osAccountInfo;
913 ErrCode ret = QueryOsAccountById(localId, osAccountInfo);
914 if (ret == ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR) {
915 return true;
916 }
917 return osAccountInfo.GetToBeRemoved();
918 }
919
920 ErrCode IInnerOsAccountManager::ValidateOsAccount(const OsAccountInfo &osAccountInfo)
921 {
922 if (osAccountInfo.GetType() == OsAccountType::PRIVATE) {
923 return ERR_OK;
924 }
925 Json accountIndexJson;
926 ErrCode result = osAccountControl_->GetAccountIndexFromFile(accountIndexJson);
927 if (result != ERR_OK) {
928 return result;
929 }
930 std::string localIdStr = std::to_string(osAccountInfo.GetLocalId());
931 for (const auto& element : accountIndexJson.items()) {
932 std::string localIdKey = element.key();
933 auto value = element.value();
934 std::string localName = value[Constants::LOCAL_NAME].get<std::string>();
935 if ((osAccountInfo.GetLocalName() == localName) && (localIdKey != localIdStr)
936 && !IsToBeRemoved(std::stoi(localIdKey))) {
937 return ERR_ACCOUNT_COMMON_NAME_HAD_EXISTED;
938 }
939 if (!osAccountInfo.GetShortName().empty() && value.contains(Constants::SHORT_NAME)) {
940 std::string shortName = value[Constants::SHORT_NAME].get<std::string>();
941 if ((osAccountInfo.GetShortName() == shortName) && (localIdKey != localIdStr)
942 && !IsToBeRemoved(std::stoi(localIdKey))) {
943 return ERR_ACCOUNT_COMMON_SHORT_NAME_HAD_EXISTED;
944 }
945 }
946 }
947
948 return ERR_OK;
949 }
950
951 ErrCode IInnerOsAccountManager::GetTypeNumber(const OsAccountType& type, int32_t& typeNumber)
952 {
953 typeNumber = 0;
954 std::vector<OsAccountInfo> osAccountList;
955 ErrCode result = QueryAllCreatedOsAccounts(osAccountList);
956 if (result != ERR_OK) {
957 ACCOUNT_LOGE("Get os account list failed.");
958 return result;
959 }
960
961 typeNumber = std::count_if(osAccountList.begin(), osAccountList.end(),
962 [&type](const OsAccountInfo& info) { return info.GetType() == type; });
963 return ERR_OK;
964 }
965
966 ErrCode IInnerOsAccountManager::CheckTypeNumber(const OsAccountType& type)
967 {
968 if (type != OsAccountType::PRIVATE) {
969 return ERR_OK;
970 }
971 int32_t typeNumber = 0;
972 ErrCode result = GetTypeNumber(type, typeNumber);
973 if (result != ERR_OK) {
974 ACCOUNT_LOGE("Count type number failed.");
975 return result;
976 }
977 if (type == OsAccountType::PRIVATE && typeNumber >= MAX_PRIVATE_TYPE_NUMBER) {
978 ACCOUNT_LOGE("Check type number failed, private type number=%{public}d", typeNumber);
979 return ERR_OSACCOUNT_SERVICE_CONTROL_MAX_CAN_CREATE_ERROR;
980 }
981 return ERR_OK;
982 }
983
984 ErrCode IInnerOsAccountManager::SendMsgForAccountRemove(OsAccountInfo &osAccountInfo)
985 {
986 int32_t localId = osAccountInfo.GetLocalId();
987 AppAccountControlManager::GetInstance().SetOsAccountRemoved(localId, true);
988 ErrCode errCode = OsAccountInterface::SendToBMSAccountDelete(osAccountInfo);
989 if (errCode != ERR_OK) {
990 ACCOUNT_LOGE("SendToBMSAccountDelete failed, id %{public}d, errCode %{public}d", localId, errCode);
991 return errCode;
992 }
993 errCode = OsAccountInterface::SendToStorageAccountRemove(osAccountInfo);
994 if (errCode != ERR_OK) {
995 ACCOUNT_LOGE("SendToStorageAccountRemove failed, id %{public}d, errCode %{public}d", localId, errCode);
996 return ERR_ACCOUNT_COMMON_GET_SYSTEM_ABILITY_MANAGER;
997 }
998 errCode = osAccountControl_->DelOsAccount(localId);
999 if (errCode != ERR_OK) {
1000 ACCOUNT_LOGE("remove osaccount info failed, id: %{public}d, errCode %{public}d", localId, errCode);
1001 return errCode;
1002 }
1003 OsAccountInterface::SendToCESAccountDelete(osAccountInfo);
1004 ReportOsAccountLifeCycle(localId, Constants::OPERATION_REMOVE);
1005 return errCode;
1006 }
1007
1008 void IInnerOsAccountManager::Init()
1009 {
1010 ACCOUNT_LOGI("Start to create base os accounts");
1011 CreateBaseAdminAccount();
1012 CreateBaseStandardAccount();
1013 SetParameter(PARAM_LOGIN_NAME_MAX.c_str(), std::to_string(Constants::LOCAL_NAME_MAX_SIZE).c_str());
1014 ACCOUNT_LOGI("End to create base os accounts");
1015 }
1016
1017 ErrCode IInnerOsAccountManager::IsOsAccountExists(const int id, bool &isOsAccountExits)
1018 {
1019 isOsAccountExits = false;
1020 osAccountControl_->IsOsAccountExists(id, isOsAccountExits);
1021 return ERR_OK;
1022 }
1023
1024 ErrCode IInnerOsAccountManager::IsOsAccountActived(const int id, bool &isOsAccountActived)
1025 {
1026 isOsAccountActived = false;
1027
1028 // check if os account exists
1029 OsAccountInfo osAccountInfo;
1030 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1031 if (errCode != ERR_OK) {
1032 ACCOUNT_LOGE("get osaccount info error, errCode %{public}d.", errCode);
1033 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1034 }
1035 if (id == Constants::ADMIN_LOCAL_ID) {
1036 isOsAccountActived = true;
1037 return ERR_OK;
1038 }
1039 isOsAccountActived = osAccountInfo.GetIsActived();
1040 return ERR_OK;
1041 }
1042
1043 ErrCode IInnerOsAccountManager::IsOsAccountConstraintEnable(
1044 const int id, const std::string &constraint, bool &isOsAccountConstraintEnable)
1045 {
1046 isOsAccountConstraintEnable = false;
1047 OsAccountInfo osAccountInfo;
1048 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1049 if (errCode != ERR_OK) {
1050 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1051 }
1052 std::vector<std::string> constraints;
1053 constraints = osAccountInfo.GetConstraints();
1054 if (std::find(constraints.begin(), constraints.end(), constraint) != constraints.end()) {
1055 isOsAccountConstraintEnable = true;
1056 return ERR_OK;
1057 }
1058 constraints.clear();
1059 if (osAccountControl_->GetGlobalOAConstraintsList(constraints) == ERR_OK) {
1060 if (std::find(constraints.begin(), constraints.end(), constraint) != constraints.end()) {
1061 isOsAccountConstraintEnable = true;
1062 return ERR_OK;
1063 }
1064 }
1065 constraints.clear();
1066 if (osAccountControl_->GetSpecificOAConstraintsList(id, constraints) == ERR_OK) {
1067 if (std::find(constraints.begin(), constraints.end(), constraint) != constraints.end()) {
1068 isOsAccountConstraintEnable = true;
1069 return ERR_OK;
1070 }
1071 }
1072 return ERR_OK;
1073 }
1074
1075 ErrCode IInnerOsAccountManager::IsOsAccountVerified(const int id, bool &isVerified)
1076 {
1077 OsAccountInfo osAccountInfo;
1078 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1079 if (errCode != ERR_OK) {
1080 ACCOUNT_LOGE("Get osaccount fail, errCode=%{public}d, id=%{public}d", errCode, id);
1081 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1082 }
1083 isVerified = osAccountInfo.GetIsVerified();
1084 return ERR_OK;
1085 }
1086
1087 ErrCode IInnerOsAccountManager::IsOsAccountDeactivating(const int id, bool &isDeactivating)
1088 {
1089 isDeactivating = false;
1090 deactivatingAccounts_.Find(id, isDeactivating);
1091 return ERR_OK;
1092 }
1093
1094 ErrCode IInnerOsAccountManager::GetCreatedOsAccountsCount(unsigned int &createdOsAccountCount)
1095 {
1096 std::vector<int32_t> idList;
1097 ErrCode errCode = osAccountControl_->GetOsAccountIdList(idList);
1098 if (errCode != ERR_OK) {
1099 ACCOUNT_LOGE("get osaccount info list error, errCode %{public}d.", errCode);
1100 return errCode;
1101 }
1102 createdOsAccountCount = idList.size();
1103 return ERR_OK;
1104 }
1105
1106 ErrCode IInnerOsAccountManager::QueryMaxOsAccountNumber(uint32_t &maxOsAccountNumber)
1107 {
1108 #ifdef ENABLE_MULTIPLE_OS_ACCOUNTS
1109 maxOsAccountNumber = config_.maxOsAccountNum;
1110 #else
1111 maxOsAccountNumber = 1;
1112 #endif // ENABLE_MULTIPLE_OS_ACCOUNTS
1113 return ERR_OK;
1114 }
1115
1116 ErrCode IInnerOsAccountManager::QueryMaxLoggedInOsAccountNumber(uint32_t &maxNum)
1117 {
1118 #ifdef ENABLE_MULTIPLE_OS_ACCOUNTS
1119 maxNum = config_.maxLoggedInOsAccountNum;
1120 #else
1121 maxNum = 1;
1122 #endif // ENABLE_MULTIPLE_OS_ACCOUNTS
1123 return ERR_OK;
1124 }
1125
1126 ErrCode IInnerOsAccountManager::GetOsAccountAllConstraints(const int id, std::vector<std::string> &constraints)
1127 {
1128 OsAccountInfo osAccountInfo;
1129 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1130 if (errCode != ERR_OK) {
1131 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1132 }
1133 constraints = osAccountInfo.GetConstraints();
1134 std::vector<std::string> globalConstraints;
1135 errCode = osAccountControl_->GetGlobalOAConstraintsList(globalConstraints);
1136 if (errCode != ERR_OK) {
1137 ACCOUNT_LOGE("get globalConstraints info error");
1138 return errCode;
1139 }
1140 for (auto it = globalConstraints.begin(); it != globalConstraints.end(); it++) {
1141 if (std::find(constraints.begin(), constraints.end(), *it) == constraints.end()) {
1142 constraints.push_back(*it);
1143 }
1144 }
1145 std::vector<std::string> specificConstraints;
1146 errCode = osAccountControl_->GetSpecificOAConstraintsList(id, specificConstraints);
1147 if (errCode != ERR_OK) {
1148 ACCOUNT_LOGE("get specificConstraints info error");
1149 return errCode;
1150 }
1151 for (auto it = specificConstraints.begin(); it != specificConstraints.end(); it++) {
1152 if (std::find(constraints.begin(), constraints.end(), *it) == constraints.end()) {
1153 constraints.push_back(*it);
1154 }
1155 }
1156 return ERR_OK;
1157 }
1158
1159 ErrCode IInnerOsAccountManager::QueryOsAccountConstraintSourceTypes(const int32_t id,
1160 const std::string &constraint, std::vector<ConstraintSourceTypeInfo> &constraintSourceTypeInfos)
1161 {
1162 ACCOUNT_LOGD("enter.");
1163 bool isOsAccountConstraintEnable = false;
1164 ErrCode errCode = IsOsAccountConstraintEnable(id, constraint, isOsAccountConstraintEnable);
1165 if (errCode != ERR_OK) {
1166 ACCOUNT_LOGE("get os account constraint enable info error");
1167 return errCode;
1168 }
1169 if (!isOsAccountConstraintEnable) {
1170 ACCOUNT_LOGI("constraint not exist");
1171 ConstraintSourceTypeInfo constraintSourceTypeInfo;
1172 constraintSourceTypeInfo.localId = -1;
1173 constraintSourceTypeInfo.typeInfo = ConstraintSourceType::CONSTRAINT_NOT_EXIST;
1174 constraintSourceTypeInfos.push_back(constraintSourceTypeInfo);
1175 return ERR_OK;
1176 }
1177
1178 bool isExits;
1179 if (osAccountControl_->IsFromBaseOAConstraintsList(id, constraint, isExits) == ERR_OK) {
1180 if (isExits) {
1181 ACCOUNT_LOGI("constraint is exist in base os account constraints list");
1182 ConstraintSourceTypeInfo constraintSourceTypeInfo;
1183 constraintSourceTypeInfo.localId = -1;
1184 constraintSourceTypeInfo.typeInfo = ConstraintSourceType::CONSTRAINT_TYPE_BASE;
1185 constraintSourceTypeInfos.push_back(constraintSourceTypeInfo);
1186 }
1187 }
1188 std::vector<ConstraintSourceTypeInfo> globalSourceList;
1189 errCode = osAccountControl_->IsFromGlobalOAConstraintsList(id, deviceOwnerId_, constraint, globalSourceList);
1190 if (errCode == ERR_OK && globalSourceList.size() != 0) {
1191 ACCOUNT_LOGI("constraint is exist in global os account constraints list");
1192 constraintSourceTypeInfos.insert(
1193 constraintSourceTypeInfos.end(), globalSourceList.begin(), globalSourceList.end());
1194 }
1195 std::vector<ConstraintSourceTypeInfo> specificSourceList;
1196 errCode = osAccountControl_->IsFromSpecificOAConstraintsList(id, deviceOwnerId_, constraint, specificSourceList);
1197 if (errCode == ERR_OK && specificSourceList.size() != 0) {
1198 ACCOUNT_LOGI("constraint is exist in specific os account constraints list");
1199 constraintSourceTypeInfos.insert(
1200 constraintSourceTypeInfos.end(), specificSourceList.begin(), specificSourceList.end());
1201 }
1202 return ERR_OK;
1203 }
1204
1205 ErrCode IInnerOsAccountManager::SetBaseOsAccountConstraints(const int32_t id,
1206 const std::vector<std::string> &constraints, const bool enable)
1207 {
1208 ErrCode errCode = SetOsAccountConstraints(id, constraints, enable);
1209 if (errCode != ERR_OK) {
1210 ACCOUNT_LOGE("set os account %{public}d constraints failed! errCode %{public}d.", id, errCode);
1211 return errCode;
1212 }
1213
1214 errCode = osAccountControl_->UpdateBaseOAConstraints(std::to_string(id), constraints, enable);
1215 if (errCode != ERR_OK) {
1216 ACCOUNT_LOGE("update base os account %{public}d constraints failed! errCode %{public}d.", id, errCode);
1217 return errCode;
1218 }
1219 return ERR_OK;
1220 }
1221
1222 ErrCode IInnerOsAccountManager::SetGlobalOsAccountConstraints(const std::vector<std::string> &constraints,
1223 const bool enable, const int32_t enforcerId, const bool isDeviceOwner)
1224 {
1225 OsAccountInfo osAccountInfo;
1226 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(enforcerId, osAccountInfo);
1227 if (errCode != ERR_OK) {
1228 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1229 }
1230 if (osAccountInfo.GetToBeRemoved()) {
1231 ACCOUNT_LOGE("account %{public}d will be removed, cannot change constraints!", enforcerId);
1232 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_TO_BE_REMOVED_ERROR;
1233 }
1234
1235 bool isExists = false;
1236 bool isOverSize = false;
1237 errCode = osAccountControl_->CheckConstraintsList(constraints, isExists, isOverSize);
1238 if (errCode != ERR_OK || !isExists || isOverSize) {
1239 ACCOUNT_LOGE("input constraints not in constraints list or is oversize!");
1240 return ERR_ACCOUNT_COMMON_INVALID_PARAMETER;
1241 }
1242
1243 osAccountControl_->UpdateGlobalOAConstraints(std::to_string(enforcerId), constraints, enable);
1244
1245 errCode = DealWithDeviceOwnerId(isDeviceOwner, enforcerId);
1246 if (errCode != ERR_OK) {
1247 ACCOUNT_LOGE("deal with device owner id error");
1248 return errCode;
1249 }
1250 return ERR_OK;
1251 }
1252
1253 ErrCode IInnerOsAccountManager::SetSpecificOsAccountConstraints(const std::vector<std::string> &constraints,
1254 const bool enable, const int32_t targetId, const int32_t enforcerId, const bool isDeviceOwner)
1255 {
1256 OsAccountInfo enforcerOsAccountInfo;
1257 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(enforcerId, enforcerOsAccountInfo);
1258 if (errCode != ERR_OK) {
1259 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1260 }
1261
1262 OsAccountInfo targetOsAccountInfo;
1263 errCode = osAccountControl_->GetOsAccountInfoById(targetId, targetOsAccountInfo);
1264 if (errCode != ERR_OK) {
1265 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1266 }
1267 if (targetOsAccountInfo.GetToBeRemoved() || enforcerOsAccountInfo.GetToBeRemoved()) {
1268 ACCOUNT_LOGE("account %{public}d or %{public}d will be removed, cannot change constraints!",
1269 enforcerId, targetId);
1270 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_TO_BE_REMOVED_ERROR;
1271 }
1272
1273 bool isExists = false;
1274 bool isOverSize = false;
1275 errCode = osAccountControl_->CheckConstraintsList(constraints, isExists, isOverSize);
1276 if (errCode != ERR_OK || !isExists || isOverSize) {
1277 ACCOUNT_LOGE("input constraints not in constraints list or is oversize!");
1278 return ERR_ACCOUNT_COMMON_INVALID_PARAMETER;
1279 }
1280
1281 osAccountControl_->UpdateSpecificOAConstraints(
1282 std::to_string(enforcerId), std::to_string(targetId), constraints, enable);
1283
1284 errCode = DealWithDeviceOwnerId(isDeviceOwner, enforcerId);
1285 if (errCode != ERR_OK) {
1286 ACCOUNT_LOGE("deal with device owner id error");
1287 return errCode;
1288 }
1289 return ERR_OK;
1290 }
1291
1292 ErrCode IInnerOsAccountManager::QueryAllCreatedOsAccounts(std::vector<OsAccountInfo> &createdOsAccounts)
1293 {
1294 std::vector<OsAccountInfo> allOsAccounts;
1295 ErrCode errCode = osAccountControl_->GetOsAccountList(allOsAccounts);
1296 if (errCode != ERR_OK) {
1297 ACCOUNT_LOGE("get osaccount info list error, errCode %{public}d.", errCode);
1298 return errCode;
1299 }
1300 for (auto osAccountInfo : allOsAccounts) {
1301 if (osAccountInfo.GetIsCreateCompleted() && !osAccountInfo.GetToBeRemoved()) {
1302 createdOsAccounts.push_back(osAccountInfo);
1303 }
1304 }
1305 return ERR_OK;
1306 }
1307
1308 ErrCode IInnerOsAccountManager::DealWithDeviceOwnerId(const bool isDeviceOwner, const int32_t localId)
1309 {
1310 ACCOUNT_LOGD("enter.");
1311 if (isDeviceOwner && localId != deviceOwnerId_) {
1312 ACCOUNT_LOGI("this device owner os account id is changed!");
1313 deviceOwnerId_ = localId;
1314 return osAccountControl_->UpdateDeviceOwnerId(localId);
1315 }
1316 if (isDeviceOwner == false && localId == deviceOwnerId_) {
1317 deviceOwnerId_ = -1;
1318 return osAccountControl_->UpdateDeviceOwnerId(-1);
1319 }
1320 return ERR_OK;
1321 }
1322
1323 int32_t IInnerOsAccountManager::CleanGarbageOsAccounts(int32_t excludeId)
1324 {
1325 ACCOUNT_LOGI("enter");
1326 std::vector<int32_t> idList;
1327 if (osAccountControl_->GetOsAccountIdList(idList) != ERR_OK) {
1328 ACCOUNT_LOGI("GetOsAccountIdList failed.");
1329 return 0;
1330 }
1331
1332 int32_t removeNum = 0;
1333
1334 for (auto id : idList) {
1335 if (id == Constants::START_USER_ID || id == Constants::ADMIN_LOCAL_ID || id == excludeId) {
1336 continue;
1337 }
1338 if (!CheckAndAddLocalIdOperating(id)) {
1339 ACCOUNT_LOGI("Account id = %{public}d already in operating", id);
1340 continue;
1341 }
1342 OsAccountInfo osAccountInfo;
1343 ErrCode ret = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1344 if (ret != ERR_OK && ret != ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR) {
1345 continue;
1346 }
1347 osAccountInfo.SetLocalId(id);
1348
1349 if (!osAccountInfo.GetToBeRemoved() && osAccountInfo.GetIsCreateCompleted()) {
1350 RemoveLocalIdToOperating(id);
1351 continue;
1352 }
1353 ErrCode errCode = RemoveOsAccountOperate(id, osAccountInfo, true);
1354 RemoveLocalIdToOperating(id);
1355 if (errCode != ERR_OK) {
1356 ACCOUNT_LOGE("remove account %{public}d failed! errCode %{public}d.", id, errCode);
1357 } else {
1358 ACCOUNT_LOGI("remove account %{public}d succeed!", id);
1359 removeNum++;
1360 }
1361 }
1362 ACCOUNT_LOGI("finished.");
1363 return removeNum;
1364 }
1365
1366 bool IInnerOsAccountManager::IsSameAccount(
1367 const DomainAccountInfo &domainInfoSrc, const DomainAccountInfo &domainInfoTar)
1368 {
1369 return (((!domainInfoSrc.accountId_.empty()) && (domainInfoSrc.accountId_ == domainInfoTar.accountId_)) ||
1370 ((!domainInfoSrc.accountName_.empty()) && (domainInfoSrc.accountName_ == domainInfoTar.accountName_) &&
1371 (!domainInfoSrc.domain_.empty()) && (domainInfoSrc.domain_ == domainInfoTar.domain_)));
1372 }
1373
1374 ErrCode IInnerOsAccountManager::GetOsAccountLocalIdFromDomain(const DomainAccountInfo &domainInfo, int &id)
1375 {
1376 if (domainInfo.domain_.size() > Constants::DOMAIN_NAME_MAX_SIZE) {
1377 ACCOUNT_LOGE("invalid domain name length %{public}zu.", domainInfo.domain_.size());
1378 return ERR_ACCOUNT_COMMON_INVALID_PARAMETER;
1379 }
1380
1381 if (domainInfo.accountName_.size() > Constants::LOCAL_NAME_MAX_SIZE) {
1382 ACCOUNT_LOGE("invalid domain account name length %{public}zu.", domainInfo.accountName_.size());
1383 return ERR_ACCOUNT_COMMON_INVALID_PARAMETER;
1384 }
1385
1386 id = -1;
1387 std::vector<OsAccountInfo> osAccountInfos;
1388 ErrCode errCode = osAccountControl_->GetOsAccountList(osAccountInfos);
1389 if (errCode != ERR_OK) {
1390 return errCode;
1391 }
1392
1393 DomainAccountInfo curDomainInfo;
1394 for (auto osAccountInfosPtr = osAccountInfos.begin(); osAccountInfosPtr != osAccountInfos.end();
1395 ++osAccountInfosPtr) {
1396 osAccountInfosPtr->GetDomainInfo(curDomainInfo);
1397 if (IsSameAccount(curDomainInfo, domainInfo)) {
1398 id = osAccountInfosPtr->GetLocalId();
1399 return ERR_OK;
1400 }
1401 }
1402 return ERR_DOMAIN_ACCOUNT_SERVICE_NOT_DOMAIN_ACCOUNT;
1403 }
1404
1405 ErrCode IInnerOsAccountManager::GetOsAccountShortName(const int id, std::string &shortName)
1406 {
1407 OsAccountInfo osAccountInfo;
1408 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1409 if (errCode != ERR_OK) {
1410 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1411 }
1412 shortName = osAccountInfo.GetShortName();
1413 return ERR_OK;
1414 }
1415
1416 ErrCode IInnerOsAccountManager::GetOsAccountName(const int id, std::string &name)
1417 {
1418 OsAccountInfo osAccountInfo;
1419 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1420 if (errCode != ERR_OK) {
1421 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1422 }
1423 name = osAccountInfo.GetLocalName();
1424 return ERR_OK;
1425 }
1426
1427 ErrCode IInnerOsAccountManager::QueryOsAccountById(const int id, OsAccountInfo &osAccountInfo)
1428 {
1429 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1430 if (errCode != ERR_OK) {
1431 ACCOUNT_LOGE("get osaccount info error, errCode %{public}d.", errCode);
1432 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1433 }
1434
1435 if (osAccountInfo.GetPhoto() != "") {
1436 std::string photo = osAccountInfo.GetPhoto();
1437 errCode = osAccountControl_->GetPhotoById(osAccountInfo.GetLocalId(), photo);
1438 if (errCode != ERR_OK) {
1439 ACCOUNT_LOGE("get osaccount photo error, errCode %{public}d.", errCode);
1440 return errCode;
1441 }
1442 osAccountInfo.SetPhoto(photo);
1443 }
1444 GetDomainAccountStatus(osAccountInfo);
1445 return ERR_OK;
1446 }
1447
1448 ErrCode IInnerOsAccountManager::GetOsAccountType(const int id, OsAccountType &type)
1449 {
1450 OsAccountInfo osAccountInfo;
1451 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1452 if (errCode != ERR_OK) {
1453 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1454 }
1455 type = osAccountInfo.GetType();
1456 return ERR_OK;
1457 }
1458
1459 ErrCode IInnerOsAccountManager::GetOsAccountProfilePhoto(const int id, std::string &photo)
1460 {
1461 OsAccountInfo osAccountInfo;
1462 ErrCode errCode = QueryOsAccountById(id, osAccountInfo);
1463 if (errCode != ERR_OK) {
1464 ACCOUNT_LOGE("QueryOsAccountById return error, errCode %{public}d.", errCode);
1465 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1466 }
1467 photo = osAccountInfo.GetPhoto();
1468 return ERR_OK;
1469 }
1470
1471 ErrCode IInnerOsAccountManager::IsMultiOsAccountEnable(bool &isMultiOsAccountEnable)
1472 {
1473 #ifdef ENABLE_MULTIPLE_OS_ACCOUNTS
1474 ErrCode errCode = osAccountControl_->GetIsMultiOsAccountEnable(isMultiOsAccountEnable);
1475 if (errCode != ERR_OK) {
1476 ACCOUNT_LOGE("GetIsMultiOsAccountEnable error, errCode %{public}d.", errCode);
1477 return errCode;
1478 }
1479 #else
1480 isMultiOsAccountEnable = false;
1481 #endif // ENABLE_MULTIPLE_OS_ACCOUNTS
1482 return ERR_OK;
1483 }
1484
1485 ErrCode IInnerOsAccountManager::SetOsAccountName(const int id, const std::string &name)
1486 {
1487 OsAccountInfo osAccountInfo;
1488 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1489 if (errCode != ERR_OK) {
1490 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1491 }
1492
1493 // to be removed, cannot change any thing
1494 if (osAccountInfo.GetToBeRemoved()) {
1495 ACCOUNT_LOGE("account %{public}d will be removed, cannot change name!", id);
1496 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_TO_BE_REMOVED_ERROR;
1497 }
1498
1499 std::string localName = osAccountInfo.GetLocalName();
1500 if (localName == name) {
1501 return ERR_OK;
1502 }
1503
1504 osAccountInfo.SetLocalName(name);
1505 errCode = ValidateOsAccount(osAccountInfo);
1506 if (errCode != ERR_OK) {
1507 ACCOUNT_LOGE("account name already exist, errCode %{public}d.", errCode);
1508 return errCode;
1509 }
1510
1511 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
1512 if (errCode != ERR_OK) {
1513 ACCOUNT_LOGE("update osaccount info error %{public}d, id: %{public}d", errCode, osAccountInfo.GetLocalId());
1514 return ERR_OSACCOUNT_SERVICE_INNER_UPDATE_ACCOUNT_ERROR;
1515 }
1516 osAccountControl_->UpdateAccountIndex(osAccountInfo, false);
1517 OsAccountInterface::PublishCommonEvent(
1518 osAccountInfo, OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_INFO_UPDATED, Constants::OPERATION_UPDATE);
1519 return ERR_OK;
1520 }
1521
1522 ErrCode IInnerOsAccountManager::SetOsAccountConstraints(
1523 const int id, const std::vector<std::string> &constraints, const bool enable)
1524 {
1525 OsAccountInfo osAccountInfo;
1526 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1527 if (errCode != ERR_OK) {
1528 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1529 }
1530
1531 // to be removed, cannot change any thing
1532 if (osAccountInfo.GetToBeRemoved()) {
1533 ACCOUNT_LOGE("account %{public}d will be removed, cannot change constraints!", id);
1534 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_TO_BE_REMOVED_ERROR;
1535 }
1536
1537 bool isExists = false;
1538 bool isOverSize = false;
1539 errCode = osAccountControl_->CheckConstraintsList(constraints, isExists, isOverSize);
1540 if (errCode != ERR_OK || !isExists || isOverSize) {
1541 ACCOUNT_LOGE("input constraints not in constraints list or is oversize!");
1542 return ERR_ACCOUNT_COMMON_INVALID_PARAMETER;
1543 }
1544 std::vector<std::string> oldConstraints = osAccountInfo.GetConstraints();
1545 for (auto it = constraints.begin(); it != constraints.end(); it++) {
1546 if (enable) {
1547 if (std::find(oldConstraints.begin(), oldConstraints.end(), *it) == oldConstraints.end()) {
1548 oldConstraints.push_back(*it);
1549 }
1550 } else {
1551 oldConstraints.erase(
1552 std::remove(oldConstraints.begin(), oldConstraints.end(), *it), oldConstraints.end());
1553 }
1554 }
1555 osAccountInfo.SetConstraints(oldConstraints);
1556 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
1557 if (errCode != ERR_OK) {
1558 ACCOUNT_LOGE("update osaccount info error %{public}d, id: %{public}d", errCode, osAccountInfo.GetLocalId());
1559 return ERR_OSACCOUNT_SERVICE_INNER_UPDATE_ACCOUNT_ERROR;
1560 }
1561 return ERR_OK;
1562 }
1563
1564 ErrCode IInnerOsAccountManager::SetOsAccountProfilePhoto(const int id, const std::string &photo)
1565 {
1566 OsAccountInfo osAccountInfo;
1567 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1568 if (errCode != ERR_OK) {
1569 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1570 }
1571
1572 // to be removed, cannot change any thing
1573 if (osAccountInfo.GetToBeRemoved()) {
1574 ACCOUNT_LOGE("account %{public}d will be removed, cannot change photo!", id);
1575 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_TO_BE_REMOVED_ERROR;
1576 }
1577
1578 if (osAccountInfo.GetPhoto() == photo) {
1579 return ERR_OK;
1580 }
1581 errCode = osAccountControl_->SetPhotoById(id, photo);
1582 if (errCode != ERR_OK) {
1583 ACCOUNT_LOGE("Set photo error, code=%{public}d, id=%{public}d.", errCode, id);
1584 return errCode;
1585 }
1586 osAccountInfo.SetPhoto(Constants::USER_PHOTO_FILE_TXT_NAME);
1587 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
1588 if (errCode != ERR_OK) {
1589 ACCOUNT_LOGE("Update osaccount info faile code=%{public}d, id=%{public}d", errCode, osAccountInfo.GetLocalId());
1590 return ERR_OSACCOUNT_SERVICE_INNER_UPDATE_ACCOUNT_ERROR;
1591 }
1592 OsAccountInterface::PublishCommonEvent(
1593 osAccountInfo, OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_INFO_UPDATED, Constants::OPERATION_UPDATE);
1594 return ERR_OK;
1595 }
1596
1597 ErrCode IInnerOsAccountManager::DeactivateOsAccountByInfo(OsAccountInfo &osAccountInfo)
1598 {
1599 int localId = osAccountInfo.GetLocalId();
1600 loggedInAccounts_.Erase(localId);
1601 verifiedAccounts_.Erase(localId);
1602 int32_t foregroundId = -1;
1603 if (foregroundAccountMap_.Find(Constants::DEFAULT_DISPALY_ID, foregroundId) && foregroundId == localId) {
1604 foregroundAccountMap_.Erase(Constants::DEFAULT_DISPALY_ID);
1605 }
1606 EraseIdFromActiveList(localId);
1607
1608 osAccountInfo.SetIsActived(false);
1609 osAccountInfo.SetIsVerified(false);
1610 osAccountInfo.SetIsForeground(false);
1611 osAccountInfo.SetDisplayId(Constants::INVALID_DISPALY_ID);
1612 osAccountInfo.SetIsLoggedIn(false);
1613 DomainAccountInfo domainAccountInfo;
1614 osAccountInfo.GetDomainInfo(domainAccountInfo);
1615 domainAccountInfo.status_ = DomainAccountStatus::LOGOUT;
1616 osAccountInfo.SetDomainInfo(domainAccountInfo);
1617 ErrCode errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
1618 if (errCode != ERR_OK && errCode != ERR_ACCOUNT_COMMON_DATA_NO_SPACE) {
1619 ACCOUNT_LOGE("Update account failed, id=%{public}d, errCode=%{public}d.", osAccountInfo.GetLocalId(), errCode);
1620 return ERR_OSACCOUNT_SERVICE_INNER_UPDATE_ACCOUNT_ERROR;
1621 }
1622
1623 AccountInfoReport::ReportSecurityInfo(osAccountInfo.GetLocalName(), localId,
1624 ReportEvent::EVENT_LOGOUT, 0);
1625 return ERR_OK;
1626 }
1627
1628 ErrCode IInnerOsAccountManager::DeactivateOsAccountById(const int id)
1629 {
1630 OsAccountInfo osAccountInfo;
1631 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1632 if (errCode != ERR_OK) {
1633 ACCOUNT_LOGE("cannot get os account %{public}d info. error %{public}d.",
1634 id, errCode);
1635 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1636 }
1637 return DeactivateOsAccountByInfo(osAccountInfo);
1638 }
1639
1640 ErrCode IInnerOsAccountManager::ActivateOsAccount(const int id, const bool startStorage, const uint64_t displayId)
1641 {
1642 if (!CheckAndAddLocalIdOperating(id)) {
1643 ACCOUNT_LOGE("the %{public}d already in operating", id);
1644 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_OPERATING_ERROR;
1645 }
1646 std::lock_guard<std::mutex> lock(*GetOrInsertUpdateLock(id));
1647 // get information
1648 OsAccountInfo osAccountInfo;
1649 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1650 if (errCode != ERR_OK) {
1651 RemoveLocalIdToOperating(id);
1652 ACCOUNT_LOGE("cannot find os account info by id:%{public}d, errCode %{public}d.", id, errCode);
1653 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1654 }
1655
1656 int32_t foregroundId = -1;
1657 if (foregroundAccountMap_.Find(displayId, foregroundId) && (foregroundId == id) && osAccountInfo.GetIsVerified()) {
1658 ACCOUNT_LOGI("Account %{public}d already is foreground", id);
1659 RemoveLocalIdToOperating(id);
1660 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_ALREADY_ACTIVE_ERROR;
1661 }
1662
1663 errCode = IsValidOsAccount(osAccountInfo);
1664 if (errCode != ERR_OK) {
1665 RemoveLocalIdToOperating(id);
1666 return errCode;
1667 }
1668
1669 if (!osAccountInfo.GetIsActived() &&
1670 (static_cast<uint32_t>(loggedInAccounts_.Size()) >= config_.maxLoggedInOsAccountNum)) {
1671 RemoveLocalIdToOperating(id);
1672 ACCOUNT_LOGE("The number of logged in account reaches the upper limit, maxLoggedInNum: %{public}d",
1673 config_.maxLoggedInOsAccountNum);
1674 return ERR_OSACCOUNT_SERVICE_LOGGED_IN_ACCOUNTS_OVERSIZE;
1675 }
1676
1677 subscribeManager_.Publish(id, OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATING);
1678 errCode = SendMsgForAccountActivate(osAccountInfo, startStorage);
1679 RemoveLocalIdToOperating(id);
1680 if (errCode != ERR_OK) {
1681 return errCode;
1682 }
1683
1684 DomainAccountInfo domainInfo;
1685 osAccountInfo.GetDomainInfo(domainInfo);
1686 if (domainInfo.accountId_.empty() && (osAccountInfo.GetCredentialId() == 0)) {
1687 AccountInfoReport::ReportSecurityInfo(
1688 osAccountInfo.GetLocalName(), osAccountInfo.GetLocalId(), ReportEvent::EVENT_LOGIN, 0);
1689 }
1690 ACCOUNT_LOGI("IInnerOsAccountManager ActivateOsAccount end");
1691 return ERR_OK;
1692 }
1693
1694 ErrCode IInnerOsAccountManager::DeactivateOsAccount(const int id, bool isStopStorage)
1695 {
1696 if (!CheckAndAddLocalIdOperating(id)) {
1697 ACCOUNT_LOGW("the %{public}d already in operating", id);
1698 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_OPERATING_ERROR;
1699 }
1700 std::lock_guard<std::mutex> lock(*GetOrInsertUpdateLock(id));
1701 OsAccountInfo osAccountInfo;
1702 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1703 if (errCode != ERR_OK) {
1704 RemoveLocalIdToOperating(id);
1705 ACCOUNT_LOGW("cannot find os account info by id:%{public}d, errCode %{public}d.", id, errCode);
1706 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1707 }
1708
1709 if ((!osAccountInfo.GetIsActived()) && (!osAccountInfo.GetIsVerified())) {
1710 RemoveLocalIdToOperating(id);
1711 ACCOUNT_LOGW("account %{public}d is neither active nor verified, don't need to deactivate!", id);
1712 return ERR_OK;
1713 }
1714 errCode = IsValidOsAccount(osAccountInfo);
1715 if (errCode != ERR_OK) {
1716 RemoveLocalIdToOperating(id);
1717 return errCode;
1718 }
1719
1720 deactivatingAccounts_.EnsureInsert(id, true);
1721
1722 OsAccountInterface::PublishCommonEvent(
1723 osAccountInfo, OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_STOPPING, Constants::OPERATION_STOP);
1724 subscribeManager_.Publish(id, OS_ACCOUNT_SUBSCRIBE_TYPE::STOPPING);
1725
1726 errCode = SendMsgForAccountDeactivate(osAccountInfo, isStopStorage);
1727 deactivatingAccounts_.Erase(id);
1728 if (errCode != ERR_OK) {
1729 RemoveLocalIdToOperating(id);
1730 ReportOsAccountOperationFail(id, "deactivate", errCode, "deactivate os account failed");
1731 return errCode;
1732 }
1733
1734 OsAccountInterface::PublishCommonEvent(osAccountInfo, OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_STOPPED,
1735 Constants::OPERATION_STOP);
1736 subscribeManager_.Publish(id, OS_ACCOUNT_SUBSCRIBE_TYPE::STOPPED);
1737 ReportOsAccountLifeCycle(id, Constants::OPERATION_STOP);
1738
1739 RemoveLocalIdToOperating(id);
1740 ACCOUNT_LOGI("IInnerOsAccountManager DeactivateOsAccount end");
1741 return ERR_OK;
1742 }
1743
1744 void IInnerOsAccountManager::RollBackToEarlierAccount(int32_t fromId, int32_t toId)
1745 {
1746 ACCOUNT_LOGI("Enter.");
1747 if (fromId == toId) {
1748 return;
1749 }
1750 subscribeManager_.Publish(fromId, toId, OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED);
1751 ReportOsAccountSwitch(fromId, toId);
1752 ACCOUNT_LOGI("End pushlishing pre switch event.");
1753 OsAccountInfo osAccountInfo;
1754 osAccountInfo.SetLocalId(toId);
1755 subscribeManager_.Publish(toId, fromId, OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHING);
1756 OsAccountInterface::PublishCommonEvent(osAccountInfo,
1757 OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_FOREGROUND, Constants::OPERATION_SWITCH);
1758 subscribeManager_.Publish(toId, fromId, OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED);
1759 ReportOsAccountSwitch(toId, fromId);
1760 ACCOUNT_LOGI("End pushlishing post switch event.");
1761 }
1762
1763 ErrCode IInnerOsAccountManager::SendMsgForAccountActivate(OsAccountInfo &osAccountInfo, const bool startStorage,
1764 const uint64_t displayId)
1765 {
1766 // activate
1767 int32_t oldId = -1;
1768 bool oldIdExist = foregroundAccountMap_.Find(displayId, oldId);
1769 int32_t localId = static_cast<int32_t>(osAccountInfo.GetLocalId());
1770 bool preActivated = osAccountInfo.GetIsActived();
1771 subscribeManager_.Publish(localId, oldId, OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHING);
1772
1773 if (startStorage) {
1774 ErrCode errCode = SendToStorageAccountStart(osAccountInfo);
1775 if (errCode != ERR_OK) {
1776 RollBackToEarlierAccount(localId, oldId);
1777 return errCode;
1778 }
1779 }
1780 ErrCode errCode = SendToAMSAccountStart(osAccountInfo, displayId);
1781 if (errCode != ERR_OK) {
1782 RollBackToEarlierAccount(localId, oldId);
1783 return errCode;
1784 }
1785 if (oldId != localId) {
1786 OsAccountInterface::PublishCommonEvent(osAccountInfo,
1787 OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_FOREGROUND, Constants::OPERATION_SWITCH);
1788 }
1789 errCode = UpdateAccountToForeground(displayId, osAccountInfo);
1790 if (errCode != ERR_OK) {
1791 return errCode;
1792 }
1793
1794 if (oldIdExist && (oldId != localId)) {
1795 if ((errCode = UpdateAccountToBackground(oldId)) != ERR_OK) {
1796 return errCode;
1797 }
1798 }
1799
1800 OsAccountInterface::SendToCESAccountSwitched(localId, oldId);
1801 subscribeManager_.Publish(localId, OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVED);
1802 subscribeManager_.Publish(localId, oldId, OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED);
1803 if (!preActivated) {
1804 ReportOsAccountLifeCycle(defaultActivatedId_, Constants::OPERATION_ACTIVATE);
1805 }
1806 ACCOUNT_LOGI("SendMsgForAccountActivate ok");
1807 ReportOsAccountSwitch(localId, oldId);
1808 return errCode;
1809 }
1810
1811 ErrCode IInnerOsAccountManager::SendToStorageAccountStart(OsAccountInfo &osAccountInfo)
1812 {
1813 bool preVerified = osAccountInfo.GetIsVerified();
1814 int32_t localId = osAccountInfo.GetLocalId();
1815 ErrCode err = OsAccountInterface::SendToStorageAccountStart(osAccountInfo);
1816 if (err != ERR_OK) {
1817 ACCOUNT_LOGE("Failed to SendToStorageAccountStart, localId %{public}d, error: %{public}d.", localId, err);
1818 return ERR_ACCOUNT_COMMON_GET_SYSTEM_ABILITY_MANAGER;
1819 }
1820 if (osAccountInfo.GetIsVerified()) {
1821 verifiedAccounts_.EnsureInsert(osAccountInfo.GetLocalId(), true);
1822 }
1823 if (osAccountInfo.GetIsLoggedIn()) {
1824 loggedInAccounts_.EnsureInsert(osAccountInfo.GetLocalId(), true);
1825 }
1826
1827 if (!preVerified && osAccountInfo.GetIsVerified()) {
1828 OsAccountInterface::PublishCommonEvent(osAccountInfo,
1829 OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_UNLOCKED, Constants::OPERATION_UNLOCK);
1830 subscribeManager_.Publish(localId, OS_ACCOUNT_SUBSCRIBE_TYPE::UNLOCKED);
1831 ReportOsAccountLifeCycle(localId, Constants::OPERATION_UNLOCK);
1832
1833 auto task = [] { IInnerOsAccountManager::GetInstance().CleanGarbageOsAccounts(); };
1834 std::thread cleanThread(task);
1835 pthread_setname_np(cleanThread.native_handle(), "CleanGarbageOsAccounts");
1836 cleanThread.detach();
1837 }
1838 return ERR_OK;
1839 }
1840
1841 ErrCode IInnerOsAccountManager::SendToAMSAccountStart(OsAccountInfo &osAccountInfo,
1842 uint64_t displayId)
1843 {
1844 OsAccountStartCallbackFunc callbackFunc = [this, displayId](int32_t localId) {
1845 this->PushIdIntoActiveList(localId);
1846 this->foregroundAccountMap_.EnsureInsert(displayId, localId);
1847 };
1848 ErrCode errCode = OsAccountInterface::SendToAMSAccountStart(osAccountInfo, callbackFunc);
1849 if (errCode != ERR_OK) {
1850 ACCOUNT_LOGE("Failed to call SendToAMSAccountStart, localId: %{public}d, error: %{public}d.",
1851 osAccountInfo.GetLocalId(), errCode);
1852 return errCode;
1853 }
1854
1855 return ERR_OK;
1856 }
1857
1858 ErrCode IInnerOsAccountManager::StartOsAccount(const int id)
1859 {
1860 return ERR_OK;
1861 }
1862
1863 ErrCode IInnerOsAccountManager::GetOsAccountLocalIdBySerialNumber(const int64_t serialNumber, int &id)
1864 {
1865 if (serialNumber ==
1866 Constants::CARRY_NUM * Constants::SERIAL_NUMBER_NUM_START_FOR_ADMIN + Constants::ADMIN_LOCAL_ID) {
1867 id = Constants::ADMIN_LOCAL_ID;
1868 return ERR_OK;
1869 }
1870 std::vector<OsAccountInfo> osAccountInfos;
1871 id = -1;
1872 ErrCode errCode = osAccountControl_->GetOsAccountList(osAccountInfos);
1873 if (errCode != ERR_OK) {
1874 ACCOUNT_LOGE("get osaccount info list error");
1875 return errCode;
1876 }
1877 for (auto it = osAccountInfos.begin(); it != osAccountInfos.end(); it++) {
1878 if (serialNumber == it->GetSerialNumber()) {
1879 id = it->GetLocalId();
1880 break;
1881 }
1882 }
1883 if (id == -1) {
1884 ACCOUNT_LOGE("cannot find id by serialNumber");
1885 return ERR_OSACCOUNT_SERVICE_INNER_SELECT_ERROR;
1886 }
1887 return ERR_OK;
1888 }
1889
1890 ErrCode IInnerOsAccountManager::GetOsAccountInfoById(const int id, OsAccountInfo &osAccountInfo)
1891 {
1892 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1893 if (errCode != ERR_OK) {
1894 ACCOUNT_LOGE("get osaccount info error, errCode %{public}d.", errCode);
1895 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1896 }
1897 return ERR_OK;
1898 }
1899
1900 ErrCode IInnerOsAccountManager::GetSerialNumberByOsAccountLocalId(const int &id, int64_t &serialNumber)
1901 {
1902 OsAccountInfo osAccountInfo;
1903 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1904 if (errCode != ERR_OK) {
1905 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1906 }
1907 serialNumber = osAccountInfo.GetSerialNumber();
1908 return ERR_OK;
1909 }
1910
1911 ErrCode IInnerOsAccountManager::SubscribeOsAccount(
1912 const OsAccountSubscribeInfo &subscribeInfo, const sptr<IRemoteObject> &eventListener)
1913 {
1914 auto subscribeInfoPtr = std::make_shared<OsAccountSubscribeInfo>(subscribeInfo);
1915 if (subscribeInfoPtr == nullptr) {
1916 ACCOUNT_LOGE("subscribeInfoPtr is nullptr");
1917 }
1918 return subscribeManager_.SubscribeOsAccount(subscribeInfoPtr, eventListener);
1919 }
1920
1921 ErrCode IInnerOsAccountManager::UnsubscribeOsAccount(const sptr<IRemoteObject> &eventListener)
1922 {
1923 return subscribeManager_.UnsubscribeOsAccount(eventListener);
1924 }
1925
1926 const std::shared_ptr<OsAccountSubscribeInfo> IInnerOsAccountManager::GetSubscribeRecordInfo(
1927 const sptr<IRemoteObject> &eventListener)
1928 {
1929 return subscribeManager_.GetSubscribeRecordInfo(eventListener);
1930 }
1931
1932 OS_ACCOUNT_SWITCH_MOD IInnerOsAccountManager::GetOsAccountSwitchMod()
1933 {
1934 return Constants::NOW_OS_ACCOUNT_SWITCH_MOD;
1935 }
1936
1937 ErrCode IInnerOsAccountManager::IsOsAccountCompleted(const int id, bool &isOsAccountCompleted)
1938 {
1939 OsAccountInfo osAccountInfo;
1940 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
1941 if (errCode != ERR_OK) {
1942 return errCode;
1943 }
1944 isOsAccountCompleted = osAccountInfo.GetIsCreateCompleted();
1945 return ERR_OK;
1946 }
1947
1948 ErrCode IInnerOsAccountManager::SetOsAccountIsVerified(const int id, const bool isVerified)
1949 {
1950 std::lock_guard<std::mutex> lock(*GetOrInsertUpdateLock(id));
1951 OsAccountInfo osAccountInfo;
1952 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1953 if (errCode != ERR_OK) {
1954 ACCOUNT_LOGE("get osaccount info error, errCode %{public}d.", errCode);
1955 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1956 }
1957
1958 // to be removed, cannot change any thing
1959 if (osAccountInfo.GetToBeRemoved()) {
1960 ACCOUNT_LOGE("account %{public}d will be removed, cannot change verify state!", id);
1961 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_TO_BE_REMOVED_ERROR;
1962 }
1963 bool preVerified = osAccountInfo.GetIsVerified();
1964
1965 osAccountInfo.SetIsVerified(isVerified);
1966 if (isVerified) {
1967 verifiedAccounts_.EnsureInsert(id, true);
1968 } else {
1969 verifiedAccounts_.Erase(id);
1970 }
1971 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
1972 if (errCode != ERR_OK && errCode != ERR_ACCOUNT_COMMON_DATA_NO_SPACE) {
1973 ACCOUNT_LOGE("update osaccount info error %{public}d, id: %{public}d",
1974 errCode, osAccountInfo.GetLocalId());
1975 return ERR_OSACCOUNT_SERVICE_INNER_UPDATE_ACCOUNT_ERROR;
1976 }
1977 if (isVerified && !preVerified) {
1978 OsAccountInterface::PublishCommonEvent(osAccountInfo,
1979 OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_UNLOCKED, Constants::OPERATION_UNLOCK);
1980 subscribeManager_.Publish(id, OS_ACCOUNT_SUBSCRIBE_TYPE::UNLOCKED);
1981 ReportOsAccountLifeCycle(id, Constants::OPERATION_UNLOCK);
1982
1983 auto task = [] { IInnerOsAccountManager::GetInstance().CleanGarbageOsAccounts(); };
1984 std::thread cleanThread(task);
1985 pthread_setname_np(cleanThread.native_handle(), "CleanGarbageOsAccounts");
1986 cleanThread.detach();
1987 }
1988 return ERR_OK;
1989 }
1990
1991 ErrCode IInnerOsAccountManager::SetOsAccountIsLoggedIn(const int32_t id, const bool isLoggedIn)
1992 {
1993 std::lock_guard<std::mutex> lock(*GetOrInsertUpdateLock(id));
1994 OsAccountInfo osAccountInfo;
1995 ErrCode errCode = GetRealOsAccountInfoById(id, osAccountInfo);
1996 if (errCode != ERR_OK) {
1997 ACCOUNT_LOGE("get osaccount info error, errCode %{public}d.", errCode);
1998 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
1999 }
2000 if (osAccountInfo.GetToBeRemoved()) {
2001 ACCOUNT_LOGE("account %{public}d will be removed, cannot change verify state!", id);
2002 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_TO_BE_REMOVED_ERROR;
2003 }
2004 if (isLoggedIn) {
2005 loggedInAccounts_.EnsureInsert(id, true);
2006 } else {
2007 loggedInAccounts_.Erase(id);
2008 }
2009 if (!osAccountInfo.GetIsLoggedIn()) {
2010 #ifdef ACTIVATE_LAST_LOGGED_IN_ACCOUNT
2011 osAccountControl_->SetDefaultActivatedOsAccount(id);
2012 #endif
2013 osAccountInfo.SetIsLoggedIn(isLoggedIn);
2014 osAccountInfo.SetLastLoginTime(std::chrono::duration_cast<std::chrono::seconds>(
2015 std::chrono::system_clock::now().time_since_epoch()).count());
2016 }
2017 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
2018 if (errCode != ERR_OK && errCode != ERR_ACCOUNT_COMMON_DATA_NO_SPACE) {
2019 ACCOUNT_LOGE("Update account info failed, errCode: %{public}d, id: %{public}d", errCode, id);
2020 return ERR_OSACCOUNT_SERVICE_INNER_UPDATE_ACCOUNT_ERROR;
2021 }
2022 return ERR_OK;
2023 }
2024
2025 ErrCode IInnerOsAccountManager::GetOsAccountCredentialId(const int id, uint64_t &credentialId)
2026 {
2027 credentialId = 0;
2028 OsAccountInfo osAccountInfo;
2029 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
2030 if (errCode == ERR_OK) {
2031 credentialId = osAccountInfo.GetCredentialId();
2032 }
2033 return errCode;
2034 }
2035
2036 ErrCode IInnerOsAccountManager::SetOsAccountCredentialId(const int id, uint64_t credentialId)
2037 {
2038 OsAccountInfo osAccountInfo;
2039 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
2040 if (errCode != ERR_OK) {
2041 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
2042 }
2043
2044 osAccountInfo.SetCredentialId(credentialId);
2045 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
2046 if (errCode != ERR_OK) {
2047 ACCOUNT_LOGE("update osaccount info error %{public}d, id: %{public}d",
2048 errCode, osAccountInfo.GetLocalId());
2049 return ERR_OSACCOUNT_SERVICE_INNER_UPDATE_ACCOUNT_ERROR;
2050 }
2051 return ERR_OK;
2052 }
2053
2054 ErrCode IInnerOsAccountManager::SetDefaultActivatedOsAccount(const int32_t id)
2055 {
2056 std::lock_guard<std::mutex> lock(operatingMutex_);
2057 if (id == defaultActivatedId_) {
2058 ACCOUNT_LOGW("no need to repeat set initial start id %{public}d", id);
2059 return ERR_OK;
2060 }
2061 OsAccountInfo osAccountInfo;
2062 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(id, osAccountInfo);
2063 if (errCode != ERR_OK) {
2064 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
2065 }
2066
2067 errCode = IsValidOsAccount(osAccountInfo);
2068 if (errCode != ERR_OK) {
2069 return errCode;
2070 }
2071 errCode = osAccountControl_->SetDefaultActivatedOsAccount(id);
2072 if (errCode != ERR_OK) {
2073 ACCOUNT_LOGE("set default activated account id error %{public}d, id: %{public}d", errCode, id);
2074 return errCode;
2075 }
2076 defaultActivatedId_ = id;
2077 return ERR_OK;
2078 }
2079
2080 ErrCode IInnerOsAccountManager::IsOsAccountForeground(const int32_t localId, const uint64_t displayId,
2081 bool &isForeground)
2082 {
2083 int32_t id;
2084 if (!foregroundAccountMap_.Find(displayId, id)) {
2085 ACCOUNT_LOGE("No foreground account in displayId %{public}llu.", static_cast<unsigned long long>(displayId));
2086 return ERR_ACCOUNT_COMMON_ACCOUNT_IN_DISPLAY_ID_NOT_FOUND_ERROR;
2087 }
2088 isForeground = (id == localId);
2089 return ERR_OK;
2090 }
2091
2092 ErrCode IInnerOsAccountManager::GetForegroundOsAccountLocalId(const uint64_t displayId, int32_t &localId)
2093 {
2094 if (!foregroundAccountMap_.Find(displayId, localId)) {
2095 ACCOUNT_LOGE("No foreground account in displayId %{public}llu.", static_cast<unsigned long long>(displayId));
2096 return ERR_ACCOUNT_COMMON_ACCOUNT_IN_DISPLAY_ID_NOT_FOUND_ERROR;
2097 }
2098 return ERR_OK;
2099 }
2100
2101 ErrCode IInnerOsAccountManager::GetForegroundOsAccounts(std::vector<ForegroundOsAccount> &accounts)
2102 {
2103 accounts.clear();
2104 auto it = [&](uint64_t displayId, int32_t localId) {
2105 ForegroundOsAccount foregroundOsAccount;
2106 foregroundOsAccount.displayId = displayId;
2107 foregroundOsAccount.localId = localId;
2108 accounts.emplace_back(foregroundOsAccount);
2109 };
2110 foregroundAccountMap_.Iterate(it);
2111 ACCOUNT_LOGI("Get foreground list successful, total=%{public}zu.", accounts.size());
2112 return ERR_OK;
2113 }
2114
2115 ErrCode IInnerOsAccountManager::GetBackgroundOsAccountLocalIds(std::vector<int32_t> &localIds)
2116 {
2117 localIds.clear();
2118 std::vector<int32_t> activatedIds;
2119 CopyFromActiveList(activatedIds);
2120
2121 std::vector<int32_t> foregroundIds;
2122 auto it = [&](uint64_t displayId, int32_t localId) {
2123 foregroundIds.emplace_back(localId);
2124 };
2125 foregroundAccountMap_.Iterate(it);
2126 std::unordered_set<int32_t> foregroundSet(foregroundIds.begin(), foregroundIds.end());
2127 for (const auto &id : activatedIds) {
2128 if (foregroundSet.find(id) == foregroundSet.end()) {
2129 localIds.emplace_back(id);
2130 }
2131 }
2132 ACCOUNT_LOGI("Get background list successful, total=%{public}zu.", localIds.size());
2133 return ERR_OK;
2134 }
2135
2136 ErrCode IInnerOsAccountManager::GetDefaultActivatedOsAccount(int32_t &id)
2137 {
2138 std::lock_guard<std::mutex> lock(operatingMutex_);
2139 id = defaultActivatedId_;
2140 return ERR_OK;
2141 }
2142
2143 ErrCode IInnerOsAccountManager::IsAllowedCreateAdmin(bool &isAllowedCreateAdmin)
2144 {
2145 return osAccountControl_->IsAllowedCreateAdmin(isAllowedCreateAdmin);
2146 }
2147
2148 ErrCode IInnerOsAccountManager::GetCreatedOsAccountNumFromDatabase(const std::string& storeID,
2149 int &createdOsAccountNum)
2150 {
2151 return osAccountControl_->GetCreatedOsAccountNumFromDatabase(storeID, createdOsAccountNum);
2152 }
2153
2154 ErrCode IInnerOsAccountManager::GetSerialNumberFromDatabase(const std::string& storeID,
2155 int64_t &serialNumber)
2156 {
2157 return osAccountControl_->GetSerialNumberFromDatabase(storeID, serialNumber);
2158 }
2159
2160 ErrCode IInnerOsAccountManager::GetMaxAllowCreateIdFromDatabase(const std::string& storeID, int &id)
2161 {
2162 #ifdef ENABLE_MULTIPLE_OS_ACCOUNTS
2163 return osAccountControl_->GetMaxAllowCreateIdFromDatabase(storeID, id);
2164 #else
2165 id = Constants::START_USER_ID;
2166 return ERR_OK;
2167 #endif // ENABLE_MULTIPLE_OS_ACCOUNTS
2168 }
2169
2170 ErrCode IInnerOsAccountManager::GetOsAccountFromDatabase(const std::string& storeID, const int id,
2171 OsAccountInfo &osAccountInfo)
2172 {
2173 return osAccountControl_->GetOsAccountFromDatabase(storeID, id, osAccountInfo);
2174 }
2175
2176 ErrCode IInnerOsAccountManager::GetOsAccountListFromDatabase(const std::string& storeID,
2177 std::vector<OsAccountInfo> &osAccountList)
2178 {
2179 return osAccountControl_->GetOsAccountListFromDatabase(storeID, osAccountList);
2180 }
2181
2182 void IInnerOsAccountManager::RemoveLocalIdToOperating(int32_t localId)
2183 {
2184 std::lock_guard<std::mutex> lock(operatingMutex_);
2185 auto it = std::find(operatingId_.begin(), operatingId_.end(), localId);
2186 if (it != operatingId_.end()) {
2187 operatingId_.erase(it);
2188 }
2189 }
2190
2191 bool IInnerOsAccountManager::CheckAndAddLocalIdOperating(int32_t localId)
2192 {
2193 std::lock_guard<std::mutex> lock(operatingMutex_);
2194 if (std::find(operatingId_.begin(), operatingId_.end(), localId) != operatingId_.end()) {
2195 return false;
2196 }
2197 operatingId_.push_back(localId);
2198 return true;
2199 }
2200
2201 ErrCode IInnerOsAccountManager::QueryActiveOsAccountIds(std::vector<int32_t>& ids)
2202 {
2203 CopyFromActiveList(ids);
2204 return ERR_OK;
2205 }
2206
2207 void IInnerOsAccountManager::PushIdIntoActiveList(int32_t id)
2208 {
2209 std::lock_guard<std::mutex> lock(ativeMutex_);
2210 if (std::find(activeAccountId_.begin(), activeAccountId_.end(), id) == activeAccountId_.end()) {
2211 CountTraceAdapter("activeId", (int64_t)id);
2212 }
2213 #ifndef ENABLE_MULTIPLE_ACTIVE_ACCOUNTS
2214 activeAccountId_.clear();
2215 #else
2216 activeAccountId_.erase(std::remove(activeAccountId_.begin(), activeAccountId_.end(), id), activeAccountId_.end());
2217 #endif
2218 //Compatible with the QueryActiveOsAccountIds
2219 activeAccountId_.insert(activeAccountId_.begin(), id);
2220 return;
2221 }
2222
2223 void IInnerOsAccountManager::EraseIdFromActiveList(int32_t id)
2224 {
2225 std::lock_guard<std::mutex> lock(ativeMutex_);
2226 if (std::find(activeAccountId_.begin(), activeAccountId_.end(), id) != activeAccountId_.end()) {
2227 ACCOUNT_LOGE("EraseIdFromActiveList enter0");
2228 activeAccountId_.erase(
2229 std::remove(activeAccountId_.begin(), activeAccountId_.end(), id), activeAccountId_.end());
2230 } else {
2231 ACCOUNT_LOGI("os account is not in active list, no need to erase!");
2232 }
2233 CountTraceAdapter("deActiveId", (int64_t)id);
2234 }
2235
2236 bool IInnerOsAccountManager::IsOsAccountIDInActiveList(int32_t id)
2237 {
2238 std::lock_guard<std::mutex> lock(ativeMutex_);
2239 auto it = std::find(activeAccountId_.begin(), activeAccountId_.end(), id);
2240 return (it != activeAccountId_.end());
2241 }
2242
2243 void IInnerOsAccountManager::CopyFromActiveList(std::vector<int32_t>& idList)
2244 {
2245 idList.clear();
2246 std::lock_guard<std::mutex> lock(ativeMutex_);
2247 for (auto it = activeAccountId_.begin(); it != activeAccountId_.end(); it++) {
2248 idList.push_back(*it);
2249 }
2250 }
2251
2252 ErrCode IInnerOsAccountManager::UpdateAccountInfoByDomainAccountInfo(
2253 int32_t userId, const DomainAccountInfo &newDomainAccountInfo)
2254 {
2255 if (!CheckAndAddLocalIdOperating(userId)) {
2256 ACCOUNT_LOGW("Account id = %{public}d already in operating", userId);
2257 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_OPERATING_ERROR;
2258 }
2259 OsAccountInfo accountInfo;
2260 ErrCode result = osAccountControl_->GetOsAccountInfoById(userId, accountInfo);
2261 if (result != ERR_OK) {
2262 RemoveLocalIdToOperating(userId);
2263 return result;
2264 }
2265 DomainAccountInfo oldDomainAccountInfo;
2266 accountInfo.GetDomainInfo(oldDomainAccountInfo);
2267 if (!newDomainAccountInfo.accountName_.empty()) {
2268 oldDomainAccountInfo.accountName_ = newDomainAccountInfo.accountName_;
2269 }
2270 if (!newDomainAccountInfo.accountId_.empty()) {
2271 oldDomainAccountInfo.accountId_ = newDomainAccountInfo.accountId_;
2272 }
2273 accountInfo.SetDomainInfo(oldDomainAccountInfo);
2274 accountInfo.SetLocalName(newDomainAccountInfo.domain_ + "/" + newDomainAccountInfo.accountName_);
2275 result = osAccountControl_->UpdateOsAccount(accountInfo);
2276 if (result != ERR_OK) {
2277 ACCOUNT_LOGE("Update account info failed, result = %{public}d", result);
2278 ReportOsAccountOperationFail(userId, Constants::OPERATION_UPDATE, result,
2279 "Failed to update domain account info");
2280 RemoveLocalIdToOperating(userId);
2281 return result;
2282 }
2283 RemoveLocalIdToOperating(userId);
2284 #ifdef HAS_CES_PART
2285 AccountEventProvider::EventPublish(EventFwk::CommonEventSupport::COMMON_EVENT_USER_INFO_UPDATED,
2286 userId, nullptr);
2287 #endif // HAS_CES_PART
2288 return ERR_OK;
2289 }
2290
2291 ErrCode IInnerOsAccountManager::UpdateAccountToForeground(const uint64_t displayId, OsAccountInfo &osAccountInfo)
2292 {
2293 int32_t localId = osAccountInfo.GetLocalId();
2294 osAccountInfo.SetIsActived(true);
2295 osAccountInfo.SetDisplayId(displayId);
2296 osAccountInfo.SetIsForeground(true);
2297 if (osAccountInfo.GetIsLoggedIn()) {
2298 #ifdef ACTIVATE_LAST_LOGGED_IN_ACCOUNT
2299 osAccountControl_->SetDefaultActivatedOsAccount(localId);
2300 #endif
2301 }
2302 ErrCode errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
2303 if (errCode != ERR_OK && errCode != ERR_ACCOUNT_COMMON_DATA_NO_SPACE) {
2304 ACCOUNT_LOGE("Update account failed, localId=%{public}d, errCode=%{public}d.",
2305 localId, errCode);
2306 }
2307 return ERR_OK;
2308 }
2309
2310 ErrCode IInnerOsAccountManager::UpdateAccountToBackground(int32_t oldId)
2311 {
2312 OsAccountInfo oldOsAccountInfo;
2313 {
2314 std::lock_guard<std::mutex> lock(*GetOrInsertUpdateLock(oldId));
2315 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(oldId, oldOsAccountInfo);
2316 if (errCode != ERR_OK) {
2317 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
2318 }
2319 oldOsAccountInfo.SetIsForeground(false);
2320 oldOsAccountInfo.SetDisplayId(Constants::INVALID_DISPALY_ID);
2321 errCode = osAccountControl_->UpdateOsAccount(oldOsAccountInfo);
2322 if (errCode != ERR_OK && errCode != ERR_ACCOUNT_COMMON_DATA_NO_SPACE) {
2323 ACCOUNT_LOGE("Update osaccount failed, errCode=%{public}d, id=%{public}d",
2324 errCode, oldOsAccountInfo.GetLocalId());
2325 }
2326 }
2327 OsAccountInterface::PublishCommonEvent(oldOsAccountInfo,
2328 OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_BACKGROUND, Constants::OPERATION_SWITCH);
2329
2330 #ifdef ENABLE_MULTIPLE_ACTIVE_ACCOUNTS
2331 #ifndef SUPPORT_STOP_MAIN_OS_ACCOUNT
2332 if (oldId == Constants::START_USER_ID) {
2333 return ERR_OK;
2334 }
2335 #endif
2336 bool isLoggedIn = false;
2337 if ((oldOsAccountInfo.GetType() != OsAccountType::PRIVATE) && (!loggedInAccounts_.Find(oldId, isLoggedIn))) {
2338 DeactivateOsAccount(oldId, false);
2339 }
2340 #else
2341 DeactivateOsAccountByInfo(oldOsAccountInfo);
2342 #endif // ENABLE_MULTIPLE_ACTIVE_ACCOUNTS
2343 return ERR_OK;
2344 }
2345
2346 std::shared_ptr<std::mutex> IInnerOsAccountManager::GetOrInsertUpdateLock(int32_t id)
2347 {
2348 std::lock_guard<std::mutex> lock(updateLockMutex_);
2349 auto it = updateLocks_.find(id);
2350 if (it == updateLocks_.end()) {
2351 auto mutexPtr = std::make_shared<std::mutex>();
2352 updateLocks_.insert(std::make_pair(id, mutexPtr));
2353 return mutexPtr;
2354 } else {
2355 return it->second;
2356 }
2357 }
2358
2359 ErrCode IInnerOsAccountManager::SetOsAccountToBeRemoved(int32_t localId, bool toBeRemoved)
2360 {
2361 if (!CheckAndAddLocalIdOperating(localId)) {
2362 ACCOUNT_LOGE("The account %{public}d already in operating", localId);
2363 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_OPERATING_ERROR;
2364 }
2365 OsAccountInfo osAccountInfo;
2366 ErrCode errCode = osAccountControl_->GetOsAccountInfoById(localId, osAccountInfo);
2367 if (errCode != ERR_OK) {
2368 RemoveLocalIdToOperating(localId);
2369 return ERR_ACCOUNT_COMMON_ACCOUNT_NOT_EXIST_ERROR;
2370 }
2371 osAccountInfo.SetToBeRemoved(toBeRemoved);
2372 errCode = osAccountControl_->UpdateOsAccount(osAccountInfo);
2373 RemoveLocalIdToOperating(localId);
2374 return errCode;
2375 }
2376
2377 ErrCode IInnerOsAccountManager::IsValidOsAccount(const OsAccountInfo &osAccountInfo)
2378 {
2379 if (!osAccountInfo.GetIsCreateCompleted()) {
2380 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_IS_UNCOMPLETED_ERROR;
2381 }
2382
2383 if (osAccountInfo.GetToBeRemoved()) {
2384 return ERR_OSACCOUNT_SERVICE_INNER_ACCOUNT_TO_BE_REMOVED_ERROR;
2385 }
2386 return ERR_OK;
2387 }
2388 } // namespace AccountSA
2389 } // namespace OHOS