1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_OSACCOUNT_OS_ACCOUNT_CONTROL_FILE_MANAGER_H
17 #define OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_OSACCOUNT_OS_ACCOUNT_CONTROL_FILE_MANAGER_H
18 
19 #include <memory>
20 #include <mutex>
21 #include <sys/inotify.h>
22 #include "account_file_watcher_manager.h"
23 #include "ios_account_control.h"
24 #include "os_account_constants.h"
25 #ifdef HAS_KV_STORE_PART
26 #include "os_account_database_operator.h"
27 #endif
28 #include "os_account_file_operator.h"
29 #include "os_account_photo_operator.h"
30 namespace OHOS {
31 namespace AccountSA {
32 using CheckNotifyEventCallbackFunc = std::function<bool(const std::string&, int32_t, uint32_t)>;
33 
34 bool GetValidAccountID(const std::string& dirName, std::int32_t& accountID);
35 
36 class OsAccountControlFileManager : public IOsAccountControl {
37 public:
38     OsAccountControlFileManager();
39     virtual ~OsAccountControlFileManager();
40     void Init() override;
41     void FileInit();
42     ErrCode GetOsAccountConfig(OsAccountConfig &config) override;
43     ErrCode GetOsAccountList(std::vector<OsAccountInfo> &osAccountList) override;
44     ErrCode GetOsAccountIdList(std::vector<int32_t> &idList) override;
45     ErrCode GetOsAccountInfoById(const int id, OsAccountInfo &osAccountInfo) override;
46     ErrCode GetConstraintsByType(const OsAccountType type, std::vector<std::string> &constraints) override;
47     ErrCode InsertOsAccount(OsAccountInfo &osAccountInfo) override;
48     ErrCode DelOsAccount(const int id) override;
49     ErrCode UpdateOsAccount(OsAccountInfo &osAccountInfo) override;
50     ErrCode GetAccountIndexFromFile(Json &accountIndexJson) override;
51     ErrCode GetSerialNumber(int64_t &serialNumber) override;
52     ErrCode GetAllowCreateId(int &id) override;
53     ErrCode IsOsAccountExists(const int id, bool &isExists) override;
54     ErrCode GetPhotoById(const int id, std::string &photo) override;
55     ErrCode SetPhotoById(const int id, const std::string &photo) override;
56     ErrCode GetIsMultiOsAccountEnable(bool &isMultiOsAccountEnable) override;
57     ErrCode CheckConstraintsList(const std::vector<std::string> &constraints,
58         bool &isExists, bool &isOverSize) override;
59     ErrCode IsAllowedCreateAdmin(bool &isAllowedCreateAdmin) override;
60 
61     ErrCode GetCreatedOsAccountNumFromDatabase(const std::string& storeID,
62         int &createdOsAccountNum) override;
63     ErrCode GetSerialNumberFromDatabase(const std::string& storeID,
64         int64_t &serialNumber) override;
65     ErrCode GetMaxAllowCreateIdFromDatabase(const std::string& storeID, int &id) override;
66     ErrCode GetOsAccountFromDatabase(const std::string& storeID,
67         const int id, OsAccountInfo& osAccountInfo) override;
68     ErrCode GetOsAccountListFromDatabase(const std::string& storeID,
69         std::vector<OsAccountInfo>& osAccountList) override;
70 
71     ErrCode RemoveOAConstraintsInfo(const int32_t id) override;
72     ErrCode IsFromBaseOAConstraintsList(const int32_t id, const std::string constraint, bool &isExits) override;
73     ErrCode IsFromGlobalOAConstraintsList(const int32_t id, const int32_t deviceOwnerId,
74         const std::string constraint, std::vector<ConstraintSourceTypeInfo> &globalSourceList) override;
75     ErrCode IsFromSpecificOAConstraintsList(const int32_t id, const int32_t deviceOwnerId,
76         const std::string constraint, std::vector<ConstraintSourceTypeInfo> &specificSourceList) override;
77     ErrCode GetGlobalOAConstraintsList(std::vector<std::string> &constraintsList) override;
78     ErrCode GetSpecificOAConstraintsList(const int32_t id, std::vector<std::string> &constraintsList) override;
79     ErrCode UpdateBaseOAConstraints(const std::string& idStr,
80         const std::vector<std::string>& ConstraintStr, bool isAdd) override;
81     ErrCode UpdateGlobalOAConstraints(const std::string& idStr,
82         const std::vector<std::string>& ConstraintStr, bool isAdd) override;
83     ErrCode UpdateSpecificOAConstraints(const std::string& idStr,
84         const std::string& targetIdStr, const std::vector<std::string>& ConstraintStr, bool isAdd) override;
85     ErrCode GetDeviceOwnerId(int32_t &deviceOwnerId) override;
86     ErrCode UpdateDeviceOwnerId(const int32_t deviceOwnerId) override;
87 
88     ErrCode SetDefaultActivatedOsAccount(const int32_t id) override;
89     ErrCode GetDefaultActivatedOsAccount(int32_t &id) override;
90     ErrCode GenerateAccountInfoDigestStr(
91         const std::string &userInfoPath, const std::string &accountInfoStr, std::string &digestStr);
92     ErrCode DeleteAccountInfoDigest(const std::string &userInfoPath);
93     ErrCode UpdateAccountIndex(const OsAccountInfo &osAccountInfo, const bool isDelete) override;
94     ErrCode SetNextLocalId(const int32_t &nextLocalId) override;
95 
96 private:
97     ErrCode GetDefaultOsAccountConfig(OsAccountConfig &config);
98     ErrCode RemoveAccountIndex(const int32_t id);
99     int32_t GetNextLocalId(const std::vector<std::string> &accountIdList, int32_t startId);
100     ErrCode UpdateAccountList(const std::string &idStr, bool isAdd);
101     ErrCode GetAccountListFromFile(Json& accountListJson);
102     ErrCode GetAccountIndexInfo(std::string &accountIndexInfo);
103     ErrCode SaveAccountListToFile(const Json& accountListJson);
104     ErrCode SaveAccountListToFileAndDataBase(const Json& accountListJson);
105     void BuildAndSaveAccountListJsonFile(const std::vector<std::string>& accounts);
106     void RecoverAccountListJsonFile();
107     void RecoverAccountInfoDigestJsonFile();
108     void BuildAndSaveOsAccountIndexJsonFile();
109     void BuildAndSaveBaseOAConstraintsJsonFile();
110     void BuildAndSaveGlobalOAConstraintsJsonFile();
111     void BuildAndSaveSpecificOAConstraintsJsonFile();
112     void GlobalConstraintsDataOperate(const std::string& idStr,
113         const std::vector<std::string>& ConstraintStr, bool isAdd, Json &globalOAConstraintsJson);
114     void SpecificConstraintsDataOperate(const std::string& idStr, const std::string& targetIdStr,
115         const std::vector<std::string>& ConstraintStr, bool isAdd, Json& userPrivateConstraintsDataJson);
116 
117     ErrCode GetBaseOAConstraintsFromFile(Json &baseOAConstraintsJson);
118     ErrCode GetGlobalOAConstraintsFromFile(Json &globalOAConstraintsJson);
119     ErrCode GetSpecificOAConstraintsFromFile(Json &specificOAConstraintsJson);
120     ErrCode SaveBaseOAConstraintsToFile(const Json &baseOAConstraints);
121     ErrCode SaveGlobalOAConstraintsToFile(const Json &globalOAConstraints);
122     ErrCode SaveSpecificOAConstraintsToFile(const Json &specificOAConstraints);
123 
124     ErrCode RemoveOABaseConstraintsInfo(const int32_t id);
125     ErrCode RemoveOAGlobalConstraintsInfo(const int32_t id);
126     ErrCode RemoveOASpecificConstraintsInfo(const int32_t id);
127     ErrCode GetAccountInfoDigestFromFile(const std::string &path, uint8_t *digest, uint32_t size);
128     void GetNotifyEvent();
129     bool DealWithFileModifyEvent(const std::string &fileName, const int32_t id);
130     bool DealWithFileDeleteEvent(const std::string &fileName, const int32_t id);
131     bool DealWithFileMoveEvent(const std::string &fileName, const int32_t id);
132     void InitFileWatcherInfo(std::vector<std::string> &accountIdList);
133     bool RecoverAccountData(const std::string &fileName, const int32_t id);
134 
135 private:
136     std::shared_ptr<AccountFileOperator> accountFileOperator_;
137 #ifdef HAS_KV_STORE_PART
138     std::shared_ptr<OsAccountDatabaseOperator> osAccountDataBaseOperator_;
139 #endif
140     AccountFileWatcherMgr &accountFileWatcherMgr_;
141     std::shared_ptr<OsAccountFileOperator> osAccountFileOperator_;
142     std::shared_ptr<OsAccountPhotoOperator> osAccountPhotoOperator_;
143     std::mutex fileWatcherMgrLock_;
144     std::mutex accountListFileLock_;
145     std::mutex accountInfoFileLock_;
146     std::mutex operatingIdMutex_;
147     std::mutex baseOAConstraintsFileLock_;
148     std::mutex globalOAConstraintsFileLock_;
149     std::mutex specificOAConstraintsFileLock_;
150 
151     CheckNotifyEventCallbackFunc eventCallbackFunc_;
152 };
153 }  // namespace AccountSA
154 }  // namespace OHOS
155 
156 #endif  // OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_OSACCOUNT_OS_ACCOUNT_CONTROL_FILE_MANAGER_H
157