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
16 #include "os_account_file_operator.h"
17
18 #include "account_log_wrapper.h"
19 #include "os_account_constants.h"
20
21 namespace OHOS {
22 namespace AccountSA {
OsAccountFileOperator()23 OsAccountFileOperator::OsAccountFileOperator()
24 {
25 accountFileOperator_ = std::make_shared<AccountFileOperator>();
26 isAlreadyInit_ = false;
27 constraintsConfig_.clear();
28 baseOsAccountConstraintsConfig_.clear();
29 globalOsAccountConstraintsConfig_.clear();
30 specificOsAccountConstraintsConfig_.clear();
31 constraintList_.clear();
32 }
~OsAccountFileOperator()33 OsAccountFileOperator::~OsAccountFileOperator()
34 {}
Init()35 void OsAccountFileOperator::Init()
36 {
37 if (accountFileOperator_->IsExistFile(Constants::OSACCOUNT_CONSTRAINTS_JSON_PATH)) {
38 std::string constraintsConfigStr;
39 accountFileOperator_->GetFileContentByPath(Constants::OSACCOUNT_CONSTRAINTS_JSON_PATH, constraintsConfigStr);
40 constraintsConfig_ = Json::parse(constraintsConfigStr, nullptr, false);
41 isAlreadyInit_ = true;
42 }
43
44 if (accountFileOperator_->IsExistFile(Constants::CONSTRAINTS_LIST_JSON_PATH)) {
45 std::string constraintListCollectingStr;
46 accountFileOperator_->GetFileContentByPath(Constants::CONSTRAINTS_LIST_JSON_PATH, constraintListCollectingStr);
47 Json constraintListCollecting = Json::parse(constraintListCollectingStr, nullptr, false);
48 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(constraintListCollecting,
49 constraintListCollecting.end(),
50 Constants::CONSTRAINTS_LIST,
51 constraintList_,
52 OHOS::AccountSA::JsonType::ARRAY);
53 }
54 }
55
GetConstraintsByType(const int type,std::vector<std::string> & constraints)56 ErrCode OsAccountFileOperator::GetConstraintsByType(const int type, std::vector<std::string> &constraints)
57 {
58 ACCOUNT_LOGD("start");
59 if (!isAlreadyInit_) {
60 return ERR_OSACCOUNT_SERVICE_OS_FILE_GET_CONFIG_ERROR;
61 }
62 std::vector<std::string> typeList;
63 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(
64 constraintsConfig_, constraintsConfig_.end(), Constants::TYPE_LIST, typeList, OHOS::AccountSA::JsonType::ARRAY);
65 if (std::find(typeList.begin(), typeList.end(), std::to_string(type)) == typeList.end()) {
66 ACCOUNT_LOGE("GetConstraintsByType get type error");
67 return ERR_OSACCOUNT_SERVICE_CONTROL_GET_TYPE_ERROR;
68 }
69 Json typeJson;
70 OHOS::AccountSA::GetDataByType<Json>(constraintsConfig_,
71 constraintsConfig_.end(),
72 Constants::USER_CONSTRAINTS_TEMPLATE,
73 typeJson,
74 OHOS::AccountSA::JsonType::OBJECT);
75 constraints.clear();
76 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(
77 typeJson, typeJson.end(), std::to_string(type), constraints, OHOS::AccountSA::JsonType::ARRAY);
78 ACCOUNT_LOGD("end");
79 return ERR_OK;
80 }
81
GetBaseOAConstraintsList(const int id,std::vector<std::string> & constraints)82 ErrCode OsAccountFileOperator::GetBaseOAConstraintsList(const int id, std::vector<std::string> &constraints)
83 {
84 if (accountFileOperator_->IsExistFile(Constants::BASE_OSACCOUNT_CONSTRAINTS_JSON_PATH)) {
85 std::string baseUserConstraintsConfigStr;
86 accountFileOperator_->GetFileContentByPath(
87 Constants::BASE_OSACCOUNT_CONSTRAINTS_JSON_PATH, baseUserConstraintsConfigStr);
88 baseOsAccountConstraintsConfig_ = Json::parse(baseUserConstraintsConfigStr, nullptr, false);
89 }
90 if (baseOsAccountConstraintsConfig_.size() == 0) {
91 ACCOUNT_LOGE("baseOsAccountConstraints data is empty");
92 return ERR_OSACCOUNT_SERVICE_GET_DATA_FROM_BASE_CONSTRAINTS_FILE_EMPTY;
93 }
94 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(baseOsAccountConstraintsConfig_,
95 baseOsAccountConstraintsConfig_.end(),
96 std::to_string(id),
97 constraints,
98 OHOS::AccountSA::JsonType::ARRAY);
99 return ERR_OK;
100 }
101
GetGlobalOAConstraintsList(std::vector<std::string> & constraints)102 ErrCode OsAccountFileOperator::GetGlobalOAConstraintsList(std::vector<std::string> &constraints)
103 {
104 if (accountFileOperator_->IsExistFile(Constants::GLOBAL_OSACCOUNT_CONSTRAINTS_JSON_PATH)) {
105 std::string globalOsAccountConstraintsConfigStr;
106 accountFileOperator_->GetFileContentByPath(
107 Constants::GLOBAL_OSACCOUNT_CONSTRAINTS_JSON_PATH, globalOsAccountConstraintsConfigStr);
108 globalOsAccountConstraintsConfig_ = Json::parse(globalOsAccountConstraintsConfigStr, nullptr, false);
109 }
110
111 if (globalOsAccountConstraintsConfig_.size() == 0) {
112 ACCOUNT_LOGE("globalOsAccountConstraints data is empty");
113 return ERR_OSACCOUNT_SERVICE_GET_DATA_FROM_GLOBAL_CONSTRAINTS_FILE_EMPTY;
114 }
115 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(globalOsAccountConstraintsConfig_,
116 globalOsAccountConstraintsConfig_.end(),
117 Constants::ALL_GLOBAL_CONSTRAINTS,
118 constraints,
119 OHOS::AccountSA::JsonType::ARRAY);
120 return ERR_OK;
121 }
122
GetSpecificOAConstraintsList(const int id,std::vector<std::string> & constraints)123 ErrCode OsAccountFileOperator::GetSpecificOAConstraintsList(const int id, std::vector<std::string> &constraints)
124 {
125 if (accountFileOperator_->IsExistFile(Constants::SPECIFIC_OSACCOUNT_CONSTRAINTS_JSON_PATH)) {
126 std::string specificOsAccountConstraintsConfigStr;
127 accountFileOperator_->GetFileContentByPath(
128 Constants::SPECIFIC_OSACCOUNT_CONSTRAINTS_JSON_PATH, specificOsAccountConstraintsConfigStr);
129 specificOsAccountConstraintsConfig_ = Json::parse(specificOsAccountConstraintsConfigStr, nullptr, false);
130 }
131
132 if (specificOsAccountConstraintsConfig_.size() == 0) {
133 ACCOUNT_LOGE("globalOsAccountConstraints data is empty");
134 return ERR_OSACCOUNT_SERVICE_GET_DATA_FROM_SPECIFIC_CONSTRAINTS_FILE_EMPTY;
135 }
136 Json SpecificOAConstraintsData;
137 OHOS::AccountSA::GetDataByType<Json>(specificOsAccountConstraintsConfig_,
138 specificOsAccountConstraintsConfig_.end(),
139 std::to_string(id),
140 SpecificOAConstraintsData,
141 OHOS::AccountSA::JsonType::OBJECT);
142 OHOS::AccountSA::GetDataByType<std::vector<std::string>>(SpecificOAConstraintsData,
143 SpecificOAConstraintsData.end(),
144 Constants::ALL_SPECIFIC_CONSTRAINTS,
145 constraints,
146 OHOS::AccountSA::JsonType::ARRAY);
147 return ERR_OK;
148 }
149
GetIsMultiOsAccountEnable(bool & isMultiOsAccountEnable)150 ErrCode OsAccountFileOperator::GetIsMultiOsAccountEnable(bool &isMultiOsAccountEnable)
151 {
152 if (!isAlreadyInit_) {
153 ACCOUNT_LOGE("GetIsMultiOsAccountEnable not init error");
154 return ERR_OSACCOUNT_SERVICE_OS_FILE_GET_CONFIG_ERROR;
155 }
156 OHOS::AccountSA::GetDataByType<Json>(constraintsConfig_,
157 constraintsConfig_.end(),
158 Constants::IS_MULTI_OS_ACCOUNT_ENABLE,
159 isMultiOsAccountEnable,
160 OHOS::AccountSA::JsonType::BOOLEAN);
161 return ERR_OK;
162 }
163
IsAllowedCreateAdmin(bool & isAllowedCreateAdmin)164 ErrCode OsAccountFileOperator::IsAllowedCreateAdmin(bool &isAllowedCreateAdmin)
165 {
166 if (!isAlreadyInit_) {
167 ACCOUNT_LOGE("IsAllowedCreateAdmin not init error");
168 return ERR_OSACCOUNT_SERVICE_OS_FILE_GET_CONFIG_ERROR;
169 }
170 OHOS::AccountSA::GetDataByType<Json>(constraintsConfig_,
171 constraintsConfig_.end(),
172 Constants::IS_ALLOWED_CREATE_ADMIN,
173 isAllowedCreateAdmin,
174 OHOS::AccountSA::JsonType::BOOLEAN);
175 return ERR_OK;
176 }
177
CheckConstraintsList(const std::vector<std::string> & constraints,bool & isExists,bool & isOverSize)178 ErrCode OsAccountFileOperator::CheckConstraintsList(const std::vector<std::string> &constraints,
179 bool &isExists, bool &isOverSize)
180 {
181 isOverSize = false;
182 isExists = true;
183 if (constraintList_.size() == 0) {
184 ACCOUNT_LOGE("constraintList_ zero error!");
185 return ERR_OSACCOUNT_SERVICE_OS_FILE_GET_CONSTRAINTS_LITS_ERROR;
186 }
187
188 if (constraints.size() > constraintList_.size()) {
189 ACCOUNT_LOGE("input constraints list size %{public}zu is larger than %{public}zu.",
190 constraints.size(), constraintList_.size());
191 isOverSize = true;
192 return ERR_OK;
193 }
194
195 for (auto it = constraints.begin(); it != constraints.end(); it++) {
196 if (std::find(constraintList_.begin(), constraintList_.end(), *it) == constraintList_.end()) {
197 isExists = false;
198 return ERR_OK;
199 }
200 }
201 return ERR_OK;
202 }
203 } // namespace AccountSA
204 } // namespace OHOS