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 #include "form_mgr_service.h"
17 
18 #include <chrono>
19 #include <ctime>
20 #include <iomanip>
21 #include <sstream>
22 
23 #include "accesstoken_kit.h"
24 #include "bundle_common_event.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "fms_log_wrapper.h"
28 #include "form_ams_helper.h"
29 #include "form_bms_helper.h"
30 #include "form_bundle_forbid_mgr.h"
31 #include "form_cache_mgr.h"
32 #include "form_constants.h"
33 #include "form_data_mgr.h"
34 #include "form_data_proxy_mgr.h"
35 #include "form_db_cache.h"
36 #include "form_event_handler.h"
37 #include "form_event_report.h"
38 #include "form_info_mgr.h"
39 #include "form_mgr_adapter.h"
40 #include "form_mgr_errors.h"
41 #include "form_serial_queue.h"
42 #include "form_share_mgr.h"
43 #include "form_task_mgr.h"
44 #include "form_timer_mgr.h"
45 #include "form_trust_mgr.h"
46 #include "form_util.h"
47 #include "form_xml_parser.h"
48 #include "in_process_call_wrapper.h"
49 #include "ipc_skeleton.h"
50 #include "iservice_registry.h"
51 #include "mem_status_listener.h"
52 #include "os_account_manager.h"
53 #include "permission_constants.h"
54 #include "permission_verification.h"
55 #include "system_ability_definition.h"
56 #include "tokenid_kit.h"
57 #include "hisysevent.h"
58 #include "xcollie/watchdog.h"
59 #include "xcollie/xcollie.h"
60 #include "xcollie/xcollie_define.h"
61 #ifdef MEM_MGR_ENABLE
62 #include "mem_mgr_client.h"
63 #endif
64 #include "form_report.h"
65 
66 #ifdef RES_SCHEDULE_ENABLE
67 #include "form_systemload_listener.h"
68 #include "res_sched_client.h"
69 #include "res_type.h"
70 #endif // RES_SCHEDULE_ENABLE
71 
72 namespace OHOS {
73 namespace AppExecFwk {
74 namespace {
75 const int32_t MAIN_USER_ID = 100;
76 constexpr int MILLISECOND_WIDTH = 3;
77 constexpr char MILLISECOND_FILLCHAR = '0';
78 const int32_t API_TIME_OUT = 5;
79 const int32_t API_TIME_OUT_8S = 8;
80 const int32_t API_TIME_OUT_30S = 30;
81 #ifdef RES_SCHEDULE_ENABLE
82 constexpr int32_t SYSTEMLOADLEVEL_TIMERSTOP_THRESHOLD =
83     static_cast<int32_t>(ResourceSchedule::ResType::SystemloadLevel::HIGH);
84 #endif // RES_SCHEDULE_ENABLE
85 }
86 using namespace std::chrono;
87 
88 const bool REGISTER_RESULT =
89     SystemAbility::MakeAndRegisterAbility(DelayedSingleton<FormMgrService>::GetInstance().get());
90 
91 const std::string NAME_FORM_MGR_SERVICE = "FormMgrService";
92 
93 const std::string FORM_MGR_SERVICE_QUEUE = "FormMgrServiceQueue";
94 
95 constexpr int32_t FORM_DUMP_ARGC_MAX = 2;
96 
97 const std::string FORM_DUMP_HELP = "options list:\n"
98     "  -h, --help                           list available commands\n"
99     "  -b, --bundle-form-info               query all form infos from bundle, Un-added form info will also be dumped\n"
100     "  -v, --visible                        query form visible infos from args like bundleName_userId_instIndex\n"
101     "  -s, --storage                        query form storage info\n"
102     "  -t, --temp                           query temporary form info\n"
103     "  -n  <bundle-name>                    query form info by a bundle name\n"
104     "  -i  <form-id>                        query form info by a form ID\n"
105     "  -r  --running                        query running form info\n"
106     "  -a  --apps-blocked                   query blocked app name list\n";
107 
108 const std::map<std::string, FormMgrService::DumpKey> FormMgrService::dumpKeyMap_ = {
109     {"-h", FormMgrService::DumpKey::KEY_DUMP_HELP},
110     {"--help", FormMgrService::DumpKey::KEY_DUMP_HELP},
111     {"-b", FormMgrService::DumpKey::KEY_DUMP_STATIC},   // *****
112     {"--bundle-form-info", FormMgrService::DumpKey::KEY_DUMP_STATIC},
113     {"-v", FormMgrService::DumpKey::KEY_DUMP_VISIBLE},
114     {"--visible", FormMgrService::DumpKey::KEY_DUMP_VISIBLE},
115     {"-s", FormMgrService::DumpKey::KEY_DUMP_STORAGE},
116     {"--storage", FormMgrService::DumpKey::KEY_DUMP_STORAGE},
117     {"-t", FormMgrService::DumpKey::KEY_DUMP_TEMPORARY},
118     {"--temp", FormMgrService::DumpKey::KEY_DUMP_TEMPORARY},
119     {"-n", FormMgrService::DumpKey::KEY_DUMP_BY_BUNDLE_NAME},
120     {"-i", FormMgrService::DumpKey::KEY_DUMP_BY_FORM_ID},
121     {"-r", FormMgrService::DumpKey::KEY_DUMP_RUNNING},
122     {"--running", FormMgrService::DumpKey::KEY_DUMP_RUNNING},
123     {"-a", FormMgrService::DumpKey::KEY_DUMP_BLOCKED_APPS},
124     {"--apps-blocked", FormMgrService::DumpKey::KEY_DUMP_BLOCKED_APPS},
125 };
126 
FormMgrService()127 FormMgrService::FormMgrService()
128     : SystemAbility(FORM_MGR_SERVICE_ID, true),
129       state_(ServiceRunningState::STATE_NOT_START),
130       serialQueue_(nullptr)
131 {
132     HILOG_INFO("call");
133 }
134 
~FormMgrService()135 FormMgrService::~FormMgrService()
136 {
137     HILOG_INFO("call");
138     if (formSysEventReceiver_ != nullptr) {
139         EventFwk::CommonEventManager::UnSubscribeCommonEvent(formSysEventReceiver_);
140         formSysEventReceiver_ = nullptr;
141         FormBmsHelper::GetInstance().UnregisterBundleEventCallback();
142     }
143 #ifdef MEM_MGR_ENABLE
144     if (memStatusListener_ != nullptr) {
145         Memory::MemMgrClient::GetInstance().UnsubscribeAppState(*memStatusListener_);
146     }
147 #endif
148 }
149 
150 /**
151 * @brief Check form manager service ready.
152 * @return Return true if form manager service Ready; return false otherwise.
153 */
154 
CheckFMSReady()155 bool FormMgrService::CheckFMSReady()
156 {
157     if (state_ != ServiceRunningState::STATE_RUNNING) {
158         return false;
159     }
160 
161     int32_t userId = FormUtil::GetCurrentAccountId();
162     if (userId == Constants::ANY_USERID) {
163         HILOG_ERROR("empty account");
164         return false;
165     }
166     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_CheckFMSReady",
167         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
168     bool result = FormInfoMgr::GetInstance().HasReloadedFormInfos();
169     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
170     return result;
171 }
172 
IsSystemAppForm(const std::string & bundleName)173 bool FormMgrService::IsSystemAppForm(const std::string &bundleName)
174 {
175     HILOG_DEBUG("check %{public}s is system form.", bundleName.c_str());
176 
177     std::vector<FormRecord> formRecords;
178     FormDataMgr::GetInstance().GetFormRecord(bundleName, formRecords);
179     if (formRecords.empty()) {
180         return false;
181     }
182     return formRecords.front().isSystemApp;
183 }
184 
185 /**
186  * @brief Add form with want, send want to form manager service.
187  * @param formId The Id of the forms to add.
188  * @param want The want of the form to add.
189  * @param callerToken Caller ability token.
190  * @param formInfo Form info.
191  * @return Returns ERR_OK on success, others on failure.
192  */
AddForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formInfo)193 int FormMgrService::AddForm(const int64_t formId, const Want &want,
194     const sptr<IRemoteObject> &callerToken, FormJsInfo &formInfo)
195 {
196     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
197         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
198         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
199 
200     ErrCode ret = CheckFormPermission();
201     if (ret != ERR_OK) {
202         HILOG_ERROR("add form permission denied");
203         return ret;
204     }
205     ReportAddFormEvent(formId, want);
206     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_AddForm",
207         API_TIME_OUT_30S, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
208     ret = FormMgrAdapter::GetInstance().AddForm(formId, want, callerToken, formInfo);
209     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
210     return ret;
211 }
212 
213 /**
214  * @brief Add form with want, send want to form manager service.
215  * @param want The want of the form to add.
216  * @param runningFormInfo Running form info.
217  * @return Returns ERR_OK on success, others on failure.
218  */
CreateForm(const Want & want,RunningFormInfo & runningFormInfo)219 int FormMgrService::CreateForm(const Want &want, RunningFormInfo &runningFormInfo)
220 {
221     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
222         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
223         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
224 
225     ErrCode ret = CheckFormPermission();
226     if (ret != ERR_OK) {
227         HILOG_ERROR("create form permission denied");
228         return ret;
229     }
230     ReportAddFormEvent(0, want);
231     return FormMgrAdapter::GetInstance().CreateForm(want, runningFormInfo);
232 }
233 
ReportAddFormEvent(const int64_t formId,const Want & want)234 void FormMgrService::ReportAddFormEvent(const int64_t formId, const Want &want)
235 {
236     FormEventInfo eventInfo;
237     eventInfo.formId = formId;
238     eventInfo.bundleName = want.GetElement().GetBundleName();
239     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
240     eventInfo.abilityName = want.GetElement().GetAbilityName();
241     int ret = FormBmsHelper::GetInstance().GetCallerBundleName(eventInfo.hostBundleName);
242     if (ret != ERR_OK || eventInfo.hostBundleName.empty()) {
243         HILOG_ERROR("cannot get host bundle name by uid");
244     }
245     FormEventReport::SendFormEvent(FormEventName::ADD_FORM, HiSysEventType::BEHAVIOR, eventInfo);
246 }
247 
248 /**
249  * @brief Delete forms with formIds, send formIds to form manager service.
250  * @param formId The Id of the forms to delete.
251  * @param callerToken Caller ability token.
252  * @return Returns ERR_OK on success, others on failure.
253  */
DeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)254 int FormMgrService::DeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
255 {
256     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
257         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
258         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
259 
260     ErrCode ret = CheckFormPermission();
261     if (ret != ERR_OK) {
262         HILOG_ERROR("delete form permission denied");
263         return ret;
264     }
265     FormEventInfo eventInfo;
266     eventInfo.formId = formId;
267     std::vector<FormHostRecord> formHostRecords;
268     FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
269     if (formHostRecords.size() != 0) {
270         eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
271     }
272     FormEventReport::SendSecondFormEvent(FormEventName::DELETE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
273     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_DeleteForm",
274         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
275     ret = FormMgrAdapter::GetInstance().DeleteForm(formId, callerToken);
276     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
277     return ret;
278 }
279 
280 /**
281  * @brief Stop rendering form.
282  * @param formId The Id of the forms to delete.
283  * @param compId The compId of the forms to delete.
284  * @return Returns ERR_OK on success, others on failure.
285  */
StopRenderingForm(const int64_t formId,const std::string & compId)286 int FormMgrService::StopRenderingForm(const int64_t formId, const std::string &compId)
287 {
288     ErrCode ret = CheckFormPermission();
289     if (ret != ERR_OK) {
290         HILOG_ERROR("delete form permission denied");
291         return ret;
292     }
293 
294     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
295     if (ret != ERR_OK) {
296         HILOG_ERROR("invalid formId or not under currentActiveUser");
297         return ret;
298     }
299     return FormMgrAdapter::GetInstance().StopRenderingForm(formId, compId);
300 }
301 
302 /**
303  * @brief Release forms with formIds, send formIds to form manager service.
304  * @param formId The Id of the forms to release.
305  * @param callerToken Caller ability token.
306  * @param delCache Delete Cache or not.
307  * @return Returns ERR_OK on success, others on failure.
308  */
ReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const bool delCache)309 int FormMgrService::ReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const bool delCache)
310 {
311     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
312         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
313         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
314 
315     ErrCode ret = CheckFormPermission();
316     if (ret != ERR_OK) {
317         HILOG_ERROR("release form permission denied");
318         return ret;
319     }
320     FormEventInfo eventInfo;
321     eventInfo.formId = formId;
322     FormEventReport::SendSecondFormEvent(FormEventName::RELEASE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
323 
324     return FormMgrAdapter::GetInstance().ReleaseForm(formId, callerToken, delCache);
325 }
326 
327 /**
328  * @brief Update form with formId, send formId to form manager service.
329  * @param formId The Id of the form to update.
330  * @param formBindingData Form binding data.
331  * @return Returns ERR_OK on success, others on failure.
332  */
UpdateForm(const int64_t formId,const FormProviderData & formBindingData)333 int FormMgrService::UpdateForm(const int64_t formId, const FormProviderData &formBindingData)
334 {
335     HILOG_DEBUG("call");
336     auto callingUid = IPCSkeleton::GetCallingUid();
337     return FormMgrAdapter::GetInstance().UpdateForm(formId, callingUid, formBindingData);
338 }
339 
340 /**
341  * @brief Request form with formId and want, send formId and want to form manager service.
342  * @param formId The Id of the form to update.
343  * @param callerToken Caller ability token.
344  * @param want The want of the form to add.
345  * @return Returns ERR_OK on success, others on failure.
346  */
RequestForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const Want & want)347 int FormMgrService::RequestForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const Want &want)
348 {
349     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
350         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
351         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
352     ErrCode ret = CheckFormPermission();
353     if (ret != ERR_OK) {
354         HILOG_ERROR("request form permission denied");
355         return ret;
356     }
357     FormEventInfo eventInfo;
358     eventInfo.formId = formId;
359     eventInfo.bundleName = want.GetElement().GetBundleName();
360     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
361     eventInfo.abilityName = want.GetElement().GetAbilityName();
362     FormEventReport::SendSecondFormEvent(FormEventName::REQUEST_FORM, HiSysEventType::BEHAVIOR, eventInfo);
363 
364     return FormMgrAdapter::GetInstance().RequestForm(formId, callerToken, want);
365 }
366 
367 /**
368  * @brief set next refresh time.
369  * @param formId The id of the form.
370  * @param nextTime next refresh time.
371  * @return Returns ERR_OK on success, others on failure.
372  */
SetNextRefreshTime(const int64_t formId,const int64_t nextTime)373 int FormMgrService::SetNextRefreshTime(const int64_t formId, const int64_t nextTime)
374 {
375     HILOG_DEBUG("call");
376     FormEventInfo eventInfo;
377     eventInfo.formId = formId;
378     FormEventReport::SendSecondFormEvent(
379         FormEventName::SET_NEXT_REFRESH_TIME_FORM, HiSysEventType::BEHAVIOR, eventInfo);
380 
381     return FormMgrAdapter::GetInstance().SetNextRefreshTime(formId, nextTime);
382 }
383 
ReleaseRenderer(int64_t formId,const std::string & compId)384 int FormMgrService::ReleaseRenderer(int64_t formId, const std::string &compId)
385 {
386     HILOG_DEBUG("call");
387     ErrCode ret = CheckFormPermission();
388     if (ret != ERR_OK) {
389         HILOG_ERROR("request form permission denied");
390         return ret;
391     }
392     return FormMgrAdapter::GetInstance().ReleaseRenderer(formId, compId);
393 }
394 
RequestPublishForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId)395 ErrCode FormMgrService::RequestPublishForm(Want &want, bool withFormBindingData,
396     std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId)
397 {
398     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
399         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
400         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
401     bool isFormAgent = want.GetBoolParam(Constants::IS_FORM_AGENT, false);
402     HILOG_INFO("isFormAgent:%{public}d", isFormAgent);
403     if (isFormAgent) {
404         ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_AGENT_REQUIRE_FORM);
405         if (ret != ERR_OK) {
406             HILOG_ERROR("request form permission denied");
407             return ret;
408         }
409     } else {
410         if (!CheckCallerIsSystemApp()) {
411             return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
412         }
413 
414         if (!CheckAcrossLocalAccountsPermission()) {
415             HILOG_ERROR("Across local accounts permission failed");
416             return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
417         }
418     }
419     return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData, formId);
420 }
421 
SetPublishFormResult(const int64_t formId,Constants::PublishFormResult & errorCodeInfo)422 ErrCode FormMgrService::SetPublishFormResult(const int64_t formId, Constants::PublishFormResult &errorCodeInfo)
423 {
424     HILOG_INFO("call");
425     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_REQUIRE_FORM);
426     if (ret != ERR_OK) {
427         HILOG_ERROR("request form permission denied");
428         return ret;
429     }
430     return FormMgrAdapter::GetInstance().SetPublishFormResult(formId, errorCodeInfo);
431 }
432 
AcquireAddFormResult(const int64_t formId)433 ErrCode FormMgrService::AcquireAddFormResult(const int64_t formId)
434 {
435     HILOG_INFO("call");
436     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_AGENT_REQUIRE_FORM);
437     if (ret != ERR_OK) {
438         HILOG_ERROR("request form permission denied");
439         return ret;
440     }
441     return FormMgrAdapter::GetInstance().AcquireAddFormResult(formId);
442 }
443 
444 /**
445  * @brief Form visible/invisible notify, send formIds to form manager service.
446  * @param formIds The Id list of the forms to notify.
447  * @param callerToken Caller ability token.
448  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
449  * @return Returns ERR_OK on success, others on failure.
450  */
NotifyWhetherVisibleForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,const int32_t formVisibleType)451 int FormMgrService::NotifyWhetherVisibleForms(const std::vector<int64_t> &formIds,
452     const sptr<IRemoteObject> &callerToken, const int32_t formVisibleType)
453 {
454     HILOG_DEBUG("call");
455 
456     ErrCode ret = CheckFormPermission();
457     if (ret != ERR_OK) {
458         HILOG_ERROR("event notify visible permission denied");
459         return ret;
460     }
461     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_NotifyWhetherVisibleForms",
462         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
463     ret = FormMgrAdapter::GetInstance().NotifyWhetherVisibleForms(formIds, callerToken, formVisibleType);
464     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
465     return ret;
466 }
467 
468 /**
469  * @brief Query whether has visible form by tokenId.
470  * @param tokenId Unique identification of application.
471  * @return Returns true if has visible form, false otherwise.
472  */
HasFormVisible(const uint32_t tokenId)473 bool FormMgrService::HasFormVisible(const uint32_t tokenId)
474 {
475     HILOG_DEBUG("call");
476 
477     if (!FormUtil::IsSACall()) {
478         HILOG_ERROR("query form visible with tokenid not a SACall");
479         return false;
480     }
481     return FormMgrAdapter::GetInstance().HasFormVisible(tokenId);
482 }
483 
484 /**
485  * @brief temp form to normal form.
486  * @param formId The Id of the form.
487  * @param callerToken Caller ability token.
488  * @return Returns ERR_OK on success, others on failure.
489  */
CastTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)490 int FormMgrService::CastTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
491 {
492     HILOG_DEBUG("call");
493 
494     ErrCode ret = CheckFormPermission();
495     if (ret != ERR_OK) {
496         HILOG_ERROR("cast temp form permission denied");
497         return ret;
498     }
499     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
500     if (ret != ERR_OK) {
501         HILOG_ERROR("invalid formId or not under currentActiveUser");
502         return ret;
503     }
504     FormEventInfo eventInfo;
505     eventInfo.formId = formId;
506     FormEventReport::SendSecondFormEvent(FormEventName::CASTTEMP_FORM, HiSysEventType::BEHAVIOR, eventInfo);
507 
508     return FormMgrAdapter::GetInstance().CastTempForm(formId, callerToken);
509 }
510 
511 /**
512  * @brief lifecycle update.
513  * @param formIds formIds of host client.
514  * @param callerToken Caller ability token.
515  * @param updateType update type,enable or disable.
516  * @return Returns true on success, false on failure.
517  */
LifecycleUpdate(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,bool updateType)518 int FormMgrService::LifecycleUpdate(const std::vector<int64_t> &formIds,
519     const sptr<IRemoteObject> &callerToken, bool updateType)
520 {
521     HILOG_INFO("updateType:%{public}d", updateType);
522 
523     ErrCode ret = CheckFormPermission();
524     if (ret != ERR_OK) {
525         HILOG_ERROR("delete form permission denied");
526         return ret;
527     }
528 
529     if (updateType) {
530         return FormMgrAdapter::GetInstance().EnableUpdateForm(formIds, callerToken);
531     } else {
532         return FormMgrAdapter::GetInstance().DisableUpdateForm(formIds, callerToken);
533     }
534 }
535 /**
536  * @brief Dump all of form storage infos.
537  * @param formInfos All of form storage infos.
538  * @return Returns ERR_OK on success, others on failure.
539  */
DumpStorageFormInfos(std::string & formInfos)540 int FormMgrService::DumpStorageFormInfos(std::string &formInfos)
541 {
542     if (!CheckCallerIsSystemApp()) {
543         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
544     }
545     return FormMgrAdapter::GetInstance().DumpStorageFormInfos(formInfos);
546 }
547 /**
548  * @brief Dump form info by a bundle name.
549  * @param bundleName The bundle name of form provider.
550  * @param formInfos Form infos.
551  * @return Returns ERR_OK on success, others on failure.
552  */
DumpFormInfoByBundleName(const std::string & bundleName,std::string & formInfos)553 int FormMgrService::DumpFormInfoByBundleName(const std::string &bundleName, std::string &formInfos)
554 {
555     if (!CheckCallerIsSystemApp()) {
556         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
557     }
558     return FormMgrAdapter::GetInstance().DumpFormInfoByBundleName(bundleName, formInfos);
559 }
560 /**
561  * @brief Dump form info by a bundle name.
562  * @param formId The id of the form.
563  * @param formInfo Form info.
564  * @return Returns ERR_OK on success, others on failure.
565  */
DumpFormInfoByFormId(const std::int64_t formId,std::string & formInfo)566 int FormMgrService::DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo)
567 {
568     if (!CheckCallerIsSystemApp()) {
569         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
570     }
571     return FormMgrAdapter::GetInstance().DumpFormInfoByFormId(formId, formInfo);
572 }
573 /**
574  * @brief Dump form timer by form id.
575  * @param formId The id of the form.
576  * @param formInfo Form info.
577  * @return Returns ERR_OK on success, others on failure.
578  */
DumpFormTimerByFormId(const std::int64_t formId,std::string & isTimingService)579 int FormMgrService::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService)
580 {
581     if (!CheckCallerIsSystemApp()) {
582         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
583     }
584     return FormMgrAdapter::GetInstance().DumpFormTimerByFormId(formId, isTimingService);
585 }
586 
587 /**
588  * @brief Process js message event.
589  * @param formId Indicates the unique id of form.
590  * @param want information passed to supplier.
591  * @param callerToken Caller ability token.
592  * @return Returns true if execute success, false otherwise.
593  */
MessageEvent(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)594 int FormMgrService::MessageEvent(const int64_t formId, const Want &want, const sptr<IRemoteObject> &callerToken)
595 {
596     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
597         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
598         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
599     ErrCode ret = CheckFormPermission();
600     if (ret != ERR_OK) {
601         HILOG_ERROR("request form permission denied");
602         return ret;
603     }
604     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
605     if (ret != ERR_OK) {
606         HILOG_ERROR("invalid formId or not under currentActiveUser");
607         return ret;
608     }
609     FormEventInfo eventInfo;
610     eventInfo.bundleName = want.GetElement().GetBundleName();
611     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
612     eventInfo.abilityName = want.GetElement().GetAbilityName();
613     std::vector<FormHostRecord> formHostRecords;
614     FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
615     if (formHostRecords.size() != 0) {
616         eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
617     }
618     FormReport::GetInstance().SetDurationStartTime(formId, FormUtil::GetCurrentSteadyClockMillseconds());
619     FormEventReport::SendFormEvent(FormEventName::MESSAGE_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
620     return FormMgrAdapter::GetInstance().MessageEvent(formId, want, callerToken);
621 }
622 
623 /**
624  * @brief Process js router event.
625  * @param formId Indicates the unique id of form.
626  * @param want the want of the ability to start.
627  * @param callerToken Caller ability token.
628  * @return Returns true if execute success, false otherwise.
629  */
RouterEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)630 int FormMgrService::RouterEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
631 {
632     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
633         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
634         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
635     ErrCode ret = CheckFormPermission();
636     if (ret != ERR_OK) {
637         HILOG_ERROR("request form permission denied");
638         return ret;
639     }
640     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
641     if (ret != ERR_OK) {
642         HILOG_ERROR("invalid formId or not under currentActiveUser");
643         return ret;
644     }
645     FormEventInfo eventInfo;
646     eventInfo.formId = formId;
647     eventInfo.bundleName = want.GetElement().GetBundleName();
648     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
649     eventInfo.abilityName = want.GetElement().GetAbilityName();
650     std::vector<FormHostRecord> formHostRecords;
651     FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
652     if (formHostRecords.size() != 0) {
653         eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
654     }
655     FormEventReport::SendFormEvent(FormEventName::ROUTE_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
656     return FormMgrAdapter::GetInstance().RouterEvent(formId, want, callerToken);
657 }
658 
659 /**
660  * @brief Process Background event.
661  * @param formId Indicates the unique id of form.
662  * @param want the want of the ability to start.
663  * @param callerToken Caller ability token.
664  * @return Returns true if execute success, false otherwise.
665  */
BackgroundEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)666 int FormMgrService::BackgroundEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
667 {
668     HILOG_INFO("begin:%{public}s,publish:%{public}s,end:%{public}s, onKvDataServiceAddTime:%{public}s",
669         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
670         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
671     ErrCode ret = CheckFormPermission();
672     if (ret != ERR_OK) {
673         HILOG_ERROR("request form permission denied");
674         return ret;
675     }
676     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
677     if (ret != ERR_OK) {
678         HILOG_ERROR("the formId is not under currentActiveUser or invalid");
679         return ret;
680     }
681     FormEventInfo eventInfo;
682     eventInfo.formId = formId;
683     eventInfo.bundleName = want.GetElement().GetBundleName();
684     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
685     eventInfo.abilityName = want.GetElement().GetAbilityName();
686     FormEventReport::SendSecondFormEvent(FormEventName::BACKGROUND_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
687     return FormMgrAdapter::GetInstance().BackgroundEvent(formId, want, callerToken);
688 }
689 
690 /**
691  * @brief Start event for the form manager service.
692  */
OnStart()693 void FormMgrService::OnStart()
694 {
695     if (state_ == ServiceRunningState::STATE_RUNNING) {
696         HILOG_WARN("start service failed since it's running");
697         return;
698     }
699 
700     onStartBeginTime_ = GetCurrentDateTime();
701     HILOG_INFO("start,time:%{public}s", onStartBeginTime_.c_str());
702     ErrCode errCode = Init();
703     if (errCode != ERR_OK) {
704         HILOG_ERROR("init failed,errCode:%{public}08x", errCode);
705         return;
706     }
707 
708     state_ = ServiceRunningState::STATE_RUNNING;
709     // listener for FormDataProxyMgr
710     AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
711 
712 #ifdef MEM_MGR_ENABLE
713     AddSystemAbilityListener(MEMORY_MANAGER_SA_ID);
714 #endif // MEM_MGR_ENABLE
715 
716 #ifdef RES_SCHEDULE_ENABLE
717     AddSystemAbilityListener(RES_SCHED_SYS_ABILITY_ID);
718 #endif // RES_SCHEDULE_ENABLE
719     onStartEndTime_ = GetCurrentDateTime();
720     HILOG_INFO("success,time:%{public}s,onKvDataServiceAddTime:%{public}s",
721         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
722 }
723 /**
724  * @brief Stop event for the form manager service.
725  */
OnStop()726 void FormMgrService::OnStop()
727 {
728     HILOG_INFO("stop");
729 
730     state_ = ServiceRunningState::STATE_NOT_START;
731 
732     if (serialQueue_) {
733         serialQueue_.reset();
734     }
735 
736     if (handler_) {
737         handler_.reset();
738     }
739     FormAmsHelper::GetInstance().UnRegisterConfigurationObserver();
740 }
741 
ReadFormConfigXML()742 ErrCode FormMgrService::ReadFormConfigXML()
743 {
744     FormXMLParser parser;
745     int32_t ret = parser.Parse();
746     if (ret != ERR_OK) {
747         HILOG_WARN("parse form config failed, use the default vaule");
748         return ret;
749     }
750     const std::map<std::string, int32_t> &configMap = parser.GetConfigMap();
751     FormDataMgr::GetInstance().SetConfigMap(configMap);
752     return ERR_OK;
753 }
754 
755 
SubscribeSysEventReceiver()756 void FormMgrService::SubscribeSysEventReceiver()
757 {
758     if (formSysEventReceiver_ == nullptr) {
759         EventFwk::MatchingSkills matchingSkills;
760         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_ABILITY_UPDATED);
761         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_DATA_CLEARED);
762         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_REMOVED);
763         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED);
764         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SECOND_MOUNTED);
765         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED);
766         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED);
767         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
768         // init TimerReceiver
769         EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
770         subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
771         formSysEventReceiver_ = std::make_shared<FormSysEventReceiver>(subscribeInfo);
772         formSysEventReceiver_->SetSerialQueue(serialQueue_);
773         EventFwk::CommonEventManager::SubscribeCommonEvent(formSysEventReceiver_);
774     }
775 }
776 
777 /**
778  * @brief initialization of form manager service.
779  */
Init()780 ErrCode FormMgrService::Init()
781 {
782     HILOG_INFO("call");
783     serialQueue_ = std::make_shared<FormSerialQueue>(FORM_MGR_SERVICE_QUEUE.c_str());
784     if (serialQueue_ == nullptr) {
785         HILOG_ERROR("Init failed,null serialQueue_");
786         return ERR_INVALID_OPERATION;
787     }
788 
789     handler_ = std::make_shared<FormEventHandler>(serialQueue_);
790     if (handler_ == nullptr) {
791         HILOG_ERROR("init failed.null handler_");
792         return ERR_INVALID_OPERATION;
793     }
794     FormTaskMgr::GetInstance().SetSerialQueue(serialQueue_);
795     FormAmsHelper::GetInstance().SetSerialQueue(serialQueue_);
796     /* Publish service maybe failed, so we need call this function at the last,
797      * so it can't affect the TDD test program */
798     if (!Publish(DelayedSingleton<FormMgrService>::GetInstance().get())) {
799         FormEventReport::SendFormFailedEvent(FormEventName::INIT_FMS_FAILED, HiSysEventType::FAULT,
800             static_cast<int64_t>(InitFmsFiledErrorType::PUBLISH_SER_FAILED));
801         HILOG_ERROR("FormMgrService::Init Publish failed");
802         return ERR_INVALID_OPERATION;
803     }
804     onStartPublishTime_ = GetCurrentDateTime();
805     HILOG_INFO("FMS onStart publish done, time:%{public}s", onStartPublishTime_.c_str());
806 
807     SubscribeSysEventReceiver();
808 #ifdef MEM_MGR_ENABLE
809     memStatusListener_ = std::make_shared<MemStatusListener>();
810     Memory::MemMgrClient::GetInstance().SubscribeAppState(*memStatusListener_);
811 #endif
812 
813     FormInfoMgr::GetInstance().Start();
814     FormDbCache::GetInstance().Start();
815     FormTimerMgr::GetInstance(); // Init FormTimerMgr
816     FormCacheMgr::GetInstance().Start();
817 
818     formSysEventReceiver_->InitFormInfosAndRegister();
819 
820     // read param form form_config.xml.
821     if (ReadFormConfigXML() != ERR_OK) {
822         HILOG_WARN("parse form config failed, use the default vaule");
823     }
824     FormMgrAdapter::GetInstance().Init();
825     FormAmsHelper::GetInstance().RegisterConfigurationObserver();
826     return ERR_OK;
827 }
828 
CheckFormPermission(const std::string & permission)829 ErrCode FormMgrService::CheckFormPermission(const std::string &permission)
830 {
831     HILOG_DEBUG("call");
832 
833     if (FormUtil::IsSACall()) {
834         return ERR_OK;
835     }
836 
837     // check if system app
838     if (!CheckCallerIsSystemApp()) {
839         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
840     }
841 
842     auto isCallingPerm = FormUtil::VerifyCallingPermission(permission);
843     if (!isCallingPerm) {
844         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
845     }
846 
847     // checks whether the current user is inactive
848     if (!CheckAcrossLocalAccountsPermission()) {
849         HILOG_ERROR("Across local accounts permission failed");
850         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
851     }
852 
853     HILOG_DEBUG("Permission verification ok");
854     return ERR_OK;
855 }
856 
857 /**
858  * @brief Delete the invalid forms.
859  * @param formIds Indicates the ID of the valid forms.
860  * @param callerToken Caller ability token.
861  * @param numFormsDeleted Returns the number of the deleted forms.
862  * @return Returns ERR_OK on success, others on failure.
863  */
DeleteInvalidForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,int32_t & numFormsDeleted)864 int FormMgrService::DeleteInvalidForms(const std::vector<int64_t> &formIds,
865     const sptr<IRemoteObject> &callerToken, int32_t &numFormsDeleted)
866 {
867     HILOG_DEBUG("call");
868     ErrCode ret = CheckFormPermission();
869     if (ret != ERR_OK) {
870         HILOG_ERROR("delete form permission denied");
871         return ret;
872     }
873     FormEventInfo eventInfo;
874     FormEventReport::SendFormEvent(FormEventName::DELETE_INVALID_FORM, HiSysEventType::BEHAVIOR, eventInfo);
875     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_DeleteInvalidForms",
876         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
877     ret = FormMgrAdapter::GetInstance().DeleteInvalidForms(formIds, callerToken, numFormsDeleted);
878     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
879     return ret;
880 }
881 
882 /**
883   * @brief Acquire form state info by passing a set of parameters (using Want) to the form provider.
884   * @param want Indicates a set of parameters to be transparently passed to the form provider.
885   * @param callerToken Caller ability token.
886   * @param stateInfo Returns the form's state info of the specify.
887   * @return Returns ERR_OK on success, others on failure.
888   */
AcquireFormState(const Want & want,const sptr<IRemoteObject> & callerToken,FormStateInfo & stateInfo)889 int FormMgrService::AcquireFormState(const Want &want,
890     const sptr<IRemoteObject> &callerToken, FormStateInfo &stateInfo)
891 {
892     HILOG_DEBUG("call");
893     ErrCode ret = CheckFormPermission();
894     if (ret != ERR_OK) {
895         HILOG_ERROR("acquire form state permission denied");
896         return ret;
897     }
898     FormEventInfo eventInfo;
899     eventInfo.bundleName = want.GetElement().GetBundleName();
900     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
901     eventInfo.abilityName = want.GetElement().GetAbilityName();
902     FormEventReport::SendFormEvent(FormEventName::ACQUIREFORMSTATE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
903     return FormMgrAdapter::GetInstance().AcquireFormState(want, callerToken, stateInfo);
904 }
905 
906 /**
907  * @brief Register form router event proxy.
908  * @param formIds Indicates the ID of the forms.
909  * @param callerToken Host client.
910  * @return Returns ERR_OK on success, others on failure.
911  */
RegisterFormRouterProxy(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken)912 int FormMgrService::RegisterFormRouterProxy(const std::vector<int64_t> &formIds,
913     const sptr<IRemoteObject> &callerToken)
914 {
915     HILOG_DEBUG("call");
916     ErrCode ret = CheckFormPermission();
917     if (ret != ERR_OK) {
918         HILOG_ERROR("register form router proxy permission denied");
919         return ret;
920     }
921     return FormMgrAdapter::GetInstance().RegisterFormRouterProxy(formIds, callerToken);
922 }
923 
924 /**
925 * @brief Unregister form router event proxy.
926 * @param formIds Indicates the ID of the forms.
927 * @return Returns ERR_OK on success, others on failure.
928 */
UnregisterFormRouterProxy(const std::vector<int64_t> & formIds)929 int FormMgrService::UnregisterFormRouterProxy(const std::vector<int64_t> &formIds)
930 {
931     HILOG_DEBUG("call");
932     ErrCode ret = CheckFormPermission();
933     if (ret != ERR_OK) {
934         HILOG_ERROR("unregister form router proxy permission denied");
935         return ret;
936     }
937     return FormMgrAdapter::GetInstance().UnregisterFormRouterProxy(formIds);
938 }
939 
940 /**
941  * @brief Notify the form is visible or not.
942  * @param formIds Indicates the ID of the forms.
943  * @param isVisible Visible or not.
944  * @param callerToken Host client.
945  * @return Returns ERR_OK on success, others on failure.
946  */
NotifyFormsVisible(const std::vector<int64_t> & formIds,bool isVisible,const sptr<IRemoteObject> & callerToken)947 int FormMgrService::NotifyFormsVisible(const std::vector<int64_t> &formIds,
948     bool isVisible, const sptr<IRemoteObject> &callerToken)
949 {
950     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
951         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
952         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
953     ErrCode ret = CheckFormPermission();
954     if (ret != ERR_OK) {
955         HILOG_ERROR("notify form visible permission denied");
956         return ret;
957     }
958     return FormMgrAdapter::GetInstance().NotifyFormsVisible(formIds, isVisible, callerToken);
959 }
960 
NotifyFormsPrivacyProtected(const std::vector<int64_t> & formIds,bool isProtected,const sptr<IRemoteObject> & callerToken)961 int FormMgrService::NotifyFormsPrivacyProtected(const std::vector<int64_t> &formIds, bool isProtected,
962     const sptr<IRemoteObject> &callerToken)
963 {
964     HILOG_DEBUG("call");
965     ErrCode ret = CheckFormPermission();
966     if (ret != ERR_OK) {
967         HILOG_ERROR("notify form is privacy protected permission denied");
968         return ret;
969     }
970     return ERR_APPEXECFWK_FORM_COMMON_CODE;
971 }
972 
973 /**
974  * @brief Notify the form is enable to be updated or not.
975  * @param formIds Indicates the ID of the forms.
976  * @param isEnableUpdate enable update or not.
977  * @param callerToken Host client.
978  * @return Returns ERR_OK on success, others on failure.
979  */
NotifyFormsEnableUpdate(const std::vector<int64_t> & formIds,bool isEnableUpdate,const sptr<IRemoteObject> & callerToken)980 int FormMgrService::NotifyFormsEnableUpdate(const std::vector<int64_t> &formIds,
981     bool isEnableUpdate, const sptr<IRemoteObject> &callerToken)
982 {
983     HILOG_DEBUG("call");
984     ErrCode ret = CheckFormPermission();
985     if (ret != ERR_OK) {
986         HILOG_ERROR("notify form enable update permission denied");
987         return ret;
988     }
989     return FormMgrAdapter::GetInstance().NotifyFormsEnableUpdate(formIds, isEnableUpdate, callerToken);
990 }
991 
992 /**
993  * @brief Get All FormsInfo.
994  * @param formInfos Return the form information of all forms provided.
995  * @return Returns ERR_OK on success, others on failure.
996  */
GetAllFormsInfo(std::vector<FormInfo> & formInfos)997 int FormMgrService::GetAllFormsInfo(std::vector<FormInfo> &formInfos)
998 {
999     HILOG_DEBUG("call");
1000     if (!CheckCallerIsSystemApp()) {
1001         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1002     }
1003     if (!CheckAcrossLocalAccountsPermission()) {
1004         HILOG_ERROR("Across local accounts permission failed");
1005         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1006     }
1007     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_GetAllFormsInfo",
1008         API_TIME_OUT_8S, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1009     ErrCode ret = FormMgrAdapter::GetInstance().GetAllFormsInfo(formInfos);
1010     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1011     return ret;
1012 }
1013 
1014 /**
1015  * @brief Get forms info by bundle name.
1016  * @param bundleName Application name.
1017  * @param formInfos Return the form information of the specify application name.
1018  * @return Returns ERR_OK on success, others on failure.
1019  */
GetFormsInfoByApp(std::string & bundleName,std::vector<FormInfo> & formInfos)1020 int FormMgrService::GetFormsInfoByApp(std::string &bundleName, std::vector<FormInfo> &formInfos)
1021 {
1022     HILOG_DEBUG("call");
1023     if (!CheckCallerIsSystemApp()) {
1024         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1025     }
1026     if (!CheckAcrossLocalAccountsPermission()) {
1027         HILOG_ERROR("Across local accounts permission failed");
1028         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1029     }
1030     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_GetFormsInfoByApp",
1031         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1032     ErrCode ret = FormMgrAdapter::GetInstance().GetFormsInfoByApp(bundleName, formInfos);
1033     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1034     return ret;
1035 }
1036 
1037 /**
1038  * @brief Get forms info by bundle name and module name.
1039  * @param bundleName bundle name.
1040  * @param moduleName Module name of hap.
1041  * @param formInfos Return the forms information of the specify bundle name and module name.
1042  * @return Returns ERR_OK on success, others on failure.
1043  */
GetFormsInfoByModule(std::string & bundleName,std::string & moduleName,std::vector<FormInfo> & formInfos)1044 int FormMgrService::GetFormsInfoByModule(std::string &bundleName, std::string &moduleName,
1045                                          std::vector<FormInfo> &formInfos)
1046 {
1047     HILOG_DEBUG("call");
1048     if (!CheckCallerIsSystemApp()) {
1049         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1050     }
1051     if (!CheckAcrossLocalAccountsPermission()) {
1052         HILOG_ERROR("Across local accounts permission failed");
1053         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1054     }
1055     return FormMgrAdapter::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
1056 }
1057 
GetFormsInfoByFilter(const FormInfoFilter & filter,std::vector<FormInfo> & formInfos)1058 int FormMgrService::GetFormsInfoByFilter(const FormInfoFilter &filter, std::vector<FormInfo> &formInfos)
1059 {
1060     HILOG_DEBUG("call");
1061     if (!CheckCallerIsSystemApp()) {
1062         HILOG_ERROR("Need system authority");
1063         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1064     }
1065     if (!CheckAcrossLocalAccountsPermission()) {
1066         HILOG_ERROR("Across local accounts permission failed");
1067         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1068     }
1069     return FormMgrAdapter::GetInstance().GetFormsInfoByFilter(filter, formInfos);
1070 }
1071 
GetFormsInfo(const FormInfoFilter & filter,std::vector<FormInfo> & formInfos)1072 int32_t FormMgrService::GetFormsInfo(const FormInfoFilter &filter, std::vector<FormInfo> &formInfos)
1073 {
1074     HILOG_DEBUG("call");
1075     std::string callerBundleName;
1076     ErrCode ret = FormBmsHelper::GetInstance().GetCallerBundleName(callerBundleName);
1077     if (ret != ERR_OK) {
1078         HILOG_ERROR("get host bundle name failed");
1079         return ret;
1080     }
1081     // retrieve moduleName from filter.
1082     std::string moduleName = filter.moduleName;
1083     if (moduleName.empty()) {
1084         // fulfill formInfos, the process should be the same as GetFormsInfoByApp.
1085         HILOG_INFO("flows to GetFormsInfoByAPP");
1086         return FormMgrAdapter::GetInstance().GetFormsInfoByApp(callerBundleName, formInfos);
1087     }
1088     HILOG_INFO("flows to GetFormsInfoByModule");
1089     return FormMgrAdapter::GetInstance().GetFormsInfoByModule(callerBundleName, moduleName, formInfos);
1090 }
1091 
AcquireFormData(int64_t formId,int64_t requestCode,const sptr<IRemoteObject> & callerToken,AAFwk::WantParams & formData)1092 int32_t FormMgrService::AcquireFormData(int64_t formId, int64_t requestCode, const sptr<IRemoteObject> &callerToken,
1093     AAFwk::WantParams &formData)
1094 {
1095     HILOG_DEBUG("call");
1096     if (formId <= 0) {
1097         HILOG_ERROR("invalid formId");
1098         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1099     }
1100 
1101     if (callerToken == nullptr) {
1102         HILOG_ERROR("null callerToken");
1103         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1104     }
1105 
1106     if (requestCode <= 0) {
1107         HILOG_ERROR("invalid requestCode");
1108         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1109     }
1110 
1111     ErrCode ret = CheckFormPermission();
1112     if (ret != ERR_OK) {
1113         HILOG_ERROR("request form permission denied");
1114         return ret;
1115     }
1116     return FormMgrAdapter::GetInstance().AcquireFormData(formId, requestCode, callerToken, formData);
1117 }
1118 
IsRequestPublishFormSupported()1119 bool FormMgrService::IsRequestPublishFormSupported()
1120 {
1121     HILOG_DEBUG("call");
1122     if (!CheckCallerIsSystemApp()) {
1123         return false;
1124     }
1125     return FormMgrAdapter::GetInstance().IsRequestPublishFormSupported();
1126 }
1127 
StartAbility(const Want & want,const sptr<IRemoteObject> & callerToken)1128 int32_t FormMgrService::StartAbility(const Want &want, const sptr<IRemoteObject> &callerToken)
1129 {
1130     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
1131         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
1132         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
1133     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_START_ABILITIES_FROM_BACKGROUND);
1134     if (ret != ERR_OK) {
1135         HILOG_ERROR("start ability check permission denied");
1136         return ret;
1137     }
1138     // check abilityName and uri to void implicit want.
1139     if (want.GetElement().GetAbilityName().empty() && want.GetUriString().empty()) {
1140         HILOG_ERROR("empty AbilityName and uri");
1141         return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
1142     }
1143     sptr<AAFwk::IAbilityManager> ams = FormAmsHelper::GetInstance().GetAbilityManager();
1144     if (ams == nullptr) {
1145         HILOG_ERROR("fail get abilityMgr");
1146         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1147     }
1148     return ams->StartAbility(want, callerToken, -1, -1);
1149 }
1150 
InitFormShareMgrSerialQueue()1151 void FormMgrService::InitFormShareMgrSerialQueue()
1152 {
1153     DelayedSingleton<FormShareMgr>::GetInstance()->SetSerialQueue(serialQueue_);
1154     DelayedSingleton<FormShareMgr>::GetInstance()->SetEventHandler(handler_);
1155 }
1156 
ShareForm(int64_t formId,const std::string & deviceId,const sptr<IRemoteObject> & callerToken,int64_t requestCode)1157 int32_t FormMgrService::ShareForm(int64_t formId, const std::string &deviceId, const sptr<IRemoteObject> &callerToken,
1158     int64_t requestCode)
1159 {
1160     HILOG_DEBUG("FormMgrService ShareForm call deviceId :%{public}s, formId:%{public}" PRId64 "",
1161         deviceId.c_str(), formId);
1162     if (formId <= 0) {
1163         HILOG_ERROR("invalid formId");
1164         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1165     }
1166 
1167     if (deviceId.empty()) {
1168         HILOG_ERROR("empty deviceId");
1169         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1170     }
1171 
1172     if (callerToken == nullptr) {
1173         HILOG_ERROR("null callerToken");
1174         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1175     }
1176 
1177     if (requestCode <= 0) {
1178         HILOG_ERROR("invalid requestCode");
1179         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1180     }
1181 
1182     auto ret = CheckFormPermission();
1183     if (ret != ERR_OK) {
1184         HILOG_ERROR("share form permission denied");
1185         return ret;
1186     }
1187 
1188     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
1189     if (ret != ERR_OK) {
1190         HILOG_ERROR("invalid formId or not under currentActiveUser");
1191         return ret;
1192     }
1193 
1194     InitFormShareMgrSerialQueue();
1195 
1196     return DelayedSingleton<FormShareMgr>::GetInstance()->ShareForm(formId, deviceId, callerToken, requestCode);
1197 }
1198 
RecvFormShareInfoFromRemote(const FormShareInfo & info)1199 int32_t FormMgrService::RecvFormShareInfoFromRemote(const FormShareInfo &info)
1200 {
1201     HILOG_DEBUG("call");
1202     if (!FormUtil::IsSACall()) {
1203         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1204     }
1205 
1206     InitFormShareMgrSerialQueue();
1207 
1208     return DelayedSingleton<FormShareMgr>::GetInstance()->RecvFormShareInfoFromRemote(info);
1209 }
1210 
Dump(int fd,const std::vector<std::u16string> & args)1211 int FormMgrService::Dump(int fd, const std::vector<std::u16string> &args)
1212 {
1213     if (!CheckFMSReady()) {
1214         HILOG_ERROR("fms not ready");
1215         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1216     }
1217 
1218     std::string result;
1219     Dump(args, result);
1220     int ret = dprintf(fd, "%s\n", result.c_str());
1221     if (ret < 0) {
1222         HILOG_ERROR("format dprintf error");
1223         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1224     }
1225     return ERR_OK;
1226 }
1227 
Dump(const std::vector<std::u16string> & args,std::string & result)1228 void FormMgrService::Dump(const std::vector<std::u16string> &args, std::string &result)
1229 {
1230     DumpKey key;
1231     std::string value;
1232     if (!ParseOption(args, key, value, result)) {
1233         result.append('\n' + FORM_DUMP_HELP);
1234         return;
1235     }
1236 
1237     switch (key) {
1238         case DumpKey::KEY_DUMP_HELP:
1239             return HiDumpHelp(value, result);
1240         case DumpKey::KEY_DUMP_STATIC:
1241             return HiDumpStaticBundleFormInfos(value, result);
1242         case DumpKey::KEY_DUMP_STORAGE:
1243             return HiDumpStorageFormInfos(value, result);
1244         case DumpKey::KEY_DUMP_VISIBLE:
1245             return HiDumpHasFormVisible(value, result);
1246         case DumpKey::KEY_DUMP_TEMPORARY:
1247             return HiDumpTemporaryFormInfos(value, result);
1248         case DumpKey::KEY_DUMP_BY_BUNDLE_NAME:
1249             return HiDumpFormInfoByBundleName(value, result);
1250         case DumpKey::KEY_DUMP_BY_FORM_ID:
1251             return HiDumpFormInfoByFormId(value, result);
1252         case DumpKey::KEY_DUMP_RUNNING:
1253             return HiDumpFormRunningFormInfos(value, result);
1254         case DumpKey::KEY_DUMP_BLOCKED_APPS:
1255             return HiDumpFormBlockedApps(value, result);
1256         default:
1257             result = "error: unknow function.";
1258             return;
1259     }
1260 }
1261 
RegisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)1262 int32_t FormMgrService::RegisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
1263 {
1264     HILOG_DEBUG("call");
1265     sptr<IBundleMgr> bundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1266     if (bundleMgr == nullptr) {
1267         HILOG_ERROR("error to get bundleMgr");
1268         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1269     }
1270     // check if system app
1271     auto callingUid = IPCSkeleton::GetCallingUid();
1272     auto isSystemApp = bundleMgr->CheckIsSystemAppByUid(callingUid);
1273     if (!isSystemApp) {
1274         HILOG_ERROR("no permission");
1275         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1276     }
1277     return FormMgrAdapter::GetInstance().RegisterPublishFormInterceptor(interceptorCallback);
1278 }
1279 
UnregisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)1280 int32_t FormMgrService::UnregisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
1281 {
1282     HILOG_DEBUG("call");
1283     sptr<IBundleMgr> bundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1284     if (bundleMgr == nullptr) {
1285         HILOG_ERROR("fail get bundleMgr");
1286         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1287     }
1288     // check if system app
1289     auto callingUid = IPCSkeleton::GetCallingUid();
1290     auto isSystemApp = bundleMgr->CheckIsSystemAppByUid(callingUid);
1291     if (!isSystemApp) {
1292         HILOG_ERROR("permission denied");
1293         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1294     }
1295     return FormMgrAdapter::GetInstance().UnregisterPublishFormInterceptor(interceptorCallback);
1296 }
1297 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1298 void FormMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
1299 {
1300 #ifdef RES_SCHEDULE_ENABLE
1301     if (systemAbilityId == RES_SCHED_SYS_ABILITY_ID) {
1302         auto formSystemloadLevelCb = [this](int32_t level) { this->OnSystemloadLevel(level); };
1303         sptr<FormSystemloadListener> formSystemloadListener
1304             = new (std::nothrow) FormSystemloadListener(formSystemloadLevelCb);
1305         ResourceSchedule::ResSchedClient::GetInstance().RegisterSystemloadNotifier(formSystemloadListener);
1306         HILOG_INFO("RegisterSystemloadNotifier for Systemloadlevel change");
1307         return;
1308     }
1309 #endif // RES_SCHEDULE_ENABLE
1310 
1311 #ifdef MEM_MGR_ENABLE
1312     if (systemAbilityId == MEMORY_MANAGER_SA_ID) {
1313         HILOG_INFO("MEMORY_MANAGER_SA start,SubscribeAppState");
1314         Memory::MemMgrClient::GetInstance().SubscribeAppState(*memStatusListener_);
1315         return;
1316     }
1317 #endif // MEM_MGR_ENABLE
1318 
1319     if (systemAbilityId != DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID) {
1320         return;
1321     }
1322     onKvDataServiceAddTime_ = GetCurrentDateTime();
1323     FormDataProxyMgr::GetInstance().RetryFailureSubscribes();
1324     HILOG_INFO("FMS KV data service add time:%{public}s", onKvDataServiceAddTime_.c_str());
1325 }
1326 
ParseOption(const std::vector<std::u16string> & args,DumpKey & key,std::string & value,std::string & result)1327 bool FormMgrService::ParseOption(const std::vector<std::u16string> &args, DumpKey &key, std::string &value,
1328     std::string &result)
1329 {
1330     auto size = args.size();
1331     if (size == 0) {
1332         result = "error: must contain arguments.";
1333         return false;
1334     }
1335 
1336     if (size > FORM_DUMP_ARGC_MAX) {
1337         result = "error: arguments numer out of limit.";
1338         return false;
1339     }
1340 
1341     std::string optionKey = Str16ToStr8(args[0]);
1342     auto iter = dumpKeyMap_.find(optionKey);
1343     if (iter == dumpKeyMap_.end()) {
1344         result = "error: unknown option.";
1345         return false;
1346     }
1347 
1348     key = iter->second;
1349 
1350     if (args.size() == FORM_DUMP_ARGC_MAX) {
1351         value = Str16ToStr8(args[1]);
1352     }
1353 
1354     return true;
1355 }
1356 
1357 void FormMgrService::HiDumpFormRunningFormInfos([[maybe_unused]]const std::string &args, std::string &result)
1358 {
1359     HILOG_DEBUG("call");
1360     if (!CheckCallerIsSystemApp()) {
1361         return;
1362     }
1363     FormMgrAdapter::GetInstance().DumpFormRunningFormInfos(result);
1364 }
1365 
1366 void FormMgrService::HiDumpHelp([[maybe_unused]] const std::string &args, std::string &result)
1367 {
1368     result = FORM_DUMP_HELP;
1369 }
1370 
1371 void FormMgrService::HiDumpStorageFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1372 {
1373     DumpStorageFormInfos(result);
1374 }
1375 
1376 void FormMgrService::HiDumpTemporaryFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1377 {
1378     if (!CheckCallerIsSystemApp()) {
1379         return;
1380     }
1381     FormMgrAdapter::GetInstance().DumpTemporaryFormInfos(result);
1382 }
1383 
1384 void FormMgrService::HiDumpStaticBundleFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1385 {
1386     if (!CheckCallerIsSystemApp()) {
1387         return;
1388     }
1389     FormMgrAdapter::GetInstance().DumpStaticBundleFormInfos(result);
1390 }
1391 
HiDumpFormInfoByBundleName(const std::string & args,std::string & result)1392 void FormMgrService::HiDumpFormInfoByBundleName(const std::string &args, std::string &result)
1393 {
1394     if (args.empty()) {
1395         result = "error: request a bundle name.";
1396         return;
1397     }
1398     DumpFormInfoByBundleName(args, result);
1399 }
1400 
HiDumpHasFormVisible(const std::string & args,std::string & result)1401 void FormMgrService::HiDumpHasFormVisible(const std::string &args, std::string &result)
1402 {
1403     if (args.empty()) {
1404         result = "error:request bundle info like bundleName_userId_instIndex.";
1405     }
1406     FormMgrAdapter::GetInstance().DumpHasFormVisible(args, result);
1407 }
1408 
1409 void FormMgrService::HiDumpFormBlockedApps([[maybe_unused]] const std::string &args, std::string &result)
1410 {
1411     if (!CheckCallerIsSystemApp()) {
1412         return;
1413     }
1414     FormTrustMgr::GetInstance().GetUntrustAppNameList(result);
1415 }
1416 
HiDumpFormInfoByFormId(const std::string & args,std::string & result)1417 void FormMgrService::HiDumpFormInfoByFormId(const std::string &args, std::string &result)
1418 {
1419     if (args.empty()) {
1420         result = "error: request a form ID.";
1421         return;
1422     }
1423     int64_t formId = atoll(args.c_str());
1424     if (formId == 0) {
1425         result = "error: form ID is invalid.";
1426         return;
1427     }
1428     DumpFormInfoByFormId(formId, result);
1429 }
1430 
CheckCallerIsSystemApp() const1431 bool FormMgrService::CheckCallerIsSystemApp() const
1432 {
1433     auto callerTokenID = IPCSkeleton::GetCallingFullTokenID();
1434     if (!FormUtil::IsSACall() && !Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(callerTokenID)) {
1435         HILOG_ERROR("The caller not system-app,can't use system-api");
1436         return false;
1437     }
1438     return true;
1439 }
1440 
GetCurrentDateTime()1441 std::string FormMgrService::GetCurrentDateTime()
1442 {
1443     auto cTimeNow = std::chrono::system_clock::now();
1444     auto microPart = std::chrono::duration_cast<std::chrono::milliseconds>(
1445         cTimeNow.time_since_epoch()).count() % 1000;
1446     std::time_t t1 = std::chrono::system_clock::to_time_t(cTimeNow);
1447     char buf[32];
1448     std::tm t2;
1449     localtime_r(&t1, &t2);
1450     (void)strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S.", &t2);
1451     std::stringstream ss;
1452     ss << buf << std::setw(MILLISECOND_WIDTH) << std::setfill(MILLISECOND_FILLCHAR) << microPart;
1453     return ss.str();
1454 }
1455 
CheckAcrossLocalAccountsPermission() const1456 bool FormMgrService::CheckAcrossLocalAccountsPermission() const
1457 {
1458     // checks whether the current user is inactive
1459     int callingUid = IPCSkeleton::GetCallingUid();
1460     int32_t userId = callingUid / Constants::CALLING_UID_TRANSFORM_DIVISOR;
1461     int32_t currentActiveUserId = FormUtil::GetCurrentAccountId();
1462     if (userId != currentActiveUserId) {
1463         HILOG_INFO("currentActiveUserId:%{public}d, userId:%{public}d", currentActiveUserId, userId);
1464         bool isCallingPermAccount =
1465             FormUtil::VerifyCallingPermission(AppExecFwk::Constants::PERMISSION_INTERACT_ACROSS_LOCAL_ACCOUNTS);
1466         if (!isCallingPermAccount) {
1467             HILOG_ERROR("Across local accounts permission failed");
1468             return false;
1469         }
1470     }
1471     return true;
1472 }
1473 
RegisterFormAddObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)1474 ErrCode FormMgrService::RegisterFormAddObserverByBundle(const std::string bundleName,
1475     const sptr<IRemoteObject> &callerToken)
1476 {
1477     HILOG_DEBUG("call");
1478     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1479     if (ret != ERR_OK) {
1480         HILOG_ERROR("register form add observer permission denied");
1481         return ret;
1482     }
1483     return FormMgrAdapter::GetInstance().RegisterFormAddObserverByBundle(bundleName, callerToken);
1484 }
1485 
RegisterFormRemoveObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)1486 ErrCode FormMgrService::RegisterFormRemoveObserverByBundle(const std::string bundleName,
1487     const sptr<IRemoteObject> &callerToken)
1488 {
1489     HILOG_DEBUG("call");
1490     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1491     if (ret != ERR_OK) {
1492         HILOG_ERROR("register form remove observer permission denied");
1493         return ret;
1494     }
1495     return FormMgrAdapter::GetInstance().RegisterFormRemoveObserverByBundle(bundleName, callerToken);
1496 }
1497 
GetFormsCount(bool isTempFormFlag,int32_t & formCount)1498 int32_t FormMgrService::GetFormsCount(bool isTempFormFlag, int32_t &formCount)
1499 {
1500     HILOG_DEBUG("call");
1501     return FormMgrAdapter::GetInstance().GetFormsCount(isTempFormFlag, formCount);
1502 }
1503 
GetHostFormsCount(std::string & bundleName,int32_t & formCount)1504 int32_t FormMgrService::GetHostFormsCount(std::string &bundleName, int32_t &formCount)
1505 {
1506     HILOG_DEBUG("call");
1507     return FormMgrAdapter::GetInstance().GetHostFormsCount(bundleName, formCount);
1508 }
1509 
GetRunningFormInfos(bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)1510 ErrCode FormMgrService::GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
1511 {
1512     HILOG_DEBUG("call");
1513     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1514     if (ret != ERR_OK) {
1515         HILOG_ERROR("get running form infos permission denied");
1516         return ret;
1517     }
1518     return FormMgrAdapter::GetInstance().GetRunningFormInfos(isUnusedIncluded, runningFormInfos);
1519 }
1520 
GetRunningFormInfosByBundleName(const std::string & bundleName,bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)1521 ErrCode FormMgrService::GetRunningFormInfosByBundleName(
1522     const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
1523 {
1524     HILOG_DEBUG("call");
1525     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1526     if (ret != ERR_OK) {
1527         HILOG_ERROR("get running form infos by bundle name permission denied");
1528         return ret;
1529     }
1530     return FormMgrAdapter::GetInstance().GetRunningFormInfosByBundleName(
1531         bundleName, isUnusedIncluded, runningFormInfos);
1532 }
1533 
GetFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)1534 ErrCode FormMgrService::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
1535     std::vector<FormInstance> &formInstances)
1536 {
1537     HILOG_DEBUG("call");
1538     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1539     if (ret != ERR_OK) {
1540         HILOG_ERROR("get form instances by filter permission denied");
1541         return ret;
1542     }
1543     return FormMgrAdapter::GetInstance().GetFormInstancesByFilter(formInstancesFilter, formInstances);
1544 }
1545 
GetFormInstanceById(const int64_t formId,FormInstance & formInstance)1546 ErrCode FormMgrService::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
1547 {
1548     HILOG_DEBUG("call");
1549     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1550     if (ret != ERR_OK) {
1551         HILOG_ERROR("get form instance by id permission denied");
1552         return ret;
1553     }
1554     return FormMgrAdapter::GetInstance().GetFormInstanceById(formId, formInstance);
1555 }
1556 
GetFormInstanceById(const int64_t formId,bool isUnusedIncluded,FormInstance & formInstance)1557 ErrCode FormMgrService::GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)
1558 {
1559     HILOG_DEBUG("call");
1560     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1561     if (ret != ERR_OK) {
1562         HILOG_ERROR("get form instance by id permission denied");
1563         return ret;
1564     }
1565     return FormMgrAdapter::GetInstance().GetFormInstanceById(formId, isUnusedIncluded, formInstance);
1566 }
1567 
RegisterAddObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)1568 ErrCode FormMgrService::RegisterAddObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
1569 {
1570     HILOG_DEBUG("call");
1571     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1572     if (ret != ERR_OK) {
1573         HILOG_ERROR("register notifyVisible or notifyInVisible observer permission denied");
1574         return ret;
1575     }
1576     return FormMgrAdapter::GetInstance().RegisterAddObserver(bundleName, callerToken);
1577 }
1578 
RegisterRemoveObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)1579 ErrCode FormMgrService::RegisterRemoveObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
1580 {
1581     HILOG_DEBUG("call");
1582     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1583     if (ret != ERR_OK) {
1584         HILOG_ERROR("unregister notifyVisible or notifyInVisible observer permission denied");
1585         return ret;
1586     }
1587     return FormMgrAdapter::GetInstance().RegisterRemoveObserver(bundleName, callerToken);
1588 }
1589 
UpdateProxyForm(int64_t formId,const FormProviderData & formBindingData,const std::vector<FormDataProxy> & formDataProxies)1590 ErrCode FormMgrService::UpdateProxyForm(int64_t formId, const FormProviderData &formBindingData,
1591     const std::vector<FormDataProxy> &formDataProxies)
1592 {
1593     HILOG_DEBUG("call");
1594     auto callingUid = IPCSkeleton::GetCallingUid();
1595     return FormMgrAdapter::GetInstance().UpdateForm(formId, callingUid, formBindingData, formDataProxies);
1596 }
1597 
RequestPublishProxyForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId,const std::vector<FormDataProxy> & formDataProxies)1598 ErrCode FormMgrService::RequestPublishProxyForm(Want &want, bool withFormBindingData,
1599     std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId,
1600     const std::vector<FormDataProxy> &formDataProxies)
1601 {
1602     HILOG_DEBUG("call");
1603     if (!CheckCallerIsSystemApp()) {
1604         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1605     }
1606 
1607     if (!CheckAcrossLocalAccountsPermission()) {
1608         HILOG_ERROR("Across local accounts permission failed");
1609         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1610     }
1611     return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData, formId,
1612         formDataProxies);
1613 }
1614 
RegisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)1615 ErrCode FormMgrService::RegisterClickEventObserver(
1616     const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
1617 {
1618     HILOG_DEBUG("call");
1619     if (observer == nullptr) {
1620         HILOG_ERROR("empty callerTokenParameter");
1621         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1622     }
1623     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1624     if (ret != ERR_OK) {
1625         HILOG_ERROR("register form add observer permission denied");
1626         return ret;
1627     }
1628     return FormMgrAdapter::GetInstance().RegisterClickEventObserver(bundleName, formEventType, observer);
1629 }
1630 
UnregisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)1631 ErrCode FormMgrService::UnregisterClickEventObserver(
1632     const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
1633 {
1634     HILOG_DEBUG("call");
1635     if (observer == nullptr) {
1636         HILOG_ERROR("empty callerTokenParameter");
1637         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1638     }
1639     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1640     if (ret != ERR_OK) {
1641         HILOG_ERROR("register form add observer permission denied");
1642         return ret;
1643     }
1644     return FormMgrAdapter::GetInstance().UnregisterClickEventObserver(bundleName, formEventType, observer);
1645 }
1646 
SetFormsRecyclable(const std::vector<int64_t> & formIds)1647 int32_t FormMgrService::SetFormsRecyclable(const std::vector<int64_t> &formIds)
1648 {
1649     HILOG_DEBUG("call");
1650     ErrCode ret = CheckFormPermission();
1651     if (ret != ERR_OK) {
1652         HILOG_ERROR("set forms recyclable permission denied");
1653         return ret;
1654     }
1655     return FormMgrAdapter::GetInstance().SetFormsRecyclable(formIds);
1656 }
1657 
RecycleForms(const std::vector<int64_t> & formIds,const Want & want)1658 int32_t FormMgrService::RecycleForms(const std::vector<int64_t> &formIds, const Want &want)
1659 {
1660     HILOG_DEBUG("call");
1661     ErrCode ret = CheckFormPermission();
1662     if (ret != ERR_OK) {
1663         HILOG_ERROR("recycle forms permission denied");
1664         return ret;
1665     }
1666     return FormMgrAdapter::GetInstance().RecycleForms(formIds, want);
1667 }
1668 
RecoverForms(const std::vector<int64_t> & formIds,const Want & want)1669 int32_t FormMgrService::RecoverForms(const std::vector<int64_t> &formIds, const Want &want)
1670 {
1671     HILOG_DEBUG("call");
1672     ErrCode ret = CheckFormPermission();
1673     if (ret != ERR_OK) {
1674         HILOG_ERROR("recover forms permission denied");
1675         return ret;
1676     }
1677     return FormMgrAdapter::GetInstance().RecoverForms(formIds, want);
1678 }
1679 
UpdateFormLocation(const int64_t & formId,const int32_t & formLocation)1680 ErrCode FormMgrService::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation)
1681 {
1682     HILOG_DEBUG("call");
1683     ErrCode ret = CheckFormPermission();
1684     if (ret != ERR_OK) {
1685         HILOG_ERROR("update formLocation form infos permission denied");
1686         return ret;
1687     }
1688     return FormMgrAdapter::GetInstance().UpdateFormLocation(formId, formLocation);
1689 }
1690 
BatchRefreshForms(const int32_t formRefreshType)1691 ErrCode FormMgrService::BatchRefreshForms(const int32_t formRefreshType)
1692 {
1693     HILOG_DEBUG("call");
1694     ErrCode ret = CheckFormPermission();
1695     if (ret != ERR_OK) {
1696         HILOG_ERROR("batch update forms permission denied");
1697         return ret;
1698     }
1699     return FormMgrAdapter::GetInstance().BatchRefreshForms(formRefreshType);
1700 }
1701 
RequestPublishFormWithSnapshot(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId)1702 ErrCode FormMgrService::RequestPublishFormWithSnapshot(Want &want, bool withFormBindingData,
1703     std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId)
1704 {
1705     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
1706         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
1707         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
1708 
1709     return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData,
1710                                                             formId, {}, false);
1711 }
1712 
1713 #ifdef RES_SCHEDULE_ENABLE
OnSystemloadLevel(int32_t level)1714 void FormMgrService::OnSystemloadLevel(int32_t level)
1715 {
1716     if (level >= SYSTEMLOADLEVEL_TIMERSTOP_THRESHOLD) {
1717         FormMgrAdapter::GetInstance().SetTimerTaskNeeded(false);
1718     } else {
1719         FormMgrAdapter::GetInstance().SetTimerTaskNeeded(true);
1720     }
1721 }
1722 #endif // RES_SCHEDULE_ENABLE
1723 
EnableForms(const std::string bundleName,const bool enable)1724 int32_t FormMgrService::EnableForms(const std::string bundleName, const bool enable)
1725 {
1726     ErrCode ret = CheckFormPermission();
1727     if (ret != ERR_OK) {
1728         HILOG_ERROR("disable forms permission denied");
1729         return ret;
1730     }
1731     return FormMgrAdapter::GetInstance().EnableForms(bundleName, enable);
1732 }
1733 
IsFormBundleForbidden(const std::string & bundleName)1734 bool FormMgrService::IsFormBundleForbidden(const std::string &bundleName)
1735 {
1736     HILOG_DEBUG("call");
1737     if (!CheckCallerIsSystemApp()) {
1738         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1739     }
1740     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_IsFormBundleForbidden",
1741         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1742     bool result = FormBundleForbidMgr::GetInstance().IsBundleForbidden(bundleName);
1743     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1744     return result;
1745 }
1746 
UpdateFormSize(const int64_t & formId,float width,float height,float borderWidth)1747 ErrCode FormMgrService::UpdateFormSize(const int64_t &formId, float width, float height, float borderWidth)
1748 {
1749     HILOG_DEBUG("call");
1750     ErrCode ret = CheckFormPermission();
1751     if (ret != ERR_OK) {
1752         HILOG_ERROR("update formSize permission denied");
1753         return ret;
1754     }
1755     return FormMgrAdapter::GetInstance().UpdateFormSize(formId, width, height, borderWidth);
1756 }
1757 }  // namespace AppExecFwk
1758 }  // namespace OHOS
1759