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", ownerAbility->GetAbilityName().c_str());
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 
FireFormEvent(const int64_t formId,const std::string & message,const Want & want,const sptr<IRemoteObject> & callerToken)253 int FormProviderClient::FireFormEvent(
254     const int64_t formId,
255     const std::string &message,
256     const Want &want,
257     const sptr<IRemoteObject> &callerToken)
258 {
259     HILOG_DEBUG("FireFormEvent start");
260 
261     // The error code for business operation.
262     int errorCode = ERR_OK;
263     do {
264         std::shared_ptr<Ability> ownerAbility = GetOwner();
265         if (ownerAbility == nullptr) {
266             HILOG_ERROR("null Owner");
267             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
268             break;
269         }
270 
271         if (!CheckIsSystemApp() && !IsCallBySelfBundle()) {
272             HILOG_WARN("Permission denied");
273             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
274             break;
275         }
276 
277         HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
278         ownerAbility->OnTriggerEvent(formId, message);
279     } while (false);
280 
281     if (!want.HasParameter(Constants::FORM_CONNECT_ID)) {
282         return errorCode;
283     }
284 
285     return DCRtnHelper(errorCode, want, callerToken);
286 }
287 
AcquireState(const Want & wantArg,const std::string & provider,const Want & want,const sptr<IRemoteObject> & callerToken)288 int FormProviderClient::AcquireState(const Want &wantArg, const std::string &provider, const Want &want,
289                                      const sptr<IRemoteObject> &callerToken)
290 {
291     HILOG_DEBUG("call");
292 
293     // The error code for business operation.
294     int errorCode = ERR_OK;
295     FormState state = FormState::UNKNOWN;
296     do {
297         std::shared_ptr<Ability> ownerAbility = GetOwner();
298         if (ownerAbility == nullptr) {
299             HILOG_ERROR("null Owner");
300             errorCode = ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
301             break;
302         }
303         if (!CheckIsSystemApp()) {
304             HILOG_ERROR("Permission denied");
305             errorCode = ERR_APPEXECFWK_FORM_PERMISSION_DENY;
306             break;
307         }
308 
309         HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
310         state = ownerAbility->OnAcquireFormState(wantArg);
311     } while (false);
312 
313     HandleAcquireStateResult(state, provider, wantArg, want, callerToken);
314     return errorCode;
315 }
316 
SetOwner(const std::shared_ptr<Ability> ability)317 void FormProviderClient::SetOwner(const std::shared_ptr<Ability> ability)
318 {
319     if (ability == nullptr) {
320         return;
321     }
322 
323     std::lock_guard<std::mutex> lock(abilityMutex_);
324     owner_ = ability;
325 }
326 
ClearOwner(const std::shared_ptr<Ability> ability)327 void FormProviderClient::ClearOwner(const std::shared_ptr<Ability> ability)
328 {
329     if (ability == nullptr) {
330         return;
331     }
332 
333     std::lock_guard<std::mutex> lock(abilityMutex_);
334     if (!owner_.expired()) {
335         std::shared_ptr<Ability> ownerAbility = owner_.lock();
336         if (ability == ownerAbility) {
337             owner_.reset();
338         }
339     }
340 }
341 
GetOwner()342 std::shared_ptr<Ability> FormProviderClient::GetOwner()
343 {
344     std::shared_ptr<Ability> ownerAbility = nullptr;
345     std::lock_guard<std::mutex> lock(abilityMutex_);
346     if (!owner_.expired()) {
347         ownerAbility = owner_.lock();
348     }
349     return ownerAbility;
350 }
351 
CheckIsSystemApp() const352 bool FormProviderClient::CheckIsSystemApp() const
353 {
354     HILOG_DEBUG("call");
355 
356     int32_t callingUid = IPCSkeleton::GetCallingUid();
357     if (callingUid > Constants::MAX_SYSTEM_APP_UID) {
358         HILOG_WARN("callingUid is %{public}d, which is larger than %{public}d", callingUid,
359             Constants::MAX_SYSTEM_APP_UID);
360         return false;
361     }
362 
363     HILOG_DEBUG("callingUid is %{public}d", callingUid);
364     return true;
365 }
366 
HandleAcquire(const FormProviderInfo & formProviderInfo,const Want & newWant,const sptr<IRemoteObject> & callerToken)367 int FormProviderClient::HandleAcquire(
368     const FormProviderInfo &formProviderInfo,
369     const Want &newWant,
370     const sptr<IRemoteObject> &callerToken)
371 {
372     HILOG_INFO("ImageState:%{public}d", formProviderInfo.GetFormData().GetImageDataState());
373     sptr<IFormSupply> formSupplyClient = iface_cast<IFormSupply>(callerToken);
374     if (formSupplyClient == nullptr) {
375         HILOG_ERROR("null IFormSupply");
376         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
377     }
378 
379     formSupplyClient->OnAcquire(formProviderInfo, newWant);
380     return ERR_OK;
381 }
382 
DCRtnHelper(const int & errCode,const Want & want,const sptr<IRemoteObject> & callerToken)383 int FormProviderClient::DCRtnHelper(const int &errCode, const Want &want, const sptr<IRemoteObject> &callerToken)
384 {
385     // The error code for disconnect.
386     int disconnectErrorCode = HandleDisconnect(want, callerToken);
387     if (errCode != ERR_OK) {
388         // If errorCode is not ERR_OK,return errorCode.
389         return errCode;
390     }
391     return disconnectErrorCode;
392 }
393 
HandleDisconnect(const Want & want,const sptr<IRemoteObject> & callerToken)394 int  FormProviderClient::HandleDisconnect(const Want &want, const sptr<IRemoteObject> &callerToken)
395 {
396     HILOG_INFO("ConnectId:%{public}d", want.GetIntParam(Constants::FORM_CONNECT_ID, 0L));
397     sptr<IFormSupply> formSupplyClient = iface_cast<IFormSupply>(callerToken);
398     if (formSupplyClient == nullptr) {
399         HILOG_ERROR("null IFormSupply");
400         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
401     }
402 
403     formSupplyClient->OnEventHandle(want);
404     return ERR_OK;
405 }
406 
HandleAcquireStateResult(FormState state,const std::string & provider,const Want & wantArg,const Want & want,const sptr<IRemoteObject> & callerToken)407 int FormProviderClient::HandleAcquireStateResult(FormState state, const std::string &provider, const Want &wantArg,
408                                                  const Want &want, const sptr<IRemoteObject> &callerToken)
409 {
410     HILOG_INFO("FormState:%{public}d", state);
411     sptr<IFormSupply> formSupplyClient = iface_cast<IFormSupply>(callerToken);
412     if (formSupplyClient == nullptr) {
413         HILOG_ERROR("null IFormSupply");
414         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
415     }
416 
417     formSupplyClient->OnAcquireStateResult(state, provider, wantArg, want);
418     return ERR_OK;
419 }
420 
AcquireShareFormData(int64_t formId,const std::string & remoteDeviceId,const sptr<IRemoteObject> & formSupplyCallback,int64_t requestCode)421 int32_t FormProviderClient::AcquireShareFormData(int64_t formId, const std::string &remoteDeviceId,
422     const sptr<IRemoteObject> &formSupplyCallback, int64_t requestCode)
423 {
424     HILOG_DEBUG("call");
425     if (formId <= 0 || remoteDeviceId.empty() || formSupplyCallback == nullptr || requestCode <= 0) {
426         HILOG_ERROR("Abnormal parameters exist");
427         return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
428     }
429 
430     std::shared_ptr<Ability> ownerAbility = GetOwner();
431     if (ownerAbility == nullptr) {
432         HILOG_ERROR("null Owner");
433         return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
434     }
435 
436     HILOG_INFO("AbilityName:%{public}s", ownerAbility->GetAbilityName().c_str());
437     if (!CheckIsSystemApp()) {
438         HILOG_WARN("Permission denied");
439         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
440     }
441 
442     auto formCall = iface_cast<IFormSupply>(formSupplyCallback);
443     if (formCall == nullptr) {
444         HILOG_ERROR("null IFormSupply");
445         return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
446     }
447 
448     AAFwk::WantParams wantParams;
449     auto result = ownerAbility->OnShare(formId, wantParams);
450     formCall->OnShareAcquire(formId, remoteDeviceId, wantParams, requestCode, result);
451 
452     HILOG_DEBUG("end");
453     return ERR_OK;
454 }
455 
HandleRemoteAcquire(const FormJsInfo & formJsInfo,const FormProviderInfo & formProviderInfo,const Want & want,const sptr<IRemoteObject> & token)456 void FormProviderClient::HandleRemoteAcquire(const FormJsInfo &formJsInfo, const FormProviderInfo &formProviderInfo,
457     const Want &want, const sptr<IRemoteObject> &token)
458 {
459     HILOG_DEBUG("call");
460     auto hostToken = want.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
461     if (hostToken == nullptr) {
462         HILOG_ERROR("null hostToken");
463         return;
464     }
465     FormCallerMgr::GetInstance().AddFormProviderCaller(formJsInfo, hostToken);
466 
467     std::vector<std::shared_ptr<FormProviderCaller>> formProviderCallers;
468     FormCallerMgr::GetInstance().GetFormProviderCaller(formJsInfo.formId, formProviderCallers);
469     for (const auto &formProviderCaller : formProviderCallers) {
470         formProviderCaller->OnAcquire(formProviderInfo, want, token);
471     }
472 }
473 
IsCallBySelfBundle()474 bool FormProviderClient::IsCallBySelfBundle()
475 {
476     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
477     return (getuid() == callingUid);
478 }
479 } // namespace AppExecFwk
480 } // namespace OHOS
481