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 OHOS_DISTRIBUTED_SCHED_SERVICE_H
17 #define OHOS_DISTRIBUTED_SCHED_SERVICE_H
18 
19 #include <memory>
20 #include <mutex>
21 #include <set>
22 #include <unordered_map>
23 
24 #include "app_mgr_interface.h"
25 #include "app_state_observer.h"
26 #include "datashare_manager.h"
27 #include "distributed_sched_stub.h"
28 #include "distributed_sched_continuation.h"
29 #include "dms_callback_task.h"
30 #include "dsched_collaborate_callback_mgr.h"
31 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE
32 #include "form_mgr_interface.h"
33 #endif
34 #include "iremote_object.h"
35 #include "iremote_proxy.h"
36 #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER
37 #include "mission/distributed_mission_focused_listener.h"
38 #include "mission/distributed_mission_info.h"
39 #include "nocopyable.h"
40 #endif
41 #include "dsched_continue.h"
42 #include "dsched_continue_event.h"
43 #include "single_instance.h"
44 #include "system_ability.h"
45 
46 namespace OHOS {
47 namespace DistributedSchedule {
48 class ConnectAbilitySession;
49 
50 enum class ServiceRunningState {
51     STATE_NO_START,
52     STATE_RUNNING
53 };
54 
55 enum class TargetComponent {
56     HARMONY_COMPONENT,
57 };
58 
59 struct ConnectInfo {
60     CallerInfo callerInfo;
61     sptr<IRemoteObject> callbackWrapper;
62     AppExecFwk::ElementName element;
63 };
64 
65 struct ProcessDiedNotifyInfo {
66     std::string remoteDeviceId;
67     CallerInfo callerInfo;
68     TargetComponent targetComponent;
69 };
70 
71 struct CallInfo {
72     int32_t connectToken;
73     std::string remoteDeviceId;
74 };
75 
76 struct ObserverInfo {
77     sptr<AppStateObserver> appStateObserver;
78     std::string srcDeviceId;
79     int32_t connectToken;
80     std::string dstBundleName;
81     std::string dstAbilityName;
82     sptr<IRemoteObject> srcConnect;
83     sptr<IRemoteObject> token;
84 };
85 
86 class DistributedSchedService : public SystemAbility, public DistributedSchedStub {
87     DECLARE_SYSTEM_ABILITY(DistributedSchedService);
88     DECLARE_SINGLE_INSTANCE_BASE(DistributedSchedService);
89 
90 public:
91     ~DistributedSchedService() = default;
92     void OnStart(const SystemAbilityOnDemandReason &startReason) override;
93     void OnStop(const SystemAbilityOnDemandReason &stopReason) override;
94     void OnActive(const SystemAbilityOnDemandReason &activeReason) override;
95 
96     /**
97      * @brief If SA is pulled by root and not networked with other devices, uninstall SA after creating the database
98      *
99      * @param startReason, The reason why SA was pulled up.
100      */
101     void HandleBootStart(const SystemAbilityOnDemandReason &startReason);
102     bool DoStart();
103     int32_t Dump(int32_t fd, const std::vector<std::u16string>& args) override;
104     void DeviceOnlineNotify(const std::string& deviceId);
105     void DeviceOfflineNotify(const std::string& deviceId);
106     void DurationStart(const std::string srcDeviceId, const std::string dstDeviceId);
107 
108     int32_t StartRemoteAbility(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t requestCode,
109         uint32_t accessToken) override;
110     int32_t StartAbilityFromRemote(const OHOS::AAFwk::Want& want,
111         const OHOS::AppExecFwk::AbilityInfo& abilityInfo, int32_t requestCode, const CallerInfo& callerInfo,
112         const AccountInfo& accountInfo) override;
113     int32_t SendResultFromRemote(OHOS::AAFwk::Want& want, int32_t requestCode,
114         const CallerInfo& callerInfo, const AccountInfo& accountInfo, int32_t resultCode) override;
115     int32_t ContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId,
116         int32_t missionId, const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams) override;
117     int32_t ProcessContinueLocalMission(const std::string& srcDeviceId, const std::string& dstDeviceId,
118         const std::string& bundleName, const sptr<IRemoteObject>& callback,
119         const OHOS::AAFwk::WantParams& wantParams);
120     int32_t ProcessContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId,
121         const std::string& bundleName, const sptr<IRemoteObject>& callback,
122         const OHOS::AAFwk::WantParams& wantParams);
123     int32_t ContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId,
124         const std::string& bundleName, const sptr<IRemoteObject>& callback,
125         const OHOS::AAFwk::WantParams& wantParams) override;
126     int32_t DealDSchedEventResult(const OHOS::AAFwk::Want& want, int32_t status);
127     bool GetIsFreeInstall(int32_t missionId);
128     int32_t StartContinuation(const OHOS::AAFwk::Want& want, int32_t missionId, int32_t callerUid,
129         int32_t status, uint32_t accessToken) override;
130     void NotifyCompleteContinuation(const std::u16string& devId, int32_t sessionId, bool isSuccess) override;
131     int32_t NotifyContinuationResultFromRemote(int32_t sessionId, bool isSuccess, const std::string dstInfo) override;
132     int32_t NotifyDSchedEventResultFromRemote(const std::string type, int32_t dSchedEventResult) override;
133     void NotifyContinuationCallbackResult(int32_t missionId, int32_t resultCode);
134     void NotifyDSchedEventCallbackResult(int32_t resultCode);
135     void NotifyDSchedEventCallbackResult(int32_t resultCode, const EventNotify& event);
136     int32_t NotifyFreeInstallResult(const CallbackTaskItem item, int32_t resultCode);
137     int32_t ConnectRemoteAbility(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect,
138         int32_t callerUid, int32_t callerPid, uint32_t accessToken) override;
139     int32_t DisconnectRemoteAbility(const sptr<IRemoteObject>& connect, int32_t callerUid,
140         uint32_t accessToken) override;
141     int32_t ConnectAbilityFromRemote(const OHOS::AAFwk::Want& want, const AppExecFwk::AbilityInfo& abilityInfo,
142         const sptr<IRemoteObject>& connect, const CallerInfo& callerInfo, const AccountInfo& accountInfo) override;
143     int32_t DisconnectAbilityFromRemote(const sptr<IRemoteObject>& connect,
144         int32_t uid, const std::string& sourceDeviceId) override;
145     int32_t NotifyProcessDiedFromRemote(const CallerInfo& callerInfo) override;
146 #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER
147     int32_t GetMissionInfos(const std::string& deviceId, int32_t numMissions,
148         std::vector<AAFwk::MissionInfo>& missionInfos) override;
149     int32_t NotifyMissionsChangedFromRemote(const std::vector<DstbMissionInfo>& missionInfos,
150         const CallerInfo& callerInfo) override;
151     int32_t GetRemoteMissionSnapshotInfo(const std::string& networkId, int32_t missionId,
152         std::unique_ptr<AAFwk::MissionSnapshot>& missionSnapshot) override;
153     int32_t StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag) override;
154     int32_t StartSyncMissionsFromRemote(const CallerInfo& callerInfo,
155         std::vector<DstbMissionInfo>& missionInfos) override;
156     int32_t StopSyncRemoteMissions(const std::string& devId) override;
157     int32_t StopSyncMissionsFromRemote(const CallerInfo& callerInfo) override;
158     int32_t RegisterMissionListener(const std::u16string& devId, const sptr<IRemoteObject>& obj) override;
159     int32_t RegisterOnListener(const std::string& type, const sptr<IRemoteObject>& obj) override;
160     int32_t RegisterOffListener(const std::string& type, const sptr<IRemoteObject>& obj) override;
161     int32_t UnRegisterMissionListener(const std::u16string& devId, const sptr<IRemoteObject>& obj) override;
162     int32_t SetMissionContinueState(int32_t missionId, const AAFwk::ContinueState &state) override;
163     void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override;
164 #endif
165     int32_t RegisterDSchedEventListener(const DSchedEventType& type, const sptr<IRemoteObject>& obj) override;
166     int32_t UnRegisterDSchedEventListener(const DSchedEventType& type, const sptr<IRemoteObject>& obj) override;
167     int32_t GetContinueInfo(std::string& dstNetworkId, std::string& srcNetworkId) override;
168     int32_t GetDSchedEventInfo(const DSchedEventType &type, std::vector<EventNotify> &events) override;
169     void ProcessConnectDied(const sptr<IRemoteObject>& connect);
170     void ProcessDeviceOffline(const std::string& deviceId);
171     void DumpConnectInfo(std::string& info);
172     void DumpSessionsLocked(const std::list<ConnectAbilitySession>& sessionsList, std::string& info);
173     void DumpElementLocked(const std::list<AppExecFwk::ElementName>& elementsList, std::string& info);
174     int32_t StartRemoteAbilityByCall(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect,
175         int32_t callerUid, int32_t callerPid, uint32_t accessToken) override;
176     int32_t ReleaseRemoteAbility(const sptr<IRemoteObject>& connect,
177         const AppExecFwk::ElementName &element) override;
178     int32_t StartAbilityByCallFromRemote(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect,
179         const CallerInfo& callerInfo, const AccountInfo& accountInfo) override;
180     int32_t ReleaseAbilityFromRemote(const sptr<IRemoteObject>& connect, const AppExecFwk::ElementName &element,
181         const CallerInfo& callerInfo) override;
182 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE
183     int32_t StartRemoteShareForm(const std::string& remoteDeviceId,
184         const AppExecFwk::FormShareInfo& formShareInfo) override;
185     int32_t StartShareFormFromRemote(
186         const std::string& remoteDeviceId, const AppExecFwk::FormShareInfo& formShareInfo) override;
187     void ProcessFormMgrDied(const wptr<IRemoteObject>& remote);
188 #endif
189     void ProcessCallerDied(const sptr<IRemoteObject>& connect, int32_t deviceType);
190     void ProcessCalleeDied(const sptr<IRemoteObject>& connect);
191     void ProcessCallResult(const sptr<IRemoteObject>& calleeConnect, const sptr<IRemoteObject>& callerConnect);
192     int32_t StartRemoteFreeInstall(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t requestCode,
193         uint32_t accessToken, const sptr<IRemoteObject>& callback) override;
194     int32_t StartFreeInstallFromRemote(const FreeInstallInfo& info, int64_t taskId) override;
195     int32_t NotifyCompleteFreeInstallFromRemote(int64_t taskId, int32_t resultCode) override;
196     int32_t NotifyCompleteFreeInstall(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode);
197     int32_t GetDistributedComponentList(std::vector<std::string>& distributedComponents) override;
198     void SetContinuationTimeout(int32_t missionId, int32_t timeout);
199     void RemoveContinuationTimeout(int32_t missionId);
200     std::string GetContinuaitonDevice(int32_t missionId);
201     int32_t NotifyStateChangedFromRemote(int32_t abilityState, int32_t connectToken,
202         const AppExecFwk::ElementName& element) override;
203     int32_t NotifyStateChanged(int32_t abilityState, AppExecFwk::ElementName& element,
204         const sptr<IRemoteObject>& token);
205     int32_t StopRemoteExtensionAbility(const OHOS::AAFwk::Want& want, int32_t callerUid,
206         uint32_t accessToken, int32_t extensionType) override;
207     int32_t StopExtensionAbilityFromRemote(const OHOS::AAFwk::Want& remoteWant, const CallerInfo& callerInfo,
208         const AccountInfo& accountInfo, int32_t extensionType) override;
209     int32_t CheckTargetPermission(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo,
210         const AccountInfo& accountInfo, int32_t flag, bool needQueryExtension);
211     int32_t CheckTargetPermission4DiffBundle(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo,
212         const AccountInfo& accountInfo, int32_t flag, bool needQueryExtension);
213     ErrCode QueryOsAccount(int32_t& activeAccountId);
214 
215 private:
216     DistributedSchedService();
217     bool Init();
218     void InitDataShareManager();
219     void InitMissionManager();
220     void InitCommonEventListener();
221     int32_t GetCallerInfo(const std::string &localDeviceId, int32_t callerUid, uint32_t accessToken,
222         CallerInfo &callerInfo);
223     void RemoteConnectAbilityMappingLocked(const sptr<IRemoteObject>& connect, const std::string& localDeviceId,
224         const std::string& remoteDeviceId, const AppExecFwk::ElementName& element, const CallerInfo& callerInfo,
225         TargetComponent targetComponent);
226     int32_t DisconnectEachRemoteAbilityLocked(const std::string& localDeviceId,
227         const std::string& remoteDeviceId, const sptr<IRemoteObject>& connect);
228     sptr<IDistributedSched> GetRemoteDms(const std::string& remoteDeviceId);
229     static bool GetLocalDeviceId(std::string& localDeviceId);
230     bool CheckDeviceId(const std::string& localDeviceId, const std::string& remoteDeviceId);
231     bool CheckDeviceIdFromRemote(const std::string& localDeviceId,
232         const std::string& destinationDeviceId, const std::string& sourceDeviceId);
233     void NotifyDeviceOfflineToAppLocked(const sptr<IRemoteObject>& connect, const ConnectAbilitySession& session);
234     int32_t NotifyApp(const sptr<IRemoteObject>& connect, const AppExecFwk::ElementName& element, int32_t errCode);
235     void NotifyProcessDiedAll(const std::list<ProcessDiedNotifyInfo>& notifyList);
236     void NotifyProcessDied(const std::string& remoteDeviceId, const CallerInfo& callerInfo,
237         TargetComponent targetComponent);
238     int32_t CheckDistributedConnectLocked(const CallerInfo& callerInfo) const;
239     void DecreaseConnectLocked(int32_t uid);
240     static int32_t GetUidLocked(const std::list<ConnectAbilitySession>& sessionList);
241     int32_t TryConnectRemoteAbility(const OHOS::AAFwk::Want& want,
242         const sptr<IRemoteObject>& connect, const CallerInfo& callerInfo);
243     int32_t ContinueLocalMissionDealFreeInstall(OHOS::AAFwk::Want& want, int32_t missionId,
244         const std::string& dstDeviceId, const sptr<IRemoteObject>& callback);
245 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE
246     sptr<AppExecFwk::IFormMgr> GetFormMgrProxy();
247 #endif
248     int32_t SetCallerInfo(int32_t callerUid, std::string localDeviceId, uint32_t accessToken, CallerInfo& callerInfo);
249     int32_t SetWantForContinuation(AAFwk::Want& newWant, int32_t missionId);
250     int32_t ContinueLocalMission(const std::string& dstDeviceId, int32_t missionId,
251         const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams);
252     int32_t ContinueAbilityWithTimeout(const std::string& dstDeviceId, int32_t missionId,
253         const sptr<IRemoteObject>& callback, uint32_t remoteBundleVersion = 0);
254     int32_t ContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId, int32_t missionId,
255         const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams);
256     int32_t ContinueRemoteMission(const std::string& srcDeviceId, const std::string& dstDeviceId,
257         const std::string& bundleName, const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams);
258     int32_t TryStartRemoteAbilityByCall(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect,
259         const CallerInfo& callerInfo);
260     int32_t StartLocalAbility(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode);
261     int32_t StartAbility(const OHOS::AAFwk::Want& want, int32_t requestCode);
262     int32_t HandleRemoteNotify(const FreeInstallInfo& info, int64_t taskId, int32_t resultCode);
263     void ReportDistributedComponentChange(const CallerInfo& callerInfo, int32_t changeType,
264         int32_t componentType, int32_t deviceType);
265     void ReportDistributedComponentChange(const ConnectInfo& connectInfo, int32_t changeType,
266         int32_t componentType, int32_t deviceType);
267     void HandleLocalCallerDied(const sptr<IRemoteObject>& connect);
268     void SaveCallerComponent(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect,
269         const CallerInfo& callerInfo);
270     void RemoveCallerComponent(const sptr<IRemoteObject>& connect);
271     void ProcessCalleeOffline(const std::string& deviceId);
272     void GetConnectComponentList(std::vector<std::string>& distributedComponents);
273     void GetCallComponentList(std::vector<std::string>& distributedComponents);
274     void ProcessFreeInstallOffline(const std::string& deviceId);
275     bool RegisterAppStateObserver(const OHOS::AAFwk::Want& want, const CallerInfo& callerInfo,
276         const sptr<IRemoteObject>& srcConnect, const sptr<IRemoteObject>& callbackWrapper);
277     void UnregisterAppStateObserver(const sptr<IRemoteObject>& callbackWrapper);
278     sptr<AppExecFwk::IAppMgr> GetAppManager();
279     int32_t SaveConnectToken(const OHOS::AAFwk::Want& want, const sptr<IRemoteObject>& connect);
280     void SetCleanMissionFlag(const OHOS::AAFwk::Want& want, int32_t missionId);
281     void RemoveConnectAbilityInfo(const std::string& deviceId);
282     void InitWifiStateListener();
283     void InitWifiSemiStateListener();
284     void NotifyContinuateEventResult(int32_t resultCode, const EventNotify& event);
285     void InitDeviceCfg();
286     void NotifyCollaborateEventResult(int32_t resultCode, const EventNotify& event);
287     void GetContinueEventInfo(int32_t callingUid, std::vector<EventNotify> &events);
288     void GetCollaborateEventInfo(int32_t callingUid, std::vector<EventNotify> &events);
289     void GetCollaborateEventsByCallers(int32_t callingUid, const std::string &callingBundleName,
290         std::vector<EventNotify> &events);
291     void GetCollaborateEventsByCallees(int32_t callingUid, const std::string &callingBundleName,
292         std::vector<EventNotify> &events);
293     void GetCurSrcCollaborateEvent(const CallerInfo &callerInfo, const AppExecFwk::ElementName &element,
294         DSchedEventState state, int32_t ret, EventNotify &event);
295     void GetCurDestCollaborateEvent(const CallerInfo &callerInfo, const AppExecFwk::ElementName &element,
296         DSchedEventState state, int32_t ret, EventNotify &event);
297     void NotifyCollaborateEventWithSessions(const std::list<ConnectAbilitySession> &sessionsList,
298         DSchedEventState state, int32_t ret);
299     bool CheckCallingUid();
300 
301 private:
302     std::shared_ptr<DSchedContinuation> dschedContinuation_;
303     std::shared_ptr<DSchedCollaborationCallbackMgr> collaborateCbMgr_;
304     std::map<sptr<IRemoteObject>, std::list<ConnectAbilitySession>> distributedConnectAbilityMap_;
305     std::map<sptr<IRemoteObject>, ConnectInfo> connectAbilityMap_;
306     std::unordered_map<int32_t, uint32_t> trackingUidMap_;
307     std::mutex distributedLock_;
308     std::mutex connectLock_;
309     sptr<IRemoteObject::DeathRecipient> connectDeathRecipient_;
310 #ifdef SUPPORT_DISTRIBUTED_FORM_SHARE
311     sptr<IRemoteObject::DeathRecipient> formMgrDeathRecipient_;
312     sptr<AppExecFwk::IFormMgr> formMgrProxy_;
313     std::mutex formMgrLock_;
314 #endif
315     std::mutex calleeLock_;
316     std::map<sptr<IRemoteObject>, ConnectInfo> calleeMap_;
317     sptr<IRemoteObject::DeathRecipient> callerDeathRecipient_;
318     std::shared_ptr<DmsCallbackTask> dmsCallbackTask_;
319     std::shared_ptr<AppExecFwk::EventHandler> componentChangeHandler_;
320     std::mutex callerLock_;
321     std::map<sptr<IRemoteObject>, std::list<ConnectAbilitySession>> callerMap_;
322     sptr<IRemoteObject::DeathRecipient> callerDeathRecipientForLocalDevice_;
323     std::mutex observerLock_;
324     std::map<sptr<IRemoteObject>, ObserverInfo> observerMap_;
325     std::mutex callLock_;
326     std::map<sptr<IRemoteObject>, CallInfo> callMap_;
327     std::mutex tokenMutex_;
328     std::mutex registerMutex_;
329     std::atomic<int32_t> token_ {0};
330     std::map<std::string, sptr<AppStateObserver>> bundleNameMap_;
331     sptr<DistributedMissionFocusedListener> missionFocusedListener_ = nullptr;
332 };
333 
334 class ConnectAbilitySession {
335 public:
336     ConnectAbilitySession(const std::string& sourceDeviceId, const std::string& destinationDeviceId,
337         const CallerInfo& callerInfo, TargetComponent targetComponent = TargetComponent::HARMONY_COMPONENT);
338     ~ConnectAbilitySession() = default;
339 
GetSourceDeviceId()340     const std::string& GetSourceDeviceId() const
341     {
342         return sourceDeviceId_;
343     }
344 
GetDestinationDeviceId()345     const std::string& GetDestinationDeviceId() const
346     {
347         return destinationDeviceId_;
348     }
349 
GetElementsList()350     std::list<AppExecFwk::ElementName> GetElementsList() const
351     {
352         return elementsList_;
353     }
354 
GetCallerInfo()355     CallerInfo GetCallerInfo() const
356     {
357         return callerInfo_;
358     }
359 
GetTargetComponent()360     TargetComponent GetTargetComponent() const
361     {
362         return targetComponent_;
363     }
364 
365     bool IsSameCaller(const CallerInfo& callerInfo);
366     void AddElement(const AppExecFwk::ElementName& element);
367 
368 private:
369     std::string sourceDeviceId_;
370     std::string destinationDeviceId_;
371     std::list<AppExecFwk::ElementName> elementsList_;
372     CallerInfo callerInfo_;
373     TargetComponent targetComponent_;
374 };
375 
376 class CallerDeathRecipient : public IRemoteObject::DeathRecipient {
377 public:
378     CallerDeathRecipient() = default;
CallerDeathRecipient(int32_t deviceType)379     explicit CallerDeathRecipient(int32_t deviceType)
380     {
381         deviceType_ = deviceType;
382     }
383     ~CallerDeathRecipient() override = default;
384     void OnRemoteDied(const wptr<IRemoteObject>& remote) override;
385 private:
386     int32_t deviceType_ = IDistributedSched::CALLEE;
387 };
388 } // namespace DistributedSchedule
389 } // namespace OHOS
390 #endif // OHOS_DISTRIBUTED_SCHED_SERVICE_H
391