• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "form_provider_client.h"
17 
18 #include <cinttypes>
19 #include <memory>
20 #include <type_traits>
21 #include <unistd.h>
22 
23 #include "appexecfwk_errors.h"
24 #include "fms_log_wrapper.h"
25 #include "form_mgr_errors.h"
26 #include "form_caller_mgr.h"
27 #include "form_supply_proxy.h"
28 #include "ipc_skeleton.h"
29 #include "string_ex.h"
30 
31 namespace OHOS {
32 namespace AppExecFwk {
AcquireProviderFormInfo(const FormJsInfo & formJsInfo,const Want & want,const sptr<IRemoteObject> & callerToken)33 int FormProviderClient::AcquireProviderFormInfo(
34     const FormJsInfo &formJsInfo,
35     const Want &want,
36     const sptr<IRemoteObject> &callerToken)
37 {
38     HILOG_DEBUG("call");
39 
40     Want newWant(want);
41     newWant.SetParam(Constants::ACQUIRE_TYPE, want.GetIntParam(Constants::ACQUIRE_TYPE, 0));
42     newWant.SetParam(Constants::FORM_CONNECT_ID, want.GetIntParam(Constants::FORM_CONNECT_ID, 0));
43     newWant.SetParam(Constants::FORM_SUPPLY_INFO, want.GetStringParam(Constants::FORM_SUPPLY_INFO));
44     newWant.SetParam(Constants::PROVIDER_FLAG, true);
45     newWant.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, std::to_string(formJsInfo.formId));
46     std::shared_ptr<Ability> ownerAbility = GetOwner();
47     if (ownerAbility == nullptr) {
48         HILOG_ERROR("null Owner");
49         FormProviderInfo formProviderInfo;
50         newWant.SetParam(Constants::PROVIDER_FLAG, ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY);
51         return HandleAcquire(formProviderInfo, newWant, callerToken);
52     }
53 
54     HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
55 
56     if (!CheckIsSystemApp()) {
57         HILOG_WARN("Permission denied");
58         FormProviderInfo formProviderInfo;
59         newWant.SetParam(Constants::PROVIDER_FLAG, ERR_APPEXECFWK_FORM_PERMISSION_DENY);
60         return HandleAcquire(formProviderInfo, newWant, callerToken);
61     }
62 
63     Want createWant(want);
64     createWant.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, std::to_string(formJsInfo.formId));
65     createWant.RemoveParam(Constants::FORM_CONNECT_ID);
66     createWant.RemoveParam(Constants::ACQUIRE_TYPE);
67     createWant.RemoveParam(Constants::FORM_SUPPLY_INFO);
68     createWant.RemoveParam(Constants::PARAM_FORM_HOST_TOKEN);
69     createWant.RemoveParam(Constants::FORM_COMP_ID);
70     createWant.RemoveParam(Constants::FORM_DENSITY);
71     createWant.RemoveParam(Constants::FORM_PROCESS_ON_ADD_SURFACE);
72     createWant.RemoveParam(Constants::FORM_ALLOW_UPDATE);
73     if (!createWant.HasParameter(Constants::LAUNCH_REASON_KEY)) {
74         createWant.SetParam(Constants::LAUNCH_REASON_KEY, Constants::FORM_DEFAULT);
75     }
76     if (!createWant.HasParameter(Constants::PARAM_FORM_CUSTOMIZE_KEY)) {
77         std::vector<std::string> customizeData;
78         createWant.SetParam(Constants::PARAM_FORM_CUSTOMIZE_KEY, customizeData);
79     }
80     FormProviderInfo formProviderInfo = ownerAbility->OnCreate(createWant);
81     HILOG_DEBUG("formId:%{public}" PRId64 ", data: %{private}s", formJsInfo.formId,
82         formProviderInfo.GetFormDataString().c_str());
83     if (newWant.HasParameter(Constants::PARAM_FORM_HOST_TOKEN)) {
84         HandleRemoteAcquire(formJsInfo, formProviderInfo, newWant, AsObject());
85     }
86     return HandleAcquire(formProviderInfo, newWant, callerToken);
87 }
88 
NotifyFormDelete(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)89 int FormProviderClient::NotifyFormDelete(const int64_t formId, const Want &want, const sptr<IRemoteObject> &callerToken)
90 {
91     HILOG_DEBUG("call");
92 
93     // The error code for business operation.
94     int errorCode = ERR_OK;
95     do {
96         auto hostToken = want.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
97         if (hostToken != nullptr) {
98             FormCallerMgr::GetInstance().RemoveFormProviderCaller(formId, hostToken);
99             break;
100         }
101 
102         std::shared_ptr<Ability> ownerAbility = GetOwner();
103         if (ownerAbility == nullptr) {
104             HILOG_ERROR("null Owner");
105             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
106             break;
107         }
108 
109         if (!CheckIsSystemApp()) {
110             HILOG_WARN("Permission denied");
111             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
112             break;
113         }
114 
115         HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
116         ownerAbility->OnDelete(formId);
117     } while (false);
118 
119     return DCRtnHelper(errorCode, want, callerToken);
120 }
121 
NotifyFormsDelete(const std::vector<int64_t> & formIds,const Want & want,const sptr<IRemoteObject> & callerToken)122 int FormProviderClient::NotifyFormsDelete(
123     const std::vector<int64_t> &formIds,
124     const Want &want,
125     const sptr<IRemoteObject> &callerToken)
126 {
127     HILOG_DEBUG("call");
128 
129     // The error code for business operation.
130     int errorCode = ERR_OK;
131     do {
132         std::shared_ptr<Ability> ownerAbility = GetOwner();
133         if (ownerAbility == nullptr) {
134             HILOG_ERROR("null Owner");
135             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
136             break;
137         }
138         if (!CheckIsSystemApp()) {
139             HILOG_WARN("Permission denied");
140             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
141             break;
142         }
143 
144         HILOG_INFO("formIdsSize:%{public}zu, abilityName:%{public}s", formIds.size(),
145             ownerAbility->GetAbilityName().c_str());
146         for (int64_t formId : formIds) {
147             ownerAbility->OnDelete(formId);
148         }
149     } while (false);
150 
151     return DCRtnHelper(errorCode, want, callerToken);
152 }
153 
NotifyFormUpdate(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)154 int FormProviderClient::NotifyFormUpdate(
155     const int64_t formId,
156     const Want &want,
157     const sptr<IRemoteObject> &callerToken)
158 {
159     HILOG_DEBUG("NotifyFormUpdate start");
160 
161     // The error code for business operation.
162     int errorCode = ERR_OK;
163     do {
164         std::shared_ptr<Ability> ownerAbility = GetOwner();
165         if (ownerAbility == nullptr) {
166             HILOG_ERROR("null Owner");
167             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
168             break;
169         }
170 
171         if (!CheckIsSystemApp() && !IsCallBySelfBundle()) {
172             HILOG_ERROR("Permission denied");
173             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
174             break;
175         }
176 
177         HILOG_INFO("AbilityName:%{public}s, formId:%{public}" PRId64, ownerAbility->GetAbilityName().c_str(), formId);
178         ownerAbility->OnUpdate(formId, want.GetParams());
179     } while (false);
180 
181     if (!want.HasParameter(Constants::FORM_CONNECT_ID)) {
182         return errorCode;
183     }
184 
185     return DCRtnHelper(errorCode, want, callerToken);
186 }
187 
EventNotify(const std::vector<int64_t> & formIds,const int32_t formVisibleType,const Want & want,const sptr<IRemoteObject> & callerToken)188 int FormProviderClient::EventNotify(
189     const std::vector<int64_t> &formIds,
190     const int32_t formVisibleType, const Want &want,
191     const sptr<IRemoteObject> &callerToken)
192 {
193     HILOG_DEBUG("EventNotify start");
194 
195     // The error code for business operation.
196     int errorCode = ERR_OK;
197     do {
198         std::shared_ptr<Ability> ownerAbility = GetOwner();
199         if (ownerAbility == nullptr) {
200             HILOG_ERROR("null Owner");
201             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
202             break;
203         }
204 
205         if (!CheckIsSystemApp()) {
206             HILOG_WARN("Permission denied");
207             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
208             break;
209         }
210 
211         std::map<int64_t, int32_t> formEventsMap;
212         for (const auto &formId : formIds) {
213             formEventsMap.insert(std::make_pair(formId, formVisibleType));
214         }
215 
216         HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
217         ownerAbility->OnVisibilityChanged(formEventsMap);
218     } while (false);
219 
220     return DCRtnHelper(errorCode, want, callerToken);
221 }
222 
NotifyFormCastTempForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)223 int FormProviderClient::NotifyFormCastTempForm(
224     const int64_t formId,
225     const Want &want,
226     const sptr<IRemoteObject> &callerToken)
227 {
228     HILOG_DEBUG("NotifyFormCastTempForm start");
229 
230     // The error code for business operation.
231     int errorCode = ERR_OK;
232     do {
233         std::shared_ptr<Ability> ownerAbility = GetOwner();
234         if (ownerAbility == nullptr) {
235             HILOG_ERROR("null Owner");
236             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
237             break;
238         }
239 
240         if (!CheckIsSystemApp()) {
241             HILOG_WARN("Permission denied");
242             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
243             break;
244         }
245 
246         HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
247         ownerAbility->OnCastTemptoNormal(formId);
248     } while (false);
249 
250     return DCRtnHelper(errorCode, want, callerToken);
251 }
252 
NotifyConfigurationUpdate(const AppExecFwk::Configuration & configuration,const Want & want,const sptr<IRemoteObject> & callerToken)253 int FormProviderClient::NotifyConfigurationUpdate(
254     const AppExecFwk::Configuration &configuration,
255     const Want &want,
256     const sptr<IRemoteObject> &callerToken)
257 {
258     HILOG_INFO("NotifyConfigurationUpdate start");
259 
260     // The error code for business operation.
261     int errorCode = ERR_OK;
262     do {
263         std::shared_ptr<Ability> ownerAbility = GetOwner();
264         if (ownerAbility == nullptr) {
265             HILOG_ERROR("null Owner");
266             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
267             break;
268         }
269 
270         if (!CheckIsSystemApp()) {
271             HILOG_WARN("Permission denied");
272             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
273             break;
274         }
275 
276         HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
277         ownerAbility->OnConfigurationUpdated(configuration);
278     } while (false);
279 
280     return DCRtnHelper(errorCode, want, callerToken);
281 }
282 
FireFormEvent(const int64_t formId,const std::string & message,const Want & want,const sptr<IRemoteObject> & callerToken)283 int FormProviderClient::FireFormEvent(
284     const int64_t formId,
285     const std::string &message,
286     const Want &want,
287     const sptr<IRemoteObject> &callerToken)
288 {
289     HILOG_DEBUG("FireFormEvent start");
290 
291     // The error code for business operation.
292     int errorCode = ERR_OK;
293     do {
294         std::shared_ptr<Ability> ownerAbility = GetOwner();
295         if (ownerAbility == nullptr) {
296             HILOG_ERROR("null Owner");
297             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
298             break;
299         }
300 
301         if (!CheckIsSystemApp() && !IsCallBySelfBundle()) {
302             HILOG_WARN("Permission denied");
303             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
304             break;
305         }
306 
307         HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
308         ownerAbility->OnTriggerEvent(formId, message);
309     } while (false);
310 
311     if (!want.HasParameter(Constants::FORM_CONNECT_ID)) {
312         return errorCode;
313     }
314 
315     return DCRtnHelper(errorCode, want, callerToken);
316 }
317 
AcquireState(const Want & wantArg,const std::string & provider,const Want & want,const sptr<IRemoteObject> & callerToken)318 int FormProviderClient::AcquireState(const Want &wantArg, const std::string &provider, const Want &want,
319                                      const sptr<IRemoteObject> &callerToken)
320 {
321     HILOG_DEBUG("call");
322 
323     // The error code for business operation.
324     int errorCode = ERR_OK;
325     FormState state = FormState::UNKNOWN;
326     do {
327         std::shared_ptr<Ability> ownerAbility = GetOwner();
328         if (ownerAbility == nullptr) {
329             HILOG_ERROR("null Owner");
330             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
331             break;
332         }
333         if (!CheckIsSystemApp()) {
334             HILOG_ERROR("Permission denied");
335             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
336             break;
337         }
338 
339         HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
340         state = ownerAbility->OnAcquireFormState(wantArg);
341     } while (false);
342 
343     HandleAcquireStateResult(state, provider, wantArg, want, callerToken);
344     return errorCode;
345 }
346 
SetOwner(const std::shared_ptr<Ability> ability)347 void FormProviderClient::SetOwner(const std::shared_ptr<Ability> ability)
348 {
349     if (ability == nullptr) {
350         return;
351     }
352 
353     std::lock_guard<std::mutex> lock(abilityMutex_);
354     owner_ = ability;
355 }
356 
ClearOwner(const std::shared_ptr<Ability> ability)357 void FormProviderClient::ClearOwner(const std::shared_ptr<Ability> ability)
358 {
359     if (ability == nullptr) {
360         return;
361     }
362 
363     std::lock_guard<std::mutex> lock(abilityMutex_);
364     if (!owner_.expired()) {
365         std::shared_ptr<Ability> ownerAbility = owner_.lock();
366         if (ability == ownerAbility) {
367             owner_.reset();
368         }
369     }
370 }
371 
GetOwner()372 std::shared_ptr<Ability> FormProviderClient::GetOwner()
373 {
374     std::shared_ptr<Ability> ownerAbility = nullptr;
375     std::lock_guard<std::mutex> lock(abilityMutex_);
376     if (!owner_.expired()) {
377         ownerAbility = owner_.lock();
378     }
379     return ownerAbility;
380 }
381 
CheckIsSystemApp() const382 bool FormProviderClient::CheckIsSystemApp() const
383 {
384     HILOG_DEBUG("call");
385 
386     int32_t callingUid = IPCSkeleton::GetCallingUid();
387     if (callingUid > Constants::MAX_SYSTEM_APP_UID) {
388         HILOG_WARN("callingUid is %{public}d, which is larger than %{public}d", callingUid,
389             Constants::MAX_SYSTEM_APP_UID);
390         return false;
391     }
392 
393     HILOG_DEBUG("callingUid is %{public}d", callingUid);
394     return true;
395 }
396 
HandleAcquire(const FormProviderInfo & formProviderInfo,const Want & newWant,const sptr<IRemoteObject> & callerToken)397 int FormProviderClient::HandleAcquire(
398     const FormProviderInfo &formProviderInfo,
399     const Want &newWant,
400     const sptr<IRemoteObject> &callerToken)
401 {
402     HILOG_INFO("ImageState:%{public}d", formProviderInfo.GetFormData().GetImageDataState());
403     sptr<IFormSupply> formSupplyClient = iface_cast<IFormSupply>(callerToken);
404     if (formSupplyClient == nullptr) {
405         HILOG_ERROR("null IFormSupply");
406         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
407     }
408 
409     formSupplyClient->OnAcquire(formProviderInfo, newWant);
410     return ERR_OK;
411 }
412 
DCRtnHelper(const int & errCode,const Want & want,const sptr<IRemoteObject> & callerToken)413 int FormProviderClient::DCRtnHelper(const int &errCode, const Want &want, const sptr<IRemoteObject> &callerToken)
414 {
415     // The error code for disconnect.
416     int disconnectErrorCode = HandleDisconnect(want, callerToken);
417     if (errCode != ERR_OK) {
418         // If errorCode is not ERR_OK,return errorCode.
419         return errCode;
420     }
421     return disconnectErrorCode;
422 }
423 
HandleDisconnect(const Want & want,const sptr<IRemoteObject> & callerToken)424 int  FormProviderClient::HandleDisconnect(const Want &want, const sptr<IRemoteObject> &callerToken)
425 {
426     HILOG_INFO("ConnectId:%{public}d", want.GetIntParam(Constants::FORM_CONNECT_ID, 0L));
427     sptr<IFormSupply> formSupplyClient = iface_cast<IFormSupply>(callerToken);
428     if (formSupplyClient == nullptr) {
429         HILOG_ERROR("null IFormSupply");
430         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
431     }
432 
433     formSupplyClient->OnEventHandle(want);
434     return ERR_OK;
435 }
436 
HandleAcquireStateResult(FormState state,const std::string & provider,const Want & wantArg,const Want & want,const sptr<IRemoteObject> & callerToken)437 int FormProviderClient::HandleAcquireStateResult(FormState state, const std::string &provider, const Want &wantArg,
438                                                  const Want &want, const sptr<IRemoteObject> &callerToken)
439 {
440     HILOG_INFO("FormState:%{public}d", state);
441     sptr<IFormSupply> formSupplyClient = iface_cast<IFormSupply>(callerToken);
442     if (formSupplyClient == nullptr) {
443         HILOG_ERROR("null IFormSupply");
444         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
445     }
446 
447     formSupplyClient->OnAcquireStateResult(state, provider, wantArg, want);
448     return ERR_OK;
449 }
450 
AcquireShareFormData(int64_t formId,const std::string & remoteDeviceId,const sptr<IRemoteObject> & formSupplyCallback,int64_t requestCode)451 int32_t FormProviderClient::AcquireShareFormData(int64_t formId, const std::string &remoteDeviceId,
452     const sptr<IRemoteObject> &formSupplyCallback, int64_t requestCode)
453 {
454     HILOG_DEBUG("call");
455     if (formId <= 0 || remoteDeviceId.empty() || formSupplyCallback == nullptr || requestCode <= 0) {
456         HILOG_ERROR("Abnormal parameters exist");
457         return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
458     }
459 
460     std::shared_ptr<Ability> ownerAbility = GetOwner();
461     if (ownerAbility == nullptr) {
462         HILOG_ERROR("null Owner");
463         return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
464     }
465 
466     HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
467     if (!CheckIsSystemApp()) {
468         HILOG_WARN("Permission denied");
469         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
470     }
471 
472     auto formCall = iface_cast<IFormSupply>(formSupplyCallback);
473     if (formCall == nullptr) {
474         HILOG_ERROR("null IFormSupply");
475         return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
476     }
477 
478     AAFwk::WantParams wantParams;
479     auto result = ownerAbility->OnShare(formId, wantParams);
480     formCall->OnShareAcquire(formId, remoteDeviceId, wantParams, requestCode, result);
481 
482     HILOG_DEBUG("end");
483     return ERR_OK;
484 }
485 
HandleRemoteAcquire(const FormJsInfo & formJsInfo,const FormProviderInfo & formProviderInfo,const Want & want,const sptr<IRemoteObject> & token)486 void FormProviderClient::HandleRemoteAcquire(const FormJsInfo &formJsInfo, const FormProviderInfo &formProviderInfo,
487     const Want &want, const sptr<IRemoteObject> &token)
488 {
489     HILOG_DEBUG("call");
490     auto hostToken = want.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
491     if (hostToken == nullptr) {
492         HILOG_ERROR("null hostToken");
493         return;
494     }
495     FormCallerMgr::GetInstance().AddFormProviderCaller(formJsInfo, hostToken);
496 
497     std::vector<std::shared_ptr<FormProviderCaller>> formProviderCallers;
498     FormCallerMgr::GetInstance().GetFormProviderCaller(formJsInfo.formId, formProviderCallers);
499     for (const auto &formProviderCaller : formProviderCallers) {
500         formProviderCaller->OnAcquire(formProviderInfo, want, token);
501     }
502 }
503 
IsCallBySelfBundle()504 bool FormProviderClient::IsCallBySelfBundle()
505 {
506     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
507     return (getuid() == callingUid);
508 }
509 } // namespace AppExecFwk
510 } // namespace OHOS
511