1 /* 2 * Copyright (c) 2023 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 DATASHARESERVICE_DATA_SERVICE_IMPL_H 17 #define DATASHARESERVICE_DATA_SERVICE_IMPL_H 18 19 #include <cstdint> 20 #include <functional> 21 #include <string> 22 23 #include "accesstoken_kit.h" 24 #include "bundle_mgr_proxy.h" 25 #include "common_event_subscribe_info.h" 26 #include "common_event_subscriber.h" 27 #include "changeevent/remote_change_event.h" 28 #include "data_proxy_observer.h" 29 #include "data_provider_config.h" 30 #include "data_share_db_config.h" 31 #include "data_share_service_stub.h" 32 #include "data_share_silent_config.h" 33 #include "datashare_template.h" 34 #include "db_delegate.h" 35 #include "eventcenter/event.h" 36 #include "feature/static_acts.h" 37 #include "get_data_strategy.h" 38 #include "publish_strategy.h" 39 #include "rdb_notify_strategy.h" 40 #include "subscribe_strategy.h" 41 #include "template_strategy.h" 42 #include "uri_utils.h" 43 #include "visibility.h" 44 45 namespace OHOS::DataShare { 46 class DataShareServiceImpl : public DataShareServiceStub { 47 public: 48 using Handler = std::function<void(int, std::map<std::string, std::vector<std::string>> &)>; 49 using ExecuteCallbackEx = std::function<std::pair<int32_t, int32_t>(DataProviderConfig::ProviderInfo &, 50 DistributedData::StoreMetaData &, std::shared_ptr<DBDelegate>)>; 51 DataShareServiceImpl() = default; 52 virtual ~DataShareServiceImpl(); 53 std::shared_ptr<DataShareResultSet> Query(const std::string &uri, const std::string &extUri, 54 const DataSharePredicates &predicates, const std::vector<std::string> &columns, int &errCode) override; 55 int32_t AddTemplate(const std::string &uri, const int64_t subscriberId, const Template &tplt) override; 56 int32_t DelTemplate(const std::string &uri, const int64_t subscriberId) override; 57 std::vector<OperationResult> Publish(const Data &data, const std::string &bundleNameOfProvider) override; 58 Data GetData(const std::string &bundleNameOfProvider, int &errorCode) override; 59 std::vector<OperationResult> SubscribeRdbData(const std::vector<std::string> &uris, 60 const TemplateId &id, const sptr<IDataProxyRdbObserver> observer) override; 61 std::vector<OperationResult> UnsubscribeRdbData( 62 const std::vector<std::string> &uris, const TemplateId &id) override; 63 std::vector<OperationResult> EnableRdbSubs( 64 const std::vector<std::string> &uris, const TemplateId &id) override; 65 std::vector<OperationResult> DisableRdbSubs( 66 const std::vector<std::string> &uris, const TemplateId &id) override; 67 std::vector<OperationResult> SubscribePublishedData(const std::vector<std::string> &uris, 68 const int64_t subscriberId, const sptr<IDataProxyPublishedDataObserver> observer) override; 69 std::vector<OperationResult> UnsubscribePublishedData(const std::vector<std::string> &uris, 70 const int64_t subscriberId) override; 71 std::vector<OperationResult> EnablePubSubs(const std::vector<std::string> &uris, 72 const int64_t subscriberId) override; 73 std::vector<OperationResult> DisablePubSubs(const std::vector<std::string> &uris, 74 const int64_t subscriberId) override; 75 void OnConnectDone() override; 76 int32_t OnBind(const BindInfo &binderInfo) override; 77 int32_t OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &bundleName) override; 78 int32_t OnAppUninstall(const std::string &bundleName, int32_t user, int32_t index) override; 79 int32_t OnAppUpdate(const std::string &bundleName, int32_t user, int32_t index) override; 80 int32_t OnUserChange(uint32_t code, const std::string &user, const std::string &account) override; 81 void NotifyObserver(const std::string &uri) override; 82 void DumpDataShareServiceInfo(int fd, std::map<std::string, std::vector<std::string>> ¶ms); 83 int32_t OnInitialize() override; 84 int32_t EnableSilentProxy(const std::string &uri, bool enable) override; 85 int32_t GetSilentProxyStatus(const std::string &uri, bool isCreateHelper) override; 86 int32_t RegisterObserver(const std::string &uri, const sptr<OHOS::IRemoteObject> &remoteObj) override; 87 int32_t UnregisterObserver(const std::string &uri, const sptr<OHOS::IRemoteObject> &remoteObj) override; 88 std::pair<int32_t, int32_t> InsertEx(const std::string &uri, const std::string &extUri, 89 const DataShareValuesBucket &valuesBucket) override; 90 std::pair<int32_t, int32_t> UpdateEx(const std::string &uri, const std::string &extUri, 91 const DataSharePredicates &predicate, const DataShareValuesBucket &valuesBucket) override; 92 std::pair<int32_t, int32_t> DeleteEx(const std::string &uri, const std::string &extUri, 93 const DataSharePredicates &predicate) override; 94 private: 95 class SystemAbilityStatusChangeListener; 96 using StaticActs = DistributedData::StaticActs; 97 class DataShareStatic : public StaticActs { 98 public: ~DataShareStatic()99 ~DataShareStatic() override {}; 100 int32_t OnAppUninstall(const std::string &bundleName, int32_t user, int32_t index) override; 101 int32_t OnAppUpdate(const std::string &bundleName, int32_t user, int32_t index) override; 102 int32_t OnClearAppStorage(const std::string &bundleName, int32_t user, int32_t index, int32_t tokenId) override; 103 }; 104 class Factory { 105 public: 106 Factory(); 107 ~Factory(); 108 private: 109 std::shared_ptr<DataShareStatic> staticActs_; 110 }; 111 class TimerReceiver : public EventFwk::CommonEventSubscriber { 112 public: 113 TimerReceiver() = default; 114 explicit TimerReceiver(const EventFwk::CommonEventSubscribeInfo &subscriberInfo); 115 virtual ~TimerReceiver() = default; 116 void OnReceiveEvent(const EventFwk::CommonEventData &eventData) override; 117 }; 118 void RegisterDataShareServiceInfo(); 119 void RegisterHandler(); 120 bool SubscribeTimeChanged(); 121 bool NotifyChange(const std::string &uri); 122 bool GetCallerBundleName(std::string &bundleName); 123 std::pair<int32_t, int32_t> ExecuteEx(const std::string &uri, const std::string &extUri, const int32_t tokenId, 124 bool isRead, ExecuteCallbackEx callback); 125 std::pair<bool, Security::AccessToken::ATokenTypeEnum> GetCallerInfo(std::string &bundleName, int32_t &appIndex); 126 int32_t GetBMSAndMetaDataStatus(const std::string &uri, const int32_t tokenId); 127 void SubscribeCommonEvent(); 128 void SubscribeConcurrentTask(); 129 static void InitSubEvent(); 130 void AutoLaunch(const DistributedData::Event &event); 131 void SubscribeChange(); 132 bool AllowCleanDataLaunchApp(const DistributedData::Event &event, bool launchForCleanData); 133 static void SaveLaunchInfo(const std::string &bundleName, const std::string &userId, 134 const std::string &deviceId); 135 static DistributedData::StoreMetaData MakeMetaData(const std::string &bundleName, const std::string &userId, 136 const std::string &deviceId, const std::string storeId = ""); 137 bool VerifyAcrossAccountsPermission(int32_t currentUserId, int32_t visitedUserId, 138 const std::string &acrossAccountsPermission, uint32_t callerTokenId); 139 void ReportExcuteFault(uint32_t callingTokenId, DataProviderConfig::ProviderInfo &providerInfo, 140 int32_t errCode, std::string &func); 141 bool CheckAllowList(const uint32_t ¤tUserId, const uint32_t &callerTokenId, 142 const std::vector<AllowList> &allowLists); 143 bool VerifyPermission(const std::string &bundleName, const std::string &permission, 144 bool isFromExtension, const int32_t tokenId); 145 static Factory factory_; 146 static constexpr int32_t ERROR = -1; 147 static constexpr int32_t ERROR_PERMISSION_DENIED = -2; 148 static constexpr const char *PROXY_URI_SCHEMA = "datashareproxy"; 149 static constexpr const char *EXT_URI_SCHEMA = "datashare://"; 150 static constexpr const char *NO_PERMISSION = "noPermission"; 151 static constexpr const char *CONNECT_SUPPORT_CROSS_USER = "const.abilityms.connect_support_cross_user"; 152 PublishStrategy publishStrategy_; 153 GetDataStrategy getDataStrategy_; 154 SubscribeStrategy subscribeStrategy_; 155 TemplateStrategy templateStrategy_; 156 RdbNotifyStrategy rdbNotifyStrategy_; 157 BindInfo binderInfo_; 158 std::shared_ptr<TimerReceiver> timerReceiver_ = nullptr; 159 DataShareSilentConfig dataShareSilentConfig_; 160 }; 161 } // namespace OHOS::DataShare 162 #endif // DATASHARESERVICE_DATA_SERVICE_IMPL_H 163