1 /*
2 * Copyright (c) 2021-2022 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 "os_account_control_file_manager.h"
16 #include <dirent.h>
17 #include <sstream>
18 #include <sys/types.h>
19 #ifdef WITH_SELINUX
20 #include <policycoreutils.h>
21 #endif // WITH_SELINUX
22 #include "account_log_wrapper.h"
23 #include "os_account_constants.h"
24 #include "os_account_interface.h"
25
26 namespace OHOS {
27 namespace AccountSA {
GetValidAccountID(const std::string & dirName,std::int32_t & accountID)28 bool GetValidAccountID(const std::string& dirName, std::int32_t& accountID)
29 {
30 // check length first
31 if (dirName.empty() || dirName.size() > Constants::MAX_USER_ID_LENGTH) {
32 return false;
33 }
34
35 auto iter = std::any_of(dirName.begin(), dirName.end(),
36 [dirName](char c) {
37 return (c < '0' || c > '9');
38 });
39 if (iter) {
40 return false;
41 }
42
43 // convert to osaccount id
44 std::stringstream sstream;
45 sstream << dirName;
46 sstream >> accountID;
47 return (accountID >= Constants::ADMIN_LOCAL_ID && accountID <= Constants::MAX_USER_ID);
48 }
49
OsAccountControlFileManager()50 OsAccountControlFileManager::OsAccountControlFileManager()
51 {
52 accountFileOperator_ = std::make_shared<AccountFileOperator>();
53 osAccountDataBaseOperator_ = std::make_shared<OsAccountDatabaseOperator>();
54 osAccountFileOperator_ = std::make_shared<OsAccountFileOperator>();
55 osAccountPhotoOperator_ = std::make_shared<OsAccountPhotoOperator>();
56 }
~OsAccountControlFileManager()57 OsAccountControlFileManager::~OsAccountControlFileManager()
58 {}
Init()59 void OsAccountControlFileManager::Init()
60 {
61 ACCOUNT_LOGI("OsAccountControlFileManager Init start");
62 osAccountDataBaseOperator_->Init();
63 osAccountFileOperator_->Init();
64 if (!accountFileOperator_->IsJsonFileReady(Constants::ACCOUNT_LIST_FILE_JSON_PATH)) {
65 ACCOUNT_LOGI("OsAccountControlFileManager there is not have valid account list, create!");
66 RecoverAccountListJsonFile();
67 #ifdef WITH_SELINUX
68 Restorecon(Constants::ACCOUNT_LIST_FILE_JSON_PATH.c_str());
69 #endif // WITH_SELINUX
70 }
71 if (!accountFileOperator_->IsJsonFileReady(Constants::BASE_OSACCOUNT_CONSTRAINTS_JSON_PATH)) {
72 ACCOUNT_LOGI("OsAccountControlFileManager there is not have valid account list, create!");
73 BuildAndSaveBaseOAConstraintsJsonFile();
74 #ifdef WITH_SELINUX
75 Restorecon(Constants::BASE_OSACCOUNT_CONSTRAINTS_JSON_PATH.c_str());
76 #endif // WITH_SELINUX
77 }
78 if (!accountFileOperator_->IsJsonFileReady(Constants::GLOBAL_OSACCOUNT_CONSTRAINTS_JSON_PATH)) {
79 ACCOUNT_LOGI("OsAccountControlFileManager there is not have valid account list, create!");
80 BuildAndSaveGlobalOAConstraintsJsonFile();
81 #ifdef WITH_SELINUX
82 Restorecon(Constants::GLOBAL_OSACCOUNT_CONSTRAINTS_JSON_PATH.c_str());
83 #endif // WITH_SELINUX
84 }
85 if (!accountFileOperator_->IsJsonFileReady(Constants::SPECIFIC_OSACCOUNT_CONSTRAINTS_JSON_PATH)) {
86 ACCOUNT_LOGI("OsAccountControlFileManager there is not have valid account list, create!");
87 BuildAndSaveSpecificOAConstraintsJsonFile();
88 #ifdef WITH_SELINUX
89 Restorecon(Constants::SPECIFIC_OSACCOUNT_CONSTRAINTS_JSON_PATH.c_str());
90 #endif // WITH_SELINUX
91 }
92 ACCOUNT_LOGI("OsAccountControlFileManager Init end");
93 }
94
BuildAndSaveAccountListJsonFile(const std::vector<std::string> & accounts)95 void OsAccountControlFileManager::BuildAndSaveAccountListJsonFile(const std::vector<std::string>& accounts)
96 {
97 ACCOUNT_LOGD("enter.");
98 Json accountList = Json {
99 {Constants::ACCOUNT_LIST, accounts},
100 {Constants::COUNT_ACCOUNT_NUM, accounts.size()},
101 {Constants::MAX_ALLOW_CREATE_ACCOUNT_ID, Constants::MAX_USER_ID},
102 {Constants::SERIAL_NUMBER_NUM, Constants::SERIAL_NUMBER_NUM_START},
103 {Constants::IS_SERIAL_NUMBER_FULL, Constants::IS_SERIAL_NUMBER_FULL_INIT_VALUE},
104 };
105 SaveAccountListToFile(accountList);
106 }
107
BuildAndSaveBaseOAConstraintsJsonFile()108 void OsAccountControlFileManager::BuildAndSaveBaseOAConstraintsJsonFile()
109 {
110 ACCOUNT_LOGI("enter.");
111 std::vector<std::string> baseOAConstraints;
112 if (osAccountFileOperator_->GetConstraintsByType(OsAccountType::ADMIN, baseOAConstraints) != ERR_OK) {
113 ACCOUNT_LOGE("get %{public}d base os account constraints failed.", Constants::START_USER_ID);
114 return;
115 }
116 Json baseOsAccountConstraints = Json {
117 {Constants::START_USER_STRING_ID, baseOAConstraints}
118 };
119 SaveBaseOAConstraintsToFile(baseOsAccountConstraints);
120 }
121
BuildAndSaveGlobalOAConstraintsJsonFile()122 void OsAccountControlFileManager::BuildAndSaveGlobalOAConstraintsJsonFile()
123 {
124 ACCOUNT_LOGI("enter.");
125 Json globalOsAccountConstraints = Json {
126 {Constants::DEVICE_OWNER_ID, -1},
127 {Constants::ALL_GLOBAL_CONSTRAINTS, {}}
128 };
129 SaveGlobalOAConstraintsToFile(globalOsAccountConstraints);
130 }
131
BuildAndSaveSpecificOAConstraintsJsonFile()132 void OsAccountControlFileManager::BuildAndSaveSpecificOAConstraintsJsonFile()
133 {
134 Json OsAccountConstraintsList = Json {
135 {Constants::ALL_SPECIFIC_CONSTRAINTS, {}},
136 };
137 Json specificOsAccountConstraints = Json {
138 {Constants::START_USER_STRING_ID, OsAccountConstraintsList},
139 };
140 SaveSpecificOAConstraintsToFile(specificOsAccountConstraints);
141 }
142
RecoverAccountListJsonFile()143 void OsAccountControlFileManager::RecoverAccountListJsonFile()
144 {
145 // get account list
146 std::vector<std::string> accounts;
147 DIR* rootDir = opendir(Constants::USER_INFO_BASE.c_str());
148 if (rootDir == nullptr) {
149 accounts.push_back(std::to_string(Constants::START_USER_ID)); // account 100 always exists
150 BuildAndSaveAccountListJsonFile(accounts);
151 ACCOUNT_LOGE("cannot open dir %{public}s, err %{public}d.", Constants::USER_INFO_BASE.c_str(), errno);
152 return;
153 }
154
155 struct dirent* curDir = nullptr;
156 while ((curDir = readdir(rootDir)) != nullptr) {
157 std::string curDirName(curDir->d_name);
158 if (curDirName == "." || curDirName == ".." || curDir->d_type != DT_DIR) {
159 continue;
160 }
161
162 // get and check os account id
163 std::int32_t accountID = Constants::INVALID_OS_ACCOUNT_ID;
164 if (!GetValidAccountID(curDirName, accountID)) {
165 ACCOUNT_LOGE("invalid account id %{public}s detected in %{public}s.", curDirName.c_str(),
166 Constants::USER_INFO_BASE.c_str());
167 continue;
168 }
169
170 // check repeat
171 bool sameAccountID = false;
172 std::string curAccountIDStr = std::to_string(accountID);
173 for (size_t i = 0; i < accounts.size(); ++i) {
174 if (accounts[i] == curAccountIDStr) {
175 ACCOUNT_LOGE("repeated account id %{public}s detected in %{public}s.", curAccountIDStr.c_str(),
176 Constants::USER_INFO_BASE.c_str());
177 sameAccountID = true;
178 break;
179 }
180 }
181
182 if (!sameAccountID && accountID >= Constants::START_USER_ID) {
183 accounts.push_back(curAccountIDStr);
184 }
185 }
186
187 (void)closedir(rootDir);
188 BuildAndSaveAccountListJsonFile(accounts);
189 }
190
GetOsAccountList(std::vector<OsAccountInfo> & osAccountList)191 ErrCode OsAccountControlFileManager::GetOsAccountList(std::vector<OsAccountInfo> &osAccountList)
192 {
193 ACCOUNT_LOGD("start");
194 osAccountList.clear();
195 Json accountListJson;
196 if (GetAccountListFromFile(accountListJson) != ERR_OK) {
197 ACCOUNT_LOGE("GetAccountListFromFile failed!");
198 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_OS_ACCOUNT_LIST_ERROR;
199 }
200 const auto &jsonObjectEnd = accountListJson.end();
201 std::vector<std::string> idList;
202 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(
203 accountListJson, jsonObjectEnd, Constants::ACCOUNT_LIST, idList, OHOS::AccountSA::JsonType::ARRAY);
204 if (!idList.empty()) {
205 for (auto it : idList) {
206 OsAccountInfo osAccountInfo;
207 if (GetOsAccountInfoById(std::atoi(it.c_str()), osAccountInfo) == ERR_OK) {
208 if (osAccountInfo.GetPhoto() != "") {
209 std::string photo = osAccountInfo.GetPhoto();
210 GetPhotoById(osAccountInfo.GetLocalId(), photo);
211 osAccountInfo.SetPhoto(photo);
212 }
213 osAccountList.push_back(osAccountInfo);
214 }
215 }
216 }
217 ACCOUNT_LOGD("end");
218 return ERR_OK;
219 }
220
GetOsAccountInfoById(const int id,OsAccountInfo & osAccountInfo)221 ErrCode OsAccountControlFileManager::GetOsAccountInfoById(const int id, OsAccountInfo &osAccountInfo)
222 {
223 ACCOUNT_LOGD("start");
224 std::string path = Constants::USER_INFO_BASE + Constants::PATH_SEPARATOR + std::to_string(id) +
225 Constants::PATH_SEPARATOR + Constants::USER_INFO_FILE_NAME;
226 if (!accountFileOperator_->IsExistFile(path)) {
227 ACCOUNT_LOGE("file %{public}s does not exist err", path.c_str());
228 return ERR_OSACCOUNT_SERVICE_CONTROL_SELECT_OS_ACCOUNT_ERROR;
229 }
230 std::string accountInfoStr;
231 if (accountFileOperator_->GetFileContentByPath(path, accountInfoStr) != ERR_OK) {
232 ACCOUNT_LOGE("get content from file %{public}s failed!", path.c_str());
233 return ERR_OSACCOUNT_SERVICE_CONTROL_SELECT_OS_ACCOUNT_ERROR;
234 }
235 osAccountInfo.FromJson(Json::parse(accountInfoStr, nullptr, false));
236 ACCOUNT_LOGD("end");
237 return ERR_OK;
238 }
239
GetConstraintsByType(const OsAccountType type,std::vector<std::string> & constraints)240 ErrCode OsAccountControlFileManager::GetConstraintsByType(
241 const OsAccountType type, std::vector<std::string> &constraints)
242 {
243 int typeInit = static_cast<int>(type);
244 return osAccountFileOperator_->GetConstraintsByType(typeInit, constraints);
245 }
246
UpdateBaseOAConstraints(const std::string & idStr,const std::vector<std::string> & ConstraintStr,bool isAdd)247 ErrCode OsAccountControlFileManager::UpdateBaseOAConstraints(const std::string& idStr,
248 const std::vector<std::string>& ConstraintStr, bool isAdd)
249 {
250 Json baseOAConstraintsJson;
251 if (GetBaseOAConstraintsFromFile(baseOAConstraintsJson) != ERR_OK) {
252 ACCOUNT_LOGE("get baseOAConstraints from json file failed!");
253 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_BASE_CONSTRAINTS_FROM_FILE_ERROR;
254 }
255
256 if (baseOAConstraintsJson.find(idStr) == baseOAConstraintsJson.end()) {
257 if (!isAdd) {
258 return ERR_OK;
259 }
260 baseOAConstraintsJson.emplace(idStr, ConstraintStr);
261 } else {
262 std::vector<std::string> baseOAConstraints;
263 auto jsonEnd = baseOAConstraintsJson.end();
264 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(
265 baseOAConstraintsJson, jsonEnd, idStr, baseOAConstraints, OHOS::AccountSA::JsonType::ARRAY);
266 for (auto it = ConstraintStr.begin(); it != ConstraintStr.end(); it++) {
267 if (!isAdd) {
268 baseOAConstraints.erase(std::remove(baseOAConstraints.begin(), baseOAConstraints.end(), *it),
269 baseOAConstraints.end());
270 continue;
271 }
272 if (std::find(baseOAConstraints.begin(), baseOAConstraints.end(), *it) == baseOAConstraints.end()) {
273 baseOAConstraints.emplace_back(*it);
274 }
275 }
276 baseOAConstraintsJson[idStr] = baseOAConstraints;
277 }
278 if (SaveBaseOAConstraintsToFile(baseOAConstraintsJson) != ERR_OK) {
279 ACCOUNT_LOGE("SaveBaseOAConstraintsToFile failed!");
280 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_BASE_CONSTRAINTS_TO_FILE_ERROR;
281 }
282 return ERR_OK;
283 }
284
UpdateGlobalOAConstraints(const std::string & idStr,const std::vector<std::string> & ConstraintStr,bool isAdd)285 ErrCode OsAccountControlFileManager::UpdateGlobalOAConstraints(
286 const std::string& idStr, const std::vector<std::string>& ConstraintStr, bool isAdd)
287 {
288 Json globalOAConstraintsJson;
289 if (GetGlobalOAConstraintsFromFile(globalOAConstraintsJson) != ERR_OK) {
290 ACCOUNT_LOGE("get globalOAConstraints from file failed!");
291 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
292 }
293 GlobalConstraintsDataOperate(idStr, ConstraintStr, isAdd, globalOAConstraintsJson);
294 if (SaveGlobalOAConstraintsToFile(globalOAConstraintsJson) != ERR_OK) {
295 ACCOUNT_LOGE("SaveGlobalOAConstraintsToFile failed!");
296 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_GLOBAL_CONSTRAINTS_TO_FILE_ERROR;
297 }
298 return ERR_OK;
299 }
300
GlobalConstraintsDataOperate(const std::string & idStr,const std::vector<std::string> & ConstraintStr,bool isAdd,Json & globalOAConstraintsJson)301 void OsAccountControlFileManager::GlobalConstraintsDataOperate(const std::string& idStr,
302 const std::vector<std::string>& ConstraintStr, bool isAdd, Json &globalOAConstraintsJson)
303 {
304 std::vector<std::string> globalOAConstraintsList;
305 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(globalOAConstraintsJson, globalOAConstraintsJson.end(),
306 Constants::ALL_GLOBAL_CONSTRAINTS, globalOAConstraintsList, OHOS::AccountSA::JsonType::ARRAY);
307 std::vector<std::string> waitForErase;
308 for (auto it = ConstraintStr.begin(); it != ConstraintStr.end(); it++) {
309 if (!isAdd) {
310 if (std::find(globalOAConstraintsList.begin(),
311 globalOAConstraintsList.end(), *it) == globalOAConstraintsList.end()) {
312 continue;
313 }
314 std::vector<std::string> constraintSourceList;
315 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(globalOAConstraintsJson,
316 globalOAConstraintsJson.end(), *it, constraintSourceList, OHOS::AccountSA::JsonType::ARRAY);
317 constraintSourceList.erase(std::remove(constraintSourceList.begin(), constraintSourceList.end(), idStr),
318 constraintSourceList.end());
319 if (constraintSourceList.size() == 0) {
320 globalOAConstraintsList.erase(std::remove(globalOAConstraintsList.begin(),
321 globalOAConstraintsList.end(), *it), globalOAConstraintsList.end());
322 globalOAConstraintsJson[Constants::ALL_GLOBAL_CONSTRAINTS] = globalOAConstraintsList;
323 waitForErase.push_back(*it);
324 } else {
325 globalOAConstraintsJson[*it] = constraintSourceList;
326 }
327 continue;
328 }
329 if (std::find(globalOAConstraintsList.begin(),
330 globalOAConstraintsList.end(), *it) != globalOAConstraintsList.end()) {
331 std::vector<std::string> constraintSourceList;
332 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(globalOAConstraintsJson,
333 globalOAConstraintsJson.end(), *it, constraintSourceList, OHOS::AccountSA::JsonType::ARRAY);
334 if (std::find(constraintSourceList.begin(),
335 constraintSourceList.end(), idStr) == constraintSourceList.end()) {
336 constraintSourceList.emplace_back(idStr);
337 globalOAConstraintsJson[*it] = constraintSourceList;
338 }
339 continue;
340 }
341 std::vector<std::string> constraintSourceList;
342 constraintSourceList.emplace_back(idStr);
343 globalOAConstraintsList.emplace_back(*it);
344 globalOAConstraintsJson.emplace(*it, constraintSourceList);
345 globalOAConstraintsJson[Constants::ALL_GLOBAL_CONSTRAINTS] = globalOAConstraintsList;
346 }
347 for (auto keyStr : waitForErase) {
348 globalOAConstraintsJson.erase(keyStr);
349 }
350 }
351
UpdateSpecificOAConstraints(const std::string & idStr,const std::string & targetIdStr,const std::vector<std::string> & ConstraintStr,bool isAdd)352 ErrCode OsAccountControlFileManager::UpdateSpecificOAConstraints(
353 const std::string& idStr, const std::string& targetIdStr, const std::vector<std::string>& ConstraintStr, bool isAdd)
354 {
355 Json specificOAConstraintsJson;
356 if (GetSpecificOAConstraintsFromFile(specificOAConstraintsJson) != ERR_OK) {
357 ACCOUNT_LOGE("get specificOAConstraints from file failed!");
358 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_SPECIFIC_CONSTRAINTS_FROM_FILE_ERROR;
359 }
360 if (specificOAConstraintsJson.find(targetIdStr) == specificOAConstraintsJson.end()) {
361 if (!isAdd) {
362 return ERR_OK;
363 }
364 Json osAccountConstraintsList = Json {
365 {Constants::ALL_SPECIFIC_CONSTRAINTS, {}},
366 };
367 specificOAConstraintsJson.emplace(targetIdStr, osAccountConstraintsList);
368 }
369 Json userPrivateConstraintsDataJson = specificOAConstraintsJson[targetIdStr];
370 SpecificConstraintsDataOperate(idStr, targetIdStr, ConstraintStr, isAdd, userPrivateConstraintsDataJson);
371 specificOAConstraintsJson[targetIdStr] = userPrivateConstraintsDataJson;
372 if (SaveSpecificOAConstraintsToFile(specificOAConstraintsJson) != ERR_OK) {
373 ACCOUNT_LOGE("SaveSpecificOAConstraintsToFile failed!");
374 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_SPECIFIC_CONSTRAINTS_TO_FILE_ERROR;
375 }
376 return ERR_OK;
377 }
378
SpecificConstraintsDataOperate(const std::string & idStr,const std::string & targetIdStr,const std::vector<std::string> & ConstraintStr,bool isAdd,Json & userPrivateConstraintsDataJson)379 void OsAccountControlFileManager::SpecificConstraintsDataOperate(
380 const std::string& idStr, const std::string& targetIdStr, const std::vector<std::string>& ConstraintStr,
381 bool isAdd, Json& userPrivateConstraintsDataJson)
382 {
383 std::vector<std::string> specificOAConstraintsList;
384 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(userPrivateConstraintsDataJson,
385 userPrivateConstraintsDataJson.end(), Constants::ALL_SPECIFIC_CONSTRAINTS,
386 specificOAConstraintsList, OHOS::AccountSA::JsonType::ARRAY);
387 std::vector<std::string> waitForErase;
388 for (auto it = ConstraintStr.begin(); it != ConstraintStr.end(); it++) {
389 if (!isAdd) {
390 if (userPrivateConstraintsDataJson.find(*it) == userPrivateConstraintsDataJson.end()) {
391 continue;
392 }
393 std::vector<std::string> constraintSourceList;
394 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(userPrivateConstraintsDataJson,
395 userPrivateConstraintsDataJson.end(), *it, constraintSourceList, OHOS::AccountSA::JsonType::ARRAY);
396 constraintSourceList.erase(std::remove(constraintSourceList.begin(), constraintSourceList.end(), idStr),
397 constraintSourceList.end());
398 if (constraintSourceList.size() == 0) {
399 specificOAConstraintsList.erase(std::remove(specificOAConstraintsList.begin(),
400 specificOAConstraintsList.end(), *it), specificOAConstraintsList.end());
401 userPrivateConstraintsDataJson[Constants::ALL_SPECIFIC_CONSTRAINTS] = specificOAConstraintsList;
402 waitForErase.push_back(*it);
403 } else {
404 userPrivateConstraintsDataJson[*it] = constraintSourceList;
405 }
406 continue;
407 }
408 if (std::find(specificOAConstraintsList.begin(),
409 specificOAConstraintsList.end(), *it) != specificOAConstraintsList.end()) {
410 std::vector<std::string> constraintSourceList;
411 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(userPrivateConstraintsDataJson,
412 userPrivateConstraintsDataJson.end(), *it, constraintSourceList, OHOS::AccountSA::JsonType::ARRAY);
413 if (std::find(constraintSourceList.begin(),
414 constraintSourceList.end(), idStr) == constraintSourceList.end()) {
415 constraintSourceList.emplace_back(idStr);
416 userPrivateConstraintsDataJson[*it] = constraintSourceList;
417 }
418 continue;
419 }
420 std::vector<std::string> constraintSourceList;
421 constraintSourceList.emplace_back(idStr);
422 specificOAConstraintsList.emplace_back(*it);
423 userPrivateConstraintsDataJson.emplace(*it, constraintSourceList);
424 userPrivateConstraintsDataJson[Constants::ALL_SPECIFIC_CONSTRAINTS] = specificOAConstraintsList;
425 }
426 for (auto keyStr : waitForErase) {
427 userPrivateConstraintsDataJson.erase(keyStr);
428 }
429 }
430
RemoveOAConstraintsInfo(const int32_t id)431 ErrCode OsAccountControlFileManager::RemoveOAConstraintsInfo(const int32_t id)
432 {
433 ErrCode errCode = RemoveOABaseConstraintsInfo(id);
434 if (errCode != ERR_OK) {
435 ACCOUNT_LOGE("remove os account %{public}d base constraints info failed!", id);
436 return errCode;
437 }
438 errCode = RemoveOAGlobalConstraintsInfo(id);
439 if (errCode != ERR_OK) {
440 ACCOUNT_LOGE("remove os account %{public}d global constraints info failed!", id);
441 return errCode;
442 }
443 errCode = RemoveOASpecificConstraintsInfo(id);
444 if (errCode != ERR_OK) {
445 ACCOUNT_LOGE("remove os account %{public}d specific constraints info failed!", id);
446 return errCode;
447 }
448 return ERR_OK;
449 }
450
RemoveOABaseConstraintsInfo(const int32_t id)451 ErrCode OsAccountControlFileManager::RemoveOABaseConstraintsInfo(const int32_t id)
452 {
453 Json baseOAConstraintsJson;
454 if (GetBaseOAConstraintsFromFile(baseOAConstraintsJson) != ERR_OK) {
455 ACCOUNT_LOGE("get baseOAConstraints from file failed!");
456 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_BASE_CONSTRAINTS_FROM_FILE_ERROR;
457 }
458 baseOAConstraintsJson.erase(std::to_string(id));
459 if (SaveBaseOAConstraintsToFile(baseOAConstraintsJson) != ERR_OK) {
460 ACCOUNT_LOGE("SaveBaseOAConstraintsToFile failed!");
461 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_BASE_CONSTRAINTS_TO_FILE_ERROR;
462 }
463 return ERR_OK;
464 }
465
RemoveOAGlobalConstraintsInfo(const int32_t id)466 ErrCode OsAccountControlFileManager::RemoveOAGlobalConstraintsInfo(const int32_t id)
467 {
468 Json globalOAConstraintsJson;
469 if (GetGlobalOAConstraintsFromFile(globalOAConstraintsJson) != ERR_OK) {
470 ACCOUNT_LOGE("get globalOAConstraints from file failed!");
471 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
472 }
473 std::vector<std::string> waitForErase;
474 for (auto it = globalOAConstraintsJson.begin(); it != globalOAConstraintsJson.end(); it++) {
475 if (it.key() != Constants::ALL_GLOBAL_CONSTRAINTS && it.key() != Constants::DEVICE_OWNER_ID) {
476 std::vector<std::string> sourceList;
477 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(globalOAConstraintsJson,
478 globalOAConstraintsJson.end(),
479 it.key(),
480 sourceList,
481 OHOS::AccountSA::JsonType::ARRAY);
482 sourceList.erase(std::remove(sourceList.begin(), sourceList.end(), std::to_string(id)), sourceList.end());
483 if (sourceList.size() == 0) {
484 std::vector<std::string> allGlobalConstraints;
485 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(globalOAConstraintsJson,
486 globalOAConstraintsJson.end(),
487 Constants::ALL_GLOBAL_CONSTRAINTS,
488 allGlobalConstraints,
489 OHOS::AccountSA::JsonType::ARRAY);
490 allGlobalConstraints.erase(std::remove(allGlobalConstraints.begin(),
491 allGlobalConstraints.end(), it.key()), allGlobalConstraints.end());
492 globalOAConstraintsJson[Constants::ALL_GLOBAL_CONSTRAINTS] = allGlobalConstraints;
493 waitForErase.push_back(it.key());
494 } else {
495 globalOAConstraintsJson[it.key()] = sourceList;
496 }
497 }
498 }
499 for (auto keyStr : waitForErase) {
500 globalOAConstraintsJson.erase(keyStr);
501 }
502 if (SaveGlobalOAConstraintsToFile(globalOAConstraintsJson) != ERR_OK) {
503 ACCOUNT_LOGE("SaveGlobalOAConstraintsToFile failed!");
504 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_GLOBAL_CONSTRAINTS_TO_FILE_ERROR;
505 }
506 return ERR_OK;
507 }
508
RemoveOASpecificConstraintsInfo(const int32_t id)509 ErrCode OsAccountControlFileManager::RemoveOASpecificConstraintsInfo(const int32_t id)
510 {
511 Json specificOAConstraintsJson;
512 if (GetSpecificOAConstraintsFromFile(specificOAConstraintsJson) != ERR_OK) {
513 ACCOUNT_LOGE("get specificOAConstraints from file failed!");
514 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_SPECIFIC_CONSTRAINTS_FROM_FILE_ERROR;
515 }
516 if (specificOAConstraintsJson.find(std::to_string(id)) != specificOAConstraintsJson.end()) {
517 specificOAConstraintsJson.erase(std::to_string(id));
518 }
519 for (auto it = specificOAConstraintsJson.begin(); it != specificOAConstraintsJson.end(); it++) {
520 std::vector<std::string> waitForErase;
521 Json userPrivateConstraintsJson;
522 OHOS::AccountSA::GetDataByType<Json>(specificOAConstraintsJson, specificOAConstraintsJson.end(),
523 it.key(), userPrivateConstraintsJson, OHOS::AccountSA::JsonType::OBJECT);
524 std::vector<std::string> allSpecificConstraints;
525 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(userPrivateConstraintsJson,
526 userPrivateConstraintsJson.end(), Constants::ALL_SPECIFIC_CONSTRAINTS,
527 allSpecificConstraints, OHOS::AccountSA::JsonType::ARRAY);
528 if (allSpecificConstraints.size() == 0) {
529 continue;
530 }
531 for (auto item = userPrivateConstraintsJson.begin(); item != userPrivateConstraintsJson.end(); item++) {
532 if (item.key() == Constants::ALL_SPECIFIC_CONSTRAINTS) {
533 continue;
534 }
535 std::vector<std::string> sourceList;
536 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(userPrivateConstraintsJson,
537 userPrivateConstraintsJson.end(), item.key(), sourceList, OHOS::AccountSA::JsonType::ARRAY);
538 sourceList.erase(std::remove(sourceList.begin(),
539 sourceList.end(), std::to_string(id)), sourceList.end());
540 if (sourceList.size() == 0) {
541 allSpecificConstraints.erase(std::remove(allSpecificConstraints.begin(),
542 allSpecificConstraints.end(), item.key()), allSpecificConstraints.end());
543 userPrivateConstraintsJson[Constants::ALL_SPECIFIC_CONSTRAINTS] = allSpecificConstraints;
544 waitForErase.push_back(item.key());
545 } else {
546 userPrivateConstraintsJson[item.key()] = sourceList;
547 }
548 }
549 for (auto keyStr : waitForErase) {
550 userPrivateConstraintsJson.erase(keyStr);
551 }
552 specificOAConstraintsJson[it.key()] = userPrivateConstraintsJson;
553 }
554 if (SaveSpecificOAConstraintsToFile(specificOAConstraintsJson) != ERR_OK) {
555 ACCOUNT_LOGE("SaveSpecificOAConstraintsToFile failed!");
556 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_SPECIFIC_CONSTRAINTS_TO_FILE_ERROR;
557 }
558 return ERR_OK;
559 }
560
UpdateAccountList(const std::string & idStr,bool isAdd)561 ErrCode OsAccountControlFileManager::UpdateAccountList(const std::string& idStr, bool isAdd)
562 {
563 Json accountListJson;
564 if (GetAccountListFromFile(accountListJson) != ERR_OK) {
565 ACCOUNT_LOGE("get account list failed!");
566 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_OS_ACCOUNT_LIST_ERROR;
567 }
568
569 std::vector<std::string> accountIdList;
570 auto jsonEnd = accountListJson.end();
571 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(
572 accountListJson, jsonEnd, Constants::ACCOUNT_LIST, accountIdList, OHOS::AccountSA::JsonType::ARRAY);
573
574 if (isAdd) {
575 // check repeat
576 if (std::find(accountIdList.begin(), accountIdList.end(), idStr) != accountIdList.end()) {
577 return ERR_OK; // already exist, no need to add.
578 }
579 accountIdList.emplace_back(idStr);
580 } else {
581 accountIdList.erase(std::remove(accountIdList.begin(), accountIdList.end(), idStr), accountIdList.end());
582 }
583 accountListJson[Constants::ACCOUNT_LIST] = accountIdList;
584 accountListJson[Constants::COUNT_ACCOUNT_NUM] = accountIdList.size();
585
586 if (SaveAccountListToFileAndDataBase(accountListJson) != ERR_OK) {
587 ACCOUNT_LOGE("SaveAccountListToFileAndDataBase failed!");
588 return ERR_OSACCOUNT_SERVICE_CONTROL_INSERT_OS_ACCOUNT_LIST_ERROR;
589 }
590 return ERR_OK;
591 }
592
InsertOsAccount(OsAccountInfo & osAccountInfo)593 ErrCode OsAccountControlFileManager::InsertOsAccount(OsAccountInfo &osAccountInfo)
594 {
595 ACCOUNT_LOGD("enter");
596 if (osAccountInfo.GetLocalId() < Constants::ADMIN_LOCAL_ID ||
597 osAccountInfo.GetLocalId() > Constants::MAX_USER_ID) {
598 ACCOUNT_LOGE("error id %{public}d cannot insert", osAccountInfo.GetLocalId());
599 return ERR_OSACCOUNT_SERVICE_CONTROL_ID_CANNOT_CREATE_ERROR;
600 }
601
602 std::string path = Constants::USER_INFO_BASE + Constants::PATH_SEPARATOR + osAccountInfo.GetPrimeKey() +
603 Constants::PATH_SEPARATOR + Constants::USER_INFO_FILE_NAME;
604 if (accountFileOperator_->IsExistFile(path) && accountFileOperator_->IsJsonFormat(path)) {
605 ACCOUNT_LOGE("OsAccountControlFileManagerInsertOsAccountControlFileManagerCreateAccountDir ERR");
606 return ERR_OSACCOUNT_SERVICE_CONTROL_INSERT_FILE_EXISTS_ERROR;
607 }
608
609 std::string accountInfoStr = osAccountInfo.ToString();
610 if (accountInfoStr.empty()) {
611 ACCOUNT_LOGE("os account info is empty! maybe some illegal characters caused exception!");
612 return ERR_OSACCOUNT_SERVICE_ACCOUNT_INFO_EMPTY_ERROR;
613 }
614
615 if (accountFileOperator_->InputFileByPathAndContent(path, accountInfoStr) != ERR_OK) {
616 ACCOUNT_LOGE("InputFileByPathAndContent failed! path %{public}s.", path.c_str());
617 return ERR_OSACCOUNT_SERVICE_CONTROL_INSERT_OS_ACCOUNT_FILE_ERROR;
618 }
619 osAccountDataBaseOperator_->InsertOsAccountIntoDataBase(osAccountInfo);
620
621 if (osAccountInfo.GetLocalId() >= Constants::START_USER_ID) {
622 return UpdateAccountList(osAccountInfo.GetPrimeKey(), true);
623 }
624 ACCOUNT_LOGD("end");
625 return ERR_OK;
626 }
627
DelOsAccount(const int id)628 ErrCode OsAccountControlFileManager::DelOsAccount(const int id)
629 {
630 ACCOUNT_LOGD("enter");
631 if (id <= Constants::START_USER_ID || id > Constants::MAX_USER_ID) {
632 ACCOUNT_LOGE("invalid input id %{public}d to delete!", id);
633 return ERR_OSACCOUNT_SERVICE_CONTROL_CANNOT_DELETE_ID_ERROR;
634 }
635
636 std::string path = Constants::USER_INFO_BASE + Constants::PATH_SEPARATOR + std::to_string(id);
637 if (accountFileOperator_->DeleteDirOrFile(path) != ERR_OK) {
638 ACCOUNT_LOGE("DeleteDirOrFile failed! path %{public}s.", path.c_str());
639 return ERR_OSACCOUNT_SERVICE_CONTROL_DEL_OS_ACCOUNT_INFO_ERROR;
640 }
641 osAccountDataBaseOperator_->DelOsAccountFromDatabase(id);
642 return UpdateAccountList(std::to_string(id), false);
643 }
644
UpdateOsAccount(OsAccountInfo & osAccountInfo)645 ErrCode OsAccountControlFileManager::UpdateOsAccount(OsAccountInfo &osAccountInfo)
646 {
647 ACCOUNT_LOGD("start");
648 std::string path = Constants::USER_INFO_BASE + Constants::PATH_SEPARATOR + osAccountInfo.GetPrimeKey() +
649 Constants::PATH_SEPARATOR + Constants::USER_INFO_FILE_NAME;
650 if (!accountFileOperator_->IsExistFile(path)) {
651 ACCOUNT_LOGE("path %{public}s does not exist!", path.c_str());
652 return ERR_OSACCOUNT_SERVICE_CONTROL_UPDATE_FILE_NOT_EXISTS_ERROR;
653 }
654
655 std::string accountInfoStr = osAccountInfo.ToString();
656 if (accountInfoStr.empty()) {
657 ACCOUNT_LOGE("account info str is empty!");
658 return ERR_OSACCOUNT_SERVICE_ACCOUNT_INFO_EMPTY_ERROR;
659 }
660
661 if (accountFileOperator_->InputFileByPathAndContent(path, accountInfoStr) != ERR_OK) {
662 return ERR_OSACCOUNT_SERVICE_CONTROL_UPDATE_FILE_ERROR;
663 }
664
665 #ifdef DISTRIBUTED_FEATURE_ENABLED
666 // update in database
667 if (osAccountInfo.GetLocalId() >= Constants::START_USER_ID) {
668 osAccountDataBaseOperator_->UpdateOsAccountInDatabase(osAccountInfo);
669 }
670 #else // DISTRIBUTED_FEATURE_ENABLED
671 ACCOUNT_LOGI("No distributed feature!");
672 #endif // DISTRIBUTED_FEATURE_ENABLED
673
674 ACCOUNT_LOGD("end");
675 return ERR_OK;
676 }
677
GetMaxCreatedOsAccountNum(int & maxCreatedOsAccountNum)678 ErrCode OsAccountControlFileManager::GetMaxCreatedOsAccountNum(int &maxCreatedOsAccountNum)
679 {
680 ACCOUNT_LOGD("start");
681 Json accountListJson;
682 if (GetAccountListFromFile(accountListJson) != ERR_OK) {
683 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_OS_ACCOUNT_LIST_ERROR;
684 }
685 OHOS::AccountSA::GetDataByType<int>(accountListJson,
686 accountListJson.end(),
687 Constants::MAX_ALLOW_CREATE_ACCOUNT_ID,
688 maxCreatedOsAccountNum,
689 OHOS::AccountSA::JsonType::NUMBER);
690 maxCreatedOsAccountNum -= Constants::START_USER_ID;
691 ACCOUNT_LOGD("end");
692 return ERR_OK;
693 }
694
GetSerialNumber(int64_t & serialNumber)695 ErrCode OsAccountControlFileManager::GetSerialNumber(int64_t &serialNumber)
696 {
697 Json accountListJson;
698 if (GetAccountListFromFile(accountListJson) != ERR_OK) {
699 ACCOUNT_LOGE("GetSerialNumber get accountList error");
700 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_OS_ACCOUNT_LIST_ERROR;
701 }
702 OHOS::AccountSA::GetDataByType<int64_t>(accountListJson,
703 accountListJson.end(),
704 Constants::SERIAL_NUMBER_NUM,
705 serialNumber,
706 OHOS::AccountSA::JsonType::NUMBER);
707 if (serialNumber == Constants::CARRY_NUM) {
708 accountListJson[Constants::IS_SERIAL_NUMBER_FULL] = true;
709 serialNumber = Constants::SERIAL_NUMBER_NUM_START;
710 }
711 bool isSerialNumberFull = false;
712 OHOS::AccountSA::GetDataByType<bool>(accountListJson,
713 accountListJson.end(),
714 Constants::IS_SERIAL_NUMBER_FULL,
715 isSerialNumberFull,
716 OHOS::AccountSA::JsonType::BOOLEAN);
717 if (isSerialNumberFull) {
718 std::vector<OsAccountInfo> osAccountInfos;
719 if (GetOsAccountList(osAccountInfos) != ERR_OK) {
720 ACCOUNT_LOGE("GetSerialNumber get accountList error");
721 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_OS_ACCOUNT_LIST_ERROR;
722 }
723 while (serialNumber < Constants::CARRY_NUM) {
724 bool exists = false;
725 for (auto it = osAccountInfos.begin(); it != osAccountInfos.end(); it++) {
726 if (it->GetSerialNumber() ==
727 Constants::SERIAL_NUMBER_NUM_START_FOR_ADMIN * Constants::CARRY_NUM + serialNumber) {
728 exists = true;
729 break;
730 }
731 }
732 if (!exists) {
733 break;
734 }
735 serialNumber++;
736 serialNumber = (serialNumber == Constants::CARRY_NUM) ? Constants::SERIAL_NUMBER_NUM_START : serialNumber;
737 }
738 }
739 accountListJson[Constants::SERIAL_NUMBER_NUM] = serialNumber + 1;
740 if (SaveAccountListToFileAndDataBase(accountListJson) != ERR_OK) {
741 return ERR_OSACCOUNT_SERVICE_CONTROL_INSERT_OS_ACCOUNT_LIST_ERROR;
742 }
743 serialNumber = serialNumber + Constants::SERIAL_NUMBER_NUM_START_FOR_ADMIN * Constants::CARRY_NUM;
744 return ERR_OK;
745 }
746
GetAllowCreateId(int & id)747 ErrCode OsAccountControlFileManager::GetAllowCreateId(int &id)
748 {
749 Json accountListJson;
750 if (GetAccountListFromFile(accountListJson) != ERR_OK) {
751 ACCOUNT_LOGE("GetAllowCreateId get accountList error");
752 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_OS_ACCOUNT_LIST_ERROR;
753 }
754 int countCreatedNum = 0;
755 auto jsonEnd = accountListJson.end();
756 OHOS::AccountSA::GetDataByType<int>(
757 accountListJson, jsonEnd, Constants::COUNT_ACCOUNT_NUM, countCreatedNum, OHOS::AccountSA::JsonType::NUMBER);
758 if (countCreatedNum >= Constants::MAX_USER_ID - Constants::START_USER_ID) {
759 ACCOUNT_LOGE("GetAllowCreateId cannot create more account error");
760 return ERR_OSACCOUNT_SERVICE_CONTROL_MAX_CAN_CREATE_ERROR;
761 }
762 std::vector<std::string> accountIdList;
763 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(
764 accountListJson, jsonEnd, Constants::ACCOUNT_LIST, accountIdList, OHOS::AccountSA::JsonType::ARRAY);
765 id = Constants::START_USER_ID + 1;
766 while (std::find(accountIdList.begin(), accountIdList.end(), std::to_string(id)) != accountIdList.end() &&
767 id != Constants::MAX_USER_ID + 1) {
768 id++;
769 }
770 if (id == Constants::MAX_USER_ID + 1) {
771 id = -1;
772 return ERR_OSACCOUNT_SERVICE_CONTROL_SELECT_CAN_USE_ID_ERROR;
773 }
774 return ERR_OK;
775 }
776
GetAccountListFromFile(Json & accountListJson)777 ErrCode OsAccountControlFileManager::GetAccountListFromFile(Json &accountListJson)
778 {
779 ACCOUNT_LOGD("enter");
780 accountListJson.clear();
781 std::string accountList;
782 std::lock_guard<std::mutex> lock(accountListFileLock_);
783 ErrCode errCode = accountFileOperator_->GetFileContentByPath(Constants::ACCOUNT_LIST_FILE_JSON_PATH,
784 accountList);
785 if (errCode != ERR_OK) {
786 ACCOUNT_LOGE("GetFileContentByPath failed! error code %{public}d.", errCode);
787 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_ACCOUNT_LIST_ERROR;
788 }
789 accountListJson = Json::parse(accountList, nullptr, false);
790 ACCOUNT_LOGD("end");
791 return ERR_OK;
792 }
793
GetBaseOAConstraintsFromFile(Json & baseOAConstraintsJson)794 ErrCode OsAccountControlFileManager::GetBaseOAConstraintsFromFile(Json &baseOAConstraintsJson)
795 {
796 baseOAConstraintsJson.clear();
797 std::string baseOAConstraints;
798 std::lock_guard<std::mutex> lock(baseOAConstraintsFileLock_);
799 ErrCode errCode = accountFileOperator_->GetFileContentByPath(
800 Constants::BASE_OSACCOUNT_CONSTRAINTS_JSON_PATH, baseOAConstraints);
801 if (errCode != ERR_OK) {
802 ACCOUNT_LOGE("GetFileContentByPath failed! error code %{public}d.", errCode);
803 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_BASE_CONSTRAINTS_FROM_FILE_ERROR;
804 }
805 baseOAConstraintsJson = Json::parse(baseOAConstraints, nullptr, false);
806 if (!baseOAConstraintsJson.is_object()) {
807 ACCOUNT_LOGE("base constraints json data parse failed code.");
808 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_BASE_CONSTRAINTS_FROM_FILE_ERROR;
809 }
810
811 return ERR_OK;
812 }
813
GetGlobalOAConstraintsFromFile(Json & globalOAConstraintsJson)814 ErrCode OsAccountControlFileManager::GetGlobalOAConstraintsFromFile(Json &globalOAConstraintsJson)
815 {
816 globalOAConstraintsJson.clear();
817 std::string globalOAConstraints;
818 std::lock_guard<std::mutex> lock(globalOAConstraintsFileLock_);
819 ErrCode errCode = accountFileOperator_->GetFileContentByPath(
820 Constants::GLOBAL_OSACCOUNT_CONSTRAINTS_JSON_PATH, globalOAConstraints);
821 if (errCode != ERR_OK) {
822 ACCOUNT_LOGE("GetFileContentByPath failed! error code %{public}d.", errCode);
823 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
824 }
825 globalOAConstraintsJson = Json::parse(globalOAConstraints, nullptr, false);
826 if (!globalOAConstraintsJson.is_object()) {
827 ACCOUNT_LOGE("global constraints json data parse failed code.");
828 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
829 }
830
831 return ERR_OK;
832 }
833
GetSpecificOAConstraintsFromFile(Json & specificOAConstraintsJson)834 ErrCode OsAccountControlFileManager::GetSpecificOAConstraintsFromFile(Json &specificOAConstraintsJson)
835 {
836 specificOAConstraintsJson.clear();
837 std::string specificOAConstraints;
838 std::lock_guard<std::mutex> lock(specificOAConstraintsFileLock_);
839 ErrCode errCode = accountFileOperator_->GetFileContentByPath(
840 Constants::SPECIFIC_OSACCOUNT_CONSTRAINTS_JSON_PATH, specificOAConstraints);
841 if (errCode != ERR_OK) {
842 ACCOUNT_LOGE("GetFileContentByPath failed! error code %{public}d.", errCode);
843 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
844 }
845 specificOAConstraintsJson = Json::parse(specificOAConstraints, nullptr, false);
846 if (!specificOAConstraintsJson.is_object()) {
847 ACCOUNT_LOGE("specific constraints json data parse failed code.");
848 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
849 }
850
851 return ERR_OK;
852 }
853
IsFromBaseOAConstraintsList(const int32_t id,const std::string constraint,bool & isExist)854 ErrCode OsAccountControlFileManager::IsFromBaseOAConstraintsList(
855 const int32_t id, const std::string constraint, bool &isExist)
856 {
857 isExist = false;
858 std::vector<std::string> constraintsList;
859 ErrCode errCode = osAccountFileOperator_->GetBaseOAConstraintsList(id, constraintsList);
860 if (errCode != ERR_OK) {
861 ACCOUNT_LOGE("GetBaseOAConstraintsList failed! error code %{public}d.", errCode);
862 return errCode;
863 }
864
865 if (std::find(constraintsList.begin(), constraintsList.end(), constraint) != constraintsList.end()) {
866 isExist = true;
867 }
868
869 return ERR_OK;
870 }
871
IsFromGlobalOAConstraintsList(const int32_t id,const int32_t deviceOwnerId,const std::string constraint,std::vector<ConstraintSourceTypeInfo> & globalSourceList)872 ErrCode OsAccountControlFileManager::IsFromGlobalOAConstraintsList(const int32_t id, const int32_t deviceOwnerId,
873 const std::string constraint, std::vector<ConstraintSourceTypeInfo> &globalSourceList)
874 {
875 globalSourceList.clear();
876 std::vector<std::string> constraintsList;
877 ErrCode errCode = osAccountFileOperator_->GetGlobalOAConstraintsList(constraintsList);
878 if (errCode != ERR_OK) {
879 ACCOUNT_LOGE("GetGlobalOAConstraintsList failed! error code %{public}d.", errCode);
880 return errCode;
881 }
882 if (constraintsList.size() == 0) {
883 return ERR_OK;
884 }
885 if (std::find(constraintsList.begin(), constraintsList.end(), constraint) != constraintsList.end()) {
886 Json globalOAConstraintsJson;
887 if (GetGlobalOAConstraintsFromFile(globalOAConstraintsJson) != ERR_OK) {
888 ACCOUNT_LOGE("get globalOAConstraints from file failed!");
889 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
890 }
891 std::vector<std::string> globalOAConstraintsList;
892 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(
893 globalOAConstraintsJson,
894 globalOAConstraintsJson.end(),
895 constraint,
896 globalOAConstraintsList,
897 OHOS::AccountSA::JsonType::ARRAY);
898 ConstraintSourceTypeInfo constraintSourceTypeInfo;
899 for (auto it = globalOAConstraintsList.begin(); it != globalOAConstraintsList.end(); it++) {
900 if (stoi(*it) == deviceOwnerId) {
901 constraintSourceTypeInfo.localId = stoi(*it);
902 constraintSourceTypeInfo.typeInfo = ConstraintSourceType::CONSTRAINT_TYPE_DEVICE_OWNER;
903 globalSourceList.push_back(constraintSourceTypeInfo);
904 } else {
905 constraintSourceTypeInfo.localId = stoi(*it);
906 constraintSourceTypeInfo.typeInfo = ConstraintSourceType::CONSTRAINT_TYPE_PROFILE_OWNER;
907 globalSourceList.push_back(constraintSourceTypeInfo);
908 }
909 }
910 }
911 return ERR_OK;
912 }
913
IsFromSpecificOAConstraintsList(const int32_t id,const int32_t deviceOwnerId,const std::string constraint,std::vector<ConstraintSourceTypeInfo> & specificSourceList)914 ErrCode OsAccountControlFileManager::IsFromSpecificOAConstraintsList(const int32_t id, const int32_t deviceOwnerId,
915 const std::string constraint, std::vector<ConstraintSourceTypeInfo> &specificSourceList)
916 {
917 specificSourceList.clear();
918 std::vector<std::string> constraintsList;
919 ErrCode errCode = osAccountFileOperator_->GetSpecificOAConstraintsList(id, constraintsList);
920 if (errCode != ERR_OK) {
921 ACCOUNT_LOGE("GetSpecificOAConstraintsList failed! error code %{public}d.", errCode);
922 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_ACCOUNT_LIST_ERROR;
923 }
924
925 if (std::find(constraintsList.begin(), constraintsList.end(), constraint) != constraintsList.end()) {
926 Json specificOAConstraintsJson;
927 if (GetSpecificOAConstraintsFromFile(specificOAConstraintsJson) != ERR_OK) {
928 ACCOUNT_LOGE("get specificOAConstraints from file failed!");
929 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_OS_ACCOUNT_LIST_ERROR;
930 }
931 Json specificOAConstraintsInfo;
932 OHOS::AccountSA::GetDataByType<Json>(specificOAConstraintsJson, specificOAConstraintsJson.end(),
933 std::to_string(id), specificOAConstraintsInfo, OHOS::AccountSA::JsonType::OBJECT);
934 std::vector<std::string> specificConstraintSource;
935 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(specificOAConstraintsInfo,
936 specificOAConstraintsInfo.end(), constraint,
937 specificConstraintSource, OHOS::AccountSA::JsonType::ARRAY);
938 ConstraintSourceTypeInfo constraintSourceTypeInfo;
939 for (auto it = specificConstraintSource.begin(); it != specificConstraintSource.end(); it++) {
940 if (stoi(*it) == deviceOwnerId) {
941 constraintSourceTypeInfo.localId =stoi(*it);
942 constraintSourceTypeInfo.typeInfo = ConstraintSourceType::CONSTRAINT_TYPE_DEVICE_OWNER;
943 specificSourceList.push_back(constraintSourceTypeInfo);
944 } else {
945 constraintSourceTypeInfo.localId =stoi(*it);
946 constraintSourceTypeInfo.typeInfo = ConstraintSourceType::CONSTRAINT_TYPE_PROFILE_OWNER;
947 specificSourceList.push_back(constraintSourceTypeInfo);
948 }
949 }
950 }
951 return ERR_OK;
952 }
953
SaveAccountListToFile(const Json & accountListJson)954 ErrCode OsAccountControlFileManager::SaveAccountListToFile(const Json &accountListJson)
955 {
956 ACCOUNT_LOGD("enter!");
957 std::lock_guard<std::mutex> lock(accountListFileLock_);
958 if (accountFileOperator_->InputFileByPathAndContent(Constants::ACCOUNT_LIST_FILE_JSON_PATH,
959 accountListJson.dump()) != ERR_OK) {
960 ACCOUNT_LOGE("cannot save save account list file content!");
961 return ERR_OSACCOUNT_SERVICE_CONTROL_SET_ACCOUNT_LIST_ERROR;
962 }
963 ACCOUNT_LOGD("save account list file succeed!");
964 return ERR_OK;
965 }
966
SaveBaseOAConstraintsToFile(const Json & baseOAConstraints)967 ErrCode OsAccountControlFileManager::SaveBaseOAConstraintsToFile(const Json &baseOAConstraints)
968 {
969 std::lock_guard<std::mutex> lock(baseOAConstraintsFileLock_);
970 if (accountFileOperator_->InputFileByPathAndContent(Constants::BASE_OSACCOUNT_CONSTRAINTS_JSON_PATH,
971 baseOAConstraints.dump()) != ERR_OK) {
972 ACCOUNT_LOGE("cannot save base osaccount constraints file content!");
973 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_BASE_CONSTRAINTS_TO_FILE_ERROR;
974 }
975
976 return ERR_OK;
977 }
978
SaveGlobalOAConstraintsToFile(const Json & globalOAConstraints)979 ErrCode OsAccountControlFileManager::SaveGlobalOAConstraintsToFile(const Json &globalOAConstraints)
980 {
981 std::lock_guard<std::mutex> lock(globalOAConstraintsFileLock_);
982 if (accountFileOperator_->InputFileByPathAndContent(Constants::GLOBAL_OSACCOUNT_CONSTRAINTS_JSON_PATH,
983 globalOAConstraints.dump()) != ERR_OK) {
984 ACCOUNT_LOGE("cannot save global osAccount constraints file content!");
985 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_GLOBAL_CONSTRAINTS_TO_FILE_ERROR;
986 }
987
988 return ERR_OK;
989 }
990
SaveSpecificOAConstraintsToFile(const Json & specificOAConstraints)991 ErrCode OsAccountControlFileManager::SaveSpecificOAConstraintsToFile(const Json &specificOAConstraints)
992 {
993 std::lock_guard<std::mutex> lock(specificOAConstraintsFileLock_);
994 if (accountFileOperator_->InputFileByPathAndContent(Constants::SPECIFIC_OSACCOUNT_CONSTRAINTS_JSON_PATH,
995 specificOAConstraints.dump()) != ERR_OK) {
996 ACCOUNT_LOGE("cannot save specific osAccount constraints file content!");
997 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_SPECIFIC_CONSTRAINTS_TO_FILE_ERROR;
998 }
999
1000 return ERR_OK;
1001 }
1002
GetDeviceOwnerId(int & deviceOwnerId)1003 ErrCode OsAccountControlFileManager::GetDeviceOwnerId(int &deviceOwnerId)
1004 {
1005 Json globalOAConstraintsJson;
1006 if (GetGlobalOAConstraintsFromFile(globalOAConstraintsJson) != ERR_OK) {
1007 ACCOUNT_LOGE("get global json data from file failed!");
1008 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
1009 }
1010 OHOS::AccountSA::GetDataByType<int>(
1011 globalOAConstraintsJson,
1012 globalOAConstraintsJson.end(),
1013 Constants::DEVICE_OWNER_ID,
1014 deviceOwnerId,
1015 OHOS::AccountSA::JsonType::NUMBER);
1016 return ERR_OK;
1017 }
1018
UpdateDeviceOwnerId(const int deviceOwnerId)1019 ErrCode OsAccountControlFileManager::UpdateDeviceOwnerId(const int deviceOwnerId)
1020 {
1021 ACCOUNT_LOGE("UpdateDeviceOwnerId enter");
1022 Json globalOAConstraintsJson;
1023 if (GetGlobalOAConstraintsFromFile(globalOAConstraintsJson) != ERR_OK) {
1024 ACCOUNT_LOGE("get global json data from file failed!");
1025 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_GLOBAL_CONSTRAINTS_FROM_FILE_ERROR;
1026 }
1027 globalOAConstraintsJson[Constants::DEVICE_OWNER_ID] = deviceOwnerId;
1028 if (SaveGlobalOAConstraintsToFile(globalOAConstraintsJson) != ERR_OK) {
1029 ACCOUNT_LOGE("SaveGlobalOAConstraintsToFile failed!");
1030 return ERR_OSACCOUNT_SERVICE_CONTROL_SAVE_GLOBAL_CONSTRAINTS_TO_FILE_ERROR;
1031 }
1032 return ERR_OK;
1033 }
1034
SaveAccountListToFileAndDataBase(const Json & accountListJson)1035 ErrCode OsAccountControlFileManager::SaveAccountListToFileAndDataBase(const Json &accountListJson)
1036 {
1037 osAccountDataBaseOperator_->UpdateOsAccountIDListInDatabase(accountListJson);
1038 return SaveAccountListToFile(accountListJson);
1039 }
1040
IsOsAccountExists(const int id,bool & isExists)1041 ErrCode OsAccountControlFileManager::IsOsAccountExists(const int id, bool &isExists)
1042 {
1043 ACCOUNT_LOGD("start");
1044 isExists = false;
1045 std::string path = Constants::USER_INFO_BASE + Constants::PATH_SEPARATOR + std::to_string(id) +
1046 Constants::PATH_SEPARATOR + Constants::USER_INFO_FILE_NAME;
1047 // check exist
1048 if (!accountFileOperator_->IsExistFile(path)) {
1049 ACCOUNT_LOGI("IsOsAccountExists path %{public}s does not exist!", path.c_str());
1050 return ERR_OK;
1051 }
1052
1053 // check format
1054 if (!accountFileOperator_->IsJsonFormat(path)) {
1055 ACCOUNT_LOGI("IsOsAccountExists path %{public}s wrong format!", path.c_str());
1056 return ERR_OK;
1057 }
1058
1059 isExists = true;
1060 ACCOUNT_LOGD("end");
1061 return ERR_OK;
1062 }
1063
GetPhotoById(const int id,std::string & photo)1064 ErrCode OsAccountControlFileManager::GetPhotoById(const int id, std::string &photo)
1065 {
1066 std::string path =
1067 Constants::USER_INFO_BASE + Constants::PATH_SEPARATOR + std::to_string(id) + Constants::PATH_SEPARATOR + photo;
1068 std::string byteStr = "";
1069 ErrCode errCode = accountFileOperator_->GetFileContentByPath(path, byteStr);
1070 if (errCode != ERR_OK) {
1071 ACCOUNT_LOGE("GetPhotoById cannot find photo file error");
1072 return errCode;
1073 }
1074 if (photo == Constants::USER_PHOTO_FILE_JPG_NAME) {
1075 photo =
1076 Constants::USER_PHOTO_BASE_JPG_HEAD + osAccountPhotoOperator_->EnCode(byteStr.c_str(), byteStr.length());
1077 } else {
1078 photo =
1079 Constants::USER_PHOTO_BASE_PNG_HEAD + osAccountPhotoOperator_->EnCode(byteStr.c_str(), byteStr.length());
1080 }
1081 std::string substr = "\r\n";
1082 while (photo.find(substr) != std::string::npos) {
1083 photo.erase(photo.find(substr), substr.length());
1084 }
1085 return ERR_OK;
1086 }
1087
SetPhotoById(const int id,const std::string & photo)1088 ErrCode OsAccountControlFileManager::SetPhotoById(const int id, const std::string &photo)
1089 {
1090 std::string path = "";
1091 std::string subPhoto = "";
1092 if (photo.find(Constants::USER_PHOTO_BASE_JPG_HEAD) != std::string::npos) {
1093 path = Constants::USER_INFO_BASE + Constants::PATH_SEPARATOR + std::to_string(id) + Constants::PATH_SEPARATOR +
1094 Constants::USER_PHOTO_FILE_JPG_NAME;
1095 subPhoto = photo.substr(Constants::USER_PHOTO_BASE_JPG_HEAD.size());
1096 } else if (photo.find(Constants::USER_PHOTO_BASE_PNG_HEAD) != std::string::npos) {
1097 path = Constants::USER_INFO_BASE + Constants::PATH_SEPARATOR + std::to_string(id) + Constants::PATH_SEPARATOR +
1098 Constants::USER_PHOTO_FILE_PNG_NAME;
1099 subPhoto = photo.substr(Constants::USER_PHOTO_BASE_PNG_HEAD.size());
1100 } else {
1101 ACCOUNT_LOGE("SetPhotoById photo str error");
1102 return ERR_OSACCOUNT_SERVICE_CONTROL_PHOTO_STR_ERROR;
1103 }
1104 std::string bytePhoto = osAccountPhotoOperator_->DeCode(subPhoto);
1105 ErrCode errCode = accountFileOperator_->InputFileByPathAndContent(path, bytePhoto);
1106 if (errCode != ERR_OK) {
1107 return errCode;
1108 }
1109 return ERR_OK;
1110 }
1111
GetGlobalOAConstraintsList(std::vector<std::string> & constraintsList)1112 ErrCode OsAccountControlFileManager::GetGlobalOAConstraintsList(std::vector<std::string> &constraintsList)
1113 {
1114 return osAccountFileOperator_->GetGlobalOAConstraintsList(constraintsList);
1115 }
1116
GetSpecificOAConstraintsList(const int32_t id,std::vector<std::string> & constraintsList)1117 ErrCode OsAccountControlFileManager::GetSpecificOAConstraintsList(
1118 const int32_t id, std::vector<std::string> &constraintsList)
1119 {
1120 return osAccountFileOperator_->GetSpecificOAConstraintsList(id, constraintsList);
1121 }
1122
GetIsMultiOsAccountEnable(bool & isMultiOsAccountEnable)1123 ErrCode OsAccountControlFileManager::GetIsMultiOsAccountEnable(bool &isMultiOsAccountEnable)
1124 {
1125 return osAccountFileOperator_->GetIsMultiOsAccountEnable(isMultiOsAccountEnable);
1126 }
CheckConstraintsList(const std::vector<std::string> & constraints,bool & isExists,bool & isOverSize)1127 ErrCode OsAccountControlFileManager::CheckConstraintsList(
1128 const std::vector<std::string> &constraints, bool &isExists, bool &isOverSize)
1129 {
1130 return osAccountFileOperator_->CheckConstraintsList(constraints, isExists, isOverSize);
1131 }
1132
IsAllowedCreateAdmin(bool & isAllowedCreateAdmin)1133 ErrCode OsAccountControlFileManager::IsAllowedCreateAdmin(bool &isAllowedCreateAdmin)
1134 {
1135 return osAccountFileOperator_->IsAllowedCreateAdmin(isAllowedCreateAdmin);
1136 }
1137
GetCreatedOsAccountNumFromDatabase(const std::string & storeID,int & createdOsAccountNum)1138 ErrCode OsAccountControlFileManager::GetCreatedOsAccountNumFromDatabase(const std::string& storeID,
1139 int &createdOsAccountNum)
1140 {
1141 return osAccountDataBaseOperator_->GetCreatedOsAccountNumFromDatabase(storeID, createdOsAccountNum);
1142 }
1143
GetSerialNumberFromDatabase(const std::string & storeID,int64_t & serialNumber)1144 ErrCode OsAccountControlFileManager::GetSerialNumberFromDatabase(const std::string& storeID,
1145 int64_t &serialNumber)
1146 {
1147 return osAccountDataBaseOperator_->GetSerialNumberFromDatabase(storeID, serialNumber);
1148 }
1149
GetMaxAllowCreateIdFromDatabase(const std::string & storeID,int & id)1150 ErrCode OsAccountControlFileManager::GetMaxAllowCreateIdFromDatabase(const std::string& storeID,
1151 int &id)
1152 {
1153 return osAccountDataBaseOperator_->GetMaxAllowCreateIdFromDatabase(storeID, id);
1154 }
1155
GetOsAccountFromDatabase(const std::string & storeID,const int id,OsAccountInfo & osAccountInfo)1156 ErrCode OsAccountControlFileManager::GetOsAccountFromDatabase(const std::string& storeID,
1157 const int id, OsAccountInfo &osAccountInfo)
1158 {
1159 return osAccountDataBaseOperator_->GetOsAccountFromDatabase(storeID, id, osAccountInfo);
1160 }
1161
GetOsAccountListFromDatabase(const std::string & storeID,std::vector<OsAccountInfo> & osAccountList)1162 ErrCode OsAccountControlFileManager::GetOsAccountListFromDatabase(const std::string& storeID,
1163 std::vector<OsAccountInfo> &osAccountList)
1164 {
1165 return osAccountDataBaseOperator_->GetOsAccountListFromDatabase(storeID, osAccountList);
1166 }
1167 } // namespace AccountSA
1168 } // namespace OHOS