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