1 /* 2 * Copyright (c) 2023-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 #include "ability_auto_startup_data_manager.h" 17 18 #include <unistd.h> 19 20 #include "accesstoken_kit.h" 21 #include "hilog_tag_wrapper.h" 22 #include "os_account_manager_wrapper.h" 23 24 namespace OHOS { 25 namespace AbilityRuntime { 26 namespace { 27 constexpr int32_t CHECK_INTERVAL = 100000; // 100ms 28 constexpr int32_t MAX_TIMES = 5; // 5 * 100ms = 500ms 29 constexpr const char *AUTO_STARTUP_STORAGE_DIR = "/data/service/el1/public/database/auto_startup_service"; 30 const std::string JSON_KEY_BUNDLE_NAME = "bundleName"; 31 const std::string JSON_KEY_ABILITY_NAME = "abilityName"; 32 const std::string JSON_KEY_MODULE_NAME = "moduleName"; 33 const std::string JSON_KEY_IS_AUTO_STARTUP = "isAutoStartup"; 34 const std::string JSON_KEY_IS_EDM_FORCE = "isEdmForce"; 35 const std::string JSON_KEY_TYPE_NAME = "abilityTypeName"; 36 const std::string JSON_KEY_APP_CLONE_INDEX = "appCloneIndex"; 37 const std::string JSON_KEY_ACCESS_TOKENID = "accessTokenId"; 38 const std::string JSON_KEY_USERID = "userId"; 39 } // namespace 40 const DistributedKv::AppId AbilityAutoStartupDataManager::APP_ID = { "auto_startup_storage" }; 41 const DistributedKv::StoreId AbilityAutoStartupDataManager::STORE_ID = { "auto_startup_infos" }; AbilityAutoStartupDataManager()42 AbilityAutoStartupDataManager::AbilityAutoStartupDataManager() {} 43 ~AbilityAutoStartupDataManager()44 AbilityAutoStartupDataManager::~AbilityAutoStartupDataManager() 45 { 46 if (kvStorePtr_ != nullptr) { 47 dataManager_.CloseKvStore(APP_ID, kvStorePtr_); 48 } 49 } 50 RestoreKvStore(DistributedKv::Status status)51 DistributedKv::Status AbilityAutoStartupDataManager::RestoreKvStore(DistributedKv::Status status) 52 { 53 if (status == DistributedKv::Status::DATA_CORRUPTED) { 54 DistributedKv::Options options = { .createIfMissing = true, 55 .encrypt = false, 56 .autoSync = false, 57 .syncable = false, 58 .securityLevel = DistributedKv::SecurityLevel::S2, 59 .area = DistributedKv::EL1, 60 .kvStoreType = DistributedKv::KvStoreType::SINGLE_VERSION, 61 .baseDir = AUTO_STARTUP_STORAGE_DIR }; 62 TAG_LOGI(AAFwkTag::AUTO_STARTUP, "corrupted, deleting db"); 63 dataManager_.DeleteKvStore(APP_ID, STORE_ID, options.baseDir); 64 TAG_LOGI(AAFwkTag::AUTO_STARTUP, "deleted corrupted db, recreating db"); 65 status = dataManager_.GetSingleKvStore(options, APP_ID, STORE_ID, kvStorePtr_); 66 TAG_LOGI(AAFwkTag::AUTO_STARTUP, "recreate db result:%{public}d", status); 67 } 68 return status; 69 } 70 GetKvStore()71 DistributedKv::Status AbilityAutoStartupDataManager::GetKvStore() 72 { 73 DistributedKv::Options options = { .createIfMissing = true, 74 .encrypt = false, 75 .autoSync = false, 76 .syncable = false, 77 .securityLevel = DistributedKv::SecurityLevel::S2, 78 .area = DistributedKv::EL1, 79 .kvStoreType = DistributedKv::KvStoreType::SINGLE_VERSION, 80 .baseDir = AUTO_STARTUP_STORAGE_DIR }; 81 82 DistributedKv::Status status = dataManager_.GetSingleKvStore(options, APP_ID, STORE_ID, kvStorePtr_); 83 if (status != DistributedKv::Status::SUCCESS) { 84 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Error: %{public}d", status); 85 status = RestoreKvStore(status); 86 return status; 87 } 88 89 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Get kvStore success"); 90 return status; 91 } 92 CheckKvStore()93 bool AbilityAutoStartupDataManager::CheckKvStore() 94 { 95 if (kvStorePtr_ != nullptr) { 96 return true; 97 } 98 int32_t tryTimes = MAX_TIMES; 99 while (tryTimes > 0) { 100 DistributedKv::Status status = GetKvStore(); 101 if (status == DistributedKv::Status::SUCCESS && kvStorePtr_ != nullptr) { 102 return true; 103 } 104 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Try times: %{public}d", tryTimes); 105 usleep(CHECK_INTERVAL); 106 tryTimes--; 107 } 108 return kvStorePtr_ != nullptr; 109 } 110 InsertAutoStartupData(const AutoStartupInfo & info,bool isAutoStartup,bool isEdmForce)111 int32_t AbilityAutoStartupDataManager::InsertAutoStartupData( 112 const AutoStartupInfo &info, bool isAutoStartup, bool isEdmForce) 113 { 114 if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || info.userId == -1) { 115 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Invalid value"); 116 return ERR_INVALID_VALUE; 117 } 118 119 TAG_LOGD(AAFwkTag::AUTO_STARTUP, 120 "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," 121 " accessTokenId: %{public}s, userId: %{public}d", 122 info.bundleName.c_str(), info.moduleName.c_str(), 123 info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); 124 { 125 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 126 if (!CheckKvStore()) { 127 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null kvStore"); 128 return ERR_NO_INIT; 129 } 130 } 131 132 DistributedKv::Key key = ConvertAutoStartupDataToKey(info); 133 DistributedKv::Value value = ConvertAutoStartupStatusToValue(isAutoStartup, isEdmForce, info.abilityTypeName); 134 DistributedKv::Status status; 135 { 136 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 137 status = kvStorePtr_->Put(key, value); 138 } 139 140 if (status != DistributedKv::Status::SUCCESS) { 141 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Insert data to kvStore error: %{public}d", status); 142 { 143 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 144 status = RestoreKvStore(status); 145 } 146 return ERR_INVALID_OPERATION; 147 } 148 return ERR_OK; 149 } 150 UpdateAutoStartupData(const AutoStartupInfo & info,bool isAutoStartup,bool isEdmForce)151 int32_t AbilityAutoStartupDataManager::UpdateAutoStartupData( 152 const AutoStartupInfo &info, bool isAutoStartup, bool isEdmForce) 153 { 154 if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || info.userId == -1) { 155 TAG_LOGW(AAFwkTag::AUTO_STARTUP, "Invalid value"); 156 return ERR_INVALID_VALUE; 157 } 158 159 TAG_LOGD(AAFwkTag::AUTO_STARTUP, 160 "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," 161 " accessTokenId: %{public}s, userId: %{public}d", 162 info.bundleName.c_str(), info.moduleName.c_str(), 163 info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); 164 { 165 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 166 if (!CheckKvStore()) { 167 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null kvStore"); 168 return ERR_NO_INIT; 169 } 170 } 171 172 DistributedKv::Key key = ConvertAutoStartupDataToKey(info); 173 DistributedKv::Status status; 174 { 175 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 176 status = kvStorePtr_->Delete(key); 177 } 178 if (status != DistributedKv::Status::SUCCESS) { 179 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Delete data from kvStore error: %{public}d", status); 180 { 181 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 182 status = RestoreKvStore(status); 183 } 184 return ERR_INVALID_OPERATION; 185 } 186 DistributedKv::Value value = ConvertAutoStartupStatusToValue(isAutoStartup, isEdmForce, info.abilityTypeName); 187 { 188 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 189 status = kvStorePtr_->Put(key, value); 190 } 191 if (status != DistributedKv::Status::SUCCESS) { 192 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Insert data to kvStore error: %{public}d", status); 193 { 194 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 195 status = RestoreKvStore(status); 196 } 197 return ERR_INVALID_OPERATION; 198 } 199 200 return ERR_OK; 201 } 202 DeleteAutoStartupData(const AutoStartupInfo & info)203 int32_t AbilityAutoStartupDataManager::DeleteAutoStartupData(const AutoStartupInfo &info) 204 { 205 if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || info.userId == -1) { 206 TAG_LOGW(AAFwkTag::AUTO_STARTUP, "Invalid value"); 207 return ERR_INVALID_VALUE; 208 } 209 210 TAG_LOGD(AAFwkTag::AUTO_STARTUP, 211 "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," 212 " accessTokenId: %{public}s, userId: %{public}d", 213 info.bundleName.c_str(), info.moduleName.c_str(), 214 info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); 215 { 216 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 217 if (!CheckKvStore()) { 218 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null kvStore"); 219 return ERR_NO_INIT; 220 } 221 } 222 223 DistributedKv::Key key = ConvertAutoStartupDataToKey(info); 224 DistributedKv::Status status; 225 { 226 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 227 status = kvStorePtr_->Delete(key); 228 } 229 230 if (status != DistributedKv::Status::SUCCESS) { 231 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Delete data from kvStore error: %{public}d", status); 232 { 233 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 234 status = RestoreKvStore(status); 235 } 236 return ERR_INVALID_OPERATION; 237 } 238 return ERR_OK; 239 } 240 DeleteAutoStartupData(const std::string & bundleName,int32_t accessTokenId)241 int32_t AbilityAutoStartupDataManager::DeleteAutoStartupData(const std::string &bundleName, int32_t accessTokenId) 242 { 243 auto accessTokenIdStr = std::to_string(accessTokenId); 244 if (bundleName.empty() || accessTokenIdStr.empty()) { 245 TAG_LOGW(AAFwkTag::AUTO_STARTUP, "Invalid value"); 246 return ERR_INVALID_VALUE; 247 } 248 249 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "bundleName: %{public}s, accessTokenId: %{public}s", 250 bundleName.c_str(), accessTokenIdStr.c_str()); 251 { 252 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 253 if (!CheckKvStore()) { 254 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null kvStore"); 255 return ERR_NO_INIT; 256 } 257 } 258 259 std::vector<DistributedKv::Entry> allEntries; 260 DistributedKv::Status status = DistributedKv::Status::SUCCESS; 261 { 262 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 263 status = kvStorePtr_->GetEntries(nullptr, allEntries); 264 } 265 if (status != DistributedKv::Status::SUCCESS) { 266 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Get entries error: %{public}d", status); 267 { 268 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 269 status = RestoreKvStore(status); 270 } 271 return ERR_INVALID_OPERATION; 272 } 273 274 for (const auto &item : allEntries) { 275 if (IsEqual(item.key, accessTokenIdStr)) { 276 { 277 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 278 status = kvStorePtr_->Delete(item.key); 279 } 280 if (status != DistributedKv::Status::SUCCESS) { 281 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Delete data from kvStore error: %{public}d", status); 282 { 283 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 284 status = RestoreKvStore(status); 285 } 286 return ERR_INVALID_OPERATION; 287 } 288 } 289 } 290 291 return ERR_OK; 292 } 293 QueryAutoStartupData(const AutoStartupInfo & info)294 AutoStartupStatus AbilityAutoStartupDataManager::QueryAutoStartupData(const AutoStartupInfo &info) 295 { 296 AutoStartupStatus asustatus; 297 if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || info.userId == -1) { 298 TAG_LOGW(AAFwkTag::AUTO_STARTUP, "Invalid value"); 299 asustatus.code = ERR_INVALID_VALUE; 300 return asustatus; 301 } 302 303 TAG_LOGD(AAFwkTag::AUTO_STARTUP, 304 "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," 305 " accessTokenId: %{public}s, userId: %{public}d", 306 info.bundleName.c_str(), info.moduleName.c_str(), 307 info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); 308 { 309 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 310 if (!CheckKvStore()) { 311 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null kvStore"); 312 asustatus.code = ERR_NO_INIT; 313 return asustatus; 314 } 315 } 316 317 std::vector<DistributedKv::Entry> allEntries; 318 DistributedKv::Status status = DistributedKv::Status::SUCCESS; 319 { 320 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 321 status = kvStorePtr_->GetEntries(nullptr, allEntries); 322 } 323 if (status != DistributedKv::Status::SUCCESS) { 324 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Get entries error: %{public}d", status); 325 { 326 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 327 status = RestoreKvStore(status); 328 } 329 asustatus.code = ERR_INVALID_OPERATION; 330 return asustatus; 331 } 332 333 asustatus.code = ERR_NAME_NOT_FOUND; 334 for (const auto &item : allEntries) { 335 if (IsEqual(item.key, info)) { 336 ConvertAutoStartupStatusFromValue(item.value, asustatus.isAutoStartup, asustatus.isEdmForce); 337 asustatus.code = ERR_OK; 338 } 339 } 340 341 return asustatus; 342 } 343 QueryAllAutoStartupApplications(std::vector<AutoStartupInfo> & infoList,int32_t userId)344 int32_t AbilityAutoStartupDataManager::QueryAllAutoStartupApplications(std::vector<AutoStartupInfo> &infoList, 345 int32_t userId) 346 { 347 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); 348 { 349 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 350 if (!CheckKvStore()) { 351 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null kvStore"); 352 return ERR_NO_INIT; 353 } 354 } 355 356 std::vector<DistributedKv::Entry> allEntries; 357 DistributedKv::Status status = DistributedKv::Status::SUCCESS; 358 { 359 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 360 status = kvStorePtr_->GetEntries(nullptr, allEntries); 361 } 362 if (status != DistributedKv::Status::SUCCESS) { 363 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Get entries error: %{public}d", status); 364 { 365 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 366 status = RestoreKvStore(status); 367 } 368 return ERR_INVALID_OPERATION; 369 } 370 371 for (const auto &item : allEntries) { 372 if (!IsEqual(item.key, userId)) { 373 continue; 374 } 375 bool isAutoStartup, isEdmForce; 376 ConvertAutoStartupStatusFromValue(item.value, isAutoStartup, isEdmForce); 377 if (isAutoStartup) { 378 infoList.emplace_back(ConvertAutoStartupInfoFromKeyAndValue(item.key, item.value)); 379 } 380 } 381 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "InfoList.size: %{public}zu", infoList.size()); 382 return ERR_OK; 383 } 384 GetCurrentAppAutoStartupData(const std::string & bundleName,std::vector<AutoStartupInfo> & infoList,const std::string & accessTokenId)385 int32_t AbilityAutoStartupDataManager::GetCurrentAppAutoStartupData( 386 const std::string &bundleName, std::vector<AutoStartupInfo> &infoList, const std::string &accessTokenId) 387 { 388 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); 389 { 390 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 391 if (!CheckKvStore()) { 392 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null kvStore"); 393 return ERR_NO_INIT; 394 } 395 } 396 397 std::vector<DistributedKv::Entry> allEntries; 398 DistributedKv::Status status = DistributedKv::Status::SUCCESS; 399 { 400 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 401 status = kvStorePtr_->GetEntries(nullptr, allEntries); 402 } 403 if (status != DistributedKv::Status::SUCCESS) { 404 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Get entries error: %{public}d", status); 405 { 406 std::lock_guard<std::mutex> lock(kvStorePtrMutex_); 407 status = RestoreKvStore(status); 408 } 409 return ERR_INVALID_OPERATION; 410 } 411 412 for (const auto &item : allEntries) { 413 if (IsEqual(item.key, accessTokenId)) { 414 infoList.emplace_back(ConvertAutoStartupInfoFromKeyAndValue(item.key, item.value)); 415 } 416 } 417 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "InfoList.size: %{public}zu", infoList.size()); 418 return ERR_OK; 419 } 420 ConvertAutoStartupStatusToValue(bool isAutoStartup,bool isEdmForce,const std::string & abilityTypeName)421 DistributedKv::Value AbilityAutoStartupDataManager::ConvertAutoStartupStatusToValue( 422 bool isAutoStartup, bool isEdmForce, const std::string &abilityTypeName) 423 { 424 nlohmann::json jsonObject = nlohmann::json { 425 { JSON_KEY_IS_AUTO_STARTUP, isAutoStartup }, 426 { JSON_KEY_IS_EDM_FORCE, isEdmForce }, 427 { JSON_KEY_TYPE_NAME, abilityTypeName }, 428 }; 429 DistributedKv::Value value(jsonObject.dump()); 430 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "value: %{public}s", value.ToString().c_str()); 431 return value; 432 } 433 ConvertAutoStartupStatusFromValue(const DistributedKv::Value & value,bool & isAutoStartup,bool & isEdmForce)434 void AbilityAutoStartupDataManager::ConvertAutoStartupStatusFromValue( 435 const DistributedKv::Value &value, bool &isAutoStartup, bool &isEdmForce) 436 { 437 nlohmann::json jsonObject = nlohmann::json::parse(value.ToString(), nullptr, false); 438 if (jsonObject.is_discarded()) { 439 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Parse json string failed"); 440 return; 441 } 442 if (jsonObject.contains(JSON_KEY_IS_AUTO_STARTUP) && jsonObject[JSON_KEY_IS_AUTO_STARTUP].is_boolean()) { 443 isAutoStartup = jsonObject.at(JSON_KEY_IS_AUTO_STARTUP).get<bool>(); 444 } 445 if (jsonObject.contains(JSON_KEY_IS_EDM_FORCE) && jsonObject[JSON_KEY_IS_EDM_FORCE].is_boolean()) { 446 isEdmForce = jsonObject.at(JSON_KEY_IS_EDM_FORCE).get<bool>(); 447 } 448 } 449 ConvertAutoStartupDataToKey(const AutoStartupInfo & info)450 DistributedKv::Key AbilityAutoStartupDataManager::ConvertAutoStartupDataToKey(const AutoStartupInfo &info) 451 { 452 nlohmann::json jsonObject = nlohmann::json { 453 { JSON_KEY_BUNDLE_NAME, info.bundleName }, 454 { JSON_KEY_MODULE_NAME, info.moduleName }, 455 { JSON_KEY_ABILITY_NAME, info.abilityName }, 456 { JSON_KEY_APP_CLONE_INDEX, info.appCloneIndex }, 457 { JSON_KEY_ACCESS_TOKENID, info.accessTokenId }, 458 { JSON_KEY_USERID, info.userId }, 459 }; 460 DistributedKv::Key key(jsonObject.dump()); 461 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "key: %{public}s", key.ToString().c_str()); 462 return key; 463 } 464 ConvertAutoStartupInfoFromKeyAndValue(const DistributedKv::Key & key,const DistributedKv::Value & value)465 AutoStartupInfo AbilityAutoStartupDataManager::ConvertAutoStartupInfoFromKeyAndValue( 466 const DistributedKv::Key &key, const DistributedKv::Value &value) 467 { 468 AutoStartupInfo info; 469 nlohmann::json jsonObject = nlohmann::json::parse(key.ToString(), nullptr, false); 470 if (jsonObject.is_discarded()) { 471 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Parse jsonObject failed"); 472 return info; 473 } 474 475 if (jsonObject.contains(JSON_KEY_BUNDLE_NAME) && jsonObject[JSON_KEY_BUNDLE_NAME].is_string()) { 476 info.bundleName = jsonObject.at(JSON_KEY_BUNDLE_NAME).get<std::string>(); 477 } 478 479 if (jsonObject.contains(JSON_KEY_MODULE_NAME) && jsonObject[JSON_KEY_MODULE_NAME].is_string()) { 480 info.moduleName = jsonObject.at(JSON_KEY_MODULE_NAME).get<std::string>(); 481 } 482 483 if (jsonObject.contains(JSON_KEY_ABILITY_NAME) && jsonObject[JSON_KEY_ABILITY_NAME].is_string()) { 484 info.abilityName = jsonObject.at(JSON_KEY_ABILITY_NAME).get<std::string>(); 485 } 486 487 if (jsonObject.contains(JSON_KEY_APP_CLONE_INDEX) && jsonObject[JSON_KEY_APP_CLONE_INDEX].is_number()) { 488 info.appCloneIndex = jsonObject.at(JSON_KEY_APP_CLONE_INDEX).get<int32_t>(); 489 } 490 491 if (jsonObject.contains(JSON_KEY_ACCESS_TOKENID) && jsonObject[JSON_KEY_ACCESS_TOKENID].is_string()) { 492 info.accessTokenId = jsonObject.at(JSON_KEY_ACCESS_TOKENID).get<std::string>(); 493 } 494 495 if (jsonObject.contains(JSON_KEY_USERID) && jsonObject[JSON_KEY_USERID].is_number()) { 496 info.userId = jsonObject.at(JSON_KEY_USERID).get<int32_t>(); 497 } 498 499 nlohmann::json jsonValueObject = nlohmann::json::parse(value.ToString(), nullptr, false); 500 if (jsonValueObject.is_discarded()) { 501 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Parse jsonValueObject failed"); 502 return info; 503 } 504 505 if (jsonValueObject.contains(JSON_KEY_TYPE_NAME) && jsonValueObject[JSON_KEY_TYPE_NAME].is_string()) { 506 info.abilityTypeName = jsonValueObject.at(JSON_KEY_TYPE_NAME).get<std::string>(); 507 } 508 return info; 509 } 510 IsEqual(nlohmann::json & jsonObject,const std::string & key,const std::string & value,bool checkEmpty)511 bool AbilityAutoStartupDataManager::IsEqual( 512 nlohmann::json &jsonObject, const std::string &key, const std::string &value, bool checkEmpty) 513 { 514 if (jsonObject.contains(key) && jsonObject[key].is_string()) { 515 std::string jsonValue = jsonObject.at(key).get<std::string>(); 516 if (checkEmpty && !jsonValue.empty() && jsonValue != value) { 517 return false; 518 } else if (value != jsonValue) { 519 return false; 520 } 521 } 522 return true; 523 } 524 IsEqual(nlohmann::json & jsonObject,const std::string & key,int32_t value)525 bool AbilityAutoStartupDataManager::IsEqual(nlohmann::json &jsonObject, const std::string &key, int32_t value) 526 { 527 if (jsonObject.contains(key) && jsonObject[key].is_number()) { 528 if (value != jsonObject.at(key).get<int32_t>()) { 529 return false; 530 } 531 } 532 return true; 533 } 534 IsEqual(const DistributedKv::Key & key,const AutoStartupInfo & info)535 bool AbilityAutoStartupDataManager::IsEqual(const DistributedKv::Key &key, const AutoStartupInfo &info) 536 { 537 nlohmann::json jsonObject = nlohmann::json::parse(key.ToString(), nullptr, false); 538 if (jsonObject.is_discarded()) { 539 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Parse json string failed"); 540 return false; 541 } 542 543 if (!IsEqual(jsonObject, JSON_KEY_BUNDLE_NAME, info.bundleName) 544 || !IsEqual(jsonObject, JSON_KEY_ABILITY_NAME, info.abilityName) 545 || !IsEqual(jsonObject, JSON_KEY_MODULE_NAME, info.moduleName, true) 546 || !IsEqual(jsonObject, JSON_KEY_APP_CLONE_INDEX, info.appCloneIndex) 547 || !IsEqual(jsonObject, JSON_KEY_ACCESS_TOKENID, info.accessTokenId) 548 || !IsEqual(jsonObject, JSON_KEY_USERID, info.userId)) { 549 return false; 550 } 551 return true; 552 } 553 IsEqual(const DistributedKv::Key & key,const std::string & accessTokenId)554 bool AbilityAutoStartupDataManager::IsEqual(const DistributedKv::Key &key, const std::string &accessTokenId) 555 { 556 nlohmann::json jsonObject = nlohmann::json::parse(key.ToString(), nullptr, false); 557 if (jsonObject.is_discarded()) { 558 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Parse json string failed"); 559 return false; 560 } 561 562 if (jsonObject.contains(JSON_KEY_ACCESS_TOKENID) && jsonObject[JSON_KEY_ACCESS_TOKENID].is_string()) { 563 if (accessTokenId == jsonObject.at(JSON_KEY_ACCESS_TOKENID).get<std::string>()) { 564 return true; 565 } 566 } 567 return false; 568 } 569 IsEqual(const DistributedKv::Key & key,int32_t userId)570 bool AbilityAutoStartupDataManager::IsEqual(const DistributedKv::Key &key, int32_t userId) 571 { 572 nlohmann::json jsonObject = nlohmann::json::parse(key.ToString(), nullptr, false); 573 if (jsonObject.is_discarded()) { 574 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Parse json string failed"); 575 return false; 576 } 577 578 if (jsonObject.contains(JSON_KEY_USERID) && jsonObject[JSON_KEY_USERID].is_number()) { 579 if (userId == jsonObject.at(JSON_KEY_USERID).get<int32_t>()) { 580 return true; 581 } 582 } 583 return false; 584 } 585 } // namespace AbilityRuntime 586 } // namespace OHOS 587