• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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